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
This commit is contained in:
glondu 2006-06-17 15:27:59 +02:00
parent 5c103abe57
commit 91158d811f

View file

@ -650,6 +650,15 @@ class firewall_komaz(firewall_crans) :
print OK print OK
## 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 # Parametres pour iptables/tc
mark = conf_fw.mark['bittorrent'] mark = conf_fw.mark['bittorrent']
debit_adh = p2p.debit_adh debit_adh = p2p.debit_adh
@ -657,11 +666,6 @@ class firewall_komaz(firewall_crans) :
eth_ext = self.eth_ext eth_ext = self.eth_ext
eth_int = self.eth_int 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')
warn = ''
try: try:
for ip in ip_list: for ip in ip_list:
recherche = db.search('ip=%s&paiement=ok' % ip) recherche = db.search('ip=%s&paiement=ok' % ip)
@ -673,34 +677,43 @@ class firewall_komaz(firewall_crans) :
if not machines: if not machines:
# Il faut supprimer cette entrée # Il faut supprimer cette entrée
iptables_option = '-D' iptables_option = '-D'
tc_option = 'del'
subnet = IpSubnet(ip, conf_fw.mask[-1]) 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 # On sélectionne la première qui doit contenir ce que l'on veut
regle = regles[0].split() regle = regles[0].split()
class_id = int(regle[7].split(':')[1]) 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: elif len(machines) == 1:
# Il faut ajouter cette entrée # Il faut ajouter cette entrée
iptables_option = '-A' iptables_option = '-A'
tc_option = 'add'
machine = machines[0] machine = machines[0]
adherent = machine.proprietaire() adherent = machine.proprietaire()
ip = machine.ip() ip = machine.ip()
subnet = IpSubnet(ip, conf_fw.mask[-1]) subnet = IpSubnet(ip, conf_fw.mask[-1])
# On ne peut pas reprendre le numéro 1 # On ne peut pas reprendre le numéro 1
class_id = int(adherent.id()) + 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: else:
warn += "Plusieurs machines avec l'IP %s\n" % ip warn += "Plusieurs machines avec l'IP %s\n" % ip
# Il nous faut un n° inférieur à 9998 unique # 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 " iptables("-t mangle %(iptables_option)s SUBNET-%(subnet)s "
"-o %(eth_int)s -d %(ip)s -m mark --mark %(mark)s " "-o %(eth_int)s -d %(ip)s -m mark --mark %(mark)s "
"-j CLASSIFY --set-class 1:%(class_id)s" % locals()) "-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()) "-j CLASSIFY --set-class 1:%(class_id)s" % locals())
except IptablesError, c: except IptablesError, c:
warn += str(c) + '\n' 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: if warn:
print WARNING print WARNING