From f99889622e19023936e38b638227c6e6241287dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Poulain?= Date: Sun, 23 Aug 2020 18:01:53 +0200 Subject: [PATCH] feat(posts): simplifie les ack et recheck : match sur le nom du service ou de l hote --- icingabot.py | 95 ++++++++++++++++------------------------------------ 1 file changed, 28 insertions(+), 67 deletions(-) diff --git a/icingabot.py b/icingabot.py index 8a09503..a725396 100755 --- a/icingabot.py +++ b/icingabot.py @@ -35,9 +35,9 @@ Requirements: python3-irc python3-requests The known commands are: """ commands = { - "ack": {"help": "Acknowledge a given service."}, + "ack": {"help": "Acknowledge all services matching the query."}, "recheck": { - "help": "Recheck a given service or all services.", + "help": "Recheck all services matching the query.", "synonyms": [r"refresh"], }, "list": {"help": "List all KO services.", "synonyms": [r"lsit", r"lits"]}, @@ -135,84 +135,45 @@ class Icinga2ServiceManager: ] self.ko_services = new_ko_services return (lost, news) - except Exception: - self.send("Unable to fetch from Icinga2") + except Exception as e: + self.send("Unable to fetch from Icinga2: {}".format(e)) return (False, False) - def ack_service(self, srv, comment, nick): - # weird but needed: - if comment == "": - comment = " " - # /weird + def post_on_services(self, pattern, uri, data={}): headers = { "Accept": "application/json", "X-HTTP-Method-Override": "POST", } - data = { - "author": nick, - "comment": comment, - } params = { "type": "Service", - "filter": ( - 'service.__name=="{}"'.format(srv) - if srv is not None - else "service.state!=ServiceOK" - ), + "filter": "service.state!=ServiceOK" } + if pattern: + params['filter'] += '&& match("*{}*", service.__name)'.format(pattern) try: r = requests.post( - self.build_request_url( - "/v1/actions/acknowledge-problem", params=params - ), + self.build_request_url(uri, params=params), headers=headers, auth=(settings["icinga2user"], settings["icinga2pass"]), data=json.dumps(data), verify=settings["icinga2ca"], ) - if r.status_code == 200: - for a in r.json()["results"]: - if a["code"] == 200.0: - self.send(a["status"]) - if srv is not None and not r.json()["results"]: - self.send("No result for service name « {} »".format(srv)) - else: - self.send("{} for service name « {} »".format(r.text, srv)) - except Exception: - self.send("Unable to post to Icinga2") + for a in r.json()["results"]: + self.send(a["status"]) + if pattern is not None and not r.json()["results"]: + self.send("No matching service for « {} »".format(pattern)) + except Exception as e: + self.send("Unable to post to Icinga2: {}".format(e)) - def recheck_service(self, srv): - headers = { - "Accept": "application/json", - "X-HTTP-Method-Override": "POST", + def ack_service(self, pattern, comment, nick): + data = { + "author": nick, + "comment": comment or " ", # never "" ! } - params = { - "type": "Service", - "filter": ( - 'service.__name=="{}"'.format(srv) - if srv is not None - else "service.state!=ServiceOK" - ), - } - try: - r = requests.post( - self.build_request_url( - "/v1/actions/reschedule-check", params=params - ), - headers=headers, - auth=(settings["icinga2user"], settings["icinga2pass"]), - verify=settings["icinga2ca"], - ) - if r.status_code == 200: - for a in r.json()["results"]: - if a["code"] == 200.0: - self.send(a["status"]) - if srv is not None and not r.json()["results"]: - self.send("No result for service name « {} »".format(srv)) - else: - self.send("{} for service name « {} »".format(r.text, srv)) - except Exception: - self.send("Unable to post to Icinga2") + self.post_on_services(pattern, '/v1/actions/acknowledge-problem', data) + + def recheck_service(self, pattern): + self.post_on_services(pattern, '/v1/actions/reschedule-check') class IcingaBot(Icinga2ServiceManager, irc.bot.SingleServerIRCBot): @@ -356,16 +317,16 @@ class IcingaBot(Icinga2ServiceManager, irc.bot.SingleServerIRCBot): def do_ack(self, c, e): if self.args is None: self.send( - e.source.nick + ": usage: !ack [: comment]" + e.source.nick + ": usage: !ack [: comment]" ) return tokens = self.args.split(":", 1) - srv, comment = tokens[0].strip(), "" + pattern, comment = tokens[0].strip(), "" if len(tokens) > 1: comment = tokens[1].strip() - if srv == "all": - srv = None - self.ack_service(srv, comment, e.source.nick) + if pattern == "all": + pattern = None + self.ack_service(pattern, comment, e.source.nick) def do_recheck(self, c, e): if self.args == "all":