diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index df969fde..33db67f7 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -31,6 +31,8 @@ from time import sleep,localtime import ldap_secret +random.seed() # On initialise le générateur aléatoire + ################################################################################## ### Différent services redémarrables #dns, dhcp, firewall, bornes_wifi(nom_borne), conf_wifi, bl_carte_etudiant, switch(chbre) @@ -1716,6 +1718,7 @@ class machine(base_classes_crans) : raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.') if ip=='' : + pool_ip = [] # Pool d'IP à tester for ne in net : ip = ne.split('/')[0] ip = ip.split('.') @@ -1728,19 +1731,25 @@ class machine(base_classes_crans) : else : n[2] += 1 n[3] = 0 - if n[2]==255 : raise RuntimeError(u'Impossible de trouver une IP libre.') - ip = "%d.%d.%d.%d" % tuple(n) + if n[2]==255 : break + ip = "%d.%d.%d.%d" % tuple(n) + if not iptools.AddrInNet(ip,ne): + # On est allé trop loin + break + pool_ip.append(ip) + + # On va prendre choisir une IP au hasard dans le pool des IP dispo + random.shuffle(pool_ip) + while len(pool_ip) > 0: + ip = pool_ip.pop() # On choisit une IP if not self.exist('ipHostNumber=%s' % ip) : # On a trouvé la première ip libre break - - # Test final - if not iptools.AddrInNet(ip,ne) : - # Rien dans ce sous réseau - ip = '' - else : - break - + + if ip: + # On a trouvé une IP + break + if ip =='' : raise RuntimeError(u'Plus d\'IP libres dans %s.' % string.join(net,' et ') )