Перейти к содержанию

Рекомендуемые сообщения

Опубликовано (изменено)

Всем привет.

Решил поделиться своей наработкой по вопросу отправки почтового сообщения при подключении/отключении определенных клиентов к 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 минут и вуаля!

Изменено пользователем priZrak495
Опубликовано

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

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

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

post.cgi.gif

Опубликовано (изменено)
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 диска можно любую информацию писать на примонтированный диск в файл (так же дата время и т.д.), а любым клиентом уже смотреть данную иформацию из это файла/файлов.

Изменено пользователем vasek00
Опубликовано
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' "

Опубликовано
13 минуты назад, Le ecureuil сказал:

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

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

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

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

Опубликовано
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

 

  • 5 месяцев спустя...
Опубликовано
В 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. пишу первый раз, так что критика приветствуется

  • 8 месяцев спустя...
Опубликовано
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
 

Опубликовано
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

 

  • 1 месяц спустя...
Опубликовано

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

 

  • 4 месяца спустя...
Опубликовано

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

Опубликовано (изменено)
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.
/ # 

 

Изменено пользователем vasek00

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.