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 import affich_tools, config
from lock import make_lock, remove_lock 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) : def dialog(arg) :
return affich_tools.dialog(u'Gestion des adhérents et machines du Crans',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'"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 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() 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 # Borne wifi
p = u'Mettre le lieu de la borne comme première remarque.' 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) 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]) machine.portUDPout(result[6])
except ValueError, c : err += c.args[0] + '\n' 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]) try : machine.canal(result[7])
except ValueError, c : err += c.args[0] + '\n' except ValueError, c : err += c.args[0] + '\n'
try : machine.puissance(result[8]) try : machine.puissance(result[8])
@ -1828,13 +1828,13 @@ def menu_principal() :
elif choix=='aKM' : elif choix=='aKM' :
# Ajout machine au crans # Ajout machine au crans
becane = machine(crans(),"fixe") becane = Machine(crans(),"fixe")
if set_machine(becane) : if set_machine(becane) :
becane.restore() becane.restore()
elif choix=='aKB' : elif choix=='aKB' :
# Ajout borne wifi # Ajout borne wifi
becane = machine(crans(),"borne") becane = BorneWifi(crans(),"borne")
if set_machine(becane) : if set_machine(becane) :
becane.restore() becane.restore()
@ -1901,9 +1901,9 @@ def menu_principal() :
choix = 'Wifi' choix = 'Wifi'
try : try :
if choix=='Fixe' : if choix=='Fixe' :
becane = machine(proprio,'fixe') becane = Machine(proprio, 'fixe')
elif choix=='Wifi' : elif choix=='Wifi' :
becane = machine(proprio,'wifi') becane = Machine(proprio, 'wifi')
except ValueError, c: except ValueError, c:
arg = '--title "Nouvelle machine" ' arg = '--title "Nouvelle machine" '
arg += '--msgbox "%s\n\n\n" 0 0' % c.args[0] 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 # Il n'y avait seulement un filtre machine
# => on retourne uniquement les machines trouvées # => on retourne uniquement les machines trouvées
for m in r['machine']: 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']: elif not r['machine']:
# Il n'y avait pas de filtre machine # Il n'y avait pas de filtre machine
# => on retourne uniquement les adhérents # => on retourne uniquement les adhérents
@ -678,7 +681,10 @@ class crans_ldap:
dn = string.join(a[0].split(',')[-4:],',') dn = string.join(a[0].split(',')[-4:],',')
if dn in bons_dn and not a[0] in bons_dn2: if dn in bons_dn and not a[0] in bons_dn2:
bons_dn2.append(dn) 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: else:
### Recherche d'une chaine sur tous les champs ### Recherche d'une chaine sur tous les champs
@ -1206,7 +1212,10 @@ class base_proprietaire(base_classes_crans):
res = [] res = []
try: try:
for r in self.conn.search_s('%s=%s,%s' % ( self.idn,self.id() , self.base_dn ),1,'objectClass=machine'): 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 return res
except: except:
return [] return []
@ -2029,23 +2038,25 @@ class club(base_proprietaire):
""" Retourne l'adresse mail du responsable """ """ Retourne l'adresse mail du responsable """
return self.responsable().email() return self.responsable().email()
class machine(base_classes_crans): class Machine(base_classes_crans):
""" Classe de définition d'une machine """ """ Classe de définition d'une machine """
idn = 'mid' 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 : parent_or_tuple est :
*soit une instance d'une classe pouvant posséder une machine * soit une instance d'une classe pouvant posséder une machine
(adherent, club ou crans), la nouvelle machine lui sera alors associé. (adherent, club ou crans), la nouvelle machine lui sera alors
*soit directement le tuple définissant une machine (tel que associée.
retourné par les fonctions de recherche ldap) * soit directement le tuple définissant une machine (tel que
typ permet de définir le type de machine : wifi ou fixe, retourné par les fonctions de recherche ldap)
pris en compte uniquement pour une nouvelle machine (parent donné) 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' 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 Attention, si typ ='w' mais si l'objet est déja locké il n'y a pas
vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon) 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 conn est une instance de la classe de connexion à la base LDAP
""" """
@ -2064,7 +2075,8 @@ class machine(base_classes_crans):
self._modifiable = 0 self._modifiable = 0
else: else:
self._modifiable = 0 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] self._data = parent_or_tuple[1]
# Type de machine # Type de machine
@ -2109,7 +2121,7 @@ class machine(base_classes_crans):
""" Retourne le nom de la machine """ """ Retourne le nom de la machine """
return self.nom() 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 Défini ou retourne l'adresse mac de la machine
Adresse valide si: 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 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]) return decode(self._data.get('macAddress',[''])[0])
mac = format_mac(mac) 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) raise ValueError(u"Il s'agit de l'adresse MAC d'une interface PPP.", 2)
# Le test final : vendeur connu # Le test final : vendeur connu
prefix=mac[:8].upper() + ' ' prefix = mac[:8].upper() + ' '
vendor = '' vendor = ''
try: try:
for line in open('/usr/scripts/gestion/ethercodes.dat').readlines(): for line in open('/usr/scripts/gestion/ethercodes.dat').readlines():
@ -2155,13 +2167,7 @@ class machine(base_classes_crans):
self._set('macAddress',[mac]) self._set('macAddress',[mac])
return mac return mac
def mac2(self): def __host_alias(self, champ, new):
"""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):
""" Vérification de la validité d'un nom de machine """ """ Vérification de la validité d'un nom de machine """
# Supression des accents # Supression des accents
new = strip_accents(unicode(new,'iso-8859-15')) 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) raise ValueError(u"Le premier caractère du champ %s doit être alphanumérique" % champ)
# Ajout du domaine si necessaire # Ajout du domaine si necessaire
if new.find('.')==-1: if new.find('.') == -1:
try: try:
new += '.' + config.domains[self.__typ] new += '.' + config.domains[self.__typ]
except: except:
raise RuntimeError(u"%s : domaine non trouvé" % champ.capitalize() ) raise RuntimeError(u"%s : domaine non trouvé" % champ.capitalize() )
# Pas déja pris ? # 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()) raise ValueError(u"%s : nom déjà pris" % champ.capitalize())
# Lock host # Lock host
@ -2201,7 +2207,7 @@ class machine(base_classes_crans):
return new return new
def nom(self,new=None): def nom(self, new=None):
""" """
Défini ou retourne le nom de machine. Défini ou retourne le nom de machine.
Un nom de machine valide ne comporte que des caractères Un nom de machine valide ne comporte que des caractères
@ -2277,7 +2283,7 @@ class machine(base_classes_crans):
self._set('hostAlias',liste) self._set('hostAlias',liste)
return liste return liste
def ip(self,ip=None): def ip(self, ip=None):
""" """
Défini ou retourne l'IP de la machine. 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. 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]) self._set('ipHostNumber',[ip])
return 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 Liste des réseaux vers lesquels on ne compte pas l'upload
Cette liste est transférée dans la base postgres de komaz 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() l'index est celui obtenu dans la liste retournée par exempt()
""" """
if not self._data.has_key('exempt'): if not self._data.has_key('exempt'):
self._data['exempt']=[] self._data['exempt'] = []
liste = list(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 # Modif
index = new[0] index = new[0]
l, new = preattr(new[1]) l, new = preattr(new[1])
@ -2388,8 +2394,8 @@ class machine(base_classes_crans):
liste.pop(index) liste.pop(index)
else: else:
# Modif remarque # Modif remarque
liste[index]=new liste[index] = new
elif type(new)==str: elif type(new) == str:
# Réseau supplémentaire # Réseau supplémentaire
l, new = preattr(new) l, new = preattr(new)
if not new: if not new:
@ -2420,7 +2426,7 @@ class machine(base_classes_crans):
return self.__proprietaire 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 """ Génération (clef=1) ou affichage de la clef IPsec de la machine
Si clef!=1: prend la clef fournie. Si clef!=1: prend la clef fournie.
""" """
@ -2438,83 +2444,7 @@ class machine(base_classes_crans):
self._set('ipsec',[clef]) self._set('ipsec',[clef])
return clef 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): def save(self):
""" """
@ -2649,6 +2579,94 @@ class machine(base_classes_crans):
if 'ports' not in self.modifs: if 'ports' not in self.modifs:
self.modifs.setdefault('ports', None) 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): class _fake_proprio(crans_ldap):
""" Définitions de base d'un propriétaire virtuel """ """ Définitions de base d'un propriétaire virtuel """
idn = '' idn = ''
@ -2672,7 +2690,10 @@ class _fake_proprio(crans_ldap):
res = s.conn.search_s(s.dn,1,'objectClass=machine') res = s.conn.search_s(s.dn,1,'objectClass=machine')
m = [] m = []
for r in res: 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 return m
class crans(_fake_proprio): class crans(_fake_proprio):
@ -2688,7 +2709,7 @@ class crans(_fake_proprio):
class invite(_fake_proprio): class invite(_fake_proprio):
""" Propriétaire des machines invité """ """ Propriétaire des machines invité """
def __init__(s,conn=None): def __init__(s, conn=None):
s.conn = conn s.conn = conn
if not s.conn: s.connect() if not s.conn: s.connect()
s.dn = "ou=invites," + s.base_dn s.dn = "ou=invites," + s.base_dn

View file

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