Classe BorneWifi.

darcs-hash:20060302155728-68412-e2be9bb3a445573dbb34adddfe21be33ca96de96.gz
This commit is contained in:
glondu 2006-03-02 16:57:28 +01:00
parent 32d2199d4b
commit be3d9b49b0
3 changed files with 150 additions and 129 deletions

View file

@ -28,7 +28,7 @@ import re
import affich_tools, config
from lock import make_lock, remove_lock
from ldap_crans import adherent, machine, crans_ldap, crans, club, blacklist_items, isadm, isdeconnecteur, ann_scol, droits_possibles, smtpserv, script_utilisateur
from ldap_crans import adherent, Machine, BorneWifi, crans_ldap, crans, club, blacklist_items, isadm, isdeconnecteur, ann_scol, droits_possibles, smtpserv, script_utilisateur
def dialog(arg) :
return affich_tools.dialog(u'Gestion des adhérents et machines du Crans',arg)
@ -1178,7 +1178,7 @@ def set_machine(machine) :
arg+= u'"PortsTCP machine->ext :" 5 1 "%s" 5 25 50 0 ' % machine.portTCPout()
arg+= u'"PortsUDP ext->machine :" 6 1 "%s" 6 25 50 0 ' % machine.portUDPin()
arg+= u'"PortsUDP machine->ext :" 7 1 "%s" 7 25 50 0 ' % machine.portUDPout()
if machine.puissance()!=None and isadm :
if isinstance(machine, BorneWifi) and isadm :
# Borne wifi
p = u'Mettre le lieu de la borne comme première remarque.'
arg+= u'"Canaux :" 2 35 "%s" 2 43 14 0 ' % machine.canal(None,False)
@ -1230,7 +1230,7 @@ def set_machine(machine) :
machine.portUDPout(result[6])
except ValueError, c : err += c.args[0] + '\n'
if isadm and machine.puissance()!=None :
if isadm and isinstance(machine, BorneWifi):
try : machine.canal(result[7])
except ValueError, c : err += c.args[0] + '\n'
try : machine.puissance(result[8])
@ -1828,13 +1828,13 @@ def menu_principal() :
elif choix=='aKM' :
# Ajout machine au crans
becane = machine(crans(),"fixe")
becane = Machine(crans(),"fixe")
if set_machine(becane) :
becane.restore()
elif choix=='aKB' :
# Ajout borne wifi
becane = machine(crans(),"borne")
becane = BorneWifi(crans(),"borne")
if set_machine(becane) :
becane.restore()
@ -1901,9 +1901,9 @@ def menu_principal() :
choix = 'Wifi'
try :
if choix=='Fixe' :
becane = machine(proprio,'fixe')
becane = Machine(proprio, 'fixe')
elif choix=='Wifi' :
becane = machine(proprio,'wifi')
becane = Machine(proprio, 'wifi')
except ValueError, c:
arg = '--title "Nouvelle machine" '
arg += '--msgbox "%s\n\n\n" 0 0' % c.args[0]

View file

