commit 4728d164ad8b1e0bc91db7206bc109a3d1b145e1 Author: Jon Bulica Date: Fri May 8 11:03:00 2020 +0200 erster commit diff --git a/otrs-notification.py b/otrs-notification.py new file mode 100644 index 0000000..6eba6ba --- /dev/null +++ b/otrs-notification.py @@ -0,0 +1,154 @@ +#!/usr/bin/python3 + +import json +import requests +import urllib.parse +from argparse import ArgumentParser +from pyotrs import Client, Article, Ticket + +# ignore insecure SSL warnings +import urllib3 +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +# otrs connection information +OTRS = { + "uri": "https://otrs2.inmedias.it/", + "connector": "GenericTicketConnector", + "username": "**********************", + "password": "**********************" +} + +NEW_TICKET_DEFAULTS = { + "queue": "Monitoring", + "priority": "2 normal", + "owner": "admin", + "state": "new", + "time": 0 +} + +# icinga connection information +ICINGA = { + "uri": "https://localhost:5665", + "path": "/v1/actions/acknowledge-problem", + "username": "********************", + "password": "********************", + "author": "admin" +} + + +def uri_encode(string): + return urllib.parse.quote(string) + + +def get_wiki_entry(args): + wiki_url = "https://wiki.inmedias.it/index.php?title=Monitoring:%s" % uri_encode(args.display_name) + if args.type == "Service": + wiki_url += "#%s" % uri_encode(args.service_name) + return wiki_url.replace('%20', '_') + + +def get_icinga_entry(args): + icinga_url = "https://deb-icinga2-proto.inmedias.it/icingaweb2/monitoring/%s/show?host=%s" % (args.type.lower(), uri_encode(args.hostname)) + if args.type == "Service": + icinga_url += "&service=%s" % uri_encode(args.service_name) + return icinga_url + + +def get_icinga_api_entry(args): + if args.type == "Host": + api_args = "?host=%s" % uri_encode(args.hostname) + else: + api_args = "?service=%s!%s" % (uri_encode(args.hostname), uri_encode(args.service_name)) + return api_args + + +def main(args): + # initialize the client + client = Client(OTRS['uri'], OTRS['username'], OTRS['password']) + client.ws_ticket = OTRS['connector'] + client.session_create() + + # generate ticket attributes + ticket_title = "[{status}] {hostname}" + if args.type == "Service" or args.service_name: + ticket_title += ": {service_name}" + + ticket_body = [ + "
{}
".format(args.details), + '{ic_title}'.format(ic_link=get_icinga_entry(args), ic_title="Icinga Backlink"), + '{wiki_title}'.format(wiki_link=get_wiki_entry(args), wiki_title="Wiki Backlink") + ] + + # # OTRS API Documentation: + # # http://doc.otrs.com/doc/api/otrs/6.0/Perl/Kernel/GenericInterface/Operation/Ticket/TicketCreate.pm.html + + # create first article for new ticket + article = Article({ + "Subject": ticket_title.format(**args.__dict__), + "Body": "
".join(ticket_body), + "TimeUnit": args.time, + "MimeType": "text/html", + "NoAgentNotify": int(args.no_agent_notify) + }) + + # create ticket with article + new_ticket = Ticket.create_basic( + Title=ticket_title.format(**args.__dict__), + Queue=args.queue, + State=args.state, + Priority=args.priority, + CustomerUser=args.customer + ) + ticket = client.ticket_create(ticket=new_ticket, article=article) + + # set ticket owner + client.ticket_update(ticket_id=ticket.get("TicketID"), Owner=args.owner) + + # set Acknowledgement in Icinga + ticket_number = ticket.get("TicketNumber") + ack = requests.post(url="{uri}{path}{args}".format(**ICINGA, args=get_icinga_api_entry(args)), + data=json.dumps({ + "author": ICINGA['author'], + "comment": "Ticket erstellt #%s" % ticket_number, + "sticky": 1 + }), + headers={"Accept": "application/json"}, + auth=(ICINGA['username'], ICINGA['password']), + verify=False) + if ack.ok: + # exit successfully + print("Done.") + exit(0) + else: + raise Exception("Could not acknowlede ticket '%s' in Icinga. Response: \n%s" % (ticket_number, ack.__dict__)) + + +if __name__ == "__main__": + # parse arguments taking into account default values + d_args = NEW_TICKET_DEFAULTS + parser = ArgumentParser(description='Notification Command for OTRS.', conflict_handler='resolve') + + parser.add_argument('-t', '--type', help='Check type: either `Host` (default) or `Service`', default="Host") + parser.add_argument('-H', '--hostname', help='Hostname (FQDN) or IP address as seen in Icinga.', required=True) + parser.add_argument('-D', '--display-name', help='Display Name of Host as seen in Icinga.', required=True) + parser.add_argument('-N', '--service-name', help='Service name as seen in Icinga.') + parser.add_argument('-d', '--details', '--description', help='Check description/details', required=True) + parser.add_argument('-s', '--status', help='Check status: WARN, CRIT, UNKNOWN', required=True) + parser.add_argument('-c', '--customer', help='Customer user for which to create ticket in OTRS', required=True) + + parser.add_argument('-P', '--priority', help='OTRS ticket priority. Defaults to `{priority}`'.format(**d_args), + default=d_args['priority']) + parser.add_argument('-O', '--owner', help='OTRS ticket owner. Defaults to `{owner}`'.format(**d_args), + default=d_args['owner']) + parser.add_argument('-S', '--state', help='OTRS ticket state. Defaults to `{state}`'.format(**d_args), + default=d_args['state']) + parser.add_argument('-Q', '--queue', help='OTRS ticket queue. Defaults to `{queue}`'.format(**d_args), + default=d_args['queue']) + parser.add_argument('-T', '--time', + help='Time in minutes to book into new ticket in OTRS. Defaults to `{time}`'.format(**d_args), + type=int, default=d_args['time']) + + parser.add_argument('--no-agent-notify', help="Whether to notify the agent about new ticket.", action='store_true') + + # run main with parsed arguments + main(parser.parse_args())