#!/usr/bin/python2.7 -tt """ Copyright (c) 2011-2013 "Johannes Findeisen and Rafael Timmerberg" This file is part of Linspector (http://linspector.org). Linspector is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . """ __version__ = "0.9" __default_config__ = "./examples/minimal.json" import argparse import logging import logging.handlers import os import os.path as path from linspector.core.interface import LinspectorInterface from linspector.config.parser import FullConfigParser from linspector.core.job import Job from linspector.core.scheduler import Scheduler from linspector.backends.jsonrpc import JsonrpcBackend from linspector.frontends.lish import LishFrontend def parse_args(): parser = argparse.ArgumentParser( description="Linspector is for monitoring the vital information of hosts, services and devices in a network.", epilog="linspector is not some program expecting computers to run! Visit http://linspector.org for more " "information.", prog="linspector") #TODO: add --nocolor to disable colored output in lish parser.add_argument("--version", action="version", version="%(prog)s " + str(__version__)) #TODO: make the config file a required field without -c or --config at the end eg: linspector config.json parser.add_argument("-c", "--config", default=__default_config__, help="select configfile to use") parser.add_argument("-l", "--logfile", default="./log/linspector.log", metavar="FILE", help="set logfile to use") output = parser.add_mutually_exclusive_group() output.add_argument("-q", "--quiet", action="store_const", dest="loglevel", const=logging.ERROR, help="output only errors") output.add_argument("-w", "--warning", action="store_const", dest="loglevel", const=logging.WARNING, help="output warnings") output.add_argument("-v", "--verbose", action="store_const", dest="loglevel", const=logging.INFO, help="output info messages") output.add_argument("-d", "--debug", action="store_const", dest="loglevel", const=logging.DEBUG, help="output debug messages") output.set_defaults(loglevel=logging.INFO) return parser.parse_args() def setup_logging(logfile="./log/linspector.log", logLevel=logging.ERROR, logfileLevel=logging.DEBUG): logfile = path.expanduser(logfile) if not path.exists(path.dirname(logfile)): os.makedirs(path.dirname(logfile)) #logging.basicConfig(level=logging.WARNING) log = logging.getLogger(__name__) log.setLevel(logging.DEBUG) consoleHandler = logging.StreamHandler() consoleHandler.setLevel(logLevel) fileHandler = logging.handlers.RotatingFileHandler(logfile, maxBytes=1024000, backupCount=4) fileHandler.setLevel(logfileLevel) consoleFormatter = logging.Formatter('[%(levelname)s]: %(message)s') #TODO: if debug with file and function else without that fileFormatter = logging.Formatter('%(asctime)s %(pathname)s %(module)s %(funcName)s %(lineno)d [%(levelname)s]: %(message)s') consoleHandler.setFormatter(consoleFormatter) fileHandler.setFormatter(fileFormatter) log.addHandler(consoleHandler) log.addHandler(fileHandler) return log def handle_job(jobInfo): jobInfo.handle_call() def main(): args = parse_args() #TODO: catch all log messages (apscheduler etc.); make logging more generic to support libraries logging log = setup_logging(args.logfile, args.loglevel) log.info("parsed arguments") configParser = FullConfigParser(log) linConf, core = configParser.parse_config(args.config) scheduler = Scheduler() scheduler.start() jobs = [] for layout in linConf.get_enabled_layouts(): for hostgroup in layout.get_hostgroups(): for service in hostgroup.get_services(): for host in hostgroup.get_hosts(): for period in service.get_periods(): job = Job(service, host, hostgroup.get_members(), hostgroup.get_processors(), core, hostgroup) schedulerJob = period.createJob(scheduler, job, handle_job) if schedulerJob is not None: job.set_job(schedulerJob) job.set_logger(log) jobs.append(job) interface = LinspectorInterface(jobs, scheduler, linConf) if core["jsonrpc_backend"]: jsonrpc = JsonrpcBackend(interface, core) jsonrpc.daemon = True jsonrpc.start() LishFrontend(interface) log.debug("shutting down scheduler") scheduler.shutdown(wait=True) logging.shutdown() if __name__ == "__main__": main()