Files
aaPanel/class_v2/panelModelV2/publicModel.py
T
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

338 lines
13 KiB
Python

# coding: utf-8
# -------------------------------------------------------------------
# aaPanel
# -------------------------------------------------------------------
# Copyright (c) 2015-2099 aaPanel(www.aapanel.com) All rights reserved.
# -------------------------------------------------------------------
# Author: cjxin <cjxin@aapanel.com>
# -------------------------------------------------------------------
# 备份
# ------------------------------
import os, sys, re, json, shutil, psutil, time
from panelModelV2.base import panelBase
import public, panelTask
import config_v2 as config
try:
from BTPanel import cache,session
except:pass
class main(panelBase):
__table = 'task_list'
# public.check_database_field("ssl_data.db","ssl_info")
task_obj = panelTask.bt_task()
def __init__(self):
pass
"""
@name 获取面板日志
"""
def get_update_logs(self,get):
try:
skey = 'panel_update_logs'
res = cache.get(skey)
if res:
return public.return_message(0, 0, res)
# res = public.httpPost('https://wafapi2.aapanel.com/api/getUpdateLogs?type=Linux',{})
res = public.httpPost('https://wafapi2.aapanel.com/Api/getUpdateLogs?type=Linux',{})
start_index = res.find('(') + 1
end_index = res.rfind(')')
json_data = res[start_index:end_index]
res = json.loads(json_data)
cache.set(skey,res,60)
except:
res = []
return public.return_message(0, 0, res)
def get_public_config(self, args):
"""
@name 获取公共配置
"""
_config_obj = config.config()
data = _config_obj.get_config(args)
data['task_list'] = self.task_obj.get_task_lists(args)
data['task_count'] = public.M('tasks').where("status!=?", ('1',)).count()
data['get_pd'] = self.get_pd(args)
data['ipv6'] = ''
if _config_obj.get_ipv6_listen(None): data['ipv6'] = 'checked'
data['is_local'] = ''
if public.is_local(): data['is_local'] = 'checked'
if data['get_pd'] and data['get_pd'][2] != -1:
time_diff = (data['get_pd'][2]-int(time.time())) % (365*86400)
data['active_pro_time'] = int(time.time()) - (365*86400 - time_diff)
else:
data['active_pro_time'] = 0
data['status_code'] = _config_obj.get_not_auth_status()
if os.path.exists('/www/server/panel/config/api.json'):
try:
res = json.loads(public.readFile('/www/server/panel/config/api.json'))
data['api'] = 'checked' if res['open'] else ''
except:
public.ExecShell('rm -f /www/server/panel/config/api.json')
data['api'] = ''
else:
data['api'] = ''
data['total'] = os.path.exists('/www/server/panel/plugin/total') or os.path.exists('/www/server/panel/plugin/monitor')
data['disk_usage'] = public.get_disk_usage(public.get_panel_path())
data['uid'] = ''
if os.path.exists('/www/server/panel/data/userInfo.json'):
res = public.readFile('/www/server/panel/data/userInfo.json')
if res:
try:
res = json.loads(res)
data['uid'] = res['uid']
except:
pass
data['panel']['backup_info'] = self.get_panel_backup_info()
return public.return_message(0, 0, data)
# 获取公共配置(精简版)
def get_public_config_simple(self, args):
"""
@name 获取公共配置(精简版)
@param args<dict_obj> 请求参数
@return dict
"""
data = {}
data['task_count'] = public.M('tasks').where("status!=?", ('1',)).count()
data['get_pd'] = self.get_pd(args)
import panelSSL
data['user_info'] = panelSSL.panelSSL().GetUserInfo(None)
import system_v2 as system
data['panel'] = system.system().GetPanelInfo()
data["webname"] = public.GetConfigValue("title")
data['menu_list'] = config.config().get_menu_list()['message']
data['install_finished'] = os.path.exists('{}/data/install_finished.mark'.format(public.get_panel_path()))
import breaking_through as breaking_through
_breaking_through_obj = breaking_through.main()
data['limit_login'] = _breaking_through_obj.get_login_limit()
# 增加语言设置数据
lang = config.config().get_language()
data['language'] = lang['default']
data['language_list'] = lang['languages']
data['isPro'] = True if os.path.exists("/www/server/panel/data/panel_pro.pl") else False
return public.return_message(0, 0, data)
#统计面板备份占用空间
def get_panel_backup_info(self):
auto_backup=0 if os.path.exists('{}/data/not_auto_backup.pl'.format(public.get_panel_path())) else 1
backup_number=30
result={"total_size":0,"auto_backup":auto_backup,"backup_number":backup_number}
backup_number_file='{}/data/panel_backup_number.pl'.format(public.get_panel_path())
if os.path.exists(backup_number_file):
try:
result["backup_number"]=int(open(backup_number_file, 'r').read())
except:pass
b_path = '{}/panel'.format(public.get_backup_path())
if not os.path.exists(b_path): return result
for f in os.listdir(b_path):
f_path=b_path + '/' +f
try:
zip_string=""
if f.endswith('.zip'):zip_string=".zip"
mktime=time.mktime(time.strptime(f,"%Y-%m-%d"+zip_string))
day_date=public.format_date("%Y-%m-%d",times=mktime)
backup_path = b_path + '/' + day_date
backup_file = backup_path + '.zip'
if f_path==backup_file or (f_path==backup_path and os.path.isdir(f_path)):
result["total_size"] += public.get_path_size(f_path)
except:
pass
return result
# 获取常用软件安装状态
def get_public_config_setup(self, args):
from BTPanel import session
if 'config' not in session:
session['config'] = public.M('config').where("id=?", ('1',)).field(
'webserver,sites_path,backup_path,status,mysql_root').find()
data = session['config']
import system_v2 as system
data.update(system.system().GetConcifInfo())
if 'ftpPort' not in data:
# 获取FTP端口
if 'port' not in session:
import re
try:
file = public.GetConfigValue('setup_path') + '/pure-ftpd/etc/pure-ftpd.conf'
conf = public.readFile(file)
rep = r"\n#?\s*Bind\s+[0-9]+\.[0-9]+\.[0-9]+\.+[0-9]+,([0-9]+)"
port = re.search(rep, conf).groups()[0]
except:
port = '21'
session['port'] = port
data['ftpPort'] = session['port']
return public.return_message(0, 0, data)
# 获取授权信息
def get_pd(self, get):
return public.get_pd(get)
@staticmethod
def set_backup_path(get):
try:
backup_path = get.backup_path.strip().rstrip("/")
except AttributeError:
return public.return_message(-1, 0, public.lang("The parameter is incorrect"))
if not os.path.exists(backup_path):
return public.return_message(-1, 0, public.lang("The specified directory does not exist"))
if backup_path[-1] == "/":
backup_path = backup_path[:-1]
import files
try:
from BTPanel import session
except:
session = None
fs = files.files()
if not fs.CheckDir(get.backup_path):
return public.return_message(-1, 0, public.lang("You cannot use the system critical directory as the default backup directory"))
if session is not None:
session['config']['backup_path'] = os.path.join('/', backup_path)
db_backup = backup_path + '/database'
site_backup = backup_path + '/site'
if not os.path.exists(db_backup):
try:
os.makedirs(db_backup, 384)
except:
public.ExecShell('mkdir -p ' + db_backup)
if not os.path.exists(site_backup):
try:
os.makedirs(site_backup, 384)
except:
public.ExecShell('mkdir -p ' + site_backup)
public.M('config').where("id=?", ('1',)).save('backup_path', (get.backup_path,))
public.WriteLog('TYPE_PANEL', 'PANEL_SET_SUCCESS', (get.backup_path,))
public.restart_panel()
return public.return_message(0, 0, public.lang("The setup was successful"))
def get_soft_status(self, get):
if not hasattr(get, 'name'): return public.return_message(-1, 0, public.lang("Parameter error"))
s_status = False
status = False
setup = False
name = get.name.strip()
if name == 'web': name = public.get_webserver()
version = ''
if name == 'sqlite':
status = True
if name in ['mysql', 'pgsql', 'sqlserver', 'mongodb', 'redis']:
count = public.M('database_servers').where("LOWER(db_type)=LOWER(?)", (name,)).count()
if count > 0: status = True
if os.path.exists('/www/server/{}'.format(name)) and len(os.listdir('/www/server/{}'.format(name))) > 2:
if not public.M('tasks').where("name like ? and status == -1",
('安装%{}%'.format(name.replace('-', '')),)).count() > 0:
status = True
setup = True
if name == 'openlitespeed':
status = os.path.exists('/usr/local/lsws/bin/lswsctrl')
setup = status
if status:
path_data = {
"nginx": "/www/server/nginx/logs/nginx.pid",
"mysql": "/www/server/data/localhost.localdomain.pid",
"apache": "/www/server/apache/logs/httpd.pid",
"pure-ftpd": "/var/run/pure-ftpd.pid",
"redis": "/www/server/redis/redis.pid",
"pgsql": "/www/server/pgsql/data_directory/postmaster.pid",
"openlitespeed": "/tmp/lshttpd/lshttpd.pid",
"mongodb": "/www/server/mongodb/log/configsvr.pid",
}
if name == 'mysql':
datadir = public.get_datadir()
if datadir:
path_data["mysql"] = "{}/{}.pid".format(datadir, public.get_hostname())
if name in path_data.keys():
if os.path.exists(path_data[name]):
pid = public.readFile(path_data[name])
if pid:
try:
psutil.Process(int(pid))
s_status = True
except:
pass
else:
# 可能会存在用户修改主机名后 找不到pid文件的情况
if name == 'mysql' and not s_status:
for proc in psutil.process_iter():
if proc.name() == 'mysqld':
s_status = True
public.writeFile(path_data['mysql'], str(proc.pid))
break
version_data = {
"nginx": '/www/server/nginx/version.pl',
"mysql": "/www/server/mysql/version.pl",
"pgsql": "/www/server/pgsql/data/PG_VERSION",
"apache": "/www/server/apache/version.pl",
"pure-ftpd": "/www/server/pure-ftpd/version.pl",
"openlitespeed": "/usr/local/lsws/VERSION",
"redis": "/www/server/redis/version.pl",
"mongodb": "/www/server/mongodb/version.pl",
"memcached": "/usr/local/memcached/version_check.pl",
}
if name in version_data.keys():
if os.path.exists(version_data[name]):
version = public.readFile(version_data[name]).strip()
title_data = {
"nginx": "Nginx",
"mysql": "MySQL",
"pgsql": "PostgreSQL",
"mongodb": "MongoDB",
"redis": "Redis",
"apache": "Apache",
"openlitespeed": "OpenLiteSpeed",
"pure-ftpd": "Pure-FTPd",
"memcached": "Memcached",
}
s_version_data = {
'mysql': 'mysqld',
'apache': 'httpd',
}
data = {
"status": status,
"s_status": s_status,
"msg": '',
"version": version,
"name": name.replace('-', ''),
"title": title_data.get(name, name),
"admin": os.path.exists('/www/server/panel/plugin/' + name),
"s_version": s_version_data.get(name, name),
"setup": setup
}
return public.return_message(0, 0,data)