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操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
六个窍门助你提高Python运行效率
Jun 09 Python
使用python实现rsa算法代码
Feb 17 Python
对Python发送带header的http请求方法详解
Jan 02 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python配置文件写入过程详解
Oct 19 Python
python实现在一个画布上画多个子图
Jan 19 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
django配置app中的静态文件步骤
Mar 27 Python
对Python 字典元素进行删除的方法
Jul 31 Python
python os.listdir()乱码解决方案
Jan 31 Python
Python使用pyenv实现多环境管理
Feb 05 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
php修改时间格式的代码
2011/05/29 PHP
php 字符串替换的方法
2012/01/10 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
JS 常用校验函数
2009/03/26 Javascript
javascript 清除输入框中的数据
2009/04/13 Javascript
jquery增加和删除元素的方法
2015/01/14 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python中强大的format函数实例详解
2018/12/05 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
2013年入党人员的自我鉴定
2013/10/25 职场文书
文秘专业应届生求职信范文
2013/11/14 职场文书
会计与审计毕业生自荐信范文
2013/12/30 职场文书
投资合作协议书范本
2014/04/17 职场文书
学生检讨书怎么写
2014/10/09 职场文书
2015年采购工作总结
2015/04/10 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
Element实现动态表格的示例代码
2021/08/02 Javascript
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript