From 352073b3f8178c6273b68c6c27856c0521af1c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20=C5=9Eahin?= Date: Fri, 11 Mar 2016 17:51:26 +0200 Subject: [PATCH] logs were added, anonymous connection problem fixed --- opt/ahenk/ahenkd.py | 166 +++++++++++--------- opt/ahenk/base/messaging/MessageReceiver.py | 86 +++++----- opt/ahenk/base/messaging/MessageSender.py | 88 ++++++----- 3 files changed, 183 insertions(+), 157 deletions(-) diff --git a/opt/ahenk/ahenkd.py b/opt/ahenk/ahenkd.py index c1db20a..6534e0c 100644 --- a/opt/ahenk/ahenkd.py +++ b/opt/ahenk/ahenkd.py @@ -17,106 +17,124 @@ from base.event.EventManager import EventManager from base.plugin.PluginManager import PluginManager from base.task.TaskManager import TaskManager from multiprocessing import Process -from threading import Thread -import sys,logging,queue,time,os +import sys class AhenkDeamon(BaseDaemon): - """docstring for AhenkDeamon""" + """docstring for AhenkDeamon""" - def reload(self,msg): - # reload service here - pass + def reload(self,msg): + # reload service here + pass - def run(self): - print ("merhaba dunya") + def run(self): + print ("Ahenk running...") - globalscope = Scope() - globalscope.setInstance(globalscope) + globalscope = Scope() + globalscope.setInstance(globalscope) - configFilePath='/etc/ahenk/ahenk.conf' - configfileFolderPath='/etc/ahenk/config.d/' + configFilePath='/etc/ahenk/ahenk.conf' + configfileFolderPath='/etc/ahenk/config.d/' - #configuration manager must be first load - configManager = ConfigManager(configFilePath,configfileFolderPath) - config = configManager.read() - globalscope.setConfigurationManager(config) + #configuration manager must be first load + configManager = ConfigManager(configFilePath,configfileFolderPath) + config = configManager.read() + globalscope.setConfigurationManager(config) - # Logger must be second - logger = Logger() - logger.info("this is info log") - globalscope.setLogger(logger) + # Logger must be second + logger = Logger() + logger.info("[AhenkDeamon] Log was set") + globalscope.setLogger(logger) - eventManager = EventManager() - globalscope.setEventManager(eventManager) + eventManager = EventManager() + globalscope.setEventManager(eventManager) + logger.info("[AhenkDeamon] Event Manager was set") - messageManager = Messaging() - globalscope.setMessageManager(messageManager) + messageManager = Messaging() + globalscope.setMessageManager(messageManager) + logger.info("[AhenkDeamon] Message Manager was set") - pluginManager = PluginManager() - pluginManager.loadPlugins() - globalscope.setPluginManager(pluginManager) + pluginManager = PluginManager() + pluginManager.loadPlugins() + globalscope.setPluginManager(pluginManager) + logger.info("[AhenkDeamon] Plugin Manager was set") - taskManger = TaskManager() - globalscope.setTaskManager(taskManger) + taskManger = TaskManager() + globalscope.setTaskManager(taskManger) + logger.info("[AhenkDeamon] Task Manager was set") - registration=Registration() - globalscope.setRegistration(registration) + registration=Registration() + globalscope.setRegistration(registration) + logger.info("[AhenkDeamon] Registration was set") - execution_manager=ExecutionManager() + execution_manager=ExecutionManager() + globalscope.setExecutionManager(execution_manager) + logger.info("[AhenkDeamon] Execution Manager was set") - while registration.is_registered() is False: - registration.registration_request() - print("Receiver OnAir") - message_receiver = MessageReceiver() - rec_process = Process(target=message_receiver.connect_to_server) - rec_process.start() + while registration.is_registered() is False: + logger.debug("[AhenkDeamon] Attempting to register") + registration.registration_request() + + logger.info("[AhenkDeamon] Ahenk is registered") + + message_receiver = MessageReceiver() + rec_process = Process(target=message_receiver.connect_to_server) + rec_process.start() + logger.info("[AhenkDeamon] Receiver was set") + + if registration.is_ldap_registered() is False: + logger.debug("[AhenkDeamon] Attempting to registering ldap") + registration.ldap_registration_request() #TODO bu mesaj daha kısa olabilir + + logger.info("[AhenkDeamon] LDAP registration of Ahenk is completed") #login - #message_sender=MessageSender(messageManager.login_msg(),None) - #message_sender.connect_to_server() + logger.info("[AhenkDeamon] Logining...") + message_sender=MessageSender(messageManager.login_msg(),None) + message_sender.connect_to_server() - #logout - #message_sender=MessageSender(messageManager.logout_msg(),None) - #message_sender.connect_to_server() - #rec_process.terminate() + #logout + #message_sender=MessageSender(messageManager.logout_msg(),None) + #message_sender.connect_to_server() - """ - this is must be created after message services - responseQueue = queue.Queue() - messageResponseQueue = MessageResponseQueue(responseQueue) - messageResponseQueue.setDaemon(True) - messageResponseQueue.start() - globalscope.setResponseQueue(responseQueue) - """ + #rec_process.terminate() + + """ + this is must be created after message services + responseQueue = queue.Queue() + messageResponseQueue = MessageResponseQueue(responseQueue) + messageResponseQueue.setDaemon(True) + messageResponseQueue.start() + globalscope.setResponseQueue(responseQueue) + """ if __name__ == '__main__': - pidfilePath='/var/run/ahenk.pid' + pidfilePath='/var/run/ahenk.pid' - ahenkdaemon = AhenkDeamon(pidfilePath) + ahenkdaemon = AhenkDeamon(pidfilePath) - print (sys.argv) + print (sys.argv) - if len(sys.argv) == 2: - if sys.argv[1] == "start": - print ("starting") - ahenkdaemon.run() - #print (ahenkdaemon.get_pid()) - elif sys.argv[1] == 'stop': - ahenkdaemon.stop() - elif sys.argv[1] == 'restart': - ahenkdaemon.restart() - elif sys.argv[1] == 'status': - # print (status) - pass - else: - print ('Unknown command. Usage : %s start|stop|restart|status' % sys.argv[0]) - sys.exit(2) - sys.exit(0) - else: - print ('Usage : %s start|stop|restart|status' % sys.argv[0]) - sys.exit(2) + if len(sys.argv) == 2: + if sys.argv[1] == "start": + print ("starting") + ahenkdaemon.run() + #print (ahenkdaemon.get_pid()) + elif sys.argv[1] == 'stop': + ahenkdaemon.stop() + elif sys.argv[1] == 'restart': + ahenkdaemon.restart() + elif sys.argv[1] == 'status': + # print (status) + pass + else: + print ('Unknown command. Usage : %s start|stop|restart|status' % sys.argv[0]) + sys.exit(2) + sys.exit(0) + else: + print ('Usage : %s start|stop|restart|status' % sys.argv[0]) + sys.exit(2) diff --git a/opt/ahenk/base/messaging/MessageReceiver.py b/opt/ahenk/base/messaging/MessageReceiver.py index a7c0fe0..b4aeda8 100644 --- a/opt/ahenk/base/messaging/MessageReceiver.py +++ b/opt/ahenk/base/messaging/MessageReceiver.py @@ -2,29 +2,22 @@ # -*- coding: utf-8 -*- # Author: Volkan Şahin # Author: İsmail BAŞARAN -import sys +import json, os, asyncio, slixmpp, sys sys.path.append('../..') -import slixmpp -import asyncio -import threading -import json -from threading import Thread -from multiprocessing import Process -from slixmpp.exceptions import IqError, IqTimeout from base.Scope import Scope + class MessageReceiver(slixmpp.ClientXMPP): def __init__(self): - # global scope of ahenk scope = Scope().getInstance() - # configuration_manager and logger comes from ahenk deamon self.logger = scope.getLogger() - self.configurationManager = scope.getConfigurationManager() + self.configuration_manager = scope.getConfigurationManager() self.event_manger=scope.getEventManager() + self.execution_manager=scope.getExecutionManager() self.my_jid=self.get_jid_id() self.my_pass=self.get_password() @@ -32,32 +25,33 @@ class MessageReceiver(slixmpp.ClientXMPP): slixmpp.ClientXMPP.__init__(self, self.my_jid,self.my_pass) self.room=None - self.receiver=self.configurationManager.get('CONNECTION', 'receiverjid')+'@'+self.configurationManager.get('CONNECTION', 'host')+'/Smack' - self.nick = self.configurationManager.get('CONNECTION', 'nick') - self.receive_file_path=self.configurationManager.get('CONNECTION', 'receiveFileParam') - - #TODO get default folder path from receivefile - #self.file = open('/home/volkan/Desktop/yaz.txt', 'rb') + self.receiver=self.configuration_manager.get('CONNECTION', 'receiverjid')+'@'+self.configuration_manager.get('CONNECTION', 'host')+'/Smack' + self.nick = self.configuration_manager.get('CONNECTION', 'nick') + self.receive_file_path=self.configuration_manager.get('CONNECTION', 'receiveFileParam') + self.logger.debug('[MessageReceiver] XMPP Receiver parameters were set') self.register_extensions() self.add_listeners() self.connect() def get_jid_id(self): - if self.configurationManager.get('CONNECTION', 'uid') == "" or self.configurationManager.get('CONNECTION', 'uid') is None: - return str(self.configurationManager.get('CONNECTION', 'host')) #is user want to create connection as anonymous + if self.configuration_manager.get('CONNECTION', 'uid') == "" or self.configuration_manager.get('CONNECTION', 'uid') is None: + self.logger.debug('[MessageReceiver] Parameters were set as anonymous account') + return str(self.configuration_manager.get('CONNECTION', 'host')) else: - return str(self.configurationManager.get('CONNECTION', 'uid')+'@'+self.configurationManager.get('CONNECTION', 'host')+'/receiver') + self.logger.debug('[MessageReceiver] Parameters were set as defined account') + return str(self.configuration_manager.get('CONNECTION', 'uid')+'@'+self.configuration_manager.get('CONNECTION', 'host')+'/receiver') def get_password(self): - if self.configurationManager.get('CONNECTION', 'password') == "" or self.configurationManager.get('CONNECTION', 'password') is None: + if self.configuration_manager.get('CONNECTION', 'password') == "" or self.configuration_manager.get('CONNECTION', 'password') is None: return None else: - return str(self.configurationManager.get('CONNECTION', 'password')) + return str(self.configuration_manager.get('CONNECTION', 'password')) def add_listeners(self): self.add_event_handler("session_start", self.session_start) self.add_event_handler("message", self.recv_direct_message) + self.add_event_handler("socks5_connected", self.stream_opened) self.add_event_handler("socks5_data", self.stream_data) self.add_event_handler("socks5_closed", self.stream_closed) @@ -66,68 +60,68 @@ class MessageReceiver(slixmpp.ClientXMPP): self.add_event_handler("ibb_stream_data", self.stream_data) self.add_event_handler("ibb_stream_end", self.stream_closed) - def stream_opened(self, sid): - print('stream opened') - print('So stream_id:'+str(self.stream_id)) + self.logger.debug('[MessageReceiver] Event handlers were added') + def stream_opened(self, sid): + self.logger.debug('[MessageReceiver] Stream was opened. Stream id: '+str(self.stream_id)) self.file = open(self.receive_file_path+self.stream_id, 'wb') return self.file def stream_data(self, data): - print('stream data') - self.logger.info('Sd'+self.get_id()) - #self.logger.info('Stream data.') + self.logger.debug('[MessageReceiver] Receiving file...') self.file.write(data) def stream_closed(self, exception): - print('stream close') - #self.logger.info('Stream closed. %s', exception) + self.logger.debug('[MessageReceiver] Stream was closed') self.file.close() + self.set_file_name_to_md5() def session_start(self, event): + self.logger.debug('[MessageReceiver] Session was started') self.get_roster() self.send_presence() def send_direct_message(self,msg): - #need connection control - print("sending...\n"+msg) + self.logger.debug('[MessageReceiver] Sending message: '+msg) self.send_message(mto=self.receiver,mbody=msg,mtype='normal') def invite_auto_accept(self, inv): self.room=inv['from'] - print("(%s) invite is accepted" % str(self.room)) + self.logger.debug('[MessageReceiver] (%s) invite is accepted' % str(self.room)) self.plugin['xep_0045'].joinMUC(self.room,self.nick,wait=True) self.send_message(mto=self.room.bare,mbody="Hi all!",mtype='groupchat') return self.room - def recv_muc_message(self, msg):#auto reply - + def recv_muc_message(self, msg): if msg['mucnick'] != self.nick: - print("%s : %s" % (str(msg['from']),str(msg['body'])) ) + self.logger.debug('[MessageReceiver] %s : %s' % (str(msg['from']),str(msg['body'])) ) self.send_message(mto=msg['from'].bare,mbody="I got it, %s." % msg['mucnick'],mtype='groupchat') else: - print("%s : %s" % (str(msg['mucnick']),str(msg['body']))) + self.logger.debug('[MessageReceiver] %s : %s' % (str(msg['mucnick']),str(msg['body']))) - def recv_direct_message(self, msg): #TODO burada mesajın type ını event olarak fırlat + def recv_direct_message(self, msg): if msg['type'] in ('chat', 'normal'): j = json.loads(str(msg['body'])) type =j['type'] - print ("event will be fired:"+type) + self.logger.debug('[MessageReceiver] Fired event is: '+type) self.event_manger.fireEvent(type,str(msg['body']).lower()) - def connect_to_server(self):# Connect to the XMPP server and start processing XMPP stanzas. try: + self.logger.debug('[MessageReceiver] Connecting to server as thread') loop = asyncio.get_event_loop() loop.run_until_complete(self.process()) - - #self.logger.info('Connection were established successfully') + self.logger.debug('[MessageReceiver] Connection were established successfully') return True except Exception as e: - print('Connection to server is failed (%s)\n' % (e.strerror)) - #self.logger.error('Connection to server is failed! '+e) + self.logger.error('[MessageReceiver] Connection to server is failed! '+e) return False + def set_file_name_to_md5(self): + self.logger.debug('[MessageReceiver] Renaming file as md5 hash') + md5_hash=self.execution_manager.get_md5_file(self.file.name) + os.rename(self.file.name,self.receive_file_path+md5_hash) + def register_extensions(self): try: self.register_plugin('xep_0030') # Service Discovery @@ -136,8 +130,8 @@ class MessageReceiver(slixmpp.ClientXMPP): self.register_plugin('xep_0065', {'auto_accept': True}) # SOCKS5 Bytestreams self.register_plugin('xep_0047', {'auto_accept': True}) # In-band Bytestreams - #self.logger.info('Extension were registered: xep_0030,xep_0045,xep_0199,xep_0065') + self.logger.debug('Extension were registered: xep_0030,xep_0045,xep_0199,xep_0065,xep_0047') return True except Exception as e: - #self.logger.error('Extension registration is failed!(%s)\n' % (e.errno, e.strerror)) + self.logger.error('Extension registration is failed!(%s)\n' % (e.errno, e.strerror)) return False diff --git a/opt/ahenk/base/messaging/MessageSender.py b/opt/ahenk/base/messaging/MessageSender.py index cd17438..9819f29 100644 --- a/opt/ahenk/base/messaging/MessageSender.py +++ b/opt/ahenk/base/messaging/MessageSender.py @@ -2,27 +2,21 @@ # -*- coding: utf-8 -*- # Author: Volkan Şahin # Author: İsmail BAŞARAN -import sys +import slixmpp, asyncio, sys sys.path.append('../..') -import slixmpp -import asyncio -import threading -from threading import Thread -from multiprocessing import Process from slixmpp.exceptions import IqError, IqTimeout from base.Scope import Scope + class MessageSender(slixmpp.ClientXMPP): - def __init__(self,message,file_path): + def __init__(self,message,file_path): # global scope of ahenk scope = Scope().getInstance() - # logger comes from ahenk deamon - #configurationManager comes from ahenk deamon self.logger = scope.getLogger() - self.configurationManager = scope.getConfigurationManager() + self.configuration_manager = scope.getConfigurationManager() self.registration=scope.getRegistration() self.event_manager = scope.getEventManager() @@ -34,15 +28,17 @@ class MessageSender(slixmpp.ClientXMPP): self.message=None self.file=None self.room=None - self.receiver=self.configurationManager.get('CONNECTION', 'receiverjid')+'@'+self.configurationManager.get('CONNECTION', 'host')+'/Smack' - self.nick = self.configurationManager.get('CONNECTION', 'nick') - self.receivefile=self.configurationManager.get('CONNECTION', 'receiveFileParam') + self.receiver=self.configuration_manager.get('CONNECTION', 'receiverjid')+'@'+self.configuration_manager.get('CONNECTION', 'host')+'/Smack' + self.nick = self.configuration_manager.get('CONNECTION', 'nick') + self.receivefile=self.configuration_manager.get('CONNECTION', 'receiveFileParam') if file_path is not None and file_path!='': self.file=open(file_path, 'rb') if message is not None: self.message=message + self.logger.debug('[MessageSender] XMPP Receiver parameters were set') + self.add_listeners() self.register_extensions() @@ -52,41 +48,48 @@ class MessageSender(slixmpp.ClientXMPP): self.add_event_handler("socks5_connected", self.stream_opened) self.add_event_handler("socks5_data", self.stream_data) self.add_event_handler("socks5_closed", self.stream_closed) + self.logger.debug('[MessageSender] Event handlers were added') def get_jid_id(self): - if self.configurationManager.get('CONNECTION', 'uid') == "" or self.configurationManager.get('CONNECTION', 'uid') is None: - return str(self.configurationManager.get('CONNECTION', 'host')) #is user want to create connection as anonymous + if self.is_anonymous()==True: + self.logger.debug('[MessageSender] Parameters were set as anonymous account') + return str(self.configuration_manager.get('CONNECTION', 'host')) else: - return str(self.configurationManager.get('CONNECTION', 'uid')+'@'+self.configurationManager.get('CONNECTION', 'host')+'/sender') + self.logger.debug('[MessageSender] Parameters were set as defined account') + return str(self.configuration_manager.get('CONNECTION', 'uid')+'@'+self.configuration_manager.get('CONNECTION', 'host')+'/sender') def get_password(self): - if self.configurationManager.get('CONNECTION', 'password') == "" or self.configurationManager.get('CONNECTION', 'password') is None: + if self.configuration_manager.get('CONNECTION', 'password') == "" or self.configuration_manager.get('CONNECTION', 'password') is None: return None else: - return str(self.configurationManager.get('CONNECTION', 'password')) + return str(self.configuration_manager.get('CONNECTION', 'password')) def recv_direct_message(self, msg): if msg['type'] in ('chat', 'normal'): - print ("%s : %s" % (msg['from'], msg['body'])) + self.logger.debug("[MessageSender] Received message: %s -> %s" % (msg['from'], msg['body'])) self.disconnect() - self.event_manager.fireEvent('confirm_registration',str(msg['body'])) #only anonymous account can fire confirm_registration - + self.logger.debug('[MessageSender] Disconnecting...') + self.logger.debug('[MessageSender] Fired event is: confirm_registration') + self.event_manager.fireEvent('confirm_registration',str(msg['body'])) + ##TODO type fire -- only anonymous account can fire confirm_registration @asyncio.coroutine def session_start(self, event): - print("session start") + self.logger.debug('[MessageSender] Session was started') self.get_roster() self.send_presence() if self.message is not None: self.send_direct_message(self.message) - print("sent") if self.file is not None: + self.logger.debug('[MessageSender] Sending file: '+self.file.name) try: + self.logger.debug('[MessageSender] Handshaking for file transfering...') # Open the S5B stream in which to write to. proxy = yield from self['xep_0065'].handshake(self.receiver) # Send the entire file. + self.logger.debug('[MessageSender] Started to streaming file...') while True: data = self.file.read(1048576) if not data: @@ -95,43 +98,54 @@ class MessageSender(slixmpp.ClientXMPP): # And finally close the stream. proxy.transport.write_eof() except (IqError, IqTimeout): - print('File transfer errored') + self.logger.error('[MessageSender] File transfer errored') else: - print('File transfer finished') + self.logger.debug('[MessageSender] File transfer finished successfully') finally: self.file.close() - if (self.message is None and self.file is None) or self.get_password() is not None: + if (self.message is None and self.file is None) or self.get_password() is not None:#TODO password yerine ??? + self.logger.debug('[MessageSender] Disconnecting...') self.disconnect() def stream_opened(self, sid): - #self.logger.info('Stream opened. %s', sid) + self.logger.debug('[MessageSender] Stream was opened. Stream id: '+str(self.stream_id)) self.file = open(self.receive_file_path+self.stream_id, 'wb') return self.file def stream_data(self, data): - #self.logger.info('Stream data.') + self.logger.debug('[MessageSender] Receiving file...') self.file.write(data) def stream_closed(self, exception): - #self.logger.info('Stream closed. %s', exception) + self.logger.debug('[MessageSender] Stream was closed') self.file.close() + self.logger.debug('[MessageSender] Disconnecting...') self.disconnect() def send_direct_message(self,msg): - #need connection control - print("sending...\n"+msg) + self.logger.debug('[MessageSender] Sending message: '+msg) self.send_message(mto=self.receiver,mbody=msg,mtype='normal') def connect_to_server(self):# Connect to the XMPP server and start processing XMPP stanzas. try: + self.logger.debug('[MessageSender] Connecting to server...') self.connect() - self.process(forever=True) - #self.logger.info('Connection were established successfully') + + if self.is_anonymous()==True: + self.process(forever=False) + else: + self.process(forever=True) + self.logger.debug('[MessageSender] Connection were established successfully') return True except Exception as e: - print('Connection to server is failed (%s)\n' % (e.strerror)) - #self.logger.error('Connection to server is failed! '+e) + self.logger.error('[MessageSender] Connection to server is failed! '+e) + return False + + def is_anonymous(self): + if self.configuration_manager.get('CONNECTION', 'uid') == "" or self.configuration_manager.get('CONNECTION', 'uid') is None: + return True + else: return False def register_extensions(self): @@ -142,8 +156,8 @@ class MessageSender(slixmpp.ClientXMPP): self.register_plugin('xep_0065', {'auto_accept': True}) # SOCKS5 Bytestreams self.register_plugin('xep_0047', {'auto_accept': True}) # In-band Bytestreams - #self.logger.info('Extension were registered: xep_0030,xep_0045,xep_0199,xep_0065') + self.logger.debug('[MessageSender] Extension were registered: xep_0030,xep_0045,xep_0199,xep_0065,xep_0047') return True except Exception as e: - #self.logger.error('Extension registration is failed!(%s)\n' % (e.errno, e.strerror)) + self.logger.error('[MessageSender] Extension registration is failed!(%s)\n' % (e.errno, e.strerror)) return False