Skip to main content

基于已收集的网络设备信息进行的结构化数据分析框架

Project description

net_inspect 介绍

net_inspect是网络设备数据结构化分析框架

安装方法

PyPI

pip install net_inspect

Poetry

git clone https://github.com/Elinpf/net_inspect
cd net_inspect
poetry install

插件介绍

net_inspect采用了插件模块的框架,分别是Input, Parse, Analysis, Output 模块。

通过编写模块插件,实现快速定制的能力。

InputPlugin

Input插件的功能是将已经获得的设备检查命令的日志转化为命令与命令输出的对应关系。如果是通过直接对设备进行操作获取的日志,可以使用console这个插件进行处理。如果是用的第三方平台进行的自动化收集,那么就需要自行编写Input插件实现命令与输出的对应。

ParsePlugin

Parse插件的功能是将每条命令的输出进行解析并且结构化。提取出关键信息并以List[dict]的方式进行存储。

现有的Parse解析模块使用的是ntc-templates-elinpf这个库,是ntc-templates库的分支,由于主仓更新频率很慢且不会增加国内常用的设备厂家,所以我Fork后进行了修改。

AnalysisPlugin

Analysis插件的功能是将解析的信息进行分析,对分析的内容进行告警分级。例如电源是否异常。这个工作是在分析模块中进行的。

OutputPlugin

输出模块可能是最需要自定义编写的地方。将解析和分析的结果按照自己想要的格式展现出来。

使用方法

net_inspect有三种使用方式

  1. 作为三方库提供API
  2. CLI命令行操作
  3. 本地Web界面操作 (TODO)

使用库

示例:

from net_inspect import NetInspect, OutputPluginAbstract, PluginError
from rich.table import Table
from rich.console import Console


class Output(OutputPluginAbstract):
    def main(self):
        if not self.args.output_params.get('company'):
            raise PluginError('name or age is missing')

        console = Console()

        table = Table(title=self.args.output_params.get(
            'company'), show_lines=False)
        table.add_column('name', justify='center')
        table.add_column('ip', justify='center')
        table.add_column('model', justify='center')
        table.add_column('version', justify='center')
        table.add_column('power', justify='center')

        for device in self.args.devices:
            if device.vendor.PLATFORM == 'huawei_vrp':
                data = [device.info.name, device.info.ip]
                ps = device.parse_result('display version')
                data.append(ps[0].get('model'))
                data.append(ps[0].get('vrp_version'))
                power_analysis = device.analysis_result.get('Power Status')
                power_desc = []
                for alarm in power_analysis:
                    if alarm.include_focus:
                        power_desc.append(alarm.message)
                data.append('\n'.join(power_desc) if power_desc else 'Normal')

                table.add_row(*data)
                table.row_styles = ['green']

        console.print(table)


net = NetInspect()
# net.set_log_level('DEBUG')
net.set_plugins('smartone', Output)
cluster = net.run('log_files', output_plugin_params={'company': 'Company Name'})

API 解释

初始化

from net_inspect import NetInspect

net = NetInspect()

设置日志级别

net.verbose(1)

开启verbose表示为打开了DEBUG级别的日志, 默认为INFOverbose级别可以通过verbose()方法设置,总共0~3

  • 0: 日志关闭
  • 1: 提供Output模块的日志和Parse模块的日志
  • 2: 追加提供Analysis模块的日志
  • 3: 追加提供Parse模块不支持命令的信息日志和命令为无效的信息

设置插件

一般来说,只需要设置input_pluginoutput_plugin即可。

net.set_plugins(input_plugin='smartone', output_plugin='device_warning_logging')

可以使用字符串的简写,也可以自己继承插件类后重写main()方法,然后将类传递进来。

执行

提供输入的文件路径即可, 可以是文件或者目录。

net.run('log_files')

如果output中需要提供参数,可以使用output_plugin_params参数,例如:

net.run('log_files', output_plugin_params={'company': 'Company Name'})

CLI 命令行操作

net_inspect -i log_files

关于贡献

分析插件还在持续开发中,develop_script.py脚本就是为高效开发提供的一个工具。

开发一个分析插件的流程,以开发检查风扇状态的fan_status插件为例:

  1. 创建一个新的插件文件, 对应的文件初始状态会一并准备好
python ./develop_script.py -p fan_status -g
  1. 在对应的文件中实现插件对每个厂商分析的函数
class AnalysisPluginWithFanStatus(AnalysisPluginAbc):
    """
    要求设备所有在位风扇模块运行在正常状态。
    """
    @analysis.vendor(vendor.H3C)
    @analysis.template_key('hp_comware_display_fan.textfsm', ['slot', 'id', 'status'])
    def hp_comware(template: TemplateInfo, result: AnalysisResult):
        """模块状态不为Normal的时候告警"""
        for row in template['display fan']:
            if row['status'].lower() != 'normal':
                result.add_warning(
                    f'Slot {row["slot"]} Fan {row["id"]} 状态异常' if row['slot'] else f'Fan {row["id"]} 状态异常')

其中@analysis是用来记录插件的分析类型的,vendor记录插件的厂商类型,template_key记录分析模块所需要的textfsm文件以及里面的哪些值。 这些值会在参数template: TemplateInfo中给出。

result: AnalysisResult用来记录分析结果。可以添加告警信息。

分析方法为类方法,不需要self,不需要给出返回值。

插件中的类注释和方法注释都会被记录下来,方便后续调用。

  1. 创建对应的测试文件

当编写了对应的分析方法后,再次执行创建命令,工具会自动根据分析方法中需要的命令,生成对应的测试文件。

测试文件路径为tests/check_analysis_plugins/<plugin_name>/<funcation_name>.raw

python ./development_script.py -p fan_status -f hp_comware -g
  1. 在测试文件中添加测试用例
  2. 执行测试
python ./development_script.py -p fan_status -f hp_comware -t
  1. 完成测试,确认测试结果为正常后,生成yml文件作为参考文件。
python ./development_script.py -p fan_status -f hp_comware -y

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

net_inspect-1.0.0.tar.gz (30.8 kB view hashes)

Uploaded Source

Built Distribution

net_inspect-1.0.0-py3-none-any.whl (37.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page