diff --git a/gestion/hptools.py b/gestion/hptools.py old mode 100644 new mode 100755 index 99324821..b72f6335 --- a/gestion/hptools.py +++ b/gestion/hptools.py @@ -1,4 +1,4 @@ -# -*- python -*- +#!/usr/bin/env python # -*- coding: iso-8859-15 -*- """ @@ -13,9 +13,11 @@ from time import sleep from popen2 import popen3 from sys import stderr, path 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 except : # Si a pas le droit de lire config_snmp_secrete @@ -162,10 +164,6 @@ class hpswitch : __debug=0 __logDest=stderr - # Quelques paramètres - IP_tftp = '138.231.136.7' - firmware_file = 'firmware26xx' - # Variables internes switch = None # nom du switch prise = '' @@ -179,38 +177,13 @@ class hpswitch : # Config snmp 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 : self.__conn_ssh = ssh(self.switch) 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='') : """ Retourne le(s) adresse(s) MAC présentes sur la prise.""" if not prise : prise = self.prise @@ -242,73 +215,28 @@ class hpswitch : # On a rien trouvé return None - - def set_prise_mac(self,prise='',mac='') : - """ Défini les adresses mac autorisées sur une prise. - - /!\ format de la mac : xxxxxx-xxxxxx (x hexa) - On peut aussi en mettre plusieus séparées par des espaces. - Si mac est précédé de -, enlève les adresses (si juste - les vire toutes) - - Si mac n'est pas fourni retourne le(s) adresse(s) MAC autorisées sur la prise. - Si prise n'est pas fourni retourne la config de sécurité de tous les ports - """ - if not prise : prise = self.prise - 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 __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 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 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 + Ne reboote pas le switch """ + self.__scp('os/primary',file) + + def add_key(self,file=None) : + """ 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. @@ -451,3 +379,51 @@ class sw_chbre(hpswitch) : nom = 'Chambre_%s' % self.chbre.capitalize() if nom != self.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) +