【Flask开发实战】防火墙配置文件解析(三)之python加工处理

news2024/9/21 22:31:29

一、前言

上一篇文章中,介绍了通过shell脚本读取配置文件获取到IP地址组、服务端口组、规则清单这三个模块类别基础数据。基础数据中还需要进一步进行展开处理,生成三类扩展表。如IP地址组中,同一个地址组下存在多个IP地址,每组IP需要展开成每条记录;服务端口组中,同个服务组又存在多个端口情况,每组服务也需要展开每条记录;规则清单则需要跟服务组、端口组做相应的字段匹配,生成更详细的规则展开清单。由于上一步生成的3类基础数据,本质上还是以表格的形式记录,所以这里使用到python的pandas、numpy、csv等模块,可以完成excel表格数据的加工处理工作。

二、python处理说明

1、示例中用到的模块

import pandas as pd
import time, datetime 
import os
import socket, struct
import csv
import numpy as np

 2、处理端口组数据

首先对端口组中存在同一组多端口的,进行拆分多行;其次增加起始端口和结束端口字段,展开端口表信息。示例(展示部分):

def format_servgroup():
   # 读取文件中所有数据
   data = pd.read_csv("fwservgroup.csv")
   # 按照;分割列
   data_url = data['service'].str.split(';', expand=True)
   # 行转列
   data_url = data_url.stack()
   # 重置索引,将新生成的index,重置到原来的索引上
   data_url = data_url.reset_index(level=1, drop=True).rename('service')
   # 和原始数据合并
   data = data.drop(['service'], axis=1).join(data_url)
   # 写入csv文件
   data.to_csv(r'fwservgroupmore.csv', sep=",", index=False)
   # 去除其中空值的数据
   data = pd.read_csv("fwservgroupmore.csv")
   data.dropna(how='any', inplace=True, axis=0, subset=['service'])
   data.drop_duplicates(inplace=True)
   data.to_csv(r'fwservgroupmore.csv', sep=",", index=False)

   # 拆分起始端口信息
   df=pd.read_csv("linshi3.csv")
   df=pd.merge(df,pd.DataFrame(df["service"].str.split("-",expand=True)),how="inner",left_index=True,right_index=True)
   df.to_csv('linshi3.csv',index=None)
   df=pd.read_csv("linshi3.csv")
   df.rename(columns={'0': 'protocol','1': 'portstart','2': 'portend'}, inplace=True)
   df.to_csv('linshi3.csv',index=None)
   
   df=pd.read_csv("linshi3.csv")
   col_name=df.columns.tolist()
   for portend in col_name:
     try:
        df1=df[df['portend'].notna()] 
        df2=df[df[['portend']].isnull().T.any()]
        df2=df2.copy()
        df2['portend']=df2['portstart']
        df2.to_csv('linshi4.csv',index=None)
        df2=pd.read_csv("linshi4.csv")
        data=pd.concat([df1,df2],axis=0)
        data.drop_duplicates(inplace=True)
        data.to_csv('fwservgroupfull.csv',index=None)
   
     except:
        col_name.insert(5, 'portend')
        df=df.reindex(columns=col_name)
        df['portend'] = df['portstart']
        df.to_csv('fwservgroupfull.csv',index=None)

3、处理地址组数据

 首先地址组中也存在同一地址组多地址的,进行拆分多行;其次增加起始地址和结束地址字段,展开端口表信息;并且地址中存在掩码格式的,需要进行掩码转换匹配,示例(展示部分):

