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:
parent
5c103abe57
commit
91158d811f
1 changed files with 36 additions and 21 deletions
|
@ -650,18 +650,22 @@ class firewall_komaz(firewall_crans) :
|
||||||
|
|
||||||
print OK
|
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
|
## Traitement
|
||||||
# MAJ des règles de classification de l'IP
|
# MAJ des règles de classification de l'IP
|
||||||
def procedure():
|
def procedure():
|
||||||
self.anim = anim('\tMise à jour des classes p2p')
|
self.anim = anim('\tMise à jour des classes p2p')
|
||||||
|
|
||||||
|
# Liste des classes candidates a la suppression
|
||||||
|
scheduled_del = []
|
||||||
warn = ''
|
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:
|
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue