Declaration of VAR

and some other stuff

Отправка состояния сервера через Telegram

2015-05-12 23:37:21 +0300

2015-05-12 23:37:21 +0300 | Comments

Я давно собирался написать статью про 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 минут я получу такие сообщения:

Позже, возможно, напишу, как общаться с сервером онлайн, а не только получать сообщения по расписанию.



[24.10.2015] Update: Бот для Telegram

А нет, не напишу, как общаться, потому что они запилили поддержку ботов, так что это уже не очень нужно. Вот зато может быть напишу про своего бота, если сделаю уже написал.