def format_ipgroup():
   # 读取文件中所有数据
   data = pd.read_csv("policy-ipgroup",encoding='utf-8')
   # 按照;分割列
   data_url = data['ipaddress'].str.split(';', expand=True)
   # 行转列
   data_url = data_url.stack()
   # 重置索引,将新生成的index,重置到原来的索引上
   data_url = data_url.reset_index(level=1, drop=True).rename('ipaddress')
   # 和原始数据合并
   data = data.drop(['ipaddress'], axis=1).join(data_url)
   # 写入csv文件
   data.to_csv(r'fwipgroupmore.csv', sep=",", index=False)
   # 去除其中空值的数据
   data = pd.read_csv("fwipgroupmore.csv")
   data.dropna(how='any', inplace=True, axis=0, subset=['ipaddress'])
   data.drop_duplicates(inplace=True)
   data.to_csv(r'fwipgroupmore.csv', sep=",", index=False)

   #按照mask帅选
   df=pd.read_csv("linshi4.csv")
   df= df.loc[df["1"].str.contains("mask",na=False)]
   df.rename(columns={'0': 'ipstart','1': 'type','2': 'mask'}, inplace=True)
   df=df[['fwname','ipgroupname','securityzone','ipaddress','type','mask','ipstart']] 
   df.to_csv('linshi-mask.csv',index=None)
   
   #按照range帅选
   df=pd.read_csv("linshi4.csv")
   df= df.loc[df["0"].str.contains("range")]
   df.rename(columns={'0': 'type','1': 'ipstart','2': 'ipend'}, inplace=True)
   df=df[['fwname','ipgroupname','securityzone','ipaddress','type','ipstart','ipend']] 
   df.to_csv('linshi-range.csv',index=None)
   
   #帅选剩余
   df=pd.read_csv("linshi4.csv")
   df=df[df[['2']].isnull().T.any()] 
   df.rename(columns={'0': 'ipstart','1': 'mask','2': 'type'}, inplace=True)
   df['type'] ="mask"
   df=df[['fwname','ipgroupname','securityzone','ipaddress','type','mask','ipstart']] 
   df.to_csv('linshi-other.csv',index=None) 

4、处理规则数据

 首先规则表中存在多源地址、多目的地址、多端口的情况,都需要进行拆分多行;其次拆分完后需要跟前面端口展示表,地址展开表进行关联匹配,最后对IP地址进行数值转换, 方便后续的查询操作,示例(展示部分):

def format_rule_split():
  # 读取文件中所有数据
  data = pd.read_csv("policy-rule")
  data=data[['fwname','rulename','sourceip']]
  # 按照sourceip分割列
  data_url = data['sourceip'].str.split(';', expand=True)
  # 行转列
  data_url = data_url.stack()
  # 重置索引,将新生成的index,重置到原来的索引上
  data_url = data_url.reset_index(level=1, drop=True).rename('sourceip')
  # 和原始数据合并
  data = data.drop(['sourceip'], axis=1).join(data_url)
  data.to_csv(r'linshi1.csv', sep=",", index=False)

def format_rule_sourceip():
  #扩展原地址 
  df=pd.read_csv("netfirewallsmore.csv")
  df=df[['fwname','sourceip']]
  df.rename(columns={'sourceip': 'ipgroupname'}, inplace=True)
  df1= pd.read_csv("fwipgroupfull.csv")
  df1=df1[['ipgroupname','ipstart','ipstartnum','ipend','ipendnum']]
  df2=pd.merge(df1,df,on=['ipgroupname'],how='right')
  df2.to_csv('b1.csv',index=None) 
  
  df= pd.read_csv("b1.csv")
  #df1=df[df['ipstart'].notna()] 
  df=df[df[['ipstart']].isnull().T.any()]
  #分割数据
  df=pd.merge(df,pd.DataFrame(df["ipgroupname"].str.split("-",expand=True)),how="inner",left_index=True,right_index=True)
  df.to_csv('b2.csv',index=None)  

  #IP地址转数字
  df=pd.read_csv("b2.csv")
  df['ipstart']=df['0']
  df['ipend']=df['1']
  ipstart=df['ipstart'].tolist()
  ipend=df['ipend'].tolist()
  data=[]
  for ip in ipstart:
    try:
      ch3 = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
      num=ch3(ip)
      list1=[ip,num]
      data.append(list1)
    except:
      pass
  data = pd.DataFrame(data)
  data.drop_duplicates(inplace=True)
  data.to_csv('ruleipstartnum.csv',index=None) 

