Отправка состояния сервера через Telegram
Я давно собирался написать статью про Telegram, чтобы помочь его продвижению в массы. Не то, чтобы он в нём нуждался, но хотелось просто описать свой опыт использования и поделиться восхищением.
Но такого добра, думаю, уже навалом написали, потому это будет полезная статья о том, как использовать Telegram для получения информации с Linux-сервера, а именно:
- статус Apache;
- статус MySQL;
- использование процессора;
- объём свободной оперативной памяти;
- использование места на жёстком диске.
Для этого будет использоваться консольный клиент telegram-cli.
Опишу своё рабочее окружение. Есть удалённый Linux-сервер с Ubuntu 14.04.1 LTS, размещённый у хостера. Я подключаюсь к нему по SSH под учётной записью root
(то есть, домашняя папка: /root
).
Подразумевается, что вы знакомы с Linux, потому я не буду писать о том, как скопировать файл, как разрешить скрипт на выполнение и прочем подобном.
Установка telegram-cli
Сначала надо запилить библиотеки:
apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make
Теперь, находясь в /root
, получаем из репозитория ветку test
- она самая обновляемая, потому я взял её, хотя понятно, чем это может грозить.
git clone -b test --recursive https://github.com/vysheng/tg.git
Переходим в /root/tg
. Там выполняем:
./configure
make
Дальше нужно создать каталог с данными и файл конфига:
mkdir /root/.telegram-cli
touch /root/.telegram-cli/config
Вот, кстати, то, что я это делаю всё от root
, внесло коррективы в читаемые мной руководства. В основном это воплотилось в использовании опции -U root
.
Итак, первый запуск:
bin/telegram-cli -k tg-server.pub -U root
Он запустится, выведет что-то типа:
Telegram-cli version 1.2.0, Copyright (C) 2013-2015 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
Telegram-cli uses libtgl version 1.2.0
I: config dir=[/home/telegramd/.telegram-cli]
Тут надо подождать, пока не появится запрос номера телефона, ввести его, получить SMS и ввести код из него:
phone number: +79876543211
code ('call' for phone call): 1111
Теперь можно посмотреть список контактов на аккаунте:
contact_list
Написать одному из контактов сообщение можно так:
msg vasya_ivanov ololo
Выход из приложения:
safe_quit
Понятно, что для автоматической отправки сообщений такое не подходит, а нам нужна именно она. Создаём скрипт /root/tg_msg_send.sh
:
#!/bin/bash
to=$1
msg=$2
tgpath=/root/tg
cd ${tgpath}
(echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -U root -W -e "msg $to $msg" <<-EOF
Теперь можно отправлять сообщения так:
./tg_msg_send.sh vasya_ivanov "Hello, madafaqa! :)"
Скрипт сбора информации
Файл /root/status.sh
:
#!/bin/bash
telescripts_path=/root/
info_web="Web-servers
-------------
$(service apache2 status)
$(service nginx status)
"
info_mysql="MySQL
-------------
$(mysqladmin ping)
$(mysqladmin status)
"
info_cpu="CPU
-------------
top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1" of 100 percents"}'
"
info_ram="RAM
-------------
free: $(free -m | grep Mem | awk '{print $4}') MB of $(free -m | grep Mem | awk '{print $2}') MB total
"
info_space="HDD
-------------
$(df -h --output=source,size,used,avail | head -n2)
"
text=$(printf "$info_web$info_mysql$info_cpu$info_ram$info_space")
printf '%s\n' "$text" > ${telescripts_path}/status.txt
Запрос статуса nginx добавился позднее, так как через какое-то время я установил и его. Потому если у вас nginx отсутствует, то удалите его переменную из этого скрипта.
Так как у нас тут теперь текстовый файл status.txt
, а не просто строка сообщения, надо написать новый скрипт /root/tg_text_send.sh
:
#!/bin/bash
to=$1
file=$2
tgpath=/root/tg
cd ${tgpath}
(echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -U root -W -e "send_text $to $file" <<-EOF
Создание задачи в планировщике
Сначала пишем ещё скрипт /root/tg_status_send.sh
:
#!/bin/bash
/root/status.sh
sleep 3
/root/tg_text_send.sh vasya_ivanov /root/status.txt
И теперь можно создавать задание в crontab
:
crontab -e
Подробно о редактировании таблицы заданий можно прочитать в хорошей статье Schedule Tasks on Linux Using Crontab.
Моя строка задания такая:
*/30 6-23 * * * /root/tg_status_send.sh > /dev/null 2>&1
Это значит, что скрипт (отправка сообщения с информацией по серверу) будет запускаться каждые полчаса, исключая ночное время.
После сохранения файла с таблицей не помешает перезагрузить службу:
service cron reload
Для контроля выполнения заданий можно просматривать журнал:
grep CRON /var/log/syslog
Всё, настройка завершена.
В результате я получаю на всех своих устройствах (компьютер, телефон, планшет - везде, где у меня установлен Telegram) сообщения о состоянии дел на сервере:
Можно усложнить задачу: хочу, чтобы статус отправлялся реже - раз в два часа, но зато каждые 15 минут проверять статус MySQL, и если он слёг, то информировать об этом панической картинкой и соответствующим сообщением.
Ищем подходящую картинку, загружаем её на сервер под именем achtung.png
и кладём по пути /root/achtung.png
. Пишем скрипт отправки картинки /root/tg_img_send.sh
:
#!/bin/bash
to=$1
image=$2
tgpath=/root/tg
cd ${tgpath}
(echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -U root -W -e "send_photo $to $image" <<-EOF
И скрипт, который будет смотреть за MySQL и слать картинку, если он полёг - /root/tg_achtung.sh
:
#!/bin/bash
msql="$(mysqladmin ping)"
if test "$msql" != "mysqld is alive"
then
/root/tg_img_send.sh vasya_ivanov /root/achtung.png
/root/tg_msg_send.sh vasya_ivanov "MySQL is down!"
fi
Изменяем планировщик:
0 6-23/2 * * * /root/tg_status_send.sh > /dev/null 2>&1
*/15 * * * * /root/tg_achtung.sh > /dev/null 2>&1
Теперь, если MySQL упадёт, в течение 15 минут я получу такие сообщения:
Позже, возможно, напишу, как общаться с сервером онлайн, а не только получать сообщения по расписанию.
А нет, не напишу, как общаться, потому что они запилили поддержку ботов, так что это уже не очень нужно. Вот зато может быть напишу про своего бота, если сделаю уже написал.
Social networks
Zuck: Just ask
Zuck: I have over 4,000 emails, pictures, addresses, SNS
smb: What? How'd you manage that one?
Zuck: People just submitted it.
Zuck: I don't know why.
Zuck: They "trust me"
Zuck: Dumb fucks