Система Orphus
[]

пятница, 22 мая 2009 г.

SendXMPP: Мониторим сервер с помощью Jabber

Нам, админам, нужно постоянно следить за серверами. Создавать кучу подключений по SSH или ssh-туннели не очень удобная вещь. E-mail, как правило, отсталый по времени, т.к. не у всех постоянно запущен e-mail клиент. А вот jabber запущен постоянно и всегда и зачастую даже на мобильнике. Почему бы его не заюзать для слежки за серваком?

SendXMPP - это Perl-скрипт для отправки сообщений на XMPP (Jabber) сервер. Работает почти так же, как программа mail при отправке почты. SendXMPP можно использовать для отправки сообщения на xmpp сервер для предупреждения или уведомления пользователей.

Итак, для начала нам нужно поставить SendXMPP. Для Debian/Ubuntu это можно сделать так:
sudo aptitude install sendxmpp
Готово. Теперь надо настроить SendXMPP, чтобы он знал на какой сервер под каким логином и паролем ему коннектиться. Для этого нужно создать файл ~/.sendxmpprc и записать в него настройки:
vim ~/.sendxmpprc
servername@jabber.domain.ru:5222 PaSSwD
Тут servername@jabber.domain.ru:5222 - логин, сервер и порт, PaSSwD - пароль.
Теперь нужно выставить на него такие права, чтобы этот файл мог читать только тот юзер, от имени которого будет зпапускаться SendXMPP:
chmod 400 ~/.sendxmpprc
Все, готово. Установка и настройка закончены.

Теперь пара примеров по использованию SendXMPP.
Пример 1:
Задача: Узнать когда процессор сервера будет под большой нагрузкой.
Решение: Запихнуть в кронтаб вот этот однострочник, чтобы "каждые 5 сек." выполнялся:
if [[ $(ps aux | awk '{print $3}' | sort -nr | head -n 1 | sed 's/\..*//g' ) -ge 70 ]] ;\
then ps aux | awk '$3>70' | sendxmpp -s 'CPU Load > 70%' admin@jabber.domain.ru ; \
fi
НО(!) имей ввиду, что это просто пример, в реальной жизни такой однострочник не стоит использовать, т.к. если какой-либо процесс загрузит проц, то тебе будут постоянно идти сообщения, что не есть гуд. В реальной жизни надо сделать провеку, т.е. типа если уже отправлено сообщение, то "поднимаем флаг" и больше не отправляем, когда нагрузка спала, "опускаем флаг".

Пример 2:
Задача: Нужно отслеживать все подключения к SSH-серверу.
Решение: Создать файл /etc/ssh/sshrc с содержанием:
echo "Date:\t\t$(date +%d.%m.%Y\ %H:%M:%S)\nRemote Host:\t$SSH_CONNECTION\nUser:\t\t$USER\nShell:\t\t$SSH_TTY" |\
sendxmpp -s 'SSH Login on GLPI Server' -r 'GLPI Server' -u UserName -j jabber.domain.ru:5222 -p 'PaSSwD' admin@jabber.domain.ru
Теперь при любом подключении будет приходить сообщение в jabber с указанием даты, времени, ip подключившегося, имя этого юзера и на какой шелл он повесился.


Пояснения ключей:
-s - тема сообщения (у меня русские буквы не отображает, в теле все хорошо)
-r - ресурс
-u - имя юзера, для логина на jabber-сервер
-j - адрес jabber-сервера и его порт
-p - пароль





ЗЫЖ: Если у кого бедет проблема с русской кодировкой попробуйте открыть файл sendxmpp, найти строки
use Net::XMPP;
use Getopt::Long;
use strict;
и сразу после них добавить строку
use encoding 'koi8-r';
или
use encoding 'utf-8';

Возможно поможет. Я не пробовал, т.к. у меня с русскими в Gajim'е все хорошо, кроме темы сообщения, а тут они мне и не нужны.

Похожие статьи

8 коммент.:

Анонимный комментирует... пятница, 22 мая 2009 г. в 18:52:00 GMT+3

спасибо

Unknown комментирует... воскресенье, 24 мая 2009 г. в 19:49:00 GMT+3

Пользуйтесь на здоровье :)

Ad1ce комментирует... суббота, 12 декабря 2009 г. в 14:24:00 GMT+2

Настроил, все работает. Только с каких пор крон умеет работать с секундами(цитата:"чтобы каждые 5 сек. выполнялся")? недочет.

Unknown комментирует... суббота, 12 декабря 2009 г. в 14:38:00 GMT+2

Можно и недочетом назвать, хотя это я так, образно выразился. Когда писал этот пост, даже не задумывался над примерами, просто хотел показать примеры применения.

Спасибо за замечание, взял в кавычки.


ЗЫЖ Хотя можно и "костыль" сделать: засунуть в крон проверку каждую минуту, запущен ли скрипт, и если нет, запускать, а в скрипте в бесконечный цикл завернуть проверку со "sleep 5s" =) Хотя лучше будет демон сделать свой :)

Ad1ce комментирует... суббота, 12 декабря 2009 г. в 15:53:00 GMT+2

Для своих скриптов я как раз и делаю бесконечный цикл, только на PHP. Как в данном случае бесонечный цикл сделать на баше?

Unknown комментирует... суббота, 12 декабря 2009 г. в 15:59:00 GMT+2

Очень просто :)
while true ; do
# что-то полезное
sleep 1s
done

В этом примере бесконечный цикл, в котором итерации будут повторяться каждую секунду (sleep 1s). НЕ рекомендую убирать слипы из бесконечных циклов.

Ad1ce комментирует... суббота, 12 декабря 2009 г. в 16:20:00 GMT+2

Ну насчет слипов это конечно же понятно.
Тогда уж буду разбираться до конца. Собственно насколько сложно превратить этот скрипт в демон, чтоб было start|stop?

Unknown комментирует... суббота, 12 декабря 2009 г. в 17:11:00 GMT+2

Да собственно там ничего сложного нету. Пишешь скрипт-демон (можешь глянуть /etc/init.d/skeleton как пример и основу), который будет каждые 5 сек. проверять то что надо и, в случае чего, отправлять мессагу тебе :)

Отправить комментарий