def format_rule_destip():
  #扩展目的地址 
  df=pd.read_csv("linshi-sourceip.csv")
  df=df[['fwname','destip']]
  df.rename(columns={'destip': 'ipgroupname'}, inplace=True)
  df1= pd.read_csv("fwipgroupfull.csv")
  df1=df1[['ipgroupname','ipstart','ipstartnum','ipend','ipendnum']]
  df2=pd.merge(df1,df,on=['ipgroupname'],how='right')
  df2.to_csv('c1.csv',index=None) 
  
  df= pd.read_csv("c1.csv")
  #df1=df[df['ipstart'].notna()] 
  df=df[df[['ipstart']].isnull().T.any()]
  df=pd.merge(df,pd.DataFrame(df["ipgroupname"].str.split("-",expand=True)),how="inner",left_index=True,right_index=True)
  df.to_csv('c2.csv',index=None)  

def format_rule_service():
  #扩展服务端口
  df=pd.read_csv("linshi-destip.csv",low_memory=False)
  df=df[['fwname','service']] 
  df.rename(columns={'service': 'servicegroupname'}, inplace=True)
  df1= pd.read_csv("fwservgroupfull.csv")
  df2=pd.merge(df1,df,on=['fwname','servicegroupname'],how='right')
  df2.drop_duplicates(inplace=True)
  df2.to_csv('d1.csv',index=None)  

三、结果展示

三个基础表数据处理脚本合并执行,完成后得到3类表的扩展数据,后续再导入到数据库,用于页面查询。

执行过程,记录输出每一步操作时间和结果,如有异常可调试检查出来。

端口组展开表 

 

地址组展开表

 策略展开表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sy4文件、目录操作命令-补充find

补充下find的命令实例把&#xff0c;我搜了下发现这篇文章的笔记符合课程的实例&#xff1a; 参考< How to Find a File in Linux | Find Command - GeeksforGeeks> 这里做了实验&#xff0c;给大家参考&#xff1a; Linux, renowned for its robust command-line int…

【GIT】最好用的git可视化教程网站推荐

最好用可视化学习git 网站:https://learngitbranching.js.org/?demo&localezh_CN 玩遍所有关卡&#xff0c;花半天时间便能掌握git &#x1f603; 本地仓库 基础命令介绍 git commit 提交 git branch <分支名> 创建分支 git checkout <分支名> 切换分支 git…

定制红酒:品质与口感,双重保障

在葡萄酒的世界里&#xff0c;云仓酒庄的洒派定制红酒以其卓着的品质和迷人的口感&#xff0c;成为了无数品鉴者的心头好。这款红酒&#xff0c;不仅是对品质的追求&#xff0c;更是对生活的热爱和品味的体现。 云仓酒庄深知品质是红酒的灵魂&#xff0c;因此对洒派定制红酒的品…

栈和队列的学习

存储方式分两类&#xff1a;顺序存储和链式存储 栈&#xff1a;只允许从一端进行数据插入和删除的线性表&#xff1a;先进后出 FILO 队列&#xff1a;只允许从一端进行数据插入&#xff0c;另一端进行数据删除的线性表&#xff1a;先进先出 FIFO 栈 创建空栈&#xff0c;创建…

wmv转换成mp4能无损吗?这样设置~

WMV和MP4是两种不同的视频格式&#xff0c;它们使用不同的编解码算法和容器格式。在将WMV转换为MP4时&#xff0c;通常会发生一定程度的重新编码&#xff0c;因此不能完全保证无损转换。无损转换意味着输出的MP4文件与输入的WMV文件在视听上没有任何质量损失&#xff0c;这在实…

基于springboot的反诈宣传平台

技术&#xff1a;springbootmysqlvue 一、系统背景 反欺诈平台可以对公交信息进行集中管理&#xff0c;可以真正避免传统管理的缺陷。反欺诈平台是一款运用软件开发技术设计实现的应用系统&#xff0c;在信息处理上可以达到快速的目的&#xff0c;不管是针对数据添加&#xff…

spring cloud项目微服务间互相调用使用自定义标注进行鉴权方案

