
* Les requêtes de type lecture seule marchent très bien tout court ; * Celles de type écriture sont sans effet sous wheezy. C'est a priori un bug dans python-netsnmp
139 lines
3.7 KiB
Python
139 lines
3.7 KiB
Python
#!/bin/bash /usr/scripts/python.sh
|
|
# -*- coding: utf-8 -*-
|
|
"""Contient la définition et les outils pour bosser avec
|
|
les ports.
|
|
|
|
C'est essentiellement une couche d'abstraction, les fonctions
|
|
utiles sont appelées avec les switches."""
|
|
|
|
import netaddr
|
|
|
|
from .mac import MACFactory, bin_to_mac
|
|
|
|
class HPSwitchPort(object):
|
|
"""Classe représentant le port d'un switch"""
|
|
|
|
def __init__(self, num, parent, ptype=None):
|
|
"""Permet de lier un port au switch parent."""
|
|
self.__num = num
|
|
self.__ptype = ptype
|
|
self.__parent = parent
|
|
self.__macs = []
|
|
self.__multicast = []
|
|
self.__vlans = []
|
|
self.__oper = False
|
|
self.__admin = False
|
|
self.__alias = None
|
|
self.__eth = None
|
|
|
|
def name(self):
|
|
"""Retourne le nom du port"""
|
|
|
|
return "%s%02d" % (self.__parent.name(), self.__num)
|
|
|
|
def get_vlans(self):
|
|
"""Retourne les vlans du port"""
|
|
return self.__vlans
|
|
|
|
def add_vlan(self, vlan):
|
|
"""Ajoute le vlan à la liste"""
|
|
self.__vlans.append(vlan)
|
|
|
|
def purge_vlans(self):
|
|
"""Purge la liste des vlans connus du port"""
|
|
self.__vlans = []
|
|
|
|
def get_eth(self):
|
|
"""Récupère l'alias du port"""
|
|
if self.__eth is None:
|
|
self.__parent.update_eth_speed()
|
|
return self.__eth
|
|
|
|
def set_eth(self, val):
|
|
"""Affecte le nom"""
|
|
self.__eth = val
|
|
|
|
def get_alias(self):
|
|
"""Récupère l'alias du port"""
|
|
if self.__alias is None:
|
|
self.__parent.update_ports_aliases()
|
|
return self.__alias
|
|
|
|
def set_alias(self, alias):
|
|
"""Affecte le nom"""
|
|
self.__alias = alias
|
|
|
|
def append_mac(self, mac):
|
|
"""Ajoute une mac au port"""
|
|
self.__macs.append(MACFactory.register_mac(bin_to_mac(mac), self))
|
|
|
|
def get_macs(self, update=False):
|
|
"""Récupère les adresses mac depuis le parent"""
|
|
if not self.__macs or update:
|
|
# On boucle sur les macs et on les sépare du parent actuel (vu
|
|
# qu'on va régénérer sa liste de macs).
|
|
self.flush_macs()
|
|
|
|
__ret = self.__parent.client.walk('hpSwitchPortFdbAddress.%d' % (self.__num,))
|
|
self.__macs = [MACFactory.register_mac(bin_to_mac(ret['val']), self) for ret in __ret]
|
|
return self.__macs
|
|
|
|
def flush_macs(self):
|
|
"""Vire les macs"""
|
|
if not self.__macs:
|
|
return True
|
|
|
|
for mac in self.__macs:
|
|
mac.remove_parent(self)
|
|
|
|
self.__macs = []
|
|
return True
|
|
|
|
def append_multicast(self, multi_ip):
|
|
"""Ajoute l'IP aux multicasts"""
|
|
self.__multicast.append(netaddr.IPAddress(multi_ip))
|
|
|
|
@property
|
|
def multicast(self):
|
|
"""Retourne les ip multicast liées au port."""
|
|
return self.__multicast
|
|
|
|
def flush_multicast(self):
|
|
"""Vire les infos sur le multicast."""
|
|
self.__multicast = []
|
|
|
|
@property
|
|
def parent(self):
|
|
"""Property sur __parent"""
|
|
return self.__parent
|
|
|
|
@property
|
|
def oper(self):
|
|
"""Retourne l'oper status"""
|
|
return self.__oper
|
|
|
|
@property
|
|
def admin(self):
|
|
"""Retourne l'admin status"""
|
|
return self.__admin
|
|
|
|
@admin.setter
|
|
def admin(self, stat):
|
|
"""Met à jour l'admin status. Si stat n'est pas bon, met 3 (testing)"""
|
|
try:
|
|
stat = int(stat)
|
|
except TypeError:
|
|
stat = 3
|
|
|
|
self.__admin = stat
|
|
|
|
@oper.setter
|
|
def oper(self, stat):
|
|
"""Met à jour l'oper status. Si stat n'est pas bon, met 4 (unknown)"""
|
|
try:
|
|
stat = int(stat)
|
|
except TypeError:
|
|
stat = 4
|
|
|
|
self.__oper = stat
|
|
|