#! /usr/bin/env python # -*- encoding: iso-8859-15 -*- # Gestion en lecture d'un fichier lease (issu du DHCPD d'Open) import re import time class Lease: """Classe représentant un bail (lease).""" def __init__(self, texte): """Instanciation d'un bail L'instanciation se fait en fournissant `texte' qui est la forme textuelle du bail qui se trouve dans /var/db/dhcpd.leases de la forme : lease 10.231.149.89 { starts 3 2005/11/09 07:58:52; ends 3 2005/11/09 08:13:52; hardware ethernet 00:0c:f1:37:54:2c; uid 01:00:0c:f1:37:54:2c; client-hostname "FCDVIRELY"; } """ mo = re.search("\\blease ([0-9\\.]*) \\{", texte) if not mo: raise ValueError, u"Pas de bail trouvé" self.ip = mo.group(1) mo = re.search("\\bstarts [0-7] ([0-9/]* [0-9:]*);", texte) if not mo: raise ValueError, u"Pas de date de début de bail" self.start = time.strptime(mo.group(1), "%Y/%m/%d %H:%M:%S") mo = re.search("\\bends [0-7] ([0-9/]* [0-9:]*);", texte) if not mo: raise ValueError, u"Pas de date de fin de bail" self.end = time.strptime(mo.group(1), "%Y/%m/%d %H:%M:%S") mo = re.search("\\bhardware ethernet ([0-9a-f:]*);", texte) if not mo: raise ValueError, u"Pas d'adresse Ethernet pour le bail" self.mac = mo.group(1) # On n'est pas intéressé par le reste class Leases: """Classe représentant un ensemble de bails.""" def __init__(self, fichier="/var/db/dhcpd.leases"): """Instanciation à partir du fichier de leases.""" self.leases = [] # Méthode rapide : for lease in " ".join(file(fichier).readlines()).split("}")[:-1]: nouveau = Lease(lease) # On enleve les anciens self.leases = filter(lambda x: x.ip != nouveau.ip, self.leases) # On rajoute le nouveau self.leases.append(nouveau)