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爬取网站数据保存使用的方法
Nov 20 Python
Python logging模块学习笔记
May 24 Python
Python中的数学运算操作符使用进阶
Jun 20 Python
详解Python中类的定义与使用
Apr 11 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
ActiveMQ:使用Python访问ActiveMQ的方法
Jan 30 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
python3美化表格数据输出结果的实现代码
Apr 14 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
详解Python核心对象类型字符串
2018/02/11 Python
Python Logging 日志记录入门学习
2018/06/02 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
Python datetime模块使用方法小结
2020/06/18 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
《苏珊的帽子》教学反思
2014/04/07 职场文书
小班评语大全
2014/05/04 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
vue中div禁止点击事件的实现
2022/04/02 Vue.js