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内存管理分析
Apr 08 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
python中defaultdict的用法详解
Jun 07 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
Django 自动生成api接口文档教程
Nov 19 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
jupyter notebook的安装与使用详解
May 18 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
Django-silk性能测试工具安装及使用解析
Nov 28 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
PHP递归调用的小技巧讲解
2013/02/19 PHP
php开启openssl的方法
2014/05/15 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
vue中appear的用法
2017/08/17 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
python 随机数生成的代码的详细分析
2011/05/15 Python
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python操作gmail实例
2015/01/14 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
python实现图像外边界跟踪操作
2020/07/13 Python
Python基于template实现字符串替换
2020/11/27 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
大学生自我鉴定
2013/12/16 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
二年级语文教学反思
2014/02/02 职场文书
教师岗位职责
2015/02/03 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
angular异步验证器防抖实例详解
2022/03/31 Javascript