Files
yakpanel-core/class_v2/one_key_wp_v2.py
2026-04-07 02:04:22 +05:30

2293 lines
93 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# coding: utf-8
# +-------------------------------------------------------------------
# | YakPanel
# +-------------------------------------------------------------------
# | Copyright (c) 2015-2016 YakPanel(www.yakpanel.com) All rights reserved.
# +-------------------------------------------------------------------
# | Author: zhwen <zhwen@yakpanel.com>
# +-------------------------------------------------------------------
import os
import time
import json
import sys
import public
import re
import requests
from bs4 import BeautifulSoup
import panel_mysql_v2 as panelMysql
from public.validate import Param
# import wp-toolkit core
# from wp_toolkit import wp_version, wpmgr, wpfastcgi_cache
def get_mem():
import psutil
mem = psutil.virtual_memory()
memInfo = {'memTotal': int(mem.total / 1024 / 1024), 'memFree': int(mem.free / 1024 / 1024),
'memBuffers': int(mem.buffers / 1024 / 1024), 'memCached': int(mem.cached / 1024 / 1024)}
return memInfo['memTotal']
class one_key_wp:
wp_package_url = 'https://wordpress.org/latest.zip'
# wp_package_url = 'https://www.yakpanel.com/install/package/wordpress-5.9.1.zip'
base_path = "/www/server/panel/"
wp_session_path = '{}/data/wp_session'.format(base_path)
package_zip = '{}/package/wp.zip'.format(base_path)
md5_file = '{}/package/md5'.format(base_path)
log_path = '/tmp/schedule.log'
__php_tmp_file = '/tmp/wp_tmp'.format(base_path)
panel_db = "/www/server/panel/data/default.db"
timeout_count = 0
old_time = 0
__wp_session = None
__session_resp = None
__ajax_nonce = None
__domain = None
__plugin_page_content = None
wp_user = None
wp_passwd = None
def __init__(self):
self.create_wp_table()
if not self.__wp_session:
self.__wp_session = requests.Session()
# import PluginLoader
# self.__IS_PRO_MEMBER = PluginLoader.get_auth_state() > 0
def get_headers(self):
return {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36',
'Host': self.__domain
}
def get_plugin_page(self):
_get_ajax_nonce_url = "http://{}/wp-admin/plugins.php".format(self.__domain)
self.__plugin_page_content = self.__wp_session.get(_get_ajax_nonce_url, headers=self.get_headers(),
verify=False).text
def get_wp_nonce(self, content, rep):
rex = re.search(rep, content)
if rex:
return rex.group(1)
def get_nonce(self):
resp = self.__session_resp
if resp != '1':
resp = resp.text
else:
self.get_plugin_page()
resp = self.__plugin_page_content
_ajax_nonce_rep = '"ajax_nonce\\\"\\:\\\"(\\w+)'
rex = re.search(_ajax_nonce_rep, resp)
if rex:
self.__ajax_nonce = rex.group(1)
def __load_cookies(self, s_id):
self.__domain = self.get_wp_auth(s_id)
f = '{}/{}'.format(self.wp_session_path, self.__domain)
c = public.readFile(f)
if c:
mtime = os.path.getmtime(f)
expried = 86400
if time.time() - mtime > expried:
print('cookies expired, re-login wordpress')
self.__login_wp()
else:
print('use local session')
self.__wp_session.cookies.update(json.loads(c))
self.__session_resp = '1'
else:
print('No local cookies, login wordpress')
self.__login_wp()
# self.__login_wp()
# print('login success!')
try:
self.get_nonce()
except:
pass
if not self.__ajax_nonce:
self.__login_wp()
self.get_nonce()
self.get_plugin_page()
def __save_cookies(self):
if not os.path.exists(self.wp_session_path):
os.mkdir(self.wp_session_path)
f = '{}/{}'.format(self.wp_session_path, self.__domain)
return public.writeFile(f, json.dumps(self.__wp_session.cookies.get_dict()))
def __login_wp(self):
wp_login = 'http://{}/wp-login.php'.format(self.__domain)
headers1 = {'Cookie': 'wordpress_test_cookie=WP Cookie check',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36',
# 'referer':"https://{}/wp-login.php?loggedout=true&wp_lang=en_US".format(self.__domain),
'Host': self.__domain
}
datas = {
'log': self.wp_user,
'pwd': self.wp_passwd,
'wp-submit': 'Log In',
# 'redirect_to': 'https://{}/wp-admin'.format(self.__domain),
'testcookie': '1'
}
# hosts = public.readFile('/etc/hosts')
# if not hosts:
# return False
# if not re.search(r'127.0.0.1\s+{}'.format(self.__domain),hosts):
# public.writeFile('/etc/hosts','\n127.0.0.1 {}'.format(self.__domain),'a+')
self.__session_resp = retry(
lambda: self.__wp_session.post(wp_login, headers=headers1, data=datas, verify=False))
# cookies持久化
self.__save_cookies()
# 写输出日志
def write_logs(self, log_msg, clean=None):
if clean:
fp = open(self.log_path, 'w')
fp.write(log_msg)
fp.close()
fp = open(self.log_path, 'a+')
fp.write(log_msg + '\n')
fp.close()
# 下载文件
def download_file(self):
try:
path = os.path.dirname(self.package_zip)
if not os.path.exists(path): os.makedirs(path)
import urllib, socket, ssl
ssl._create_default_https_context = ssl._create_unverified_context
socket.setdefaulttimeout(10)
self.pre = 0
self.old_time = time.time()
print("Download the installation package: {} --> {}".format(self.wp_package_url, self.package_zip))
self.write_logs(
"|-Download the installation package: {} --> {}".format(self.wp_package_url, self.package_zip))
if sys.version_info[0] == 2:
urllib.urlretrieve(self.wp_package_url, filename=self.package_zip, reporthook=self.download_hook)
else:
urllib.request.urlretrieve(self.wp_package_url, filename=self.package_zip,
reporthook=self.download_hook)
md5str = public.FileMd5(self.package_zip)
public.writeFile(self.md5_file, str(md5str))
except:
print("Download error: {}".format(public.get_error_info()))
if self.timeout_count > 5: return;
self.timeout_count += 1
time.sleep(5)
self.download_file()
# 下载文件进度回调
def download_hook(self, count, blockSize, totalSize):
used = count * blockSize
pre1 = int((100.0 * used / totalSize))
if self.pre != pre1:
dspeed = used / (time.time() - self.old_time)
self.pre = pre1
def check_package(self):
# 检查本地包
download = False
md5str = None
if os.path.exists(self.package_zip):
md5str = public.FileMd5(self.package_zip)
if os.path.exists(self.md5_file) and md5str:
if md5str != public.readFile(self.md5_file):
download = True
else:
download = True
return download
def download_latest_package(self):
print("Start downloading the installation package...")
self.write_logs("|-Start downloading the installation package...")
if os.path.exists(self.package_zip):
# 获取文件的最后修改时间
modified_time = os.path.getmtime(self.package_zip)
# 计算当前时间与最后修改时间的差值
time_diff = time.time() - modified_time
time2 = 30 * 24 * 60 * 60
if time_diff > time2: # 如果超过30天则删除文件
os.remove(self.package_zip)
os.remove(self.md5_file)
self.write_logs("|-Del package...")
if not self.check_package():
print("|-MD5 consistent, no need to download...")
return public.return_msg_gettext(True, public.lang("MD5 consistent!"))
self.download_file()
if not os.path.exists(self.package_zip):
self.write_logs("|-Download failed...")
print("Download failed...")
return public.return_msg_gettext(False, public.lang("File download failed!"))
return public.return_msg_gettext(True, public.lang("Download successfully"))
def unzip_package(self, site_path):
print("Start unzipping the installation package...")
self.write_logs("|-Start unzipping the installation package...")
public.ExecShell('unzip -o {} -d {}/'.format(self.package_zip, site_path))
public.ExecShell('mv {}/wordpress/* {}'.format(site_path, site_path))
os.removedirs("{}/wordpress/".format(site_path))
print("Start setting up site permissions...")
self.write_logs("|-Start setting up site permissions...")
self.set_permission(site_path)
def set_permission(self, site_path):
# 区分目录文件权限,分别赋权
os.system(f'chmod -R 644 {site_path}')
os.system(rf'find {site_path} -type d -exec chmod 755 {{}} \;')
os.system(f'chown -R www:www {site_path}')
def set_urlrewrite(self, site_name, site_path):
webserver = public.get_webserver()
if webserver == 'openlitespeed':
webserver = 'apache'
swfile = '/www/server/panel/rewrite/{}/wordpress.conf'.format(webserver)
if os.path.exists(swfile):
rewriteConf = public.readFile(swfile)
if webserver == 'nginx':
dwfile = '{}/vhost/rewrite/{}.conf'.format(self.base_path, site_name)
else:
dwfile = '{}/.htaccess'.format(site_path)
public.writeFile(dwfile, rewriteConf)
def write_db(self, s_id, d_id, prefix, user_name, admin_password):
print("Inserting data...")
pdata = {"s_id": s_id, "d_id": d_id, "prefix": prefix, "user": user_name, "pass": admin_password}
public.M('wordpress_onekey').where('s_id=?', (s_id,)).field('s_id').find()
if public.M('wordpress_onekey').where('s_id=?', (s_id,)).field('s_id').find():
print("Data already exists, update data...")
public.M('wordpress_onekey').where('s_id=?', (s_id,)).update(pdata)
return
print("Insert data...")
print("Insert data:{}".format(pdata))
print("Result:{}".format(public.M('wordpress_onekey').insert(pdata)))
def create_wp_table(self):
if not public.M('sqlite_master').where('type=? AND name=?', ('table', 'wordpress_onekey')).count():
public.M('').execute('''CREATE TABLE "wordpress_onekey" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"s_id" INTEGER DEFAULT '',
"d_id" INTEGER DEFAULT '',
"prefix" TEXT DEFAULT '',
"user" TEXT DEFAULT '',
"pass" TEXT DEFAULT '');''')
def init_wp(self, values):
hosts = public.readFile('/etc/hosts')
if not hosts:
return False
if not re.search(r'127.0.0.1\s+{}'.format(values['site_name']), hosts):
public.writeFile('/etc/hosts', '\n127.0.0.1 {}'.format(values['site_name']), 'a+')
self.write_logs("|-Start initializing Wordpress...")
from wp_toolkit import wpmgr
# 初始化WP管理类
wpmgr_obj = wpmgr(values['s_id'])
# 初始化WP网站配置
self.write_logs("|-Start setup configurations...")
ok, msg = wpmgr_obj.setup_config(values['dbname'], values['db_user'], values['db_pwd'], 'localhost',
values['prefix'])
self.write_logs('|-Setup config >>> {} {}'.format('OK' if ok else 'FAIL', msg))
if not ok:
raise Exception(msg)
# 处理邮件权限
try:
if os.path.exists('/var/spool/postfix/maildrop'):
public.ExecShell("chmod -R 777 /var/spool/postfix/maildrop")
except:
pass
# 初始化WP网站信息
self.write_logs("|-Start installations...")
ok, msg = wpmgr_obj.wp_install(values['weblog_title'], values['user_name'], values['admin_email'],
values['admin_password'], values['language'])
self.write_logs('|-Installation {} {}'.format('OK' if ok else 'FAIL', msg))
if not ok:
raise Exception(msg)
# if self.__IS_PRO_MEMBER:
# from wp_toolkit import wpmgr
#
# # 初始化WP管理类
# wpmgr_obj = wpmgr(values['s_id'])
#
# # 初始化WP网站配置
# self.write_logs("|-Start setup configurations...")
# ok, msg = wpmgr_obj.setup_config(values['dbname'], values['db_user'], values['db_pwd'], 'localhost', values['prefix'])
# self.write_logs('|-Setup config >>> {} {}'.format('OK' if ok else 'FAIL', msg))
#
# if not ok:
# raise Exception(msg)
#
# # 初始化WP网站信息
# self.write_logs("|-Start installations...")
# ok, msg = wpmgr_obj.wp_install(values['weblog_title'], values['user_name'], values['admin_email'], values['admin_password'], values['language'])
# self.write_logs('|-Installation {} {}'.format('OK' if ok else 'FAIL', msg))
#
# if not ok:
# raise Exception(msg)
# else:
# self.request_setup_0(values)
# time.sleep(1)
# if not self.request_setup_2(values):
# return public.return_msg_gettext(False,
# "The database connection is abnormal. Please check whether the root user authority or database configuration parameters are correct.")
# time.sleep(1)
# self.request_setup_3(values)
# time.sleep(1)
# self.request_setup_4(values)
# time.sleep(1)
# 配置伪静态规则
self.set_urlrewrite(values['site_name'], values['site_path'])
def request_setup_0(self, values):
self.write_logs("|-Start initializing Wordpress language...")
url = "http://{}/wp-admin/setup-config.php?step=0".format(values['site_name'])
param = {
"url": url,
"data": {"language": values['language']},
"headers": {"Host": values['domain']}
}
# result = self.request_wp_api(param)
response = retry(lambda: self.request_wp_api(param))
# public.print_log("开始检查--request_setup_0_result:{}".format(response))
def request_setup_2(self, values):
self.write_logs("|-Start initializing Wordpress config...")
url = "http://{}/wp-admin/setup-config.php?step=2".format(values['site_name'])
param = {
"url": url,
"headers": {"Host": values['domain']},
"data": {
"dbname": values['dbname'],
"uname": values['db_user'],
"pwd": values['db_pwd'],
"dbhost": "localhost",
"prefix": values['prefix'],
"language": values['language'],
"submit": "Submit",
}
}
# result = self.request_wp_api(param)
response = retry(lambda: self.request_wp_api(param))
if "install.php?language=ja":
return True
def request_setup_3(self, values):
self.write_logs("|-Start initializing Wordpress install language...")
url = "http://{}/wp-admin/install.php?language={}".format(values['site_name'], values['language'])
param = {
"url": url,
"headers": {"Host": values['domain']},
"data": {
"language": values['language']
}
}
# self.request_wp_api(param)
response = retry(lambda: self.request_wp_api(param))
def request_setup_4(self, values):
self.write_logs("|-Start installing the wordpress program...")
url = "http://{}/wp-admin/install.php?step=2".format(values['site_name'])
param = {
"url": url,
"headers": {"Host": values['domain']},
"data": {
"weblog_title": values['weblog_title'],
"user_name": values['user_name'],
"admin_password": values['admin_password'],
"admin_password2": values['admin_password'],
# "pw_weak": values['pw_weak'], # on/off
"admin_email": values['admin_email'],
# "Submit": "Install WordPress",
"language": values['language']
}
}
# self.request_wp_api(param)
response = retry(lambda: self.request_wp_api(param))
def request_wp_api(self, param):
"""需要指定域名得host为本机IP"""
resp = requests.post(param['url'], data=param['data'], headers=param['headers'])
# public.print_log("开始检查--request_wp_api:{}".format(resp))
# public.print_log("开始检查--request_wp_api_resp.text:{}".format(resp.text))
return resp.text
def get_update_wp_nonce(self):
url = "http://{}/wp-admin/update-core.php".format(self.__domain)
# res = self.action_plugin_get(url)
_wp_nonce_rep = '"_wpnonce\\\"\\svalue=\\\"(\\w+)'
# rex = re.search(_wp_nonce_rep,res)
# if rex:
# self.__wp_nonce = rex.group(1)
# return self.get_wp_nonce(self.action_plugin_get(url),_wp_nonce_rep)
response = retry(lambda: self.get_wp_nonce(self.action_plugin_get(url), _wp_nonce_rep))
return response
def action_plugin_post(self, param):
headers = self.get_headers()
if 'upgrade' in param['data']:
param['data']['_wpnonce'] = self.get_update_wp_nonce()
headers['referer'] = 'http://{}/wp-admin/update-core.php'.format(param['domain'])
response = retry(
lambda: self.__wp_session.post(param['url'], data=param['data'], headers=headers, verify=False).text)
return response
# return self.__wp_session.post(param['url'],data=param['data'], headers=headers, verify=False).text
def action_plugin_get(self, url, headers=None):
if not headers:
headers = self.get_headers()
# headers['Referer'] = "http://{}/wp-admin".format(self.__domain)
response = retry(lambda: self.__wp_session.get(url, headers=headers, verify=False).text)
return response
# return self.__wp_session.get(url, headers=headers, verify=False).text
def install_plugin(self, values):
self.write_logs("|-Start installing the [nginx-helper] plugin...")
self.__load_cookies(values['s_id'])
param = {
"url": "http://{}/wp-admin/admin-ajax.php".format(self.__domain),
"domain": values['domain'],
"data": {
"slug": values['slug'], # 插件名称 nginx-helper
"action": values['wp_action'], # action已经被面板占用 install-plugin
"_ajax_nonce": self.__ajax_nonce,
"_fs_nonce": "",
"username": "",
"password": "",
"connection_type": "",
"public_key": "",
"private_key": ""
}
}
res = self.action_plugin_post(param)
return res
def get_smart_http_expire_form_nonce(self, url):
public.writeFile('/tmp/2', str(self.action_plugin_get(url)))
smart_http_expire_form_nonce = '"smart_http_expire_form_nonce\\\"\\svalue=\\\"(\\w+)'
return self.get_wp_nonce(self.action_plugin_get(url), smart_http_expire_form_nonce)
def set_nginx_helper(self, values):
self.write_logs("|-Setting up [nginx-helper] plugin cache rules...")
self.__load_cookies(values['s_id'])
url = "http://{}/wp-admin/options-general.php?page=nginx".format(self.__domain)
param = {
"url": url,
"domain": values['domain'],
"data": {
"enable_purge": "1",
"is_submit": "1",
"cache_method": "enable_fastcgi",
"purge_method": "unlink_files",
"redis_hostname": "127.0.0.1",
"redis_port": "6379",
"redis_prefix": "nginx-cache",
"purge_homepage_on_edit": "1",
"purge_homepage_on_del": "1",
"purge_page_on_mod": "1",
"purge_page_on_new_comment": "1",
"purge_page_on_deleted_comment": "1",
"purge_archive_on_edit": "1",
"purge_archive_on_del": "1",
"purge_archive_on_new_comment": "1",
"purge_archive_on_deleted_comment": "1",
"purge_url": "",
"log_level": "INFO",
"log_filesize": "5",
"smart_http_expire_form_nonce": self.get_smart_http_expire_form_nonce(url),
"smart_http_expire_save": "Save All Changes"
}
}
return self.action_plugin_post(param)
def act_nginx_helper_active(self, values):
self.write_logs("|-activating [nginx-helper] plugin...")
self.__load_cookies(values['s_id'])
values['active_id'] = "activate-nginx-helper"
self.get_plugin_page()
res = self.get_plugin_url(values['active_id'], self.__plugin_page_content)
url = 'http://{}/wp-admin/{data}'.format(self.__domain,
data=str(str(res[0]).split('"')[5]))
url = url.replace('amp;', '')
return self.action_plugin_get(url)
def get_plugin_url(self, active_id, content):
# soup = BeautifulSoup(content)
soup = BeautifulSoup(content, features="html.parser")
res = soup.find_all(id=active_id)
return res
def generate_wp_passwd(self, site_path, new_pass):
hash_password_code = public.readFile("{}/wp-includes/class-phpass.php".format(site_path))
extra_code = """
$passwordValue = "%s";
$wp_hasher = new PasswordHash(8, TRUE);
$sigPassword = $wp_hasher->HashPassword($passwordValue);
$data = $wp_hasher->CheckPassword($passwordValue,$sigPassword);
if($data){
echo 'True|'.$sigPassword;;
}else{
echo 'False|'.$sigPassword;;
}
""" % new_pass
php_code = hash_password_code + extra_code
public.writeFile(self.__php_tmp_file, php_code)
a, e = public.ExecShell("php -f {}".format(self.__php_tmp_file))
os.remove(self.__php_tmp_file)
res = a.split('|')
if res[0] == "True":
return public.return_message(0, 0, res[1])
return public.return_message(-1, 0, public.lang("Generated password detection failed!"))
def get_cache_status(self, s_id):
"""
兼容olsnginx
s_id 网站id
"""
import data
site_info = public.M('sites').where('id=?', (s_id,)).field('id,name,service_type').find()
if not isinstance(site_info, dict):
return False
site_name = site_info['name']
# 兼容ols
get_webserver = public.get_webserver()
if public.get_multi_webservice_status():
get_webserver = site_info['service_type'] if site_info['service_type'] else 'nginx'
if get_webserver == "openlitespeed":
from wp_toolkit import wpmgr
wpmgr_obj = wpmgr(site_info['id'])
conn, prefix = wpmgr_obj._get_db_connection()
table = f"{prefix}options"
with conn.cursor() as cursor:
cursor.execute(f"SELECT option_value FROM {table} WHERE option_name = 'litespeed.conf.cache'")
res = cursor.fetchone()
if not res:
return False
return True if res['option_value'] in ['1',1] else False
# 兼容apache
elif get_webserver == "apache":
conf_path = os.path.join(public.get_panel_path(), 'vhost', 'nginx', f'{site_name}.conf')
if os.path.exists(conf_path):
conf = public.readFile(conf_path)
if conf.find(f'proxy_cache_path /www/server/fastcgi_cache/{site_name}') != -1 and conf.find('NGINX-CACHE-START') != -1:
return True
return False
# 获取WP站点绑定的PHP可执行文件
from public import websitemgr
php_v = websitemgr.get_site_php_version(site_name).replace('.', '')
from wp_toolkit import wpfastcgi_cache
return wpfastcgi_cache().get_fast_cgi_status(site_name, php_v)
# return fast_cgi().get_fast_cgi_status(site_name, php_v)
##############################对外接口—BEGIN##############################
def get_wp_username(self, get):
"""
s_id 网站ID
"""
# 校验参数
try:
get.validate([
Param('s_id').Integer(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
values = self.check_param(get)
if values['status'] == -1:
return values
values = values['message']
db_info = public.M('wordpress_onekey').where('s_id=?', (values['s_id'],)).find()
db_name = public.M('databases').where('id=?', (db_info['d_id'],)).field('name').find()
if "name" not in db_name:
return public.return_message(-1, 0, public.lang("The database of this wordpress was not found, this may be caused by the fact that you have manually deleted the database"))
db_name = db_name['name']
mysql_obj = panelMysql.panelMysql()
res = mysql_obj.query('select * from {}.{}users'.format(
db_name, db_info['prefix']))
if hasattr(res, '__iter__'):
return public.return_message(0, 0, [i[1] for i in res])
else:
return public.return_message(-1, 0,
"Site database [{}] failed to query users, try setting the database for this site. Error: {}".format(
db_name, res))
def reset_wp_password(self, get):
"""
重置wordpress用户密码
s_id 网站ID
user 要重置的用户名
new_pass
"""
# 校验参数
try:
get.validate([
Param('user').String(),
Param('new_pass').String(),
Param('s_id').Integer(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
values = self.check_param(get)
if values['status'] == -1:
return values
values = values['message']
s_id = values['s_id']
db_info = public.M('wordpress_onekey').where('s_id=?', (s_id,)).find()
db_name = public.M('databases').where('id=?', (db_info['d_id'],)).field('name').find()['name']
path = public.M('sites').where('id=?', (s_id,)).field('path').find()['path']
new_pass = values['new_pass']
passwd = self.generate_wp_passwd(path, new_pass)
if passwd['status'] == -1:
return passwd
passwd = passwd['message']
if isinstance(passwd, dict):
passwd = passwd.get('result', None)
if passwd is None:
return public.fail_v2('Reset password failed')
mysql_obj = panelMysql.panelMysql()
sql = 'update {}.{}users set user_pass = "{}" where user_login = "{}"'.format(
db_name, db_info['prefix'], passwd, values['user'])
mysql_obj.execute(sql)
return public.return_message(0, 0, public.lang("Password reset successful"))
# 获取WP可用版本列表
def get_wp_available_versions(self, args: public.dict_obj):
# 校验参数
try:
args.validate([
Param('php_version_short').Integer(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
from wp_toolkit import wp_version
versions = list(map(lambda x: {
'locale': x['locale'],
'version': x['version'],
'php_version': x['php_version'],
'mysql_version': x['mysql_version'],
}, wp_version().latest_versions()))
if 'php_version_short' in args:
versions = list(
filter(lambda x: int(args.php_version_short) >= int(''.join(str(x['php_version']).split('.')[:2])),
versions))
return public.success_v2(versions)
# 获取WP网站本地版本号
def get_wp_version(self, s_id):
"""获取wordpress本地版本
s_id 网站id
"""
path = public.M('sites').where('id=?', (s_id,)).field('path').find()['path']
conf_file = "{}/wp-includes/version.php".format(path)
conf = public.readFile(conf_file)
try:
version = re.search('\\$wp_version\\s*=\\s*[\'\"]{1}([\\d\\.]*)[\'\"]{1}', conf).groups(1)[0]
except:
version = "00"
return version
# 获取WP已发布的最新版本号
def get_wp_version_online(self):
"""获取wordpress线上版本"""
url = "http://wordpress.org/download/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'
}
result = requests.get(url, headers=headers)
result = re.search(r'Download\s+WordPress\s+([\d\.]+)', result.text)
if result:
return result.group(1)
return "00"
# 检查WP是否有新版本可以更新
def is_update(self, get):
"""
s_id 网站ID
"""
values = self.check_param(get)
if values['status'] == -1:
return values
values = values['message']
online_v = self.get_wp_version_online()
local_v = self.get_wp_version(values['s_id'])
update = False
if str(online_v) != str(local_v):
update = True
data = {
"online_v": online_v,
"local_v": local_v,
"update": update
}
return_message = public.return_msg_gettext(True, data)
del return_message['status']
return public.return_message(0, 0, return_message['msg'])
def purge_all_cache(self, get):
"""
清理所有缓存
"""
# 校验参数
try:
get.validate([
Param('s_id').Integer(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
webserver = public.get_webserver()
site = public.M('sites').where('id=?', (get.s_id,)).field('id,name,service_type').find()
if not site:
return public.fail_v2(public.lang("The specified site does not exist!"))
if public.get_multi_webservice_status():
webserver = site['service_type'] if site['service_type'] else 'nginx'
# 新增ols缓存清理反馈
if webserver == "openlitespeed":
try:
self.delete_ols_cache()
except:
return public.return_message(-1, 0, public.lang('There are restricted files in the Cache directory. Please try to clear them from the LiteSpeed Cache'))
# 多服务下的清除apache缓存
if webserver == "apache" and site['service_type'] == 'apache':
self.delete_apache_cache_conf(site['name'])
# 清除nginx缓存
if webserver == 'nginx':
try:
from wp_toolkit import wpmgr
wpmgr(get.s_id).purge_cache_with_nginx_helper()
except Exception as ex:
return public.return_message(-1, 0, public.lang('Cache clearing failed. Please check if the Nginx Helper plugin is functioning properly.'))
# if self.__IS_PRO_MEMBER:
# from wp_toolkit import wpmgr
# wpmgr(get.s_id).purge_cache_with_nginx_helper()
# else:
# cache_dir = "/dev/shm/nginx-cache/wp"
# public.ExecShell("rm -rf {}/*".format(cache_dir))
return public.return_message(0, 0, public.lang("Cleaned up successfully!"))
def set_fastcgi_cache(self, get):
"""
设置缓存
version php版本
sitename 完整名
act disable/enable 开启关闭缓存
is_cache 附加字段指定开启的缓存类型nginxols
"""
# 校验参数
try:
get.validate([
Param('version').String(),
Param('sitename').String(),
Param('act').String(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
webserver = public.get_webserver()
site = public.M('sites').where('name=?', (get.sitename,)).field('id,name,path,service_type').find()
if not site:
return public.fail_v2(public.lang("The specified site does not exist!"))
if public.get_multi_webservice_status():
webserver = site['service_type'] if site['service_type'] else 'nginx'
# 添加apache缓存
if site['service_type'] == 'apache':
conf_path = os.path.join(public.get_panel_path(), 'vhost', 'nginx', f'{site['name']}.conf')
if not os.path.exists(conf_path):
return public.return_message(-1,0,public.lang('The Apache cache setting failed. Please check if the website is working properly!'))
conf = public.readFile(conf_path)
cache_dir = f'/www/server/fastcgi_cache/{site['name']}'
if get.get('act') == 'enable':
if conf.find(f'proxy_cache_path') == -1:
proxy_cache_path = f'proxy_cache_path /www/server/fastcgi_cache/{site['name']} levels=1:2 keys_zone={site['name'].replace(".", "_")}_cache:10m inactive=60m;'
conf = proxy_cache_path + '\n' + conf
if conf.find('nginx-to-apache-cache') == -1:
cache_conf = f'''
# NGINX-CACHE-START
proxy_cache {site['name'].replace(".", "_")}_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 2m;
proxy_cache_valid 301 302 0;
proxy_cache_valid 404 1m;
proxy_ignore_headers Cache-Control Expires Vary;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_cache_revalidate on;
# You can configure your own website caching policy here
set $skip_cache 0;
if ($request_method = POST) {{ set $skip_cache 1; }}
if ($query_string != "") {{ set $skip_cache 1; }}
if ($request_uri ~* "/(cart|checkout|my-account|order|account|login|register|wp-admin|dashboard|xmlrpc.php|wp-login.php)") {{
set $skip_cache 1;
}}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|woocommerce_items_in_cart|woocommerce_cart_hash|wp_woocommerce_session_") {{
set $skip_cache 1;
}}
proxy_no_cache $skip_cache;
proxy_cache_bypass $skip_cache;
proxy_cache_bypass $http_upgrade;
proxy_buffer_size 256k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
add_header X-Cache "$upstream_cache_status";
add_header X-Frame-Options SAMEORIGIN;
# NGINX-CACHE-END
'''
if conf.find('add_header Cache-Control no-cache;') != -1:
conf = conf.replace('add_header Cache-Control no-cache;', cache_conf)
else:
location_rep = r'(location\s*\/\s*\{\s*.*?)(\s*\})'
conf = re.sub(location_rep, r'\1\n' + cache_conf + r'\2', conf, flags=re.DOTALL)
# 创建缓存目录
if not os.path.exists(cache_dir):
os.makedirs(cache_dir, 0o755, True)
public.ExecShell(f'chown -R www:www {cache_dir}')
else:
import shutil
pattern = r'\s*# NGINX-CACHE-START\n.*?# NGINX-CACHE-END\s*'
match = re.search(pattern, conf, flags=re.DOTALL)
if match:
conf = conf.replace(match.group(), '\n ')
cache_path_pattern = r'^\s*proxy_cache_path\s+/www/server/fastcgi_cache/.*$'
cache_path_match = re.search(cache_path_pattern, conf, re.MULTILINE)
if cache_path_match:
conf = conf.replace(cache_path_match.group(), '')
# 删除缓存目录
if os.path.exists(cache_dir):
shutil.rmtree(cache_dir)
public.writeFile(conf_path, conf)
public.webservice_operation('nginx')
return public.return_message(0,0,public.lang('The Apache cache Settings were successful!'))
# 单服务下不支持apache缓存
if webserver == 'apache':
return public.return_message(-1, 0, public.lang("Apache cache is currently only supported under Multi-WebServer Hosting"))
# 添加ols缓存
if webserver == "openlitespeed" or get.get('is_cache','') == 'ols':
from wp_toolkit import wpmgr
wpmgr_obj = wpmgr(site['id'])
# 检测插件安装状态
plugins_list = wpmgr_obj.installed_plugins(False)
is_installed = False
for plugins in plugins_list:
if plugins['name'] == 'LiteSpeed Cache':
is_installed = True
break
# 未安装,尝试安装缓存插件
if not is_installed:
# 检测是否开启维护模式
is_maintenance = False
maintenance_file = os.path.join(site['path'], '.maintenance')
if os.path.exists(maintenance_file):
os.rename(maintenance_file, maintenance_file + '.bak.bak')
is_maintenance = True
ok, msg = wpmgr_obj.install_plugin('litespeed-cache')
if is_maintenance:
bak_file = os.path.join(site['path'], '.maintenance.bak.bak')
if os.path.exists(bak_file):
os.rename(bak_file, os.path.join(site['path'], '.maintenance'))
if not ok:
return public.fail_v2(public.lang("The installation of the cache plugin failed"))
# 激活插件
res = wpmgr_obj.activate_plugins('litespeed-cache/litespeed-cache.php')
if not res:
return public.fail_v2(public.lang("The cache plugin failed to activate. Please try to activate it manually and then enable the cache"))
return public.success_v2(public.lang("The OLS cache Settings were successful!"))
try:
# 更新缓存状态
conn, prefix = wpmgr_obj._get_db_connection()
table = f"{prefix}options"
with conn.cursor() as cursor:
# 开始事务
conn.begin()
new_value = '1' if get.get('act') == 'enable' else '0',
cursor.execute(f"UPDATE {table} SET option_value = %s WHERE option_name = %s",(new_value, 'litespeed.conf.cache'))
# 提交事务
conn.commit()
return public.success_v2(public.lang("The OLS cache Settings were successful!"))
except Exception as e:
return public.fail_v2(public.lang("OLS cache configuration failed: {}", e))
# 添加nginx缓存
values = self.check_param(get)
if values['status'] == -1:
return values
values = values['message']
if '.' in values['version']:
values['version'] = values['version'].replace('.', '')
from wp_toolkit import wpfastcgi_cache
ok, msg = wpfastcgi_cache().set_website_conf(values['version'], values['sitename'], values['act'],
immediate=True)
if not ok:
return public.fail_v2(msg)
return public.success_v2(msg)
# if self.__IS_PRO_MEMBER:
# from wp_toolkit import wpfastcgi_cache
#
# ok, msg = wpfastcgi_cache().set_website_conf(values['version'], values['sitename'], values['act'], immediate=True)
#
# if not ok:
# return public.fail_v2(msg)
#
# return public.success_v2(msg)
# else:
# return fast_cgi().set_website_conf(values['version'], values['sitename'], values['act'])
# 清除apache缓存
def delete_apache_cache_conf(self, site_name):
import shutil
conf_path = f'/www/server/fastcgi_cache/{site_name}'
tmp_conf = f'{conf_path}_temp_{os.getpid()}'
try:
if os.path.exists(conf_path):
os.rename(conf_path,tmp_conf)
os.makedirs(conf_path, 0o755, True)
public.ExecShell(f'chown -R www:www {conf_path}')
shutil.rmtree(tmp_conf)
return True
except:
return False
# 清除ols缓存
def delete_ols_cache(self):
import shutil
cache_path = '/usr/local/lsws/cachedata/priv/' # 缓存目录
# 直接删除缓存目录
if os.path.exists(cache_path) and os.path.isdir(cache_path):
shutil.rmtree(cache_path)
return True
# 使用网站ID查询WP站点域名
def get_wp_auth(self, s_id):
domain = public.M('domain').where("pid=?", (s_id,)).field('name').find()['name']
info = public.M('wordpress_onekey').where("s_id=?", (s_id,)).find()
self.wp_user = info['user']
self.wp_passwd = info['pass']
return domain
# 更新WP版本
def update_wp(self, args):
"""更新wordpress版本
s_id 网站ID
version 需要更新的版本
"""
from wp_toolkit import wpmgr
# 校验参数
try:
args.validate([
Param('s_id').Require().Integer('>', 0),
Param('version').Require().Regexp(r'^\d+(?:\.\d+)+$'),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
ok, msg = wpmgr(args.s_id).update_version(args.version)
if not ok:
return public.fail_v2(msg)
return public.success_v2('Upgrade to {}'.format(msg))
# if self.__IS_PRO_MEMBER:
# from wp_toolkit import wpmgr
#
# # 校验参数
# try:
# args.validate([
# Param('s_id').Require().Integer('>', 0),
# Param('version').Require().Regexp(r'^\d+(?:\.\d+)+$'),
# ], [
# public.validate.trim_filter(),
# ])
# except Exception as ex:
# public.print_log("error info: {}".format(ex))
# return public.return_message(-1, 0, str(ex))
#
# ok, msg = wpmgr(args.s_id).update_version(args.version)
#
# if not ok:
# return public.fail_v2(msg)
#
# return public.success_v2('Upgrade to {}'.format(msg))
# else:
# self.__load_cookies(args.s_id)
# param = {
# "url": "http://{}/wp-admin/update-core.php?action=do-core-upgrade".format(self.__domain),
# "domain": self.__domain,
# "data": {
# # "_wpnonce":get._wpnonce,
# "_wp_http_referer": '/wp-admin/update-core.php',
# "version": args.version,
# "locale": "en_US",
# "upgrade": "Update to version {}".format(args.version)
# }
# }
# self.action_plugin_post(param)
# return_message=public.return_msg_gettext(True, 'Updated successfully!')
# del return_message['status']
# return public.return_message(0,0, return_message['msg'])
# 获取可用的语言列表
def get_language(self, get=None):
language = {
"en": "English (United States)",
"af": "Afrikaans",
"am": "አማርኛ",
"ar": "العربية",
"ary": "العربية المغربية",
"as": "অসমীয়া",
"az": "Azərbaycan dili",
"azb": "گؤنئی آذربایجان",
"bel": "Беларуская мова",
"bg_BG": "Български",
"bn_BD": "বাংলা",
"bo": "བོད་ཡིག",
"bs_BA": "Bosanski",
"ca": "Català",
"ceb": "Cebuano",
"cs_CZ": "Čeština",
"cy": "Cymraeg",
"da_DK": "Dansk",
"de_CH_informal": "Deutsch (Schweiz, Du)",
"de_DE": "Deutsch",
"de_DE_formal": "Deutsch (Sie)",
"de_CH": "Deutsch (Schweiz)",
"de_AT": "Deutsch (Österreich)",
"dsb": "Dolnoserbšćina",
"dzo": "རྫོང་ཁ",
"el": "Ελληνικά",
"en_US": "English (United States)",
"en_NZ": "English (New Zealand)",
"en_AU": "English (Australia)",
"en_CA": "English (Canada)",
"en_GB": "English (UK)",
"en_ZA": "English (South Africa)",
"eo": "Esperanto",
"es_ES": "Español",
"es_EC": "Español de Ecuador",
"es_CO": "Español de Colombia",
"es_AR": "Español de Argentina",
"es_DO": "Español de República Dominicana",
"es_PE": "Español de Perú",
"es_CR": "Español de Costa Rica",
"es_UY": "Español de Uruguay",
"es_CL": "Español de Chile",
"es_PR": "Español de Puerto Rico",
"es_VE": "Español de Venezuela",
"es_GT": "Español de Guatemala",
"es_MX": "Español de México",
"et": "Eesti",
"eu": "Euskara",
"fa_IR": "فارسی",
"fa_AF": "(فارسی (افغانستان",
"fi": "Suomi",
"fr_FR": "Français",
"fr_BE": "Français de Belgique",
"fr_CA": "Français du Canada",
"fur": "Friulian",
"gd": "Gàidhlig",
"gl_ES": "Galego",
"gu": "ગુજરાતી",
"haz": "هزاره گی",
"he_IL": "עִבְרִית",
"hi_IN": "हिन्दी",
"hr": "Hrvatski",
"hsb": "Hornjoserbšćina",
"hu_HU": "Magyar",
"hy": "Հայերեն",
"id_ID": "Bahasa Indonesia",
"is_IS": "Íslenska",
"it_IT": "Italiano",
"ja": "日本語",
"jv_ID": "Basa Jawa",
"ka_GE": "ქართული",
"kab": "Taqbaylit",
"kk": "Қазақ тілі",
"km": "ភាសាខ្មែរ",
"kn": "ಕನ್ನಡ",
"ko_KR": "한국어",
"ckb": "كوردی‎",
"lo": "ພາສາລາວ",
"lt_LT": "Lietuvių kalba",
"lv": "Latviešu valoda",
"mk_MK": "Македонски јазик",
"ml_IN": "മലയാളം",
"mn": "Монгол",
"mr": "मराठी",
"ms_MY": "Bahasa Melayu",
"my_MM": "ဗမာစာ",
"nb_NO": "Norsk bokmål",
"ne_NP": "नेपाली",
"nl_NL_formal": "Nederlands (Formeel)",
"nl_NL": "Nederlands",
"nl_BE": "Nederlands (België)",
"nn_NO": "Norsk nynorsk",
"oci": "Occitan",
"pa_IN": "ਪੰਜਾਬੀ",
"pl_PL": "Polski",
"ps": "پښتو",
"pt_BR": "Português do Brasil",
"pt_AO": "Português de Angola",
"pt_PT_ao90": "Português (AO90)",
"pt_PT": "Português",
"rhg": "Ruáinga",
"ro_RO": "Română",
"ru_RU": "Русский",
"sah": "Сахалыы",
"snd": "سنڌي",
"si_LK": "සිංහල",
"sk_SK": "Slovenčina",
"skr": "سرائیکی",
"sl_SI": "Slovenščina",
"sq": "Shqip",
"sr_RS": "Српски језик",
"sv_SE": "Svenska",
"sw": "Kiswahili",
"szl": "Ślōnskŏ gŏdka",
"ta_IN": "தமிழ்",
"ta_LK": "தமிழ்",
"te": "తెలుగు",
"th": "ไทย",
"tl": "Tagalog",
"tr_TR": "Türkçe",
"tt_RU": "Татар теле",
"tah": "Reo Tahiti",
"ug_CN": "ئۇيغۇرچە",
"uk": "Українська",
"ur": "اردو",
"uz_UZ": "Ozbekcha",
"vi": "Tiếng Việt",
"zh_TW": "繁體中文",
"zh_HK": "香港中文版 ",
"zh_CN": "简体中文",
}
return_message = public.return_msg_gettext(True, language)
del return_message['status']
return public.return_message(0, 0, return_message['msg'])
# 请求参数校验
def check_param(self, args):
"""
@name 检测传入参数
@author zhwen<2022-03-10>
"""
# 检查email格式
rep_email = r"[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?"
# 检查域名格式
rep_domain = r"^(?=^.{3,255}$)[a-zA-Z0-9\_\-][a-zA-Z0-9\_\-]{0,62}(\.[a-zA-Z0-9\_\-][a-zA-Z0-9\_\-]{0,62})+$"
values = {}
if hasattr(args, 'd_id'):
if isinstance(args.d_id, int) or re.search(r'\d+', args.d_id):
values["d_id"] = args.d_id
else:
return public.return_message(-1, 0, public.lang("Please check if the [{}] format is correct For example: {}", "d_id", "99"))
if hasattr(args, 's_id'):
if isinstance(args.s_id, int) or re.search(r'\d+', args.s_id):
values["s_id"] = args.s_id
else:
return public.return_message(-1, 0, public.lang("Please check if the [{}] format is correct For example: {}", "s_id", "99"))
if hasattr(args, 'language'):
if args.language in self.get_language()['message']:
values['language'] = args.language
else:
return public.return_message(-1, 0, public.lang("Please check if the [{}] format is correct For example: {}", "language", "en"))
if hasattr(args, 'domain'):
if re.search(rep_domain, args.domain):
values['domain'] = public.xssencode2(args.domain)
else:
return public.return_message(-1, 0, public.lang("Please check if the [{}] format is correct For example: {}", "domain", "yakpanel.com"))
if hasattr(args, 'weblog_title'):
values['weblog_title'] = public.xssencode2(args.weblog_title)
if hasattr(args, 'user_name'):
values['user_name'] = public.xssencode2(args.user_name)
if hasattr(args, 'admin_password'):
values['admin_password'] = public.xssencode2(args.admin_password)
if hasattr(args, 'pw_weak'):
if args.pw_weak in ['on', 'off']:
values['pw_weak'] = args.pw_weak
else:
return public.return_message(-1, 0, public.lang("Please check if the [{}] format is correct For example: {}", "pw_weak", "on/off"))
if hasattr(args, 'admin_email'):
if re.search(rep_email, args.admin_email):
values['admin_email'] = public.xssencode2(args.admin_email)
else:
return public.return_message(-1, 0, public.lang("Please check if the [{}] format is correct For example: {}", "admin_email", "adimn@yakpanel.com"))
if hasattr(args, 'prefix'):
values['prefix'] = public.xssencode2(args.prefix)
if hasattr(args, 'php_version'):
values['php_version'] = public.xssencode2(args.php_version)
if hasattr(args, 'enable_cache'):
values['enable_cache'] = public.xssencode2(args.enable_cache)
if hasattr(args, 'wp_action'):
values['slug'] = public.xssencode2(args.slug)
if hasattr(args, 'slug'):
values['wp_action'] = public.xssencode2(args.wp_action)
if hasattr(args, 'active_id'):
values['active_id'] = public.xssencode2(args.active_id)
if hasattr(args, 'new_pass'):
values['new_pass'] = public.xssencode2(args.new_pass)
if hasattr(args, 'user'):
values['user'] = public.xssencode2(args.user)
if hasattr(args, 'sitename'):
values['sitename'] = public.xssencode2(args.sitename)
if hasattr(args, 'act'):
values['act'] = public.xssencode2(args.act)
if hasattr(args, 'version'):
values['version'] = public.xssencode2(args.version)
return public.return_message(0, 0, values)
# 删除网站
def del_site(self, get):
import panelSite
p = panelSite.panelSite()
site_info = public.M('sites').where('id=?', (get.s_id,)).find()
get.id = get.s_id
get.webname = site_info['name']
get.ftp = "1"
get.database = "1"
get.path = "1"
p.DeleteSite(get)
# 安装WP
def deploy_wp(self, get):
"""
d_id 数据据库ID
s_id 网站ID
language 部署wordpress后的语言
weblog_title wordpress博客名
user_name wordpress后台用户名
admin_password 管理员密码
admin_password2
pw_weak 允许弱密码
admin_email 管理员邮箱
prefix wordpress数据表前缀
php_version php版本
enable_cache 开启缓存
package_version Wordpress版本
@name 部署wordpress
@author zhwen<2022-03-10>
"""
# 校验参数
try:
get.validate([
Param('domain').String().Host(),
Param('weblog_title').String(),
Param('language').String(),
Param('php_version').String(),
Param('user_name').String(),
Param('admin_email').String().Email(),
Param('prefix').String(),
Param('pw_weak').String(),
Param('admin_password').String(),
Param('enable_cache').Integer(),
Param('d_id').Integer(),
Param('s_id').Integer(),
Param('package_version').String(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
try:
self.write_logs('', clean=True)
values = self.check_param(get)
if values['status'] == -1:
# 删除自动创建的空白网站
self.del_site(get)
return values
values = values['message']
s_id = values['s_id'] # 网站ID
d_id = values['d_id'] # 数据库ID
prefix = values['prefix'] # 前缀
site_info = public.M('sites').where('id=?', (s_id,)).find()
print("Get site info:\n ID: {}\npath: {}\n".format(s_id, site_info['path']))
self.write_logs("""
|-Get website information:
ID: {}
Path: {}
""".format(s_id, site_info['path']))
db_info = public.M('databases').where('id=?', (d_id,)).find()
print("Get database information: \nID: {}\nDBName: {}\nUser: {}\nPassWD: {}".format(
d_id, db_info["name"], db_info["username"], db_info["password"]))
self.write_logs("""
|-Get database information:
ID: {}
DBName: {}
User: {}
PassWD: {}
""".format(d_id, db_info["name"], db_info["username"], db_info["password"]))
values['dbname'] = db_info["name"]
self.wp_user = values['user_name']
self.wp_passwd = values['admin_password']
values['db_user'] = db_info["username"]
values['db_pwd'] = db_info["password"]
values['site_path'] = site_info['path']
values['site_name'] = site_info['name']
# 开始下载安装包
from wp_toolkit import wp_version
wp_version_obj = wp_version()
if 'package_version' not in get or get.package_version is None:
get.package_version = wp_version_obj.latest_version()['version']
self.write_logs('|-Package version: {}'.format(get.package_version))
# 下载特定版本的安装包
self.package_zip = wp_version_obj.download_package(get.package_version)
self.unzip_package(site_info['path'])
# 优化PHP
res = optimize_php().optimize_php(get)
if not res['status']:
return public.return_message(-1, 0, res)
# 初始化wp
self.init_wp(values)
self.write_db(s_id, d_id, prefix, get.user_name, get.admin_password)
# 优化mysql
optimize_db().self_db_cache(get)
# 设置fastcgi缓存
if int(get.enable_cache) == 1:
# 多服务下开启ols缓存
if public.get_multi_webservice_status() or public.get_webserver() == 'openlitespeed':
self.set_fastcgi_cache(public.to_dict_obj(
{"version": values['php_version'], "sitename": values['site_name'], "act": "enable","is_cache":"ols"}))
# 单服务下支持nginx与ols缓存
elif public.get_webserver() == 'nginx':
from wp_toolkit import wpmgr, wpfastcgi_cache
self.write_logs('|-WP Plugin nginx-helper installing...')
wpmgr(s_id).init_plugin_nginx_helper()
self.write_logs('|-WP Plugin nginx-helper installation succeeded')
# 配置Nginx-fastcgi-cache
wpfastcgi_cache().set_fastcgi(values['site_path'], values['site_name'], values['php_version'])
# if self.__IS_PRO_MEMBER:
# from wp_toolkit import wpmgr, wpfastcgi_cache
#
# # 配置Nginx-fastcgi-cache
# wpfastcgi_cache().set_fastcgi(values['site_path'], values['site_name'], values['php_version'])
#
# self.write_logs('|-WP Plugin nginx-helper installing...')
# wpmgr(s_id).init_plugin_nginx_helper()
# self.write_logs('|-WP Plugin nginx-helper installation succeeded')
# else:
# # 安装nginxHelper
# # slug nginx-helper
# values['slug'] = "nginx-helper"
# values['wp_action'] = "install-plugin"
# self.install_plugin(values)
# self.act_nginx_helper_active(values)
#
# # 安装并启用nginx-helper插件
# self.set_nginx_helper(get)
# 设置登录入口保护
if int(get.get('enable_whl', 0)) == 1:
from wp_toolkit import wpmgr
# 安装并启用wps-hide-login插件
self.write_logs('|-WP Plugin wps-hide-login installing...')
wpmgr(s_id).init_plugin_wps_hide_login(get.get('whl_page', 'login'),
get.get('whl_redirect_admin', '404'))
self.write_logs('|-WP Plugin wps-hide-login installation succeeded')
# 清除本地回环
self.remove_hosts_record(values['site_name'])
public.ServiceReload()
self.write_logs("\n\n\n|-Deployment was successful!")
return public.return_message(0, 0, public.lang("Deployment was successful!"))
except Exception as e:
self.del_site(get)
from traceback import format_exc
public.print_log(format_exc())
return public.return_message(-1, 0, public.lang("Deployment failed: {}", e))
# 删除指定的域名本地回环记录
def remove_hosts_record(self, site_name):
"""
从 /etc/hosts 中删除指定的域名本地回环记录
"""
hosts_path = '/etc/hosts'
try:
if not os.path.exists(hosts_path):
return False
# 读取原始文件
content = public.readFile(hosts_path)
if not content:
return False
# 构建正则表达式:匹配 127.0.0.1 后面跟着 site_name 的整行
# \s+ 匹配空格或制表符
# ^...$ 配合 re.M 确保只匹配独立的一行
pattern = r'^127\.0\.0\.1\s+{}\s*$'.format(re.escape(site_name))
# 替换为空字符串(同时处理换行符)
new_content = re.sub(pattern, '', content, flags=re.M)
# 清理可能产生的多余空行
new_content = os.linesep.join([line for line in new_content.splitlines() if line.strip()])
# 写回文件
public.writeFile(hosts_path, new_content)
return True
except Exception as e:
return False
# 重新关联WP网站数据库
def reset_wp_db(self, args):
"""
:param args db_name 数据库名
:param args site_id 网站ID
"""
db_name = public.xssencode2(args.db_name)
try:
site_id = int(args.site_id)
except:
return public.return_message(-1, 0, public.lang("Site ID must be numeric"))
db_info = public.M("databases").where("name=?", (db_name,)).field('id').find()
if 'id' not in db_info:
return public.return_message(-1, 0, public.lang("This database was not found!"))
pdata = {
"d_id": db_info['id']
}
public.M('wordpress_onekey').where("s_id=?", (site_id,)).update(pdata)
return public.return_message(0, 0, public.lang("Setup successfully!"))
# 获取WP Toolkit配置信息
def get_wp_configurations(self, args: public.dict_obj):
# 校验参数
try:
args.validate([
Param('s_id').Require().Integer('>', 0),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
from wp_toolkit import wpmgr
wpmgr_obj = wpmgr(args.s_id)
wp_local_version = wpmgr_obj.get_local_version()
wp_latest_version = wpmgr_obj.get_latest_version(available=True).get('version', '')
can_upgrade = wp_latest_version > wp_local_version
wp_toolkit_config_data = wpmgr_obj.get_wp_toolkit_config_data()
if not wp_toolkit_config_data.get('status', True):
return public.fail_v2(public.lang('Failed to obtain the configuration information of WP Toolkit'))
type_ = query_wpsite_type(args.s_id)[0]
# 添加维护模式状态
wp_path = wpmgr_obj.retrieve_wp_root_path()
if os.path.exists(os.path.join(wp_path, '.maintenance')):
wp_toolkit_config_data['maintenance_mode'] = True
return public.success_v2({
'local_version': wp_local_version,
'latest_version': wp_latest_version,
'can_upgrade': can_upgrade,
'language': wp_toolkit_config_data['locale'],
'login_url': wp_toolkit_config_data['login_url'],
'site_url': wp_toolkit_config_data['site_url'],
'cache_enabled': self.get_cache_status(args.s_id),
'admin_user': wp_toolkit_config_data['admin_info']['user_login'],
'admin_email': wp_toolkit_config_data['admin_info']['user_email'],
'whl_enabled': wp_toolkit_config_data['whl_config'].get('activated', False),
'whl_page': wp_toolkit_config_data['whl_config'].get('whl_page', 'login'),
'whl_redirect_admin': wp_toolkit_config_data['whl_config'].get('whl_redirect_admin', '404'),
'wp_title': wp_toolkit_config_data.get('wp_title', 'Acquisition failed, MySQL error occurred'),
'wp_home': wp_toolkit_config_data.get('wp_home', 'Acquisition failed, MySQL error occurred'),
'site_type': type_.get("site_type",''),
'maintenance' : wp_toolkit_config_data.get('maintenance_mode', False),
})
# 保存WP Toolkit配置
def save_wp_configurations(self, args: public.dict_obj):
# 校验参数
try:
args.validate([
Param('s_id').Require().Integer('>', 0),
Param('language').String('in', list(self.get_language(args)['message'].keys())),
Param('admin_password').String('>=', 8),
Param('admin_email').Email(),
Param('whl_enabled').Integer('in', [0, 1]),
Param('whl_page').SafePath(),
Param('whl_redirect_admin').SafePath(),
Param('wp_title').String(),
Param('wp_home').String(),
Param('site_url').String(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
from wp_toolkit import wpmgr
wpmgr_obj = wpmgr(args.s_id)
site_path = wpmgr_obj.retrieve_wp_root_path()
# 检测是否开启维护模式
is_maintenance = False
maintenance_file = os.path.join(site_path, '.maintenance')
if os.path.exists(maintenance_file):
os.rename(maintenance_file, maintenance_file + '.bak.bak')
is_maintenance = True
try:
# 获取当前网站的配置信息
wp_title, wp_home, wp_site_url = wpmgr_obj.get_db_info()
configs = {}
# 更新网站标题
if 'wp_title' in args and args.get('wp_title', '') and args.get('wp_title', '') != wp_title:
configs['blogname'] = args.wp_title
# 更新网站首页
if 'wp_home' in args and args.get('wp_home', '') and args.get('wp_home', '') != wp_home:
if wpmgr_obj.validate_url(args.wp_home):
configs['home'] = args.wp_home
else:
raise ValueError('The homepage URL format is not supported!')
# 更新网站URL
if 'site_url' in args and args.get('site_url', '') and args.get('site_url', '') != wp_site_url:
if wpmgr_obj.validate_url(args.site_url):
configs['siteurl'] = args.site_url
else:
raise ValueError('The website URL format is not supported')
# 更新数据库信息
if configs:
ok , msg = wpmgr_obj.update_db_info(configs)
if not ok:
raise ValueError(msg)
# 写操作日志
for key, value in configs.items():
wpmgr.log_opt('Update {} from [{}] to [{}] successfully', (key, locals().get(key, ''), value))
# 更新语言
if 'language' in args:
locale = wpmgr_obj.get_local_language()
if args.language != locale:
wpmgr_obj.update_language(args.language)
# 写操作日志
wpmgr.log_opt('Change language from [{}] to [{}] successfully', (locale, args.language))
# 更新管理员密码
if 'admin_password' in args:
wpmgr_obj.set_admin_password(args.admin_password)
# 写操作日志
wpmgr.log_opt('Reset admin password successfully')
# 更新管理员邮箱
if 'admin_email' in args:
wpmgr_obj.set_admin_email(args.admin_email)
# 写操作日志
wpmgr.log_opt('Reset admin email to [{}] successfully', (args.admin_email,))
# 更新WPS-Hide-Login插件配置
if 'whl_enabled' in args:
# 停用插件
if int(args.whl_enabled) == 0:
wpmgr_obj.deactivate_plugins('wps-hide-login/wps-hide-login.php')
# 写操作日志
wpmgr.log_opt('Deactivate plugin [{}] successfully', ('WPS Hide Login',))
# 启用插件
else:
wpmgr_obj.config_plugin_wps_hide_login(args.get('whl_page', 'login'),args.get('whl_redirect_admin', '404'))
# 写操作日志
wpmgr.log_opt('Activate plugin [{}] successfully', ('WPS Hide Login',))
return public.success_v2('Update successfully')
except Exception as e:
return public.return_message(-1, 0, public.lang('Failed to save configuration: {}', str(e)))
finally:
if is_maintenance:
if os.path.exists(maintenance_file + '.bak.bak'):
os.rename(maintenance_file + '.bak.bak', maintenance_file)
##############################对外接口-END##############################
class optimize_php:
def optimize_php(self, get):
get.version = get.php_version
# 安装缓存插件
# self.install_ext(get)
# 根据主机性能调整参数
return self.php_fpm(get)
def install_ext(self, get):
exts = ['opcache']
import files
mfile = files.files()
for ext in exts:
# print("开始安装php扩展 [{}]...".format(ext))
if ext == 'pathinfo':
import config
con = config.config()
get.version = get.php_version
get.type = 'on'
con.setPathInfo(get)
else:
get.name = ext
get.version = get.php_version
get.type = '1'
mfile.InstallSoft(get)
# 优化phpfpm
def php_fpm(self, get):
one_key_wp().write_logs("|-Start tuning PHP FPM parameters...")
mem_total = int(get_mem())
if mem_total <= 1024:
get.max_children = '30'
get.start_servers = '5'
get.min_spare_servers = '5'
get.max_spare_servers = '20'
elif 1024 < mem_total <= 2048:
get.max_children = '50'
get.start_servers = '5'
get.min_spare_servers = '5'
get.max_spare_servers = '30'
elif 2048 < mem_total <= 4098:
get.max_children = '80'
get.start_servers = '10'
get.min_spare_servers = '10'
get.max_spare_servers = '30'
elif 4098 < mem_total <= 8096:
get.max_children = '120'
get.start_servers = '10'
get.min_spare_servers = '10'
get.max_spare_servers = '30'
elif 8096 < mem_total <= 16192:
get.max_children = '200'
get.start_servers = '15'
get.min_spare_servers = '15'
get.max_spare_servers = '50'
elif 16192 < mem_total <= 32384:
get.max_children = '300'
get.start_servers = '20'
get.min_spare_servers = '20'
get.max_spare_servers = '50'
elif 32384 < mem_total:
get.max_children = '500'
get.start_servers = '20'
get.min_spare_servers = '20'
get.max_spare_servers = '50'
# get.version = self.version
import config
current_conf = config.config().getFpmConfig(get)
get.pm = current_conf['pm']
get.listen = current_conf['unix']
one_key_wp().write_logs("""
===================PHP FPM parameters=======================
max_children: {}
start_servers: {}
min_spare_servers: {}
max_spare_servers: {}
Running mode: {}
Connection: {}
===================PHP FPM parameters=======================
""".format(get.max_children, get.start_servers, get.min_spare_servers, get.max_spare_servers, get.pm, get.listen))
# self.backup_conf('/www/server/php/{}/etc/php-fpm.conf'.format(self.version))
result = config.config().setFpmConfig(get)
if not result['status']:
one_key_wp().write_logs("|-PHP FPM Optimization failed: {}".format(result))
return public.return_msg_gettext(False, "PHP FPM Optimization failed: {}", (result,))
one_key_wp().write_logs("|-PHP FPM optimization succeeded")
return public.return_msg_gettext(True, public.lang("PHP FPM optimization succeeded"))
class optimize_db:
def self_db_cache(self, get):
one_key_wp().write_logs("|-Start optimizing Mysql")
mem_total = int(get_mem())
if mem_total <= 2048:
get.key_buffer_size = '128'
get.tmp_table_size = '64'
get.innodb_buffer_pool_size = '256'
get.innodb_log_buffer_size = '16'
get.sort_buffer_size = '768'
get.read_buffer_size = '768'
get.read_rnd_buffer_size = '512'
get.join_buffer_size = '1024'
get.thread_stack = '256'
get.binlog_cache_size = '64'
get.thread_cache_size = '64'
get.table_open_cache = '128'
get.max_connections = '100'
get.max_heap_table_size = '64'
elif 2048 < mem_total <= 4096:
get.key_buffer_size = '256'
get.tmp_table_size = '384'
get.innodb_buffer_pool_size = '384'
get.innodb_log_buffer_size = '16'
get.sort_buffer_size = '768'
get.read_buffer_size = '768'
get.read_rnd_buffer_size = '512'
get.join_buffer_size = '2048'
get.thread_stack = '256'
get.binlog_cache_size = '64'
get.thread_cache_size = '96'
get.table_open_cache = '192'
get.max_connections = '200'
get.max_heap_table_size = '384'
elif 4096 < mem_total <= 8192:
get.key_buffer_size = '384'
get.tmp_table_size = '512'
get.innodb_buffer_pool_size = '512'
get.innodb_log_buffer_size = '16'
get.sort_buffer_size = '1024'
get.read_buffer_size = '1024'
get.read_rnd_buffer_size = '768'
get.join_buffer_size = '2048'
get.thread_stack = '256'
get.binlog_cache_size = '128'
get.thread_cache_size = '128'
get.table_open_cache = '384'
get.max_connections = '300'
get.max_heap_table_size = '512'
elif 8192 < mem_total <= 16384:
get.key_buffer_size = '512'
get.tmp_table_size = '1024'
get.innodb_buffer_pool_size = '1024'
get.innodb_log_buffer_size = '16'
get.sort_buffer_size = '2048'
get.read_buffer_size = '2048'
get.read_rnd_buffer_size = '1024'
get.join_buffer_size = '4096'
get.thread_stack = '384'
get.binlog_cache_size = '192'
get.thread_cache_size = '192'
get.table_open_cache = '1024'
get.max_connections = '400'
get.max_heap_table_size = '1024'
elif 16384 < mem_total <= 32768:
get.key_buffer_size = '1024'
get.tmp_table_size = '2048'
get.innodb_buffer_pool_size = '4096'
get.innodb_log_buffer_size = '16'
get.sort_buffer_size = '4096'
get.read_buffer_size = '4096'
get.read_rnd_buffer_size = '2048'
get.join_buffer_size = '8192'
get.thread_stack = '512'
get.binlog_cache_size = '256'
get.thread_cache_size = '256'
get.table_open_cache = '2048'
get.max_connections = '500'
get.max_heap_table_size = '2048'
elif 32768 < mem_total:
get.key_buffer_size = '2048'
get.tmp_table_size = '4096'
get.innodb_buffer_pool_size = '8192'
get.innodb_log_buffer_size = '16'
get.sort_buffer_size = '8192'
get.read_buffer_size = '8192'
get.read_rnd_buffer_size = '4096'
get.join_buffer_size = '16384'
get.thread_stack = '1024'
get.binlog_cache_size = '512'
get.thread_cache_size = '512'
get.table_open_cache = '2048'
get.max_connections = '1000'
get.max_heap_table_size = '4096'
one_key_wp().write_logs("""
=====================Mysql parameters=======================
key_buffer_size: {}
tmp_table_size: {}
innodb_buffer_pool_size: {}
innodb_log_buffer_size: {}
sort_buffer_size: {}
read_buffer_size: {}
read_rnd_buffer_size: {}
join_buffer_size: {}
thread_stack: {}
binlog_cache_size: {}
thread_cache_size: {}
table_open_cache: {}
max_connections: {}
max_heap_table_size: {}
=====================Mysql parameters=======================
""".format(get.key_buffer_size, get.tmp_table_size, get.innodb_buffer_pool_size,
get.innodb_log_buffer_size, get.sort_buffer_size, get.read_buffer_size, get.read_rnd_buffer_size,
get.join_buffer_size, get.thread_stack, get.binlog_cache_size, get.thread_cache_size, get.table_open_cache,
get.max_connections, get.max_heap_table_size))
import database
result = database.database().SetDbConf(get)
if not result['status']:
one_key_wp().write_logs("|-Mysql optimization failed {}".format(result))
return public.return_msg_gettext(False, "Mysql optimization failed {}", (result,))
public.ExecShell("/etc/init.d/mysqld restart")
one_key_wp().write_logs("|-Mysql optimization succeeded")
return public.return_msg_gettext(True, public.lang("Mysql optimization succeeded"))
# Nginx缓存加速WP站点
class fast_cgi:
def get_fastcgi_conf(self, version):
conf = r"""
set $skip_cache 0;
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location ~ (/[^/]+\.php)(/|$) {
if ( !-f $document_root$1 ) {
return 404;
}
# try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-%s.sock;
fastcgi_index index.php;
include fastcgi.conf;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache "$upstream_cache_status From $host";
fastcgi_cache WORDPRESS;
add_header Cache-Control max-age=0;
add_header Nginx-Cache "$upstream_cache_status";
add_header Last-Modified $date_gmt;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
etag on;
fastcgi_cache_valid 200 301 302 1d;
}
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
""" % version
return conf
def get_fast_cgi_status(self, sitename, php_v):
if public.get_webserver() != "nginx":
return False
conf_path = "/www/server/panel/vhost/nginx/{}.conf".format(sitename)
if not os.path.exists(conf_path):
return False
content = public.readFile(conf_path)
fastcgi_conf = "include enable-php-{}-wpfastcgi.conf;".format(php_v)
# return conf_path,fastcgi_conf
if fastcgi_conf in content:
return True
return False
def set_nginx_conf(self):
if not os.path.exists("/dev/shm/nginx-cache/wp"):
os.makedirs("/dev/shm/nginx-cache/wp")
one_key_wp().set_permission("/dev/shm/nginx-cache")
conf = """
#YAKPANEL_FASTCGI_CONF_BEGIN
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_path /dev/shm/nginx-cache/wp levels=1:2 keys_zone=WORDPRESS:100m inactive=60m max_size=1g;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
#YAKPANEL_FASTCGI_CONF_END
"""
conf_path = "/www/server/nginx/conf/nginx.conf"
public.back_file(conf_path)
content = public.readFile(conf_path)
if not content:
return
if "#YAKPANEL_FASTCGI_CONF_BEGIN" in content:
one_key_wp().write_logs("|-Nginx FastCgi cache configuration already exists")
print("Nginx FastCgi cache configuration already exists")
return public.return_msg_gettext(True, public.lang("Nginx FastCgi cache configuration already exists"))
rep = "http\\s*\n\\s*{"
content = re.sub(rep, "http\n\t{" + conf, content)
public.writeFile(conf_path, content)
# 如果配置出错恢复
conf_pass = public.checkWebConfig()
if conf_pass != True:
public.restore_file(conf_path)
one_key_wp().write_logs("|-Nginx FastCgi configuration error! {}".format(conf_pass))
print("Nginx FastCgi configuration error! {}".format(conf_pass))
return public.return_msg_gettext(False, public.lang("Nginx FastCgi configuration error!"))
one_key_wp().write_logs("|-Nginx FastCgi cache configuration complete...")
print("Nginx FastCgi cache configuration complete")
return public.return_msg_gettext(True, public.lang("Nginx FastCgi cache configuration complete"))
def set_nginx_init(self):
# if not os.path.exists("/dev/shm/nginx-cache/wp"):
# os.makedirs("/dev/shm/nginx-cache/wp")
# one_key_wp().set_permission("/dev/shm/nginx-cache")
conf2 = """
#YAKPANEL_FASTCGI_CONF_BEGIN
mkdir -p /dev/shm/nginx-cache/wp
#YAKPANEL_FASTCGI_CONF_END
"""
init_path = "/etc/init.d/nginx"
public.back_file(init_path)
content_init = public.readFile(init_path)
if not content_init:
return
if "#YAKPANEL_FASTCGI_CONF_BEGIN" in content_init:
one_key_wp().write_logs("|-Nginx init FastCgi cache configuration already exists")
print("Nginx init FastCgi cache configuration already exists")
return public.return_msg_gettext(True, public.lang("Nginx init FastCgi cache configuration already exists"))
# content_init = re.sub(r"\$NGINX_BIN -c \$CONFIGFILE", + conf2, content_init)
rep2 = r"\$NGINX_BIN -c \$CONFIGFILE"
content_init = re.sub(rep2, conf2 + " $NGINX_BIN -c $CONFIGFILE", content_init)
public.writeFile(init_path, content_init)
# 如果配置出错恢复
public.ExecShell("/etc/init.d/nginx restart")
conf_pass = public.is_nginx_process_exists()
if conf_pass == False:
public.restore_file(init_path)
one_key_wp().write_logs("|-Nginx init FastCgi configuration error! {}".format(conf_pass))
print("Nginx init FastCgi configuration error! {}".format(conf_pass))
return public.return_msg_gettext(False, public.lang("Nginx init FastCgi configuration error!"))
one_key_wp().write_logs("|-Nginx init FastCgi cache configuration complete...")
print("Nginx init FastCgi cache configuration complete")
return public.return_msg_gettext(True, public.lang("Nginx init FastCgi cache configuration complete"))
def set_fastcgi_php_conf(self, version):
conf_path = "/www/server/nginx/conf/enable-php-{}-wpfastcgi.conf".format(version)
if os.path.exists(conf_path):
one_key_wp().write_logs("|-Nginx FastCgi PHP configuration already exists...")
print("Nginx FastCgi PHP configuration already exists")
return True
public.writeFile(conf_path, self.get_fastcgi_conf(version))
def set_website_conf(self, version, sitename, act=None):
conf_path = "/www/server/panel/vhost/nginx/{}.conf".format(sitename)
public.back_file(conf_path)
conf = public.readFile(conf_path)
if not conf:
print("Website configuration file does not exist {}".format(conf_path))
one_key_wp().write_logs("|-Website configuration file does not exist: {}".format(conf_path))
return public.return_message(-1, 0, False)
if act == 'disable':
fastcgi_conf = "include enable-php-{}-wpfastcgi.conf;".format(version)
if fastcgi_conf not in conf:
print("FastCgi configuration does not exist in website configuration")
one_key_wp().write_logs("|-FastCgi configuration does not exist in website configuration, skip")
return public.return_message(-1, 0, public.lang("FastCgi configuration does not exist in website configuration"))
rep = r"include\s+enable-php-{}-wpfastcgi.conf;".format(version)
conf = re.sub(rep, "include enable-php-{}.conf;".format(version), conf)
else:
fastcgi_conf = "include enable-php-{}-wpfastcgi.conf;".format(version)
if fastcgi_conf in conf:
one_key_wp().write_logs(
"|-The FastCgi configuration already exists in the website configuration, skip it")
return public.return_message(0, 0, public.lang("The FastCgi configuration already exists in the website configuration"))
rep = r"include\s+enable-php-{}.conf;".format(version)
one_key_wp().write_logs("|-Current configuration: {}".format(conf))
one_key_wp().write_logs("|-Regular expression: {}".format(rep))
conf = re.sub(rep, fastcgi_conf, conf)
one_key_wp().write_logs("|-Modified configuration: {}".format(conf))
public.writeFile(conf_path, conf)
conf_pass = public.checkWebConfig()
if conf_pass != True:
public.restore_file(conf_path)
print("Website FastCgi configuration error {}".format(conf_pass))
one_key_wp().write_logs("|-Website FastCgi configuration error: {}", (conf_pass,))
return public.return_message(-1, 0, public.lang("Website FastCgi configuration error"))
print("Website FastCgi configuration complete")
one_key_wp().write_logs("|-Website FastCgi configuration complete...")
return public.return_message(0, 0, public.lang("Website FastCgi configuration complete"))
def set_fastcgi(self, values):
"""
get.version
get.name
"""
# 设置nginx启动文件
self.set_nginx_init()
# 设置nginx全局配置
self.set_nginx_conf()
# 设置fastcgi location
self.set_fastcgi_php_conf(values['php_version'])
# 设置网站配置文件
self.set_website_conf(values['php_version'], values['site_name'])
# 设置wp的变量用于nginxhelper插件清理缓存
self.set_wp_nginx_helper(values['site_path'])
# 设置userini允许访问 /dev/shm/nginx-cache/wp 目录
self.set_userini(values['site_path'])
def set_wp_nginx_helper(self, site_path):
cache_conf = """
#YAKPANEL_FASTCGICACHE_BEGIN
define('RT_WP_NGINX_HELPER_CACHE_PATH','/dev/shm/nginx-cache/wp');
#YAKPANEL_FASTCGICACHE_END
"""
conf_file = "{}/wp-config.php".format(site_path)
conf = public.readFile(conf_file)
if not conf:
print("Wordpress configuration file does not exist: {}".format(conf_file))
one_key_wp().write_logs("|-Wordpress configuration file does not exist: {}".format(conf_file))
return public.return_msg_gettext(False, "Wordpress configuration file does not exist: {}", (conf_file,))
if re.search(r'''define\(\s*'RT_WP_NGINX_HELPER_CACHE_PATH'\s*,''', conf):
# if "RT_WP_NGINX_HELPER_CACHE_PATH" in conf:
one_key_wp().write_logs("|-Cache cleaning configuration already exists, skip")
print("Cache cleaning configuration already exists")
return
conf = conf.replace("<?php", "<?php" + cache_conf)
public.writeFile(conf_file, conf)
def set_userini(self, site_path):
conf_file = "{}/.user.ini".format(site_path)
conf = public.readFile(conf_file)
if not conf:
print("Anti-cross-site configuration file does not exist: {}".format(conf_file))
one_key_wp().write_logs("|-Anti-cross-site configuration file does not exist: {}".format(conf_file))
return public.return_msg_gettext(False, "Anti-cross-site configuration file does not exist: {}",
(conf_file,))
if "/dev/shm/nginx-cache/wp" in conf:
print("Anti-cross-site configuration is successful")
one_key_wp().write_logs("|-Anti-cross-site configuration is successful...")
return
public.ExecShell('chattr -i {}'.format(conf_file))
conf += ":/dev/shm/nginx-cache/wp"
public.writeFile(conf_file, conf)
public.ExecShell('chattr +i {}'.format(conf_file))
one_key_wp().write_logs("|-Anti-cross-site configuration is successful...")
# one_key_wp请求帮助函数
def retry(func, max_retries=10):
retry_count = 0
while retry_count < max_retries:
try:
return func() # 调用传入的函数并返回结果
except Exception as e:
retry_count += 1
if retry_count < max_retries:
public.print_log("Access failed {} times{}".format(retry_count, e))
time.sleep(2) # 添加适当的延迟
else:
public.print_log("The maximum number of retries has been reached.")
return False
return None
# 查询网站类型
def query_wpsite_type(site_id=None):
try:
ok , msg = checklist_fields()
if not ok:
return public.return_message(-1, 0, msg)
data = []
if site_id:
data = public.M("wordpress_onekey").field("site_type").where("s_id=?", (site_id,)).select()
else:
data = public.M("wordpress_onekey").field("id,s_id,site_type").order("id asc").select()
return data
except Exception as e:
return []
# 检查wordpress_onekey表是否存在分类字段,以及类型表是否存在
def checklist_fields() -> (bool, str):
import sqlite3
try:
conn = sqlite3.connect('/www/server/panel/data/default.db')
cursor = conn.cursor()
# 获取wordpress_onekey表的结构信息
cursor.execute("PRAGMA table_info(wordpress_onekey)")
columns = cursor.fetchall()
# 检查是否存在site_type字段
has_site_type = any(column[1] == 'site_type' for column in columns)
if not has_site_type:
# 添加site_type字段类型为TEXT
cursor.execute("ALTER TABLE wordpress_onekey ADD COLUMN site_type TEXT DEFAULT 'Default category'")
conn.commit()
# 检查wp_site_types表是否存在
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='wp_site_types'")
site_types_table_exists = cursor.fetchone() is not None
if not site_types_table_exists:
# 创建wp_site_types表
cursor.execute('''
CREATE TABLE wp_site_types (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
ps TEXT
)
''')
# 插入默认类型
cursor.executemany("INSERT INTO wp_site_types (name) VALUES (?)", [("Default category",)])
conn.commit()
return True, "Table structure is valid and updated successfully!"
except sqlite3.Error as e:
return False, str(e)