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/192.168.1.1.log'; // полный путь к лог файлу полученного от роутера
$my_dev=array('PHONE_NAME' => '11:22:33:44:55:66');   // имя устройства для поиска(ОБЪЕКТ => его мак ) и в этом объекте создаем свойство status
$ignore_dev=array('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'; //Строка по которой ищем подключенного клиента(посмотреть в логе роутера при отключении клиента)
$lag_time='5';  //пока не используется и возможно не будет так как можно сделать через метод мдж

$c = new CHECKSYSLOG($file,$con_mes,$dis_mes,$lag_time,$my_dev,$ignore_dev);
$c->run();

сам файл класса readlog.php у меня лежит в modules/dhcp/readlog.php

<?php 
class CHECKSYSLOG{ 
    public $file; 
    public $my_dev; 
    public $con_mes; 
    public $dis_mes; 
    public $lag_time; 
    public $ignore_dev;

function __construct($file,$con_mes,$dis_mes,$lag_time,$my_dev,$ignore_dev){ 
    $this->file=$file; 
    $this->con_mes=$con_mes; 
    $this->dis_mes=$dis_mes; 
    $this->lag_time=$lag_time; 
    $this->my_dev=$my_dev; 
    $this->ignore_dev=$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 
    //clear vars 
    $con_stat=''; 
    $dev_name=''; 
    $dev_mac=''; 
    //start search 
    $data = stream_get_contents($stream); 
    if ($data) { 
        if (preg_match("/$this->dis_mes/iu","$data")){ 
            $con_stat='disconnected'; //что пишем в status
        }elseif (preg_match("/$this->con_mes/iu","$data")){ 
            $con_stat='connected'; //что пишем в status
        } 

        if ($con_stat){ 
            preg_match('/\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}/i',$data,$dev_mac); 
            $dev_name=array_search("$dev_mac[0]",$this->my_dev); 
            $ign_d=array_search("$dev_mac[0]",$this->ignore_dev);
            if ($dev_name){ 
                file_get_contents("http://127.0.0.1/objects/?op=set&object=$dev_name&p=status&v=$con_stat");
                echo "'найдено'. $dev_name . $con_stat"; //дебаг для вывода в консоль системы
            }elseif (!$dev_name && !$ign_d){ 
                echo "не домашнее устройство"; //дебаг для вывода в консоль системы
                file_get_contents("http://127.0.0.1/objects/?op=set&object=unknown&p=status&v=$con_stat"); //заполняем свойство Object.status
                file_get_contents("http://127.0.0.1/objects/?op=set&object=unknown&p=mac&v=$dev_mac[0]"); //заполняем свойство Object.mac для отправки незнакомых маков
            } 
    } 
    flush(); 
    } 
    usleep(100000); 
} 
fclose($stream); 
} //run end 
}

в мжд надо создать объекты по названию их в массиве со свойствами 'status'

  • дополнительное свойство 'user' где будет имя пользователя которому надо обновлять статус
    после к 'status' привязать метод что то типа:
$dev=$this->getProperty('status'); //создать это свойство
$user=$this->getProperty('user');  //создать это свойство
$t=date('d-m-Y  H:i');
if (!empty($user)){
    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 (5) (8)

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

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