网络API库。网络设备的编程接口

netapi的Python项目详细描述


NetAPI

执行核心工作的网络API库-请求执行和数据分析。

它依赖于主要供应商库来执行其工作,其主要目标是授予可用于应用程序的网络对象。

安装

您可以使用pip直接安装它

pip install netapi

开发版本

您需要poetry来关闭和安装repo

工作原理

是抽象目标设备上收集的数据的连接和解析方法的库。然后,它将显示一个开发人员友好的对象,您可以使用它与之交互。

所有的对象都是用一些很酷的特性创建的,这些特性可以用来操作它们的属性并在上面创建应用程序。例如,接口的ipv4地址返回的IPNetwork对象。你稍后会看到的。

库分为三种主要对象类型:

  • device:这些是用于netprobes对象的连接器对象。执行和数据收集所需的。
  • net:这些是网络{em1}$entities,基本上是指网络协议的技术或部分,如接口、vlan、vrrp、bgp等……
  • probe:这些是要在device对象中运行的测试程序对象。例如pingtrace

还有一个Metadata对象,它收集有关实现、对象执行了多少次以及时间戳的信息。对报告和其他测试有用。

网络实体示例

下面是使用网络实体时如何使用库的示例。在这种情况下Interface

# Use Arista pyeapi client for connectionfromnetapi.connector.pyeapierimportDevicefromnetapi.net.pyeapierimportInterfacefrompprintimportpprint# Create a device connection object using its api https interfacerouter01=Device(host="192.168.0.77",username="someuser",password="somepassword",transport="https")

显示设备连接属性,请注意隐藏了机密

print(router01)Device(host='192.168.0.77',username='someuser',port=None,net_os='eos',transport='https')

您可以查看此实例的元数据,并获取诸如时间戳、实现类型、实例ID等信息:

print(router01.metadata)Metadata(name='device',type='entity',implementation='EOS-PYEAPI',created_at=DateTime(2019,5,14,16,47,35,319134),id=UUID('51d317ab-584d-4f32-a789-402770c361f2'),updated_at=None,collection_count=0,parent=None)

您可以运行命令/操作并检索其输出。格式主要取决于设备、网络操作系统、实现(例如eos-pyeapi或原始ssh)和命令类型。

>>>pprint(router01.run('show version')){'show version':{'architecture':'i386','bootupTimestamp':1557851831.0,'hardwareRevision':'','internalBuildId':'1a44ce37-92c4-48b6-b922-38b7eed939b6','internalVersion':'4.21.5F-11604264.4215F','isIntlVersion':False,'memFree':1372616,'memTotal':2015608,'mfgName':'','modelName':'vEOS','serialNumber':'','systemMacAddress':'0c:59:30:85:d7:1d','uptime':1158.4,'version':'4.21.5F'}}

这个库为众所周知的网络技术提供公共处理程序。下面是管理1接口的示例。请注意,我传递了设备连接器对象:

>>>mgmt1=Interface(name="Management1",connector=router01)# You can collect its attributes by running the get() method>>>mgmt1.get()

你可以看到它的属性。因为它是一个界面,所以我只显示一些关键的界面

print(mgmt1)Interface(name='Management1',description='Some description',enabled=True,instance='MANAGEMENT',members=None,status_up=True,status='connected',last_status_change=DateTime(2019,5,9,11,40,38,144796,tzinfo=Timezone('Europe/Dublin')),number_status_changes=4,last_clear=DateTime(2019,5,9,11,34,32,150340,tzinfo=Timezone('Europe/Dublin')),update_interval=5.0,forwarding_model='routed',physical=InterfacePhysical(mtu=Byte(1500.0),bandwidth=Bit(1000000000.0),duplex='duplexFull',mac=EUI('28-99-3A-F8-5D-E7')),optical=InterfaceOptical(tx=-2.5,rx=-5.4,status="green",serial_number="XXXYYYZZZ",media_type="10GBASE-SR"),addresses=InterfaceIP(ipv4=IPNetwork('10.193.0.177/24'),ipv6=None,secondary_ipv4=[],dhcp=None))

注意:默认情况下,counters属性不被引用。您可以直接使用<interface_obj>.counters

这里有多个参数,但我向其他人发出了命令,但您可以看到IP地址是Netaddr IPNetwork对象,而MAC地址也是EUI对象。计数器刷新间隔也是datetime对象。

这些实例还具有元数据

>>>print(mgmt1.metadata)Metadata(name='interface',type='entity',implementation='EOS-PYEAPI',created_at=DateTime(2019,5,14,16,43,44,819105),id=UUID('73297adf-a0d6-4f8d-b247-0d793e577efb'),updated_at=DateTime(2019,5,14,16,43,54,483277),collection_count=1,parent=None)

