Files
Jack a24f2e23c6 Update to 7.25.0
1. Added Mail Marketing Automation trigger tasks
2. Added Mail Marketing Groups Import, Export, Merge
3. Added Mail Marketing Subscribers to support paste import
4. Added Mail Marketing Template Import Export Duplicate
5. Added Mail server add timed automatic reply
6. Added HTTPS Protection function for Website (disables automatic HTTP to HTTPS redirection when enabled)
7. Optimize Website Interface Button Integration
8. Optimize the response speed of WP Toolkit interface
2025-03-13 17:52:26 +08:00

346 lines
11 KiB
Python

#!/usr/bin/env python
# coding:utf-8
# +-------------------------------------------------------------------
# | aaPanel
# +-------------------------------------------------------------------
# | Copyright (c) 2015-2017 aaPanel(www.aapanel.com) All rights reserved.
# +-------------------------------------------------------------------
# | Author: 1249648969@qq.com,
# +-------------------------------------------------------------------
# Firewalld管理类
# ------------------------------
from xml.etree.ElementTree import ElementTree, Element
import os, public
class firewalld:
__TREE = None
__ROOT = None
__CONF_FILE = '/etc/firewalld/zones/public.xml'
# 初始化配置文件XML对象
def __init__(self):
if self.__TREE: return
self.__TREE = ElementTree()
self.__TREE.parse(self.__CONF_FILE)
self.__ROOT = self.__TREE.getroot()
# 获取端口列表
def GetAcceptPortList(self):
mlist = self.__ROOT.getchildren()
data = []
for p in mlist:
if p.tag != 'port': continue
tmp = p.attrib
port = p.attrib['port']
data.append(tmp)
return data
# 添加端口放行
def AddAcceptPort(self, port, pool='tcp'):
# 检查是否存在
if self.CheckPortAccept(pool, port): return True
attr = {"protocol": pool, "port": port}
Port = Element("port", attr)
self.__ROOT.append(Port)
self.Save()
return True
# 删除端口放行
def DelAcceptPort(self, port, pool='tcp'):
# 检查是否存在
if not self.CheckPortAccept(pool, port): return True
mlist = self.__ROOT.getchildren()
m = False
for p in mlist:
if p.tag != 'port': continue
if p.attrib['port'] == port:
self.__ROOT.remove(p)
m = True
if m:
self.Save()
return True
return False
# 添加UDP端口放行
def AddUpdPort(self, port, pool='udp'):
# 检查是否存在
if self.CheckPortAccept(pool, port): return True
attr = {"protocol": pool, "port": port}
Port = Element("port", attr)
self.__ROOT.append(Port)
self.Save()
return True
# 删除UDP端口放行
def DelUdpPort(self, port, pool='udp'):
# 检查是否存在
if not self.CheckPortAccept(pool, port): return True
mlist = self.__ROOT.getchildren()
m = False
for p in mlist:
if p.tag != 'port': continue
if p.attrib['port'] == port:
self.__ROOT.remove(p)
m = True
if m:
self.Save()
return True
return False
# 检查端口是否已放行
def CheckPortAccept(self, pool, port):
for p in self.GetAcceptPortList():
if p['port'] == port and p['protocol']==pool: return True
return False
# 获取屏蔽IP列表
def GetDropAddressList(self):
mlist = self.__ROOT.getchildren()
data = []
for ip in mlist:
if ip.tag != 'rule': continue
tmp = {}
ch = ip.getchildren()
a=None
for c in ch:
tmp['type']=None
if c.tag == 'drop': tmp['type'] = 'drop'
if c.tag == 'source':
tmp['address']=c.attrib['address']
if tmp['type']:
data.append(tmp)
return data
# 获取 reject 信息
def GetrejectLIST(self):
mlist = self.__ROOT.getchildren()
data = []
for ip in mlist:
#print(ip)
if ip.tag != 'rule': continue
tmp = {}
ch = ip.getchildren()
a=None
flag = None
for c in ch:
tmp['type']=None
if c.tag == 'reject': tmp['type'] = 'reject'
if c.tag == 'source':
tmp['address']=c.attrib['address']
if c.tag =='port':
tmp['protocol']=c.attrib['protocol']
tmp['port']=c.attrib['port']
if tmp['type']:
data.append(tmp)
return data
# 获取 accept 信息
def Getacceptlist(self):
mlist = self.__ROOT.getchildren()
data = []
for ip in mlist:
if ip.tag != 'rule': continue
tmp = {}
ch = ip.getchildren()
a=None
flag = None
for c in ch:
tmp['type']=None
if c.tag == 'accept': tmp['type'] = 'accept'
if c.tag == 'source':
tmp['address']=c.attrib['address']
if c.tag =='port':
tmp['protocol']=c.attrib['protocol']
tmp['port']=c.attrib['port']
if tmp['type']:
data.append(tmp)
return data
# 获取所有信息
def Get_All_Info(self):
data={}
data['drop_ip']=self.GetDropAddressList()
data['reject']=self.GetrejectLIST()
data['accept']=self.Getacceptlist()
return data
# 判断是否存在
def Chekc_info(self,port,address,pool,type):
data=self.Get_All_Info()
if type=='accept':
for i in data['accept']:
#print(i['address'], i['protocol'], i['port'])
if i['address']==address and i['protocol']==pool and i['port']==port:
return True
else:
return False
elif type=='reject':
for i in data['accept']:
# print(i['address'], i['protocol'], i['port'])
if i['address'] == address and i['protocol'] == pool and i['port'] == port:
return True
else:
return False
else:
return False
def AddDropAddress(self, address):
# 检查是否存在
if self.CheckIpDrop(address): return True
attr = {"family": 'ipv4'}
rule = Element("rule", attr)
attr = {"address": address}
source = Element("source", attr)
drop = Element("drop", {})
rule.append(source)
rule.append(drop)
self.__ROOT.append(rule)
self.Save()
return 'OK'
# 删除IP屏蔽
def DelDropAddress(self, address):
# 检查是否存在
if not self.CheckIpDrop(address): return True
mlist = self.__ROOT.getchildren()
for ip in mlist:
if ip.tag != 'rule': continue
ch = ip.getchildren()
for c in ch:
if c.tag != 'source':continue
if c.attrib['address'] == address:
self.__ROOT.remove(ip)
self.Save()
return True
return False
# 添加端口放行并且指定IP
def Add_Port_IP(self, port,address,pool,type):
if type=='accept':
# 判断是否存在
if self.Chekc_info(port,address,pool,type): return True
attr = {"family": 'ipv4'}
rule = Element("rule", attr)
attr = {"address": address}
source = Element("source", attr)
attr={'port':str(port),'protocol':pool}
port_info=Element("port",attr)
accept = Element("accept", {})
rule.append(source)
rule.append(port_info)
rule.append(accept)
self.__ROOT.append(rule)
self.Save()
return True
elif type=='reject':
# 判断是否存在
if self.Chekc_info(port,address,pool,type):return True
attr = {"family": 'ipv4'}
rule = Element("rule", attr)
attr = {"address": address}
source = Element("source", attr)
attr = {'port': str(port), 'protocol': pool}
port_info = Element("port", attr)
reject = Element("reject", {})
rule.append(source)
rule.append(port_info)
rule.append(reject)
self.__ROOT.append(rule)
self.Save()
return True
else:
return False
# 删除指定端口的=。=
def Del_Port_IP(self, port,address,pool,type):
if type=='accept':
a = None
for i in self.__ROOT:
if i.tag == 'rule':
tmp = {}
for c in i.getchildren():
tmp['type'] = None
if c.tag == 'accept': tmp['type'] = 'accept'
if c.tag == 'source':
tmp['address'] = c.attrib['address']
if c.tag == 'port':
tmp['protocol'] = c.attrib['protocol']
tmp['port'] = c.attrib['port']
if tmp['type']:
if tmp['port'] == port and tmp['address'] == address and tmp['type'] == type and tmp['protocol'] == pool:
self.__ROOT.remove(i)
self.Save()
return True
elif type=='reject':
for i in self.__ROOT:
if i.tag == 'rule':
tmp = {}
for c in i.getchildren():
tmp['type'] = None
if c.tag == 'reject': tmp['type'] = 'reject'
if c.tag == 'source':
tmp['address'] = c.attrib['address']
if c.tag == 'port':
tmp['protocol'] = c.attrib['protocol']
tmp['port'] = c.attrib['port']
if tmp['type']:
if tmp['port'] == port and tmp['address'] == address and tmp['type'] == type and tmp['protocol'] == pool:
self.__ROOT.remove(i)
self.Save()
return True
# 检查IP是否已经屏蔽
def CheckIpDrop(self, address):
for ip in self.GetDropAddressList():
if ip['address'] == address: return True
return False
# 取服务状态
def GetServiceStatus(self):
import psutil
for pid in psutil.pids():
if psutil.Process(pid).name() == 'firewalld': return True
return False
# 服务控制
def FirewalldService(self, type):
public.ExecShell('systemctl ' + type + ' firewalld.service')
return public.return_msg_gettext(True, public.lang("Setup successfully!"))
# 保存配置
def Save(self):
self.format(self.__ROOT)
self.__TREE.write(self.__CONF_FILE, 'utf-8')
public.ExecShell('firewall-cmd --reload')
# 整理配置文件格式
def format(self, em, level=0):
i = "\n" + level * " "
if len(em):
if not em.text or not em.text.strip():
em.text = i + " "
for e in em:
self.format(e, level + 1)
if not e.tail or not e.tail.strip():
e.tail = i
if level and (not em.tail or not em.tail.strip()):
em.tail = i