#snmp #pysnmp #mib
#snmp #pysnmp #МиБ
Вопрос:
Я не могу установить DateAndTime в стандартном mib hrSystemDate mib при использовании pysnmp setCmd. У меня нет проблем с настройкой других MIB-файлов с помощью octetstring, единственная проблема связана с настройкой даты / времени, которая также является форматом octetstring. Я не уверен, чего мне не хватает. Пожалуйста, посоветуйте, как установить дату / время с помощью pysnmp setCmd.
Я могу установить дату и время с помощью snmpset в команде Windows, используя этот формат значений ‘2019-04-04,09:18:32.0, 13:0’,
например, snmpset -v3 -l authPriv -u snmpAdmin -a SHA -A «пароль» -x AES -X «пароль» -n терминал 192.168.0.5 .1.3.6.1.2.1.25.1.2.0 = 2019-04-04,09:18:32.0, 13:0
При ireasoning я также могу установить его в обоих форматах, dateandtime и octetstring Я пока не могу опубликовать картинку, поэтому вот ссылка. объяснение
Фрагмент
code
def setSnmpV3string(ip, context='terminal', oid='.1.3.6.1.4.1.2509.8.29.2.15.1.2.1',value=''):
errorIndication, errorStatus, errorIndex, varBinds = next(
setCmd(SnmpEngine(),
UsmUserData('snmpAdmin', 'password', 'password',
authProtocol=usmHMACSHAAuthProtocol,
privProtocol=usmAesCfb128Protocol),
UdpTransportTarget((ip, 161),),
ContextData(contextName=context),
ObjectType(ObjectIdentity(oid), OctetString(value) ))
)
values = ' = '
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
values = ' = '.join([x.prettyPrint() for x in varBind])
print(values)
return values.split(' = ')[1]
Вывод на консоль
OctetString(value)
<OctetString value object at 0x615ba90 tagSet <TagSet object at 0x502ca70 tags 0:0:4> subtypeSpec <ConstraintsIntersection object at 0x4fef090 consts <ValueSizeConstraint object at 0x4fe0b70 consts 0, 65535>> encoding iso-8859-1 payload [2019-04-04,10:27:41.0, 12:0]>
errorStatus
<Integer value object at 0x6106970 tagSet <TagSet object at 0x4ff59b0 tags 0:0:2> namedValues <NamedValues object 0x54d36b0 enums noError=0, tooBig=1, noSuchName=...Writable=17, inconsistentName=18> payload [commitFailed]>
Я предполагаю, что для pySnmp потребуется тот же тип ввода, что и для iReasoning, но у меня заканчивается подсказка о том, как это сделать. Спасибо!
Комментарии:
1. На уровне пакета отправляются необработанные байты, а не строка даты-времени. Вы должны выполнить некоторое преобразование в соответствии с документом RFC.
2. спасибо, я только что понял, что мне нужно использовать strut pack для преобразования строки даты и времени в байты. что-то вроде этого,
struct.pack('>HBBBBBBcBB', 'yyyy', 'mm','dd','H','M','S',0,b' ',time_offset,0)
которое будет b’x07 xe3 x04 x04 x0b x02! x07 r x00′ и может быть отправлено в вышеупомянутую функцию snmpV3string3. затем опубликуйте свой собственный ответ и примите его.
4. хорошо. Потребуется 48 часов, чтобы ответить на мой собственный вопрос.
Ответ №1:
Вы должны заставить pysnmp принимать временную метку в удобной для пользователя форме и преобразовать ее в серию октетов. Информация о формате содержится в ТЕКСТОВОМ соглашении SNMPv2-TC::DateAndTime:
DISPLAY-HINT "2d-1d-1d,1d:1d:1d.1d,1a1d:1d"
Чтобы pysnmp использовал это, вы можете передать имя объекта MIB ( HOST-RESOURCES-MIB::hrSystemDate
) вместо OID при подготовке команды SNMP:
...
ObjectType(ObjectIdentity('HOST-RESOURCES-MIB', 'hrSystemDate'), value)
Это работает аналогично, но в обратном порядке, для SNMP GET.
Ответ №2:
Для простого решения только для строки октета даты / времени я сделал следующее: я должен использовать strut pack для преобразования строки даты-времени в байты. что-то вроде этого, struct.pack(‘> hbbbbbbc’, ‘гггг’, ‘мм’, ‘дд’, ‘Ч’, ‘М’, ‘С’, 0, b ‘ ‘,time_offset,0), который будет b ‘ x07 xe3 x04 x04 x0b x02! x07 r x00’ и может будет отправлен в вышеупомянутую функцию snmpV3string