最小snmp实现

snmp的Python项目详细描述


#概述
我在2017年底或2018年初开始从事这一项目,希望建立一个易于使用且直观的图书馆。我在2018年完成了多个初稿,当我发现设计中固有的缺陷时,每一个都作废了。github存储库包含一个"notes.txt"文件,在该文件中,我记录了我在几个迭代过程中的想法。简而言之,我发现最流行的库是不必要的复杂,甚至是错误的(但是,我必须说,实际上我发现snimpy相当优雅,我对它的任何一点反感都可能是我认为太像c程序员的一个迹象)。我发现自己在尝试为其他项目做贡献时很沮丧,因为它们太大了,我无法全身心投入,所以我决定从头开始。

这个包是专门为python 3编写的。python 2不能保证正确的操作。

目前只支持snmpv1。不支持解析mib文件,这意味着只能使用数字oid。

所有请求都由"manager"处理,它是使用"snmp.manager()"工厂函数创建的。所有请求都返回一个列表,其中包含"varbind"类型的条目。` varbind`objects有两个属性:"name"是一个"oid"对象,"value"是表示asn.1数据类型的几种类型之一。snmp.types模块定义了一个名为asn1的基类,以及几个原语:"integer"、"octet_string"、"null"、"oid"和"sequence"。根据ASN.1编码中使用的"type"字节("ipaddress"、"counter32"等),为每个子类定义子类。这些类型可以用".value"属性解码为python原语。请注意,"octet_string"在默认情况下将使用"bytes",而不是"str"。在asn.1的规则中,八位字节字符串可以用来表示非ascii数据,并且尝试解码这些数据可能会意外地导致"unicodedecodeerror"。此规则的例外是"ipaddress"子类型,它使用"socket.inet_ntoa"和"socket.inet_aton",将长度为4的"bytes"对象转换为"str",反之亦然。

此函数的唯一特定参数是"version"参数。提供的任何其他参数都将直接传递给该版本的管理器的构造函数。从0.1.x版开始,仅支持版本1,这意味着不需要"version"参数。


resend=1)


如果未提供"rwcommunity"参数,"community"参数将用于所有请求。另一方面,您可以选择将"rwcomunity"与"community"参数一起提供,在这种情况下,"rwcomunity"将用于set请求,"community"将仅用于get和getnext请求。

"port"是要向其发送请求的udp端口号。

在发送请求后的某个窗口内未收到响应,管理器将重新发送请求,直到超过较长的超时时间为止。"ressend"参数指示在重新发送原始请求之前等待响应的秒数,可以是"float"或"int"。构造函数中没有给定timeout参数,但可以在发出请求时指定,从而允许不同的请求具有不同的超时值。


此软件包0.1.0版中引入的一个关键设计改进是能够发送请求而不阻塞等待响应。因为这个功能是与大多数其他包不一致,默认行为是请求函数阻塞,直到收到响应,然后返回请求的值。详细信息主要记录在下面详述get请求的部分中,并根据需要在其他部分中添加注释。


此方法具有以下原型:


`host`是目标主机的IPv4地址。此时不支持主机名或IPv6地址。

`oids`允许一次请求可变数量的oid。函数的返回值将是一个"varbind"对象列表,其中的"ith"元素对应于"ith"oid。如果"block"为"false",则返回列表中的"none"值表示该oid的值尚不可用。

"community"允许您指定用于此特定请求的备用community字符串。只有在第一次从特定主机请求oid时,或者当"refresh"为"true"时,才有必要这样做。例如,如果在"block"被指定为"false"的情况下进行初始调用,则将使用"community"的给定值,但当稍后进行阻止调用以检索该值时,则不需要"community"。

"block"可以设置为"false",以使函数在请求已发送,而未等待响应。稍后可以通过再次调用函数来检索该值,通常将"block"设置为"true"(或ommitted)。只有当一个管理器将用于同时与多个主机通话时,这才最有用,允许并行处理请求,而不是浪费时间等待每一个串联的请求。

`timeout`是等待响应的最大秒数。如果"block"为"true",则如果在该时间内未收到响应,则会引发"snmp.exceptions.timeout"异常。如果"block"为"false",则在再次调用该函数以获取响应之前不会引发异常。

"refresh"将放弃已在本地存储的请求的oid的任何先前值。默认情况下,不发送网络通信量来重新请求变量的值,除了使用给定的管理器对象对该变量的第一个请求,或者当"refresh"设置为"true"时。只应在发送请求时设置此值,这意味着如果"block"和"refresh"都为"true",则在稍后调用检索值时,"refresh"应为"false",因为请求已发送。

"next":将此参数设置为"true"`将发送getNext请求,而不是get请求。get next()函数也存在,但它只是一个包装函数,调用"get()",其中"next"设置为"true"。


但是,为了可读性,还提供了一个"get_next()"函数。此函数接受与"get()"相同的所有参数。


timeout=10)

虽然协议在技术上允许在一个请求中执行多个set操作,但为简单起见,该函数仅支持一次设置一个变量,尽管将来可能会发生变化。"value"参数可以是"asn1"的子类型,但如果它是以python本机类型给定的,它将被自动转换。

"community"和"timeout"参数的工作方式与上面对"get()"的描述完全相同。

"block"参数引入了一些有趣的注意事项。默认情况下,函数将阻止直到操作成功返回,并将返回一个列表,其中包含响应中包含的varbind的单个条目。另一方面,如果'block'被指定为'false',则一旦发送请求,函数将返回一个值none,然后应该通过调用'get()'来检查结果,而不是再次调用'set()'。调用"set()"与调用"refresh"设置为"true"的"get()"具有相同的效果,因此"get()"方法保证在收到set请求的响应之前不会返回。

管理器在get和set请求之间强制执行本质上是writer首选读写器策略。换句话说,只要存在尚未收到响应的未完成get请求,就不能发送set请求。这意味着,即使"block"被指定为"false",在发送请求之前,"set()"方法可能仍会阻塞很短的时间(直到未完成的get请求的"timeout"。


目前它一次只能在一个变量上行走,但将来它将能够并行行走多个变量。为了提高响应性,函数被实现为生成器,但遍历的每个步骤都被执行为阻塞的getnext操作。


函数原型如下:

walk(self,host,oid,community=none,refresh=false,超时=10)


\您的社区字符串
manager=manager(b'public')

try:
hosts=["10.0.0.2","10.0.0.3"]\start=time.time()

next=true)

打印(var)

end=time.time()
print("花了{}秒"。格式(end-start))

对象必须在不再需要时关闭(通过调用`.close()`)。否则可能导致程序挂起,而不是正确终止。从v0.1.5开始,"manager"可以与上下文管理器一起使用,在这种情况下,在退出上下文管理器主体时将调用".close()"。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在没有代码气味的情况下编写遵循Liskov替代和其他可靠原则的不可变映射?   java最新jre上的压缩字符串对旧编译代码有好处吗?   java是否可以在javascript中取消PrimeFaces menuitem onclick函数   mysql从SQL数据库中访问java中xml名称空间标记的值   从java程序打开excel文件   java在方法中使用“var”是否会使执行(并发)线程不安全?   java使搜索视图以一种关于AndroidManifest的通用方式可用。xml   java对如何准确使用正则表达式感到困惑?   mule如何访问java文件中的记录变量   java在从2D数组引发异常后继续   枚举当前设置为的java值   java当listview只有几个项目时,如何使alert对话框显示listview的所有项目?   java getTableRow()返回大于项大小的索引   c用java传输二进制文件(数据)   java更改多选列表项复选框颜色