Code

Changed license to GPL-2+ (from GPL-2only).
[nagixsc.git] / nagixsc_conf2xml.py
index 149bdd135827cfb96827d613179a9a0b0025fe87..2b5018c723aac08852ba3c00b2d0c4410693e09c 100755 (executable)
@@ -1,9 +1,26 @@
 #!/usr/bin/python
+#
+# Nag(ix)SC -- nagixsc_conf2xml.py
+#
+# Copyright (C) 2009-2010 Sven Velt <sv@teamix.net>
+#
+# 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 optparse
-import subprocess
 import sys
+import urllib2
 
 ##############################################################################
 
@@ -11,86 +28,50 @@ from nagixsc import *
 
 ##############################################################################
 
-checks = []
-
-
 parser = optparse.OptionParser()
 
 parser.add_option('-c', '', dest='conffile', help='Config file')
-parser.add_option('-o', '', dest='outfile', help='Output file')
+parser.add_option('-o', '', dest='outfile', help='Output file name, "-" for STDOUT or HTTP POST URL')
 parser.add_option('-e', '', dest='encoding', help='Encoding ("%s")' % '", "'.join(available_encodings()) )
+parser.add_option('-H', '', dest='host', help='Hostname/section to search for in config file')
+parser.add_option('-D', '', dest='service', help='Service description to search for in config file (needs -H)')
+parser.add_option('-l', '', dest='httpuser', help='HTTP user name, if outfile is HTTP(S) URL')
+parser.add_option('-a', '', dest='httppasswd', help='HTTP password, if outfile is HTTP(S) URL')
+parser.add_option('-q', '', action='store_true', dest='quiet', help='Be quiet')
 parser.add_option('-v', '', action='count', dest='verb', help='Verbose output')
 
 parser.set_defaults(conffile='nagixsc.conf')
 parser.set_defaults(outfile='-')
 parser.set_defaults(encoding='base64')
+parser.set_defaults(host=None)
+parser.set_defaults(service=None)
 parser.set_defaults(verb=0)
 
 (options, args) = parser.parse_args()
 
 ##############################################################################
 
-if options.encoding not in available_encodings():
+if not check_encoding(options.encoding):
        print 'Wrong encoding method "%s"!' % options.encoding
-       print 'Could be one of: %s' % ', '.join(available_encodings)
+       print 'Could be one of: "%s"' % '", "'.join(available_encodings())
        sys.exit(127)
 
 ##############################################################################
 
-def exec_check(host_name, service_descr, cmdline):
-       try:
-               cmd     = subprocess.Popen(cmdline.split(' '), stdout=subprocess.PIPE)
-               output  = cmd.communicate()[0].rstrip()
-               retcode = cmd.returncode
-       except OSError:
-               output  = 'Could not execute "%s"' % cmdline
-               retcode = 127
+config = read_inifile(options.conffile)
 
-       return {'host_name':host_name, 'service_description':service_descr, 'returncode':retcode, 'output':output, 'timestamp':datetime.datetime.now().strftime('%s')}
-
-##############################################################################
-
-config = ConfigParser.RawConfigParser()
-config.optionxform = str # We need case-sensitive options
-conf_list = config.read(options.conffile)
-
-if conf_list == []:
+if not config:
        print 'Config file "%s" could not be read!' % options.conffile
-       sys.exit(127)
-
-# Sections are Hosts (not 'nagixsc'), options in sections are Services
-hosts = config.sections()
-if 'nagixsc' in hosts:
-       hosts.remove('nagixsc')
-
-for host in hosts:
-       # Overwrite section/host name with '_host_name'
-       if config.has_option(host,'_host_name'):
-               host_name = config.get(host,'_host_name')
-       else:
-               host_name = host
-
-
-       # Look for host check
-       if config.has_option(host,'_host_check'):
-               cmdline = config.get(host, '_host_check')
-               check = exec_check(host_name, None, cmdline)
-               checks.append(check)
-
-
-       for service in config.options(host):
-               # If option starts with '_' it may be a NagixSC option in the future
-               if service[0] != '_':
-                       cmdline = config.get(host, service)
-
-                       check = exec_check(host_name, service, cmdline)
-                       checks.append(check)
+       sys.exit(5)
 
+# Execute checks, build dict
+checks = conf2dict(config, options.host, options.service)
 
+# Convert to XML
 xmldoc = xml_from_dict(checks, options.encoding)
-if options.outfile == '-':
-       xmldoc.saveFormatFile('-', format=1)
-else:
-       xmldoc.saveFile(options.outfile)
 
+# Output
+response = write_xml_or_die(xmldoc, options.outfile, options.httpuser, options.httppasswd)
+if response and not options.quiet:
+       print response