«Ты, гроза, грозись, а мы друг за друга держись!» — сказ о том, как я ADSL-модем спасал

в 13:04, , рубрики: ADSL, nginx, Raspberry Pi, безопасность, Беспроводные технологии, гроза, Настройка Linux, Облачные вычисления

«Модем горит,
Провайдер плачет.
Но он не смог поступить иначе.
Гремит гроза...»

Гроза! Стихия! Караул! Иной раз тяжело предугадать, какой ущерб она может учинить домашней электронике… Благо, её можно предупредить, тем самым исключив возможность выхода из строя, скажем, хотя бы домашних маршрутизаторов и модемов — обычно они в первую очередь и подвергаются воздействию буйных действ природы.

«Ты, гроза, грозись, а мы друг за друга держись!» — сказ о том, как я ADSL-модем спасал - 1
За прошедшие лета я похоронил ровно два модема — причиной их гибели послужили резкие перепады в сети электропитания. В этом же году я наконец набрался смелости порвать сей порочный круг и попытаться спасти бедный D-Link от преждевременной погибели!

Наиболее рациональным решением было бы просто изредка поглядывать в оконце и в случае приближения грозы заблаговременно отключать модем от сети электропитания; но как быть, если иной раз приходится оставить дом на продолжительное время, а родные не ведают, что делать, куда нажимать и что переключать в случае наступления грозы?

То-то и оно! Потому мне и подумалось, что будет неплохо соорудить некое подобие EAS (Emergency Alert System) для дома, с пищанием, оповещением по TV и прочими финтифлюшками.

Для начала я набросал две простеньких схемки, по которым можно было бы воплотить в жизнь задуманное. Первая из них – как дóлжно получать текущий код погоды EAS-клиенту; вторая же – что должно быть отображено на экране телевизора.

Первая

«Ты, гроза, грозись, а мы друг за друга держись!» — сказ о том, как я ADSL-модем спасал - 2

и

Вторая
«Ты, гроза, грозись, а мы друг за друга держись!» — сказ о том, как я ADSL-модем спасал - 3

Но, как говорится в одной небезызвестной поговорке, «скоро сказка сказывается, да не скоро дело делается». Думу долгую думал я, как же выводить буду на телевизор оповещение; то и дело откладывал на потом реализацию проекта, но вот «потом» и пришло нежданно-негаданно – в голове спонтанно возникла донельзя простая идея того, как же всё-таки разделаться с этой проблемой.

Решением оказалось превращение Raspberry Pi B+ в EAS-клиент путём запуска браузера epiphany в kiosk-режиме. Браузер цепляется за локальный веб-сервер, который, в свою очередь, возвращает следующий код:

...

<script type="text/javascript">
    setInterval('window.location.reload()', 60000);
</script>

...

<?php
if( !is_available( $home_server ) ) {
  echo '<center><div class="center"><h1>The EAS server is offline...</h1><center><p>An attempt to reconnect to the server will be performed in 60 seconds</p></center></div></center>';
}
else { echo '<iframe src="https://podivilov.local/api/method/EAS.getCode/" style="position:fixed; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;">Iframe does not supported by this browser...</iframe>'; }
?>

...

Таким образом, благодаря простецкому js-скрипту и тегу iframe, мы создали костыль и лишние проблемы облегчили себе жизнь; ведь ежели домашний сервер окажется недоступным вследствие того, что его отключили перед грозой, браузер не выдаст стандартную ошибку, мол, «увы и ах, доступа к сети больше нет» (и будет долго-долго ждать, пока кто-нибудь мышкой ткнёт в кнопку «обновить страницу»), а просто продолжит ежеминутно обновлять страницу и пытаться подгрузить содержимое iframe.

Но не будем забегать так далеко вперёд, давайте же разберёмся, как устроен EAS-клиент изнутри; если быть более точным, как происходит загрузка:

  1. Старт ОС (raspbian)
  2. Обращение к /etc/rc.local
  3. Инициализация иксов через xinit
  4. Запуск браузера
  5. Подключение к серверу
  6. Получение данных

Файл /etc/rc.local отличается от оригинального одной-единственной строкой:

sudo xinit ./home/eas/eas.boot & ## Инициируем загрузку иксов

А файл /home/eas/eas.boot ответственен за запуск браузера:

#!/bin/sh
xset -dpms
xset s off
xset s noblank
matchbox-window-manager -use_titlebar no & ## Запускаем оконный менеджер
unclutter -idle 0.01 -root & ## Скрываем курсор мыши
WEBKIT_DISABLE_TBS=1 epiphany-browser -a http://podivilov.local/ --profile /home/eas/.config ## Запускаем браузер в kiosk-режиме на весь экран

Наш браузер обращается к домашнему серверу, обозначенному как podivilov.local; тот же, в свою очередь, запрашивает у внешнего сервера данные о погоде, default и extra коды (default — целое число, нуль или единица; нуль — EAS не активирована, единица — активирована; extra — код погоды, полученный с сайта прогноза погоды, требуемый для отладки).

Происходит это следующим образом:

$code_default = file_get_contents('https://***.podivilov.ru/api/method/weather.getCode/?token=********************');
$code_extra = file_get_contents('https://***.podivilov.ru/api/method/weather.getCode.extra/?token=********************');

Данные о погоде внешний сервер получает с сайта openweathermap.org:

$json = file_get_contents('http://api.openweathermap.org/data/2.5/weather?lat=**.******&lon=**.******&APPID=********************************'); // lat & lon - широта и долгота, а APPID - api-код, который можно получить опосля регистрации на сайте
$data = json_decode($json,true);
$result = substr($data['weather'][0]['icon'], 0, -1);

Полученный сервером extra-код обрабатывается, проходя несколько условий, а на выходе получается код, которым уже можно воспользоваться для предотвращения потенциального выгорания модема.

В зависимости от условий погоды и полученного кода наша система выводит на экран различные наборы цифр: например, если ожидается сильная гроза и следует выключить пробки №1 (маршрутизатор/модем) и №2 (прочая бытовая техника), EAS-система отображает код 12 (пробка №1 и №2).

Пробки пронумерованы

«Ты, гроза, грозись, а мы друг за друга держись!» — сказ о том, как я ADSL-модем спасал - 4

Помимо этого, каждые полчаса на домашних компьютерах менеджер задач запускает следующий скрипт (оный опрашивает сервер, нет ожидается ли гроза; если ответ положителен, запускается программа, предупреждающая о возможном наступлении катаклизма):

dim xHttp: Set xHttp = createobject("MSXML2.ServerXMLHTTP")

xHttp.Open "GET", "https://***.podivilov.ru/api/method/weather.getCode/?token=********************", False
xHttp.setOption 2, 13056
xHttp.Send

If xHttp.responseText = "1" Then

	Set objShell = CreateObject("WScript.Shell") 
	objShell.Run """C:путь_к_программеEAS.exe""" 
	Set objShell = Nothing

Else

	WScript.Quit

End If

Но лучше один раз увидеть, чем тысячу раз услышать. Собственно, пред вами результат того, о чём я повествовал выше:

Вот и сказочке конец, а кто слушал – молодец… Берегите себя и свои роутеры!

Спасибо за внимание!

Автор: Михаил Подивилов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js