+++ /dev/null
-#!/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]
- 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']
-
- newprops['alias'] = obj['name']
- obj['name'] = newprops['host_name'] + '-' + obj['name']
-
- 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)
-