Пара скриптов для проверки статуса подключения устройства к домашней сети wifi сервером мжд.
Все современный роутеры и точки доступа умеют отправлять свой лог на удаленный сервер где его можно смотреть и парсить.
Например для определения дома ли пользователь или для мониторига подключения к домашней сети неизвестного вам устройства.
Связка: роутер -> сислог сервера мжд -> сервер мжд.
Для использования скрпитов необходимо настроить:
1 Сислог сервера мжд для приема логов от роутера.
мой работающий /etc/rsyslog.conf
править через sudo nano /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$WorkDirectory /var/spool/rsyslog
$IncludeConfig /etc/rsyslog.d/*.conf
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
$FileCreateMode 0644
$template DynaFile,"/var/log/%HOSTNAME%.log"
*.* -?DynaFile
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice -/var/log/news/news.notice
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
*.emerg :omusrmsg:*
и перезапустить демон сислога
sudo systemctl restart rsyslog
2 Настроить роутер на отпрвку роутера.
В моем случае в зюкселе вводится ip сервера мжд и ставится галка 'Отправлять журнал на внешний сервер'
При при подлючении/отключении устройства и правильной настройке вы должны увидеть в лог файле вашего сервера (у меня он /var/log/192.168.1.1.log)
что то подобное:
2018-06-13T22:19:05+03:00 192.168.1.1 wmond: WifiMaster0/AccessPoint0: (RT2860) STA(11:22:33:44:55:66) had disassociated. (-фраза по которой ищем)
2018-06-13T22:19:41+03:00 192.168.1.1 wmond: WifiMaster0/AccessPoint0: (RT2860) STA(11:22:33:44:55:66) had associated successfully. (-фраза по которой ищем)
После необходимо подправить скрипт cycle прописав туда путь к логу, маки и имена своих устройств которые хотите мониторить.
файл cycle_checkdhcp.php
<?php
chdir(dirname(__FILE__) . '/../');
include_once("./config.php");
include_once("./lib/loader.php");
include_once("./lib/threads.php");
include_once(DIR_MODULES . "control_modules/control_modules.class.php");
include_once(DIR_MODULES . 'dhcp/readlog.php'); //путь или полный путь к файлу класса
$file='/var/log/dhcp.log'; // полный путь к лог файлу полученного от роутера
$my_dev=array('PHONE_NAME' => '11:22:33:44:55:66'); // имя устройства для поиска(ОБЪЕКТ => его мак ) и в этом объекте создаем свойство status
$ignore_dev='aa:aa:aa:aa:aa:aa,bb:bb:bb:bb:bb:bb,cc:cc:cc:cc:cc:cc'; список игнорируемых пользовательских маков чтоб не реагировать как на чужие
$con_mes='had associated'; // Строка по которой ищем подключенного клиента(посмотреть в логе роутера при подлючении клиента)
$dis_mes='had disassociated'; //Строка по которой ищем подключенного клиента(посмотреть в логе роутера при отключении клиента)
$c = new DHCPCHEC($file,$con_mes,$dis_mes,$my_dev,$ignore_dev);
$c->run();
сам файл класса readlog.php у меня лежит в modules/dhcp/readlog.php
<?php
class DHCPCHECK{
public $file;
public $my_dev;
public $con_mes;
public $dis_mes;
public $ignore_dev;
function __construct($file,$con_mes,$dis_mes,$my_dev,$ignore_dev){
$this->file=$file;
$this->con_mes=$con_mes;
$this->dis_mes=$dis_mes;
$this->my_dev=$my_dev;
$this->ignore_dev=explode(',',$ignore_dev);
}
function run() {
$stream = fopen($this->file, 'r');
if (!$stream) die("Could not open file: $this->file\n");
fseek($stream, 0, SEEK_END);
flush();
while(true){ //start
$_cstat='';
$_dname='';
$_dmac='';
$data = stream_get_contents($stream);
if ($data) {
if (preg_match("/$this->dis_mes/iu","$data")){
$_cstat='disconnected'; //output message
}elseif (preg_match("/$this->con_mes/iu","$data")){
$_cstat='connected'; //output message
}
if ($_cstat){
preg_match('/\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}/i',$data,$_dmac);
$_dname=array_search("$_dmac[0]",$this->my_dev);
$_igdev=array_search("$_dmac[0]",$i=array_map('trim',$this->ignore_dev));
if ($_dname){
file_get_contents("http://127.0.0.1/objects/?op=set&object=$_dname&p=mac&v=$_dmac[0]");
file_get_contents("http://127.0.0.1/objects/?op=set&object=$_dname&p=status&v=$_cstat");
//echo "Устройство найдено: ". $_dname. " ".$_cstat.PHP_EOL; //output message
}elseif(!$_dname && !$_igdev){
file_get_contents("http://127.0.0.1/objects/?op=set&object=unknown&p=mac&v=$_dmac[0]");
file_get_contents("http://127.0.0.1/objects/?op=set&object=unknown&p=status&v=$_cstat");
//echo "Найдено незнакомое устройство: ". $_dmac[0]. " ". "$_cstat".PHP_EOL; //output message
}
}
}
clearstatcache();
if(@stat($this->file)['ino'] != fstat($stream)['ino']){
while(!file_exists($this->file)){ sleep (1); }
fclose($stream);
$stream = fopen($this->file, 'r');
}
flush();
usleep(100000);
}
fclose($stream);
}
}
Метод проверки выглядит примерно так:
$dev=$this->getProperty('status');
$user=$this->getProperty('user');
$unknown=$this->object_title;
$t=date('d-m-Y H:i');
if (!empty($user) && $unknown != 'unknown'){
if ("$dev" === 'connected'){
sg("$user.atHome",1);
$this->setProperty('timeStampt',time());
$this->setProperty('timeDate',$t);
}elseif ("$dev" === 'disconnected'){
sg("$user.atHome",0);
$this->setProperty('lastSeen',time());
}
}else{
$mac=$this->getProperty('mac');
if ("$dev" === 'connected'){
sayReply("К сети подключилось неизвесное устройство: $mac",0);
$this->setProperty('timeStampt',time());
$this->setProperty('timeDate',$t);
}elseif ("$dev" === 'disconnected'){
sayReply("Неизвесное устройство: $mac отключилось от сети",0);
$this->setProperty('timeStampt',time());
$this->setProperty('timeDate',$t);
}
}
Может кому то будет интересно и оформим в модуль.
Я не программист и сделать модуль займет у меня много времени.
Люберцы, Россия
На форуме: Sas