import click import requests import json from xml.etree import ElementTree def search_services(base_url, username, password, service): ifservices = requests.get(base_url + '/api/v2/ifservices', params={'limit': 0, '_s': 'serviceType.name==' + service}, headers={'Accept': 'application/xml'}, auth=(username, password)) ifservices.raise_for_status() ifservices = ElementTree.fromstring(ifservices.content) for service in ifservices.iter('service'): ipiface_id = service.find('ipInterfaceId').text node = requests.get(base_url + '/api/v2/nodes', params={'limit': 0, '_s': 'ipInterface.id==' + ipiface_id}, headers={'Accept': 'application/xml'}, auth=(username, password)) node.raise_for_status() node = ElementTree.fromstring(node.content).find('node') node_id = node.get('id') node_label = node.get('label') ipiface = requests.get(base_url + '/api/v2/nodes/' + node_id + '/ipinterfaces', params={'limit': 0, '_s': 'id==' + ipiface_id}, headers={'Accept': 'application/xml'}, auth=(username, password)) ipiface.raise_for_status() ipiface = ElementTree.fromstring(ipiface.content).find('ipInterface') ipiface_address = ipiface.find('ipAddress').text yield node_label, node_id, ipiface_address @click.command() @click.option('--base-url', default='http://localhost:8980/opennms') @click.option('--username', default='admin') @click.option('--password', default='admin') @click.option('--service', default='HTTP') @click.option('--bs-id', default=0) def main(base_url, username, password, service, bs_id): # Strip trailing slash from base URL if base_url.endswith('/'): base_url = base_url[:-1] rkeys = ((label, 'uei.opennms.org/nodes/nodeLostService::%s:%s:%s' % (node, addr, service)) for (label, node, addr) in search_services(base_url, username, password, service)) bs = {'name': service, 'reduce-function': {'type': 'HighestSeverity'}, 'reduction-key-edges': [{ 'weight': 1, 'map-function': {'type': 'Identity'}, 'reduction-key': rkey, } for (label, rkey) in rkeys]} bs = json.dumps(bs) r = requests.put(base_url + '/api/v2/business-services/' + str(bs_id), headers={'Accept': 'application/json', 'Content-Type': 'application/json'}, auth=(username, password), data=bs) r.raise_for_status() r = requests.post(base_url + '/api/v2/business-services/daemon/reload', headers={'Accept': 'application/json', 'Content-Type': 'application/json'}, auth=(username, password)) r.raise_for_status() if __name__ == '__main__': main()