From 5e1e06355c468888a9f3bc46c867de5fe8dfe249 Mon Sep 17 00:00:00 2001 From: "Rafael.Timmerberg" Date: Tue, 2 Jul 2013 23:30:31 +0200 Subject: [PATCH] added job handling... a bit... :) --- lib/config/parser.py | 3 ++- lib/core/job.py | 51 ++++++++++++++++++++++++++++++----------- lib/services/service.py | 35 ++++++++++++++++++++-------- linspector | 15 ++++++------ minimal.json | 9 ++++---- 5 files changed, 77 insertions(+), 36 deletions(-) diff --git a/lib/config/parser.py b/lib/config/parser.py index 933c780..31f371e 100644 --- a/lib/config/parser.py +++ b/lib/config/parser.py @@ -12,7 +12,8 @@ from periods import CronPeriod, DatePeriod, IntervalPeriod from lib.services.service import Service from lib.processors.processor import Processor from lib.parsers.parser import Parser -from lib.tasks.task import Task +from lib.tasks.task import Task +from argparse import Namespace MOD_SERVICES = "services" MOD_PROCESSORS = "processors" diff --git a/lib/core/job.py b/lib/core/job.py index 202a445..e5b1699 100644 --- a/lib/core/job.py +++ b/lib/core/job.py @@ -2,9 +2,7 @@ This is what job_function needs as parameter for each job to successfully execute. """ - -from lib.core.command import Command - +from datetime import datetime def generateId(): i = 0 @@ -12,16 +10,18 @@ def generateId(): yield i i += 1 - -class JobInfo: +class Job: def __init__(self, service): self.service = service - self.name = generateId() - self.job = None + self.jobInfos = [] + self.hostThreshold = {} + for host in service.get_hostgroup().get_hosts(): + self.hostThreshold[host] = service.get_threshold() + def __str__(self): - return "JobInfo " + str(self.name) - + return str(self.__dict__) + def set_logger(self, log): self.log = log @@ -31,8 +31,33 @@ class JobInfo: def handle_call(self): self.log.d("handle call") self.log.d(self.service) - try: - self.service._execute() - except Exception, e: - self.log.d(e) \ No newline at end of file + for host in self.service.get_hostgroup().get_hosts(): + try: + jobInfo = JobInfo(host, self.service) + result = self.service._execute(host) + jobInfo.set_result(result) + jobInfo.set_successfull(self.service.was_execution_successful()) + jobInfo.set_execution_end() + + except Exception, e: + self.log.d(e) + + +class JobInfo: + def __init__(self, host, service): + self.id = generateId() + self.host = host + self.service = service + self.executionBegin = datetime.now() + + def set_result(self, result): + self.result = result + + def set_execution_end(self): + self.executionEnd = datetime.now() + + def set_execution_successful(self, successful): + self.executionSuccess = successful + + diff --git a/lib/services/service.py b/lib/services/service.py index 0e1a3f3..1fbf4ba 100644 --- a/lib/services/service.py +++ b/lib/services/service.py @@ -105,25 +105,40 @@ class Service(object): def needs_arguments(self): return False - def _execute(self): - self.pre_execute() - result = {} - for host in self.get_hostgroup().get_hosts(): - result[host] = self.execute(host) + def set_execution_successful(self, successful): + self.executionSuccessful = successful - parseResult = self.parse_result(result) - self.handle_result(parseResult) + def was_execution_successful(self): + return self.executionSuccessful + + def _execute(self, host): + try: + + self.set_execution_successful(True) + self.pre_execute(host) + + result = self.execute(host) + parseResult = self.parse_result(result) + self.post_execute(parseResult) + return parseResult + except Exception, e: + self.set_execution_successful(False) + self._threshold -= 1 + raise e def execute(self, host): pass - def pre_execute(self): + def pre_execute(self, host): pass def parse_result(self, executionResult): + result = [] for parser in self.get_parser(): result.append(parser.parse(executionResult)) - def handle_result(self, parseResult): - pass \ No newline at end of file + return result + + def post_execute(self, parseResult): + pass diff --git a/linspector b/linspector index 2980569..9a62347 100755 --- a/linspector +++ b/linspector @@ -7,11 +7,10 @@ import argparse import time import logging import subprocess as sp -from lib.core.job import JobInfo from lib.core.logger import Logger from lib.config.parser import FullConfigParser from apscheduler.scheduler import Scheduler -from lib.core.job import JobInfo +from lib.core.job import Job import tornado.ioloop import tornado.web @@ -84,12 +83,12 @@ def main(): for hostgroup in layout.get_hostgroups(): for service in hostgroup.get_services(): for period in service.get_periods(): - jobInfo = JobInfo(service) - job = period.createJob(scheduler, jobInfo, handleJob) - if job is not None: - jobInfo.set_job(job) - jobInfo.set_logger(log) - jobs.append(jobInfo) + job = Job(service) + schedulerJob = period.createJob(scheduler, job, handleJob) + if schedulerJob is not None: + job.set_job(schedulerJob) + job.set_logger(log) + jobs.append(job) application = tornado.web.Application([ (r"/", MainHandler), (r"/jobs", JoblistHandler, dict(jobs=scheduler.get_jobs())) diff --git a/minimal.json b/minimal.json index 9099341..80858d5 100644 --- a/minimal.json +++ b/minimal.json @@ -5,7 +5,7 @@ "comment": "Security Inspector", "tasks": [ {"class":"email", "type": "donut", "args": {"rcpt": "homer_j_simpson@burnscorp.sp"}}, - {"class":"email", "type": "do", "args": {"rcpt": "homer_j_simpson@burnscorp.sp"}} + {"class":"email", "type": "donut", "args": {"rcpt": "homer_j_simpson@burnscorp.sp"}} ] } }, @@ -26,18 +26,19 @@ "class": "ping", "fails": {"donut": 2000}, "periods": ["doh"], - "threshold": 500 + "threshold": 50 }, { "class": "ping", - "fails": {"donut": 2000}, + "fails": {"donut": 1000}, "periods": ["doh"], - "threshold": 500 + "threshold": 100 }, { "class": "tcpconnect", "args": {"port": 23232}, "periods": ["moes_time", "marges_birthday"], + "fails": {"donut": 0}, "threshold": 0, "comment": "my personal reminder, hehe" }