From 91158d811f99bf73a7a09fd96a720781861014ff Mon Sep 17 00:00:00 2001 From: glondu Date: Sat, 17 Jun 2006 15:27:59 +0200 Subject: [PATCH] Meilleure analyse des cas. On ne supprime pas immdiatement les classes pour grer le cas o il reste des machines l'adhrent. Il reste faire la suppression des classes inutilise (faite aprs le traitement de toutes les IP, pour viter du travail inutile dans le cas d'un simple changement d'IP). darcs-hash:20060617132759-68412-8ce058abb59956f609dae8e935e8d1177dfbbea9.gz --- gestion/gen_confs/firewall.py | 57 ++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 21 deletions(-) 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