142 lines
No EOL
5 KiB
Python
Executable file
142 lines
No EOL
5 KiB
Python
Executable file
#!/usr/bin/python2.7 -tt
|
|
|
|
"""
|
|
Copyright (c) 2011-2013 by 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 <http://www.gnu.org/licenses/>.
|
|
"""
|
|
|
|
|
|
__version__ = "0.11"
|
|
__default_config__ = "./examples/minimal.json"
|
|
|
|
import argparse
|
|
import logging
|
|
import logging.handlers
|
|
import os
|
|
import os.path as path
|
|
import Queue
|
|
import time
|
|
|
|
from linspector.linspector import Linspector
|
|
from linspector.core.interface import LinspectorInterface
|
|
from linspector.config.parser import FullConfigParser
|
|
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):
|
|
#TODO: catch all log messages (apscheduler etc.); make logging more generic to support libraries logging
|
|
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=10485760, 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 main():
|
|
args = parse_args()
|
|
|
|
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()
|
|
|
|
q = Queue.Queue()
|
|
linspector = Linspector(linConf, core, scheduler, log, q)
|
|
linspector.daemon = True
|
|
linspector.start()
|
|
|
|
while True:
|
|
if q.qsize() < 1:
|
|
time.sleep(1)
|
|
else:
|
|
break
|
|
|
|
interface = LinspectorInterface(q.get(), scheduler, linConf)
|
|
|
|
if "jsonrpc_backend" in core and core["jsonrpc_backend"]:
|
|
jsonrpc = JsonrpcBackend(interface, core)
|
|
jsonrpc.daemon = True
|
|
jsonrpc.start()
|
|
|
|
LishFrontend(interface)
|
|
|
|
log.debug("shutting down scheduler")
|
|
|
|
shutdown_wait = True
|
|
if "shutdown_wait" in core:
|
|
shutdown_wait = core["shutdown_wait"]
|
|
|
|
scheduler.shutdown(wait=shutdown_wait)
|
|
logging.shutdown()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |