X-Git-Url: https://git.tokkee.org/?p=nagixsc.git;a=blobdiff_plain;f=nagixsc_conf2http.py;h=6b063d6d4b15dc58b12e3f8525efe95f29860e37;hp=d296bfff07bd2ca70da64fdd8e5ef3a1bbbccf2b;hb=HEAD;hpb=3ce04dca4f92dc1486d31fdd4676a5cb4e05a810 diff --git a/nagixsc_conf2http.py b/nagixsc_conf2http.py index d296bff..6b063d6 100755 --- a/nagixsc_conf2http.py +++ b/nagixsc_conf2http.py @@ -1,4 +1,22 @@ #!/usr/bin/python +# +# Nag(ix)SC -- nagixsc_conf2http.py +# +# Copyright (C) 2009-2010 Sven Velt +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import ConfigParser import base64 @@ -22,6 +40,8 @@ from nagixsc import * parser = optparse.OptionParser() parser.add_option('-c', '', dest='cfgfile', help='Config file') +parser.add_option('-d', '--daemon', action='store_true', dest='daemon', help='Daemonize, go to background') +parser.add_option('', '--nossl', action='store_true', dest='nossl', help='Disable SSL (overwrites config file)') parser.set_defaults(cfgfile='conf2http.cfg') @@ -35,18 +55,53 @@ if cfg_list == []: print 'Config file "%s" could not be read!' % options.cfgfile sys.exit(1) -config = {} +config = { + 'ip': '0.0.0.0', + 'port': '15666', + 'ssl': False, + 'sslcert': None, + 'conf_dir': '', + 'pidfile': '/var/run/nagixsc_conf2http.pid', + 'livestatus_socket' : None, + } + +if 'ip' in cfgread.options('server'): + config['ip'] = cfgread.get('server', 'ip') + +if 'port' in cfgread.options('server'): + config['port'] = cfgread.get('server', 'port') try: - config['ip'] = cfgread.get('server', 'ip') - config['port'] = cfgread.getint('server', 'port') - config['ssl'] = cfgread.getboolean('server', 'ssl') - config['cert'] = cfgread.get('server', 'sslcert') + config['port'] = int(config['port']) +except ValueError: + print 'Port "%s" not an integer!' % config['port'] + sys.exit(127) - config['conf_dir'] = cfgread.get('server', 'conf_dir') +if 'ssl' in cfgread.options('server'): + try: + config['ssl'] = cfgread.getboolean('server', 'ssl') + except ValueError: + print 'Value for "ssl" ("%s") not boolean!' % config['ssl'] + sys.exit(127) + +if config['ssl']: + if 'sslcert' in cfgread.options('server'): + config['sslcert'] = cfgread.get('server', 'sslcert') + else: + print 'SSL but no certificate file specified!' + sys.exit(127) + +try: + config['conf_dir'] = cfgread.get('server', 'conf_dir') +except ConfigParser.NoOptionError: + print 'No "conf_dir" specified!' + sys.exit(127) + +if 'pidfile' in cfgread.options('server'): + config['pidfile'] = cfgread.get('server', 'pidfile') + +if 'livestatus_socket' in cfgread.options('server'): + config['livestatus_socket'] = prepare_socket(cfgread.get('server', 'livestatus_socket')) -except ConfigParser.NoOptionError, e: - print 'Config file error: %s ' % e - sys.exit(1) users = {} for u in cfgread.options('users'): @@ -100,18 +155,30 @@ class Conf2HTTPHandler(MyHTTPRequestHandler): if re.search('\.\.', configfile): self.http_error(500, 'Found ".." in config file name') return - if not re.search('^[a-zA-Z0-9-_\.]+$', configfile): + if not re.search('^[a-zA-Z0-9-_]+.conf$', configfile): self.http_error(500, 'Config file name contains invalid characters') return - check_config = read_inifile(os.path.join(config['conf_dir'], configfile)) - if not check_config: - self.http_error(500, 'Could not read config file "%s"' % configfile) - return + # Just be sure it exists + checks = None + + # If config file name starts with "_" it's something special + if not configfile.startswith('_'): + # Try to read config file, execute checks + check_config = read_inifile(os.path.join(config['conf_dir'], configfile)) + if not check_config: + self.http_error(500, 'Could not read config file "%s"' % configfile) + return + checks = conf2dict(check_config, host, service) + + elif configfile=='_livestatus.conf' and config['livestatus_socket']: + # Read mk-livestatus and translate into XML + checks = livestatus2dict(config['livestatus_socket'], host, service) + - checks = conf2dict(check_config, host, service) + # No check results? No (good) answer... if not checks: - self.http_error(500, 'No checks executed') + self.http_error(500, 'No check results') return self.send_response(200) @@ -124,11 +191,21 @@ class Conf2HTTPHandler(MyHTTPRequestHandler): def main(): - if config['ssl'] and not os.path.isfile(config['cert']): - print 'SSL certificate "%s" not found!' % config['cert'] + if options.nossl: + config['ssl'] = False + + if config['ssl'] and not os.path.isfile(config['sslcert']): + print 'SSL certificate "%s" not found!' % config['sslcert'] + sys.exit(127) + + if not os.path.isdir(config['conf_dir']): + print 'Not a config file directory: "%s"' % config['conf_dir'] sys.exit(127) - server = MyHTTPServer((config['ip'], config['port']), Conf2HTTPHandler, ssl=config['ssl'], sslpemfile=config['cert']) + if options.daemon: + daemonize(pidfile=config['pidfile']) + + server = MyHTTPServer((config['ip'], config['port']), Conf2HTTPHandler, ssl=config['ssl'], sslpemfile=config['sslcert']) try: server.serve_forever() except: