def relogin(self, xmppuser, pending_jobs): len_pending_jobs = len(pending_jobs) self.log.info('RELOGIN %s. Pending_Jobs: %s. Data: %s', xmppuser.jid, len_pending_jobs, xmppuser) try: yield self._shared_login(xmppuser) running_client = KatooApp().getService(xmppuser.userid) self.log.info('RELOGIN %s. Running xmppclient: %s', xmppuser.jid, running_client) except XMPPUserAlreadyLogged: #If user is already logged xmppuser data is valid and we take it as xmppuser running_client = KatooApp().getService(xmppuser.userid) self.log.warning('RELOGIN %s. User Already logged taking user to perform RELOGIN process. Running xmppclient: %s', xmppuser.jid, running_client) xmppuser = running_client.user xmppuser.worker = xmppuser.userid try: xmppuser.onMigrationTime = Timer().utcnow() res = yield xmppuser.save() self.log.info('perform relogin %s. Enqueuing pending jobs %s before migration was launched. Data %s. Save result: %s', xmppuser.jid, len_pending_jobs, running_client, res) queue = Queue(conf.MACHINEID) #Enqueue pending jobs before migration was launched for job_id in pending_jobs: try: job = yield Job.fetch(job_id, queue.connection) yield queue.enqueue_job(job) except NoSuchJobError: pass self.log.info('perform relogin %s. Finished enqueuing pending jobs before migration was launched.', xmppuser.jid) self.log.info('perform relogin %s. Enqueing pending jobs after migration was launched.', xmppuser.jid) #Enqueue pending jobs after migration was launched migration_queue = Queue(xmppuser.userid) migration_job_ids = yield migration_queue.job_ids yield migration_queue.empty() while migration_job_ids: job_id = migration_job_ids.pop(0) try: job = yield Job.fetch(job_id, migration_queue.connection) #Enqueue job in current worker queue yield queue.enqueue_job(job) except NoSuchJobError: pass if not migration_job_ids: xmppuser.worker=conf.MACHINEID xmppuser.onMigrationTime='' yield xmppuser.save() migration_job_ids = yield migration_queue.job_ids yield migration_queue.empty() finally: xmppuser.worker = conf.MACHINEID xmppuser.onMigrationTime='' res = yield xmppuser.save() self.log.info('RELOGIN %s. Finished. Data %s. Save result: %s', xmppuser.jid, xmppuser, res)
def logout(self, userid): try: self.log.info('LOGOUT') running_client = KatooApp().getService(userid) if running_client is None: raise XMPPUserNotLogged('User %s is not running in current worker'%(userid)) yield running_client.disconnect() except XMPPUserNotLogged: pass finally: yield GoogleUser.remove(userid)
def update(self, userid, **kwargs): self.log.info('UPDATE. Data: %s', kwargs) running_client = KatooApp().getService(userid) if running_client is None: raise XMPPUserNotLogged('User %s is not running in current worker'%(userid)) xmppuser = running_client.user xmppuser.update(**kwargs) return xmppuser.save()
def disconnect(self, change_state=True): self.log.info('DISCONNECTED %s', self.user.jid) #Unregister in XMPP_KEEPALIVE_SERVICE KatooApp().getService('XMPP_KEEPALIVE_SUPERVISOR').unregisterObserver(self) deferred_list = [defer.maybeDeferred(self.disownServiceParent)] if change_state: self.user.away = True self.user.connected = False deferred_list.append(self.user.save()) deferred_list.append(GoogleMessage.updateRemoveTime(self.user.userid, self.user.lastTimeConnected)) deferred_list.append(GoogleRosterItem.remove(self.user.userid)) return defer.DeferredList(deferred_list, consumeErrors=True)
def __init__(self, user, app): ReauthXMPPClient.__init__(self, jid=jid.JID("%s/%s"%(user.jid,conf.XMPP_RESOURCE)), password=user.token, host="talk.google.com", port=5222, logid=user.userid) Observer.__init__(self) self.user = user self.retries = 0 self.logTraffic = conf.XMPP_LOG_TRAFFIC #Initialize protocol self.handler = GoogleHandler(self) protocol = CompleteBotProtocol(self.handler) protocol.setHandlerParent(self) self.setServiceParent(app) #Register in XMPP_KEEPALIVE_SERVICE KatooApp().getService('XMPP_KEEPALIVE_SUPERVISOR').registerObserver(self)
def update_contact(self, userid, jid, **kwargs): self.log.info('UPDATE CONTACT %s. Data: %s', jid, kwargs) running_client = KatooApp().getService(userid) if running_client is None: raise XMPPUserNotLogged('User %s is not running in current worker'%(userid)) roster = running_client.roster yield roster.set(jid, **kwargs) xmppuser = running_client.user seconds = kwargs.get('notifyWhenAvailable', '') if seconds: xmppuser.addAvailablePresenceContact(jid) else: xmppuser.removeAvailablePresenceContact(jid) yield xmppuser.save()
def onConnectionLost(self, reason): self.CONNECTIONS_METRIC.add(-1) currTime = Timer().utcnow() connectedTime = self.client.connectedTime lastTimeKeepAlive = (currTime - KatooApp().getService('XMPP_KEEPALIVE_SUPERVISOR').lastTime).seconds isAuthenticating = self.client.isAuthenticating() self.log.info('CONNECTION_LOST %s. Connected Time: %s. LastTimeKeepAlive: %s. Authenticating: %s. Reason %s', self.user.jid, connectedTime, lastTimeKeepAlive, isAuthenticating, str(reason)) self.CONNECTION_TIME_METRIC.add(connectedTime) self.CONNECTION_KEEP_ALIVE_TIME_METRIC.add(lastTimeKeepAlive) if not isAuthenticating: if connectedTime < conf.XMPP_MIN_CONNECTED_TIME: self.client.retries += 1 if self.client.retries >= conf.XMPP_MAX_RETRIES: self.client.onMaxRetries() return else: self.client.retries = 0
''' Created on Jul 8, 2013 @author: pvicente ''' from katoo import conf, KatooApp from katoo.rqtwisted import worker from katoo.supervisor import MetricsSupervisor, XMPPKeepAliveSupervisor from katoo.utils.applog import getLoggerAdapter, getLogger from katoo.utils.multiprocess import MultiProcess from katoo.utils.time import sleep import os application = KatooApp().app if conf.ADOPTED_STREAM is None: os.environ[ 'ADOPTED_STREAM'] = '' #Avoid to perform Mutlprocess Service in child processes if conf.MULTIPROCESS > 0: m = MultiProcess(__file__, number=conf.MULTIPROCESS) m.setServiceParent(application) metrics_supervisor = MetricsSupervisor() metrics_supervisor.setServiceParent(application) xmpp_keepalive_supervisor = XMPPKeepAliveSupervisor() xmpp_keepalive_supervisor.setServiceParent(application) if conf.REDIS_WORKERS > 0: worker.LOGGING_OK_JOBS = conf.LOGGING_OK_JOBS
deferred_list.append(self.user.save()) deferred_list.append(GoogleMessage.updateRemoveTime(self.user.userid, self.user.lastTimeConnected)) deferred_list.append(GoogleRosterItem.remove(self.user.userid)) return defer.DeferredList(deferred_list, consumeErrors=True) def __str__(self): return '<%s object at %s. name: %s>(user: %s)'%(self.__class__.__name__, hex(id(self)), self.name, self.user) if __name__ == '__main__': import os from katoo.data import GoogleUser from wokkel_extensions import XMPPClient from katoo.utils.applog import getLogger, getLoggerAdapter from katoo.apns.api import KatooAPNSService from katoo.supervisor import XMPPKeepAliveSupervisor my_log = getLoggerAdapter(getLogger(__name__, level="INFO"), id='MYLOG') app = KatooApp().app KatooAPNSService().service.setServiceParent(app) KatooApp().start() XMPPKeepAliveSupervisor().setServiceParent(app) import twisted.python.log twisted.python.log.startLoggingWithObserver(KatooApp().log.emit) user = GoogleUser("1", _token=os.getenv('TOKEN'), _refreshtoken=os.getenv('REFRESHTOKEN'), _resource="asdfasdf", _pushtoken=os.getenv('PUSHTOKEN', None), _jid=os.getenv('JID'), _pushsound='cell1.aif', _favoritesound='cell7.aif', _away=True) my_log.info('Instance user: %s', user) xmppclient = XMPPGoogle(user, app) my_log.info('Instance xmppclient: %s', xmppclient) xmppclient.log.info("Instance XMPPGoogle %s. Instance ReauthXMPP %s Instance XMPPClient %s Instance GoogleUser %s", isinstance(xmppclient, XMPPGoogle), isinstance(xmppclient, ReauthXMPPClient), isinstance(xmppclient, XMPPClient), isinstance(xmppclient, GoogleUser)) reactor.run()
def _attach_global_metrics(self): service = KatooApp().getService(MetricsSupervisor.name) for metric in self._globalmetrics: service.registerObserver(metric())
def _shared_login(self, xmppuser): userid = xmppuser.userid running_client = KatooApp().getService(userid) if not running_client is None: raise XMPPUserAlreadyLogged('Service %s already running'%(running_client)) XMPPGoogle(xmppuser, KatooApp().app)
def disconnect(self, userid, change_state=True): self.log.info('DISCONNECTING') running_client = KatooApp().getService(userid) if running_client is None: raise XMPPUserNotLogged('User %s is not running in current worker'%(userid)) return running_client.disconnect(change_state)