来吧&#xff0c;贴代码。 一、背景 我们有一个项目使用了spring cloud&#xff0c;有的微服务需要调用别的微服务&#xff0c;但这些调用没有鉴权&#xff1b;当初项目时间非常紧&#xff0c;同时这部分微服务有的对外也没有鉴权&#xff0c;在代码中设置了无须鉴权&#xf…

真机笔记(2)项目分析

目录 1. 项目&#xff1a; 2. 网络工程师工作流程 3. 实验 设备命名 登录密码 使用SSH协议 1. 项目&#xff1a; 竞标方&#xff1a;集成商、厂商、代理商、服务商、监理检测公司 在一个网络项目中&#xff0c;不同的角色承担着不同的职责和任务。以下是集成商、厂商、代…

程序人生——Java异常使用建议

目录 引出异常建议110&#xff1a;提倡异常封装&#xff1b;建议111&#xff1a;采用异常链传递异常 建议112&#xff1a;受检异常尽可能转化为非受检异常建议113&#xff1a;不要在finally块中处理返回值 建议114&#xff1a;不要在构造函数中抛异常建议115&#xff1a;使用Th…

VMD + CEEMDAN 二次分解,CNN-Transformer预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

Data.olllo:一键数据“分组统计”!

引言&#xff1a; 数据统计是数据分析中的重要环节&#xff0c;而如何快速、准确地进行数据分组统计是许多数据工作者关注的焦点。现在&#xff0c;借助Data.olllo的神奇功能&#xff0c;您可以轻松进行一键式的数据分组统计&#xff0c;为您的数据分析提供更强大的支持&…

什么是浏览器指纹识别?指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

Quartz完全开发手册(一篇学会Quartz所有知识点)

目录 一、Quartz概念 1.1、Quartz介绍 1.2、使用场景 1.3、特点 二、Quartz运行环境 三、Quartz设计模式 四、Quartz学习的核心概念 4.1、任务Job 4.2、触发器Trigger 4.3、调度器Scheduler 五、Quartz的体系结构与工作流程 5.1、体系结构 5.2、工作流程 六、Quar…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(时间滑动选择器弹窗)

以24小时的时间区间创建时间滑动选择器&#xff0c;展示在弹窗上。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

vuecli创建vue3项目

第一步&#xff1a; 在文件夹中输入 vue create xxx 第二步&#xff1a; 勾选下面带有*号的&#xff0c;经验最好把Linter/Formatter勾掉&#xff0c;不然会出现eslint报错 第三步&#xff1a; 选择3.x 第四步&#xff1a; 意思为是否用history模式来创建路由&#xff0…

把 Taro 项目作为一个完整分包,Taro项目里分包的样式丢失

现象&#xff1a; 当我们把 Taro 项目作为原生微信小程序一个完整分包时&#xff0c;Taro项目里分包的样式丢失&#xff0c;示意图如下&#xff1a; 原因&#xff1a; 在node_modules/tarojs/plugin-indie/dist/index.js文件里&#xff0c;限制了只有pages目录下会被引入app.w…

The 2023 Guangdong Provincial Collegiate Programming Contest

I. Path Planning 嗯&#xff0c;怎么说呢&#xff0c;一般二维图&#xff0c;数据不是很大的比如n*m*log级别允许的&#xff0c;如果一眼不是bfs&#xff0c;可以考虑结合一下二分 本题可知&#xff0c;只能向下或者向右&#xff0c;那么我们就像如果答案为x&#xff0c;那么…

【重温设计模式】访问者模式及其Java示例

访问者模式的基本概念 访问者模式&#xff0c;一种行为型设计模式&#xff0c;其基本定义是&#xff1a;允许一个或者多个操作应用到一组对象上&#xff0c;解耦操作和对象的具体类&#xff0c;使得操作的添加可以独立于对象的类结构变化。在面向对象编程中&#xff0c;访问者…

sqllab第35-45关通关笔记

35关知识点&#xff1a; 宽字节注入数值型注入错误注入 payload:id1andextractvalue(1,concat(0x7e,database(),0x7e))0--联合注入 payload:id0unionselect1,database(),version()-- 36关知识点&#xff1a; 字符型注入宽字节注入错误注入 payload:id1%df%27andextractvalue(…