diff --git a/gestion/gen_confs/firewall.py b/gestion/gen_confs/firewall.py index c6905728..66bccec8 100755 --- a/gestion/gen_confs/firewall.py +++ b/gestion/gen_confs/firewall.py @@ -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) :