@ -639,7 +639,10 @@ class crans_ldap:
# Il n'y avait seulement un filtre machine
# => on retourne uniquement les machines trouvées
for m in r['machine']:
result['machine'].append(machine(m,mode,self.conn) )
if m[1].has_key('puissance'):
result['machine'].append(BorneWifi(m, mode, self.conn))
else:
result['machine'].append(Machine(m, mode, self.conn))
elif not r['machine']:
# Il n'y avait pas de filtre machine
# => on retourne uniquement les adhérents
@ -678,7 +681,10 @@ class crans_ldap:
dn = string.join(a[0].split(',')[-4:],',')
if dn in bons_dn and not a[0] in bons_dn2:
bons_dn2.append(dn)
result['machine'].append(machine(a,mode,self.conn) )
if a[1].has_key('puissance'):
result['machine'].append(BorneWifi(a, mode, self.conn))
else:
result['machine'].append(Machine(a, mode, self.conn))
else:
### Recherche d'une chaine sur tous les champs
@ -1206,7 +1212,10 @@ class base_proprietaire(base_classes_crans):
res = []
try:
for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine'):
res.append(machine(r, self._modifiable,self.conn) )
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 []
@ -2029,23 +2038,25 @@ class club(base_proprietaire):
""" Retourne l'adresse mail du responsable """
return self.responsable().email()
class machine(base_classes_crans):
class Machine(base_classes_crans):
""" Classe de définition d'une machine """
idn = 'mid'
def __init__(self,parent_or_tuple,typ='fixe',conn=None):
def __init__(self, parent_or_tuple, typ='fixe', conn=None):
"""
parent_or_tuple est :
*soit une instance d'une classe pouvant posséder une machine
(adherent, club ou crans), la nouvelle machine lui sera alors associé.
*soit directement le tuple définissant une machine (tel que
* soit une instance d'une classe pouvant posséder une machine
(adherent, club ou crans), la nouvelle machine lui sera alors
associée.
* soit directement le tuple définissant une machine (tel que
retourné par les fonctions de recherche ldap)
typ permet de définir le type de machine : wifi ou fixe,
pris en compte uniquement pour une nouvelle machine (parent donné)
Pour édition d'une machine, typ devra être égal à 'w'
Attention, si typ ='w' mais si l'objet est déja locké il n'y a pas d'erreur
vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon)
Attention, si typ ='w' mais si l'objet est déja locké il n'y a pas
d'erreur, vérifier l'obtention du lock grâce à la valeur de _modifiable
(si ='w' c'est bon)
conn est une instance de la classe de connexion à la base LDAP
"""
@ -2064,7 +2075,8 @@ class machine(base_classes_crans):
self._modifiable = 0
else:
self._modifiable = 0
self._init_data = parent_or_tuple[1].copy() # Utile pour construire l'instruction LDAP de modif
# Utile pour construire l'instruction LDAP de modif
self._init_data = parent_or_tuple[1].copy()
self._data = parent_or_tuple[1]
# Type de machine
@ -2109,7 +2121,7 @@ class machine(base_classes_crans):
""" Retourne le nom de la machine """
return self.nom()
def mac(self,mac=None,multi_ok=0):
def mac(self, mac=None, multi_ok=0):
"""
Défini ou retourne l'adresse mac de la machine
Adresse valide si:
@ -2119,7 +2131,7 @@ class machine(base_classes_crans):
Si multi_ok = 1 permet d'avoir plusieur fois la même mac sur le réseau
"""
if mac==None:
if mac == None:
return decode(self._data.get('macAddress',[''])[0])
mac = format_mac(mac)
@ -2135,7 +2147,7 @@ class machine(base_classes_crans):
raise ValueError(u"Il s'agit de l'adresse MAC d'une interface PPP.", 2)
# Le test final : vendeur connu
prefix=mac[:8].upper() + ' '
prefix = mac[:8].upper() + ' '
vendor = ''
try:
for line in open('/usr/scripts/gestion/ethercodes.dat').readlines():
@ -2155,13 +2167,7 @@ class machine(base_classes_crans):
self._set('macAddress',[mac])
return mac
def mac2(self):
"""Retourne l'adresse MAC + 2"""
mac = self.mac().split(":")
mac[-1] = "%0.2x" % (int(mac[-1], 16) + 2)
return ":".join(mac)
def __host_alias(self,champ,new):
def __host_alias(self, champ, new):
""" Vérification de la validité d'un nom de machine """
# Supression des accents
new = strip_accents(unicode(new,'iso-8859-15'))
@ -2186,14 +2192,14 @@ class machine(base_classes_crans):
raise ValueError(u"Le premier caractère du champ %s doit être alphanumérique" % champ)
# Ajout du domaine si necessaire
if new.find('.')==-1:
if new.find('.') == -1:
try:
new += '.' + config.domains[self.__typ]
except:
raise RuntimeError(u"%s : domaine non trouvé" % champ.capitalize() )
# Pas déja pris ?
if self.exist('(|(host=%s)(hostAlias=%s))' % (new,new)):
if self.exist('(|(host=%s)(hostAlias=%s))' % (new, new)):
raise ValueError(u"%s : nom déjà pris" % champ.capitalize())
# Lock host
@ -2201,7 +2207,7 @@ class machine(base_classes_crans):
return new
def nom(self,new=None):
def nom(self, new=None):
"""
Défini ou retourne le nom de machine.
Un nom de machine valide ne comporte que des caractères
@ -2277,7 +2283,7 @@ class machine(base_classes_crans):
self._set('hostAlias',liste)
return liste
def ip(self,ip=None):
def ip(self, ip=None):
"""
Défini ou retourne l'IP de la machine.
Les IP sont stoquées sous forme xxx.xxx.xxx.xxx et doivent être fournies ainsi.
@ -2364,7 +2370,7 @@ class machine(base_classes_crans):
self._set('ipHostNumber',[ip])
return ip
def exempt(self,new=None):
def exempt(self, new=None):
"""
Liste des réseaux vers lesquels on ne compte pas l'upload
Cette liste est transférée dans la base postgres de komaz
@ -2375,11 +2381,11 @@ class machine(base_classes_crans):
l'index est celui obtenu dans la liste retournée par exempt()
"""
if not self._data.has_key('exempt'):
self._data['exempt']=[]
self._data['exempt'] = []
liste = list(self._data['exempt'])
if new==None: return map(decode,liste)
if new == None: return map(decode, liste)
if type(new)==list:
if type(new) == list:
# Modif
index = new[0]
l, new = preattr(new[1])
@ -2388,8 +2394,8 @@ class machine(base_classes_crans):
liste.pop(index)
else:
# Modif remarque
liste[index]=new
elif type(new)==str:
liste[index] = new
elif type(new) == str:
# Réseau supplémentaire
l, new = preattr(new)
if not new:
@ -2420,7 +2426,7 @@ class machine(base_classes_crans):
return self.__proprietaire
def ipsec(self,clef=0):
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.
"""
@ -2440,82 +2446,6 @@ class machine(base_classes_crans):
return clef
def canal(self,new=None,raw=False):
""" Attribution ou visualisation du canal d'une borne wifi """
if self.__typ != 'borne': return None
if not new:
canaux = self._data.get('canal',[''])[0]
if raw:
return canaux
else:
canaux = int(canaux)
if canaux < 14:
# Compatibilité ascendante
return str(canaux)
lcanal1 = []
for i in range(1,14):
found = False
if canaux & (1 << (i - 1)):
lcanal2 = []
for c in lcanal1:
if c[1] == i - 1:
lcanal2.append((c[0], i))
found = True
else:
lcanal2.append(c)
if not found:
lcanal2.append((i,i))
lcanal1 = lcanal2
lcanal3 = []
for c in lcanal1:
if c[0] == c[1]:
lcanal3.append("%d" % c[0])
else:
lcanal3.append("%d-%d" % (c[0],c[1]))
return ",".join(lcanal3)
try:
new = int(new)
if new < 0 or new > 13: raise
except:
# Nouveau système, il doit s'agir d'une liste de canaux
try:
lcanal3 = str(new).split(",")
lcanal = []
for c in lcanal3:
c2 = c.split("-")
if len(c2) == 1:
lcanal.append(int(c2[0]))
else:
for i in range(int(c2[0]), int(c2[1]) + 1):
lcanal.append(i)
new = 0
for c in lcanal:
if c not in range(0,14):
raise
new = new + (1 << (c - 1))
except:
raise ValueError(u'Canal invalide : doit être entre 0 et 13 ou une liste de canaux')
self._set('canal',[str(new)])
return new
def puissance(self,new=None):
""" Attribution ou visualisation de la puissance d'une borne wifi """
if self.__typ != 'borne': return None
if not new:
return self._data.get('puissance',[''])[0]
try:
new = int(new)
if new < -99 or new > 99: raise
except:
raise ValueError(u'Puissance invalide : doit être entre -99 et 99')
self._set('puissance',[str(new)])
return new
def save(self):
"""
Enregistre la machine courante dans la base LDAP
@ -2649,6 +2579,94 @@ class machine(base_classes_crans):
if 'ports' not in self.modifs:
self.modifs.setdefault('ports', None)
class BorneWifi(Machine):
""" Classe de définition d'une borne wifi """
def __init__(self, parent_or_tuple, typ='borne', conn=None):
Machine.__init__(self, parent_or_tuple, typ, conn)
def mac2(self):
""" Retourne l'adresse MAC + 2 """
mac = self.mac().split(":")
mac[-1] = "%0.2x" % (int(mac[-1], 16) + 2)
return ":".join(mac)
def canal(self, new=None, raw=False):
""" Attribution ou visualisation du canal d'une borne wifi """
if not new:
canaux = self._data.get('canal', [''])[0]
if raw:
return canaux
else:
canaux = int(canaux)
if canaux < 14:
# Compatibilité ascendante
return str(canaux)
lcanal1 = []
for i in range(1, 14):
found = False
if canaux & (1 << (i - 1)):
lcanal2 = []
for c in lcanal1:
if c[1] == i - 1:
lcanal2.append((c[0], i))
found = True
else:
lcanal2.append(c)
if not found:
lcanal2.append((i, i))
lcanal1 = lcanal2
lcanal3 = []
for c in lcanal1:
if c[0] == c[1]:
lcanal3.append("%d" % c[0])
else:
lcanal3.append("%d-%d" % (c[0], c[1]))
return ",".join(lcanal3)
try:
new = int(new)
if new < 0 or new > 13: raise
except:
# Nouveau système, il doit s'agir d'une liste de canaux
try:
lcanal3 = str(new).split(",")
lcanal = []
for c in lcanal3:
c2 = c.split("-")
if len(c2) == 1:
lcanal.append(int(c2[0]))
else:
for i in range(int(c2[0]), int(c2[1]) + 1):
lcanal.append(i)
new = 0
for c in lcanal:
if c not in range(0,14):
raise
new = new + (1 << (c - 1))
except:
raise ValueError(u'Canal invalide : doit être entre 0 et 13 ou une liste de canaux')
self._set('canal',[str(new)])
return new
def puissance(self, new=None):
""" Attribution ou visualisation de la puissance d'une borne wifi """
if not new:
return self._data.get('puissance', [''])[0]
try:
new = int(new)
if new < -99 or new > 99: raise
except:
raise ValueError(u'Puissance invalide : doit être entre -99 et 99')
self._set('puissance', [str(new)])
return new
class _fake_proprio(crans_ldap):
""" Définitions de base d'un propriétaire virtuel """
idn = ''
@ -2672,7 +2690,10 @@ class _fake_proprio(crans_ldap):
res = s.conn.search_s(s.dn,1,'objectClass=machine')
m = []
for r in res:
m.append(machine(r,'',s.conn))
if r[1].has_key('puissance'):
m.append(BorneWifi(r, '', s.conn))
else:
m.append(Machine(r, '', s.conn))
return m
class crans(_fake_proprio):
@ -2688,7 +2709,7 @@ class crans(_fake_proprio):
class invite(_fake_proprio):
""" Propriétaire des machines invité """
def __init__(s,conn=None):
def __init__(s, conn=None):
s.conn = conn
if not s.conn: s.connect()
s.dn = "ou=invites," + s.base_dn

