From 78b4e65e5af0e85130b20ff17ef6ad4f0ec63cf5 Mon Sep 17 00:00:00 2001 From: Lucas Serrano Date: Sat, 16 Nov 2013 23:26:33 +0100 Subject: [PATCH] [printer_watch] On rend le script stateful --- .gitignore | 3 +++ impression/printer_watch.py | 54 +++++++++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 6b67b4cd..40f28613 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ secours/etat_* # Fichier de son pour asterisk sip/sound/ + +#Fichier de dernier statut de l'imprimante +impression/printer_watch_status.json diff --git a/impression/printer_watch.py b/impression/printer_watch.py index 77e81e27..45afb28f 100755 --- a/impression/printer_watch.py +++ b/impression/printer_watch.py @@ -2,17 +2,61 @@ # -*- coding: utf-8 -*- import netsnmp -import sys from utils import sendmail +from time import time +import json +from md5 import md5 -# On checke le statut de l'imprimante, si elle est down (5) on envoie des mails. +successfuly_imported = False +try: + with open("printer_watch_status.json", "r") as to_load: + extracted_dict = json.load(to_load) + try: + last_status = extracted_dict[u"last_status"] + message_id = extracted_dict[u"message_id"] + successfuly_imported = True + except (KeyError, ValueError): + pass +except (IOError, ValueError, TypeError): + pass + +# On check le statut de l'imprimante status_id = netsnmp.Varbind("hrDeviceStatus.1") -if netsnmp.snmpget(status_id, Version=1, DestHost="imprimante.adm", Community="public") == ('5',): +status = netsnmp.snmpget(status_id, Version=1, DestHost="imprimante.adm", Community="public") + +if status == ('5',) and (not successfuly_imported or successfuly_imported and last_status == '2'): + """ + Cas 1: L'imprimante est down et soit elle était précédemment fonctionnelle ou son statut précédent est inconnu. + On envoie un mail pour signaler qu'elle est down. + """ + # On récolte la liste des erreurs dans cette branche errors = netsnmp.snmpwalk(netsnmp.Varbind("mib-2.43.18.1.1.8.1"), Version=1, DestHost="imprimante.adm", Community="public") errors_list = [error + '\n' for error in errors] - + + #On crée un joli message d'erreur contenant la liste des erreurs msg = """ L'imprimante est actuellement hors service. Les erreurs suivantes se sont produites: %s""" % ''.join(errors_list) + + #On crée un Message-ID + message_id = md5(str(time())).hexdigest() + "@imprimante.adm.crans.org" - sendmail.sendmail(u"imprimante.adm@crans.org", u"impression@lists.crans.org", u"Imprimante hors service", msg, more_headers={"X-Mailer": "/usr/scripts/impression/printer_watch.py"}) + sendmail.sendmail(u"imprimante.adm@crans.org", u"impression@lists.crans.org", u"Imprimante hors service", msg, more_headers={"X-Mailer": "/usr/scripts/impression/printer_watch.py", "Message-ID": message_id}) + + +elif status == ('2',) and successfuly_imported and last_status == '5': + """ + Cas 2: L'imprimante est fonctionnelle après une panne. + On envoi un mail pour signaler que ce n'est plus la peine de se déplacer. + """ + + msg = " L'imprimante est de nouveau fonctionnelle \o/" + + sendmail.sendmail(u"imprimante.adm@crans.org", u"impression@lists.crans.org", u"Imprimante fonctionnelle", msg, more_headers={"X-Mailer": "/usr/scripts/impression/printer_watch.py", "In-Reply-To": message_id}) + message_id = None + +else: + message_id = None + +with open("printer_watch_status.json", "w") as dump_file: + json.dump({u"last_status": status[0], u"message_id": message_id}, dump_file) -- GitLab