Pull to refresh

Мгновенное сообщение из консоли в jabber

Reading time2 min
Views18K
xmpp logoНередко перед системными администраторами встает задача оповещения себя и коллег о каких-либо событиях на сервере, будь то отчет об успешных входах по ssh, резко возросшая нагрузка, падение сервиса, сообщение о переключении на резервное питание или вскипевшем чайнике.
Чаще всего такая задача решается, например, отправкой почтового сообщения. Но нельзя гарантировать, что сообщение, во-первых, прийдет вовремя, а во-вторых, что его сразу прочтут. Тогда, подумает администратор, будем использовать IM. Но как? Держать, например, centerim постоянно открытым в screen? Согласитесь, не самый радужный вариант.
На выручку к нам спешит чип и дейл открытый протокол XMPP. Написано множество расширений к популярным языкам и примеров кода, позволяющих отослать сообщение кому требуется, и отослать его быстро.
Пример такого кода я и приведу.

Когда мне понадобился такой функционал, я пробежался по существующим решениям на таких популярных языках, как C, php, perl, python. Некоторые предполагали использование уже готовых классов, некоторые — подгрузку модулей. Код был чудовищно громоздким и неудобочитаемым, а я искал элегантное решение. И оно было найдено в Питоне.

Итак, условимся, что работаем в Linux. На самом деле, скрипт наверняка сможет работать и в Windows, но такой целью я не задавался. Нам понадобится, собственно, сам python, а также два модуля — любой dns и xmpppy, который представлен в Debian пакетом python-xmpp.

Код скрипта выглядит следующим образом:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import xmpp,sys

xmpp_jid = 'noreply@some.jabber.server'
xmpp_pwd = 'noreplypass'

to = sys.argv[1]
msg = sys.argv[2]

jid = xmpp.protocol.JID(xmpp_jid)
client = xmpp.Client(jid.getDomain(),debug=[])
client.connect()
client.auth(jid.getNode(),str(xmpp_pwd),resource='xmpppy')
client.send(xmpp.protocol.Message(to,msg))
client.disconnect()


Скрипт, используя переданные ему JID и пароль, авторизуется на сервере, отправляет сообщение и закрывает соединение. Проще некуда. Вам потребуется сделать отдельную учетку для скрипта (но можно и не делать, jabber разрешает множественные одновременные подключения с разным resource) и внести учетные данные в переменные xmpp_jid и xmpp_pwd.

Сохраните код в файл, сделайте его исполняемым, запускайте. Запуск выглядит следующим образом:

/home/username/scripts/send_xmpp_message username@email.server.ru "привет, это твой любимый сервер, не забудь вынуть пиво из серверного шкафа"


Полет фантазии неограничен: после легкой модификации, например, в скрипт можно будет перенаправлять данные вместо передачи аргументов, а используя crontab, отправлять сообщения по расписанию.
Tags:
Hubs:
+59
Comments31

Articles