View file

@ -47,7 +47,7 @@ except:
base = None
from ldap_crans import is_actif , crans_ldap, ann_scol, crans, hostname
from ldap_crans import is_actif, crans_ldap, ann_scol, crans, hostname, BorneWifi
from affich_tools import *
import user_tests
import popen2, commands
@ -453,10 +453,10 @@ def machine_details(machine) :
f+= coul(u'mid=%s ' % machine.id(),'bleu')
# Type de machine
if machine.ipsec() : a='Machine wifi'
elif machine.canal() : a='Borne wifi'
else : a='Machine fixe'
f+= coul(a+' : ' ,'gras')
if machine.ipsec(): a = 'Machine wifi'
elif isinstance(machine, BorneWifi): a = 'Borne wifi'
else: a = 'Machine fixe'
f += coul(a + ' : ', 'gras')
f+= "%s\n" % machine.nom()
@ -494,7 +494,7 @@ def machine_details(machine) :
f += '\n'
# Borne wifi
if machine.puissance() :
if isinstance(machine, BorneWifi):
f += coul(u'Puissance : ','gras') + u"%4.d" % int(machine.puissance())
f += coul(u'\tCanaux : ', 'gras') + machine.canal()
f += coul(u'\tÉtat : ', 'gras')
@ -683,7 +683,7 @@ def __bases_machines(m) :
""" Retourne [ type de la machines, blacklist ] """
#Type
if m.ipsec() : t='wifi'
elif m.canal() : t='born'
elif isinstance(m, BorneWifi): t='born'
else : t='fixe'
# Déconnectée ?