Мониторинг балансов сотовых телефонов, провайдеров — или как никогда больше не ...

:


Есть мнение о том, что главное рабочее качество настоящего сисадмина — лень. Когда у сисадмина есть сервер и этот сервер предоставляет сервис — обычно админ ставит этот сервис на мониторинг — с тем, чтобы знать о том, что с сервисом все в порядке, узнавать о том, что караул-все-пропало-все-сломалось в числе первых и спать спокойно, зная, что если что-то и случится — то его разбудит алерт, а не звонок недовольного босса.

Но как быть, когда сервер и сервис — не свои собственные, а чужие? Ведь такая ситуация случается сплошь и рядом. Типовая небольшая организация: один-два сайта на хостинге (за которые надо вовремя платить, а зачастую еще и следить за тем, не изменились ли тарифы), пачка доменных имен (которые тоже надо вовремя проплачивать, а то и потерять можно), какое-то количество сотовых телефонов (за балансом которых нужно бы следить), договоры (и, соответственно, учет и взаиморасчеты) с поставщиками городской телефонии, с VOIP-провайдером, да в конце концов — просто с интернет-провайдером для офиса.

Сисадмин обычно за всё это платит не сам, но письма-напоминалки пополнить баланс получает в основном он и именно он будет крайним, если забудет напомнить тем, кто платит. Кто из нас хоть раз в жизни не забывал оплатить что-нибудь такое (например, потому что письмо-напоминалка попала в спам) и оставался без связи, без сайта, без домена, без премии, без зарплаты, без работы и т.д. и клятвенно обещал себе, что вот уж в следующий-то раз будет аккуратнее.


Ларчик на самом деле открывается просто и, можно сказать, грубо. В практически любой системе мониторинга (проверено на Nagios, Zabbix, Remstats, Ganglia, Zenoss — с трудом представляю систему, где этого не было бы) есть возможность выполнить внешнюю программу и результат ее выполнения (exit status, если мы собираем данные «сломалось-нет» или вывод в stdout) зарегистрировать как значение некоторого параметра в мониторинге.

Допустим, у нас есть сотовый телефон, подключенный к, ммм, допустим, МТС — как бы нам проверить баланс на этом телефоне, имея в распоряжении только интернет? Очень просто — идем на сайт mts.ru, находим там Интернет-помощник, уходим оттуда на более легкую PDA-версию:

Номер телефона у нас есть, но понадобится задать пароль для этого чудесного «Интернет-помощника» — делаем это, набирая *111*25# и задав пароль. Вводим номер телефона и пароль в форму, и, о чудо, на следующей странички будут вожделенные цифры:

Теперь осталось научить этой несложной процедуре сервер и сказать ему повторять это несколько раз в сутки.

Вооружившись своими любимым инструментами анализа HTML и трафика HTTP, довольно быстро понимаем, что:

  • Пользователь открывает форму логина, ему выдают некую cookie — очевидно, для идентификации сессии
  • Пользователь вводит логин (номер телефона) и пароль в форму, нажимает «Войти» — отправляется полученная cookie и 2 заполненный параметра формы — username и password.
  • После системы хитрых редиректов и задумчивостей, пользователь в конечном итоге получает страничку, на которой есть слово «Баланс:» и искомая цифра.
Вооружившись чудесной программой наподобии wget (подойдет curl, lftp или любой подобный же инструмент) для отправления HTTP-запросов и универсальным препаратором строчек под названием sed, за двумя чашками кофе можно написать и отладить скриптик из 3 строчек и одной функции, похожий на такое:
request()
{
	wget \
		--load-cookies cookies.txt \
		--save-cookies cookies.txt \
		--keep-session-cookies \
		--quiet \
		$@
}

request -O 1.html \
	'https://ihelper.mts.ru/SELFCAREPDA/Security.mvc/LogOn'
request -O 2.html \
	--post-data="username=$LOGIN&password=$PASSWORD" \
	'https://ihelper.mts.ru/SELFCAREPDA/Security.mvc/LogOn'

sed -ne '/<br\/>Баланс:/ { s,.*>\([0-9.]*\)</.*$,\1,; p }' <2.html

Он не очень красив, он мусорит временными файлами, зато он работает:
$ LOGIN=9161234567 PASSWORD=012345 ./monitor
1234.56

Теперь нужно его слегка облагородить и можно подключать к своей любимой системе мониторинга. График баланса сотового телефона будет выглядеть примерно так, как это показано на картинке, которой открывалась статья: медленные спады вниз (постепенный расход средств на балансе, списание абонентской платы) и пики вверх (пополнение баланса — внесение средств).

Таким нехитрым образом — по сути, имитируя действия человека по заходу и считыванию показаний в веб-интерфейсе, можно автоматически мониторить массу внешних сервисов. Вот другой, чуть более банальный пример из другой системы мониторинга, на этот раз — на базе Zabbix:

Здесь выведено число дней до окончания оплаченного периода у интернет-провайдера. За 5 дней до конца срока срабатывает триггер и присылается одна напоминалка, за 1 день — вторая, с более высоким приоритетом. График, разумеется, более предсказуемый, чем у баланса сотового телефона, но, тем не менее, эти напоминалки на триггерах уже не раз спасали большое количество нервных клеток мне лично.

Так получилось, что таких скриптиков у меня стало скапливаться ненулевое количество — и я подумал — почему каждый пишет их сам и тратит на это каждый раз по полчаса своего времени — почему бы не создать какой-то общий репозитарий свободного ПО, в котором бы собирались подобные скрипты? Поискал, может быть что-то такое уже есть — ближайшее, что нашел — это проект BalanceRobot для Android — аналогичная по принципу действия программа (правда, проприетарная и закрытая), которая устраивает мониторинг балансов сотовых операторов — и создал проект SPMon на github.

Прямо сейчас он умеет поддерживать относительно скромный набор сервисов:

Структура проекта очень простая: есть каталог services, в котором в разных подкаталогах (названных по имени домена) находятся скрипты. Скрипты написаны на shell, состоят, как правило, из 3-4 строчек и подключают для работы общую часть, находящуюся в файле _spmon_init. Этот файл для работы может находиться либо в текущем каталоге, либо в каталоге на уровень выше, либо в каком-то общедоступном месте (в PATH).

Есть простенькая тестовая инфраструктура в виде одного Makefile (которым я, к сожалению, поделиться по понятным причинам не могу), который я время от времени запускаю и он все вышеописанные сервисы обходит, подставляя мои личные логины и пароли и по результатам его запуска я проверю, что скрипты всё еще работоспособны.

Всех, у кого есть желание поделиться с сообществом способами мониторинга каких-то других интернет-сервисов — приглашаю :)

P.S. Некоторое время назад zuskin уже рассматривал вопрос подключения подобных скриптов к Nagios с использованием скриптов на php. Я предлагаю чуть более общее и минималистичное решение, которое аналогично подключается к Nagios, Zabbix, Remstats и т.д.