|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.03.2021, 16:46 | #1 |
Новичок
Джуниор
Регистрация: 10.03.2021
Сообщений: 3
|
Обработка данных по SNMP
у нас стоит 3 IBM Blade шасси, модель 8677
внутри шасси стоит модуль управления - Advanced Management Module нам нужно 1. найти SNMP записи о текущем потреблении каждого из 14ти серверов 2. передать эту информацию в панель управления DCIManager ////////////////////////////////////////////////////// /Код в него надо добавить ... Помогите ......................... #coding=utf8 import sys import os import xml.etree.ElementTree as xmlET from pysnmp.entity.rfc3413.oneliner import cmdgen from pysnmp.proto import rfc1902 def xpath_result( root, xpath ): res = root.findall( xpath ) if len( res ) == 1: return res[0].text else: return "" #Исключения, который могут произойти во время работы с устройством. class ConnectionProblem( Exception ): def __init__( self ): #Всего возможны два типа проблемы. #connection - проблема с соединением и... print "<doc><error><type>connection</type><text>Unable to connect. Check address or community string.</text></error></doc>" class UnexpectedDataProblem( Exception ): def __init__( self, msg ): #... unexpected_data - проблема обмена данными с устройством. print "<doc><error><type>unexpected_d ata</type><text>" + msg + "</text></error></doc>" #Различный функции преобразований значений от устройства к панели и обратные. def IBMPortStatusToIFXStr( val ): return "on" if val == 1 else "off" #Класс обработчика. class PowerSimpleHandler: def __init__( self, request_from_ifx ): #Инициалзиация всех объектов необходимых для SNMP запроса. self.__cmdGen = cmdgen.CommandGenerator() xmlRoot = xmlET.fromstring( request_from_ifx ) self.__Community = cmdgen.CommunityData( xpath_result( xmlRoot, "./device_params/snmp_community" ), mpModel=0 ) self.__Target = cmdgen.UdpTransportTarget((xpath_re sult( xmlRoot, "./device_params/ip" ), 161)) #Определяем функцию, которую вызвал IFXmanager и вызываем соотвествующий метод func_name = xpath_result( xmlRoot, "./func" ) if func_name == "status": self.__Status() elif func_name == "port_off": self.__PortOff( xpath_result( xmlRoot, "./port/identity" ) ) elif func_name == "port_on": self.__PortOn( xpath_result( xmlRoot, "./port/identity" ) ) elif func_name == "port_reset": self.__PortReset( xpath_result( xmlRoot, "./port/identity" ) ) def __PortOff( self, ident ): #Выключаем порт self.__SnmpSet( "1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7. " + ident, rfc1902.Integer( 0 ) ) #Сообщаем панели новое состояние порта output = "<doc><port>" output += "<identity>" + ident + "</identity>" output += "<admin_status>off</admin_status>" output += "</port></doc>" print output def __PortOn( self, ident ): #Включаем порт self.__SnmpSet( "1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7. " + ident, rfc1902.Integer( 1 ) ) #Сообщаем панели новое состояние порта output = "<doc><port>" output += "<identity>" + ident + "</identity>" output += "<admin_status>on</admin_status>" output += "</port></doc>" print output def __PortReset( self, ident ): #Перегружаем порт self.__SnmpSet( "1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8. " + ident, rfc1902.Integer( 1 ) ) #Сообщаем панели новое состояние порта output = "<doc><port>" output += "<identity>" + ident + "</identity>" output += "<admin_status>on</admin_status>" output += "</port></doc>" print output def __Status( self ): output = "<doc>" ports = {}#Составляем словарь портов, где ключом будет идентификатор порта. #Определяем реальное состояние портов. for ident, admin_status in self.__SnmpWalk( "1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4. " ).iteritems(): ports[ident] = self.DevicePort(ident) ports[ident].AdminStatus = IBMPortStatusToIFXStr( admin_status ) #Читаем названия блейдов for ident, descr in self.__SnmpWalk( "1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6. " ).iteritems(): #если лезвия нет на месте, меняем (No name) на Not installed if descr == "(No name)": descr = "Not installed" if len(ident) < 2: nnum = "0" + ident else: nnum = ident descr = nnum + " : " + descr ports[ident].Description = descr #Сообщаем полный список портов панели. output = "<doc>" for port in ports.values(): output += "<port>" output += "<identity>" + port.Identity + "</identity>" output += "<description>" + port.Description + "</description>" output += "<admin_status>" + port.AdminStatus + "</admin_status>" output += "</port>" output += "</doc>" print output #Установка значения mib. Переданное значение должно быть приведено к типу в соответствии с rfc1902 def __SnmpSet( self, mib, value ): errorIndication, errorStatus, errorIndex, varBinds = self.__cmdGen.setCmd( self.__Community, self.__Target, ( cmdgen.MibVariable( mib ), value ) ) if errorIndication: raise ConnectionProblem #Обход дерева заданного mib. def __SnmpWalk( self, mib ): errorIndication, errorStatus, errorIndex, varBindTable = self.__cmdGen.nextCmd( self.__Community, self.__Target, cmdgen.MibVariable( mib ) ) if errorIndication: raise ConnectionProblem result_map = {} for varBindTableRow in varBindTable: for name, val in varBindTableRow: result_map[name.prettyPrint().rpartition( "." )[2]] = val return result_map class DevicePort: def __init__( self, ident ): self.Identity = ident Identity = "" Description = "Blade" AdminStatus = "unknown" @staticmethod def Info(): output = "<doc>" #Тип устройства output += "<type>PDU</type>" output += "<name>IBM Blade Power</name>" #Используем SNMP v1 output += "<requirements>" output += "<snmpv1/>" output += "</requirements>" #IFXmanager будет вызывать у обработчика PDU только 4 функции: output += "<supported_funcs>" #получение списка портов output += "<status/>" #выключение порта output += "<port_off/>" #включение порта output += "<port_on/>" #перезагрузка порта output += "<port_reset/>" output += "</supported_funcs>" output += "</doc>" print output __cmdGen = None __Target = None __Community = None def main(): if len(sys.argv) > 1 and sys.argv[1] == "-info": #Если есть ключ -info, то выдаём информацию об обработичке PowerSimpleHandler.Info() else: #Во всех остальных случаях читаем поток ввода и создаём объект обработичка, #который выполнит обработку запроса от IFXmanager. request_str = request_str = sys.stdin.read() PowerSimpleHandler( request_str ) #Запуск основной функции main() |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
SNMP. Описание пакета. | zaural | Помощь студентам | 1 | 15.05.2013 08:11 |
Инструментарий для работы с SNMP | Darkwinged | Помощь студентам | 0 | 25.09.2012 19:36 |
snmp | linuxoid1 | Работа с сетью в Delphi | 0 | 10.09.2010 12:57 |
snmp сервис | paxa_pil | PHP | 3 | 16.12.2009 01:18 |
SNMP и C++ | Александр_alex | Помощь студентам | 0 | 27.10.2009 09:32 |