您可以看到元数据中的updated_at字段已填充?这是因为我们调用了get()方法来收集数据。现在,让我们更改接口描述并刷新接口数据(这是在脚本之外完成的)

假设对描述进行了更改,现在再次检索数据

>>>print(mgmt01.description)DUMMYDESCRIPTION

您可以看到描述发生了更改,但元数据也已更新!

>>>print(mgmt01.metadata)Metadata(name='interface',type='entity',implementation='EOS-PYEAPI',created_at=DateTime(2019,5,14,16,43,44,819105),id=UUID('73297adf-a0d6-4f8d-b247-0d793e577efb'),updated_at=DateTime(2019,5,14,17,20,27,557810),collection_count=2,parent=None)

您可以在“已更新”中看到“已更新”),收藏计数已增加到2

网络探测器示例

这是一个针对特定IP地址运行ping并对结果应用自定义分析的简单示例。

首先启动设备对象并指定目标

>>>fromnetapi.connector.linux.subprocesserimportDevice>>>fromnetapi.probe.linux.subprocesserimportPing>>>host=Device()>>>ping=Ping(target="1.1.1.1",connector=host)

您可以看到具有以下属性的Ping对象:

>>>print(ping)Ping(target='1.1.1.1',target_ip=None,target_name=None,resolve_target=False,source=None,source_ip=None,instance=None,count=5,timeout=2,size=692,df_bit=False,interval=1.0,ttl=None,result=None)

您可以看到result属性是空的,我们需要告诉您执行Ping,并且可以对其应用我们自己的逻辑。

ping对象将在我的机器上执行,哟您可以看到在ping_cmd

上使用的命令
>>>ping.generate_ping_cmd()>>>print(ping.ping_cmd)'ping 1.1.1.1 -s 692 -c 5 -W 2 -i 1.0'

如果我们以es的形式执行它,我们可以得到类似于

>>>ping.execute()True>>>print(ping)Ping(target='1.1.1.1',target_ip=None,target_name=None,resolve_target=False,source=None,source_ip=None,instance=None,count=5,timeout=2,size=692,df_bit=False,interval=1.0,ttl=None,result=PingResult(probes_sent=5,probes_received=5,packet_loss=0.0,rtt_min=25.303,rtt_avg=30.289,rtt_max=43.923,warning_thld=None,critical_thld=None,status='ok',status_up=True,status_code=0,apply_analysis=True))

我们可以在执行中使用自己的阈值来操作flagstatus_up参数。

>>>ping.execute(critical_thld=-1)True>>>ping.resultPingResult(probes_sent=5,probes_received=5,packet_loss=0.0,rtt_min=19.241,rtt_avg=23.471,rtt_max=26.184,warning_thld=None,critical_thld=-1,status='critical',status_up=False,status_code=2,apply_analysis=True)# If you want to have a dict>>>ping.to_dict(){'count':5,'df_bit':False,'instance':None,'interval':1.0,'metadata':{'collection_count':4,'created_at':'2019-07-05T18:19:30.075757+01:00','id':'03d55fdf-2e0d-4a66-9f18-ef33a811bc2e','implementation':'LINUX-SUBPROCESS','name':'ping','parent':None,'type':'entity','updated_at':'2019-07-05T18:32:32.840095+01:00'},'resolve_target':False,'result':{'apply_analysis':True,'critical_thld':-1,'packet_loss':0.0,'probes_received':5,'probes_sent':5,'rtt_avg':23.732,'rtt_max':27.673,'rtt_min':19.733,'status':'critical','status_code':2,'status_up':False,'warning_thld':None},'size':692,'source':None,'source_ip':None,'target':'1.1.1.1','target_ip':None,'target_name':None,'timeout':2,'ttl':None}

您可以看到这是status_up = False,即使所有探测都已成功接收。用于自定义测试。

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

推荐PyPI第三方库


热门话题
Java中是否有数字的默认类型   java调用一个类的方法来使用另一个类的实例   java HtmlUnit不适用于javascript处理   java需要帮助才能连接MongoDB   java如何从Maven中的src/main/resources复制文件?   java保存Int值(共享首选项)   从另一个类调用方法时,java Autowired组件出现空指针异常   java Spring JPA:PropertyAccessException 1:。。。MethodInvocationException:。'driverClassName'。。。org/postgresql/Driver:不支持的专业。次要版本52.0   java使用增强的JDO模型类在Eclipse中运行Junit测试   java如何使用eclipse IDE为junit创建可运行的jar文件   java如何在安卓中检测应用程序的启动和退出   java在其他线程可以访问静态映射时从数据库更新静态映射   java@Entitty和@EntityScan不起作用。我正在使用SpringBoot和jpa存储库,发生了很多次   java如何与google日历集成?