From 3a8c93b59555806eaec57a1b285e467e642bac7e Mon Sep 17 00:00:00 2001 From: midoks Date: Mon, 23 Oct 2023 17:37:44 +0800 Subject: [PATCH] update --- plugins/php/index_php.py | 380 +++++++++++++++++++++++++++++++++++++++ plugins/php/js/php.js | 2 + 2 files changed, 382 insertions(+) create mode 100755 plugins/php/index_php.py diff --git a/plugins/php/index_php.py b/plugins/php/index_php.py new file mode 100755 index 000000000..82e7e7d33 --- /dev/null +++ b/plugins/php/index_php.py @@ -0,0 +1,380 @@ +# coding:utf-8 + +import sys +import io +import os +import time +import re +import json +import shutil + +# reload(sys) +# sys.setdefaultencoding('utf8') + +sys.path.append(os.getcwd() + "/class/core") +import mw + +if mw.isAppleSystem(): + cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\'' + info = mw.execShell(cmd) + p = "/usr/local/lib/" + info[0].strip() + "/site-packages" + sys.path.append(p) + +app_debug = False +if mw.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'php' + + +def getPluginDir(): + return mw.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return mw.getServerDir() + '/' + getPluginName() + + +def getInitDFile(version): + current_os = mw.getOs() + if current_os == 'darwin': + return '/tmp/' + getPluginName() + + if current_os.startswith('freebsd'): + return '/etc/rc.d/' + getPluginName() + return '/etc/init.d/' + getPluginName() + version + + +def getConf(version): + path = getServerDir() + '/' + version + '/etc/php.ini' + return path + + +def getFpmConfFile(version): + return getServerDir() + '/' + version + '/etc/php-fpm.d/www.conf' + + +def status_progress(version): + # ps -ef|grep 'php/81' |grep -v grep | grep -v python | awk '{print $2} + cmd = "ps aux|grep 'php/" + version + \ + "' |grep -v grep | grep -v python | awk '{print $2}'" + data = mw.execShell(cmd) + if data[0] == '': + return 'stop' + return 'start' + + +def getPhpSocket(version): + path = getFpmConfFile(version) + content = mw.readFile(path) + rep = 'listen\s*=\s*(.*)' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + + +def status(version): + ''' + sock文件判断是否启动 + ''' + sock = getPhpSocket(version) + if sock.find(':'): + return status_progress(version) + + if not os.path.exists(sock): + return 'stop' + return 'start' + + +def contentReplace(content, version): + service_path = mw.getServerDir() + content = content.replace('{$ROOT_PATH}', mw.getRootDir()) + content = content.replace('{$SERVER_PATH}', service_path) + content = content.replace('{$PHP_VERSION}', version) + content = content.replace('{$LOCAL_IP}', mw.getLocalIp()) + content = content.replace('{$SSL_CRT}', mw.getSslCrt()) + + if mw.isAppleSystem(): + # user = mw.execShell( + # "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip() + content = content.replace('{$PHP_USER}', 'nobody') + content = content.replace('{$PHP_GROUP}', 'nobody') + + rep = 'listen.owner\s*=\s*(.+)\r?\n' + val = ';listen.owner = nobody\n' + content = re.sub(rep, val, content) + + rep = 'listen.group\s*=\s*(.+)\r?\n' + val = ';listen.group = nobody\n' + content = re.sub(rep, val, content) + + rep = 'user\s*=\s*(.+)\r?\n' + val = ';user = nobody\n' + content = re.sub(rep, val, content) + + rep = r'[^\.]group\s*=\s*(.+)\r?\n' + val = ';group = nobody\n' + content = re.sub(rep, val, content) + + else: + content = content.replace('{$PHP_USER}', 'www') + content = content.replace('{$PHP_GROUP}', 'www') + return content + + +def makeOpenrestyConf(): + phpversions = ['00', '52', '53', '54', '55', '56', + '70', '71', '72', '73', '74', '80', '81', '82', '83'] + + sdir = mw.getServerDir() + + dst_dir = sdir + '/web_conf/php' + dst_dir_conf = sdir + '/web_conf/php/conf' + if not os.path.exists(dst_dir): + mw.execShell('mkdir -p ' + dst_dir) + + if not os.path.exists(dst_dir_conf): + mw.execShell('mkdir -p ' + dst_dir_conf) + + d_pathinfo = sdir + '/web_conf/php/pathinfo.conf' + if not os.path.exists(d_pathinfo): + s_pathinfo = getPluginDir() + '/conf/pathinfo.conf' + shutil.copyfile(s_pathinfo, d_pathinfo) + + info = getPluginDir() + '/info.json' + content = mw.readFile(info) + content = json.loads(content) + versions = content['versions'] + tpl = getPluginDir() + '/conf/enable-php.conf' + tpl_content = mw.readFile(tpl) + for x in phpversions: + dfile = sdir + '/web_conf/php/conf/enable-php-' + x + '.conf' + if not os.path.exists(dfile): + if x == '00': + mw.writeFile(dfile, 'set $PHP_ENV 0;') + else: + w_content = contentReplace(tpl_content, x) + mw.writeFile(dfile, w_content) + + # php-fpm status + # for version in phpversions: + # dfile = sdir + '/web_conf/php/status/phpfpm_status_' + version + '.conf' + # tpl = getPluginDir() + '/conf/phpfpm_status.conf' + # if not os.path.exists(dfile): + # content = mw.readFile(tpl) + # content = contentReplace(content, version) + # mw.writeFile(dfile, content) + + +def phpPrependFile(version): + app_start = getServerDir() + '/app_start.php' + if not os.path.exists(app_start): + tpl = getPluginDir() + '/conf/app_start.php' + content = mw.readFile(tpl) + content = contentReplace(content, version) + mw.writeFile(app_start, content) + + +def phpFpmReplace(version): + desc_php_fpm = getServerDir() + '/' + version + '/etc/php-fpm.conf' + if not os.path.exists(desc_php_fpm): + tpl_php_fpm = getPluginDir() + '/conf/php-fpm.conf' + content = mw.readFile(tpl_php_fpm) + content = contentReplace(content, version) + mw.writeFile(desc_php_fpm, content) + else: + if version == '52': + tpl_php_fpm = tpl_php_fpm = getPluginDir() + '/conf/php-fpm-52.conf' + content = mw.readFile(tpl_php_fpm) + mw.writeFile(desc_php_fpm, content) + + +def phpFpmWwwReplace(version): + service_php_fpm_dir = getServerDir() + '/' + version + '/etc/php-fpm.d/' + + if not os.path.exists(service_php_fpm_dir): + os.mkdir(service_php_fpm_dir) + + service_php_fpmwww = service_php_fpm_dir + '/www.conf' + if not os.path.exists(service_php_fpmwww): + tpl_php_fpmwww = getPluginDir() + '/conf/www.conf' + content = mw.readFile(tpl_php_fpmwww) + content = contentReplace(content, version) + mw.writeFile(service_php_fpmwww, content) + + +def makePhpIni(version): + dst_ini = getConf(version) + if not os.path.exists(dst_ini): + src_ini = getPluginDir() + '/conf/php' + version[0:1] + '.ini' + # shutil.copyfile(s_ini, d_ini) + content = mw.readFile(src_ini) + if version == '52': + content = content + "auto_prepend_file=/www/server/php/app_start.php" + + content = contentReplace(content, version) + mw.writeFile(dst_ini, content) + + +def initReplace(version): + makeOpenrestyConf() + makePhpIni(version) + + initD_path = getServerDir() + '/init.d' + if not os.path.exists(initD_path): + os.mkdir(initD_path) + + file_bin = initD_path + '/php' + version + if not os.path.exists(file_bin): + file_tpl = getPluginDir() + '/init.d/php.tpl' + + if version == '52': + file_tpl = getPluginDir() + '/init.d/php52.tpl' + + content = mw.readFile(file_tpl) + content = contentReplace(content, version) + + mw.writeFile(file_bin, content) + mw.execShell('chmod +x ' + file_bin) + + phpPrependFile(version) + phpFpmWwwReplace(version) + phpFpmReplace(version) + + session_path = getServerDir() + '/tmp/session' + if not os.path.exists(session_path): + mw.execShell('mkdir -p ' + session_path) + mw.execShell('chown -R www:www ' + session_path) + + upload_path = getServerDir() + '/tmp/upload' + if not os.path.exists(upload_path): + mw.execShell('mkdir -p ' + upload_path) + mw.execShell('chown -R www:www ' + upload_path) + + # systemd + systemDir = mw.systemdCfgDir() + systemService = systemDir + '/php' + version + '.service' + + if os.path.exists(systemDir) and not os.path.exists(systemService): + systemServiceTpl = getPluginDir() + '/init.d/php.service.tpl' + if version == '52': + systemServiceTpl = getPluginDir() + '/init.d/php.service.52.tpl' + service_path = mw.getServerDir() + se_content = mw.readFile(systemServiceTpl) + se_content = se_content.replace('{$VERSION}', version) + se_content = se_content.replace('{$SERVER_PATH}', service_path) + mw.writeFile(systemService, se_content) + mw.execShell('systemctl daemon-reload') + + return file_bin + + +def phpOp(version, method): + file = initReplace(version) + + current_os = mw.getOs() + if current_os == "darwin": + data = mw.execShell(file + ' ' + method) + if data[1] == '': + return 'ok' + return data[1] + + if current_os.startswith("freebsd"): + data = mw.execShell('service php' + version + ' ' + method) + if data[1] == '': + return 'ok' + return data[1] + + if method == 'stop' or method == 'restart': + mw.execShell(file + ' ' + 'stop') + + data = mw.execShell('systemctl ' + method + ' php' + version) + if data[1] == '': + return 'ok' + return data[1] + + +def start(version): + mw.execShell( + 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/www/server/lib/icu/lib') + return phpOp(version, 'start') + + +def stop(version): + status = phpOp(version, 'stop') + + if version == '52': + file = initReplace(version) + data = mw.execShell(file + ' ' + 'stop') + if data[1] == '': + return 'ok' + return status + + +def restart(version): + return phpOp(version, 'restart') + + +def reload(version): + if version == '52': + return phpOp(version, 'restart') + return phpOp(version, 'reload') + + +def getPhpinfo(version): + stat = status(version) + if stat == 'stop': + return 'PHP[' + version + ']未启动,不可访问!!!' + + sock_file = getFpmAddress(version) + root_dir = mw.getRootDir() + '/phpinfo' + + mw.execShell("rm -rf " + root_dir) + mw.execShell("mkdir -p " + root_dir) + mw.writeFile(root_dir + '/phpinfo.php', '') + sock_data = mw.requestFcgiPHP(sock_file, '/phpinfo.php', root_dir) + os.system("rm -rf " + root_dir) + phpinfo = str(sock_data, encoding='utf-8') + return phpinfo + + +def libConfCommon(version): + fname = getConf(version) + if not os.path.exists(fname): + return mw.returnJson(False, '指定PHP版本不存在!') + + phpini = mw.readFile(fname) + + libpath = getPluginDir() + '/versions/phplib.conf' + phplib = json.loads(mw.readFile(libpath)) + + libs = [] + tasks = mw.M('tasks').where( + "status!=?", ('1',)).field('status,name').select() + for lib in phplib: + lib['task'] = '1' + for task in tasks: + tmp = mw.getStrBetween('[', ']', task['name']) + if not tmp: + continue + tmp1 = tmp.split('-') + if tmp1[0].lower() == lib['name'].lower(): + lib['task'] = task['status'] + lib['phpversions'] = [] + lib['phpversions'].append(tmp1[1]) + if phpini.find(lib['check']) == -1: + lib['status'] = False + else: + lib['status'] = True + libs.append(lib) + return libs + + +def get_php_info(args): + return getPhpinfo(args['version']) + + +def get_lib_conf(data): + libs = libConfCommon(data['version']) + return mw.returnData(True, 'OK!', libs) diff --git a/plugins/php/js/php.js b/plugins/php/js/php.js index 6460bd474..adcc7230a 100755 --- a/plugins/php/js/php.js +++ b/plugins/php/js/php.js @@ -32,7 +32,9 @@ function phpPostCallbak(method, version, args,callback){ var req_data = {}; req_data['name'] = 'php'; req_data['func'] = method; + req_data['script']='index_php'; args['version'] = version; + if (typeof(args) == 'string' && args == ''){ req_data['args'] = JSON.stringify(toArrayObject(args));