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

一、前言

上一篇文章中,介绍了通过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.rhkb.cn/news/278952.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python读取Excel工作表数据写入CSV、XML、文本

Excel工作簿是常用的表格格式,许多数据呈现、数据分析和数据汇报都是以Excel工作表的形式进行。然而,在实际的数据管理、分析或自动化流程构建过程中,我们常常需要将这些Excel中的数据迁移至更其他数据系统,或者以文本形式存储以便…

B树B+树,字典树详解,哈夫曼树博弈树

目录 B树&#xff1a;B-Tree B树 字典树&#xff1a;Trie Tree 哈夫曼树 博弈树 B树&#xff1a;B-Tree 多路平衡搜索树 1.M阶B树&#xff0c;就是M叉&#xff08;M个指针&#xff09;。 2.每个节点内记录个数<M-1。 3.根节点记录个数>1。 4.其余节点内记录个数&…

洗涤杂质气体的仪器-PFA洗涤瓶

PFA洗气瓶是一种洗去气体中杂质的仪器&#xff0c;是将不纯气体通过选定的适宜液体介质鼓泡吸收&#xff08;溶解或由于发生化学反应&#xff09;&#xff0c;从而洗去杂质气体&#xff0c;以达净化气体的目的。在有可燃性气源的实验装置中&#xff0c;洗气瓶也可起到安全瓶的作…

qt使用Windows经典风格,以使QTreeView或QTreeWidge有节点线或加号

没有使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 树展开时&#xff1a; 树未展开时&#xff1a; 可以看到&#xff1a; 未使用Windows经典风格时&#xff0c;QTreeView或QTreeWidget…

【Flask开发实战】防火墙配置文件解析(二)之shell读取内容

一、前言 上一篇文章中&#xff0c;介绍了防火墙配置文件包含的基本元素和格式样式&#xff0c;并模拟了几组有代表性的规则内容&#xff0c;作为基础测试数据。在拿到基础测试数据后&#xff0c;关于我们最终想解析成的数据是什么样式的&#xff0c;其实不难看出&#xff0c;…

聚合音乐网-播放器网站源码

源码简介 MKOnlineMusicPlayer 是一款全屏的音乐播放器 UI 框架&#xff08;为避免侵权&#xff0c;已移除所有后端功能&#xff09;。 前端界面参照 QQ 音乐网页版进行布局&#xff0c;同时采用了流行的响应式设计&#xff0c;无论是在PC端还是在手机端&#xff0c;均能给您…

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

Ubuntu Desktop 设置 gedit

Ubuntu Desktop 设置 gedit 1. View2. Editor3. Font & Colors4. keyboard shortcut5. Find and ReplaceReferences gedit (/ˈdʒɛdɪt/ or /ˈɡɛdɪt/) is the default text editor of the GNOME desktop environment and part of the GNOME Core Applications. Desig…

相比于 HTTP 协议,WebSocket协议的必要性体现在哪里?

HTTP 协议的一个缺点 从 HTTP 协议的角度来看&#xff0c;就是点一下网页上的某个按钮&#xff0c;前端发一次 HTTP请 求&#xff0c;网站返回一次 HTTP 响应。这种由客户端主动请求&#xff0c;服务器响应的方式也满足大部分网页的功能场景。但是有没有发现&#xff0c;在HTTP…

InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台

InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台 我们的压测平台的架构图如下&#xff1a; 配置docker环境 1&#xff09;yum 包更新到最新 sudo yum update如果有提示&#xff0c;直接输入y&#xff0c;回车。 2&#xff09;安装需要的软件包&#xff0c; yum-…

八大排序算法

排序算法 排序的概述排序的分类分为5大类&#xff1a;优点及缺点如何选择排序算法 八种排序之间的关系:一、插入排序直接插入排序动图详解代码实现 希尔排序动图详解代码实现 二、交换排序冒泡排序:动图详解代码实现 快速排序:动图详解代码实现 三、选择排序直接选择排序动图详…

杉德支付配合调查 - 数字藏品服务

最近&#xff0c;数字收藏品平台淘派发布了一则公告&#xff0c;宣布支付通道杉德已暂停接口服务&#xff0c;以配合调查。 近期发现多个异常账户&#xff0c;涉嫌盗取他人信息和银行卡&#xff0c;利用平台从事非法交易。淘派已第一时间报警&#xff0c;协助警方追回资金(回执…

java数据结构与算法刷题-----LeetCode1005. K 次取反后最大化的数组和(这就不是简单题)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 卷来卷去&#xff0c;把简单题都卷成中等题了 文章目录 1. 排序后从小到大…

算法刷题Day14 | 二叉树理论、递归遍历、迭代遍历、统一迭代

目录 0 引言1 递归遍历1.1 前序遍历1.2 后序遍历1.3 中序遍历 2 迭代遍历2.1 前序和后序2.2 中序 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;算法刷题Day14 | 二叉树理论、递归遍历、迭代遍历、统一迭…

【教程】APP加固的那些小事情

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

html--蝴蝶

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>蝴蝶飞舞</title> <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.cs…

关于Transfomer的思考

为何诞生 在说transformer是什么&#xff0c;有什么优势之类的之前&#xff0c;先谈一谈它因何而诞生。transformer诞生最重要的原因是早先的语言模型&#xff0c;比如RNN&#xff0c;由于其本身的训练机制导致其并行度不高&#xff0c;特别是遇到一些长句子的情况下。其次&…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

学习Python,需要知道的经典案例

文章目录 一、Python简介二、Python经典案例1. 猜数字游戏2. 文本文件处理3. 网络爬虫4. 数据可视化5. 电子邮件发送6. 实现一个简单的Web服务器。 三、Python处理IP相关知识点1. 处理IP地址2. 网络编程&#xff08;TCP/IP&#xff09;3. 使用第三方库处理IP信息 四、相关链接 …

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…