diff --git a/gestion/wifi-update.py b/gestion/wifi-update.py index 3997c7c2..55032904 100755 --- a/gestion/wifi-update.py +++ b/gestion/wifi-update.py @@ -37,13 +37,14 @@ # TODO: meilleure gestion des erreurs +import commands,re + # On utilise twisted # http://twistedmatrix.com/documents/current/howto/tutorial/intro from twisted.internet import protocol, reactor, defer, utils from twisted.internet.ssl import ContextFactory from twisted.protocols import basic from twisted.application import internet, service -from twisted.names import client from twisted.python import log import sys, resource @@ -143,10 +144,7 @@ class UpdateFactory(protocol.ServerFactory): def reset_host(self, host): # ETAPE 1 # On commence par résoudre "host". - d = client.lookupPointer("%s.in-addr.arpa" % '.'.join(host.split('.')[::-1])) - d.addCallback(lambda (ans, auth, add), _ : reset_del(self, ans[0].payload.name), - lambda _: reset_del(self, "unknown")) - return d + return defer.succeed(reset_del(self, RE.get_reverse(host))) def reset_del(self, host): # ETAPE 2 @@ -200,11 +198,7 @@ class UpdateFactory(protocol.ServerFactory): def getSAD_host(self, getre, delre, host): # ETAPE 1 # On commence par résoudre "host". - d = client.lookupPointer("%s.in-addr.arpa" % '.'.join(host.split('.')[::-1])) - d.addCallback(lambda (ans, auth, add), _ : getSAD_lock(self, getre, delre, - ans[0].payload.name), - lambda _: getSAD_lock(self, getre, delre, "unknown")) - return d + return getSAD_lock(self, getre, delre, RE.get_reverse(host)) def getSAD_lock(self, getre, delre, host): # ETAPE 2 @@ -263,7 +257,7 @@ class UpdateFactory(protocol.ServerFactory): remove_lock('gen_confs.wifi') if len(result) > 5: - print "We send the following script :" + print "We send the following script to %s :" % host print result return result @@ -274,6 +268,40 @@ class UpdateFactory(protocol.ServerFactory): # Corps du programme +class ReverseEngine: + + import time + + def __init__(self): + self.iphost = None + self.lastupdate = 0 + + def get_reverse(self,ip): + + def build_reverse(server="138.231.136.6"): + """Construit une correspondance IP -> nom""" + pattern = re.compile("^(.*).in-addr.arpa domain name pointer (.*)\.") + result = {} + for line in commands.getoutput("host -l 148.231.138.in-addr.arpa %s" % server).split("\n"): + mo = pattern.match(line.strip()) + if mo: + ip = ".".join(mo.group(1).split(".")[::-1]) + result[ip] = mo.group(2) + return result + + current = time.time() + if not self.iphost or current - self.lastupdate > 60: + self.iphost = build_reverse() + self.lastupdate = current + + if ip not in self.iphost: + return "unknown" + else: + return self.iphost[ip] + +RE = ReverseEngine() + + # On augmente la limite soft (qui semble arreter python). # Sous Open, on peut utiliser fstat pour voir les fichiers ouverts. # On a besoin de 3 * nombre de bornes pour le nombre de descripteurs