From da13073648dc34879a1eda2aec175a9d301a201b Mon Sep 17 00:00:00 2001 From: "Rafael.Timmerberg" Date: Mon, 27 May 2013 01:44:28 +0200 Subject: [PATCH] added job handling --- lib/config/config.py | 2 +- lib/config/periods.py | 90 +++++++++++++++++++++++++++++++++++++++---- lib/core/job.py | 17 ++++++-- linspector | 20 +++++++++- 4 files changed, 116 insertions(+), 13 deletions(-) diff --git a/lib/config/config.py b/lib/config/config.py index bdd0ea2..eec9c6e 100644 --- a/lib/config/config.py +++ b/lib/config/config.py @@ -23,7 +23,7 @@ class Config: self.members = parseMemberList(self.dict['members'], self.filters, log) - self.periods = parsePeriodList(self.dict['periods']) + self.periods = parsePeriodList(self.dict['periods'],log) self.hosts = parseHostList(self.dict['hosts'], self.services, log) diff --git a/lib/config/periods.py b/lib/config/periods.py index 92c2546..7999ec4 100644 --- a/lib/config/periods.py +++ b/lib/config/periods.py @@ -1,8 +1,44 @@ -class Period: - def __init__(self, name="", year="*", month="*", day="*", week="*", - day_of_week=None, hour="*", minute="*", second="0", date=None, - comment=None): +from apscheduler.scheduler import Scheduler + + +class Period(object): + def __init__(self, name): self.name = name + + def getName(self): + return self.name + + def createJob(self, scheduler, jobInfo, func): + pass + + +class IntervalPeriod(Period): + def __init__(self, name="", weeks=0,days=0, hours=0, minutes=0, seconds=0, start_date=None, + comment=None): + super(IntervalPeriod, self).__init__(name) + + self.days = days # number of days to wait + self.weeks = weeks # number of weeks to wait + self.hours = hours # number of hours to wait + self.minutes = minutes # number of minutes to wait + self.seconds = seconds # number of seconds to wait + self.start_date = start_date # when to first execute + self.comment = comment # comment + + def createJob(self, scheduler, jobInfo, func): + return scheduler.add_interval_job(func, self.weeks, self.hours, self.minutes, self.seconds, self.start_date, jobInfo) + + + def __str__(self): + ret = "IntervalPeriod(Name: " + self.name + ")" + return ret + + +class CronPeriod(Period): + def __init__(self, name="", year="*", month="*", day="*", week="*", + day_of_week="*", hour="*", minute="*", second="0", + comment=None): + super(CronPeriod, self).__init__(name) self.year = year # 4-digit year number self.month = month # month number (1-12) self.day = day # day of the month (1-31) @@ -15,10 +51,50 @@ class Period: self.date = date def __str__(self): - ret = "Period(Name: " + self.name + " Year: " + self.year + " Month: " + self.month + ")" + ret = "CronPeriod(Name: " + self.name + ")" return ret + + def createJob(self, scheduler, jobInfo, func): + return scheduler.add_cron_job(func, self.year, self.month, self.day, self.week, self.day_of_week, self.hour, self.minute, self.second, jobInfo) + + +class DatePeriod(Period): + def __init__(self, name, date, comment=None): + super(DatePeriod, self).__init__(name) + self.date = date + self.comment = comment + + def __str__(self): + ret = "DatePeriod(Name: " + self.name + ","+ str(self.date) + ")" + return ret + + def createJob(self, scheduler, jobInfo, func): + return scheduler.add_date_job(func, self.date, jobInfo) -def parsePeriodList(periods): - return [Period(name, **values) for name, values in periods.items()] + + + +def parsePeriodList(periodlist,log): + periods=[] + for name, values in periodlist.items(): + if "date" in values: + periods.append(DatePeriod(name, **values)) + break + + for i in [ "weeks","days", "hours", "minutes", "seconds", "start_date"]: + if i in values: + periods.append(IntervalPeriod(name, **values)) + break + + for i in ["year", "month", "day", "week", "day_of_week", "hour", "minute", "second"]: + if i in values: + periods.append(CronPeriod(name, **values)) + break + + log.w("ignoring Period: " +str(name)) + log.w("reason: could not determine PeriodType: " + str(values)) + + + return periods diff --git a/lib/core/job.py b/lib/core/job.py index 244a4a0..662c533 100644 --- a/lib/core/job.py +++ b/lib/core/job.py @@ -4,9 +4,18 @@ execute. """ -class Job: - def __init__(self, command=None, members=None, host=None, service=None): - self.command = command +class JobInfo: + def __init__(self, hostgroupname, members, hosts, service, threshold, parent=None): self.members = members - self.host = host + self.hosts = hosts self.service = service + self.threshold = threshold + self.parent = parent + self.name = hostgroupname + service.name + + def __str__(self): + return self.name + + + + diff --git a/linspector b/linspector index 8d5799a..707cc4a 100755 --- a/linspector +++ b/linspector @@ -2,8 +2,10 @@ VERSION = "0.1.1/TETRIS" import argparse +from lib.core.job import JobInfo from lib.core.logger import Logger from lib.config.config import Config +from lib.config.periods import Period from apscheduler.scheduler import Scheduler import logging import subprocess as sp @@ -38,6 +40,9 @@ def parseArgs(): return parser.parse_args() +def handleJob(jobInfo): + print str(jobInfo) + def main(): args = parseArgs() log = Logger(args.logfile, args.loglevel) @@ -45,11 +50,24 @@ def main(): log.i("parsed arguments") if args.action == "start": + jobs = [] + scheduler = Scheduler() + scheduler.start() + log.i("starting linspector: reading config... (" + args.config + ")") config = Config(args.config, log) log.d("parsed config: " + str(config)) for hg in config.hostgroups: - log.i(str(hg)) + for hostGroupService in hg.services: + job=JobInfo(hg.name, hg.members, hg.hosts, hostGroupService.service, hg.threshold, hg.parent) + for period in hostGroupService.periods: + jobs.append(period.createJob(scheduler, jobInfo, handleJob)) + for job in jobs: + log.i(str(job)) + + + + elif args.action == "stop": log.i("stopping linspector is currently unsupported") elif args.action == "restart":