python ipset管理 增删白名单的方法


Posted in Python onJanuary 14, 2019

为方便用ipset 来管理防火墙,写了下面Ipset类来对Ip进行管理

#!/usr/bin/env python
# coding: utf-8
 
import MySQLdb
import MySQLdb.cursors
import subprocess
import logging
import re,os
import xml.sax
 
class XMLHandler(xml.sax.ContentHandler):
 '''
 用来解析ipset数据
 '''
 def __init__(self):
  self.current_tag = ""
  self.current_set = ""
  self.mapping = {}
 
 def startElement(self, name, attributes):
  self.current_tag = name
  if name == 'ipset':
   self.current_set = attributes['name']
   self.mapping[self.current_set] = []
 
 def characters(self, data):
  if self.current_tag == 'elem' and data!='\n':
   self.mapping[self.current_set].append(data)
 
 def endElement(self, name):
  if name == 'ipset':
   self.current_set = ''
 
 def getData(self):
  return self.mapping
 
class IpsetPool(object):
 def __init__(self):
  self.msg = []
  self.config = '/etc/sysconfig/ipset'
  self.logger_file = '/data/logs/ipset.log'
  self.ipsets = ['manage','center','project']
  self.log = self.mylog()
  self.ipset_data = self.getIpsetData(XMLHandler)
  
 def sub_call(self,run_cmd, **kwargs):
  p = subprocess.Popen(
   run_cmd,
   shell=True,
   stdin=subprocess.PIPE,
   stdout=subprocess.PIPE,
   stderr=subprocess.PIPE,
   **kwargs)
  outdata, errdata = p.communicate()
  retcode = p.wait()
  self.msg.append((False,errdata) if retcode != 0 else (True,outdata))
  return retcode, outdata, errdata
 
 @staticmethod
 def querydb(sql):
  host = "192.168.59.128"
  user = "dev"
  passwd = "123456"
  db = "gmweb_res"
  conn = MySQLdb.connect(
   host=host,
   user=user,
   passwd=passwd,
   db=db,
   charset="utf8",
   cursorclass=MySQLdb.cursors.DictCursor)
  cursor = conn.cursor()
  cursor.execute(sql)
  rs = cursor.fetchall()
  cursor.close()
  conn.commit()
  conn.close()
  return rs
 
 def getManageIps(self):
  sql = "select * from host where state not in (6) and `use` REGEXP ',2$|^2,|^2$|,2,';"
  return [x["ip1"] for x in self.querydb(sql)]
 
 def getProjectIps(self):
  from jgconf.models import projectConf
  return [i['saltIp'] for item in projectConf.objects.all() for i in item.getSaltServer()]
 
 def checkAddrIsIn(self, ip, setname):
  '''
  判断ip是否在某个set中
  '''
  if ip in self.ipset_data[setname]:
   return True
  else:
   return False
 
 def getIpsetData(self,xml_handler):
  '''
  获取机器上当前的ipset配置数据
  '''
  xh = xml_handler()
  xml.sax.parseString(self.sub_call('ipset list -o xml')[1], xh)
  return xh.getData()
 def createSet(self,setname):
  self.log.info('create {0} set'.format(setname))
  set_cmd = 'ipset create {0} hash:ip'.format(setname)
  return self.sub_call(set_cmd)
 
 def renderSetFile(self):
  '''
  重导配置
  '''
  self.sub_call('ipset save > {0}'.format(self.config))
 
 def createIpsets(self):
  for ipset in self.ipsets:
   self.createSet(ipset)
 
 def addIps2Set(self,setname,ips):
  if setname not in self.ipsets:
   self.log.error('invalid set name!')
   return False
  if not self.ipset_data.has_key(setname):
   self.createSet(setname)
  for ip in ips:
   if not self.checkAddrIsIn(ip,setname):
    self.log.info('add {0} {1}'.format(setname,ip))
    self.sub_call('ipset -A {0} {1}'.format(setname,ip))
  self.renderSetFile()
 def delIpsFromSet(self,setname,ips):
  self.log.info(ips)
  if setname in self.ipsets and self.ipset_data.has_key(setname):
   for ip in ips:
    if self.checkAddrIsIn(ip,setname):
     self.log.info('delete {0} {1}'.format(setname,ip))
     self.sub_call('ipset -D {0} {1}'.format(setname,ip))
  self.renderSetFile()
 def mylog(self):
  logger_dir = os.path.split(self.logger_file)[0]
  if not os.path.exists(logger_dir):
   os.makedirs(logger_dir)
  logger = logging.getLogger("reload")
  logger.setLevel(logging.DEBUG)
  # create file handler which logs even debug messages
  fh = logging.FileHandler(self.logger_file)
  fh.setLevel(logging.DEBUG)
  # create formatter and add it to the handlers
  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  fh.setFormatter(formatter)
  console = logging.StreamHandler()
  console.setLevel(logging.DEBUG)
  # add the handlers to the logger
  logger.addHandler(fh)
  logger.addHandler(console)
  return logger
 def reloadIpset(self):
  """
  从文件中加载最新集合
  """
  reloadlog = mylog()
  try:
   # 刷新清空当前规则
   sub_call("/etc/init.d/iptables stop")
   sub_call("/etc/init.d/ipset restart")
   sub_call("/etc/init.d/iptables start")
   reloadlog.info("reload成功")
  except Exception as e:
   reloadlog.info("ipset reload异常 %s" % e)
 def loadDefault(self):
  #self.addIps2Set('manage',self.getManageIps())
  self.addIps2Set('project',self.getProjectIps())
 
if __name__ == '__main__':
 p = IpsetPool()
 p.loadDefault()

以上这篇python ipset管理 增删白名单的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 12306抢火车票脚本
Feb 07 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
Python操作mongodb的9个步骤
Jun 04 Python
python中的turtle库函数简单使用教程
Jul 23 Python
Python模块的加载讲解
Jan 15 Python
Python实现二叉搜索树BST的方法示例
Jul 30 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
Python OpenCV之常用滤波器使用详解
Apr 07 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 #Python
在python 不同时区之间的差值与转换方法
Jan 14 #Python
Python常见数据结构之栈与队列用法示例
Jan 14 #Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 #Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 #Python
利用nohup来开启python文件的方法
Jan 14 #Python
python运行时强制刷新缓冲区的方法
Jan 14 #Python
You might like
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
一个ubbcode的函数,速度很快.
2006/10/09 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
学习Vue组件实例
2018/04/28 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python读写ini文件的方法
2015/05/28 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
pygame实现简易飞机大战
2018/09/11 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
python对execl 处理操作代码
2020/06/22 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
企业法人授权委托书范本
2014/09/23 职场文书
假期安全教育广播稿
2014/10/04 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
委托书范本格式
2019/04/18 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电