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单元测试框架unittest使用方法讲解
Apr 13 Python
Python反射和内置方法重写操作详解
Aug 27 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
Nov 15 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
python 画条形图(柱状图)实例
Apr 24 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
python中yield的用法详解
Jan 13 Python
python中HTMLParser模块知识点总结
Jan 25 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 setTime 设置当前时间的代码
2012/08/27 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php进程间通讯实例分析
2016/07/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
python中requests和https使用简单示例
2018/01/18 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
Python使用configparser库读取配置文件
2020/02/22 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
温泉秘密:Onsen Secret
2020/07/06 全球购物
巾帼建功标兵事迹材料
2014/05/11 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书