Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2021, 16:46   #1
tivoti
Новичок
Джуниор
 
Регистрация: 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()
tivoti вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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