diff --git a/gestion/menage/TODO b/gestion/menage/TODO new file mode 100644 index 00000000..190e572b --- /dev/null +++ b/gestion/menage/TODO @@ -0,0 +1,2 @@ +Mettre ici tous les scripts relatifs au nettoyage de la base de données. +(vieilles machines inutilisés, vieux comptes, chambres invalides, etc) diff --git a/gestion/menage/old_wifi_machines.py b/gestion/menage/old_wifi_machines.py new file mode 100755 index 00000000..ff6d763f --- /dev/null +++ b/gestion/menage/old_wifi_machines.py @@ -0,0 +1,87 @@ +#!/bin/bash /usr/scripts/python.sh +# -*- coding: utf-8 -*- + +"""Efface les machines wifi pas vues dans les logs depuis un certain temps. +Par effacement, on veut dire ici qu'on réalloue le rid""" + +import re +import subprocess +import datetime +import os + +from lc_ldap.shortcuts import lc_ldap_admin +from lc_ldap.crans_utils import format_mac + +MAC = re.compile('[\-:]'.join('[a-f0-9]{2}' for _ in xrange(6)), re.IGNORECASE) +FILTER = u'(&(objectClass=machineWifi)(ipHostNumber=*))' + +def get_creation_date(machine): + """Plus vieille ligne d'histo = date de création, en datetime""" + return min(hist.get_datetime() for hist in machine['historique']) + + +def do_cleanup(older): + """Do the actual clean-up, for machines not connected for more than + `older` days""" + ldap = lc_ldap_admin() + + print "Search machines" + machines = ldap.search(FILTER, mode='rw', sizelimit=3000) + + + print "Listing macs ..." + deadline = datetime.datetime.now() - datetime.timedelta(days=older) + def is_old(machine): + """Est-ce une machine créée il y a un moment déjà ? On ne garde + que celles-ci""" + return get_creation_date(machine) < deadline + macs = set(machine['macAddress'][0].value for machine in machines \ + if is_old(machine)) + print "%d macs to test" % len(macs) + + for filename in file_list(older): + print "Parsing %s" % filename + mac_seen = set(macs_in_file(filename)) + print " Diff ..." + macs.difference_update(mac_seen) + + print "Will reset %d macs" % len(macs) + + print "Continue ? (^C to stop)" + raw_input() + for machine in machines: + if machine['macAddress'][0].value in macs: + reset_ip(machine) + +def reset_ip(machine): + """Retire l'ip (et le rid) d'une machine""" + print "Resetting ip for %r" % machine + with machine: + machine['rid'] = [] + machine['ipHostNumber'] = [] + machine.history_gen() + machine.save() + +def macs_in_file(filename): + """Itérateur des macs dans `filename`""" + if not os.path.exists(filename): + raise Exception(u"le fichier %r n'existe pas, êtes-vous sur le bon" + + "serveur ?" % filename) + if filename.endswith('.gz'): + cat = 'zcat' + else: + cat = 'cat' + proc = subprocess.Popen([cat, filename], stdout=subprocess.PIPE) + for line in proc.stdout.readlines(): + for mac in MAC.findall(line): + yield format_mac(mac) + +def file_list(num): + """Itérateur des noms de fichiers à parser, pour les n derniers jours""" + base = '/var/log/wifi/global.log' + if num > 0: + yield base + for last in xrange(1, num): + yield "%s.%d.gz" % (base, last) + +do_cleanup(31*3)