icinga2-api-examples icon indicating copy to clipboard operation
icinga2-api-examples copied to clipboard

Does not work with Python 3.6

Open bmccorkle opened this issue 5 years ago • 0 comments
trafficstars

This script doesn't seem to work with python 3.6. Mainly, print statements now need parenthesis and it seems a 'list' function needed added when getting the host, service, and notifications. I seemed to be able to get it running with the following changes. Not a coding expert but thought I'd post what I had here for you to review...

#!/usr/bin/env python

# pip install icinga2api
# https://github.com/tobiasvdk/icinga2api
import os
import argparse

from icinga2api.client import Client

# use a helper to fetch our cut down object names
def getObjects(client, type_name):
    if 'Notification' == type_name:
        return client.objects.list(type_name, attrs=['__name'])
    else:
        return client.objects.list(type_name, attrs=['__name', 'groups'])

# use a helper to convert the full blown object dictionary into a list of __name elements
def getNameList(objects, group = ''):
    if group:
        return map(lambda x : x['attrs']['__name'], filter(lambda y : group in y['attrs']['groups'], objects))
    else:
        return map(lambda x : x['attrs']['__name'], objects)

def diffList(l1,l2):
    l2 = set(l2)
    return [x for x in l1 if x not in l2]

# add connection details
parser = argparse.ArgumentParser()
parser.add_argument("-H", "--hosturi", help="URL to icinga2 API", required=True)
parser.add_argument("-u", "--username", help="Username to connect to API", required=True)
parser.add_argument("-p", "--password", help="Password to connect to API", required=True)
parser.add_argument("-g", "--group", help="Group to filter", required=False)
args = parser.parse_args()

client = Client(args.hosturi, args.username, args.password)

hosts = getObjects(client, 'Host')
services = getObjects(client, 'Service')
notifications = getObjects(client, 'Notification')

#debug
#print (hosts)
#print (services)
#print (notifications)


if not args.group:
    h_names = list(getNameList(hosts, False))
    s_names = list(getNameList(services, False))
else:
    h_names = list(getNameList(hosts, args.group))
    s_names = list(getNameList(services, args.group))

n_names = list(getNameList(notifications))

found_h_names = []
found_s_names = []

for n in n_names:
    split_arr = n.split("!")
    if len(split_arr) == 2:
        for h in h_names:
            # debug
            # print (n + " " + h)
            if h in split_arr[0]:
                found_h_names.append(h)

    if len(split_arr) == 3:
        for s in s_names:
            # debug
            # print (n + " " + s)

            # rebuild the matched full service name with host!service
            split_s_full_name = split_arr[0] + "!" + split_arr[1]

            if s in split_s_full_name:
                found_s_names.append(s)


print("Hosts without notification")
print (", ".join(diffList(h_names, found_h_names)))
print ("")
print("Services without notification")
print (", ".join(diffList(s_names, found_s_names)))

bmccorkle avatar Dec 20 '19 22:12 bmccorkle