87 lines
2.7 KiB
Python
Executable file
87 lines
2.7 KiB
Python
Executable file
#!/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*2)
|