diff --git a/wiki/macro/MonitStatus.py b/wiki/macro/MonitStatus.py index d41411d7..15f620b2 100644 --- a/wiki/macro/MonitStatus.py +++ b/wiki/macro/MonitStatus.py @@ -9,7 +9,10 @@ La macro wiki est : [[MonitStatus(hotes=host,categories=[All|Process|File],services=[All|Off|On])]] Exemple : - [[MonitStatus(hotes=egon,categories=All,services=Off) + [[MonitStatus(All|Off|service@host) + +TODO : + Vérifier que monit tourne sur les hotes """ statusfolder = '/usr/scripts/monit/status' @@ -41,13 +44,20 @@ def HostStatus (host) : # création d'un nouveau service s = line.split(' ')[1][1:-1] t = line.split(' ')[0] + # ajout du type s'il n'est pas dedans if not status.has_key(t) : status[t] = {} status[t][s] = {} - else : + else : # on ajoute les données status[t][s][line[:34].strip()] = line[34:].strip() + # on supprime les données system + try : + status.pop('System') + except : + pass + return status def AllStatus () : @@ -59,50 +69,45 @@ def AllStatus () : status[host] = HostStatus(host) return status -def StatusTri(status,filtre) : +def AllStatusOff () : """ - Applique le filtre issu de la macro sur la liste des statuts + Retourne status avec juste les services off """ - # découpage de la chaine de filtre - newfilter = {'hotes':['All'],'categories':['All'],'services':['All']} - - for f in filtre.split(',') : - if f : - newfilter[f.split('=')[0]] = f.split('=')[1].split('|') + status = AllStatus() for h in status.keys() : - # faut-il supprimer l'hote ? - if not 'All' in newfilter['hotes'] and not h in newfilter['hotes'] : - status.pop(h) - continue - # on supprime les types for t in status[h].keys() : - # faut-il supprimer le type ? - if ( not 'All' in newfilter['categories'] and not t in newfilter['categories'] ) or t == 'System' : - status[h].pop(t) - continue - # on supprime les services for s in status[h][t].keys() : - if 'Off' in newfilter['services'] and status[h][t][s]['status'] in ['running','accessible'] : + + # on supprime un status s'il est Up + if status[h][t][s]['status'] in ['running','accessible'] : status[h][t].pop(s) - + # reste-t-il des services dans le groupe if not status[h][t] : status[h].pop(t) - + # reste-t-il des groupes dans l'hote if not status[h] : status.pop(h) - + return status def FormatService(Type, Service, Data, f) : + """ + Retourne le code HTML d'un sercice + Type : type de service + Service : Nom du service + Data : dictionnaire contenant toutes les données Data[info] + f : formatter + """ + result = '' result += f.table_row(1) - result += f.table_cell(1,{'style':'background-color:#C0C0FF'}) + result += f.table_cell(1,{'style':'background-color:silver'}) if Type == 'Device' : Service = Service[2:] elif Type == 'File' : @@ -112,15 +117,22 @@ def FormatService(Type, Service, Data, f) : result += f.strong(0) result += f.table_cell(0) if Data['status'] in ['running','accessible'] : - result += f.table_cell(1,{'style':'background-color:#80FF80'}) + result += f.table_cell(1,{'style':'background-color:lime'}) else : - result += f.table_cell(1,{'style':'background-color:#FF8080'}) + result += f.table_cell(1,{'style':'background-color:red'}) result += f.text(Data['status']) result += f.table_cell(0) result += f.table_row(0) return result def FormatType(Type, Data, f) : + """ + Retourne le code HTML d'une liste de services + Host : nom de l'hote + Data : dictionnaire contenant toutes les données Data[service][info] + f : formatter + """ + result = '' # titre @@ -137,6 +149,13 @@ def FormatType(Type, Data, f) : return result def FormatHost (Host, Data, f) : + """ + Retourne le code HTML d'un hôte + Host : nom de l'hote + Data : dictionnaire contenant toutes les données Data[type][service][info] + f : formatter + """ + result = '' # titre @@ -150,6 +169,7 @@ def FormatHost (Host, Data, f) : result += f.table_cell(1,{'valign':'top'}) result += FormatType(t,Data[t],f) result += f.table_cell(0) + result += f.table_row(0) result += f.table(0) @@ -157,8 +177,11 @@ def FormatHost (Host, Data, f) : def FormatHosts(Data, f) : """ - Retourne le code wiki d'un status + Retourne le code HTML de tous les hotes fournis + Data : dictionnaire contenant toutes les données Data[hote][type][service][info] + f : formatter """ + result = '' for h in Data.keys() : @@ -166,13 +189,80 @@ def FormatHosts(Data, f) : return result -def execute(macro, filtre) : - - if not filtre : - filtre = '' - - status = AllStatus() - status = StatusTri(status,filtre) - code = FormatHosts(status, macro.formatter) - +def Cellule(texte, couleur, f) : + """ + Retourne le code HTML d'une cellule formattée aver le formatter f + """ + code = f.table(1) + code += f.table_row(1) + code += f.table_cell(1,{'style':'background-color:%s' % couleur }) + code += f.text(texte) + code += f.table_cell(0) + code += f.table_row(0) + code += f.table(0) return code + +def execute(macro, filtre) : + """ + Corps principal de la macro + """ + f = macro.formatter + + # on met en forme le filtre + if not filtre : + filtre = 'all' + else : + filtre = filtre.lower() + + if filtre == 'off' : + # tous les services off + status = AllStatusOff() + if status : + return FormatHosts(status, f) + else : + # aucun service off, on affiche OK + code = f.table(1) + code += f.table_row(1) + code += f.table_cell(1,{'style':'background-color:lime'}) + code += f.text(u'Tous les services semblent opérationels') + code += f.table_cell(0) + code += f.table_row(0) + code += f.table(0) + return code + + elif filtre == 'all' : + # tous les services + status = AllStatus() + return FormatHosts(status, f) + + elif '@' in filtre : + # affichage d'un service simple + + host = filtre.split('@')[1] + service = filtre.split('@')[0] + status = HostStatus(host) + + # recherche du service dans la config + s = {} + for t in status.keys() : + if service in status[t].keys() : + s = status[t][service] + + if not s : + # service non trouvé + code = f.table_cell(0) + code += f.table_cell(1,{'style':'background-color:yellow'}) + code += f.text(u'Service introuvable') + return code + + # création de la chaine de retour + code = f.table_cell(0) + if s['status'] in ['running','accessible'] : + code += f.table_cell(1,{'style':'background-color:lime'}) + else : + code += f.table_cell(1,{'style':'background-color:red'}) + code += f.text(s['status']) + return code + + else : + return Cellule('Erreur de filtre','yellow',f)