diff --git a/bcfg2/statistics-summary.py b/bcfg2/statistics-summary.py index 51973c12..b3f170a3 100644 --- a/bcfg2/statistics-summary.py +++ b/bcfg2/statistics-summary.py @@ -133,21 +133,119 @@ def processHost(node, ignore): lines.append('') - return (time.time()-float(stamp.getAttribute('start')) > daysold * 24*60*60, - state, lines) + return (time.time() - curtime > daysold * 24 * 60 * 60, state, lines) +def deleteHosts(hostslist, writeback): + """Supprime les hôtes de la liste hostslist du fichier de statistiques. + Si hostslist évalue à False, demande une confirmation puis supprime + tous les hôtes vieux.""" + doc = xml.dom.minidom.parse(statsfile) + hoststodel = [] + for node in doc.getElementsByTagName('Node'): + if not hostslist: + # On sélectionne les hôtes vieux + stamps = node.getElementsByTagName('OpStamps') + curtime = 0 + for stamp in stamps: + if float(stamp.getAttribute('start')) > curtime: + curtime = float(stamp.getAttribute('start')) + if time.time() - curtime > daysold * 24 * 60 * 60: + hoststodel.append(node) + else: + # On sélectionne les hôtes donnés en argument + if node.getAttribute('name') in hostslist: + hoststodel.append(node) + + # Suppression des hôtes dans le schéma XML + for node in hoststodel: + print u'Suppression de l\'hôte : %s' % node.getAttribute('name') + node.parentNode.removeChild(node) + + if hoststodel: + if writeback: + # Enregistrement des données dans le fichier + print u'Arrêt de bcfg2-server ...' + if os.system('/etc/init.d/bcfg2-server stop'): + print u'Erreur !' + print u'Sauvegarde ...' + doc.writexml(open(statsfile, 'w')) + print u'Redémarrage de bcfg2-server ...' + if os.system('/etc/init.d/bcfg2-server start'): + print u'Erreur !' + else: + print u'Utilisez l\'option -w en tant que root pour enregistrer.' + else: + print u'Aucun hôte à supprimer !' + + +def genStats(ignore): + """Génère les statistiques, en ignorant les éléments de la + liste ignore.""" + # On traite le fichier de statistiques + doc = xml.dom.minidom.parse(statsfile) + + oldlines = [] + finallines = [u'', u'*** Clean hosts (or with ignored dirtyness) :'] + + oldnb = 0 + badnb = 0 + goodnb = 0 + + # On récupère les informations des différents hôtes + for curnode in doc.getElementsByTagName('Node'): + (isold, state, hostlines) = processHost(curnode, ignore) + if isold: + oldnb += 1 + if state in ['clean', 'ignored']: + oldlines += hostlines + else: + oldlines = hostlines + oldlines + else: + if state in ['clean', 'ignored']: + finallines += hostlines + goodnb += 1 + else: + finallines = hostlines + finallines + badnb += 1 + + # Header + print (u'*** Bcfg2 Statistics on %s, for %d hosts ***' + % (time.strftime("%c"), oldnb + badnb + goodnb)) + print u' * Old hosts : %d' % oldnb + print u' * Bad hosts : %d' % badnb + print u' * Clean hosts : %d' % goodnb + print '' + + # Hôtes vieux + print u'*** Old hosts (more than %s days) :' % daysold + for line in oldlines: + print line + print '' + + # Hôtes à jour + print u'*** Bad hosts :' + for line in finallines: + print line + if __name__ == '__main__': if '-h' in sys.argv: # Message d'utilisation print u'Outil pour créer un résumé des statistiques de bcfg2.' print u'' - print u'Usage :' - print u' -c ou --no-config pour ignorer les ConfigFiles' - print u' -p ou --no-packages pour ignorer les Packages' - print u' -a ou --no-actions pour ignorer les Actions' - print u' -s ou --no-services pour ignorer les Services' + print u' * Usage :' + print u' * Génération de statistiques :' + print u' -c ou --no-config pour ignorer les ConfigFiles' + print u' -p ou --no-packages pour ignorer les Packages' + print u' -a ou --no-actions pour ignorer les Actions' + print u' -s ou --no-services pour ignorer les Services' + print u'' + print u' * Suppression d\'hôtes des statistiques :' + print u' -d ou --delete seuls pour supprimer tous les hôtes vieux' + print u' -d ou --delete [hôte]... pour supprimer certains hôtes' + print u' -w ou --write pour enregistrer les modifications' + print u' (sinon, ne fait qu\'afficher les hôtes concernés)' else: # Lecture des options ignore = [] @@ -160,38 +258,15 @@ if __name__ == '__main__': if '-s' in sys.argv or '--no-services' in sys.argv: ignore.append('services') - # On traite le fichier de statistiques if os.access(statsfile, os.F_OK): - doc = xml.dom.minidom.parse(statsfile) - - oldlines = [] - finallines = [u'', u'*** Clean hosts (or with ignored dirtyness) :'] - - # On récupère les informations des différents hôtes - for curnode in doc.getElementsByTagName('Node'): - (isold, state, hostlines) = processHost(curnode, ignore) - if isold: - if state in ['clean', 'ignored']: - oldlines += hostlines - else: - oldlines = hostlines + oldlines - else: - if state in ['clean', 'ignored']: - finallines += hostlines - else: - finallines = hostlines + finallines - - # Hôtes vieux - print u'*** Old hosts (more than %s days) :' % daysold - for line in oldlines: - print line - print '' - - # Hôtes à jour - print u'*** Bad hosts :' - for line in finallines: - print line - + if '-d' in sys.argv or '--delete' in sys.argv: + # Mode suppression + deleteHosts([x for x in sys.argv[1:] + if x not in ['-d', '--delete', '-w']], os.getuid() == 0 and + ('-w' in sys.argv or '--write' in sys.argv)) + else: + # Mode génération des statistiques + genStats(ignore) else: print u'Impossible d\'accéder au fichier de statistiques :' print u' %s !' % statsfile