diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index a9d9bbe4..a49f20eb 100755 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -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] diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 6a021248..8f5779c4 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -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 - 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é) - + * 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. """ @@ -2438,83 +2444,7 @@ class machine(base_classes_crans): self._set('ipsec',[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 + return clef def save(self): """ @@ -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 diff --git a/gestion/whos.py b/gestion/whos.py index 61b14ef0..bb4b31fe 100755 --- a/gestion/whos.py +++ b/gestion/whos.py @@ -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 ?