From 705d21de60baeb53d731be9d4bab534891fd70b4 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 2 Jul 2012 16:26:31 +0200 Subject: [PATCH] Renamed check_random plugin. Added script for converting Icinga configs. --- {check_random => contrib}/check_random.c | 0 contrib/convert-config.py | 233 +++++++++++++++++++++++ 2 files changed, 233 insertions(+) rename {check_random => contrib}/check_random.c (100%) create mode 100755 contrib/convert-config.py diff --git a/check_random/check_random.c b/contrib/check_random.c similarity index 100% rename from check_random/check_random.c rename to contrib/check_random.c diff --git a/contrib/convert-config.py b/contrib/convert-config.py new file mode 100755 index 000000000..4b04638a1 --- /dev/null +++ b/contrib/convert-config.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python +import sys +import re + +def readObject(): + inObject = False + + obj = { + 'type': None, + 'properties': {} + } + + for line in sys.stdin: + # remove new-line as well as other whitespace characters + line = line.strip() + + # replace tabs with space + line = line.replace("\t", ' ') + + # ignore comments and empty lines + if line == '' or line[0] == '#': + continue + + if not inObject: + match = re.match('^define +([^ ]+) *{$', line) + + if not match: + raise ValueError('Invalid line in config file: ' + line) + + obj['type'] = match.group(1) + inObject = True + else: + match = re.match('^}$', line) + + if match: + return obj + + match = re.match('^ *([^ ]+) *(.*)$', line) + + if match: + obj['properties'][match.group(1)] = match.group(2) + else: + raise ValueError('Invalid line in config file: ' + line) + + return None + +def dumpValue(obj, indent = 0): + result = ''; + + indent += 1 + + if isinstance(obj, dict): + result = "{\n" + + for k, v in obj.iteritems(): + op = '+=' if isinstance(v, (dict, list)) else '=' + result += "\t" * indent + k + ' ' + op + ' ' + dumpValue(v, indent) + ",\n" + + result += "\t" * (indent - 1) + "}" + elif isinstance(obj, list): + result = "{\n" + + for v in obj: + result += "\t" * indent + dumpValue(v) + ",\n" + + result += "\t" * (indent - 1) + "}" + elif isinstance(obj, (int, long)): + result = str(obj) + else: + result = ''.join(['"', str(obj), '"']) + + return result + +def printObject(obj): + if 'abstract' in obj and obj['abstract']: + print 'abstract', + + if 'local' in obj and obj['local']: + print 'local', + + if 'temporary' in obj and obj['temporary']: + print 'temporary', + + print 'object', obj['type'], ''.join(['"', obj['name'], '"']), + + if 'parents' in obj and len(obj['parents']) > 0: + print 'inherits', + print ', '.join([''.join(['"', parent, '"']) for parent in obj['parents']]), + + print dumpValue(obj['properties']) + print + +nagios_svc_template = { + 'name': 'nagios-service', + 'type': 'service', + 'abstract': True, + 'properties': { + 'check_type': 'nagios', + 'macros': { + 'USER1': '/tmp/nagios/plugins', + 'SERVICESTATE': 0, + 'SERVICEDURATIONSEC': 0, + 'TOTALHOSTSERVICESCRITICAL': 0, + 'TOTALHOSTSERVICESWARNING': 0 + } + } +} + +printObject(nagios_svc_template) + +allObjects = [] +objects = {} + +while True: + obj = readObject() + + if obj == None: + break + + props = obj['properties'] + + # transform the name property + name = None + for prop in [obj['type'] + '_name', 'name', 'service_description']: + if prop in props: + if prop == 'service_description': + name = props[prop] + '-' + props['host_name'] + else: + name = props[prop] + + if prop != 'service_description': + del props[prop] + + break + + if name == None: + raise ValueError('Object has no name: ' + str(obj)) + + obj['name'] = name + + if not obj['type'] in objects: + objects[obj['type']] = {} + + allObjects.append(obj) + objects[obj['type']][obj['name']] = obj + +for obj in allObjects: + props = obj['properties'] + newprops = {} + + obj['parents'] = [] + + # transform 'register' property + if 'register' in props: + if int(props['register']) == 0: + obj['abstract'] = True + + del props['register'] + + # transform 'use' property + if 'use' in props: + obj['parents'] = props['use'].split(',') + del props['use'] + + # transform commands into service templates + if obj['type'] == 'command': + obj['abstract'] = True + obj['type'] = 'service' + obj['parents'].append('nagios-service') + + if 'command_line' in props: + newprops['check_command'] = props['command_line'] + del props['command_line'] + + # transform contactgroups/hostgroups/servicegroups + elif obj['type'] in ['contactgroup', 'hostgroup', 'servicegroup']: + if 'alias' in props: + newprops['alias'] = props['alias'] + del props['alias'] + + if 'members' in props: + newprops['members'] = props['members'].split(',') + del props['members'] + + # transform services + elif obj['type'] == 'service': + newprops['macros'] = {} + + if 'check_command' in props: + tokens = props['check_command'].split('!') + obj['parents'].append(tokens[0]) + + num = 0 + for token in tokens[1:]: + num += 1 + newprops['macros']['ARG' + str(num)] = token + + del props['check_command'] + + if 'check_interval' in props: + newprops['check_interval'] = int(float(props['check_interval']) * 60) + del props['check_interval'] + + if 'retry_interval' in props: + newprops['retry_interval'] = int(float(props['retry_interval']) * 60) + del props['retry_interval'] + + if 'max_check_attempts' in props: + newprops['max_check_attempts'] = int(props['max_check_attempts']) + del props['max_check_attempts'] + + newprops['macros']['SERVICEDESC'] = obj['name'] + + if 'host_name' in props: + newprops['host_name'] = props['host_name'] + newprops['macros']['HOSTNAME'] = props['host_name'] + del props['host_name'] + + if 'service_description' in props: + newprops['alias'] = props['service_description'] + del props['service_description'] + + for k, v in props.iteritems(): + if k[0] == '_': + newprops['macros'][k] = v + + obj['properties'] = newprops + + #if len(props) > 0: + # obj['properties']['old'] = props + + printObject(obj) +