diff --git a/bin/linspector b/bin/linspector index 20629bf..c1788b4 100755 --- a/bin/linspector +++ b/bin/linspector @@ -134,9 +134,7 @@ def main(): job = Job(service, host, hostgroup.get_members(), - hostgroup.get_processors(), core, - linConf.get_task_list(), hostgroup) scheduler_job = period.createJob(scheduler, job, handle_job, start_date=new_start_date) if scheduler_job is not None: diff --git a/examples/dev.json b/examples/dev.json index 73a1788..bfcd132 100644 --- a/examples/dev.json +++ b/examples/dev.json @@ -8,7 +8,7 @@ "type": "error", "args": { "host": "localhost", "port": 25, - "from": "linspector@linspector.org", + "sender": "linspector@linspector.org", "username": "", "password": "", "rcpt": "hanez@linspector.org" @@ -18,14 +18,15 @@ "class": "mail", "type": "warning", "args": { "host": "localhost", - "from": "linspector@linspector.org", + "sender": "linspector@linspector.org", "rcpt": "warning@linspector.org" } }, { "class": "mail", "type": "ok", - "args": { "rcpt": "warning@linspector.org" } + "args": { "sender": "linspector@linspector.org", + "rcpt": "warning@linspector.org" } } ] }, @@ -55,6 +56,30 @@ "periods": ["fast"], "threshold": 1, "args": { "sleep": 1, "fail": 1 } + }, + { + "class": "etc/dummy", + "periods": ["fast"], + "threshold": 1, + "args": { "sleep": 10, "fail": 0 } + } + ] + }, + "b":{ + "members": ["root", "hannes"], + "hosts": [ "b"], + "services":[ + { + "class": "etc/dummy", + "periods": ["fast"], + "threshold": 1, + "args": { "sleep": 1, "fail": 1 } + }, + { + "class": "etc/dummy", + "periods": ["fast"], + "threshold": 1, + "args": { "sleep": 10, "fail": 0 } } ] } @@ -63,6 +88,10 @@ "main":{ "hostgroups": [ "a" ], "enabled": true + }, + "gooo":{ + "hostgroups": [ "b" ], + "enabled": true } }, "core":{ diff --git a/linspector/config/config.py b/linspector/config/config.py index b802781..d6b36e8 100644 --- a/linspector/config/config.py +++ b/linspector/config/config.py @@ -1,7 +1,7 @@ """ The LinspectorConfig class. -Copyright (c) 2011-2013 "Johannes Findeisen and Rafael Timmerberg" +Copyright (c) 2011-2013 by Johannes Findeisen and Rafael Timmerberg This file is part of Linspector (http://linspector.org). @@ -30,7 +30,6 @@ class LinspectorConfig(object): self._hostgroups = None self._members = None self._periods = None - self._tasks = None def set_hostgroups(self, hostgroups): self._hostgroups = hostgroups @@ -75,10 +74,4 @@ class LinspectorConfig(object): return self._get_by_name(self.get_members(), name) def get_period_by_name(self, name): - return self._get_by_name(self.get_periods(), name) - - def set_task_list(self, taskList): - self.taskList = taskList - - def get_task_list(self): - return self.taskList \ No newline at end of file + return self._get_by_name(self.get_periods(), name) \ No newline at end of file diff --git a/linspector/config/hostgroups.py b/linspector/config/hostgroups.py index 3c937ee..d36d142 100644 --- a/linspector/config/hostgroups.py +++ b/linspector/config/hostgroups.py @@ -116,37 +116,4 @@ class HostGroup(object): return self.name def get_members(self): - return self.members - - -class HostGroupService: - def __init__(self, services, periods): - self.services = services - self.periods = periods - - def __str__(self): - return "HostgroupService { " + str([str(s) for s in self.services]) + ", " + str([p.name for p in self.periods]) + "}" - - -def parseHostGroupList(hostgroups, hosts, members, periods, services): - parsedHostGroups = [] - for hgname, hgValues in hostgroups.items(): - hostGroup = HostGroup(hgname) - hostGroup.members = [m for m in members if m.nameid in hgValues['members']] - hostGroup.hosts = [h for h in hosts if h.name in hgValues['hosts']] - hostGroup.threshold = hgValues['threshold'] - if 'parent' in hgValues: - hostGroup.parent = hgValues['parent'] - hostGroup.services = [] - for serviceName, servicePeriods in hgValues['services'].items(): - services = [] - for host in hosts: - service = host.getHostServiceByName(serviceName) - if service is not None: - services.append(service) - else: - logger.warning("could not find HostService(" + str(serviceName) + ") for host " + host.name) - hostGroupPeriods = [p for p in periods if p.name in servicePeriods] - hostGroup.services.append(HostGroupService(services, hostGroupPeriods)) - parsedHostGroups.append(hostGroup) - return parsedHostGroups \ No newline at end of file + return self.members \ No newline at end of file diff --git a/linspector/config/layouts.py b/linspector/config/layouts.py index 789425f..7a10e5f 100644 --- a/linspector/config/layouts.py +++ b/linspector/config/layouts.py @@ -61,40 +61,4 @@ class Layout(object): ret = "Layout: 'Name:" + str(self.name) + "', 'Enabled: " + str(self.enabled) + " " for group in self.hostgroups: ret += str(group) - return ret - - -class LayoutList: - def __init__(self, layouts, hostgroups): - self.layouts = [] - self.dict = layouts - self.plugins = [] - for k, v in layouts.items(): - if k in ("plugins", "Plugins"): - self.plugins = v - continue - else: - l = Layout(k) - for k1, v1 in v.items(): - if k1 in ("enabled", "Enabled"): - l.enabled = v1 - elif k1 in ("hostgroups", "Hostgroups"): - l.hostgroups = [] - for group in v1: - h = None - for hostg in hostgroups: - if hostg.name == group: - h = hostg - break - if h is not None: - l.hostgroups.append(h) - else: - pass - self.layouts.append(l) - - def __str__(self): - ret = "" - ret += "Plugins: " + str(self.plugins) + "\n" - for layout in self.layouts: - ret += str(layout) + "\n" return ret \ No newline at end of file diff --git a/linspector/config/members.py b/linspector/config/members.py index 031e0d0..27c3d9a 100644 --- a/linspector/config/members.py +++ b/linspector/config/members.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2011-2013 "Johannes Findeisen and Rafael Timmerberg" +Copyright (c) 2011-2013 by Johannes Findeisen and Rafael Timmerberg This file is part of Linspector (http://linspector.org). @@ -24,58 +24,42 @@ from logging import getLogger logger = getLogger(__name__) +class MemberException(Exception): + def __init__(self, msg): + self.msg = msg + + def __str__(self): + return repr(self.msg) + + +class MemberMissingArgumentException(MemberException): + def __init__(self, missingArgument, memberName): + super(MemberMissingArgumentException, self).__init__("no " + missingArgument + " defined for member " + memberName) + + class Member: - def __init__(self, id, name="", comment="", tasks=None): - self.id = id + def __init__(self, name="", **kwargs): self.name = name - self.tasks = [] - self.add_task(tasks) - self.comment = comment + tmp = "tasks" + self.__tasks = [] + if not tmp in kwargs: + raise MemberMissingArgumentException(tmp, name) + self.add_tasks(kwargs[tmp]) - def get_id(self): - return self.id - - def add_task(self, task): - if task is None: - return - if isinstance(task, list): - self.tasks.extend(task) + def __add_internal(self, l, item): + if isinstance(item, list): + l.extend(item) else: - self.tasks.append(task) + l.append(item) + + def add_tasks(self, tasks): + self.__add_internal(self.get_tasks(), tasks) def get_tasks(self): - return self.tasks + return self.__tasks def __str__(self): ret = "Member Id: " + self.nameid + " Name: " + self.name + " Filters: " + str(self.phone) for f in self.filters: ret += str(f) - return ret - - -class MemberFilter: - def __init__(self, filter, Value): - self.filter = filter - self.value = Value - - def __str__(self): - return "Filter:" + str(self.filter) + " Value:" + self.value - - -def parseMemberList(members, filters): - parsedMembers = [Member(nameid, **values) for nameid, values in members.items()] - for member in parsedMembers: - mFilter = [] - for filtername, replacement in member.filters.items(): - found = False - for filt in filters: - if filt.name != filtername: - continue - found = True - memberFilter = filt.clone() - memberFilter.command = re.sub('@member', replacement, filt.command) - mFilter.append(memberFilter) - if not found: - logger.warning("filter: " + filtername + " is not defined in member " + member.name) - member.filters = mFilter - return parsedMembers \ No newline at end of file + return ret \ No newline at end of file diff --git a/linspector/config/parser.py b/linspector/config/parser.py index 53d9046..d6caf89 100644 --- a/linspector/config/parser.py +++ b/linspector/config/parser.py @@ -30,7 +30,7 @@ from config import LinspectorConfig from periods import CronPeriod, DatePeriod, IntervalPeriod from linspector.services.service import Service -from linspector.tasks.task import TaskList +from linspector.tasks.task import Task MOD_SERVICES = "services" MOD_TASKS = "tasks" @@ -40,7 +40,6 @@ KEY_HOSTGROUPS = "hostgroups" KEY_MEMBERS = "members" KEY_PERIODS = "periods" KEY_CORE = "core" -KEY_TASKS = "tasks" logger = getLogger(__name__) @@ -66,7 +65,7 @@ class ConfigParser: self._loadedMods = {MOD_SERVICES: {}, MOD_TASKS: {}} def _create_new_config_dict(self): - return {"members": {}, "periods": {}, "hostgroups": {}, "layouts": {}, "core": {}, "tasks": {}} + return {"members": {}, "periods": {}, "hostgroups": {}, "layouts": {}, "core": {}} def create_config(self, config): configDict = self._create_new_config_dict() @@ -231,59 +230,52 @@ class FullConfigParser(ConfigParser): #1. creator = lambda name, values: Layout(name, **values) - layouts = self._create_raw_Object(self.dict[KEY_LAYOUTS], "Layout", creator) + self.layouts = self._create_raw_Object(self.dict[KEY_LAYOUTS], "Layout", creator) + #TODO: self.members is empty after this!!!!!! BUG!!! creator = lambda name, values: Member(name, **values) - members = self._create_raw_Object(self.dict[KEY_MEMBERS], "Member", creator) + self.members = self._create_raw_Object(self.dict[KEY_MEMBERS], "Member", creator) creator = lambda name, values: HostGroup(name, **values) self.hostgroups = self._create_raw_Object(self.dict[KEY_HOSTGROUPS], "Hostgroup", creator) creator = parsePeriodList - periods = self._create_raw_Object(self.dict[KEY_PERIODS], "Period", creator) - - #1.1 get Tasks - creator = lambda name, values: self._load_module(name, MOD_TASKS).create(values).set_task_type(name) - tasks = self._create_raw_Object(self.dict[KEY_TASKS], "Task", creator) - taskList = TaskList(tasks) - + self.periods = self._create_raw_Object(self.dict[KEY_PERIODS], "Period", creator) #2. import and replace items_func = lambda hostgroup: hostgroup.get_services() class_check = lambda service: isinstance(service, Service) self.replace_with_import(self.hostgroups, MOD_SERVICES, items_func, class_check) - - #items_func = lambda member: member.get_tasks() - #class_check = lambda task: isinstance(task, Task) - #self.replace_with_import(members, MOD_TASKS, items_func, class_check) - services = [] for hg in self.hostgroups: services.extend(hg.get_services()) + items_func = lambda member: member.get_tasks() + class_check = lambda task: isinstance(task, Task) + self.replace_with_import(self.members, MOD_TASKS, items_func, class_check) + tasks = [] + for m in self.members: + tasks.extend(m.get_tasks()) + #replace object pointer id_list_func = lambda hostgroup: hostgroup.get_members() - id_get_func = lambda member: member.get_id() - self.replace_pointer(self.hostgroups, members, id_list_func, id_get_func) + id_get_func = lambda member: member.get_name() + self.replace_pointer(self.hostgroups, self.members, id_list_func, id_get_func) id_list_func = lambda service: service.get_periods() id_get_func = lambda period: period.get_name() - self.replace_pointer(services, periods, id_list_func, id_get_func) + self.replace_pointer(services, self.periods, id_list_func, id_get_func) id_list_func = lambda layout: layout.get_hostgroups() id_get_func = lambda hostgroup: hostgroup.get_name() - self.replace_pointer(layouts, self.hostgroups, id_list_func, id_get_func) + self.replace_pointer(self.layouts, self.hostgroups, id_list_func, id_get_func) linConf = LinspectorConfig() - linConf.set_layouts(layouts) + linConf.set_layouts(self.layouts) linConf.set_hostgroups(self.hostgroups) - linConf.set_members(members) - linConf.set_periods(periods) - linConf.set_task_list(taskList) + linConf.set_members(self.members) + linConf.set_periods(self.periods) - for hg in self.hostgroups: - for service in hg.get_services(): - service.set_hostgroup(hg) core = None if "core" in self.dict: core = self.dict["core"] diff --git a/linspector/config/periods.py b/linspector/config/periods.py index 815c228..c25d46d 100644 --- a/linspector/config/periods.py +++ b/linspector/config/periods.py @@ -30,8 +30,8 @@ class Period(object): def get_name(self): return self.name - def createJob(self, scheduler, jobInfo, func): - pass + #def createJob(self, scheduler, jobInfo, func): + # pass class IntervalPeriod(Period): diff --git a/linspector/core/job.py b/linspector/core/job.py index bace806..0ca4eb5 100644 --- a/linspector/core/job.py +++ b/linspector/core/job.py @@ -28,13 +28,11 @@ logger = getLogger(__name__) class Job: - def __init__(self, service, host, members, processors, core, task_list, hostgroup): + def __init__(self, service, host, members, core, hostgroup): self.service = service self.host = host self.members = members - self.processors = processors self.core = core - self.task_list = task_list self.hostgroup = hostgroup self.job_infos = [] self.job_index = -1 @@ -113,7 +111,10 @@ class Job: def handle_alarm(self): for member in self.members: - self.task_list.execute_task_infos(self.status + " " + self.get_message(), member.get_tasks()) + for task in member.get_tasks(): + task.execute(str(self.get_message())) + #print task + logger.info("DO TASK EXECUTION HERE! NOT IMPLEMENTED!") def handle_call(self): logger.debug("handle call") diff --git a/linspector/services/etc/dummy.py b/linspector/services/etc/dummy.py index 3b15f6d..d733b5b 100644 --- a/linspector/services/etc/dummy.py +++ b/linspector/services/etc/dummy.py @@ -63,8 +63,8 @@ class DummyService(Service): if "fail" in args: self.fail = args["fail"] - def needs_arguments(self): - return False + #def needs_arguments(self): + # return False def execute(self, job): diff --git a/linspector/services/service.py b/linspector/services/service.py index cdac1d8..cd0536a 100644 --- a/linspector/services/service.py +++ b/linspector/services/service.py @@ -19,7 +19,6 @@ along with this program. If not, see . from logging import getLogger -KEY_PARSER = "parser" KEY_COMMENT = "comment" KEY_THRESHOLD = "threshold" KEY_FAILS = "fails" @@ -37,10 +36,6 @@ class Service(object): self.add_arguments(kwargs[KEY_ARGS]) elif self.needs_arguments(): raise Exception("Error: needs arguments but none provided!") - - self._parser = [] - if KEY_PARSER in kwargs: - self.add_parser(kwargs[KEY_PARSER]) self._comment = None if KEY_COMMENT in kwargs: @@ -61,8 +56,9 @@ class Service(object): def __str__(self): return self.get_name() + " " + repr(self._args) - def get_type(self): - return str(self.__class__) + #TODO: not used somewhere + #def get_service_type(self): + # return str(self.__class__) def get_name(self): return self.__class__.__name__ @@ -70,10 +66,11 @@ class Service(object): def add_arguments(self, args): for key, val in args.items(): self._args[key] = val - - def add_argument(self, key, value): - self._args[key] = value - + + #TODO: not used somewhere + #def add_argument(self, key, value): + # self._args[key] = value + def get_arguments(self): return self._args @@ -136,9 +133,6 @@ class Service(object): self._threshold -= 1 raise e - ##def execute(self): - # pass - def pre_execute(self, job): pass diff --git a/linspector/tasks/mail.py b/linspector/tasks/mail.py index 376b308..e9632d1 100644 --- a/linspector/tasks/mail.py +++ b/linspector/tasks/mail.py @@ -35,40 +35,44 @@ logger = getLogger(__name__) class MailTask(Task): def __init__(self, **kwargs): - mandatory_args = ["host", "password", "from", "username"] - for arg in mandatory_args: - if not arg in kwargs: - self.raise_config_exception(kwargs, arg) - self.host = kwargs["host"] - self.password = kwargs["password"] - self.fromName = kwargs["from"] - self.userName = kwargs["username"] + super(MailTask, self).__init__(**kwargs) + + args = self.get_arguments() + + if "sender" in args: + self.sender = args["sender"] + else: + raise Exception("There is no sender set") + + if "rcpt" in args: + self.rcpt = args["rcpt"] + else: + raise Exception("There is no rcpt set") + + self.host = "localhost" + if "host" in args: + self.host = args["host"] + self.port = 25 - if "port" in kwargs: - self.port = kwargs["port"] + if "port" in args: + self.port = args["port"] - #self.set_task_type(kwargs["type"]) - #self.recipient = kwargs["args"]["rcpt"] - - def execute(self, msg, taskArgs): - #time.sleep(3) - if "rcpt" not in taskArgs: - logger.debug("Could not execute Mail Task! No recipient given!") - raise "Could not execute Mail Task! No recipient given!" + # ...and so on for all possible args + def execute(self, msg): logger.debug("Eecuting Task!") message = MIMEText(msg) message['Subject'] = msg now = datetime.datetime.now() message['Date'] = now.strftime("%a, %d %b %Y %H:%M:%S") - message['From'] = self.fromName - message['To'] = taskArgs["rcpt"] + message['From'] = self.sender + message['To'] = self.rcpt["rcpt"] s = smtplib.SMTP(self.host, self.port) #s.login(self.userName, self.password) - s.sendmail(self.fromName, taskArgs["rcpt"], message.as_string()) + s.sendmail(self.sender, self.rcpt["rcpt"], message.as_string()) s.quit() -def create(taskDict): - return MailTask(**taskDict) \ No newline at end of file +def create(kwargs): + return MailTask(**kwargs) \ No newline at end of file diff --git a/linspector/tasks/task.py b/linspector/tasks/task.py index f8af46e..7380457 100644 --- a/linspector/tasks/task.py +++ b/linspector/tasks/task.py @@ -22,25 +22,51 @@ along with this program. If not, see . from logging import getLogger from threading import Event, Thread +KEY_TYPE = "type" +KEY_ARGS = "args" logger = getLogger(__name__) class Task: - def raise_config_exception(self, typeDict, name): - raise Exception("typeDict " + str(typeDict) + " has no " + str(name) + " argument!") + def __init__(self, **kwargs): - def set_task_type(self, taskType): - self._taskType = taskType - return self + self._args = {} + + if KEY_ARGS in kwargs: + self.add_arguments(kwargs[KEY_ARGS]) + elif self.needs_arguments(): + raise Exception("Error: needs arguments but none provided!") + + self._type = None + if KEY_TYPE in kwargs: + self._type = kwargs[KEY_TYPE] def get_task_type(self): - return self._taskType + return str(self.__class__) - def execute(self, msg, args): - pass + def add_arguments(self, args): + for key, val in args.items(): + self._args[key] = val + + def get_arguments(self): + return self._args + + def set_member(self, member): + self.member = member + + def needs_arguments(self): + return False + + def execute(self, job): + try: + self.execute(job) + except Exception, e: + logger.debug("Task execute failed!!!") + raise e +""" class TaskList(object): def __init__(self, tasks): self.tasks = tasks @@ -74,4 +100,5 @@ class TaskList(object): def execute_task_infos(self, msg, taskInfos): self.taskInfos.append((msg, taskInfos)) - self.event.set() \ No newline at end of file + self.event.set() +""" \ No newline at end of file