def run_command_from_fifo(self, num, stack): """ docstring""" while True: try: event = Commander().get_event() if event is None: break json_data = json.loads(event) self.logger.info(event) except Exception as e: self.logger.error( 'A problem occurred while loading json. Check json format! Error Message: {0}.' ' Event = {1}'.format(str(e), str(event))) return if json_data is not None: self.logger.debug('Signal handled') self.logger.debug('Signal is :{0}'.format( str(json_data['event']))) if str(json_data['event'] ) == 'login' and self.check_last_login(): username = json_data['username'] if username != "Debian-gdm" and username != "gdm": display = json_data['display'] desktop = json_data['desktop'] ip = None if 'ip' in json_data: ip = json_data['ip'] domain = None if 'domain' in json_data: domain = json_data['domain'] self.logger.info( 'login event is handled for user: {0}'.format( username)) self.logger.info( 'login parameters of login user, username: {0}, display: {1}, desktop: {2}, domain: {3}' .format(username, display, desktop, domain)) Util.execute("systemctl restart sssd.service") login_message = self.message_manager.login_msg( username, ip) self.messenger.send_direct_message(login_message) agreement = Agreement() agreement_choice = None if agreement.check_agreement( username ) is not True and System.Ahenk.agreement() == '1': self.logger.debug( 'User {0} has not accepted agreement.'.format( username)) thread_ask = Process(target=agreement.ask, args=( username, display, )) thread_ask.start() agreement_timeout = self.conf_manager.get( 'SESSION', 'agreement_timeout') timeout = int(agreement_timeout) # sec timer = time.time() while 1: if thread_ask.is_alive() is False: self.logger.warning( '{0} was answered the question '. format(username)) if Agreement().check_agreement( username) is True: self.logger.warning( 'Choice of {0} is YES'.format( username)) agreement_choice = True break elif Agreement().check_agreement( username) is False: self.logger.warning( 'Choice of {0} is NO'.format( username)) agreement_choice = False Util.close_session(username) break if (time.time() - timer) > timeout: if thread_ask.is_alive(): thread_ask.terminate() Util.close_session(username) self.logger.warning( 'Session of {0} was ended because of timeout of contract agreement' .format(username)) break time.sleep(1) if agreement_choice is not None: self.messenger.send_direct_message( self.message_manager.agreement_answer_msg( username, agreement_choice)) else: agreement_choice = True if agreement_choice is True or System.Ahenk.agreement( ) != '1': self.db_service.delete('session', '1=1') self.logger.info( 'Display is {0}, desktop env is {1} for {2}'. format(display, desktop, username)) session_columns = self.db_service.get_cols( 'session') # ['username', 'display', 'desktop', 'timestamp', 'ip', 'domain'] self.db_service.update( 'session', session_columns, [ username, display, desktop, str(int(time.time())), ip, domain ]) # Default policy for users --->> START self.logger.info( "Applying default policies for user {0}". format(Util.get_username())) self.default_policy.default_firefox_policy( Util.get_username()) self.default_policy.disable_update_package_notify( Util.get_username()) self.default_policy.create_pulseaudio_autostart() # Default policy for users --->> STOP get_policy_message = self.message_manager.policy_request_msg( username) self.plugin_manager.process_mode('safe', username) self.plugin_manager.process_mode('login', username) kward = dict() kward['timeout_args'] = username kward['checker_args'] = username SetupTimer.start( Timer( timeout=System.Ahenk.get_policy_timeout(), timeout_function=self.execute_manager. execute_default_policy, checker_func=self.execute_manager. is_policy_executed, kwargs=kward)) self.logger.info( 'Requesting updated policies from Lider. If Ahenk could not reach updated ' 'policies in {0} sec, booked policies will be executed' .format(System.Ahenk.get_policy_timeout())) self.messenger.send_direct_message( get_policy_message) elif str(json_data['event']) == 'logout': username = json_data['username'] if username != "Debian-gdm" and username != "gdm": self.execute_manager.remove_user_executed_policy_dict( username) self.plugin_manager.process_mode('logout', username) self.plugin_manager.process_mode('safe', username) if username != "Debian-gdm": self.db_service.delete('session', '1=1') # TODO delete all user records while initializing self.logger.info( 'logout event is handled for user: {0}'.format( username)) ip = None if 'ip' in json_data: ip = json_data['ip'] logout_message = self.message_manager.logout_msg( username, ip) self.messenger.send_direct_message(logout_message) self.logger.info('Ahenk polkit file deleting..') self.delete_polkit_user() # self.db_service.delete('session', 'username=\'{0}\''.format(username)) elif str(json_data['event']) == 'send': self.logger.info( 'Sending message over ahenkd command. Response Message: {0}' .format(json.dumps(json_data['message']))) message = json.dumps(json_data['message']) self.messenger.send_direct_message(message) elif str(json_data['event']) == 'unregister' and len( json_data) == 1: self.logger.info('Unregistering..') self.execute_manager.set_unregister_credential_params( None, None) unregister_message = self.message_manager.unregister_msg( None, None) if unregister_message is not None: self.messenger.send_direct_message(unregister_message) elif str(json_data['event']) == 'unregister' and len( json_data) == 3: self.logger.info('Unregistering..') usernameForCheck = json_data['userName'] passwordForCheck = json_data['password'] ## send user credential info to execution manager for hide user notify when remote unregister self.execute_manager.set_unregister_credential_params( usernameForCheck, usernameForCheck) self.logger.info('Unregistering by username+' + str(usernameForCheck)) unregister_message = self.message_manager.unregister_msg( usernameForCheck, passwordForCheck) if unregister_message is not None: self.messenger.send_direct_message(unregister_message) elif str(json_data['event']) == 'load': plugin_name = str(json_data['plugins']) if plugin_name == 'all': self.logger.debug('All plugins are loading to ahenk') self.plugin_manager.load_plugins() else: for p_name in plugin_name.split(','): self.logger.debug( '{0} plugin is loading to ahenk'.format( p_name)) self.plugin_manager.load_single_plugin(p_name) elif str(json_data['event']) == 'reload': plugin_name = str(json_data['plugins']) if plugin_name == 'all': self.logger.debug('All plugins are reloading to ahenk') self.plugin_manager.reload_plugins() else: for p_name in plugin_name.split(','): self.logger.debug( '{0} plugin is reloading to ahenk'.format( p_name)) self.plugin_manager.reload_single_plugin(p_name) elif str(json_data['event']) == 'remove': plugin_name = str(json_data['plugins']) if plugin_name == 'all': self.logger.debug( 'All plugins are removing from ahenk') self.plugin_manager.remove_plugins() else: for p_name in plugin_name.split(','): self.logger.debug( '{0} plugin is removing from ahenk'.format( p_name)) self.plugin_manager.remove_single_plugin(p_name) elif str(json_data['event']) == 'stop': self.plugin_manager.process_mode('shutdown') self.logger.info('Shutdown mode activated.') # TODO timeout while self.running_plugin() is False: self.logger.debug('Waiting for progress of plugins...') time.sleep(0.5) Util.delete_file(System.Ahenk.fifo_file()) Scope().get_instance().get_custom_param( 'ahenk_daemon').stop() else: self.logger.error('Unknown command error. Command:' + json_data['event']) self.logger.debug('Processing of handled event is completed')
def run(self): while self.keep_run: try: try: item_obj = self.in_queue.get(block=True) obj_name = item_obj.obj_name except Exception as e: self.logger.error( '[Plugin] A problem occurred while executing process. Error Message: {0}' .format(str(e))) if obj_name == "TASK": self.logger.debug('[Plugin] Executing task') self.context.put('task_id', item_obj.get_id()) if item_obj.get_file_server( ) is not None and item_obj.get_file_server() != 'null': self.context.put( 'protocol', json.loads(item_obj.get_file_server())['protocol']) self.context.put( 'parameterMap', json.loads( item_obj.get_file_server())['parameterMap']) if type(item_obj.get_parameter_map()) == str: task_data = json.loads(item_obj.get_parameter_map()) elif type(item_obj.get_parameter_map()) == dict: task_data = item_obj.get_parameter_map() # check if mail send is actve or not and set mail params to context object.. plugins get mail params via context object self.context.set_mail_send( task_data['mailSend'] if 'mailSend' in task_data else False) self.context.set_mail_subject( task_data['mailSubject'] if 'mailSubject' in task_data else '') self.context.set_mail_content( task_data['mailContent'] if 'mailContent' in task_data else '') self.logger.debug( '[Plugin] Sending notify to user about task process') if System.Sessions.user_name() is not None and len( System.Sessions.user_name( )) > 0 and self.is_user_notify_active == 1: for user in System.Sessions.user_name(): Util.send_notify( "Lider Ahenk", "{0} eklentisi şu anda bir görev çalıştırıyor." .format(self.getName()), System.Sessions.display(user), user) self.context.put('taskData', task_data) self.context.put('taskId', item_obj.get_id()) self.logger.debug('[Plugin] Handling task') Scope.get_instance().get_plugin_manager().find_command( self.getName(), item_obj.get_plugin().get_version(), item_obj.get_command_cls_id().lower()).handle_task( ast.literal_eval(str(task_data)), self.context) if self.context.data is not None and self.context.get( 'responseCode') is not None: self.logger.debug('[Plugin] Creating response') response = Response( type=MessageType.TASK_STATUS.value, id=item_obj.get_id(), code=self.context.get('responseCode'), message=self.context.get('responseMessage'), data=self.context.get('responseData'), content_type=self.context.get('contentType')) if response.get_data() and response.get_content_type( ) != ContentType.APPLICATION_JSON.value: success = False try: file_manager = FileTransferManager( json.loads(item_obj.get_file_server()) ['protocol'], json.loads(item_obj.get_file_server()) ['parameterMap']) file_manager.transporter.connect() md5 = str( json.loads(response.get_data())['md5']) success = file_manager.transporter.send_file( System.Ahenk.received_dir_path() + md5, md5) file_manager.transporter.disconnect() except Exception as e: self.logger.error( '[Plugin] A problem occurred while file transferring. Error Message :{0}' .format(str(e))) self.logger.debug('[Plugin] Sending response') message = self.messaging.task_status_msg(response) if success is False: response = Response( type=MessageType.TASK_STATUS.value, id=item_obj.get_id(), code=MessageCode.TASK_ERROR.value, message= 'Task processed successfully but file transfer not completed. Check defined server conf' ) message = self.messaging.task_status_msg( response) Scope.get_instance().get_messenger( ).send_direct_message(message) else: self.logger.debug('[Plugin] Sending task response') Scope.get_instance().get_messenger( ).send_direct_message( self.messaging.task_status_msg(response)) else: self.logger.error( '[Plugin] There is no Response. Plugin must create response after run a task!' ) elif obj_name == "PROFILE": self.logger.debug('[Plugin] Executing profile') profile_data = item_obj.get_profile_data() self.context.put('username', item_obj.get_username()) json_profile_data = json.loads(profile_data) self.context.set_mail_send( json_profile_data['mailSend'] if 'mailSend' in json_profile_data else False) self.context.set_mail_subject( json_profile_data['mailSubject'] if 'mailSubject' in json_profile_data else '') self.context.set_mail_content( json_profile_data['mailContent'] if 'mailContent' in json_profile_data else '') execution_id = self.get_execution_id(item_obj.get_id()) policy_ver = self.get_policy_version(item_obj.get_id()) self.context.put('policy_version', policy_ver) self.context.put('execution_id', execution_id) # if item_obj.get_file_server() is not None and item_obj.get_file_server() !='null': # self.context.put('protocol', json.loads(item_obj.get_file_server())['protocol']) # self.context.put('parameterMap', json.loads(item_obj.get_file_server())['parameterMap']) self.logger.debug( '[Plugin] Sending notify to user about profile process' ) # Util.send_notify("Lider Ahenk", # "{0} eklentisi şu anda bir profil çalıştırıyor.".format(self.getName()), # System.Sessions.display(item_obj.get_username()), # item_obj.get_username()) display = System.Sessions.display(item_obj.get_username()) if Util.get_desktop_env() == "gnome": display = Util.get_username_display_gnome( Util.get_username()) if self.is_user_notify_active == 1: Util.send_notify( "Lider Ahenk", "{0} eklentisi şu anda bir profil çalıştırıyor.". format(self.getName()), display, Util.get_as_user()) self.logger.debug('[Plugin] Handling profile') Scope.get_instance().get_plugin_manager( ).find_policy_module( item_obj.get_plugin().get_name()).handle_policy( profile_data, self.context) if self.context.data is not None and self.context.get( 'responseCode') is not None: self.logger.debug('[Plugin] Creating response') response = Response( type=MessageType.POLICY_STATUS.value, id=item_obj.get_id(), code=self.context.get('responseCode'), message=self.context.get('responseMessage'), data=self.context.get('responseData'), content_type=self.context.get('contentType'), execution_id=execution_id, policy_version=policy_ver) if response.get_data() and response.get_content_type( ) != ContentType.APPLICATION_JSON.value: success = False try: file_manager = FileTransferManager( json.loads(item_obj.get_file_server()) ['protocol'], json.loads(item_obj.get_file_server()) ['parameterMap']) file_manager.transporter.connect() md5 = str( json.loads(response.get_data())['md5']) success = file_manager.transporter.send_file( System.Ahenk.received_dir_path() + md5, md5) file_manager.transporter.disconnect() except Exception as e: self.logger.error( '[Plugin] A problem occurred while file transferring. Error Message :{0}' .format(str(e))) self.logger.debug('[Plugin] Sending response') message = self.messaging.task_status_msg(response) if success is False: response = Response( type=MessageType.POLICY_STATUS.value, id=item_obj.get_id(), code=MessageCode.POLICY_ERROR.value, message= 'Policy processed successfully but file transfer not completed. Check defined server conf' ) message = self.messaging.task_status_msg( response) Scope.get_instance().get_messenger( ).send_direct_message(message) else: self.logger.debug( '[Plugin] Sending profile response') Scope.get_instance().get_messenger( ).send_direct_message( self.messaging.policy_status_msg(response)) else: self.logger.error( '[Plugin] There is no Response. Plugin must create response after run a policy!' ) elif 'MODE' in obj_name: module = Scope.get_instance().get_plugin_manager( ).find_module(obj_name, self.name) if module is not None: if item_obj.obj_name in ('LOGIN_MODE', 'LOGOUT_MODE', 'SAFE_MODE'): self.context.put('username', item_obj.username) try: self.logger.debug( '[Plugin] {0} is running on {1} plugin'.format( str(item_obj.obj_name), str(self.name))) module.handle_mode(self.context) except Exception as e: self.logger.error( '[Plugin] A problem occurred while running {0} on {1} plugin. Error Message: {2}' .format(str(obj_name), str(self.name), str(e))) if item_obj.obj_name is 'SHUTDOWN_MODE': self.logger.debug( '[Plugin] {0} plugin is stopping...'.format( str(self.name))) self.keep_run = False else: self.logger.warning( "[Plugin] Not supported object type: {0}".format( str(obj_name))) self.context.empty_data() except Exception as e: self.logger.error( "[Plugin] Plugin running exception. Exception Message: {0} " .format(str(e)))