Lorsque l'on supprimait une machine, l'ip n'tait plus dans la base ldap,

donc il tait impossible de retrouver l'adhrent et de construire class_id
Donc on recherche plutot la rgle iptables avec l'ip donne en entre et on
retravaille la rgle pour rcuprer les lments pour la suppression.

darcs-hash:20060425072920-72cb0-8996b3ea9eec6ae66d0fc8514588afbe56590202.gz
This commit is contained in:
salles 2006-04-25 09:29:20 +02:00
parent e3a6cbd9ff
commit 7faa5714e5

View file

@ -603,7 +603,7 @@ class firewall_komaz(firewall_crans) :
iptables("-I FORWARD -m mark --mark %s -j ACCEPT" % conf_fw.mark['proxy'])
print OK
def classes_p2p_maj(self,ip_list) :
def classes_p2p_maj(self, ip_list) :
""" Mise à jour de la classification pour les ip fournies
On ne crée que les règles iptables pour classer les paquets, les
classes correspondantes ne sont à créer que toutes à la fois """
@ -613,21 +613,6 @@ class firewall_komaz(firewall_crans) :
print OK + ' (rien à faire)'
return
maj = {}
for ip in ip_list :
machine = db.search('ip=%s'% ip)['machine']
if not machine :
# Suppression de la règle associée à la machine
maj[machine[0]] = '-'
elif len(machine) == 1 :
# Ajout de la machine
maj[machine[0]] = '+'
else :
print WARNING
if debug :
sys.stderr.write("Plusieurs machines avec l'IP %s\n" % ip)
print OK
## Traitement
@ -636,17 +621,27 @@ class firewall_komaz(firewall_crans) :
self.anim = anim('\tMise à jour des classes p2p')
warn = ''
try :
for machine in maj.keys() :
adherent = machine.proprietaire()
ip = machine.ip()
subnet = ip.split('.')[2]
class_id = int(adherent.id())+1 # On ne peut pas reprendre le numéro 1
if maj[machine] == '+' :
# Il faut ajouter cette entrée
option = '-A'
else :
for ip in ip_list :
recherche = db.search('ip=%s'% ip)['machine']
if not recherche :
# Il faut supprimer cette entrée
option = '-D'
subnet = ip.split('.')[2]
regles = iptables("-t mangle -L SUBNET-%s_24 -n | grep %s" % (subnet, ip)).split('\n')
# On sélectionne la première qui doit contenir ce que l'on veut
regle = regles[0].split()
mark = regle[7]
class_id = regle[10].split(':')[1]
elif len(recherche) == 1 :
# Il faut ajouter cette entrée
option = '-A'
machine = recherche[0]
adherent = machine.proprietaire()
ip = machine.ip()
subnet = ip.split('.')[2]
class_id = int(adherent.id())+1 # On ne peut pas reprendre le numéro 1
else :
warn += "Plusieurs machines avec l'IP %s\n" % ip
iptables("-t mangle %s SUBNET-%s_24 -o ens -s %s -m mark " % (option, subnet, ip) +
"--mark %s -j CLASSIFY --set-class 1:%s" % (conf_fw.mark['bittorrent'], class_id))
iptables("-t mangle %s SUBNET-%s_24 -o crans -d %s -m mark " % (option, subnet, ip) +
@ -844,7 +839,7 @@ class firewall_komaz(firewall_crans) :
# Recherche sur le champ ablacklist (clubs compris)
search = db.search('ablacklist=*&paiement=%s' % ann_scol)
self.anim = anim("\tBlackliste machines", len(search['adherent']+search['club']))
self.anim = anim("\tBlackliste adhérents+clubs", len(search['adherent']+search['club']))
for entite in search['adherent'] + search['club']:
self.anim.cycle()
sanctions = entite.blacklist_actif()
@ -857,7 +852,7 @@ class firewall_komaz(firewall_crans) :
# Recherche sur le champ mblacklist
search = db.search('mblacklist=*&paiement=%s' % ann_scol)
self.anim = anim("\tBlackliste adhérents", len(search['machine']))
self.anim = anim("\tBlackliste machines", len(search['machine']))
for entite in search['machine']:
self.anim.cycle()
sanctions = entite.blacklist_actif()
@ -1090,7 +1085,7 @@ if __name__ == '__main__' :
fw = eval('firewall_%s()' % hostname)
chaines = []
for nom in dir(fw) :
if nom in [ 'log_chaines' , 'test_virus_flood', 'reseaux_non_routables', 'test_mac_ip' , 'blacklist' , 'ext_vers_serveurs' , 'serveurs_vers_ext', 'ext_vers_crans', 'crans_vers_ext' , 'filtre_p2p', 'admin_vlan' , 'serv_out_adm', 'mangle_table' ] :
if nom in [ 'log_chaines' , 'test_virus_flood', 'reseaux_non_routables', 'test_mac_ip' , 'blacklist' , 'ext_vers_serveurs' , 'serveurs_vers_ext', 'ext_vers_crans', 'crans_vers_ext' , 'filtre_p2p', 'admin_vlan' , 'serv_out_adm', 'mangle_table', 'classes_p2p_maj' ] :
chaines.append(nom)
def __usage(txt=None) :