0
0
Fork 0
mirror of https://github.com/alerta/alerta.git synced 2025-01-30 11:36:20 +00:00
alerta_alerta/alerta/ircbot/daemon.py
2014-04-30 10:48:40 +01:00

136 lines
3.7 KiB
Python

import time
import threading
import irc.bot
import irc.client
from alerta.common import config
from alerta.common import log as logging
from alerta.common.daemon import Daemon
from alerta.common.alert import AlertDocument
from alerta.common.heartbeat import Heartbeat
from alerta.common.amqp import Messaging, FanoutConsumer
from alerta.common.api import ApiClient
__version__ = '3.0.4'
LOG = logging.getLogger(__name__)
CONF = config.CONF
class IrcbotServer(threading.Thread, irc.bot.SingleServerIRCBot):
def __init__(self):
LOG.info('Connecting to IRC server %s:%s', CONF.irc_host, CONF.irc_port)
irc.bot.SingleServerIRCBot.__init__(self, [(CONF.irc_host, CONF.irc_port)], CONF.irc_user, CONF.irc_user)
threading.Thread.__init__(self)
self.channel = CONF.irc_channel
self.api = ApiClient()
def run(self):
self._connect()
super(irc.bot.SingleServerIRCBot, self).start()
LOG.info('Connected to %s:%s', CONF.irc_host, CONF.irc_port)
def on_welcome(self, connection, event):
connection.join(self.channel)
LOG.info('Joined %s', self.channel)
def on_pubmsg(self, connection, event):
try:
cmd, args = event.arguments[0].split(' ', 1)
except ValueError:
cmd = event.arguments[0]
args = None
self.do_command(event, cmd, args)
def do_command(self, event, cmd, args):
if cmd == "disconnect":
self.disconnect()
elif cmd == "die":
self.die()
elif cmd == "ack" and args:
self.api.ack_alert(args)
elif cmd == "delete" and args:
self.api.delete_alert(args)
else:
self.connection.privmsg(self.channel, "huh?")
class IrcbotMessage(FanoutConsumer, threading.Thread):
def __init__(self, irc):
self.irc = irc
mq = Messaging()
self.connection = mq.connection
FanoutConsumer.__init__(self, self.connection)
threading.Thread.__init__(self)
def on_message(self, body, message):
LOG.debug("Received: %s", body)
try:
ircAlert = AlertDocument.parse_alert(body)
except ValueError:
return
if ircAlert:
LOG.debug('%s : Send IRC message to %s', ircAlert.get_id(), CONF.irc_channel)
msg = '%s [%s] %s - %s %s is %s on %s %s' % (
ircAlert.get_id(short=True), ircAlert.status, ircAlert.environment, ircAlert.severity.capitalize(),
ircAlert.event, ircAlert.value, ','.join(ircAlert.service), ircAlert.resource)
try:
self.irc.connection.privmsg(CONF.irc_channel, msg)
except irc.client.ServerNotConnectedError, e:
LOG.error('Could not send message to IRC server %s:%s: %s', CONF.irc_host, CONF.irc_port, e)
class IrcbotDaemon(Daemon):
ircbot_opts = {
'irc_host': 'localhost',
'irc_port': 6667,
'irc_channel': '#alerts',
'irc_user': 'alerta',
}
def __init__(self, prog, **kwargs):
config.register_opts(IrcbotDaemon.ircbot_opts)
Daemon.__init__(self, prog, kwargs)
def run(self):
ircbot = IrcbotServer()
mq = IrcbotMessage(ircbot)
mq.start()
ircbot.start()
self.api = ApiClient()
try:
while True:
LOG.debug('Send heartbeat...')
heartbeat = Heartbeat(tags=[__version__])
try:
self.api.send(heartbeat)
except Exception, e:
LOG.warning('Failed to send heartbeat: %s', e)
time.sleep(CONF.loop_every)
except (KeyboardInterrupt, SystemExit):
ircbot.should_stop = True