| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- SleekXMPP: The Sleek XMPP Library
- Copyright (C) 2010 Nathanael C. Fritz
- This file is part of SleekXMPP.
- See the file LICENSE for copying permission.
- """
- import sys, traceback
- import json
- import logging
- import ConfigParser
- from time import sleep
- import time, datetime
- import sleekxmpp
- import redis
- from threading import Lock
- from redisQueue import RedisQueue
- import threading
- # Python versions before 3.0 do not use UTF-8 encoding
- # by default. To ensure that Unicode is handled properly
- # throughout SleekXMPP, we will set the default encoding
- # ourselves to UTF-8.
- if sys.version_info < (3, 0):
- from sleekxmpp.util.misc_ops import setdefaultencoding
- setdefaultencoding('utf8')
- else:
- raw_input = input
- class AlertMsgBot(sleekxmpp.ClientXMPP):
- """
- A basic SleekXMPP bot that will log in, send a message,
- and then log out.
- """
- config = None
- rsq= None
- recipients = None
- quit = False
- tlock = None
-
- def __init__(self, config):
-
- self.config = config
- host = config.get("redis", "redis.server").strip('"').strip("'")
- port = config.get("redis", "redis.port")
- db = config.get("redis", "redis.db")
- qname = config.get("alert_bot", "msg_bot.redis_mq").strip('"').strip("'")
- qprefix = config.get("alert_bot", "msg_bot.redis_prefix").strip('"').strip("'")
-
- self.rsq = RedisQueue(qname, qprefix, host, port, db)
- logging.info('Connect to redis on server->%s:%s db->%s qname->%s:%s' % (host, port, db, qprefix, qname))
- jid = config.get("alert_bot", "msg_bot.jid").strip('"').strip("'")
- password = config.get("alert_bot", "msg_bot.pass").strip('"').strip("'")
- sleekxmpp.ClientXMPP.__init__(self, jid, password)
-
- self.recipients = eval(config.get("alert_bot", "msg_bot.recipients").strip('"').strip("'"))
- self.tlock = Lock()
- # The session_start event will be triggered when
- # the bot establishes its connection with the server
- # and the XML streams are ready for use. We want to
- # listen for this event so that we we can initialize
- # our roster.
- self.add_event_handler("session_start", self.start, threaded=True)
- def start(self, event):
- """
- Process the session_start event.
- Typical actions for the session_start event are
- requesting the roster and broadcasting an initial
- presence stanza.
- Arguments:
- event -- An empty dictionary. The session_start
- event does not provide any additional
- data.
- """
- self.send_presence()
- self.get_roster()
- self.rsq.put("Greetings! The alert bot has just started!")
- t = threading.Thread(target = self.process_alerts(), args=())
- t.start()
- # self.send_message(mto=self.recipient,
- # mbody=self.msg,
- # mtype='chat')
-
-
-
- def process_alerts(self):
- self.quit = False
- while self.quit <> True:
- if not self.rsq.empty():
- msg = self.rsq.get()
- logging.debug('process_alerts: received msg: {%s}' % msg)
- self.send_msg(msg)
- sleep(1)
- # Using wait=True ensures that the send queue will be
- # emptied before ending the session.
- self.disconnect(wait=True)
- def send_msg(self, msg):
- self.tlock.acquire()
- try:
- for r in self.recipients:
- self.send_message(r, msg, mtype='chat')
- finally:
- self.tlock.release()
-
-
- #
- # alert helper doesn't care whether the xmpp server
- # has started or not, all it cares is being able to put the message
- # into redisQueue
- class AlertHelper():
- q = None
-
- def __init__(self, config):
- rhost = config.get("redis", "redis.server").strip('"').strip("'")
- rport = config.get("redis", "redis.port")
- rdb = config.get("redis", "redis.db")
- chatq = config.get("alert_bot", "msg_bot.redis_mq").strip('"').strip("'")
- prefix = config.get("alert_bot", "msg_bot.redis_prefix").strip('"').strip("'")
-
- self.q = RedisQueue(chatq, prefix, rhost, rport, rdb)
-
- def post_msg(self, msg):
- self.q.put(msg)
-
- if __name__ == '__main__':
- if len(sys.argv) != 2:
- print("Usage: %s <config file>" % sys.argv[0])
- exit(-1)
- cfg_path= sys.argv[1:]
- config = ConfigParser.SafeConfigParser()
- if len(config.read(cfg_path)) == 0:
- raise ValueError, "Failed to open config file"
-
- logconfig = eval(config.get("alert_bot", "msg_bot.logconfig").strip('"').strip("'"))
- logconfig['format'] = '%(asctime)s %(levelname)-8s %(message)s'
- logging.basicConfig(**logconfig)
- xmpp = AlertMsgBot(config)
- xmpp.register_plugin('xep_0030') # Service Discovery
- xmpp.register_plugin('xep_0199') # XMPP Ping
- if xmpp.connect(): #('192.168.1.1', 5222), True, True, False):
- xmpp.process(block=False)
- logging.info('Complete initialization...Bot will now run forever')
- a = AlertHelper(config)
- a.post_msg('from AlertHelper: testing 123')
- else:
- print("Unable to connect.")
|