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 文件重命名工具代码
Jul 26 Python
Python字符串格式化的方法(两种)
Sep 19 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
python实现windows壁纸定期更换功能
Jan 21 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
django删除表重建的实现方法
Aug 28 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
Python中的xlrd模块使用整理
Jun 15 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
详解jQuery事件
2017/01/13 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
详解vue中axios的封装
2018/07/18 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
微信小程序实现留言板
2018/10/31 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
js实现蒙版效果
2020/01/11 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python简单生成随机数的方法示例
2018/03/31 Python
python实现简单图书管理系统
2019/11/22 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
国庆节演讲稿范文2014
2014/09/19 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
信访工作个人总结
2015/03/03 职场文书
党员读书活动心得体会
2016/01/14 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle