mirror of
https://github.com/Pardus-LiderAhenk/ahenk
synced 2024-12-23 18:02:17 +03:00
get active policies from db and process them
This commit is contained in:
parent
550cad1804
commit
75d818b6a1
8 changed files with 248 additions and 20 deletions
|
@ -92,7 +92,6 @@ class AhenkDbService(object):
|
|||
sql += orderby
|
||||
|
||||
self.cursor.execute(sql)
|
||||
|
||||
rows = self.cursor.fetchall()
|
||||
return rows
|
||||
except Exception as e:
|
||||
|
|
|
@ -11,6 +11,8 @@ import subprocess
|
|||
|
||||
from base.Scope import Scope
|
||||
from base.model.Policy import Policy
|
||||
from base.model.PolicyBean import PolicyBean
|
||||
from base.model.ProfileBean import ProfileBean
|
||||
from base.model.Task import Task
|
||||
from base.model.MessageType import MessageType
|
||||
|
||||
|
@ -29,7 +31,7 @@ class ExecutionManager(object):
|
|||
self.logger = scope.getLogger()
|
||||
self.db_service = scope.getDbService()
|
||||
|
||||
#TODO DEBUG
|
||||
# TODO DEBUG
|
||||
self.event_manager.register_event(str(MessageType.EXECUTE_SCRIPT), self.execute_script)
|
||||
self.event_manager.register_event(str(MessageType.REQUEST_FILE), self.request_file)
|
||||
self.event_manager.register_event(str(MessageType.MOVE_FILE), self.move_file)
|
||||
|
@ -41,7 +43,7 @@ class ExecutionManager(object):
|
|||
|
||||
policy = Policy(json.loads(arg))
|
||||
# TODO get username and machine uid
|
||||
username = 'lider'
|
||||
username = policy.username
|
||||
machine_uid = self.db_service.select_one_result('registration', 'jid', 'registered=1')
|
||||
|
||||
ahenk_policy_ver = self.db_service.select_one_result('policy', 'version', 'type = \'A\'')
|
||||
|
@ -90,7 +92,52 @@ class ExecutionManager(object):
|
|||
# TODO check plugins
|
||||
print("but first need these plugins:" + str(missing_plugins))
|
||||
|
||||
self.task_manager.addPolicy(policy)
|
||||
self.task_manager.addPolicy(self.get_active_policies(username))
|
||||
|
||||
def get_active_policies(self, username):
|
||||
|
||||
"""
|
||||
self.ahenk_policy_version = ahenk_policy_version
|
||||
self.user_policy_version = user_policy_version
|
||||
self.ahenk_profiles = ahenk_profiles
|
||||
self.user_profiles = user_profiles
|
||||
self.timestamp = timestamp
|
||||
self.username = username
|
||||
|
||||
|
||||
self.ahenk_execution_id = ahenk_execution_id
|
||||
self.user_execution_id = user_execution_id
|
||||
"""
|
||||
|
||||
user_policy = self.db_service.select('policy', ['id', 'version', 'name'], ' type=\'U\' and name=\'' + username + '\'')
|
||||
ahenk_policy = self.db_service.select('policy', ['id', 'version'], ' type=\'A\' ')
|
||||
|
||||
policy = PolicyBean(username=username)
|
||||
|
||||
if len(user_policy) > 0:
|
||||
user_policy_version = user_policy[0][0]
|
||||
policy.set_user_policy_version(user_policy_version)
|
||||
user_profiles = self.db_service.select('profile', ['id', 'create_date', 'label', 'description', 'overridable', 'active', 'deleted', 'profile_data', 'modify_date', 'plugin'], ' id=' + str(user_policy_version) + ' ')
|
||||
|
||||
arr_profiles = []
|
||||
if len(user_profiles) > 0:
|
||||
for profile in user_profiles:
|
||||
arr_profiles.append(ProfileBean(profile[0], profile[1], profile[2], profile[3], profile[4], profile[5], profile[6], profile[7], profile[8], profile[9]))
|
||||
policy.set_user_profiles(arr_profiles)
|
||||
|
||||
if len(ahenk_policy) > 0:
|
||||
ahenk_policy_version = ahenk_policy[0][0]
|
||||
policy.set_ahenk_policy_version(ahenk_policy_version)
|
||||
ahenk_profiles = self.db_service.select('profile', ['id', 'create_date', 'label', 'description', 'overridable', 'active', 'deleted', 'profile_data', 'modify_date', 'plugin'], ' id=' + str(ahenk_policy_version) + ' ')
|
||||
arr_profiles = []
|
||||
if len(ahenk_profiles) > 0:
|
||||
for profile in user_profiles:
|
||||
arr_profiles.append(ProfileBean(profile[0], profile[1], profile[2], profile[3], profile[4], profile[5], profile[6], profile[7], profile[8], profile[9]))
|
||||
policy.set_ahenk_profiles(arr_profiles)
|
||||
|
||||
print("")
|
||||
return policy
|
||||
|
||||
|
||||
def get_installed_plugins(self):
|
||||
plugins = self.db_service.select('plugin', ['name', 'version'])
|
||||
|
|
|
@ -30,7 +30,7 @@ class Policy(object):
|
|||
|
||||
@property
|
||||
def timestamp(self):
|
||||
self.request['timestamp']
|
||||
return self.policy['timestamp']
|
||||
|
||||
@property
|
||||
def user_profiles(self):
|
||||
|
@ -42,6 +42,11 @@ class Policy(object):
|
|||
except Exception as e:
|
||||
return None
|
||||
|
||||
@property
|
||||
def username(self):
|
||||
return self.policy['username']
|
||||
|
||||
# TODO result mesajı dönerken döndür
|
||||
@property
|
||||
def ahenk_execution_id(self):
|
||||
return self.policy['agentCommandExecutionId']
|
||||
|
@ -50,7 +55,6 @@ class Policy(object):
|
|||
def user_execution_id(self):
|
||||
return self.policy['userCommandExecutionId']
|
||||
|
||||
|
||||
def to_string(self):
|
||||
return str(self.policy)
|
||||
|
||||
|
|
63
opt/ahenk/base/model/PolicyBean.py
Normal file
63
opt/ahenk/base/model/PolicyBean.py
Normal file
|
@ -0,0 +1,63 @@
|
|||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# Author: Volkan Şahin <volkansah.in> <bm.volkansahin@gmail.com>
|
||||
|
||||
|
||||
class PolicyBean(object):
|
||||
"""docstring for PolicyBean"""
|
||||
|
||||
def __init__(self, ahenk_policy_version=None, user_policy_version=None, ahenk_profiles=None, user_profiles=None, timestamp=None, username=None, ahenk_execution_id=None, user_execution_id=None):
|
||||
|
||||
self.ahenk_policy_version = ahenk_policy_version
|
||||
self.user_policy_version = user_policy_version
|
||||
self.ahenk_profiles = ahenk_profiles
|
||||
self.user_profiles = user_profiles
|
||||
self.timestamp = timestamp
|
||||
self.username = username
|
||||
self.ahenk_execution_id = ahenk_execution_id
|
||||
self.user_execution_id = user_execution_id
|
||||
|
||||
def get_ahenk_policy_version(self):
|
||||
return self.ahenk_policy_version
|
||||
|
||||
def set_ahenk_policy_version(self, ahenk_policy_version):
|
||||
self.ahenk_policy_version = ahenk_policy_version
|
||||
|
||||
def get_user_policy_version(self):
|
||||
return self.user_policy_version
|
||||
|
||||
def set_user_policy_version(self, user_policy_version):
|
||||
self.user_policy_version = user_policy_version
|
||||
|
||||
def get_ahenk_profiles(self):
|
||||
return self.ahenk_profiles
|
||||
|
||||
def set_ahenk_profiles(self, ahenk_profiles):
|
||||
self.ahenk_profiles = ahenk_profiles
|
||||
|
||||
def get_user_profiles(self):
|
||||
return self.user_profiles
|
||||
|
||||
def set_user_profiles(self, user_profiles):
|
||||
self.user_profiles = user_profiles
|
||||
|
||||
def get_timestamp(self):
|
||||
return self.timestamp
|
||||
|
||||
def set_timestamp(self, timestamp):
|
||||
self.timestamp = timestamp
|
||||
|
||||
def get_username(self):
|
||||
return self.username
|
||||
|
||||
def set_username(self, username):
|
||||
self.username = username
|
||||
|
||||
def get_ahenk_execution_id(self):
|
||||
return self.ahenk_execution_id
|
||||
|
||||
def set_ahenk_execution_id(self, ahenk_execution_id):
|
||||
self.ahenk_execution_id = ahenk_execution_id
|
||||
|
||||
def set_user_execution_id(self, user_execution_id):
|
||||
self.user_execution_id = user_execution_id
|
|
@ -11,6 +11,7 @@ class Profile(object):
|
|||
|
||||
def __init__(self, message):
|
||||
self.profile = message
|
||||
self.username = None
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
|
@ -61,3 +62,9 @@ class Profile(object):
|
|||
@property
|
||||
def obj_name(self):
|
||||
return "PROFILE"
|
||||
|
||||
def get_username(self):
|
||||
return self.username
|
||||
|
||||
def set_username(self, username):
|
||||
self.username = username
|
||||
|
|
89
opt/ahenk/base/model/ProfileBean.py
Normal file
89
opt/ahenk/base/model/ProfileBean.py
Normal file
|
@ -0,0 +1,89 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# Author: Volkan Şahin <volkansah.in> <bm.volkansahin@gmail.com>
|
||||
import json
|
||||
|
||||
from base.model.Plugin import Plugin
|
||||
|
||||
|
||||
class ProfileBean(object):
|
||||
"""docstring for Profile"""
|
||||
|
||||
def __init__(self, p_id, create_date, label, description, overridable, active, deleted, profile_data, modify_date, plugin, username=None):
|
||||
self.id = p_id
|
||||
self.create_date = create_date
|
||||
self.modify_date = modify_date
|
||||
self.label = label
|
||||
self.description = description
|
||||
self.overridable = overridable
|
||||
self.active = active
|
||||
self.deleted = deleted
|
||||
self.profile_data = profile_data
|
||||
self.plugin = Plugin(plugin)
|
||||
self.username = username
|
||||
|
||||
def get_id(self):
|
||||
return self.id
|
||||
|
||||
def set_id(self, p_id):
|
||||
self.id = p_id
|
||||
|
||||
def get_create_date(self):
|
||||
return self.create_date
|
||||
|
||||
def set_create_date(self, create_date):
|
||||
self.create_date = create_date
|
||||
|
||||
def get_modify_dateself(self):
|
||||
return self.modify_date
|
||||
|
||||
def set_modify_date(self, modify_date):
|
||||
self.modify_date = modify_date
|
||||
|
||||
def get_label(self):
|
||||
return self.label
|
||||
|
||||
def set_label(self, label):
|
||||
self.label = label
|
||||
|
||||
def get_description(self):
|
||||
return self.modify_date
|
||||
|
||||
def set_description(self, description):
|
||||
self.description = description
|
||||
|
||||
def get_overridable(self):
|
||||
return self.overridable
|
||||
|
||||
def set_overridable(self, overridable):
|
||||
self.overridable = overridable
|
||||
|
||||
def get_active(self):
|
||||
return self.active
|
||||
|
||||
def set_active(self, active):
|
||||
self.active = active
|
||||
|
||||
def get_deleted(self):
|
||||
return self.deleted
|
||||
|
||||
def set_deleted(self, deleted):
|
||||
self.deleted = deleted
|
||||
|
||||
def get_profile_data(self):
|
||||
return self.profile_data
|
||||
|
||||
def set_profile_data(self, profile_data):
|
||||
self.profile_data = profile_data
|
||||
|
||||
def get_plugin(self):
|
||||
return self.plugin
|
||||
|
||||
def set_plugin(self, plugin):
|
||||
self.plugin = Plugin(plugin)
|
||||
|
||||
def get_username(self):
|
||||
return self.username
|
||||
|
||||
def set_username(self, username):
|
||||
self.username = username
|
|
@ -2,7 +2,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Author: İsmail BAŞARAN <ismail.basaran@tubitak.gov.tr> <basaran.ismaill@gmail.com>
|
||||
import threading
|
||||
|
||||
import subprocess
|
||||
from base.Scope import Scope
|
||||
from base.model.Response import Response
|
||||
from base.model.MessageType import MessageType
|
||||
|
@ -23,6 +23,9 @@ class Context(object):
|
|||
def empty_data(self):
|
||||
self.data = {}
|
||||
|
||||
def execute(self, command):
|
||||
return subprocess.call(command, shell=True)
|
||||
|
||||
|
||||
class Plugin(threading.Thread):
|
||||
"""
|
||||
|
@ -70,10 +73,12 @@ class Plugin(threading.Thread):
|
|||
profile_data = item_obj.profile_data
|
||||
policy_module = Scope.getInstance().getPluginManager().findPolicyModule(plugin_name)
|
||||
|
||||
self.context.put('username', item_obj.get_username())
|
||||
|
||||
policy_module.handle_policy(profile_data, self.context)
|
||||
|
||||
#TODO Message Code keep
|
||||
response = Response(type=MessageType.POLICY_STATUS, id=item_obj.id, code=MessageCode.POLICY_PROCESSED, message='__message__', data=self.context.get('data'), content_type=self.context.get('content_type'), execution_id='get_execution_id')
|
||||
response = Response(type=self.context.get('message_type'), id=item_obj.id, code=self.context.get('message_code'), message=self.context.get('message'), data=self.context.get('data'), content_type=self.context.get('content_type'), execution_id='get_execution_id')
|
||||
#self.response_queue.put(self.messaging.response_msg(response)) #TODO DEBUG
|
||||
Scope.getInstance().getMessager().send_direct_message(self.messaging.response_msg(response))#TODO REMOVE
|
||||
|
||||
|
|
|
@ -82,7 +82,7 @@ class PluginManager(object):
|
|||
except Exception as e:
|
||||
self.logger.error('[PluginManager] Exception occurred when reloading plugins ' + str(e))
|
||||
|
||||
def findPolicyModule(self,plugin_name):
|
||||
def findPolicyModule(self, plugin_name):
|
||||
location = os.path.join(self.configManager.get("PLUGIN", "pluginFolderPath"), plugin_name)
|
||||
if os.path.isdir(location) and "policy.py" in os.listdir(location):
|
||||
info = imp.find_module("policy", [location])
|
||||
|
@ -92,17 +92,30 @@ class PluginManager(object):
|
|||
return None
|
||||
|
||||
def processPolicy(self, policy):
|
||||
#TODO user and ahenk
|
||||
user_profiles = policy.ahenk_profiles
|
||||
for profile in user_profiles:
|
||||
try:
|
||||
plugin = profile.plugin
|
||||
plugin_name = plugin.name
|
||||
if plugin_name in self.pluginQueueDict:
|
||||
self.pluginQueueDict[plugin_name].put(profile, 1)
|
||||
except Exception as e:
|
||||
print("Exception occured..")
|
||||
self.logger.error("Policy profile not processed " + str(profile.plugin.name))
|
||||
#TODO do you need username in profile?
|
||||
|
||||
username = policy.username
|
||||
ahenk_profiles = policy.ahenk_profiles
|
||||
user_profiles = policy.user_profiles
|
||||
|
||||
if ahenk_profiles is not None:
|
||||
for profile in ahenk_profiles:
|
||||
self.process_profile(profile)
|
||||
|
||||
if user_profiles is not None:
|
||||
for profile in user_profiles:
|
||||
profile.set_username(username)
|
||||
self.process_profile(profile)
|
||||
|
||||
def process_profile(self, profile):
|
||||
try:
|
||||
plugin = profile.get_plugin()
|
||||
plugin_name = plugin.name
|
||||
if plugin_name in self.pluginQueueDict:
|
||||
self.pluginQueueDict[plugin_name].put(profile, 1)
|
||||
except Exception as e:
|
||||
print("Exception occured..")
|
||||
self.logger.error("Policy profile not processed " + str(profile.plugin.name))
|
||||
|
||||
def checkPluginExists(self, plugin_name, version=None):
|
||||
|
||||
|
@ -127,3 +140,4 @@ class PluginManager(object):
|
|||
|
||||
def printQueueSize(self):
|
||||
print("size " + str(len(self.pluginQueueDict)))
|
||||
|
||||
|
|
Loading…
Reference in a new issue