priZrak495 Posted June 6, 2017 Share Posted June 6, 2017 (edited) Всем привет. Решил поделиться своей наработкой по вопросу отправки почтового сообщения при подключении/отключении определенных клиентов к wifi точке доступа. Изначально идея была в том, чтобы получать сообщения когда ребенок уйдет и придет домой. В линуксе не особенно то и профи но кое что смог напрограммировать, вот, выкладываю, может кому пригодиться. Вариант 1: Нужен cron и msmtp. Скрытый текст #!/bin/sh for ip in "192.168.101.20 T2Ultra" "192.168.101.23 XperiaC4" #IP и имя устройства, нужно вбить свои do set -- $ip if /opt/bin/ping -c 1 -w 2 $1 &>/dev/null; #тупо пингуем устройство then if [ -f /opt/etc/IPs/$1 ] #проверяем наличие временного файла (если есть, клиент подключен) then echo "Device $2 ($1) still connected" else echo -e "Subject: $2 connected\r\n\r\nClient $2 ($1) has been connected to Keenetic at $(date)" |/opt/bin/msmtp -t sample@gmail.com #отправляем почту echo "$(date) Device $2 ($1) connect to Keenetic" >> /opt/tmp/log/chk_client.log #пишем в лог touch "/opt/etc/IPs/$1" fi else if [ -f /opt/etc/IPs/$1 ] then echo -e "Subject: $2 disconnected\r\n\r\nClient $2 ($1) has been disconnected from Keenetic at $(date)" |/opt/bin/msmtp -t sample@gmail.com echo "$(date) Device $2 ($1) disconnect from Keenetic" >> /opt/tmp/log/chk_client.log rm "/opt/etc/IPs/$1" else echo "Device $2 ($1) is not connected" fi fi done Минус данного способа в том, что если клиент (в данном случае телефон засыпает и отваливается от вайфая - не все модели так делают - то приходит письмо, что клиент отключился). Поэтому я придумал вариант 2. Может туповато сделано, но это все на что меня хватило исходя из моих познаний Строго не судите. Нужен ndmq, cron и msmtp. Вариант 2: Скрытый текст #!/bin/sh amac=`ndmq -x -p "show associations" | grep "mac"` #узнает кто авторизован по wifi tmp=${amac//<mac>/} tmp=${tmp//<\/mac>/} #убираем лишнее и оставляем чистый MAC dev1="discon" dev2="discon" for cmac in $tmp do if [ $cmac = "c1:31:b1:61:21:41" ] #забиваем нужный MAC then dev1="connected" fi if [ $cmac = "a1:e1:51:81:f1:21" ] #забиваем второй нужный MAC (для жены например) then dev2="connected" fi done if [ $dev1 = "connected" ] then if [ ! -f /opt/etc/IPs/XperiaC4 ] #проверяем файл, если нет, то клиент вновь подключенный then echo -e "Subject: XperiaC4 connected\r\n\r\nClient XperiaC4 has been connected to Keenetic at $(date)" |/opt/bin/msmtp -t sample@gmail.com echo "$(date) Device XperiaC4 connect to Keenetic" >> /opt/tmp/log/chk_client.log touch "/opt/etc/IPs/XperiaC4" fi else if [ -f /opt/etc/IPs/XperiaC4 ] #если файл есть, то клиент уже был подключен но отключился then echo -e "Subject: XperiaC4 disconnected\r\n\r\nClient XperiaC4 has been disconnected from Keenetic at $(date)" |/opt/bin/msmtp -t sample@gmail.com echo "$(date) Device XperiaC4 disconnect from Keenetic" >> /opt/tmp/log/chk_client.log rm "/opt/etc/IPs/XperiaC4" fi fi if [ $dev2 = "connected" ] #тоже самое для второго устройства then if [ ! -f /opt/etc/IPs/T2Ultra ] then echo -e "Subject: T2Ultra connected\r\n\r\nClient T2Ultra has been connected to Keenetic at $(date)" |/opt/bin/msmtp -t sample@gmail.com echo "$(date) Device T2Ultra connect to Keenetic" >> /opt/tmp/log/chk_client.log touch "/opt/etc/IPs/T2Ultra" fi else if [ -f /opt/etc/IPs/T2Ultra ] then echo -e "Subject: T2Ultra disconnected\r\n\r\nClient T2Ultra has been disconnected from Keenetic at $(date)" |/opt/bin/msmtp -t sample@gmail.com echo "$(date) Device T2Ultra disconnect from Keenetic" >> /opt/tmp/log/chk_client.log rm "/opt/etc/IPs/T2Ultra" fi fi Минус способа в том, что нужно вбивать MAC адреса (столько сколько нужно, благо у меня два) и некоторой корявости, но зато все работает! Если кто допилит алгоритм на более универсальный - будет респект! Все это дело в cron через каждые 5 минут и вуаля! Edited June 6, 2017 by priZrak495 2 1 Quote Link to comment Share on other sites More sharing options...
Александр Рыжов Posted June 7, 2017 Share Posted June 7, 2017 Ещё вариант: скрипты, вызываемые dnsmasq, если выбрать его на замену штатному DHCP/DNS-серверу. плюс: это event driven решение, в отличие от timeout driven решения на cron'е, минус тот же: мобильные клиенты могут «мерцать» во сне. Лечится подкручиванием времени жизни ARP-записей в ядре. На картинке ниже чётко виден момент когда дитё ушло в школу и когда вернулось. Вариант проверялся исключительно как концепт, в реальности нужды в подобном контроле (пока, т-т-т) не было. Quote Link to comment Share on other sites More sharing options...
vasek00 Posted June 7, 2017 Share Posted June 7, 2017 (edited) 29 минут назад, Александр Рыжов сказал: Ещё вариант: скрипты, вызываемые dnsmasq, если выбрать его на замену штатному DHCP/DNS-серверу. плюс: это event driven решение, в отличие от timeout driven решения на cron'е, минус тот же: мобильные клиенты могут «мерцать» во сне. Лечится подкручиванием времени жизни ARP-записей в ядре. На картинке ниже чётко виден момент когда дитё ушло в школу и когда вернулось. Вариант проверялся исключительно как концепт, в реальности нужды в подобном контроле (пока, т-т-т) не было. Если уж идти еще дальше то DnsMasq может и DHCP, где например возможно в conf Скрытый текст dhcp-range=br0,192.168.1.1,192.168.1.154,255.255.255.0,5m dhcp-host=хх:хх:хх:хх:хх:E9,S_1,192.168.1.15,600m dhcp-host=хх:хх:хх:хх:хх:FB,S_2,192.168.1.16,600m dhcp-host=хх:хх:хх:хх:хх:AF,S_3,192.168.1.17,600m ... dhcp-host=хх:хх:хх:хх:хх:B1,S_7,192.168.1.10,600m dhcp-host=хх:хх:хх:хх:хх:17,HP,192.168.1.9,600m хх:хх:хх:хх:хх:17 - MAC / HP - name / 192.168.1.9 - IP / 600m - время жизни. В данном же случае так же можно использовать информацию из " cat /proc/net/arp " - активные клиенты или " ndmq -x -p "show ip arp" | sed -n '/ip/p; /mac/p; /name/p' " (тут на любителя, какую информацию вытаскивать). В прошивке есть один плюс от сканирование домашнего сегмента сети arp запросами, т.е. таблица будет актуальна, если только на клиенте не вкл.функция отключения wi-fi при неактивном экране, для экономии батарейки но это уже дело третье. Если SMS будут надоедать, то при использовании например webdav от Yandex диска можно любую информацию писать на примонтированный диск в файл (так же дата время и т.д.), а любым клиентом уже смотреть данную иформацию из это файла/файлов. Edited June 7, 2017 by vasek00 Quote Link to comment Share on other sites More sharing options...
Le ecureuil Posted June 7, 2017 Share Posted June 7, 2017 Лучше брать информацию из http://192.168.1.1/rci/show/ip/hotspot - вся инфа по хостам в машиночитаемом виде. Quote Link to comment Share on other sites More sharing options...
vasek00 Posted June 7, 2017 Share Posted June 7, 2017 4 минуты назад, Le ecureuil сказал: Лучше брать информацию из http://192.168.1.1/rci/show/ip/hotspot - вся инфа по хостам в машиночитаемом виде. Там hotspot все что есть, в отличие от arp - где текущие клиенты. При первом приближение данный выше вызов например подправив можно получить " ndmq -x -p "show ip hotspot" | sed -n '/<mac>/p; /<ip>/p; /<name>/p' " Quote Link to comment Share on other sites More sharing options...
Александр Рыжов Posted June 7, 2017 Share Posted June 7, 2017 13 минуты назад, Le ecureuil сказал: Лучше брать информацию из http://192.168.1.1/rci/show/ip/hotspot - вся инфа по хостам в машиночитаемом виде. Чего-то не удаётся авторизоваться с помощью wget -O - http://admin:Password@localhost/ Тогда уж правда лучше с помощью ndmq. Quote Link to comment Share on other sites More sharing options...
Le ecureuil Posted June 7, 2017 Share Posted June 7, 2017 14 минуты назад, Александр Рыжов сказал: Чего-то не удаётся авторизоваться с помощью wget -O - http://admin:Password@localhost/ Тогда уж правда лучше с помощью ndmq. А wget точно умеет digest-авторизацию? Потому что они разные бывают, тот что в busybox - не умеет. # wget -O /tmp/1 http://admin:test@192.168.12.1/rci/show/ip/hotspot Connecting to 192.168.12.1 (192.168.12.1:80) wget: server returned error: HTTP/1.1 401 Unauthorized А GNU wget умеет: $ wget -O /tmp/1 http://admin:test@172.16.110.87/rci/show/ip/hotspot --2017-06-07 12:43:35-- http://admin:*password*@172.16.110.87/rci/show/ip/hotspot Connecting to 172.16.110.87:80... connected. HTTP request sent, awaiting response... 401 Unauthorized Reusing existing connection to 172.16.110.87:80. HTTP request sent, awaiting response... 200 OK Length: 505 [text/json] Saving to: ‘/tmp/1’ 100%[======================================>] 505 --.-K/s in 0s 2017-06-07 12:43:36 (101 MB/s) - ‘/tmp/1’ saved [505/505] А еще лучше вообще через curl все это делать: curl -X GET --digest http://admin:test@172.16.110.87/rci/show/ip/hotspot Quote Link to comment Share on other sites More sharing options...
RyzAleks RA Posted November 9, 2017 Share Posted November 9, 2017 В 06.06.2017 в 10:04, priZrak495 сказал: Если кто допилит алгоритм на более универсальный - будет респект! исковеркал: #!/bin/sh ndmq -x -p "show ip arp" | sed -n '/mac/p; /name/p' > /opt/var/names ndmq -x -p "show associations"|grep "mac" > /opt/var/present diff /opt/var/past /opt/var/present|grep "^[+-]"|grep -v "/opt/var/" > /opt/var/ while read line do if test "${line:0:1}" = '+'; then action="connect" else action="disconnect" fi mac=${line//+} mac=${mac//-} name=`grep -A 1 $mac /opt/var/names|grep -v mac` name=${name//<name>} name=${name//<\/name>} #Здесь шлем мыло, смс или ботом в телеграм с текстом: "$name $action" done < /opt/var/comp ndmq -x -p "show associations"|grep "mac" > /opt/var/past сделано через ж файлы для отладки. есть смысл переписать через переменные P.S. пишу первый раз, так что критика приветствуется 1 1 Quote Link to comment Share on other sites More sharing options...
Dr.ZuLuS Posted July 13, 2018 Share Posted July 13, 2018 On 11/9/2017 at 11:41 PM, RyzAleks RA said: исковеркал: #!/bin/sh ndmq -x -p "show ip arp" | sed -n '/mac/p; /name/p' > /opt/var/names ndmq -x -p "show associations"|grep "mac" > /opt/var/present diff /opt/var/past /opt/var/present|grep "^[+-]"|grep -v "/opt/var/" > /opt/var/ while read line do if test "${line:0:1}" = '+'; then action="connect" else action="disconnect" fi mac=${line//+} mac=${mac//-} name=`grep -A 1 $mac /opt/var/names|grep -v mac` name=${name//<name>} name=${name//<\/name>} #Здесь шлем мыло, смс или ботом в телеграм с текстом: "$name $action" done < /opt/var/comp ndmq -x -p "show associations"|grep "mac" > /opt/var/past сделано через ж файлы для отладки. есть смысл переписать через переменные P.S. пишу первый раз, так что критика приветствуется Кажется файл comp не создается, где то закралась ошибка... /opt/etc/cron.1min/checkwifi.sh: line 4: can't create /opt/var/: Is a directory diff: can't stat '/opt/var/past': No such file or directory /opt/etc/cron.1min/checkwifi.sh: line 19: can't open /opt/var/comp: no such file Quote Link to comment Share on other sites More sharing options...
vasek00 Posted July 13, 2018 Share Posted July 13, 2018 11 минуту назад, Станислав Поветьев сказал: Кажется файл comp не создается, где то закралась ошибка... /opt/etc/cron.1min/checkwifi.sh: line 4: can't create /opt/var/: Is a directory diff: can't stat '/opt/var/past': No such file or directory /opt/etc/cron.1min/checkwifi.sh: line 19: can't open /opt/var/comp: no such file Ошибка по файлу /opt/var/comp /opt/var/comp / # / # ndmq -x -p "show ip arp" | sed -n '/mac/p; /name/p' > /opt/var/names / # ndmq -x -p "show associations"|grep "mac" > /opt/var/present / # diff /opt/var/past /opt/var/present|grep "^[+-]"|grep -v "/opt/var/" > /opt/var/ /opt/bin/sh: can't create /opt/var/: Is a directory diff: can't stat '/opt/var/past': No such file or directory / # ndmq -x -p "show associations"|grep "mac" > /opt/var/past / # файлы есть /opt/var/names и /opt/var/present и /opt/var/past по строка 4 с diff ошибка Что-то не дописано по строке с /opt/var/comp done < /opt/var/comp Quote Link to comment Share on other sites More sharing options...
Dr.ZuLuS Posted August 22, 2018 Share Posted August 22, 2018 Переделал скрипт до рабочего состояния. Кидаем его в крон 1 мин и при подключении\отключении клиента по wifi вам будет приходить уведомление с именем клиента и состоянием подключения. #!/bin/sh ndmq -x -p "show ip hotspot" | sed -n '/<mac>/p; /<name>/p' > /opt/var/names ndmq -x -p "show associations"|grep "mac" > /opt/var/present /opt/bin/diff /opt/var/past /opt/var/present|grep "^[+-]"|grep -v "/opt/var/" > /opt/var/comp while read line do if test "${line:0:1}" = '+'; then action="Подключился" else action="Отключился" fi mac=${line//+} mac=${mac//-} name=`grep -A 1 $mac /opt/var/names|grep -v mac` name=${name//<name>} name=${name//<\/name>} #Здесь шлем мыло, смс или ботом в телеграм с текстом: "$name $action" /opt/bin/tg_say.sh "$name $action" > /dev/null 2>/dev/null done < /opt/var/comp ndmq -x -p "show associations"|grep "mac" > /opt/var/past Quote Link to comment Share on other sites More sharing options...
r13 Posted August 22, 2018 Share Posted August 22, 2018 @Станислав Поветьев Уже есть eventdriven путь! https://github.com/ndmsystems/packages/wiki/Opkg-Component#ndmneighbourd Quote Link to comment Share on other sites More sharing options...
priZrak495 Posted January 21, 2019 Author Share Posted January 21, 2019 Метод от Станислава не очень, т.к. ловит любые клиенты который подключились/отключились к точке доступа. Например, каждое включение смарт-телевизора вызывает отправку сообщения Quote Link to comment Share on other sites More sharing options...
vasek00 Posted January 21, 2019 Share Posted January 21, 2019 (edited) 1 час назад, priZrak495 сказал: Метод от Станислава не очень, т.к. ловит любые клиенты который подключились/отключились к точке доступа. Например, каждое включение смарт-телевизора вызывает отправку сообщения ndmq -p 'show ip hotspot' -x | xml sel -t -m '//host[active="yes"][mac="хх:хх:хх:хх:хх:be"]' -v 'name' Клиент1 и его MAC хх:хх:хх:хх:хх:be ndmq -p 'show associations' -x | xml sel -t -m '//station[ap="WifiMaster1/AccessPoint0"][authenticated="yes"][mac="хх:хх:хх:хх:хх:be"]' -v 'mac' хх:хх:хх:хх:хх:be Поле "active=yes" клиент активный и "mac=хх:хх:хх:хх:хх:be" и подключение к ap="WifiMaster1/AccessPoint0" 5GHz Примечание - пакет "xmlstarlet" / # opkg list | grep xmlstarlet xmlstarlet - 1.6.1-1 - XMLStarlet is a set of command line utilities (tools) which can be used to transform, query, validate, and edit XML documents and files using simple set of shell commands in similar way it is done for plain text files using UNIX grep, sed, awk, diff, patch, join, etc commands. / # Edited January 21, 2019 by vasek00 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.