#!/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)