SNMPTraps:pysnmp 和 "disableAuthorization"
SNMPTraps: pysnmp and "disableAuthorization"
我已经编写了一个 SNMP 陷阱接收器,但目前我必须对所有 SNMPv2 社区字符串进行硬编码才能接收陷阱。
如何在 pysnmp 中模拟 snmptrapd 的 'disableAuthorization' 功能?
我曾尝试不设置社区字符串:config.addV1System(snmpEngine, 'my-area')
但此错误与缺少参数有关。我还尝试了一个空字符串:config.addV1System(snmpEngine, 'my-area', '')
但这会停止处理所有陷阱。
允许通过 pysnmp 接收所有陷阱的最佳方法是什么,而不管它们与它们一起发送的社区字符串如何?我没有在 pysnmp 文档中找到任何可以帮助我的东西
我在为 V1/2(V3 稍后添加)设置观察器方面取得了进展,该观察器接收带有未知社区字符串的通知,然后动态调用 addV1System 以动态添加它,像这样:
设置 transportDispatcher 时:
snmpEngine.observer.registerObserver(_handle_unauthenticated_snmptrap,
"rfc2576.prepareDataElements:sm-failure", "rfc3412.prepareDataElements:sm-failure")
然后:
def _handle_unauthenticated_snmptrap(snmpEngine, execpoint, variables, cbCtx):
if variables["securityLevel"] in [ 1, 2 ] and variables["statusInformation"]["errorIndication"] == errind.unknownCommunityName:
new_comm_string = "%s" % variables["statusInformation"].get("communityName", "")
config.addV1System(my_snmpEngine, 'my-area', new_comm_string)
return
else:
msg = "%s" % variables["statusInformation"]
print(f"Trap: { msg }")
但是,这总是会丢弃在添加任何新的社区字符串时收到的第一个陷阱(然后就会出现问题,即当守护程序重新启动时,社区字符串的更新列表会丢失)。
为了改进这一点,我发现隐藏在文档中的这个小东西 gem:
此示例收到通知并将社区字符串重写为 'public',以便正确接收所有陷阱。
本质上,在设置 transportDispatcher 时:
my_snmpEngine.observer.registerObserver(_trap_observer,
'rfc2576.processIncomingMsg:writable', cbCtx='public')
然后:
def _trap_observer(snmpEngine, execpoint, variables, community_string):
variables['communityName'] = variables['communityName'].clone(community_string)
我已经编写了一个 SNMP 陷阱接收器,但目前我必须对所有 SNMPv2 社区字符串进行硬编码才能接收陷阱。
如何在 pysnmp 中模拟 snmptrapd 的 'disableAuthorization' 功能?
我曾尝试不设置社区字符串:config.addV1System(snmpEngine, 'my-area')
但此错误与缺少参数有关。我还尝试了一个空字符串:config.addV1System(snmpEngine, 'my-area', '')
但这会停止处理所有陷阱。
允许通过 pysnmp 接收所有陷阱的最佳方法是什么,而不管它们与它们一起发送的社区字符串如何?我没有在 pysnmp 文档中找到任何可以帮助我的东西
我在为 V1/2(V3 稍后添加)设置观察器方面取得了进展,该观察器接收带有未知社区字符串的通知,然后动态调用 addV1System 以动态添加它,像这样:
设置 transportDispatcher 时:
snmpEngine.observer.registerObserver(_handle_unauthenticated_snmptrap,
"rfc2576.prepareDataElements:sm-failure", "rfc3412.prepareDataElements:sm-failure")
然后:
def _handle_unauthenticated_snmptrap(snmpEngine, execpoint, variables, cbCtx):
if variables["securityLevel"] in [ 1, 2 ] and variables["statusInformation"]["errorIndication"] == errind.unknownCommunityName:
new_comm_string = "%s" % variables["statusInformation"].get("communityName", "")
config.addV1System(my_snmpEngine, 'my-area', new_comm_string)
return
else:
msg = "%s" % variables["statusInformation"]
print(f"Trap: { msg }")
但是,这总是会丢弃在添加任何新的社区字符串时收到的第一个陷阱(然后就会出现问题,即当守护程序重新启动时,社区字符串的更新列表会丢失)。
为了改进这一点,我发现隐藏在文档中的这个小东西 gem:
此示例收到通知并将社区字符串重写为 'public',以便正确接收所有陷阱。
本质上,在设置 transportDispatcher 时:
my_snmpEngine.observer.registerObserver(_trap_observer,
'rfc2576.processIncomingMsg:writable', cbCtx='public')
然后:
def _trap_observer(snmpEngine, execpoint, variables, community_string):
variables['communityName'] = variables['communityName'].clone(community_string)