[debian/*.py] remove trailing whitespaces
Ignore-this: f62e84c258c847013d307d12acdf489e darcs-hash:20090309212356-0445d-d8338d06f968f316fcd085446023123be87040f7.gz
This commit is contained in:
parent
cc31727b60
commit
eae0d21f83
18 changed files with 352 additions and 352 deletions
|
@ -1,10 +1,10 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
"""
|
||||
Fichier de base d'interface avec les switchs manageables.
|
||||
|
||||
Donne la classe switch qui permet d'effectuer les opérations
|
||||
Donne la classe switch qui permet d'effectuer les opérations
|
||||
élémentaires sur les switchs manageable HP 26xx.
|
||||
|
||||
Frédéric PAUGET
|
||||
|
@ -52,7 +52,7 @@ import pexpect
|
|||
class ssh :
|
||||
""" Ouverture d'une connexion ssh, envoi de commandes et récupération du résultat """
|
||||
|
||||
|
||||
|
||||
def __init__(self,host) :
|
||||
""" Ouverture d'une connexion ssh vers le switch choisi """
|
||||
self.switch = host.split('.')[0] # On garde pas le fqdn
|
||||
|
@ -68,14 +68,14 @@ class ssh :
|
|||
traceback.print_exc()
|
||||
print "Contenu du buffer :"
|
||||
print self.ssh.before
|
||||
|
||||
|
||||
def __del__(self) :
|
||||
"""Ferme la connexion : envoi logout et attend """
|
||||
self.ssh.sendline("logout")
|
||||
self.ssh.send("y")
|
||||
self.ssh.send("y")
|
||||
self.ssh.close()
|
||||
|
||||
|
||||
def send_cmd(self,cmd,timeout=15):
|
||||
""" Envoi une commande, attend le prompt et retourne la réponse """
|
||||
# Envoi de la commande
|
||||
|
@ -89,7 +89,7 @@ class ssh :
|
|||
'%s\(config\)# ' % self.switch,
|
||||
'quit: Control-C'],
|
||||
timeout=timeout)
|
||||
|
||||
|
||||
self.__sshout = self.__sshout + self.ssh.before
|
||||
if index == 0:
|
||||
# On répond oui
|
||||
|
@ -100,7 +100,7 @@ class ssh :
|
|||
elif index == 2:
|
||||
# On doit continuer, on envoie espace
|
||||
self.ssh.send(" ")
|
||||
|
||||
|
||||
return self.__sshout
|
||||
except pexpect.TIMEOUT:
|
||||
print "Timeout !"
|
||||
|
@ -115,7 +115,7 @@ class snmp :
|
|||
""" host doit être la machine sur laquelle se connecter
|
||||
version est la verion du protocole snmp à utiliser : 1, 2c ou 3
|
||||
le reste des données doit être ou non fourni suivant la version
|
||||
|
||||
|
||||
pour v1 et v2c seule la communauté est prise en compte
|
||||
pour v3 authentication_protocol, authentication_pass et username sont requis si accès en authNoPriv
|
||||
si privacy_pass est fourni accès en authPriv
|
||||
|
@ -127,7 +127,7 @@ class snmp :
|
|||
self._machine = cl.search("host=%(host)s" % {'host': host})["machineCrans"][0]
|
||||
except IndexError:
|
||||
raise ValueError(u"Cette machine n'est pas un switch du Cr@ns")
|
||||
|
||||
|
||||
# l'engineid du switch n'est que sa mac avec quelques fioritures autour...
|
||||
mac = self._machine.mac().replace(':', '')
|
||||
self._engineid = '0000000b0000%(mac)s0' % {'mac': mac[:-1]}
|
||||
|
@ -136,25 +136,25 @@ class snmp :
|
|||
self.options = "-v %s -c '%s' %s " % ( version, community, host )
|
||||
elif version =='3' :
|
||||
self.options = "-v 3 -e %s -u %s -a %s -A '%s' -l authNoPriv" % ( self._engineid, username, authentication_protocol, authentication_pass )
|
||||
if privacy_pass :
|
||||
if privacy_pass :
|
||||
self.options += " -x DES -X '%s' -l authPriv" % privacy_pass
|
||||
self.options += " %s " % host
|
||||
else :
|
||||
raise ValueError('Version incorrecte')
|
||||
|
||||
|
||||
def __exec(self,cmd) :
|
||||
s, r = getstatusoutput(cmd)
|
||||
if s :
|
||||
r=r.replace('snmpget: ','')
|
||||
raise ConversationError(r,cmd)
|
||||
return r
|
||||
|
||||
|
||||
def get(self,oid) :
|
||||
""" Retourne le résultat correspondant à l'oid demandé """
|
||||
return self.__exec('snmpget -O vq %s %s ' % ( self.options, oid ) )
|
||||
|
||||
def get_string(self,oid) :
|
||||
""" Retourne le resultat convertit en String correspondant à l'oid demandé. Fonctionne avec les types de depart String, Integer, Hex-String. Raise ValueError sinon. """
|
||||
""" Retourne le resultat convertit en String correspondant à l'oid demandé. Fonctionne avec les types de depart String, Integer, Hex-String. Raise ValueError sinon. """
|
||||
s= self.__exec('snmpget -O v %s %s ' % ( self.options, oid ) )
|
||||
if s=="\"\"":
|
||||
return ""
|
||||
|
@ -168,16 +168,16 @@ class snmp :
|
|||
return unicode(var)
|
||||
else:
|
||||
raise ValueError('Type inconnu')
|
||||
|
||||
|
||||
def set(self,oid,typ,val) :
|
||||
""" Change la valeur le l'oid donné.
|
||||
""" Change la valeur le l'oid donné.
|
||||
type est le type de la valeur
|
||||
val est la valeur à écrire
|
||||
"""
|
||||
return self.__exec('snmpset -O vq %s %s %s %s' % (self.options, oid, typ, val ) )
|
||||
|
||||
|
||||
def walk(self,base_oid) :
|
||||
""" Retourne le résultat de snmpwalk
|
||||
""" Retourne le résultat de snmpwalk
|
||||
le retour est un dictionnaire { oid : valeur }
|
||||
"""
|
||||
lignes = self.__exec('snmpwalk -O q %s %s' % (self.options, base_oid ) ).split('\n')
|
||||
|
@ -190,14 +190,14 @@ class snmp :
|
|||
|
||||
#############################################################################################
|
||||
### Gestion des switchs proprement dite
|
||||
|
||||
|
||||
class hpswitch :
|
||||
""" Classe pour l'administration des switchs HP. """
|
||||
|
||||
|
||||
# Variables internes
|
||||
__debug=0
|
||||
__logDest=stderr
|
||||
|
||||
|
||||
# Variables internes
|
||||
switch = None # nom du switch
|
||||
prise = ''
|
||||
|
@ -207,17 +207,17 @@ class hpswitch :
|
|||
""" Switch doit être le nom du switch """
|
||||
if self.__debug : self.__logDest.write("HP DEBUG : __init__(switch=%s)\n" % switch )
|
||||
self.switch = switch.lower()
|
||||
|
||||
|
||||
# Config snmp
|
||||
self.get, self.set, self.walk = config_snmp_secrete(snmp,switch)
|
||||
|
||||
|
||||
def send_cmd(self,cmd,timout=15) :
|
||||
""" Envoi une commande par ssh au switch """
|
||||
if not self.__conn_ssh :
|
||||
self.__conn_ssh = ssh(self.switch)
|
||||
|
||||
|
||||
return self.__conn_ssh.send_cmd(cmd,timout)
|
||||
|
||||
|
||||
def show_prise_mac(self,prise='') :
|
||||
""" Retourne le(s) adresse(s) MAC présentes sur la prise."""
|
||||
if not prise : prise = self.prise
|
||||
|
@ -248,18 +248,18 @@ class hpswitch :
|
|||
|
||||
# On a rien trouvé
|
||||
return None
|
||||
|
||||
|
||||
def __scp(self,destination,fichier) :
|
||||
if self.__debug :
|
||||
self.__logDest.write("HP DEBUG : scp(%s,%s,%s)\n" % (fichier, self.switch, destination))
|
||||
if exists(fichier):
|
||||
system('scp %s %s:%s' % (fichier, self.switch, destination))
|
||||
|
||||
|
||||
def update(self,file=None) :
|
||||
""" Upload le fichier de config fourni
|
||||
Fait rebooter le switch """
|
||||
self.__scp('cfg/startup-config',file)
|
||||
|
||||
|
||||
def upgrade(self,file=None) :
|
||||
""" Changement de firmware,
|
||||
le firmware est dans le fichier fourni en argument
|
||||
|
@ -270,18 +270,18 @@ class hpswitch :
|
|||
""" Ajoute la clef publique ssh aux clefs autorises
|
||||
par le switch """
|
||||
self.scp('ssh/mgr_keys',file)
|
||||
|
||||
|
||||
def multicast(self,ip='') :
|
||||
""" Donne la liste des ports du swich inscrits au flux multicast donné
|
||||
Si aucun flux donné teste tous les flux multicast possibles.
|
||||
""" Donne la liste des ports du swich inscrits au flux multicast donné
|
||||
Si aucun flux donné teste tous les flux multicast possibles.
|
||||
|
||||
Retourne un dictionnaire : { adresse du flux : [ ports inscrits ] }
|
||||
"""
|
||||
if self.__debug : self.__logDest.write("HP DEBUG : multicast(ip=%s)\n" % ip)
|
||||
if ip :
|
||||
if ip :
|
||||
data = self.walk('STATISTICS-MIB::hpIgmpStatsPortIndex2.%s' % ip)
|
||||
return { ip : data.values() }
|
||||
|
||||
|
||||
else :
|
||||
data = self.walk('STATISTICS-MIB::hpIgmpStatsPortIndex2')
|
||||
result = {}
|
||||
|
@ -291,14 +291,14 @@ class hpswitch :
|
|||
except : continue
|
||||
result.setdefault(ip,[])
|
||||
result[ip].append(port)
|
||||
|
||||
|
||||
return result
|
||||
|
||||
def nb_prises(self) :
|
||||
""" Retourne le nombre de prises du switch """
|
||||
if self.__debug : self.__logDest.write("HP DEBUG : nb_prises()\n")
|
||||
return int(findall(r'Switch 26([0-9]{2})', self.version())[0])
|
||||
|
||||
|
||||
def version(self) :
|
||||
""" Retourne la version du firmware du switch """
|
||||
if self.__debug : self.__logDest.write("HP DEBUG : version()\n")
|
||||
|
@ -309,13 +309,13 @@ class hpswitch :
|
|||
if not prise : prise = self.prise
|
||||
if self.__debug : self.__logDest.write("HP DEBUG : enable(prise=%s)\n" % prise)
|
||||
return self.set('IF-MIB::ifAdminStatus.%d' % int(prise), 'i', 1)
|
||||
|
||||
|
||||
def disable(self,prise=0) :
|
||||
""" Désactive une prise """
|
||||
if not prise : prise = self.prise
|
||||
if self.__debug : self.__logDest.write("HP DEBUG : disable(prise=%s)\n" % prise)
|
||||
return self.set('IF-MIB::ifAdminStatus.%d' % int(prise), 'i', 2)
|
||||
|
||||
|
||||
def __is(self,oid,prise) :
|
||||
if not prise : prise = self.prise
|
||||
prise = str(prise)
|
||||
|
@ -328,7 +328,7 @@ class hpswitch :
|
|||
return nb
|
||||
prise = prise.replace('-','')
|
||||
return self.get(oid + '.' + prise) == 'up'
|
||||
|
||||
|
||||
def is_enable(self,prise=0) :
|
||||
""" Retoune True ou False suivant si la prise est activée ou non
|
||||
Si prise=all retourne le nombre de prises activées sur le switch """
|
||||
|
@ -340,7 +340,7 @@ class hpswitch :
|
|||
Si prise=all retourne le nombre de prises up sur le switch """
|
||||
if prise != 'all': prise = int(prise)
|
||||
return self.__is('IF-MIB::ifOperStatus',prise)
|
||||
|
||||
|
||||
def nom(self,nom=None,prise=0) :
|
||||
""" Retourne ou attribue le nom à la prise fournie """
|
||||
if not prise : prise = self.prise
|
||||
|
@ -349,19 +349,19 @@ class hpswitch :
|
|||
return self.get(oid)
|
||||
else :
|
||||
self.set(oid, 's' , nom)
|
||||
|
||||
|
||||
def eth_mode(self,mode=None,prise=0) :
|
||||
""" Fixe ou retourne le mode d'une prise
|
||||
mode est un tuple : (vitesse, duplex) ou simplement "auto"
|
||||
""" Fixe ou retourne le mode d'une prise
|
||||
mode est un tuple : (vitesse, duplex) ou simplement "auto"
|
||||
vitesse est : 10 100 ou 1000
|
||||
duplex est FD, HD ou auto
|
||||
"""
|
||||
if not prise : prise = self.prise
|
||||
oid = 'CONFIG-MIB::hpSwitchPortFastEtherMode.%d' % int(prise)
|
||||
|
||||
|
||||
if mode == None :
|
||||
return self.get(oid)
|
||||
|
||||
|
||||
# Conversion du mode
|
||||
if mode == 'auto' :
|
||||
code = 5
|
||||
|
@ -391,7 +391,7 @@ class hpswitch :
|
|||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
class sw_chbre(hpswitch) :
|
||||
def __init__(self,chbre) :
|
||||
# On retrouve la chbre dans l'annuaire
|
||||
|
@ -410,20 +410,20 @@ class sw_chbre(hpswitch) :
|
|||
self.prise10Mb = False
|
||||
except :
|
||||
raise ValueError('Chambre %s inconnue' % chbre)
|
||||
|
||||
|
||||
# Config snmp
|
||||
self.get, self.set, self.walk = config_snmp_secrete(snmp,self.switch)
|
||||
|
||||
|
||||
|
||||
|
||||
def reconfigure(self) :
|
||||
""" Reconfigure la prise (nom et vitesse) """
|
||||
in10 = self.eth_mode().find('10Mbits') != 1
|
||||
|
||||
|
||||
if self.prise10Mb and not in10 :
|
||||
self.eth_mode(('10','auto'))
|
||||
elif not self.prise10Mb and in10 :
|
||||
self.eth_mode('auto')
|
||||
|
||||
|
||||
nom = 'Chambre_%s' % self.chbre.capitalize()
|
||||
if nom != self.nom() :
|
||||
self.nom(nom)
|
||||
|
@ -448,13 +448,13 @@ class sw_prise(sw_chbre):
|
|||
|
||||
if __name__ == '__main__' :
|
||||
import sys, getopt, sre
|
||||
|
||||
|
||||
try :
|
||||
options, arg = getopt.getopt(sys.argv[1:], 'U:hc:', [ 'help', 'snmp' ])
|
||||
except getopt.error, msg :
|
||||
print msg
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
cmds = []
|
||||
firmware=''
|
||||
wait=True
|
||||
|
@ -466,17 +466,17 @@ if __name__ == '__main__' :
|
|||
print "L'envoi de firmware ne fait pas rebooter le switch"
|
||||
print "L'option --snmp ajoute les commandes de reconfiguration snmp"
|
||||
sys.exit(0)
|
||||
|
||||
elif opt=='-c' :
|
||||
|
||||
elif opt=='-c' :
|
||||
cmds.append(val)
|
||||
|
||||
|
||||
elif opt=='-U' :
|
||||
firmware=val
|
||||
|
||||
|
||||
elif opt=='--snmp' :
|
||||
cmds.append(reconf_snmp)
|
||||
cmds.append("write memory")
|
||||
|
||||
|
||||
# Quels switchs ?
|
||||
switchs=[]
|
||||
if arg :
|
||||
|
@ -484,20 +484,20 @@ if __name__ == '__main__' :
|
|||
for sw in all_switchs() :
|
||||
if re.match(sw) :
|
||||
switchs.append(sw)
|
||||
|
||||
|
||||
if not switchs :
|
||||
print "Aucun switch trouvé"
|
||||
print "Note : il faut une _regex_ (!= wilcards au sens du shell)"
|
||||
sys.exit(3)
|
||||
|
||||
|
||||
if not cmds and not firmware :
|
||||
cmds=map(str.strip,sys.stdin.readlines())
|
||||
|
||||
|
||||
# Ce que l'on va faire
|
||||
print "Commandes :\n\t", '\n\t'.join(cmds)
|
||||
print "\nSwitchs : ", ' '.join(switchs)
|
||||
print "\nSwitchs : ", ' '.join(switchs)
|
||||
print
|
||||
|
||||
|
||||
try:
|
||||
raw_input("Appuyer sur entrée pour continuer")
|
||||
except EOFError:
|
||||
|
@ -511,8 +511,8 @@ if __name__ == '__main__' :
|
|||
s = hpswitch(sw)
|
||||
if firmware :
|
||||
s.upgrade(firmware)
|
||||
for cmd in cmds :
|
||||
for cmd in cmds :
|
||||
print s.send_cmd(cmd)
|
||||
except :
|
||||
print 'ERREUR'
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue