Sas

 
<<< Back

Проверка подключения/отключения устройства к wifi сети из сислога роутера

Пара скриптов для проверки статуса подключения устройства к домашней сети 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);
     }
}

Может кому то будет интересно и оформим в модуль.
Я не программист и сделать модуль займет у меня много времени.

Discuss (23) (11)

See also:
2018-07-01 Скрипт перевода числа текстом(два/три..) в число (2/3)
2018-07-01 Скрипт анекдотов

Люберцы, Россия

На форуме: Sas