纯python库,允许读取scamper(caida的一个互联网测量工具)生成的warts文件格式
scamper-pywarts的Python项目详细描述
#关于pywarts
`pywarts'是一个针对warts格式的纯python解析库。
warts是一个可扩展的二进制格式,由caida的一个互联网测量工具scamper(http://www.caida.org/tools/measurement/scamper/)生成,存储测量结果
如traceroutes和pings。
解析架构的灵感来源于[ryu]包解析器(https://osrg.github.io/ryu/),尽管它不那么复杂,因为要求不那么严格。
traceroute)
-易于扩展为其他warts数据类型(欢迎使用修补程序)
-良好的基于类的接口
-相当好的性能(用traceroute数据解析一个80 mib的warts文件需要几分钟)
-流式接口:最多拉入一个记录
内存在任何给定的时间,因此它应该用有限的内存处理非常大的warts文件。您甚至可以直接从正在运行的scamper进程的输出中使用数据。唯一的公共api是非常低级的:它只是从
流(例如文件)中读取并作为python对象返回warts记录。
要读取记录,请反复调用"warts.parse_record",直到返回
"none"。记住在二进制模式下打开你的输入疣文件!
"warts.parse_record"的返回值是相应子类(例如"traceroute")的一个实例,具体取决于记录类型。
请注意,如果输入文件中不存在,则所有可选属性都设置为none。你应该经常在你的用户代码中检查这种可能性。并反复分析记录,直到找到traceroute记录(warts文件通常有几个
初始记录,其中大多数是无趣的数据)。
````
从warts导入warts
。traceroute导入traceroute
'rb')作为f:
记录=疣。解析记录(f)
而不是isinstance(记录,traceroute):
记录=疣。解析记录(f)
如果记录。src\u地址:
打印("traceroute源地址:",record.src_address)
如果record.dst_address:
打印("traceroute目的地址:",record.dst_address)
打印("跃点数:",len(record.hops))
打印(record.hops)
````
了解哪些属性可用,看看
相关类的定义(在某些时候会有真正的文档)。对于
实例,对于"traceroute",几乎所有属性都是可选的,并在这里定义
:
[traceroute.py](https://github.com/drakkar lig/scamper py warts/blob/master/warts/traceroute.py l34)。
有些属性不是可选的,在类的"parse()"方法中定义。例如,traceroute对象't'总是在't.hops'中提供一个'traceroutehop'对象的列表。
如果解析失败,则抛出一个'errors.parseerror'实例。
`pywarts'通常会在自身之后尝试清理,所以文件的描述符应该指向下一条记录,即使在解析错误之后也是如此。尤其是当输入文件格式不正确时。
:
-完全兼容python3
-更好的基于类的接口,而不是具有所有标志的大型dict
-正确处理未知标志和options,忽略它们通常会使属性名更具可读性(尽管这通常意味着更长的名称)
-可能会快一些(它需要适当的基准),因为
是解析标志和字符串的方式。此外,在解析之前,我们会将整个记录
读入内存,这比在非常小的数据量上重复调用
`read()`要快一些。在某些方面,cmand代码可以做更多的事情:
-`pywarts`没有实现不推荐的地址格式(它非常复杂,已经被弃用了好几年)
-在<;https://github.com/cmand/scamper>;,
中有一些不错的脚本,例如附加和控制正在运行的scamper
进程的脚本
只是记录的迭代器?是否允许按记录类型筛选?尝试进一步解析,例如解码
标志或为udp、tcp和icmp生成不同的对象
traceroutes?
-解析时是否应尝试使值正常化?例如,
我们应该对地址使用"ipaddr"对象吗?有时
用厘米表示,有的用微秒表示,有的用秒表示。
我们应该将其标准化为一个公共基吗?时间值的浮动是否可接受
?
-当出现解析错误时,我们应该怎么做?如果用户想继续分析下一条记录,他/她如何才能继续分析?
如果您对这些问题有想法和想法,请打开问题。
`pywarts'是一个针对warts格式的纯python解析库。
warts是一个可扩展的二进制格式,由caida的一个互联网测量工具scamper(http://www.caida.org/tools/measurement/scamper/)生成,存储测量结果
如traceroutes和pings。
解析架构的灵感来源于[ryu]包解析器(https://osrg.github.io/ryu/),尽管它不那么复杂,因为要求不那么严格。
traceroute)
-易于扩展为其他warts数据类型(欢迎使用修补程序)
-良好的基于类的接口
-相当好的性能(用traceroute数据解析一个80 mib的warts文件需要几分钟)
-流式接口:最多拉入一个记录
内存在任何给定的时间,因此它应该用有限的内存处理非常大的warts文件。您甚至可以直接从正在运行的scamper进程的输出中使用数据。唯一的公共api是非常低级的:它只是从
流(例如文件)中读取并作为python对象返回warts记录。
要读取记录,请反复调用"warts.parse_record",直到返回
"none"。记住在二进制模式下打开你的输入疣文件!
"warts.parse_record"的返回值是相应子类(例如"traceroute")的一个实例,具体取决于记录类型。
请注意,如果输入文件中不存在,则所有可选属性都设置为none。你应该经常在你的用户代码中检查这种可能性。并反复分析记录,直到找到traceroute记录(warts文件通常有几个
初始记录,其中大多数是无趣的数据)。
````
从warts导入warts
。traceroute导入traceroute
'rb')作为f:
记录=疣。解析记录(f)
而不是isinstance(记录,traceroute):
记录=疣。解析记录(f)
如果记录。src\u地址:
打印("traceroute源地址:",record.src_address)
如果record.dst_address:
打印("traceroute目的地址:",record.dst_address)
打印("跃点数:",len(record.hops))
打印(record.hops)
````
了解哪些属性可用,看看
相关类的定义(在某些时候会有真正的文档)。对于
实例,对于"traceroute",几乎所有属性都是可选的,并在这里定义
:
[traceroute.py](https://github.com/drakkar lig/scamper py warts/blob/master/warts/traceroute.py l34)。
有些属性不是可选的,在类的"parse()"方法中定义。例如,traceroute对象't'总是在't.hops'中提供一个'traceroutehop'对象的列表。
如果解析失败,则抛出一个'errors.parseerror'实例。
`pywarts'通常会在自身之后尝试清理,所以文件的描述符应该指向下一条记录,即使在解析错误之后也是如此。尤其是当输入文件格式不正确时。
:
-完全兼容python3
-更好的基于类的接口,而不是具有所有标志的大型dict
-正确处理未知标志和options,忽略它们通常会使属性名更具可读性(尽管这通常意味着更长的名称)
-可能会快一些(它需要适当的基准),因为
是解析标志和字符串的方式。此外,在解析之前,我们会将整个记录
读入内存,这比在非常小的数据量上重复调用
`read()`要快一些。在某些方面,cmand代码可以做更多的事情:
-`pywarts`没有实现不推荐的地址格式(它非常复杂,已经被弃用了好几年)
-在<;https://github.com/cmand/scamper>;,
中有一些不错的脚本,例如附加和控制正在运行的scamper
进程的脚本
只是记录的迭代器?是否允许按记录类型筛选?尝试进一步解析,例如解码
标志或为udp、tcp和icmp生成不同的对象
traceroutes?
-解析时是否应尝试使值正常化?例如,
我们应该对地址使用"ipaddr"对象吗?有时
用厘米表示,有的用微秒表示,有的用秒表示。
我们应该将其标准化为一个公共基吗?时间值的浮动是否可接受
?
-当出现解析错误时,我们应该怎么做?如果用户想继续分析下一条记录,他/她如何才能继续分析?
如果您对这些问题有想法和想法,请打开问题。