Dplacement de la mthode ipsec.

Il ne faut plus utiliser m.ipsec() pour dterminer si m est une machine
wifi.

darcs-hash:20060313161212-68412-c18bb0100a5d2bc06988d8a19302616405364aca.gz
This commit is contained in:
glondu 2006-03-13 17:12:12 +01:00
parent 9cc6478e4e
commit 858702f0b2
4 changed files with 62 additions and 59 deletions

View file

@ -28,7 +28,8 @@ sys.path.append('/usr/scripts/gestion')
import syslog
import pwd
from lock import *
from ldap_crans import crans_ldap, ann_scol, Machine, crans, invite, hostname
from ldap_crans import crans_ldap, ann_scol, crans, invite, hostname
from ldap_crans import Machine, MachineWifi
from affich_tools import *
from commands import getstatusoutput
from iptools import AddrInNet
@ -223,10 +224,10 @@ class firewall_crans :
insert = '-I'
else:
insert = '-A'
if machine.ipsec():
if isinstance(machine, MachineWifi):
# Machine wifi, c'est la mac de Nectaris
iptables("-t nat %s TEST_MAC-IP -s "%(insert)+\
"%s -m mac --mac-source %s -j ACCEPT"%(ip,self.mac_wifi))
"%s -m mac --mac-source %s -j ACCEPT"%(ip, self.mac_wifi))
else:
# Machine fixe
iptables("-t nat %s TEST_MAC-IP -s "%(insert)+\
@ -322,8 +323,8 @@ class firewall_crans :
# Il faut détruire cette entrée
iptables("-t nat -D TEST_MAC-IP -s %s -m mac --mac-source %s -j ACCEPT" % (ip, mac))
else :
if ( machine.ipsec() and mac!=self.mac_wifi ) \
or ( not machine.ipsec() and mac != machine.mac() ) :
if (isinstance(machine, MachineWifi) and mac != self.mac_wifi) \
or (not isinstance(machine, MachineWifi) and mac != machine.mac()):
# La correspondance MAC-IP est fausse => on ajoute la bonne rčgle
self.__test_mac_ip(machine)
# Supression de l'ancienne ligne

View file

@ -723,6 +723,8 @@ class crans_ldap:
# Croisement
bons_dn = [] # liste des dn d'adhérents qui correspondent aux critères
for i in 'adherent', 'club':
if r[i] == None:
continue
for a in r[i]:
if a[0] in mach_adh and not a[0] in bons_dn:
bons_dn.append(a[0])
@ -731,6 +733,8 @@ class crans_ldap:
# Maintenant c'est au tour des bonnes machines
bons_dn2 = []
for i in 'machineFixe', 'machineWifi':
if r[i] == None:
continue
for a in r[i]:
dn = string.join(a[0].split(',')[-4:], ',')
if dn in bons_dn and not a[0] in bons_dn2:
@ -1270,27 +1274,24 @@ class base_proprietaire(base_classes_crans):
def machines(self):
""" Retourne les machines (instances) appartenant à la classe """
if self.id():
res = []
try:
for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine'):
if r[1].has_key('puissance'):
res.append(BorneWifi(r, self._modifiable, self.conn))
else:
res.append(Machine(r, self._modifiable, self.conn))
return res
except:
return []
else:
return []
res = []
for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, Machine.filtre_idn):
res.append(self.make(r, self._modifiable))
return res
def machines_fixes(self):
""" Retourne les machines fixes appartenant à l'instance """
return filter(lambda x: not x.ipsec(), self.machines())
res = []
for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, 'objectClass=machineFixe'):
res.append(self.make(r, self._modifiable))
return res
def machines_wifi(self):
""" Retourne les machines wifi appartenant à l'instance """
return filter(lambda x: x.ipsec(), self.machines())
res = []
for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, 'objectClass=machineWifi'):
res.append(self.make(r, self._modifiable))
return res
def solde(self, operation=None, comment=None):
""" Retourne ou modifie le solde d'un propriétaire
@ -1426,16 +1427,14 @@ class base_proprietaire(base_classes_crans):
"""
# Note: un peu trop de fonctions pour un club mais ce n'est pas génant
ret =''
ret = ''
if self._init_data:
nouveau =0
nouveau = 0
# Reconfiguration switch si changement de chambre et si machine fixe
if 'chbre' in self.modifs:
for m in self.machines():
if not m.ipsec():
self.services_to_restart('switch',[self._data['chbre'][0]])
self.services_to_restart('switch',[self._init_data.get('chbre','')[0]])
break
if self.machines_fixe():
self.services_to_restart('switch', [self._data['chbre'][0]])
self.services_to_restart('switch', [self._init_data.get('chbre', '')[0]])
else:
nouveau = 1
@ -1466,7 +1465,7 @@ class base_proprietaire(base_classes_crans):
for m in self.machines():
self.services_to_restart('macip',[m.ip()] )
self.services_to_restart('dns')
if m.ipsec():
if isinstance(m, MachineWifi):
self.services_to_restart('conf_wifi_ng')
self.services_to_restart('ragnarok-dhcp')
else:
@ -1478,7 +1477,7 @@ class base_proprietaire(base_classes_crans):
# Verif si machines avec bonnes ip
err = 0
for m in self.machines():
if m.ipsec():
if isinstance(m, MachineWifi):
# Machine Wifi
continue
# Machine fixe
@ -1621,7 +1620,7 @@ class adherent(base_proprietaire):
# N'est pas ou plus sur le campus
# Machine fixe ?
# for m in self.machines():
# if not m.ipsec():
# if not isinstance(m, MachineWifi):
# raise ValueError(u'Un adhérent en dehors du campus ne doit pas avoir de machine fixe.')
self._set('chbre',['EXT'])
@ -2179,7 +2178,7 @@ class Machine(base_classes_crans):
if typ == 'wifi':
# Génération de la clef IPsec
self.ipsec(1)
self.ipsec(True)
else:
raise TypeError(u'Arguments invalides')
@ -2493,26 +2492,6 @@ class Machine(base_classes_crans):
return self.__proprietaire
def ipsec(self, clef=0):
""" Génération (clef=1) ou affichage de la clef IPsec de la machine
Si clef!=1: prend la clef fournie.
"""
if self.__typ != 'wifi': return None
if not clef:
return decode(self._data.get('ipsec',[''])[0])
if clef == 1:
# Génération
clef = ''
for i in range(22):
clef += random.choice(filter(lambda x: x != 'l' and x != 'o', string.lowercase) +
filter(lambda x: x != '1' and x != '0', string.digits))
self._set('ipsec',[clef])
return clef
def save(self):
"""
Enregistre la machine courante dans la base LDAP
@ -2542,7 +2521,7 @@ class Machine(base_classes_crans):
# Clef IPsec
if 'ipsec' in self.modifs:
ret += coul(u'Clef IPsec de la machine : %s\n' % self.ipsec(),'cyan')
ret += coul(u'Clef IPsec de la machine : %s\n' % self.ipsec(), 'cyan')
self.services_to_restart('conf_wifi_ng')
# Reconfiguration firewalls et dhcps
@ -2654,6 +2633,7 @@ class MachineFixe(Machine):
def __init__(self, parent_or_tuple, typ='fixe', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
class MachineWifi(Machine):
""" Classe de définition d'une machine wifi """
objectClass = "machineWifi"
@ -2661,6 +2641,26 @@ class MachineWifi(Machine):
def __init__(self, parent_or_tuple, typ='wifi', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
def ipsec(self, clef=None):
"""
Affichage (clef=None), génération (clef=True) ou définition de la clef IPsec
de la machine. Si clef différent de True et None: prend la clef fournie.
"""
if clef == None:
return decode(self._data.get('ipsec', [''])[0])
if clef == True:
# Génération
clef = ''
for i in range(22):
clef += random.choice(filter(lambda x: x != 'l' and x != 'o', string.lowercase) +
filter(lambda x: x != '1' and x != '0', string.digits))
self._set('ipsec', [clef])
return clef
class MachineCrans(Machine):
""" Classe de définition d'une machine du Crans """
objectClass = "machineCrans"

View file

@ -48,7 +48,8 @@ except:
base = None
from ldap_crans import is_actif, crans_ldap, ann_scol, crans, hostname, BorneWifi
from ldap_crans import is_actif, crans_ldap, ann_scol, crans, hostname
from ldap_crans import MachineWifi, BorneWifi
from affich_tools import *
import user_tests
import popen2, commands
@ -132,7 +133,7 @@ def adhers_brief(adhers) :
for machine in a.machines() :
nom = machine.nom().split('.')[0]
if machine.blacklist_actif() : k = 'rouge'
elif machine.ipsec() : k = 'cyan'
elif isinstance(machine, MachineWifi): k = 'cyan'
else : k= ''
if machines : machines += ', ' + coul(nom,k)
else : machines = coul(nom,k)
@ -454,7 +455,7 @@ def machine_details(machine) :
f+= coul(u'mid=%s ' % machine.id(),'bleu')
# Type de machine
if machine.ipsec(): a = 'Machine wifi'
if isinstance(machine, MachineWifi): a = 'Machine wifi'
elif isinstance(machine, BorneWifi): a = 'Borne wifi'
else: a = 'Machine fixe'
f += coul(a + ' : ', 'gras')
@ -546,7 +547,7 @@ def machine_details(machine) :
f += '\n'
if aff_ipsec and machine.ipsec() :
if aff_ipsec and isinstance(machine, MachineWifi):
f += coul(u'Clef IPsec : ','gras') + machine.ipsec()
f += '\n'
@ -688,8 +689,8 @@ def _hist(clas) :
def __bases_machines(m) :
""" Retourne [ type de la machines, blacklist ] """
#Type
if m.ipsec() : t='wifi'
elif isinstance(m, BorneWifi): t='born'
if isinstance(m, MachineWifi): t = 'wifi'
elif isinstance(m, BorneWifi): t = 'born'
else : t='fixe'
# Déconnectée ?

View file

@ -23,6 +23,7 @@ sys.path.append('/usr/scripts/gestion')
from config import upload, virus, p2p, NETs
import smtplib
from ldap_crans import crans_ldap, crans, invite, base_classes_crans
from ldap_crans import MachineWifi
from time import *
import locale
locale.setlocale(locale.LC_TIME,'fr_FR')
@ -36,7 +37,7 @@ def machine_online(machine) :
Retourne True si la machine est connectée au réseau et False si elle ne l'est pas
"""
# Les machines wifi sont toujours online
if machine.ipsec() :
if isinstance(machine, MachineWifi):
return True
# Arping pour les fixes
return not commands.getstatusoutput('/usr/sbin/arping -c 3 %s' % machine.mac())[0]