Достаточно много видел примеров использования whatsapp-уведомлений с zabbix, и другими системами мониторинга, но на собственные эксперименты с whatsapp меня вдохновила статья bacula.us/sending-notification-whatsapp.
Однако, если с системами мониторинга все ясно, то при наличии прекрасной «врожденной» системы email-оповещений, городить огород ради одной bacula было откровенно лень. Да и вдруг, потом захочется поставить zabbix или еще что-то куда-то послать? Каждому боту по ватсапу?
Так что, пусть это будет что-то более универсальное. Например, отдельный сервер, который сможет обслужить bacula, zabbix, syslog-сервер, сайт или даже виндоусы с макинтошами.
Ставил на «пустой» Centos 7 amdx64 в lxc-контейнер под proxmox ve 4.4
Первое, что обычно делаю — обновляю, подключаю epel и ставлю ssh, чтобы потом удобно работать
yum -y update yum -y install epel-release openssh-server systemctl enable sshd systemctl start sshd
Далее ставим зависимости и yowsup github.com/tgalal/yowsup
yum -y install unzip wget tar nano yum -y install python python-dateutil python-argparse yum -y install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel yum -y install gcc yum -y install protobuf pycrypto python-axolotl-curve25519 yum -y install python-devel python-pip python-imaging pip install --upgrade pip
Скачиваем, распаковываем и устанавливаем yowsup
cd /usr/src/ wget https://github.com/tgalal/yowsup/archive/master.zip unzip master cd yowsup-master/ python setup.py install
Регистрируем номер мобильного. Симка вставлена в мобильник (или шлюз, в моем случае) на который придет смс. Номер не должен быть засвечен в whatsapp. Сначала запрашиваем код регистрации:
yowsup-cli registration --requestcode sms --phone 7xxxxxxxxxx --cc 7 --mcc 250 --mnc xx
phone — ваш номер телефона, начинающийся с 7
cc — country code — это код страны (для России это 7)
mcc — mobile country code — это другой код страны (для России это 250)
mnc — mobile network code — это код вашего оператора. (01 — МТС, 02 — мегафон, 20 — теле2, 99 — билайн)
В ответ придет смс с кодом, в виде XXX-XXX, который используем для подтверждения регистрации
yowsup-cli registration --register xxx-xxx --phone 7хххxxxxxxx --cc 7
Сервер сообщит об удачной регистрации:
status: ok
kind: free
pw: X1isWwe+25d/aOXJpcSduzTV7fg=
price: 33,00 руб.
price_expiration: 1495380655
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 7хххххххххх X1isWwe+37d/aOXJpcSduzTV7fg=
type: new
Записываем пароль из переменной pw в конфиг-файл
nano yowsup-cli.config
В этом файле три строчки (страна, номер, пароль):
cc=7
phone=7хххxxxxxxx
password=X1isWwe+25d/aOXJpcSduzTV7fg=
Собственно, все. Пробуем
yowsup-cli demos -c yowsup-cli.config -M -s 7хххххххххх "alarm"
Если сообщение пришло, двигаемся дальше. Чтобы комфортно побаловаться живым whatsapp-чатом из терминала — нужна кириллица. Если ее нет, а вместо нее ошибки вида «ascii … ordinal not in range(128)» — надо поставить локаль и поправить один файл.
С localectl
в моем сетапе какие-то проблемы, поэтому
nano /etc/locale.conf
пишем LANG=ru_RU.UTF-8
, сохраняем и рестартуем сессию
Следующим шагом надо поправить кодировку yowsup. Делаем, как сказано в github.com/tgalal/yowsup/issues/1592
nano /usr/lib/python2.7/site-packages/yowsup2-2.5.2-py2.7.egg/yowsup/demos/cli/layer.py
После строки import sys добавить
reload(sys)
sys.setdefaultencoding('utf8')
должно получиться:
from .cli import Cli, clicmd
from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback
from yowsup.layers.auth import YowAuthenticationProtocolLayer
from yowsup.layers import YowLayerEvent, EventCallback
from yowsup.layers.network import YowNetworkLayer
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Теперь можно запускать живой чат и слать-принимать сообщения кириллицей. Have fun
Наигравшись вдоволь, пора приспособить этот прекрасный инструмент для нужд трудящихся вокруг серверов. Для этого было решено использовать достаточно простой и гибкий инструмент Webhook github.com/adnanh/webhook, хотя есть и масса других способов. Например shell2http github.com/msoap/shell2http
Скачиваем и распаковываем webhook в любой каталог. Я для удобства положил в /var/webhook
cd /usr/src
wget https://github.com/adnanh/webhook/releases/download/2.6.3/webhook-linux-amd64.tar.gz
tar -xvf webhook-linux-amd64.tar.gz -C /var
mv /var/webhook-linux-amd64 /var/webhook
А чтобы потом, при желании, было удобнее добавлять всякие файлы-картинки-видео — так же скопировал yowsup-cli.config в /var/yowsup Как говорится, пусть все будет через одно место.
mkdir /var/yowsup
cp /usr/src/yowsup-master/yowsup-cli.config /var/yowsup
Поскольку Webhook позволяет запускать через http заранее подготовленные команды — создадим файл с правилами hooks.json
cd /var/webhook
nano hooks.json
В файле опишем хук, который будет принимать команды по адресу http://адрес сервера:9000/hooks/wp-admin
, обрабатывать и слать сообщения на whatsapp админа. Внутрь файла добавляем описание условий
[ { "id": "wp-admin", "execute-command": "/var/webhook/admin.sh", "command-working-directory": "/var/webhook", "pass-arguments-to-command": [ { "source": "url", "name": "msg" } ] } ]
То есть, каждый, кто вызовет url http://адрес сервера:9000/hooks/wp-admin?msg=привет
— исполнит скрипт /var/webhook/admin.sh
, а тот, в свою очередь, отправит привет админу на whatsupp, и только ему. Я решил не передавать каждый раз пару телефон-сообщение, а при необходимости рассылки на другие номера создать дополнительные хуки. Например, хук с отправкой определенному контакт-листу или универсальный с парой телефон-сообщение и каким-то токеном для вящей безопасности.
Итак, проверяем, правильно ли мы написали хук, запуском
./webhook -hooks hooks.json -verbose
В ответ увидим
[webhook] 2017/04/26 05:12:48 version 2.6.3 starting
[webhook] 2017/04/26 05:12:48 setting up os signal watcher
[webhook] 2017/04/26 05:12:48 attempting to load hooks from hooks.json
[webhook] 2017/04/26 05:12:48 found 1 hook(s) in file
[webhook] 2017/04/26 05:12:48 loaded: wp-admin
[webhook] 2017/04/26 05:12:48 serving hooks on http://0.0.0.0:9000/hooks/{id}
Далее, создаем скрипт отправки /var/webhook/admin.sh, который будет отсылать сообщения админу
#! /bin/bash msg="$(echo "$*" | tr ' ' ' ')" if [[ ! -z "${msg/ //}" ]]; then /usr/bin/yowsup-cli demos -c /var/yowsup/yowsup-cli.config -M -s 7xxxxxxxxxx "$msg" fi
Добавлена проверка на пустоту и пробелы, чтобы при любом вызове хука не приходили пустые сообщения.
Открываем в браузере http://адрес сервера:9000/hooks/wp-admin?msg=привет
. Все должно работать
Добавляем хук в автозагрузку. Я сделал через systemd
nano /etc/systemd/system/webhook.service
Описываем юнит
[Unit]
Description=Webhook
After=syslog.target
After=network.target
[Service]
Type=simple
PIDFile=/var/webhook/webhook-service.pid
WorkingDirectory=/var/webhook
User=root
Group=root
OOMScoreAdjust=-500
ExecStart=/var/webhook/webhook -hooks hooks.json -verbose
ExecStop=/usr/bin/pkill -f webhook
ExecReload=
TimeoutSec=300
[Install]
WantedBy=multi-user.target
Сохраняем. Запускаем. Проверяем.
systemctl enable webhook
systemctl start webhook
systemctl -l status webhook
Теперь можно сделать простую отправку средствами curl с другой машины
curl -G http://адрес сервера:9000/hooks/wp-admin?msg=привет
Однако, так можно слать лишь скучные сообщения без форматирования, похожие на sms. Чтобы получать красиво отформатированные сообщения, да еще и с emoji-графикой нужно предварительно кодировать содержимое msg в urlencode. Иначе в url попадут esc-последовательности. Это пригодится и для дальнейшего примера с Bacula.
сurl умеет делать urlencode самостоятельно, только синтаксис будет иным. Например, отправим сообщение с переводом строки:
export VAR="привет\nбуфет"
export MSG=$(echo -e $VAR)
curl -G http://адрес сервера:9000/hooks/wp-admin --data-urlencode msg="$MSG"
Теперь можно заняться bacula, т.е. тем, что, собственно, и сподвигло на вышеописанные пляски Идем на сервер, где установлен bacula-director, ставим bc и curl
yum -y install bc curl
Потом берем прекрасный скрипт из статьи bacula.us/sending-notification-whatsapp и немного подправляем. Внимание, если хотим использовать смайлики emoji, то файл должен быть в UTF-8
Из секции Variables удаляем RECIPIENT_NUMBER и CONF, они нам не понадобятся. А переменную YOWSEXEC изменяем на curl-вызов хука отправки админу.
# Variables
HOUR=$(date +%d/%m/%Y\ %H:%M:%S)
YOWSEXEC="curl -G http://ваш сервер:9000/hooks/wp-admin"
LOG="/var/log/bacula/whatsapp.log"
Вводим свои данные для подключения к MySQL
# MySQL config
DBUSER="bacula"
DBPASSWORD="bacula"
DBNAME="bacula"
И вместо строки отправки
$YOWSEXEC demos --config $CONF --send $RECIPIENT_NUMBER "`echo -e "$MESSAGE${COUNT}"`" &>> $LOG
пишем
FMSG=`echo -e "$MESSAGE${COUNT}"`
$YOWSEXEC --data-urlencode msg="$FMSG" &>> $LOG
Ставим права на исполнение
chmod +x /etc/bacula/send_whatsapp.sh
Готово. Теперь, как указано в статье, можно вставлять в задания
Command = "/etc/bacula/send_whatsapp.sh %i"
и получать на телефон красивые отчеты:
Всем спасибо. Буду благодарен за комментарии и поправки
ссылка на оригинал статьи https://habrahabr.ru/post/327404/
Добавить комментарий