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 28 Python
使用Python横向合并excel文件的实例
Dec 11 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
PyTorch基本数据类型(一)
May 22 Python
python可视化爬虫界面之天气查询
Jul 03 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
python框架flask表单实现详解
Nov 04 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
Python如何将模块打包并发布
Aug 30 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 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
星际争霸任务指南——神族
2020/03/04 星际争霸
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
python3 与python2 异常处理的区别与联系
2016/06/19 Python
python 计算文件的md5值实例
2017/01/13 Python
Python格式化日期时间操作示例
2018/06/28 Python
python tkinter实现屏保程序
2019/07/30 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
基于Python的OCR实现示例
2020/04/03 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
Python os库常用操作代码汇总
2020/11/03 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
杭白菊导游词
2015/02/10 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
Python一行代码实现自动发邮件功能
2021/05/30 Python