diff --git a/gestion/gen_confs/firewall.py b/gestion/gen_confs/firewall.py index 2a6a1415..ef545e50 100755 --- a/gestion/gen_confs/firewall.py +++ b/gestion/gen_confs/firewall.py @@ -650,18 +650,22 @@ class firewall_komaz(firewall_crans) : print OK - # Parametres pour iptables/tc - mark = conf_fw.mark['bittorrent'] - debit_adh = p2p.debit_adh - debit_max = p2p.debit_max - eth_ext = self.eth_ext - eth_int = self.eth_int - ## Traitement # MAJ des règles de classification de l'IP def procedure(): self.anim = anim('\tMise à jour des classes p2p') + + # Liste des classes candidates a la suppression + scheduled_del = [] warn = '' + + # Parametres pour iptables/tc + mark = conf_fw.mark['bittorrent'] + debit_adh = p2p.debit_adh + debit_max = p2p.debit_max + eth_ext = self.eth_ext + eth_int = self.eth_int + try: for ip in ip_list: recherche = db.search('ip=%s&paiement=ok' % ip) @@ -673,34 +677,43 @@ class firewall_komaz(firewall_crans) : if not machines: # Il faut supprimer cette entrée iptables_option = '-D' - tc_option = 'del' subnet = IpSubnet(ip, conf_fw.mask[-1]) - regles = iptables("-t mangle -L SUBNET-%(subnet)s -n | tee `tempfile -s _firewall`date -u +%y%m%d%H%M%S`` | grep %(ip)s" % locals()).split('\n') + regles = iptables("-t mangle -L SUBNET-%(subnet)s -n | " + "tee `tempfile -s _firewall`date -u +%y%m%d%H%M%S``" + "| grep %(ip)s" % locals()).split('\n') # On sélectionne la première qui doit contenir ce que l'on veut regle = regles[0].split() class_id = int(regle[7].split(':')[1]) + # On marque la classe comme candidate a la suppression + scheduled_del.append(class_id) elif len(machines) == 1: # Il faut ajouter cette entrée iptables_option = '-A' - tc_option = 'add' machine = machines[0] adherent = machine.proprietaire() ip = machine.ip() subnet = IpSubnet(ip, conf_fw.mask[-1]) # On ne peut pas reprendre le numéro 1 class_id = int(adherent.id()) + 1 + # On cree la classe et la qdisc s'il elles n'existent pas deja + qdisc_id = class_id + 5000 + try: + for interface in [eth_ext, eth_int]: + tc("class add dev %(interface)s " + "parent 1:1 classid 1:%(class_id)d htb " + "rate %(debit_adh)s ceil %(debit_max)s" % locals()) + tc("qdisc add dev %(interface)s " + "parent 1:%(class_id)d handle %(qdisc_id)d: " + "sfq perturb 10" % locals()) + except TcError, e: + if "File exists" in e.output: + # La classe existe deja + pass + else: + raise e else: warn += "Plusieurs machines avec l'IP %s\n" % ip # Il nous faut un n° inférieur à 9998 unique - qdisc_id = class_id + 5000 - for interface in [eth_ext, eth_int]: - if tc_option: - tc("class %(tc_option)s dev %(interface)s " - "parent 1:1 classid 1:%(class_id)d htb " - "rate %(debit_adh)s ceil %(debit_max)s" % locals()) - tc("qdisc %(tc_option)s dev %(interface)s " - "parent 1:%(class_id)d handle %(qdisc_id)d: " - "sfq perturb 10" % locals()) iptables("-t mangle %(iptables_option)s SUBNET-%(subnet)s " "-o %(eth_int)s -d %(ip)s -m mark --mark %(mark)s " "-j CLASSIFY --set-class 1:%(class_id)s" % locals()) @@ -709,8 +722,10 @@ class firewall_komaz(firewall_crans) : "-j CLASSIFY --set-class 1:%(class_id)s" % locals()) except IptablesError, c: warn += str(c) + '\n' - except KeyError: - print OK + + for class_id in scheduled_del: + # TODO: supprimer les classes qui sont vraiment vides + pass if warn: print WARNING