Jump to content

Отправка почтового сообщения при подкл./отк. клиента Wi-fi


Recommended Posts

Всем привет.

Решил поделиться своей наработкой по вопросу отправки почтового сообщения при подключении/отключении определенных клиентов к 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 by priZrak495
  • Thanks 2
  • Upvote 1
Link to comment
Share on other sites

Ещё вариант: скрипты, вызываемые dnsmasq, если выбрать его на замену штатному DHCP/DNS-серверу.

  • плюс: это event driven решение, в отличие от timeout driven решения на cron'е,
  • минус тот же: мобильные клиенты могут «мерцать» во сне. Лечится подкручиванием времени жизни ARP-записей в ядре.

На картинке ниже чётко виден момент когда дитё ушло в школу и когда вернулось. Вариант проверялся исключительно как концепт, в реальности нужды в подобном контроле (пока, т-т-т) не было.

post.cgi.gif

Link to comment
Share on other sites

29 минут назад, Александр Рыжов сказал:

Ещё вариант: скрипты, вызываемые dnsmasq, если выбрать его на замену штатному DHCP/DNS-серверу.

  • плюс: это event driven решение, в отличие от timeout driven решения на cron'е,
  • минус тот же: мобильные клиенты могут «мерцать» во сне. Лечится подкручиванием времени жизни ARP-записей в ядре.

На картинке ниже чётко виден момент когда дитё ушло в школу и когда вернулось. Вариант проверялся исключительно как концепт, в реальности нужды в подобном контроле (пока, т-т-т) не было.

post.cgi.gif

Если уж идти еще дальше то 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 by vasek00
Link to comment
Share on other sites

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' "

Link to comment
Share on other sites

13 минуты назад, Le ecureuil сказал:

Лучше брать информацию из http://192.168.1.1/rci/show/ip/hotspot - вся инфа по хостам в машиночитаемом виде.

Чего-то не удаётся авторизоваться с помощью

wget -O - http://admin:Password@localhost/

Тогда уж правда лучше с помощью ndmq.

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

  • 5 months later...
В 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. пишу первый раз, так что критика приветствуется

  • Thanks 1
  • Y'r wrong 1
Link to comment
Share on other sites

  • 8 months later...
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
 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

  • 1 month later...

Переделал скрипт до рабочего состояния. Кидаем его в крон 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

 

Link to comment
Share on other sites

  • 4 months later...

Метод от Станислава не очень, т.к. ловит любые клиенты который подключились/отключились к точке доступа.
Например, каждое включение смарт-телевизора вызывает отправку сообщения :)

Link to comment
Share on other sites

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 by vasek00
Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...