From 03327a549fc4396ca1badabb9ea535ef8ae24709 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Tue, 1 Oct 2024 04:08:12 +0800 Subject: [PATCH] init pgadmin --- plugins/pgadmin/conf/pgadmin.conf | 38 +++ plugins/pgadmin/ico.png | Bin 0 -> 78998 bytes plugins/pgadmin/index.html | 24 ++ plugins/pgadmin/index.py | 532 ++++++++++++++++++++++++++++++++++++++ plugins/pgadmin/info.json | 15 ++ plugins/pgadmin/install.sh | 71 +++++ plugins/pgadmin/js/pgadmin.js | 182 +++++++++++++ 7 files changed, 862 insertions(+) create mode 100755 plugins/pgadmin/conf/pgadmin.conf create mode 100644 plugins/pgadmin/ico.png create mode 100755 plugins/pgadmin/index.html create mode 100755 plugins/pgadmin/index.py create mode 100755 plugins/pgadmin/info.json create mode 100755 plugins/pgadmin/install.sh create mode 100755 plugins/pgadmin/js/pgadmin.js diff --git a/plugins/pgadmin/conf/pgadmin.conf b/plugins/pgadmin/conf/pgadmin.conf new file mode 100755 index 000000000..beb50059f --- /dev/null +++ b/plugins/pgadmin/conf/pgadmin.conf @@ -0,0 +1,38 @@ +server +{ + listen 888; + server_name 127.0.0.1; + index index.html index.htm index.php; + root {$SERVER_PATH}/pgadmin; + + #error_page 404 /404.html; + include {$PHP_CONF_PATH}/enable-php-{$PHP_VER}.conf; + + #AUTH_START + auth_basic "Authorization"; + auth_basic_user_file {$SERVER_PATH}/pgadmin/pma.pass; + #AUTH_END + + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ + { + expires 30d; + } + + location ~ .*\.(js|css)?$ + { + expires 12h; + } + + location ~ /.*\.(log|pass|json|pl)$ { + deny all; + } + + + location ~ /\. + { + deny all; + } + + access_log {$SERVER_PATH}/pgadmin/access.log; + error_log {$SERVER_PATH}/pgadmin/error.log; +} \ No newline at end of file diff --git a/plugins/pgadmin/ico.png b/plugins/pgadmin/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..7749e148d29e3f1bfd2b20866ee54cfbd50e059b GIT binary patch literal 78998 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 literal 0 HcmV?d00001 diff --git a/plugins/pgadmin/index.html b/plugins/pgadmin/index.html new file mode 100755 index 000000000..33b62d980 --- /dev/null +++ b/plugins/pgadmin/index.html @@ -0,0 +1,24 @@ +
+
+
+

服务

+

重写模版

+

主页

+

PHP版本

+

安全设置

+

访问日志

+

错误日志

+

配置

+
+
+
+
+
+ +
+ \ No newline at end of file diff --git a/plugins/pgadmin/index.py b/plugins/pgadmin/index.py new file mode 100755 index 000000000..60077edcc --- /dev/null +++ b/plugins/pgadmin/index.py @@ -0,0 +1,532 @@ +# coding:utf-8 + +import sys +import io +import os +import time +import re +import json + +sys.path.append(os.getcwd() + "/class/core") +import mw +import site_api + +app_debug = False +if mw.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'pgadmin' + + +def getPluginDir(): + return mw.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return mw.getServerDir() + '/' + getPluginName() + + +def getArgs(): + args = sys.argv[2:] + tmp = {} + args_len = len(args) + + if args_len == 1: + t = args[0].strip('{').strip('}') + t = t.split(':') + tmp[t[0]] = t[1] + elif args_len > 1: + for i in range(len(args)): + t = args[i].split(':') + tmp[t[0]] = t[1] + + return tmp + + +def checkArgs(data, ck=[]): + for i in range(len(ck)): + if not ck[i] in data: + return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) + return (True, mw.returnJson(True, 'ok')) + + +def getConf(): + return mw.getServerDir() + '/web_conf/nginx/vhost/phpmyadmin.conf' + + +def getConfInc(): + return getServerDir() + "/" + getCfg()['path'] + '/config.inc.php' + + +def getPort(): + file = getConf() + content = mw.readFile(file) + rep = 'listen\s*(.*);' + tmp = re.search(rep, content) + return tmp.groups()[0].strip() + + +def getHomePage(): + try: + port = getPort() + ip = '127.0.0.1' + if not mw.isAppleSystem(): + ip = mw.getLocalIp() + + cfg = getCfg() + auth = cfg['username']+':'+cfg['password'] + rand_path = cfg['path'] + url = 'http://' + auth + '@' + ip + ':' + port + '/' + rand_path + '/index.php' + return mw.returnJson(True, 'OK', url) + except Exception as e: + return mw.returnJson(False, '插件未启动!') + + +def getPhpVer(expect=55): + v = site_api.site_api().getPhpVersion() + is_find = False + for i in range(len(v)): + t = str(v[i]['version']) + if (t == expect): + is_find = True + return str(t) + if not is_find: + if len(v) > 1: + return v[1]['version'] + return v[0]['version'] + return str(expect) + + +def getCachePhpVer(): + cacheFile = getServerDir() + '/php.pl' + v = '' + if os.path.exists(cacheFile): + v = mw.readFile(cacheFile) + else: + v = getPhpVer() + mw.writeFile(cacheFile, v) + return v + + +def contentReplace(content): + service_path = mw.getServerDir() + php_ver = getCachePhpVer() + tmp = mw.execShell( + 'cat /dev/urandom | head -n 32 | md5sum | head -c 16') + blowfish_secret = tmp[0].strip() + # print php_ver + php_conf_dir = mw.getServerDir() + '/web_conf/php/conf' + content = content.replace('{$ROOT_PATH}', mw.getRootDir()) + content = content.replace('{$SERVER_PATH}', service_path) + content = content.replace('{$PHP_CONF_PATH}', php_conf_dir) + content = content.replace('{$PHP_VER}', php_ver) + content = content.replace('{$BLOWFISH_SECRET}', blowfish_secret) + + cfg = getCfg() + + if cfg['choose'] == "mysql": + content = content.replace('{$CHOOSE_DB}', 'mysql') + content = content.replace('{$CHOOSE_DB_DIR}', 'mysql') + elif cfg['choose'] == "mysql-apt": + content = content.replace('{$CHOOSE_DB}', 'mysql') + content = content.replace('{$CHOOSE_DB_DIR}', 'mysql-apt') + elif cfg['choose'] == "mysql-yum": + content = content.replace('{$CHOOSE_DB}', 'mysql') + content = content.replace('{$CHOOSE_DB_DIR}', 'mysql-yum') + else: + content = content.replace('{$CHOOSE_DB}', 'MariaDB') + content = content.replace('{$CHOOSE_DB_DIR}', 'mariadb') + + content = content.replace('{$PMA_PATH}', cfg['path']) + + port = cfg["port"] + rep = 'listen\s*(.*);' + content = re.sub(rep, "listen " + port + ';', content) + return content + + +def initCfg(): + cfg = getServerDir() + "/cfg.json" + if not os.path.exists(cfg): + data = {} + data['port'] = '888' + data['choose'] = 'mysql' + data['path'] = '' + data['username'] = 'admin' + data['password'] = 'admin' + mw.writeFile(cfg, json.dumps(data)) + + +def setCfg(key, val): + cfg = getServerDir() + "/cfg.json" + data = mw.readFile(cfg) + data = json.loads(data) + data[key] = val + mw.writeFile(cfg, json.dumps(data)) + + +def getCfg(): + cfg = getServerDir() + "/cfg.json" + data = mw.readFile(cfg) + data = json.loads(data) + return data + + +def returnCfg(): + cfg = getServerDir() + "/cfg.json" + data = mw.readFile(cfg) + return data + + +def status(): + conf = getConf() + conf_inc = getServerDir() + "/" + getCfg()["path"] + '/config.inc.php' + # 两个文件都在,才算启动成功 + if os.path.exists(conf) and os.path.exists(conf_inc): + return 'start' + return 'stop' + + +def __release_port(port): + from collections import namedtuple + try: + import firewall_api + firewall_api.firewall_api().addAcceptPortArgs(port, 'phpMyAdmin默认端口', 'port') + return port + except Exception as e: + return "Release failed {}".format(e) + + +def __delete_port(port): + from collections import namedtuple + try: + import firewall_api + firewall_api.firewall_api().delAcceptPortArgs(port, 'tcp') + return port + except Exception as e: + return "Release failed {}".format(e) + + +def openPort(): + conf = getCfg() + port = conf['port'] + for i in [port]: + __release_port(i) + return True + + +def delPort(): + conf = getCfg() + port = conf['port'] + for i in [port]: + __delete_port(i) + return True + + +def start(): + initCfg() + openPort() + + pma_dir = getServerDir() + "/phpmyadmin" + if os.path.exists(pma_dir): + rand_str = mw.getRandomString(6) + rand_str = rand_str.lower() + pma_dir_dst = pma_dir + "_" + rand_str + mw.execShell("mv " + pma_dir + " " + pma_dir_dst) + setCfg('path', 'phpmyadmin_' + rand_str) + + file_tpl = getPluginDir() + '/conf/phpmyadmin.conf' + file_run = getConf() + if not os.path.exists(file_run): + centent = mw.readFile(file_tpl) + centent = contentReplace(centent) + mw.writeFile(file_run, centent) + + pma_path = getServerDir() + '/pma.pass' + if not os.path.exists(pma_path): + username = mw.getRandomString(8) + password = mw.getRandomString(10) + pass_cmd = username + ':' + mw.hasPwd(password) + setCfg('username', username) + setCfg('password', password) + mw.writeFile(pma_path, pass_cmd) + + tmp = getServerDir() + "/" + getCfg()["path"] + '/tmp' + if not os.path.exists(tmp): + os.mkdir(tmp) + mw.execShell("chown -R www:www " + tmp) + + conf_run = getServerDir() + "/" + getCfg()["path"] + '/config.inc.php' + if not os.path.exists(conf_run): + conf_tpl = getPluginDir() + '/conf/config.inc.php' + centent = mw.readFile(conf_tpl) + centent = contentReplace(centent) + mw.writeFile(conf_run, centent) + + log_a = accessLog() + log_e = errorLog() + + for i in [log_a, log_e]: + if os.path.exists(i): + cmd = "echo '' > " + i + mw.execShell(cmd) + + mw.restartWeb() + return 'ok' + + +def stop(): + conf = getConf() + if os.path.exists(conf): + os.remove(conf) + delPort() + mw.restartWeb() + return 'ok' + + +def restart(): + return start() + + +def reload(): + file_tpl = getPluginDir() + '/conf/phpmyadmin.conf' + file_run = getConf() + if os.path.exists(file_run): + centent = mw.readFile(file_tpl) + centent = contentReplace(centent) + mw.writeFile(file_run, centent) + return start() + + +def setPhpVer(): + args = getArgs() + + if not 'phpver' in args: + return 'phpver missing' + + cacheFile = getServerDir() + '/php.pl' + mw.writeFile(cacheFile, args['phpver']) + + file_tpl = getPluginDir() + '/conf/phpmyadmin.conf' + file_run = getConf() + + content = mw.readFile(file_tpl) + content = contentReplace(content) + mw.writeFile(file_run, content) + + mw.restartWeb() + return 'ok' + + +def getSetPhpVer(): + cacheFile = getServerDir() + '/php.pl' + if os.path.exists(cacheFile): + return mw.readFile(cacheFile).strip() + return '' + + +def getPmaOption(): + data = getCfg() + return mw.returnJson(True, 'ok', data) + + +def getPmaPort(): + try: + port = getPort() + return mw.returnJson(True, 'OK', port) + except Exception as e: + # print(e) + return mw.returnJson(False, '插件未启动!') + + +def setPmaPort(): + args = getArgs() + data = checkArgs(args, ['port']) + if not data[0]: + return data[1] + + port = args['port'] + if port == '80': + return mw.returnJson(False, '80端不能使用!') + + file = getConf() + if not os.path.exists(file): + return mw.returnJson(False, '插件未启动!') + content = mw.readFile(file) + rep = r'listen\s*(.*);' + content = re.sub(rep, "listen " + port + ';', content) + mw.writeFile(file, content) + + setCfg("port", port) + mw.restartWeb() + return mw.returnJson(True, '修改成功!') + + +def setPmaChoose(): + args = getArgs() + data = checkArgs(args, ['choose']) + if not data[0]: + return data[1] + + choose = args['choose'] + setCfg('choose', choose) + + pma_path = getCfg()['path'] + conf_run = getServerDir() + "/" + pma_path + '/config.inc.php' + + conf_tpl = getPluginDir() + '/conf/config.inc.php' + content = mw.readFile(conf_tpl) + content = contentReplace(content) + mw.writeFile(conf_run, content) + + mw.restartWeb() + return mw.returnJson(True, '修改成功!') + + +def setPmaUsername(): + args = getArgs() + data = checkArgs(args, ['username']) + if not data[0]: + return data[1] + + username = args['username'] + setCfg('username', username) + + cfg = getCfg() + pma_path = getServerDir() + '/pma.pass' + username = mw.getRandomString(10) + pass_cmd = cfg['username'] + ':' + mw.hasPwd(cfg['password']) + mw.writeFile(pma_path, pass_cmd) + + mw.restartWeb() + return mw.returnJson(True, '修改成功!') + + +def setPmaPassword(): + args = getArgs() + data = checkArgs(args, ['password']) + if not data[0]: + return data[1] + + password = args['password'] + setCfg('password', password) + + cfg = getCfg() + pma_path = getServerDir() + '/pma.pass' + username = mw.getRandomString(10) + pass_cmd = cfg['username'] + ':' + mw.hasPwd(cfg['password']) + mw.writeFile(pma_path, pass_cmd) + + mw.restartWeb() + return mw.returnJson(True, '修改成功!') + + +def setPmaPath(): + args = getArgs() + data = checkArgs(args, ['path']) + if not data[0]: + return data[1] + + path = args['path'] + + if len(path) < 5: + return mw.returnJson(False, '不能小于5位!') + + old_path = getServerDir() + "/" + getCfg()['path'] + new_path = getServerDir() + "/" + path + + mw.execShell("mv " + old_path + " " + new_path) + setCfg('path', path) + return mw.returnJson(True, '修改成功!') + + +def accessLog(): + return getServerDir() + '/access.log' + + +def errorLog(): + return getServerDir() + '/error.log' + + +def installVersion(): + return mw.readFile(getServerDir() + '/version.pl') + +def pluginsDbSupport(): + data = {} + + data['installed'] = 'no' + install_path = getServerDir() + if not os.path.exists(install_path): + return mw.returnJson(True, 'ok', data) + + data['installed'] = 'ok' + data['status'] = status() + if (data['status'] == 'stop'): + return mw.returnJson(True, 'ok', data) + + data['cfg'] = getCfg() + port = getPort() + ip = '127.0.0.1' + if not mw.isAppleSystem(): + ip = mw.getLocalIp() + + cfg = data['cfg'] + auth = cfg['username']+':'+cfg['password'] + rand_path = cfg['path'] + home_page = 'http://' + auth + '@' + ip + ':' + port + '/' + rand_path + '/index.php' + + data['home_page'] = home_page + data['version'] = installVersion().strip() + + return mw.returnJson(True, 'ok', data) + +if __name__ == "__main__": + func = sys.argv[1] + if func == 'status': + print(status()) + elif func == 'start': + print(start()) + elif func == 'stop': + print(stop()) + elif func == 'restart': + print(restart()) + elif func == 'reload': + print(reload()) + elif func == 'conf': + print(getConf()) + elif func == 'version': + print(installVersion()) + elif func == 'get_cfg': + print(returnCfg()) + elif func == 'config_inc': + print(getConfInc()) + elif func == 'get_home_page': + print(getHomePage()) + elif func == 'set_php_ver': + print(setPhpVer()) + elif func == 'get_set_php_ver': + print(getSetPhpVer()) + elif func == 'get_pma_port': + print(getPmaPort()) + elif func == 'set_pma_port': + print(setPmaPort()) + elif func == 'get_pma_option': + print(getPmaOption()) + elif func == 'set_pma_choose': + print(setPmaChoose()) + elif func == 'set_pma_username': + print(setPmaUsername()) + elif func == 'set_pma_password': + print(setPmaPassword()) + elif func == 'set_pma_path': + print(setPmaPath()) + elif func == 'access_log': + print(accessLog()) + elif func == 'error_log': + print(errorLog()) + elif func == 'plugins_db_support': + print(pluginsDbSupport()) + else: + print('error') diff --git a/plugins/pgadmin/info.json b/plugins/pgadmin/info.json new file mode 100755 index 000000000..a6bc53e04 --- /dev/null +++ b/plugins/pgadmin/info.json @@ -0,0 +1,15 @@ +{ + "title":"pgadmin", + "tip":"soft", + "name":"pgadmin", + "type":"运行环境", + "ps":"全能Postgres数据库通用Web工具[潜龙勿用]", + "versions":["4"], + "shell":"install.sh", + "checks":"server/pgadmin", + "path": "server/pgadmin", + "author":"pgadmin", + "home":"https://www.pgadmin.org/", + "date":"2024-10-1", + "pid": "2" +} \ No newline at end of file diff --git a/plugins/pgadmin/install.sh b/plugins/pgadmin/install.sh new file mode 100755 index 000000000..3b6a6b2f7 --- /dev/null +++ b/plugins/pgadmin/install.sh @@ -0,0 +1,71 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin +export PATH + +curPath=`pwd` +rootPath=$(dirname "$curPath") +rootPath=$(dirname "$rootPath") +serverPath=$(dirname "$rootPath") + +install_tmp=${rootPath}/tmp/mw_install.pl + +if [ "$sys_os" == "Darwin" ];then + BAK='_bak' +else + BAK='' +fi + +sysName=`uname` +echo "use system: ${sysName}" + +if [ "${sysName}" == "Darwin" ]; then + OSNAME='macos' +elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then + OSNAME='centos' +elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then + OSNAME='fedora' +elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then + OSNAME='debian' +elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then + OSNAME='ubuntu' +elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then + OSNAME='raspbian' +else + OSNAME='unknow' +fi + +# if [ -f ${rootPath}/bin/activate ];then +# source ${rootPath}/bin/activate +# fi + +Install_pgadmin() +{ + if [ -d $serverPath/pgadmin ];then + exit 0 + fi + + mkdir -p ${serverPath}/pgadmin + echo "${1}" > ${serverPath}/pgadmin/version.pl + + VER=$1 + + echo '安装完成' + + cd ${rootPath} && python3 ${rootPath}/plugins/pgadmin/index.py start + +} + +Uninstall_pgadmin() +{ + cd ${rootPath} && python3 ${rootPath}/plugins/pgadmin/index.py stop + + rm -rf ${serverPath}/pgadmin + echo '卸载完成' +} + +action=$1 +if [ "${1}" == 'install' ];then + Install_pgadmin $2 +else + Uninstall_pgadmin $2 +fi diff --git a/plugins/pgadmin/js/pgadmin.js b/plugins/pgadmin/js/pgadmin.js new file mode 100755 index 000000000..4e64eeb0d --- /dev/null +++ b/plugins/pgadmin/js/pgadmin.js @@ -0,0 +1,182 @@ +function str2Obj(str){ + var data = {}; + kv = str.split('&'); + for(i in kv){ + v = kv[i].split('='); + data[v[0]] = v[1]; + } + return data; +} + +function pmaPost(method,args,callback){ + + var _args = null; + if (typeof(args) == 'string'){ + _args = JSON.stringify(str2Obj(args)); + } else { + _args = JSON.stringify(args); + } + + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + $.post('/plugins/run', {name:'phpmyadmin', func:method, args:_args}, function(data) { + layer.close(loadT); + if (!data.status){ + layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + + +function pmaAsyncPost(method,args){ + + var _args = null; + if (typeof(args) == 'string'){ + _args = JSON.stringify(str2Obj(args)); + } else { + _args = JSON.stringify(args); + } + return syncPost('/plugins/run', {name:'phpmyadmin', func:method, args:_args}); +} + +function homePage(){ + pmaPost('get_home_page', '', function(data){ + var rdata = $.parseJSON(data.data); + if (!rdata.status){ + layer.msg(rdata.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + var con = ''; + $(".soft-man-con").html(con); + }); +} + +//phpmyadmin切换php版本 +function phpVer(version) { + + var _version = pmaAsyncPost('get_set_php_ver','') + if (_version['data'] != ''){ + version = _version['data']; + } + + $.post('/site/get_php_version', function(rdata) { + // console.log(rdata); + var body = "
PHP版本
'; + $(".soft-man-con").html(body); + },'json'); +} + +function phpVerChange(type, msg) { + var phpver = $("#phpver").val(); + pmaPost('set_php_ver', 'phpver='+phpver, function(data){ + if ( data.data == 'ok' ){ + layer.msg('设置成功!',{icon:1,time:2000,shade: [0.3, '#000']}); + } else { + layer.msg('设置失败!',{icon:2,time:2000,shade: [0.3, '#000']}); + } + }); +} + + +//phpmyadmin安全设置 +function safeConf() { + pmaPost('get_pma_option', {}, function(rdata){ + var rdata = $.parseJSON(rdata.data); + if (!rdata.status){ + layer.msg(rdata.msg,{icon:2,time:2000,shade: [0.3, '#000']}); + return; + } + + var cfg = rdata.data; + var con = '
\ + 访问端口\ + \ + \ +
\ +
\ + 访问切换\ + \ + \ +
\ +
\ + 用户名\ + \ + \ +
\ +
\ + 密码\ + \ + \ +
\ +
\ +
\ + 路径名\ + \ + \ +
'; + $(".soft-man-con").html(con); + }); +} + + +function setPmaChoose(){ + var choose = $("#access_choose").val(); + pmaPost('set_pma_choose',{'choose':choose}, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + }); +} + +function setPmaUsername(){ + var username = $("input[name=username]").val(); + pmaPost('set_pma_username',{'username':username}, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + }); +} + +function setPmaPassword(){ + var password = $("input[name=password]").val(); + pmaPost('set_pma_password',{'password':password}, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + }); +} + +function setPmaPath(){ + var path = $("input[name=path]").val(); + pmaPost('set_pma_path',{'path':path}, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + }); +} + +//修改phpmyadmin端口 +function setPamPort() { + var pmport = $("#pmport").val(); + if (pmport < 80 || pmport > 65535) { + layer.msg('端口范围不合法!', { icon: 2 }); + return; + } + var data = 'port=' + pmport; + + pmaPost('set_pma_port',data, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + }); +} \ No newline at end of file