#!/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)