Peut etre appelle directement :
Usage : %s -c commande1 -c commande2... -s switch1 -s switch2...
Envoi les commandes donnes au switchs dont le nom est fourni
si aucun switch est founi envoi  tous les switchs
si aucune commande est founie lit l'entree standart

darcs-hash:20050427141332-41617-bd60649ba40e3133b6fcb75434cf9ead17bf94d1.gz
This commit is contained in:
pauget 2005-04-27 16:13:32 +02:00
parent b07d5901cc
commit 8565f7c9da

168
gestion/hptools.py Normal file → Executable file
View file

@ -1,4 +1,4 @@
# -*- python -*- #!/usr/bin/env python
# -*- coding: iso-8859-15 -*- # -*- coding: iso-8859-15 -*-
""" """
@ -13,7 +13,9 @@ from time import sleep
from popen2 import popen3 from popen2 import popen3
from sys import stderr, path from sys import stderr, path
from commands import getstatusoutput from commands import getstatusoutput
from annuaires import chbre_prises, all_switchs, uplink_prises from annuaires import chbre_prises, all_switchs
from os.path import exists
from os import system
try: try:
from secrets import config_snmp_secrete from secrets import config_snmp_secrete
@ -162,10 +164,6 @@ class hpswitch :
__debug=0 __debug=0
__logDest=stderr __logDest=stderr
# Quelques paramètres
IP_tftp = '138.231.136.7'
firmware_file = 'firmware26xx'
# Variables internes # Variables internes
switch = None # nom du switch switch = None # nom du switch
prise = '' prise = ''
@ -179,38 +177,13 @@ class hpswitch :
# Config snmp # Config snmp
self.get, self.set, self.walk = config_snmp_secrete(snmp,switch) self.get, self.set, self.walk = config_snmp_secrete(snmp,switch)
def __ssh(self,cmd,timout=15) : def send_cmd(self,cmd,timout=15) :
""" Envoi une commande par ssh au switch """
if not self.__conn_ssh : if not self.__conn_ssh :
self.__conn_ssh = ssh(self.switch) self.__conn_ssh = ssh(self.switch)
return self.__conn_ssh.send_cmd(cmd,timout) return self.__conn_ssh.send_cmd(cmd,timout)
def set_prise(self,prise,action) :
"""
Effectue l'action action donnée sur la (les) prise(s) donnée(s)
'prise' peut être un ensembre de prises :
ex : '1-3,6' effectuera l'action sur les prises 1,2,3 et 6
'action' peut être principalement
enable/disable
speed-duplex [auto-100/auto-10]
voir manuel des swtichs pour plus d'actions possibles
"""
if not prise : prise = self.prise
if self.__debug : self.__logDest.write("HP DEBUG : set_prise(prise=%s,action=%s)\n" %( prise,action))
return self.__ssh( "interface ethernet %s %s" % (prise,action) )
def show_stats(self,prise='') :
""" Retourne les stats de(s) prise(s) choisie(s)."""
if not prise : prise = self.prise
if self.__debug : self.__logDest.write("HP DEBUG : show_prise_status(prise=%s)\n" % prise)
if prise :
return self.__ssh("show interfaces ethernet %s" % prise)
else :
return self.__ssh("show interfaces")
def show_prise_mac(self,prise='') : def show_prise_mac(self,prise='') :
""" Retourne le(s) adresse(s) MAC présentes sur la prise.""" """ Retourne le(s) adresse(s) MAC présentes sur la prise."""
if not prise : prise = self.prise if not prise : prise = self.prise
@ -242,72 +215,27 @@ class hpswitch :
# On a rien trouvé # On a rien trouvé
return None return None
def __scp(self,destination,fichier) :
if self.__debug :
self.__logDest.write("HP DEBUG : scp(%s,%s,%s)\n" % (file, self.switch, destination))
if exists(file):
system('scp %s %s:%s' % (file, self.switch, destination))
def set_prise_mac(self,prise='',mac='') : def update(self,file=None) :
""" Défini les adresses mac autorisées sur une prise. """ Upload le fichier de config fourni
Fait rebooter le switch """
self.__scp('cfg/startup-config',file)
/!\ format de la mac : xxxxxx-xxxxxx (x hexa) def upgrade(self,file=None) :
On peut aussi en mettre plusieus séparées par des espaces. """ Changement de firmware,
Si mac est précédé de -, enlève les adresses (si juste - les vire toutes) le firmware est dans le fichier fourni en argument
Ne reboote pas le switch """
self.__scp('os/primary',file)
Si mac n'est pas fourni retourne le(s) adresse(s) MAC autorisées sur la prise. def add_key(self,file=None) :
Si prise n'est pas fourni retourne la config de sécurité de tous les ports """ Ajoute la clef publique ssh aux clefs autorises
""" par le switch """
if not prise : prise = self.prise self.scp('ssh/mgr_keys',file)
if self.__debug : self.__logDest.write("HP DEBUG : set_prise_mac(prise=%s,mac=%s)\n" % (prise,mac))
if not mac :
return self.__sudo("show port-security %s" % prise)
if mac[0]=='-' :
no='no '
mac=mac[1:]
else :no=''
return self.__ssh("%sport-security ethernet %s mac-address %s" % (no, prise,mac) )
def show_interfaces(self,prise='') :
""" Retourne la liste des interfaces ainsi que leur état
Si prise est spécifié n'affiche que la prise demandée """
if not prise : prise = self.prise
if self.__debug : self.__logDest.write("HP DEBUG : show_interfaces(prise=%s)\n" % prise)
a = self.__ssh("show interfaces brief")
if a and prise :
a=a.split('\n')
try : a='\n'.join(a[:5]+[a[prise+4]],'\n')
except : a=0
return a
def update(self) :
""" Upload de la config courrante
Téléchargment de la nouvelle config
Reboot."""
if self.__debug : self.__logDest.write("HP DEBUG : update()\n")
# Sauvegarde
self.__ssh("copy running-config tftp %s %s unix" % (self.IP_tftp, self.switch + '.running') )
try :
print self.__ssh("copy tftp startup-config %s %s unix" % (self.IP_tftp, self.switch+'.conf') )
except ConnectionClosed :
# C'est normal : le switch reboote
pass
def upgrade(self) :
""" Changement de firmware, le firmware est sur la machine
ayant le serveur tftfp et a pour nom firmware26xx """
if self.__debug : self.__logDest.write("HP DEBUG : upgrate()\n")
print self.__ssh("copy tftp flash %s %s" % (self.IP_tftp, self.firmware_file) , 120) # Long timout
def reboot(self) :
""" Reboote le switch """
if self.__debug : self.__logDest.write("HP DEBUG : reboot()\n")
try :
self.__ssh("boot")
except ConnectionClosed :
# C'est normal : le switch reboote
pass
# Fonction utilisant le SNMP
def multicast(self,ip='') : def multicast(self,ip='') :
""" Donne la liste des ports du swich inscrits au flux multicast donné """ Donne la liste des ports du swich inscrits au flux multicast donné
@ -451,3 +379,51 @@ class sw_chbre(hpswitch) :
nom = 'Chambre_%s' % self.chbre.capitalize() nom = 'Chambre_%s' % self.chbre.capitalize()
if nom != self.nom() : if nom != self.nom() :
self.nom(nom) self.nom(nom)
if __name__ == '__main__' :
import sys, getopt
try :
options, arg = getopt.getopt(sys.argv[1:], 'hs:c:', [ 'help' ])
except getopt.error, msg :
print msg
sys.exit(1)
switchs = []
cmds = []
for opt, val in options :
if opt == '-h' or opt=='--help' :
print "Usage : %s -c commande1 -c commande2... -s switch1 -s switch2..."
print "Envoi les commandes données au switchs dont le nom est fourni"
print "si aucun switch est founi envoi à tous les switchs"
print "si aucune commande est founie lit l'entree standart"
sys.exit(0)
elif opt=='-s' :
switchs.append(val)
elif opt=='-c' :
cmds.append(val)
if not switchs : switchs = all_switchs()
if not cmds :
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
sleep(2)
if arg :
print "ERREUR, argument invalide"
print 'Attention, ne pas oublier les " pour les commandes'
sys.exit(2)
for sw in switchs :
print sw
s = hpswitch(sw)
for cmd in cmds :
print s.send_cmd(cmd)