mirror of
https://github.com/Pardus-LiderAhenk/ahenk
synced 2024-11-25 13:32:22 +03:00
conflict merging
This commit is contained in:
commit
a282695c10
10 changed files with 110 additions and 32 deletions
|
@ -3,6 +3,11 @@
|
|||
# @author: İsmail BAŞARAN <ismail.basaran@tubitak.gov.tr> <basaran.ismaill@gmail.com>
|
||||
|
||||
class EventBase():
|
||||
|
||||
"""
|
||||
This is base event class for event management.
|
||||
"""
|
||||
|
||||
listeners = []
|
||||
|
||||
def __init__(self):
|
||||
|
@ -10,10 +15,22 @@ class EventBase():
|
|||
self.listener_events = []
|
||||
|
||||
def register_event(self, event_name, callback_func):
|
||||
"""
|
||||
Registers event listener.
|
||||
Args:
|
||||
event_name : name of event, user specify event name
|
||||
callback_func : when an event fire with specified event name this method will call
|
||||
"""
|
||||
self.listener_events.append({'event_name': event_name, 'callback_func': callback_func})
|
||||
|
||||
|
||||
class Event():
|
||||
"""
|
||||
This is event class. Takes two argument ;
|
||||
Args:
|
||||
event_name : name of event.
|
||||
callback_args : arguments specified by user. This function will transmit args to callback function directly.
|
||||
"""
|
||||
def __init__(self, event_name, *callback_args):
|
||||
for listener in EventBase.listeners:
|
||||
for listener_cls in listener.listener_events:
|
||||
|
|
|
@ -12,6 +12,7 @@ import subprocess
|
|||
from base.Scope import Scope
|
||||
from base.model.Policy import Policy
|
||||
from base.model.Task import Task
|
||||
from base.model.MessageType import MessageType
|
||||
|
||||
|
||||
class ExecutionManager(object):
|
||||
|
@ -28,12 +29,11 @@ class ExecutionManager(object):
|
|||
self.logger = scope.getLogger()
|
||||
self.db_service = scope.getDbService()
|
||||
|
||||
# TODO move this event names to enumeration
|
||||
self.event_manager.register_event('EXECUTE_SCRIPT', self.execute_script)
|
||||
self.event_manager.register_event('REQUEST_FILE', self.request_file)
|
||||
self.event_manager.register_event('MOVE_FILE', self.move_file)
|
||||
self.event_manager.register_event('EXECUTE_TASK', self.execute_task)
|
||||
self.event_manager.register_event('EXECUTE_POLICY', self.execute_policy)
|
||||
self.event_manager.register_event(MessageType.EXECUTE_SCRIPT, self.execute_script)
|
||||
self.event_manager.register_event(MessageType.REQUEST_FILE, self.request_file)
|
||||
self.event_manager.register_event(MessageType.MOVE_FILE, self.move_file)
|
||||
self.event_manager.register_event(MessageType.EXECUTE_TASK, self.execute_task)
|
||||
self.event_manager.register_event(MessageType.EXECUTE_POLICY, self.execute_policy)
|
||||
|
||||
def execute_policy(self, arg):
|
||||
self.logger.debug('[ExecutionManager] Updating policies...')
|
||||
|
|
|
@ -20,14 +20,14 @@ class MessageResponseQueue(threading.Thread):
|
|||
self.outQueue = outQueue
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
while True:
|
||||
# This item will send response to lider.
|
||||
# item must be response message. Response message may be generic message type
|
||||
responseMessage = self.outQueue.get(block=True)
|
||||
print(responseMessage)
|
||||
# Call message manager for response
|
||||
self.messageManager.send_direct_message(responseMessage)
|
||||
# self.outQueue.task_done()
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
# This item will send response to lider.
|
||||
# item must be response message. Response message may be generic message type
|
||||
responseMessage = self.outQueue.get(block=True)
|
||||
self.logger.debug('[MessageResponseQueue] Sending response message to lider. Response Message ' + str(responseMessage))
|
||||
# Call message manager for response
|
||||
self.messageManager.send_direct_message(responseMessage)
|
||||
# self.outQueue.task_done()
|
||||
except Exception as e:
|
||||
self.logger.error
|
||||
|
|
|
@ -12,3 +12,8 @@ class MessageType(Enum):
|
|||
LOGIN = 'LOGIN'
|
||||
LOGOUT = 'LOGOUT'
|
||||
POLICY_STATUS = 'POLICY_STATUS'
|
||||
EXECUTE_POLICY = 'EXECUTE_POLICY'
|
||||
EXECUTE_TASK = 'EXECUTE_TASK'
|
||||
MOVE_FILE = 'MOVE_FILE'
|
||||
REQUEST_FILE = 'REQUEST_FILE'
|
||||
EXECUTE_SCRIPT = 'EXECUTE_SCRIPT'
|
||||
|
|
10
opt/ahenk/base/model/PluginKillSignal.py
Normal file
10
opt/ahenk/base/model/PluginKillSignal.py
Normal file
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# Author: İsmail BAŞARAN <ismail.basaran@tubitak.gov.tr> <basaran.ismaill@gmail.com>
|
||||
|
||||
|
||||
class PluginKillSignal(object):
|
||||
|
||||
@property
|
||||
def obj_name(self):
|
||||
return "KILL_SIGNAL"
|
|
@ -48,5 +48,5 @@ class Policy(object):
|
|||
def to_json(self):
|
||||
return json.load(self.policy)
|
||||
|
||||
def obj_type(self):
|
||||
return "POLICY"
|
||||
def obj_name(self):
|
||||
return "PROFILE"
|
||||
|
|
|
@ -5,39 +5,67 @@ import threading
|
|||
|
||||
from base.Scope import Scope
|
||||
|
||||
class Context(object):
|
||||
def __init__(self):
|
||||
self.data = {}
|
||||
|
||||
def put(self,var_name,data):
|
||||
self.data[var_name] = data
|
||||
|
||||
def empty_data(self):
|
||||
self.data = {}
|
||||
|
||||
class Plugin(threading.Thread):
|
||||
"""docstring for Plugin"""
|
||||
"""
|
||||
This is a thread inherit class and have a queue.
|
||||
Plugin class responsible for processing TASK or USER PLUGIN PROFILE.
|
||||
"""
|
||||
|
||||
def __init__(self, name, InQueue):
|
||||
threading.Thread.__init__(self)
|
||||
self.name = name
|
||||
self.InQueue = InQueue
|
||||
scope = Scope.getInstance()
|
||||
self.pluginManager = scope.getPluginManager()
|
||||
self.logger = scope.getLogger()
|
||||
self.keep_run = True
|
||||
self.context = Context()
|
||||
|
||||
def run(self):
|
||||
while True:
|
||||
while self.keep_run:
|
||||
try:
|
||||
item_obj = self.InQueue.get(block=True)
|
||||
obj_name = item_obj.obj_name
|
||||
print(obj_name)
|
||||
if obj_name == "TASK":
|
||||
command = Scope.getInstance().getPluginManager().findCommand(self.getName(), item_obj.command_cls_id)
|
||||
command.handle_task(item_obj)
|
||||
command.handle_task(item_obj,self.context)
|
||||
# TODO create response message from context and item_obj. item_obj is task
|
||||
|
||||
|
||||
# Empty context for next use
|
||||
self.context.empty_data()
|
||||
|
||||
# TODO add result to response queue
|
||||
elif obj_name == "PROFILE":
|
||||
plugin = item_obj.plugin
|
||||
plugin_name = plugin.name
|
||||
profile_data = item_obj.profile_data
|
||||
policy_module = Scope.getInstance().getPluginManager().findPolicyModule(plugin_name)
|
||||
policy_module.handle_policy(profile_data)
|
||||
|
||||
policy_module.handle_policy(profile_data,self.context)
|
||||
# TODO create response message from context and item_obj. item_obj is profile
|
||||
|
||||
# Empty context for next use
|
||||
self.context.empty_data()
|
||||
|
||||
elif obj_name == "KILL_SIGNAL":
|
||||
self.keep_run = False
|
||||
self.logger.debug('[Plugin] Killing queue ! Plugin Name : ' + str(self.name))
|
||||
else:
|
||||
self.logger.warning("Not supported object type " + obj_name)
|
||||
self.logger.warning("[Plugin] Not supported object type " + obj_name)
|
||||
except Exception as e:
|
||||
# TODO error log here
|
||||
self.logger.error("Plugin running exception " + str(e))
|
||||
self.logger.error("[Plugin] Plugin running exception " + str(e))
|
||||
|
||||
def getName(self):
|
||||
return self.name
|
||||
|
|
|
@ -7,6 +7,7 @@ import os
|
|||
from base.Scope import Scope
|
||||
from base.plugin.Plugin import Plugin
|
||||
from base.plugin.PluginQueue import PluginQueue
|
||||
from base.model.PluginKillSignal import PluginKillSignal
|
||||
|
||||
|
||||
class PluginManager(object):
|
||||
|
@ -24,18 +25,24 @@ class PluginManager(object):
|
|||
|
||||
#TODO version?
|
||||
def loadPlugins(self):
|
||||
"""
|
||||
This method loads plugins
|
||||
"""
|
||||
self.logger.info('[PluginManager] Loading plugins...')
|
||||
self.plugins = []
|
||||
self.logger.debug('[PluginManager] Lookup for possible plugins...')
|
||||
possibleplugins = os.listdir(self.configManager.get("PLUGIN", "pluginFolderPath"))
|
||||
self.logger.debug('[PluginManager] Possible plugins.. ' + str(possibleplugins))
|
||||
for pname in possibleplugins:
|
||||
location = os.path.join(self.configManager.get("PLUGIN", "pluginFolderPath"), pname)
|
||||
if not os.path.isdir(location) or not self.configManager.get("PLUGIN", "mainModuleName") + ".py" in os.listdir(location):
|
||||
self.logger.debug('It is not a plugin location - - ')
|
||||
self.logger.debug('It is not a plugin location ! There is no main module - ' + str(location))
|
||||
continue
|
||||
try:
|
||||
self.loadSinglePlugin(pname)
|
||||
except Exception as e:
|
||||
# TODO error log
|
||||
pass
|
||||
self.logger.error('Exception occured when loading plugin ! Plugin name : ' + str(pname) + ' Exception : ' + str(e))
|
||||
self.logger.info('[PluginManager] Loaded plugins successfully.')
|
||||
|
||||
def loadSinglePlugin(self, pluginName):
|
||||
# TODO check already loaded plugin
|
||||
|
@ -63,8 +70,17 @@ class PluginManager(object):
|
|||
self.logger.error("[PluginManager] Exception occurred when processing task " + str(e))
|
||||
|
||||
def reloadPlugins(self):
|
||||
# Not implemented yet
|
||||
pass
|
||||
#TODO
|
||||
try:
|
||||
self.logger.info('[PluginManager] Reloading plugins... ')
|
||||
kill_sgnl = PluginKillSignal()
|
||||
for p_queue in self.pluginQueueDict:
|
||||
p_queue.put(kill_sgnl)
|
||||
self.plugins = []
|
||||
self.loadPlugins()
|
||||
self.logger.info('[PluginManager] Plugin reloaded successfully.')
|
||||
except Exception as e:
|
||||
self.logger.error('[PluginManager] Exception occurred when reloading plugins ' + str(e))
|
||||
|
||||
def findPolicyModule(self,plugin_name):
|
||||
location = os.path.join(self.configManager.get("PLUGIN", "pluginFolderPath"), plugin_name)
|
||||
|
@ -102,6 +118,7 @@ class PluginManager(object):
|
|||
|
||||
def reloadSinglePlugin(self, pluginName):
|
||||
# Not implemented yet
|
||||
|
||||
pass
|
||||
|
||||
def checkCommandExist(self, pluginName, commandId):
|
||||
|
|
|
@ -15,9 +15,10 @@ class MySamplePlugin(AbstractCommand):
|
|||
print("parameter map="+self.task.parameter_map)
|
||||
|
||||
|
||||
def handle_task(task):
|
||||
def handle_task(task,context):
|
||||
# Do what ever you want here
|
||||
# You can create command class but it is not necessary
|
||||
# You can use directly this method.
|
||||
context.put('my_data_name','my data')
|
||||
myPlugin = MySamplePlugin(task)
|
||||
myPlugin.handle_task()
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
# Author: İsmail BAŞARAN <ismail.basaran@tubitak.gov.tr> <basaran.ismaill@gmail.com>
|
||||
|
||||
|
||||
def handle_policy(profile_data):
|
||||
def handle_policy(profile_data,context):
|
||||
print("This is policy file - plugin 1")
|
||||
|
|
Loading…
Reference in a new issue