From a80d666786573d3e37c78044cf40941e599def46 Mon Sep 17 00:00:00 2001 From: midoks Date: Mon, 24 Jul 2023 23:52:38 +0800 Subject: [PATCH 01/42] update --- plugins/tgbot/startup/extend/init_cmd.py | 2 +- plugins/tgbot/startup/extend/receive_faq.py | 30 +++++++++------------ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/plugins/tgbot/startup/extend/init_cmd.py b/plugins/tgbot/startup/extend/init_cmd.py index 26958d6fa..d291118af 100644 --- a/plugins/tgbot/startup/extend/init_cmd.py +++ b/plugins/tgbot/startup/extend/init_cmd.py @@ -22,6 +22,6 @@ def init(bot): bot.set_my_commands( commands=[ telebot.types.BotCommand("start", "查看帮助信息"), - telebot.types.BotCommand("faq", "查看bbs帖子主题【不要忘记:冒号】"), + telebot.types.BotCommand("?:", "查看bbs帖子主题【不要忘记:冒号】"), ], ) diff --git a/plugins/tgbot/startup/extend/receive_faq.py b/plugins/tgbot/startup/extend/receive_faq.py index 0a9e7ab23..6b619af86 100644 --- a/plugins/tgbot/startup/extend/receive_faq.py +++ b/plugins/tgbot/startup/extend/receive_faq.py @@ -189,26 +189,22 @@ def run(bot, message): return bot # print(text_body) - if isThisCmd('/faq:', text_body): - cmd_text = getReadCmd('/faq:', text_body) + if isThisCmd('/?:', text_body): + cmd_text = getReadCmd('/?:', text_body) return searchFaq(bot, message, cmd_text) - # if isThisCmd('/debug', text_body): - # cmd_text = getReadCmd('/debug', text_body) - # return searchDebug(bot, message, cmd_text) + # if text_body.find('?') > -1 or text_body.find('?') > -1: + # return_msg = "你似乎在寻找【" + text_body + "】答案:\n" + # return_msg += "/faq:开始寻找你的问题\n" + # keyboard = [ + # [ + # types.InlineKeyboardButton( + # text="如未找到,可以在论坛补充你的提问!", url='https://bbs.midoks.me'), + # ] - if text_body.find('?') > -1 or text_body.find('?') > -1: - return_msg = "你似乎在寻找【" + text_body + "】答案:\n" - return_msg += "/faq:开始寻找你的问题\n" - keyboard = [ - [ - types.InlineKeyboardButton( - text="如未找到,可以在论坛补充你的提问!", url='https://bbs.midoks.me'), - ] - - ] - markup = types.InlineKeyboardMarkup(keyboard) - bot.reply_to(message, return_msg, reply_markup=markup) + # ] + # markup = types.InlineKeyboardMarkup(keyboard) + # bot.reply_to(message, return_msg, reply_markup=markup) return bot From f7873b6dcdcf3d96ef395972912291a602fa5749 Mon Sep 17 00:00:00 2001 From: midoks Date: Tue, 25 Jul 2023 00:03:20 +0800 Subject: [PATCH 02/42] Update init_cmd.py --- plugins/tgbot/startup/extend/init_cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tgbot/startup/extend/init_cmd.py b/plugins/tgbot/startup/extend/init_cmd.py index d291118af..b5192f95c 100644 --- a/plugins/tgbot/startup/extend/init_cmd.py +++ b/plugins/tgbot/startup/extend/init_cmd.py @@ -22,6 +22,6 @@ def init(bot): bot.set_my_commands( commands=[ telebot.types.BotCommand("start", "查看帮助信息"), - telebot.types.BotCommand("?:", "查看bbs帖子主题【不要忘记:冒号】"), + telebot.types.BotCommand("faq", "查看bbs帖子主题【?:】"), ], ) From 4329b90ac4380de24ade584b902ea5ad42d440bb Mon Sep 17 00:00:00 2001 From: midoks Date: Tue, 1 Aug 2023 23:58:10 +0800 Subject: [PATCH 03/42] Update info.json --- plugins/openresty/info.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/openresty/info.json b/plugins/openresty/info.json index b57d285c4..88c959b98 100755 --- a/plugins/openresty/info.json +++ b/plugins/openresty/info.json @@ -12,6 +12,6 @@ "home":"http://openresty.org", "date":"2017-11-24", "pid": "1", - "versions": ["1.17.8.2","1.19.3.1","1.21.4.1"], - "updates": ["1.17.8.2","1.19.3.1","1.21.4.1"] + "versions": ["1.17.8.2","1.19.3.1","1.21.4.2"], + "updates": ["1.17.8.2","1.19.3.1","1.21.4.2"] } \ No newline at end of file From 5044cc5db9e085e14b189c13960cb8deaba8dabb Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 00:06:51 +0800 Subject: [PATCH 04/42] Update README.md --- README.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 216375f9d..2c4b9f611 100644 --- a/README.md +++ b/README.md @@ -100,17 +100,10 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: ``` -### 版本更新 0.15.1 +### 版本更新 0.15.2 + +* OpenResty升级到1.21.4.2 -* 升级功能优化。 -* 域名伪静态保存优化。 -* 自动同步gitee。 -* nezha保存优化。 -* OP防火墙优化(站点配置-状态关闭后,不再防御)-已安装的,需要重载。 -* 修复子目录绑定-伪静态问题。 -* [插件]docker - 添加IP地址池。 -* PHP下载中国优化。 -* 监控页面-自定义时间优化。 ### JSDelivr安装地址 From f04c70f022b8124286bb3830d1008495f8b00953 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 14:04:00 +0800 Subject: [PATCH 05/42] =?UTF-8?q?=E8=AE=A1=E5=88=92=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=84=9A=E6=9C=AC=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + class/core/crontab_api.py | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c4b9f611..445ac2e81 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: ### 版本更新 0.15.2 * OpenResty升级到1.21.4.2 +* 计划任务自动脚本运行时间 ### JSDelivr安装地址 diff --git a/class/core/crontab_api.py b/class/core/crontab_api.py index b74a51dcc..c225fc8b4 100755 --- a/class/core/crontab_api.py +++ b/class/core/crontab_api.py @@ -510,6 +510,19 @@ class crontab_api: source_bin_activate = ''' export LANG=en_US.UTF-8 +SCRIPT_RUN_TIME="0s" +MW_ToSeconds() +{ + SEC=$1 + if [ $SEC -lt 60 ]; then + SCRIPT_RUN_TIME="${SEC}s" + elif [ $SEC -ge 60 ] && [ $SEC -lt 3600 ];then + SCRIPT_RUN_TIME="$(( SEC / 60 ))m$(( SEC % 60 ))s" + elif [ $SEC -ge 3600 ]; then + SCRIPT_RUN_TIME="$(( SEC / 3600 ))h$(( (SEC % 3600) / 60 ))m$(( (SEC % 3600) % 60 ))s" + fi +} +START_MW_SHELL_TIME=`date +%s` MW_PATH=%s/bin/activate if [ -f $MW_PATH ];then source $MW_PATH @@ -557,7 +570,10 @@ fi''' % (mw.getRunDir(),) shell += ''' echo "----------------------------------------------------------------------------" endDate=`date +"%Y-%m-%d %H:%M:%S"` -echo "★[$endDate] Successful" +END_MW_SHELL_TIME=`date +%s` +((SHELL_COS_TIME=(${END_MW_SHELL_TIME}-${START_MW_SHELL_TIME}))) +MW_ToSeconds $SHELL_COS_TIME +echo "★[$endDate] Successful | Script Run [$SCRIPT_RUN_TIME] " echo "----------------------------------------------------------------------------" ''' cronPath = mw.getServerDir() + '/cron' From 1f7bd76875783ade9086349498d942dea3fef5c4 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 14:27:04 +0800 Subject: [PATCH 06/42] Update crontab_api.py --- class/core/crontab_api.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/class/core/crontab_api.py b/class/core/crontab_api.py index c225fc8b4..facaaba1c 100755 --- a/class/core/crontab_api.py +++ b/class/core/crontab_api.py @@ -508,8 +508,7 @@ class crontab_api: else: head = "#!/bin/bash\nPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin\nexport PATH\n" - source_bin_activate = ''' -export LANG=en_US.UTF-8 + start_head = ''' SCRIPT_RUN_TIME="0s" MW_ToSeconds() { @@ -523,12 +522,16 @@ MW_ToSeconds() fi } START_MW_SHELL_TIME=`date +%s` +''' + + source_bin_activate = ''' +export LANG=en_US.UTF-8 MW_PATH=%s/bin/activate if [ -f $MW_PATH ];then source $MW_PATH fi''' % (mw.getRunDir(),) - head = head + source_bin_activate + "\n" + head = head + start_head + source_bin_activate + "\n" log = '.log' script_dir = mw.getRunDir() + "/scripts" @@ -570,8 +573,8 @@ fi''' % (mw.getRunDir(),) shell += ''' echo "----------------------------------------------------------------------------" endDate=`date +"%Y-%m-%d %H:%M:%S"` -END_MW_SHELL_TIME=`date +%s` -((SHELL_COS_TIME=(${END_MW_SHELL_TIME}-${START_MW_SHELL_TIME}))) +END_MW_SHELL_TIME=`date +"%s"` +((SHELL_COS_TIME=($END_MW_SHELL_TIME-$START_MW_SHELL_TIME))) MW_ToSeconds $SHELL_COS_TIME echo "★[$endDate] Successful | Script Run [$SCRIPT_RUN_TIME] " echo "----------------------------------------------------------------------------" From 47d240e2b819c003d8c92de0757ccddf7163c5cd Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 15:10:23 +0800 Subject: [PATCH 07/42] =?UTF-8?q?rsyncd=E6=B7=BB=E5=8A=A0=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/rsyncd/index.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/rsyncd/index.py b/plugins/rsyncd/index.py index 6a723152b..6018d984a 100755 --- a/plugins/rsyncd/index.py +++ b/plugins/rsyncd/index.py @@ -782,20 +782,20 @@ def lsyncdAdd(): info['rsync'] = rsync - if not 'exclude' in info: - info["exclude"] = [ - "/**.upload.tmp", - "**/*.log", - "**/*.tmp", - "**/*.temp", - ".git", - ".gitignore", - ".user.ini", - ] - data = getDefaultConf() + slist = data['send']["list"] res = lsyncdListFindName(slist, info['name']) + + if not 'exclude' in info: + if res[0]: + info["exclude"] = slist[res[1]]['exclude'] + else: + info["exclude"] = [ + "/**.upload.tmp", "**/*.log", "**/*.tmp", + "**/*.temp", ".git", ".gitignore", ".user.ini", + ] + if res[0]: list_index = res[1] slist[list_index] = info From 677ff8ec0c31368e7b2cbc8b15b5832c5e2baf99 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 15:10:42 +0800 Subject: [PATCH 08/42] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 445ac2e81..1c20e1600 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: * OpenResty升级到1.21.4.2 * 计划任务自动脚本运行时间 +* rsyncd添加优化 ### JSDelivr安装地址 From 8976a7a14757395f19f1ea82af8c275b48504b55 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 15:26:55 +0800 Subject: [PATCH 09/42] Update rsyncd.js --- plugins/rsyncd/js/rsyncd.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/rsyncd/js/rsyncd.js b/plugins/rsyncd/js/rsyncd.js index eb0c1c68c..1fb3a85c1 100755 --- a/plugins/rsyncd/js/rsyncd.js +++ b/plugins/rsyncd/js/rsyncd.js @@ -492,7 +492,7 @@ function lsyncdSend(){ con += '
\ \ - \ + \
'; con += '
'; @@ -532,7 +532,7 @@ function lsyncdSend(){ '' + ''; + list += ''; + list += ''; + list += ''; + list += ''; + list += ''; + list += ''; + list += ''; + } + + $('#con_list tbody').html(list); + }); +} + +function dockerImageOutput(){ + var con = '
\ + \ + \ +
\ +
\ +
' + period +'\ 同步\ - | 日志\ + | 手动日志\ | 过滤器\ | 编辑\ | 删除\ From ddd9e70ac2195bb7052f2dfd52b06abed7acc7d9 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 15:29:32 +0800 Subject: [PATCH 10/42] Update rsyncd.js --- plugins/rsyncd/js/rsyncd.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/rsyncd/js/rsyncd.js b/plugins/rsyncd/js/rsyncd.js index 1fb3a85c1..8faa6a355 100755 --- a/plugins/rsyncd/js/rsyncd.js +++ b/plugins/rsyncd/js/rsyncd.js @@ -562,7 +562,7 @@ function rsyncdConf(){ } function rsyncdLog(){ - pluginStandAloneLogs("rsyncd","","run_log"); + pluginRollingLogs("rsyncd","","run_log"); } From af03c004a3bf54984e0bf9115b9fe030dee1ac0a Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 15:35:30 +0800 Subject: [PATCH 11/42] Update rsyncd.js --- plugins/rsyncd/js/rsyncd.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/rsyncd/js/rsyncd.js b/plugins/rsyncd/js/rsyncd.js index 8faa6a355..bbfc1115d 100755 --- a/plugins/rsyncd/js/rsyncd.js +++ b/plugins/rsyncd/js/rsyncd.js @@ -476,7 +476,7 @@ function lsyncdExclude(name){ } function lsyncdConfLog(){ - pluginStandAloneLogs("rsyncd","","lsyncd_conf_log");; + pluginRollingLogs("rsyncd","","lsyncd_conf_log");; } function lsyncdSend(){ From 73d9edced8b077511073d74045a41c783c42dd24 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 17:36:27 +0800 Subject: [PATCH 12/42] =?UTF-8?q?=E4=BD=BF=E7=94=A8mariadb=E4=BA=8C?= =?UTF-8?q?=E8=BF=9B=E5=88=B6=E5=AF=BC=E5=85=A5=E5=A4=87=E4=BB=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/mariadb/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mariadb/index.py b/plugins/mariadb/index.py index 023465d6e..3e62144b3 100755 --- a/plugins/mariadb/index.py +++ b/plugins/mariadb/index.py @@ -739,7 +739,7 @@ def importDbBackup(): pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') sock = getSocketFile() - mysql_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \ + mysql_cmd = getServerDir() + '/bin/mariadb -S ' + sock + ' -uroot -p' + pwd + \ ' ' + name + ' < ' + file_path_sql # print(mysql_cmd) From ea982b72611693f2ac68c499e76f40c4b43e8369 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 17:50:22 +0800 Subject: [PATCH 13/42] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c20e1600..6c5d54ce0 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: * OpenResty升级到1.21.4.2 * 计划任务自动脚本运行时间 * rsyncd添加优化 - +* 使用mariadb二进制导入备份文件 ### JSDelivr安装地址 From 38722c1dc2ad2c8ef8e9cded33d2c50c0bd0fd10 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 17:51:29 +0800 Subject: [PATCH 14/42] Update index.py --- plugins/mariadb/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mariadb/index.py b/plugins/mariadb/index.py index 3e62144b3..9c55389d5 100755 --- a/plugins/mariadb/index.py +++ b/plugins/mariadb/index.py @@ -800,7 +800,7 @@ def importDbExternal(): sock = getSocketFile() os.environ["MYSQL_PWD"] = pwd - mysql_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + \ + mysql_cmd = getServerDir() + '/bin/mariadb -S ' + sock + ' -uroot -p' + \ pwd + ' ' + name + ' < ' + import_sql # print(mysql_cmd) From 63d17c4d770113a5ec5138621598727ebec9aba4 Mon Sep 17 00:00:00 2001 From: midoks Date: Wed, 2 Aug 2023 23:24:10 +0800 Subject: [PATCH 15/42] Update docker.js --- plugins/docker/js/docker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index 4d5cfc98c..2e978ac3e 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -523,14 +523,14 @@ function dockerPullImagesFileTemplate(){ '
'+ '镜像名:\
\ - \ + \ \
'+ '
'+ ''+ From 5f382c0034fb85e9c6cfe17604aa23c69b051bbf Mon Sep 17 00:00:00 2001 From: midoks Date: Thu, 3 Aug 2023 00:06:01 +0800 Subject: [PATCH 16/42] update --- plugins/docker/index.html | 1 + plugins/docker/js/docker.js | 64 +++++++++++++++++++++++++++++++ plugins/openresty/conf/nginx.conf | 10 +++++ 3 files changed, 75 insertions(+) diff --git a/plugins/docker/index.html b/plugins/docker/index.html index ffcf912a6..fd9647867 100755 --- a/plugins/docker/index.html +++ b/plugins/docker/index.html @@ -40,6 +40,7 @@

自启动

容器列表

镜像列表

+

镜像导出

IP地址池

仓库

diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index 2e978ac3e..8c13b551a 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -634,6 +634,70 @@ function dockerImageList(){ dockerImageListRender(); } + +function dockerImageOutputRender(){ + dPost('image_list', '', {}, function(rdata){ + var rdata = $.parseJSON(rdata.data); + // console.log(rdata); + if (!rdata.status){ + layer.msg(rdata.msg,{icon:2,time:2000}); + return; + } + + var list = ''; + var rlist = rdata.data; + + for (var i = 0; i < rlist.length; i++) { + + var tag = rlist[i]['RepoTags'].split(":")[1]; + + var license = 'null'; + var desc = 'null'; + if (rlist[i]['Labels'] == null){ + license = 'free'; + } + + var op = ''; + op += '拉取 | '; + op += '删除'; + + list += '
'+rlist[i]['RepoTags']+''+tag+''+toSize(rlist[i]['Size'])+''+license+''+desc+''+op+'
\ + \ + \ + \ + \ + \ +
名称大小时间操作
\ +
\ +
\ + \ + '; + + $(".soft-man-con").html(con); + + dockerImageOutputRender(); +} + function deleteIpList(address){ safeMessage('删除IP','你将删除从IP地址池['+address+'],确定?',function(){ dPost('docker_del_ip','', {address:address},function(rdata){ diff --git a/plugins/openresty/conf/nginx.conf b/plugins/openresty/conf/nginx.conf index 9d00028e9..0f9dc90d3 100644 --- a/plugins/openresty/conf/nginx.conf +++ b/plugins/openresty/conf/nginx.conf @@ -60,6 +60,16 @@ http limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; + proxy_buffering on; + proxy_buffer_size 4k; + proxy_buffers 512 4k; + proxy_busy_buffers_size 64k; + proxy_cache_path {$SERVER_PATH}/openresty/nginx/proxy_cache_temp levels=1:2 keys_zone=mw_cache:512m inactive=5m max_size=2g use_temp_path=off; + #proxy timeout + proxy_connect_timeout 3s; + proxy_read_timeout 5s; + proxy_send_timeout 5s; + server_tokens off; access_log off; From 5ee7df4a46504b9a71278b8b0690d7096eaf6034 Mon Sep 17 00:00:00 2001 From: midoks Date: Thu, 3 Aug 2023 00:14:16 +0800 Subject: [PATCH 17/42] Update nginx.conf --- plugins/openresty/conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/openresty/conf/nginx.conf b/plugins/openresty/conf/nginx.conf index 0f9dc90d3..83f00bc42 100644 --- a/plugins/openresty/conf/nginx.conf +++ b/plugins/openresty/conf/nginx.conf @@ -65,7 +65,7 @@ http proxy_buffers 512 4k; proxy_busy_buffers_size 64k; proxy_cache_path {$SERVER_PATH}/openresty/nginx/proxy_cache_temp levels=1:2 keys_zone=mw_cache:512m inactive=5m max_size=2g use_temp_path=off; - #proxy timeout + #proxy timeout proxy_connect_timeout 3s; proxy_read_timeout 5s; proxy_send_timeout 5s; From 02c9988ef7788c02d68c79dd04b2808e9e2fd86e Mon Sep 17 00:00:00 2001 From: midoks Date: Thu, 3 Aug 2023 00:24:13 +0800 Subject: [PATCH 18/42] Update docker.js --- plugins/docker/js/docker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index 8c13b551a..1497c8b79 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -678,7 +678,7 @@ function dockerImageOutputRender(){ function dockerImageOutput(){ var con = '
\ \ - \ + \
\
\ \ From 0a6e88d81dc1df26d812cf7e39ecc095cc16afcc Mon Sep 17 00:00:00 2001 From: midoks Date: Thu, 3 Aug 2023 17:00:12 +0800 Subject: [PATCH 19/42] update --- plugins/docker/index.py | 94 ++++++++++++++++++ plugins/docker/info.json | 2 +- plugins/docker/js/docker.js | 186 +++++++++++++++++++++++++++++++----- 3 files changed, 259 insertions(+), 23 deletions(-) diff --git a/plugins/docker/index.py b/plugins/docker/index.py index 259f008ed..aed745b22 100755 --- a/plugins/docker/index.py +++ b/plugins/docker/index.py @@ -429,6 +429,92 @@ def dockerRemoveImage(): return mw.returnJson(False, '删除失败, 当前镜像正在使用!') +def getImageListFunc(dbname=''): + bkDir = mw.getRootDir() + '/backup/docker' + blist = os.listdir(bkDir) + r = [] + + bname = 'db_' + dbname + blen = len(bname) + for x in blist: + fbstr = x[0:blen] + if fbstr == bname: + r.append(x) + return r + + +def dockerImagePickDir(): + bkDir = mw.getRootDir() + '/backup/docker' + return mw.returnJson(True, 'ok', bkDir) + + +def dockerImagePickList(): + + bkDir = mw.getRootDir() + '/backup/docker' + if not os.path.exists(bkDir): + os.mkdir(bkDir) + + r = os.listdir(bkDir) + rr = [] + for x in range(0, len(r)): + p = bkDir + '/' + r[x] + data = {} + data['name'] = r[x] + + rsize = os.path.getsize(p) + data['size'] = mw.toSize(rsize) + + t = os.path.getctime(p) + t = time.localtime(t) + + data['time'] = time.strftime('%Y-%m-%d %H:%M:%S', t) + rr.append(data) + + data['file'] = p + + return mw.returnJson(True, 'ok', rr) + + +def dockerImagePickSave(): + # image 导出 + args = getArgs() + data = checkArgs(args, ['images']) + if not data[0]: + return data[1] + + bkDir = mw.getRootDir() + '/backup/docker/' + images = args['images'] + try: + file_name = bkDir + \ + str(time.strftime('%Y%m%d_%H%M%S', time.localtime())) + '.tar.gz' + mw.execShell('docker image save %s | gzip > %s' % + (images, file_name)) + return mw.returnJson(True, '导出镜像 {} 成功!'.format(file_name)) + except docker.errors.APIError as ex: + return mw.returnJson(False, '操作失败: ' + str(ex)) + + +def dockerImagePickLoad(): + # 镜像文件导入 + args = getArgs() + data = checkArgs(args, ['file']) + if not data[0]: + return data[1] + try: + file_path = args['file'] + if not os.path.exists(file_path): + return mw.returnJson(False, '文件不存在') + if file_path.endswith('.tar'): + mw.execShell('docker image load < %s' % file_path) + elif file_path.endswith('.tar.gz'): + mw.execShell('gunzip -c %s | docker image load' % file_path) + else: + return mw.returnJson(False, '不支持改文件类型!') + return mw.returnJson(True, '导入镜像文件成功!') + except docker.errors.APIError as ex: + return mw.returnJson(False, '操作失败: ' + str(ex)) + + def dockerLoginCheck(user_name, user_pass, registry): # 登陆验证 cmd = 'docker login -u=%s -p %s %s' % (user_name, user_pass, registry) @@ -703,6 +789,14 @@ if __name__ == "__main__": print(dockerPullReg()) elif func == 'image_list': print(imageListData()) + elif func == 'image_pick_dir': + print(dockerImagePickDir()) + elif func == 'image_pick_save': + print(dockerImagePickSave()) + elif func == 'image_pick_load': + print(dockerImagePickLoad()) + elif func == 'image_pick_list': + print(dockerImagePickList()) elif func == 'docker_get_iplist': print(getDockerIpList()) elif func == 'docker_del_ip': diff --git a/plugins/docker/info.json b/plugins/docker/info.json index 26949af08..cfc02fb21 100755 --- a/plugins/docker/info.json +++ b/plugins/docker/info.json @@ -1,6 +1,6 @@ { "sort": 7, - "ps": "Docker 是一个开源的应用容器引擎(开发测试中)", + "ps": "Docker是一个开源的应用容器引擎", "name": "docker", "title": "Docker", "shell": "install.sh", diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index 1497c8b79..f764e525c 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -1,3 +1,10 @@ + +function dPostOrgin(args, callback){ + $.post('/plugins/run', args, function(data) { + callback(data); + },'json'); +} + function dPost(method, version, args,callback){ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); @@ -12,7 +19,7 @@ function dPost(method, version, args,callback){ req_data['args'] = JSON.stringify(args); } - $.post('/plugins/run', req_data, function(data) { + dPostOrgin(req_data, function(data){ layer.close(loadT); if (!data.status){ //错误展示10S @@ -23,7 +30,7 @@ function dPost(method, version, args,callback){ if(typeof(callback) == 'function'){ callback(data); } - },'json'); + }); } function dPostCallbak(method, version, args,callback){ @@ -634,13 +641,37 @@ function dockerImageList(){ dockerImageListRender(); } +//获取文件数据 +function dockerGetFileBytes(fileName){ + window.open('/files/download?filename='+encodeURIComponent(fileName)); +} + +//删除文件 +function dockerDeleteFile(fileName){ + layer.confirm(lan.get('recycle_bin_confirm',[fileName]),{title:'删除文件',closeBtn:2,icon:3},function(){ + layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']}); + $.post('/files/delete', 'path=' + encodeURIComponent(fileName), function(rdata) { + showMsg(rdata.msg,function(){ + dockerImageOutputRender(); + },{icon: rdata.status ? 1 : 2}); + },'json'); + }); +} + +function dockerLoadFile(fileName){ + dPost('image_pick_load', '', {file:fileName}, function(rdata){ + var rdata = $.parseJSON(rdata.data); + showMsg(rdata.msg,function(){ + dockerImageOutputRender(); + },{icon: rdata.status ? 1 : 2}); + }); +} function dockerImageOutputRender(){ - dPost('image_list', '', {}, function(rdata){ + dPost('image_pick_list', '', {}, function(rdata){ var rdata = $.parseJSON(rdata.data); - // console.log(rdata); if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:2000}); + layer.msg(rdata.msg,{icon:2,time:10000}); return; } @@ -649,24 +680,15 @@ function dockerImageOutputRender(){ for (var i = 0; i < rlist.length; i++) { - var tag = rlist[i]['RepoTags'].split(":")[1]; - - var license = 'null'; - var desc = 'null'; - if (rlist[i]['Labels'] == null){ - license = 'free'; - } - var op = ''; - op += '拉取 | '; - op += '删除'; + op += '下载 | '; + op += '导入 | '; + op += '删除'; list += ''; - list += ''; - list += ''; - list += ''; - list += ''; - list += ''; + list += ''; + list += ''; + list += ''; list += ''; list += ''; } @@ -675,10 +697,117 @@ function dockerImageOutputRender(){ }); } +//上传文件 +function uploadImageFiles(upload_dir){ + var image_layer = layer.open({ + type:1, + closeBtn: 1, + title:"上传导入文件["+upload_dir+']', + area: ['500px','300px'], + shadeClose:false, + content:'
\ + \ + \ + \ + \ + \ + \ + 文件编码:\ + \ + \ + \ +
    \ +
    ', + success:function(){ + $('#filesClose').click(function(){ + layer.close(image_layer); + }); + } + + }); + uploadStart(function(){ + showMsg('上传成功!', function(){ + dockerImageOutputRender(); + layer.close(image_layer); + },{icon:1,time:2000}); + }); +} + +function dockerImagePick(){ + + dPost('image_list', '', {}, function(rdata){ + var rdata = $.parseJSON(rdata.data); + var imageList = rdata.data; + // console.log(imageList); + var _tbody = ''; + for (var i = 0; i < imageList.length; i++) { + if (imageList[i] == null) { + _tbody = ''; + continue; + } + var versionData = imageList[i].RepoTags,version,reg = new RegExp('((?<=:)[0-9A-z/.-]*)$'); + version = versionData.match(reg); + _tbody += "\ + \ + \ + "; + } + + + var layerS = layer.open({ + type: 1, + title: "选择镜像", + area: '500px', + closeBtn: 2, + btn:['打包','取消'], + shadeClose: false, + content: '
    \ +
    '+rlist[i]['RepoTags']+''+tag+''+toSize(rlist[i]['Size'])+''+license+''+desc+''+rlist[i]['name']+''+rlist[i]['size']+''+rlist[i]['time']+''+op+'
    当前无镜像
    "+imageList[i].RepoTags+""+ version[0] +""+ toSize(imageList[i].Size) +"
    \ + \ + \ + \ + \ + \ + \ + '+ _tbody +'\ +
    名称版本大小
    \ +
    ', + success:function(){ + readerTableChecked(); + tableFixed('images_table'); + }, + yes:function(layers,index){ + var data = '', tit = '\xa0', + choose_num = $(".images_pull tbody [name=images]:checked").length; + for (var i = 0; i < choose_num; i++) { + if(choose_num == 0){ + layer.msg('Please choose the images which need to pack',{icon:2}); + return false; + } + data += $(".images_pull tbody [name=images]:checked").eq(i).attr('data-name'); + if(i != (choose_num-1)) data += ' '; + } + + dPost('image_pick_save', '', {images:data}, function(rdata){ + var rdata = $.parseJSON(rdata['data']); + showMsg(rdata.msg, function(){ + dockerImageOutputRender(); + layer.close(layerS); + },{icon:rdata.status?1:2,time:2000}); + }); + } + }); + }); +} + function dockerImageOutput(){ var con = '
    \ - \ - \ + \ + \
    \
    \ \ @@ -695,6 +824,19 @@ function dockerImageOutput(){ $(".soft-man-con").html(con); + + $('#btn_image_upload').click(function(){ + dPostOrgin({ + name:'docker', + func:'image_pick_dir', + version:'', + },function(rdata){ + var rdata = $.parseJSON(rdata['data']); + var upload_dir = rdata['data']; + uploadImageFiles(upload_dir); + }); + }); + dockerImageOutputRender(); } From bd431f16476a1ad3e10e4c8a9dea009eb1c1c204 Mon Sep 17 00:00:00 2001 From: midoks Date: Thu, 3 Aug 2023 18:37:14 +0800 Subject: [PATCH 20/42] =?UTF-8?q?docker=E9=98=B6=E6=AE=B5=E6=80=A7?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + plugins/docker/index.py | 41 ++ plugins/docker/js/docker.js | 746 ++++++++++++++++++------------------ 3 files changed, 422 insertions(+), 366 deletions(-) diff --git a/README.md b/README.md index 6c5d54ce0..2431b4820 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: * 计划任务自动脚本运行时间 * rsyncd添加优化 * 使用mariadb二进制导入备份文件 +* docker插件-镜像导入导出功能 ### JSDelivr安装地址 diff --git a/plugins/docker/index.py b/plugins/docker/index.py index aed745b22..e528d9ced 100755 --- a/plugins/docker/index.py +++ b/plugins/docker/index.py @@ -609,6 +609,45 @@ def __release_port(port): return "Release failed {}".format(e) +def dockerPortCheck(): + args = getArgs() + data = checkArgs(args, ['port']) + if not data[0]: + return data[1] + + port = args['port'] + is_ok = IsPortExists(port) + if is_ok: + return mw.returnJson(True, 'ok') + return mw.returnJson(False, 'fail') + + +def IsPortExists(port): + # 判断端口是否被占用 + ret = __check_dst_port(ip='localhost', port=port) + ret2 = __check_dst_port(ip='0.0.0.0', port=port) + if ret: + return ret + if not ret and ret2: + return ret2 + if not ret and not ret2: + return False + + +def __check_dst_port(ip, port, timeout=3): + # 端口检测 + import socket + ok = True + try: + s = socket.socket() + s.settimeout(timeout) + s.connect((ip, port)) + s.close() + except: + ok = False + return ok + + def dockerCreateCon(): args = getArgs() data = checkArgs(args, ['environments', 'command', @@ -809,6 +848,8 @@ if __name__ == "__main__": print(dockerCreateCon()) elif func == 'docker_remove_image': print(dockerRemoveImage()) + elif func == 'docker_port_check': + print(dockerPortCheck()) elif func == 'docker_login': print(dockerLogin()) elif func == 'docker_logout': diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index f764e525c..d2c35d6f3 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -1,47 +1,46 @@ - -function dPostOrgin(args, callback){ +function dPostOrgin(args, callback) { $.post('/plugins/run', args, function(data) { callback(data); - },'json'); + }, 'json'); } -function dPost(method, version, args,callback){ +function dPost(method, version, args, callback) { var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var req_data = {}; req_data['name'] = 'docker'; req_data['func'] = method; req_data['version'] = version; - - if (typeof(args) == 'string'){ + + if (typeof(args) == 'string') { req_data['args'] = JSON.stringify(toArrayObject(args)); } else { req_data['args'] = JSON.stringify(args); } - dPostOrgin(req_data, function(data){ + dPostOrgin(req_data, function(data) { layer.close(loadT); - if (!data.status){ + if (!data.status) { //错误展示10S - layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']}); + layer.msg(data.msg, { icon: 0, time: 2000, shade: [10, '#000'] }); return; } - if(typeof(callback) == 'function'){ + if (typeof(callback) == 'function') { callback(data); } }); } -function dPostCallbak(method, version, args,callback){ +function dPostCallbak(method, version, args, callback) { var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var req_data = {}; req_data['name'] = 'docker'; req_data['func'] = method; args['version'] = version; - - if (typeof(args) == 'string'){ + + if (typeof(args) == 'string') { req_data['args'] = JSON.stringify(toArrayObject(args)); } else { req_data['args'] = JSON.stringify(args); @@ -49,115 +48,115 @@ function dPostCallbak(method, version, args,callback){ $.post('/plugins/callback', req_data, function(data) { layer.close(loadT); - if (!data.status){ - layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + if (!data.status) { + layer.msg(data.msg, { icon: 0, time: 2000, shade: [0.3, '#000'] }); return; } - if(typeof(callback) == 'function'){ + if (typeof(callback) == 'function') { callback(data); } - },'json'); + }, 'json'); } -function logsCon(id){ - dPost('docker_con_log','',{Hostname:id},function(rdata){ +function logsCon(id) { + dPost('docker_con_log', '', { Hostname: id }, function(rdata) { var rdata = $.parseJSON(rdata.data); - if(!rdata.status) { - layer.msg(rdata.msg,{icon:2}); + if (!rdata.status) { + layer.msg(rdata.msg, { icon: 2 }); return; }; layer.open({ - type:1, - title:'Docker日志', + type: 1, + title: 'Docker日志', area: '600px', closeBtn: 2, - content:'
    ' - +'
    ' +
    +                '
    '+ (rdata.msg == '' ? 'No logs':rdata.msg) +'
    ' - +'
    ', - success:function(index,layers){ + border-radius:0px;">' + (rdata.msg == '' ? 'No logs' : rdata.msg) + '' + + '', + success: function(index, layers) { $(".crontab-log").scrollTop(1000000); } }); }); } -function deleteCon(Hostname){ +function deleteCon(Hostname) { // 删除容器 - safeMessage('删除容器 ', '删除容器 ['+Hostname+'], 确定?',function(){ - dPost('docker_remove_con','',{Hostname:Hostname},function(rdata){ + safeMessage('删除容器 ', '删除容器 [' + Hostname + '], 确定?', function() { + dPost('docker_remove_con', '', { Hostname: Hostname }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { dockerConListRender(); } - },{icon:rdata.status?1:2}); + }, { icon: rdata.status ? 1 : 2 }); }); }); } -function startCon(Hostname){ - dPost('docker_run_con','',{Hostname:Hostname},function(rdata){ +function startCon(Hostname) { + dPost('docker_run_con', '', { Hostname: Hostname }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { dockerConListRender(); } - },{icon:rdata.status?1:2}); + }, { icon: rdata.status ? 1 : 2 }); }); } -function stopCon(Hostname){ - dPost('docker_stop_con','',{Hostname:Hostname},function(rdata){ +function stopCon(Hostname) { + dPost('docker_stop_con', '', { Hostname: Hostname }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { dockerConListRender(); } - },{icon:rdata.status?1:2}); + }, { icon: rdata.status ? 1 : 2 }); }); } -function execCon(Hostname){ +function execCon(Hostname) { webShell(); var pdata_socket = {}; - var shell = setInterval(function(){ - if($('.term-box').length == 0){ + var shell = setInterval(function() { + if ($('.term-box').length == 0) { pdata_socket['data'] = 'exit\n'; - socket.emit('webssh',pdata_socket); - setTimeout(function(){socket.emit('webssh',pdata_socket['data']);},1000); + socket.emit('webssh', pdata_socket); + setTimeout(function() { socket.emit('webssh', pdata_socket['data']); }, 1000); clearInterval(shell); } - },500); - setTimeout(function(){ - dPost('docker_exec','',{Hostname:Hostname},function(res){ + }, 500); + setTimeout(function() { + dPost('docker_exec', '', { Hostname: Hostname }, function(res) { var res = $.parseJSON(res.data); - if(!res.status){ - layer.msg(res.msg,{icon:res.status?1:2}); - }else{ - pdata_socket['data'] = 'clear && ' + res.msg +'\n' - socket.emit('webssh',pdata_socket); - setTimeout(function(){socket.emit('webssh',pdata_socket['data']);},1000); + if (!res.status) { + layer.msg(res.msg, { icon: res.status ? 1 : 2 }); + } else { + pdata_socket['data'] = 'clear && ' + res.msg + '\n' + socket.emit('webssh', pdata_socket); + setTimeout(function() { socket.emit('webssh', pdata_socket['data']); }, 1000); } }); }); } -function dockerConListRender(){ - dPost('con_list', '', {}, function(rdata){ +function dockerConListRender() { + dPost('con_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); console.log(rdata); - if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:2000}); - return; + if (!rdata.status) { + layer.msg(rdata.msg, { icon: 2, time: 2000 }); + return; } - + var list = ''; var rlist = rdata.data; @@ -165,28 +164,28 @@ function dockerConListRender(){ for (var i = 0; i < rlist.length; i++) { var docker_status = 'stop'; var status = ''; - if (rlist[i]['State']['Status'] == 'running'){ + if (rlist[i]['State']['Status'] == 'running') { docker_status = 'start'; status = ''; } var op = ''; - op += '终端 | '; - op += '日志 | '; - op += '删除'; + op += '终端 | '; + op += '日志 | '; + op += '删除'; list += '
    '; - list += ''; - list += ''; - list += ''; + list += ''; + list += ''; + list += ''; - if (docker_status == 'start'){ - list += ''; - } else{ - list += ''; + if (docker_status == 'start') { + list += ''; + } else { + list += ''; } - list += ''; + list += ''; list += ''; } @@ -194,20 +193,20 @@ function dockerConListRender(){ }); } -function createConTemplate(){ +function createConTemplate() { - dPost('get_docker_create_info','',{},function(rdata){ + dPost('get_docker_create_info', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); - console.log(rdata); + // console.log(rdata); var rdata = rdata.data; var imageOpt = ''; - for(var i=0;i'+imageName+''; + for (var i = 0; i < rdata.images.length; i++) { + var imageName = rdata.images[i].RepoTags.indexOf('panel') == -1 ? rdata.images[i].RepoTags : 'aaPanel:' + rdata.images[i].RepoTags.split(':')[1]; + imageOpt += ''; } var iplistOpt = ''; - for(var i=0;i'+rdata.iplist[i].address+''; + for (var i = 0; i < rdata.iplist.length; i++) { + iplistOpt += ''; } var layer_index = layer.open({ @@ -220,11 +219,11 @@ function createConTemplate(){ content: '
    \
    \ 镜像\ -
    \ +
    \
    \
    \ 绑定IP\ -
    \ +
    \
    \
    \ 端口映射\ @@ -268,8 +267,8 @@ function createConTemplate(){
    \
    \ 内存配额\ -
    \ - MB不超过, '+ rdata.memSize +'MB
    \ +
    \ + MB不超过, ' + rdata.memSize + 'MB
    \
    \
    \ CPU配额\ @@ -286,83 +285,86 @@ function createConTemplate(){
    \
    \
    ', - success:function(){ - $(".bt-cancel").click(function(){ - layer.close(layer_index); - }); + success: function() { - - $(".plus").click(function(){ + $(".plus").click(function() { var name1 = $(".type-port input[name='name1']").val(); var name2 = $(".type-port input[name='name2']").val(); - if(name1 < 1 || name1 > 65535 || name2 < 1 || name2 > 65535 || isNaN(name1) || isNaN(name2)){ - layer.msg('Port setting value range is invalid, range [1-65535]',{icon:2}); + if (name1 < 1 || name1 > 65535 || name2 < 1 || name2 > 65535 || isNaN(name1) || isNaN(name2)) { + layer.msg('端口设置值范围无效,范围 [1-65535]', { icon: 2 }); return; } - + var portval = $('#portabletr')[0].childNodes; - for(var i=0;i',{icon:16,time:0,shade: [0.3, "#000"]}); - $.post('/plugin?action=a&name=docker&s=IsPortExists',{port:port},function(rdata){ + var loadT = layer.msg('正在检测中... ', { icon: 16, time: 0, shade: [0.3, "#000"] }); + dPost('docker_port_check', '',{port:port}, function(rdata){ layer.close(loadT); - if(rdata !== false){ - layer.msg('Port ['+name2+'] is already in the mapping list!',{icon:2}); + var rdata = $.parseJSON(rdata.data); + if (rdata.status){ + layer.msg('端口 [' + name2 + ']已在映射列表中!', { icon: 2 }); return; } + var selecttype = $(".type-port select").val(); - var portable= '
    '; + var portable = '\ + \ + \ + \ + \ + '; $("#portabletr").append(portable); $(".more1").remove(); - $(".minus").click(function(){ + $(".minus").click(function() { $(this).parents("tr").remove(); }); }); }); - - $(".plus2").click(function(){ + + $(".plus2").click(function() { var path1 = $(".type-volumes input[name='path1']").val(); var path2 = $(".type-volumes input[name='path2']").val(); - - var notPath = ['/boot','/bin','/sbin','/etc','/usr/bin','/usr/sbin','/dev'] - if($.inArray(path2,notPath) != -1){ - layer.msg('Cannot map' + path2,{icon:2}); + + var notPath = ['/boot', '/bin', '/sbin', '/etc', '/usr/bin', '/usr/sbin', '/dev'] + if ($.inArray(path2, notPath) != -1) { + layer.msg('Cannot map' + path2, { icon: 2 }); return; - } + } var portval = $('#portabletr2')[0].childNodes; - for(var i=0;i'+path1+'\ - \ - \ + var portable = '\ + \ + \ + \ '; $("#portabletr2").append(portable); $(".more2").remove(); - $(".minus2").click(function(){ + $(".minus2").click(function() { $(this).parents("tr").remove(); }); }); }, - yes:function(layero,layer_id){ + yes: function(layero, layer_id) { var ports = {}; var volumes = {}; var portval = $('#portabletr')[0].childNodes; @@ -373,50 +375,62 @@ function createConTemplate(){ var accept = []; //遍历端口映射 - for(var i=0;i rdata.memSize){ - layer.msg('内存配额不能大于物理内存 ['+rdata.memSize+']!',{icon:2}); + + if (data.mem_limit > rdata.memSize) { + layer.msg('内存配额不能大于物理内存 [' + rdata.memSize + ']!', { icon: 2 }); return; } - - if(data.cpu_shares > 100 || data.cpu_shares < 1){ - layer.msg('CPU配额设置值范围应为 [1-100]!',{icon:2}); + + if (data.cpu_shares > 100 || data.cpu_shares < 1) { + layer.msg('CPU配额设置值范围应为 [1-100]!', { icon: 2 }); return; } + + // console.log(data); dPost('docker_create_con','', data, function(rdata){ var rdata = $.parseJSON(rdata.data); showMsg(rdata.msg,function(){ @@ -432,7 +446,7 @@ function createConTemplate(){ } -function dockerConList(){ +function dockerConList() { var con = '
    \ \ @@ -454,33 +468,33 @@ function dockerConList(){ dockerConListRender(); } -function deleteImages(tag, id){ - safeMessage('删除镜像','删除镜像['+tag+'],确定?',function(){ - dPost('docker_remove_image','', {imageId:id,repoTags:tag},function(rdata){ +function deleteImages(tag, id) { + safeMessage('删除镜像', '删除镜像[' + tag + '],确定?', function() { + dPost('docker_remove_image', '', { imageId: id, repoTags: tag }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { dockerImageListRender(); } - },{ icon: rdata.status ? 1 : 2 }); + }, { icon: rdata.status ? 1 : 2 }); }); }); } -function pullImages(tag, id){ +function pullImages(tag, id) { console.log(tag, id); - layer.msg('开发中!',{ icon: 2 }); + layer.msg('开发中!', { icon: 2 }); } -function dockerImageListRender(){ - dPost('image_list', '', {}, function(rdata){ +function dockerImageListRender() { + dPost('image_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); // console.log(rdata); - if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:2000}); - return; + if (!rdata.status) { + layer.msg(rdata.msg, { icon: 2, time: 2000 }); + return; } - + var list = ''; var rlist = rdata.data; @@ -490,21 +504,21 @@ function dockerImageListRender(){ var license = 'null'; var desc = 'null'; - if (rlist[i]['Labels'] == null){ + if (rlist[i]['Labels'] == null) { license = 'free'; } var op = ''; - op += '拉取 | '; - op += '删除'; + op += '拉取 | '; + op += '删除'; list += '
    '; - list += ''; - list += ''; - list += ''; - list += ''; - list += ''; - list += ''; + list += ''; + list += ''; + list += ''; + list += ''; + list += ''; + list += ''; list += ''; } @@ -512,7 +526,7 @@ function dockerImageListRender(){ }); } -function dockerPullImagesFileTemplate(){ +function dockerPullImagesFileTemplate() { // 拉取镜像文件模板 var layer_index = layer.open({ type: 1, @@ -520,29 +534,29 @@ function dockerPullImagesFileTemplate(){ area: '500px', closeBtn: 2, shadeClose: false, - content: '
    '+ - '
    '+ - '官方库'+ - '公共库'+ - '私有库'+ - '
    '+ - '
    '+ - '
    '+ - '镜像名:\ + content: '
    ' + + '
    ' + + '官方库' + + '公共库' + + '私有库' + + '
    ' + + '
    ' + + '
    ' + + '镜像名:\
    \ \ \ -
    '+ - '
    '+ - '
    ' + + ''+ - '
    ' + + '', - success:function(layero,layer_id){ + success: function(layero, layer_id) { - $('.docker-sub span').click(function(){ + $('.docker-sub span').click(function() { var index = $(this).index(); $(this).addClass('on').siblings().removeClass('on'); $(this).parent().next().find('.conter').eq(index).show().siblings().hide(); }); - $('.official_pull_btn').click(function(){ + $('.official_pull_btn').click(function() { var name = $('[name="official_pull_name"]').val(); - if(name == ''){ + if (name == '') { layer.msg('镜像名不能为空!'); return; } - dPost('docker_pull','',{images:name}, function(rdata){ + dPost('docker_pull', '', { images: name }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { layer.close(layer_index); dockerImageListRender(); - + } - },{ icon: rdata.status ? 1 : 2 }); + }, { icon: rdata.status ? 1 : 2 }); }); }); - $('.public_pull_btn').click(function(){ + $('.public_pull_btn').click(function() { var path = $('[name="public_pull_path"]').val(); - if(path == ''){ + if (path == '') { layer.msg('公共网络镜像地址不能为空。'); return; } - dPost('docker_pull_reg','',{path:path}, function(rdata){ + dPost('docker_pull_reg', '', { path: path }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { layer.close(layer_index); dockerImageListRender(); } - },{ icon: rdata.status ? 1 : 2 }); + }, { icon: rdata.status ? 1 : 2 }); }); }); - $('.private_pull_btn').click(function(){ + $('.private_pull_btn').click(function() { var path = $('[name="private_pull_path"]').val(); - if(path == ''){ + if (path == '') { layer.msg('专用镜像地址不能为空!'); return } - dPost('docker_pull_private_new','',{path:path}, function(rdata){ + dPost('docker_pull_private_new', '', { path: path }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { layer.close(layer_index); dockerImageListRender(); } - },{ icon: rdata.status ? 1 : 2 }); + }, { icon: rdata.status ? 1 : 2 }); }); }); } @@ -616,7 +630,7 @@ function dockerPullImagesFileTemplate(){ }); } -function dockerImageList(){ +function dockerImageList() { var con = '
    \ \ @@ -642,54 +656,54 @@ function dockerImageList(){ } //获取文件数据 -function dockerGetFileBytes(fileName){ - window.open('/files/download?filename='+encodeURIComponent(fileName)); +function dockerGetFileBytes(fileName) { + window.open('/files/download?filename=' + encodeURIComponent(fileName)); } //删除文件 -function dockerDeleteFile(fileName){ - layer.confirm(lan.get('recycle_bin_confirm',[fileName]),{title:'删除文件',closeBtn:2,icon:3},function(){ - layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']}); +function dockerDeleteFile(fileName) { + layer.confirm(lan.get('recycle_bin_confirm', [fileName]), { title: '删除文件', closeBtn: 2, icon: 3 }, function() { + layer.msg('正在处理,请稍候...', { icon: 16, time: 0, shade: [0.3, '#000'] }); $.post('/files/delete', 'path=' + encodeURIComponent(fileName), function(rdata) { - showMsg(rdata.msg,function(){ + showMsg(rdata.msg, function() { dockerImageOutputRender(); - },{icon: rdata.status ? 1 : 2}); - },'json'); + }, { icon: rdata.status ? 1 : 2 }); + }, 'json'); }); } -function dockerLoadFile(fileName){ - dPost('image_pick_load', '', {file:fileName}, function(rdata){ +function dockerLoadFile(fileName) { + dPost('image_pick_load', '', { file: fileName }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - dockerImageOutputRender(); - },{icon: rdata.status ? 1 : 2}); + showMsg(rdata.msg, function() { + dockerImageOutputRender(); + }, { icon: rdata.status ? 1 : 2 }); }); } -function dockerImageOutputRender(){ - dPost('image_pick_list', '', {}, function(rdata){ +function dockerImageOutputRender() { + dPost('image_pick_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); - if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:10000}); - return; + if (!rdata.status) { + layer.msg(rdata.msg, { icon: 2, time: 10000 }); + return; } - + var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { var op = ''; - op += '下载 | '; - op += '导入 | '; - op += '删除'; + op += '下载 | '; + op += '导入 | '; + op += '删除'; list += '
    '; - list += ''; - list += ''; - list += ''; - list += ''; + list += ''; + list += ''; + list += ''; + list += ''; list += ''; } @@ -698,15 +712,15 @@ function dockerImageOutputRender(){ } //上传文件 -function uploadImageFiles(upload_dir){ +function uploadImageFiles(upload_dir) { var image_layer = layer.open({ - type:1, + type: 1, closeBtn: 1, - title:"上传导入文件["+upload_dir+']', - area: ['500px','300px'], - shadeClose:false, - content:'
    \ - \ + title: "上传导入文件[" + upload_dir + ']', + area: ['500px', '300px'], + shadeClose: false, + content: '
    \ + \ \ \ \ @@ -722,24 +736,24 @@ function uploadImageFiles(upload_dir){ \
      \
      ', - success:function(){ - $('#filesClose').click(function(){ + success: function() { + $('#filesClose').click(function() { layer.close(image_layer); }); } }); - uploadStart(function(){ - showMsg('上传成功!', function(){ + uploadStart(function() { + showMsg('上传成功!', function() { dockerImageOutputRender(); layer.close(image_layer); - },{icon:1,time:2000}); + }, { icon: 1, time: 2000 }); }); } -function dockerImagePick(){ +function dockerImagePick() { - dPost('image_list', '', {}, function(rdata){ + dPost('image_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); var imageList = rdata.data; // console.log(imageList); @@ -749,12 +763,13 @@ function dockerImagePick(){ _tbody = '
      '; continue; } - var versionData = imageList[i].RepoTags,version,reg = new RegExp('((?<=:)[0-9A-z/.-]*)$'); + var versionData = imageList[i].RepoTags, + version, reg = new RegExp('((?<=:)[0-9A-z/.-]*)$'); version = versionData.match(reg); - _tbody += "\ - \ - \ - "; + _tbody += "\ + \ + \ + "; } @@ -763,7 +778,7 @@ function dockerImagePick(){ title: "选择镜像", area: '500px', closeBtn: 2, - btn:['打包','取消'], + btn: ['打包', '取消'], shadeClose: false, content: '
      \
      '+rlist[i]['Name'].substring(1)+''+rlist[i]['Config']['Image']+''+getFormatTime(rlist[i]['Created'])+'' + rlist[i]['Name'].substring(1) + '' + rlist[i]['Config']['Image'] + '' + getFormatTime(rlist[i]['Created']) + ''+status+''+status+'' + status + '' + status + ''+op+'' + op + '
      '+name1+''+selecttype+''+name2+'Del
      ' + name1 + '' + selecttype + '' + name2 + '删除
      '+selecttype+''+path2+'Del
      ' + path1 + '' + selecttype + '' + path2 + '删除
      '+rlist[i]['RepoTags']+''+tag+''+toSize(rlist[i]['Size'])+''+license+''+desc+''+op+'' + rlist[i]['RepoTags'] + '' + tag + '' + toSize(rlist[i]['Size']) + '' + license + '' + desc + '' + op + '
      '+rlist[i]['name']+''+rlist[i]['size']+''+rlist[i]['time']+''+op+'' + rlist[i]['name'] + '' + rlist[i]['size'] + '' + rlist[i]['time'] + '' + op + '
      当前无镜像
      "+imageList[i].RepoTags+""+ version[0] +""+ toSize(imageList[i].Size) +"
      " + imageList[i].RepoTags + "" + version[0] + "" + toSize(imageList[i].Size) + "
      \ @@ -773,38 +788,39 @@ function dockerImagePick(){ \ \ \ - '+ _tbody +'\ + ' + _tbody + '\
      版本大小
      \
      ', - success:function(){ + success: function() { readerTableChecked(); tableFixed('images_table'); }, - yes:function(layers,index){ - var data = '', tit = '\xa0', - choose_num = $(".images_pull tbody [name=images]:checked").length; + yes: function(layers, index) { + var data = '', + tit = '\xa0', + choose_num = $(".images_pull tbody [name=images]:checked").length; for (var i = 0; i < choose_num; i++) { - if(choose_num == 0){ - layer.msg('Please choose the images which need to pack',{icon:2}); + if (choose_num == 0) { + layer.msg('Please choose the images which need to pack', { icon: 2 }); return false; } data += $(".images_pull tbody [name=images]:checked").eq(i).attr('data-name'); - if(i != (choose_num-1)) data += ' '; + if (i != (choose_num - 1)) data += ' '; } - dPost('image_pick_save', '', {images:data}, function(rdata){ + dPost('image_pick_save', '', { images: data }, function(rdata) { var rdata = $.parseJSON(rdata['data']); - showMsg(rdata.msg, function(){ + showMsg(rdata.msg, function() { dockerImageOutputRender(); layer.close(layerS); - },{icon:rdata.status?1:2,time:2000}); + }, { icon: rdata.status ? 1 : 2, time: 2000 }); }); } }); }); } -function dockerImageOutput(){ +function dockerImageOutput() { var con = '
      \ \ \ @@ -825,12 +841,12 @@ function dockerImageOutput(){ $(".soft-man-con").html(con); - $('#btn_image_upload').click(function(){ + $('#btn_image_upload').click(function() { dPostOrgin({ - name:'docker', - func:'image_pick_dir', - version:'', - },function(rdata){ + name: 'docker', + func: 'image_pick_dir', + version: '', + }, function(rdata) { var rdata = $.parseJSON(rdata['data']); var upload_dir = rdata['data']; uploadImageFiles(upload_dir); @@ -840,41 +856,41 @@ function dockerImageOutput(){ dockerImageOutputRender(); } -function deleteIpList(address){ - safeMessage('删除IP','你将删除从IP地址池['+address+'],确定?',function(){ - dPost('docker_del_ip','', {address:address},function(rdata){ +function deleteIpList(address) { + safeMessage('删除IP', '你将删除从IP地址池[' + address + '],确定?', function() { + dPost('docker_del_ip', '', { address: address }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg,function(){ - if(rdata.status) { + showMsg(rdata.msg, function() { + if (rdata.status) { dockerIpListRender(); } - },{ icon: rdata.status ? 1 : 2 }); + }, { icon: rdata.status ? 1 : 2 }); }); }); } -function dockerIpListRender(){ - dPost('docker_get_iplist', '', {}, function(rdata){ +function dockerIpListRender() { + dPost('docker_get_iplist', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); // console.log(rdata); - if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:2000}); - return; + if (!rdata.status) { + layer.msg(rdata.msg, { icon: 2, time: 2000 }); + return; } - + var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { var op = ''; - op += '删除'; + op += '删除'; list += ''; - list += ''+rlist[i]['address']+''; - list += ''+rlist[i]['netmask']+''; - list += ''+rlist[i]['gateway']+''; - list += ''+op+''; + list += '' + rlist[i]['address'] + ''; + list += '' + rlist[i]['netmask'] + ''; + list += '' + rlist[i]['gateway'] + ''; + list += '' + op + ''; list += ''; } @@ -882,19 +898,19 @@ function dockerIpListRender(){ }); } -function dockerAddIpPool(){ +function dockerAddIpPool() { var address = $('input[name="address"]').val(); var netmask = $('input[name="netmask"]').val(); var gateway = $('input[name="gateway"]').val(); - dPost('docker_add_ip','', {address:address,netmask:netmask,gateway:gateway}, function(rdata){ + dPost('docker_add_ip', '', { address: address, netmask: netmask, gateway: gateway }, function(rdata) { var rdata = $.parseJSON(rdata.data); - showMsg(rdata.msg, function(){ + showMsg(rdata.msg, function() { dockerIpListRender(); - },{icon:rdata.status?1:2}) + }, { icon: rdata.status ? 1 : 2 }) }); } -function dockerIpList(){ +function dockerIpList() { var con = '
      \
      \ \ @@ -922,11 +938,11 @@ function dockerIpList(){ } // login -function repoLogin(){ - var _option1= ""; - var obj = {hub_name: "", namespace: "",name: "", registry: "", user_pass: "", user_name: "",arry: ['Docker Repository','Other Repository']}; - for(var i = 0; i< obj.arry.length;i++){ - _option1 += ''; +function repoLogin() { + var _option1 = ""; + var obj = { hub_name: "", namespace: "", name: "", registry: "", user_pass: "", user_name: "", arry: ['Docker Repository', 'Other Repository'] }; + for (var i = 0; i < obj.arry.length; i++) { + _option1 += ''; } var layer_index = layer.open({ type: 1, @@ -934,56 +950,56 @@ function repoLogin(){ area: '450px', closeBtn: 2, shadeClose: false, - content: '
      '+ - ''+ - '
      '+ - '
      Repository Type
      '+ - '
      Name:
      '+ - '
      Username:
      '+ - '
      Password:
      '+ - '
      Repository Name:
      '+ - '
      Namespaces:
      '+ - ''+ - '
      '+ - '
      '+ - '
      ', - success:function(){ - $('[name="dtype"]').change(function(e){ + content: '
      ' + + '' + + '
      ' + + '
      Repository Type
      ' + + '
      Name:
      ' + + '
      Username:
      ' + + '
      Password:
      ' + + '
      Repository Name:
      ' + + '
      Namespaces:
      ' + + '' + + '
      ' + + '
      ' + + '
      ', + success: function() { + $('[name="dtype"]').change(function(e) { var docker_type = $(this).val(); - if(docker_type == 'Other Repository'){ + if (docker_type == 'Other Repository') { $('.docker_content .line').show(); - }else{ + } else { $('.docker_content .line').filter(":lt(3)").show().end().filter(":gt(4)").hide(); } - }); - $('.login_aliyun').click(function(){ + }); + $('.login_aliyun').click(function() { var user = $('[name="user"]').val(), - passwd = $('[name="passwd"]').val(), - registry = $('[name="registry"]').val(), - name = $('[name="ctm_name"]').val(), - hub_name = $('[name="hub_name"]').val(), - namespace = $('[name="namespace"]').val(); + passwd = $('[name="passwd"]').val(), + registry = $('[name="registry"]').val(), + name = $('[name="ctm_name"]').val(), + hub_name = $('[name="hub_name"]').val(), + namespace = $('[name="namespace"]').val(); var args = { - user:user, - passwd:passwd, - registry:'', - repository_name:name, - hub_name:hub_name, - namespace:namespace + user: user, + passwd: passwd, + registry: '', + repository_name: name, + hub_name: hub_name, + namespace: namespace }; - if($('[name="dtype"]').val() == 'Docker Repository'){ + if ($('[name="dtype"]').val() == 'Docker Repository') { args.registry = ''; - }else{ + } else { args.registry = registry; } console.log(obj); - dPost('docker_login', '', args, function(rdata){ + dPost('docker_login', '', args, function(rdata) { var rdata = $.parseJSON(rdata.data); console.log(rdata); - layer.msg(rdata.msg,{icon:rdata.status?1:2}); - if(res.status){ + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + if (res.status) { repoListRender(); layer.close(layer_index); } @@ -995,14 +1011,13 @@ function repoLogin(){ } -function delRepo(address){ - safeMessage('退出','你将退出 ['+address+'],确定?',function(){ - dPost('docker_logout', '', - {registry:address}, - function(rdata){ +function delRepo(address) { + safeMessage('退出', '你将退出 [' + address + '],确定?', function() { + dPost('docker_logout', '', { registry: address }, + function(rdata) { var rdata = $.parseJSON(rdata.data); - layer.msg(rdata.msg,{icon:rdata.status?1:2}); - if(rdata.status) { + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + if (rdata.status) { repoListRender(); } } @@ -1011,33 +1026,34 @@ function delRepo(address){ } -function repoListRender(){ - dPost('repo_list', '', {}, function(rdata){ +function repoListRender() { + dPost('repo_list', '', {}, function(rdata) { var rdata = $.parseJSON(rdata.data); console.log(rdata); - if (!rdata.status){ - layer.msg(rdata.msg,{icon:2,time:2000}); - return; + if (!rdata.status) { + layer.msg(rdata.msg, { icon: 2, time: 2000 }); + return; } - + var list = ''; var rlist = rdata.data; for (var i = 0; i < rlist.length; i++) { list += ''; - list += ''+rlist[i]['hub_name']+''; - list += ''+rlist[i]['repository_name']+''; - list += ''+rlist[i]['namespace']+''; - list += ''+rlist[i]['registry']+''; - list += '删除'; + list += '' + rlist[i]['hub_name'] + ''; + list += '' + rlist[i]['repository_name'] + ''; + list += '' + rlist[i]['namespace'] + ''; + list += '' + rlist[i]['registry'] + ''; + list += '删除'; list += ''; } $('#con_list tbody').html(list); }); } -function repoList(){ + +function repoList() { var con = '
      \ \ @@ -1060,11 +1076,9 @@ function repoList(){ $(".soft-man-con").html(con); //login - $('#docker_login').click(function(){ + $('#docker_login').click(function() { repoLogin(); }); repoListRender(); -} - - +} \ No newline at end of file From 066185e404976306b6d0d5c0226ec63bedf21e67 Mon Sep 17 00:00:00 2001 From: midoks Date: Fri, 4 Aug 2023 20:27:20 +0800 Subject: [PATCH 21/42] =?UTF-8?q?=E7=BD=91=E7=AB=99=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=8F=8D=E5=90=91=E4=BB=A3=E7=90=86=E5=8D=87=E7=BA=A7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + class/core/mw.py | 6 + class/core/site_api.py | 156 ++++--- data/tpl/nginx.conf | 11 +- data/tpl/nginx_dirbind.conf | 13 +- plugins/openresty/conf/nginx.conf | 21 +- .../openresty/conf/vhost/0.nginx_status.conf | 10 + plugins/openresty/conf/vhost/0.websocket.conf | 4 + plugins/openresty/index.py | 12 + route/static/app/files.js | 27 +- route/static/app/site.js | 411 ++++++++++++------ route/static/css/site.css | 20 +- 12 files changed, 459 insertions(+), 233 deletions(-) create mode 100644 plugins/openresty/conf/vhost/0.nginx_status.conf create mode 100644 plugins/openresty/conf/vhost/0.websocket.conf diff --git a/README.md b/README.md index 2431b4820..69626ac5c 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,7 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: * rsyncd添加优化 * 使用mariadb二进制导入备份文件 * docker插件-镜像导入导出功能 +* 网站设置反向代理升级功能 ### JSDelivr安装地址 diff --git a/class/core/mw.py b/class/core/mw.py index d3fe98cb6..d2d37549d 100755 --- a/class/core/mw.py +++ b/class/core/mw.py @@ -1215,6 +1215,12 @@ def formatDate(format="%Y-%m-%d %H:%M:%S", times=None): return time.strftime(format, time_local) +def strfToTime(sdate): + # 转换时间 + import time + return time.strftime('%Y-%m-%d', time.strptime(sdate, '%b %d %H:%M:%S %Y %Z')) + + def checkIp(ip): # 检查是否为IPv4地址 import re diff --git a/class/core/site_api.py b/class/core/site_api.py index 42a2bdbf7..0cc2f678a 100755 --- a/class/core/site_api.py +++ b/class/core/site_api.py @@ -1870,19 +1870,16 @@ class site_api: if _id == '' or _siteName == '': return mw.returnJson(False, "必填项不能为空!") - _old_config = mw.readFile( - "{}/{}/{}.conf".format(self.proxyPath, _siteName, _id)) - if _old_config == False: - return mw.returnJson(False, "非法操作") - - mw.writeFile("{}/{}/{}.conf".format(self.proxyPath, - _siteName, _id), _config) + proxy_file = "{}/{}/{}.conf".format(self.proxyPath, _siteName, _id) + mw.backFile(proxy_file) + mw.writeFile(proxy_file, _config) rule_test = mw.checkWebConfig() if rule_test != True: - mw.writeFile("{}/{}/{}.conf".format(self.proxyPath, - _siteName, _id), _old_config) + mw.restoreFile(proxy_file) + mw.removeBackFile(proxy_file) return mw.returnJson(False, "OpenResty 配置测试不通过, 请重试: {}".format(rule_test)) + mw.removeBackFile(proxy_file) self.operateRedirectConf(_siteName, 'start') mw.restartWeb() return mw.returnJson(True, "ok") @@ -1923,21 +1920,20 @@ class site_api: _from = request.form.get('from', '') _to = request.form.get('to', '') _host = request.form.get('host', '') + _name = request.form.get('name', '') _open_proxy = request.form.get('open_proxy', '') + _open_cache = request.form.get('open_cache', '') + _cache_time = request.form.get('cache_time', '') + _id = request.form.get('id', '') - if _siteName == "" or _from == "" or _to == "" or _host == "": + # print(_name, _siteName, _from, _to, _host) + if _name == "" or _siteName == "" or _from == "" or _to == "" or _host == "": return mw.returnJson(False, "必填项不能为空") - data_path = self.getProxyDataPath(_siteName) - data_content = mw.readFile( - data_path) if os.path.exists(data_path) else "" - data = json.loads(data_content) if data_content != "" else [] - rep = "http(s)?\:\/\/([a-zA-Z0-9][-a-zA-Z0-9]{0,62}\.)+([a-zA-Z0-9][a-zA-Z0-9]{0,62})+.?" if not re.match(rep, _to): return mw.returnJson(False, "错误的目标地址!") - # _to = _to.strip("/") # get host from url try: if _host == "$host": @@ -1946,7 +1942,11 @@ class site_api: except: return mw.returnJson(False, "错误的目标地址") - # location ~* ^{from}(.*)$ { + proxy_site_path = self.getProxyDataPath(_siteName) + data_content = mw.readFile( + proxy_site_path) if os.path.exists(proxy_site_path) else "" + data = json.loads(data_content) if data_content != "" else [] + tpl = "#PROXY-START\n\ location ^~ {from} {\n\ proxy_pass {to};\n\ @@ -1954,12 +1954,29 @@ location ^~ {from} {\n\ proxy_set_header X-Real-IP $remote_addr;\n\ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\ proxy_set_header REMOTE-HOST $remote_addr;\n\ + proxy_set_header Upgrade $http_upgrade;\n\ + proxy_set_header Connection $connection_upgrade;\n\ + proxy_http_version 1.1;\n\ \n\ add_header X-Cache $upstream_cache_status;\n\ - proxy_ignore_headers Set-Cookie Cache-Control expires;\n\ - add_header Cache-Control no-cache;\n\ \n\ - set $static_files_app 0;\n\ + {proxy_cache}\n\ +}\n\ +# PROXY-END" + + tpl_proxy_cache = "\n\ + if ( $uri ~* \"\.(gif|png|jpg|css|js|woff|woff2)$\" )\n\ + {\n\ + expires {cache_time}m;\n\ + }\n\ + proxy_ignore_headers Set-Cookie Cache-Control expires;\n\ + proxy_cache mw_cache;\n\ + proxy_cache_key \"$host$uri$is_args$args\";\n\ + proxy_cache_valid 200 304 301 302 {cache_time}m;\n\ +" + + tpl_proxy_nocache = "\n\ + set $static_files_app 0; \n\ if ( $uri ~* \"\.(gif|png|jpg|css|js|woff|woff2)$\" )\n\ {\n\ set $static_files_app 1;\n\ @@ -1969,8 +1986,7 @@ location ^~ {from} {\n\ {\n\ add_header Cache-Control no-cache;\n\ }\n\ -}\n\ -#PROXY-END" +" # replace if _from[0] != '/': @@ -1978,28 +1994,69 @@ location ^~ {from} {\n\ tpl = tpl.replace("{from}", _from, 999) tpl = tpl.replace("{to}", _to) tpl = tpl.replace("{host}", _host, 999) + tpl = tpl.replace("{cache_time}", _cache_time, 999) - _id = mw.md5("{}+{}+{}".format(_from, _to, _siteName)) - for item in data: - if item["id"] == _id: - return mw.returnJson(False, "已存在该规则!") - if item["from"] == _from: - return mw.returnJson(False, "代理目录已存在!") - data.append({ - "from": _from, - "to": _to, - "host": _host, - "id": _id - }) + if _open_cache == 'on': + tpl_proxy_cache = tpl_proxy_cache.replace( + "{cache_time}", _cache_time, 999) + tpl = tpl.replace("{proxy_cache}", tpl_proxy_cache, 999) + else: + tpl = tpl.replace("{proxy_cache}", tpl_proxy_nocache, 999) + + proxy_action = 'add' + if _id == "": + _id = mw.md5("{}".format(_name)) + else: + proxy_action = 'edit' + + conf_proxy = "{}/{}.conf".format(self.getProxyPath(_siteName), _id) + conf_bk = "{}/{}.conf.txt".format(self.getProxyPath(_siteName), _id) + + mw.writeFile(conf_proxy, tpl) + + rule_test = mw.checkWebConfig() + if rule_test != True: + os.remove(conf_proxy) + return mw.returnJson(False, "OpenResty配置测试不通过, 请重试: {}".format(rule_test)) + + if proxy_action == "add": + # 添加代理 + _id = mw.md5("{}".format(_name)) + for item in data: + if item["name"] == _name: + return mw.returnJson(False, "名称重复!") + if item["from"] == _from: + return mw.returnJson(False, "代理目录已存在!") + data.append({ + "name": _name, + "from": _from, + "to": _to, + "host": _host, + "open_cache": _open_cache, + "open_proxy": _open_proxy, + "cache_time": _cache_time, + "id": _id, + }) + else: + # 修改代理 + dindex = -1 + for x in range(len(data)): + if data[x]["id"] == _id: + dindex = x + break + if dindex < 0: + return mw.returnJson(False, "异常请求") + data[dindex]['from'] = _from + data[dindex]['to'] = _to + data[dindex]['host'] = _host + data[dindex]['open_cache'] = _open_cache + data[dindex]['open_proxy'] = _open_proxy + data[dindex]['cache_time'] = _cache_time - conf_file = "{}/{}.conf".format(self.getProxyPath(_siteName), _id) if _open_proxy != 'on': - conf_file = "{}/{}.conf.txt".format( - self.getProxyPath(_siteName), _id) - - mw.writeFile(data_path, json.dumps(data)) - mw.writeFile(conf_file, tpl) + os.rename(conf_proxy, conf_bk) + mw.writeFile(proxy_site_path, json.dumps(data)) self.operateProxyConf(_siteName, 'start') mw.restartWeb() return mw.returnJson(True, "ok", {"hash": _id}) @@ -2030,10 +2087,10 @@ location ^~ {from} {\n\ self.getProxyPath(_siteName), _id) mw.execShell(cmd) except: - return mw.returnJson(False, "删除失败!") + return mw.returnJson(False, "删除反代失败!") mw.restartWeb() - return mw.returnJson(True, "删除成功!") + return mw.returnJson(True, "删除反代成功!") def getSiteTypesApi(self): # 取网站分类 @@ -2100,7 +2157,7 @@ location ^~ {from} {\n\ ##### ----- end ----- ### - # 域名编码转换 + # 域名编码转换 def toPunycode(self, domain): import re if sys.version_info[0] == 2: @@ -2108,7 +2165,7 @@ location ^~ {from} {\n\ tmp = domain.split('.') newdomain = '' for dkey in tmp: - # 匹配非ascii字符 + # 匹配非ascii字符 match = re.search(u"[\x80-\xff]+", dkey) if not match: newdomain += dkey + '.' @@ -2410,7 +2467,7 @@ location ^~ {from} {\n\ return 404; } } - #SECURITY-END + # SECURITY-END include %s/enable-php-''' % (fix.strip().replace(',', '|'), domains.strip().replace(',', ' '), pre_path) conf = re.sub(re_path, rconf, conf) mw.writeLog('网站管理', '站点[' + name + ']已开启防盗链!') @@ -2663,7 +2720,7 @@ location ^~ {from} {\n\ mw.writeLog('TYPE_SITE', '设置成功,站点到期后将自动停止!', (siteName, edate)) return mw.returnJson(True, '设置成功,站点到期后将自动停止!') - # ssl相关方法 start +# ssl相关方法 start def setSslConf(self, siteName): file = self.getHostConf(siteName) conf = mw.readFile(file) @@ -2762,9 +2819,4 @@ location ^~ {from} {\n\ mw.execShell("chattr +i " + filename) return mw.returnJson(True, '已打开防跨站设置!') - - # 转换时间 - def strfToTime(self, sdate): - import time - return time.strftime('%Y-%m-%d', time.strptime(sdate, '%b %d %H:%M:%S %Y %Z')) - # ssl相关方法 end +# ssl相关方法 end diff --git a/data/tpl/nginx.conf b/data/tpl/nginx.conf index b4b0eb1c7..e1a4f2588 100755 --- a/data/tpl/nginx.conf +++ b/data/tpl/nginx.conf @@ -39,20 +39,13 @@ server allow all; } - location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ + location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; - error_log off; + error_log /dev/null; access_log /dev/null; } - location ~ .*\\.(js|css)?$ - { - expires 12h; - error_log off; - access_log /dev/null; - } - access_log {$LOGPATH}/{$SERVER_NAME}.log main; error_log {$LOGPATH}/{$SERVER_NAME}.error.log; } \ No newline at end of file diff --git a/data/tpl/nginx_dirbind.conf b/data/tpl/nginx_dirbind.conf index 30e54725b..129a7ddd1 100755 --- a/data/tpl/nginx_dirbind.conf +++ b/data/tpl/nginx_dirbind.conf @@ -35,18 +35,11 @@ server allow all; } - location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ + location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { - expires 30d; - error_log off; + error_log /dev/null; access_log /dev/null; - } - - location ~ .*\\.(js|css)?$ - { - expires 12h; - error_log off; - access_log /dev/null; + expires 30d; } access_log {$LOGPATH}/{$SERVER_MAIN}_{$DIRBIND}.log; diff --git a/plugins/openresty/conf/nginx.conf b/plugins/openresty/conf/nginx.conf index 83f00bc42..eded2d045 100644 --- a/plugins/openresty/conf/nginx.conf +++ b/plugins/openresty/conf/nginx.conf @@ -60,6 +60,7 @@ http limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; + # CACEH_BEGIN proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 512 4k; @@ -70,19 +71,15 @@ http proxy_read_timeout 5s; proxy_send_timeout 5s; - server_tokens off; - access_log off; + fastcgi_cache_key "$scheme$request_method$host$request_uri"; + fastcgi_cache_path {$SERVER_PATH}/openresty/nginx/fastcgi_cache_temp levels=1:2 keys_zone=mw_cache_fcgi:100m inactive=60m max_size=5g; + fastcgi_cache_use_stale error timeout invalid_header http_500; + fastcgi_ignore_headers Cache-Control Expires Set-Cookie; + # CACEH_END - server { - listen 80; - listen [::]:80; - server_name 127.0.0.1; - allow 127.0.0.1; - location /nginx_status { - stub_status on; - access_log off; - } - } + server_tokens off; + access_log /dev/null; + include {$SERVER_PATH}/web_conf/nginx/vhost/*.conf; } diff --git a/plugins/openresty/conf/vhost/0.nginx_status.conf b/plugins/openresty/conf/vhost/0.nginx_status.conf new file mode 100644 index 000000000..751645a4c --- /dev/null +++ b/plugins/openresty/conf/vhost/0.nginx_status.conf @@ -0,0 +1,10 @@ +server { + listen 80; + listen [::]:80; + server_name 127.0.0.1; + allow 127.0.0.1; + location /nginx_status { + stub_status on; + access_log off; + } +} \ No newline at end of file diff --git a/plugins/openresty/conf/vhost/0.websocket.conf b/plugins/openresty/conf/vhost/0.websocket.conf new file mode 100644 index 000000000..60e726a51 --- /dev/null +++ b/plugins/openresty/conf/vhost/0.websocket.conf @@ -0,0 +1,4 @@ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} diff --git a/plugins/openresty/index.py b/plugins/openresty/index.py index 0a135b6ba..b4a3e3ff4 100755 --- a/plugins/openresty/index.py +++ b/plugins/openresty/index.py @@ -180,6 +180,17 @@ def confReplace(): cmd_s = 'chmod u+s ' + ng_exe_bin os.system('echo %s|sudo -S %s' % (sudoPwd, cmd_s)) + # vhost + vhost_dir = mw.getServerDir() + '/web_conf/nginx/vhost' + vhost_tpl_dir = getPluginDir() + '/conf/vhost' + # print(vhost_dir, vhost_tpl_dir) + vhost_list = ['0.websocket.conf', '0.nginx_status.conf'] + for f in vhost_list: + a_conf = vhost_dir + '/' + f + a_conf_tpl = vhost_tpl_dir + '/' + f + if not os.path.exists(a_conf): + mw.writeFile(a_conf, mw.readFile(a_conf_tpl)) + def initDreplace(): @@ -290,6 +301,7 @@ def restart(): def reload(): + confReplace() return restyOp('reload') diff --git a/route/static/app/files.js b/route/static/app/files.js index 840ebc205..9ec2d36f4 100755 --- a/route/static/app/files.js +++ b/route/static/app/files.js @@ -789,18 +789,15 @@ function batchPasteTo(data,path){ function getSuffixName(fileName){ var extArr = fileName.split("."); - var exts = ['folder','folder-unempty','sql','c','cpp','cs','flv','css','js', + var exts = ['folder-unempty','sql','c','cpp','cs','flv','css','js', 'htm','html','java','log','mht','url','xml','ai','bmp','cdr','gif','ico', - 'jpeg','jpg','JPG','png','psd','webp','ape','avi','flv','mkv','mov','mp3','mp4', + 'jpeg','jpg','JPG','png','psd','webp','ape','avi','mkv','mov','mp3','mp4', 'mpeg','mpg','rm','rmvb','swf','wav','webm','wma','wmv','rtf','docx','fdf','potm', 'pptx','txt','xlsb','xlsx','7z','cab','iso','rar','zip','gz','bt','file','apk','bookfolder', - 'folder','folder-empty','folder-unempty','fromchromefolder','documentfolder','fromphonefolder', - 'mix','musicfolder','picturefolder','videofolder','sefolder','access','mdb','accdb','sql','c', - 'cpp','cs','js','fla','flv','htm','html','java','mht','url','xml','ai','bmp','cdr', - 'gif','ico','jpeg','jpg','JPG','png','psd','webp','ape','avi','flv','mkv','mov','mp3','mp4','mpeg', - 'mpg','rm','rmvb','swf','wav','webm','wma','wmv','doc','docm','dotx','dotm','dot','rtf','docx','pdf', - 'fdf','ppt','pptm','pot','potm','pptx','txt','xls','csv','xlsm','xlsb','xlsx','7z','gz','cab','iso', - 'rar','zip','bt','file','apk','css','scss','svg','pl','py','php','md','json','sh']; + 'folder','folder-empty','fromchromefolder','documentfolder','fromphonefolder', + 'mix','musicfolder','picturefolder','videofolder','sefolder','access','mdb','accdb', + 'fla','doc','docm','dotx','dotm','dot','pdf', + 'ppt','pptm','pot','xls','csv','xlsm','scss','svg','pl','py','php','md','json','sh','conf']; var extLastName = extArr[extArr.length - 1]; for(var i=0; i" + - "
      " + - '开启代理'+ - "
      " + - "" + - "
      " + - "
      " + - "
      "+ - "代理目录" + - "
      " + - "" + - "
      " + - "
      " + - "
      " + - "目标URL" + - "
      " + - "" + - "发送域名" + - "" + - "
      " + - "
      " + - "
      " + - "
        " + - "
      • 代理目录:访问这个目录时将会把目标URL的内容返回并显示
      • " + - "
      • 目标URL:可以填写你需要代理的站点,目标URL必须为可正常访问的URL,否则将返回错误
      • " + - "
      • 发送域名:将域名添加到请求头传递到代理服务器,默认为目标URL域名,若设置不当可能导致代理无法正常运行
      • " + - "
      " + - "
      " + - "", - yes:function(){ - var data = $('#form_redirect').serializeArray(); + content: "
      \ +
      \ + 开启代理\ +
      \ + \ + \ +
      \ + 是否缓存\ + \ + \ +
      \ +
      \ +
      \ +
      \ + 名称\ +
      \ + \ +
      \ +
      \ + \ +
      \ + 代理目录\ +
      \ + \ +
      \ +
      \ +
      \ + 目标URL\ +
      \ + \ + 发送域名\ + \ +
      \ +
      \ + \ +
      \ +
        \ +
      • 代理目录:访问这个目录时将会把目标URL的内容返回并显示
      • \ +
      • 目标URL:可以填写你需要代理的站点,目标URL必须为可正常访问的URL,否则将返回错误
      • \ +
      • 发送域名:将域名添加到请求头传递到代理服务器,默认为目标URL域名,若设置不当可能导致代理无法正常运行
      • \ +
      \ +
      \ +
      ", + success:function(){ + + if (typeof(obj) != 'undefined'){ + // console.log(obj); + $('input[name="name"]').val(obj['name']).attr('readonly','readonly').addClass('disabled'); + if (obj['open_cache'] == 'on'){ + $("input[name='open_cache']").prop("checked",true); + $('#cache_time').show(); + } + + $('input[name="from"]').val(obj['from']); + $('input[name="to"]').val(obj['to']); + + var url = obj['to']; + var ip_reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; + url = url.replace(/^http[s]?:\/\//, ''); + url = url.replace(/(:|\?|\/|\\)(.*)$/, ''); + if (ip_reg.test(url)) { + $("[name='host']").val('$host'); + } else { + $("[name='host']").val(url); + } + + $('input[name="id"]').val(obj['id']); + $('input[name="cache_time"]').val(obj['cache_time']); + } + + + $('input[name="to"]').on('keyup', function(){ + var url = $(this).val(); + var ip_reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; + url = url.replace(/^http[s]?:\/\//, ''); + url = url.replace(/(:|\?|\/|\\)(.*)$/, ''); + if (ip_reg.test(url)) { + $("[name='host']").val('$host'); + } else { + $("[name='host']").val(url); + } + }); + + $("#open_proxy").click(function(){ + var status = $("input[name='open_proxy']").prop("checked")==true?1:0; + if(status==1){ + $("input[name='open_proxy']").prop("checked",false); + }else{ + $("input[name='open_proxy']").prop("checked",true); + } + }); + + $('#open_cache').click(function(){ + var status = $("input[name='open_cache']").prop("checked")==true?1:0; + if(status==1){ + $('#cache_time').hide(); + $("input[name='open_cache']").prop("checked",false); + }else{ + $('#cache_time').show(); + $("input[name='open_cache']").prop("checked",true); + } + }); + }, + yes:function(index,layer_ro){ + var data = $('#form_proxy').serializeArray(); var t = {}; t['name'] = 'siteName'; t['value'] = siteName; data.push(t); - var loading = layer.msg('添加中...',{icon:16,time:0,shade: [0.3, '#000']}); + // console.log(data); + var loading = layer.msg('正在'+proxy_title+'...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_proxy',data, function(res) { layer.close(loading); - if (res.status) { - layer.close(proxy_form); - toProxy(siteName) - } else { - layer.msg(res.msg, {icon: 2}); + if (!res.status){ + layer.msg(res.msg, {icon: 2,time:10000}); + return; } + + showMsg(proxy_title+"成功!",function(){ + layer.close(index); + toProxy(siteName); + },{icon: 1, time:2000}); },'json'); } }); } if (type == 2) { + var loading = layer.msg('正在删除中...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/del_proxy', {siteName: siteName,id: obj,}, function(res) { + layer.close(loading); if (res.status == true) { - layer.msg('删除成功', {time: 1000,icon: 1}); - toProxy(siteName) + showMsg('删除成功', function(){ + toProxy(siteName); + },{time: 1000,icon: 1}); } else { layer.msg(res.msg, {time: 1000,icon: 2}); } @@ -1650,90 +1732,118 @@ function toProxy(siteName, type, obj) { var data = {siteName: siteName,id: obj}; $.post('/site/get_proxy_conf', data, function(res) { layer.close(laoding); - if (res.status == true) { - var mBody = "
      \ - \ -
      \ -
        \ -
      • 此处为反向代理配置文件,若您不了解配置规则,请勿随意修改.
      • \ -
      \ -
      \ -
      "; - var editor; - var index = layer.open({ - type: 1, - title: '编辑配置文件', - closeBtn: 1, - shadeClose: true, - area: ['500px', '500px'], - btn: ['提交','关闭'], - content: mBody, - success: function () { - editor = CodeMirror.fromTextArea(document.getElementById("configProxyBody"), { - extraKeys: {"Ctrl-Space": "autocomplete"}, - lineNumbers: true, - matchBrackets:true, - }); - editor.focus(); - $(".CodeMirror-scroll").css({"height":"300px","margin":0,"padding":0}); - $("#onlineEditFileBtn").unbind('click'); - }, - yes:function(index,layero){ - $("#configProxyBody").empty().text(editor.getValue()); - var load = layer.load(); - var data = { - siteName: siteName, - id: obj, - config: editor.getValue(), - }; - - $.post('/site/save_proxy_conf', data, function(res) { - layer.close(load) - if (res.status == true) { - layer.msg('保存成功', {icon: 1}); - layer.close(index); - } else { - layer.msg(res.msg, {time: 3000,icon: 2}); - } - },'json'); - return true; - }, - }); - } else { + if (!res.status){ layer.msg('请求错误!!', {time: 3000,icon: 2}); + return; } + + var mBody = "
      \ + \ +
      \ +
        \ +
      • 此处为反向代理配置文件,若您不了解配置规则,请勿随意修改.
      • \ +
      \ +
      \ +
      "; + var editor; + var index = layer.open({ + type: 1, + title: '编辑配置文件', + closeBtn: 1, + shadeClose: true, + area: ['500px', '500px'], + btn: ['提交','关闭'], + content: mBody, + success: function () { + editor = CodeMirror.fromTextArea(document.getElementById("configProxyBody"), { + extraKeys: {"Ctrl-Space": "autocomplete"}, + lineNumbers: true, + matchBrackets:true, + }); + editor.focus(); + $(".CodeMirror-scroll").css({"height":"300px","margin":0,"padding":0}); + $("#onlineEditFileBtn").unbind('click'); + }, + yes:function(index,layero){ + $("#configProxyBody").empty().text(editor.getValue()); + var load = layer.load(); + var data = { + siteName: siteName, + id: obj, + config: editor.getValue(), + }; + + $.post('/site/save_proxy_conf', data, function(res) { + layer.close(load) + if (res.status == true) { + layer.msg('保存成功', {icon: 1}); + layer.close(index); + } else { + layer.msg(res.msg, {time: 3000,icon: 2}); + } + },'json'); + return true; + }, + }); },'json'); - return + return; } if (type == 10 || type == 11) { //[11]启动 或 停止[10] status = type==10 ? '0' : '1'; var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); - $.post('/site/set_proxy_status', {siteName: siteName,'status':status,'id':obj}, function(res) { + $.post('/site/set_proxy_status', {siteName: siteName,'status':status,'id':obj}, function(rdata) { layer.close(loading); - if (res.status == true) { - layer.msg('设置成功', {icon: 1}); - toProxy(siteName); - } else { + if (!rdata.status){ layer.msg(res.msg, {time: 3000,icon: 2}); + return; } + + showMsg("设置成功",function(){ + toProxy(siteName); + },{icon: 1,time:2000}); + },'json'); + return; + } + + if (type == 20 || type == 21) { + //[20] 开始缓存 或 [21] 停止缓存 + var status = type == 20 ? 'on' : ''; + obj['open_cache'] = status; + obj['siteName'] = siteName; + + var loading = layer.msg('正在提交请求...',{icon:16,time:0,shade: [0.3, '#000']}); + $.post('/site/set_proxy',obj, function(rdata) { + layer.close(loading); + if (!rdata.status){ + layer.msg(rdata.msg, {icon: 2,time:2000}); + return; + } + + showMsg("设置成功!",function(){ + toProxy(siteName); + },{icon: 1, time:2000}); },'json'); return; } var body = '
      \
      \ - \ + \
      \
      \ \ \ \ - \ - \ - \ - \ + \ + \ + \ + \ + \ + \ \ \ \ @@ -1745,28 +1855,64 @@ function toProxy(siteName, type, obj) { var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); $.post("/site/get_proxy_list", {siteName: siteName},function (res) { layer.close(loading); - if (res.status === true) { - let data = res.data.result; - data.forEach(function(item){ - var switchProxy = ''; - if (!item['status']){ - switchProxy = ''; - } - - let tmp = '\ - \ - \ - \ - \ - '; - $("#md-301-body").append(tmp); - }) - } else { + if (!res.status){ layer.msg(res.msg, {icon:2}); + return; } + + var data = res.data.result; + for (var i = 0; i < data.length; i++) { + var item = data[i]; + + var switchProxy = ''; + if (!item['status']){ + switchProxy = ''; + } + + var openCache = '未开启'; + if (item['open_cache'] == 'on'){ + openCache = '已开启'; + } + + let tmp = '\ + \ + \ + \ + \ + \ + \ + '; + $("#md-301-body").append(tmp); + } + + $('#md-301-body .detail').click(function(){ + var index = $(this).data('index'); + toProxy(siteName, 3 ,data[index]['id']); + }); + + $('#md-301-body .edit').click(function(){ + var index = $(this).data('index'); + toProxy(siteName, 1 ,data[index]); + }); + + $('#md-301-body .delete').click(function(){ + var index = $(this).data('index'); + toProxy(siteName, 2 ,data[index]['id']); + }); + + $('#md-301-body .cache').click(function(){ + var index = $(this).data('index'); + if ($(this).hasClass('on')){ + toProxy(siteName, 21 ,data[index]); + } else{ + toProxy(siteName, 20 ,data[index]); + } + }); + },'json'); ///////// } @@ -1779,7 +1925,8 @@ function sslAdmin(siteName){ var rdata = data['data']; var tbody = ''; for(var i=0;i\ + tbody += '\ + \ \ \ \ diff --git a/route/static/css/site.css b/route/static/css/site.css index bdc165014..2e606b418 100755 --- a/route/static/css/site.css +++ b/route/static/css/site.css @@ -4503,7 +4503,7 @@ html .menu .menu_exit:hover { margin-right: 3px; } /*微信二维码*/ - .boxConter { +.boxConter { height: 458px; position: relative; overflow: auto; @@ -4854,3 +4854,21 @@ select[disabled]{ font-weight: 400; } +#form_proxy .sub-groud .bt-input-text{ + margin-right: 10px; +} +#form_proxy .sub-groud { + margin-bottom: 15px; +} +#form_proxy .btswitch-btn{ + display:inline-block; +} +#form_proxy .add-replace-prosy { + position: relative; + top: -10px; +} +#form_proxy .disabled{ + background-color: #eee !important; + cursor: default; + border: 1px solid #dbdbea; +} From 2a7e21951bba73f2d2de35aaefb3ad1f73043fed Mon Sep 17 00:00:00 2001 From: midoks Date: Fri, 4 Aug 2023 22:49:18 +0800 Subject: [PATCH 22/42] Update my8.0.cnf --- plugins/mysql/conf/my8.0.cnf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/mysql/conf/my8.0.cnf b/plugins/mysql/conf/my8.0.cnf index 0e95574a7..08463a893 100644 --- a/plugins/mysql/conf/my8.0.cnf +++ b/plugins/mysql/conf/my8.0.cnf @@ -8,8 +8,8 @@ default-character-set = UTF8MB4 [mysqld] !include {$SERVER_APP_PATH}/etc/mode/classic.cnf -sha256_password_private_key_path=mysql.pem -sha256_password_public_key_path=mysql.pub +sha256_password_private_key_path={$SERVER_APP_PATH}/data/mysql.pem +sha256_password_public_key_path={$SERVER_APP_PATH}/data/mysql.pub authentication_policy=mysql_native_password pid-file = {$SERVER_APP_PATH}/data/mysql.pid From 0c2c136097dbc8a147ea087df787287e4fbdb2bb Mon Sep 17 00:00:00 2001 From: midoks Date: Fri, 4 Aug 2023 23:58:21 +0800 Subject: [PATCH 23/42] Update index.py --- plugins/mysql/index.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index a1fc276e3..c7a8b97a7 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -251,6 +251,14 @@ def initDreplace(version=''): return file_bin +def process_status(): + cmd = "ps -ef|grep mysql |grep -v grep | grep -v python | awk '{print $2}'" + data = mw.execShell(cmd) + if data[0] == '': + return 'stop' + return 'start' + + def status(version=''): path = getConf() if not os.path.exists(path): @@ -450,7 +458,7 @@ def initMysqlPwd(): def initMysql8Pwd(): - time.sleep(2) + time.sleep(1) serverdir = getServerDir() myconf = serverdir + "/etc/my.cnf" @@ -540,7 +548,12 @@ def my8cmd(version, method): else: mw.execShell('systemctl start mysql') - initMysql8Pwd() + for x in range(10): + mydb_status = process_status() + if mydb_status == 'start': + initMysql8Pwd() + break + time.sleep(1) if mw.isAppleSystem(): cmd_init_stop = init_file + ' stop' From 7432548ff9188225e0d382428cad2c6ca5c3c774 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 00:24:35 +0800 Subject: [PATCH 24/42] Update index.py --- plugins/mysql/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index c7a8b97a7..25aea89ad 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -458,7 +458,7 @@ def initMysqlPwd(): def initMysql8Pwd(): - time.sleep(1) + time.sleep(3) serverdir = getServerDir() myconf = serverdir + "/etc/my.cnf" From 67c899fc8485b2e06f14d40e3dc6377f6daa1133 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 00:43:06 +0800 Subject: [PATCH 25/42] Update index.py --- plugins/mysql/index.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 25aea89ad..0d3f9993d 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -167,7 +167,6 @@ def pMysqlDb(): def makeInitRsaKey(version=''): datadir = getServerDir() + "/data" - mysql_pem = datadir + "/mysql.pem" if not os.path.exists(mysql_pem): rdata = mw.execShell( @@ -575,11 +574,11 @@ def my8cmd(version, method): def appCMD(version, action): + makeInitRsaKey(version) if version == '8.0' or version == '5.7': status = my8cmd(version, action) else: status = myOp(version, action) - makeInitRsaKey(version) return status From d1e2781eb97800be37a4af021060e674ca06da70 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 00:44:48 +0800 Subject: [PATCH 26/42] Update index.py --- plugins/mysql/index.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 0d3f9993d..5e5563f0c 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -176,11 +176,11 @@ def makeInitRsaKey(version=''): 'cd ' + datadir + ' && openssl rsa -in mysql.pem -pubout -out mysql.pub') # print(rdata) - if not mw.isAppleSystem(): - mw.execShell('cd ' + datadir + ' && chmod 400 mysql.pem') - mw.execShell('cd ' + datadir + ' && chmod 444 mysql.pub') - mw.execShell('cd ' + datadir + ' && chown mysql:mysql mysql.pem') - mw.execShell('cd ' + datadir + ' && chown mysql:mysql mysql.pub') + if not mw.isAppleSystem(): + mw.execShell('cd ' + datadir + ' && chmod 400 mysql.pem') + mw.execShell('cd ' + datadir + ' && chmod 444 mysql.pub') + mw.execShell('cd ' + datadir + ' && chown mysql:mysql mysql.pem') + mw.execShell('cd ' + datadir + ' && chown mysql:mysql mysql.pub') def initDreplace(version=''): From cafe58f3fce6e8df996090eb46fb32c6f10334b4 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 00:45:04 +0800 Subject: [PATCH 27/42] Update index.py --- plugins/mysql/index.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 5e5563f0c..5eb4e22b4 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -175,7 +175,6 @@ def makeInitRsaKey(version=''): rdata = mw.execShell( 'cd ' + datadir + ' && openssl rsa -in mysql.pem -pubout -out mysql.pub') # print(rdata) - if not mw.isAppleSystem(): mw.execShell('cd ' + datadir + ' && chmod 400 mysql.pem') mw.execShell('cd ' + datadir + ' && chmod 444 mysql.pub') From 5b8cca24aafae3215bafd8fabeb9042472a03e58 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 00:46:41 +0800 Subject: [PATCH 28/42] Update index.py --- plugins/mysql/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 5eb4e22b4..d9a53c47e 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -456,7 +456,7 @@ def initMysqlPwd(): def initMysql8Pwd(): - time.sleep(3) + time.sleep(6) serverdir = getServerDir() myconf = serverdir + "/etc/my.cnf" From a04e05c7e8aad64c46cb43c270bc0b66e9dd7d02 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 01:19:42 +0800 Subject: [PATCH 29/42] Update index.py --- plugins/mysql/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index d9a53c47e..5df44bec0 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -456,7 +456,7 @@ def initMysqlPwd(): def initMysql8Pwd(): - time.sleep(6) + time.sleep(10) serverdir = getServerDir() myconf = serverdir + "/etc/my.cnf" From c5207961f3d5058f06428edeb238797e880d58fb Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 01:52:49 +0800 Subject: [PATCH 30/42] Update index.py --- plugins/mysql/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 5df44bec0..8f78dd946 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -456,7 +456,7 @@ def initMysqlPwd(): def initMysql8Pwd(): - time.sleep(10) + time.sleep(8) serverdir = getServerDir() myconf = serverdir + "/etc/my.cnf" From 68727cbe91285e3b2c8e9ecd287c36fb1d2974fa Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 11:28:33 +0800 Subject: [PATCH 31/42] Update site_api.py --- class/core/site_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class/core/site_api.py b/class/core/site_api.py index 0cc2f678a..12b16d858 100755 --- a/class/core/site_api.py +++ b/class/core/site_api.py @@ -2467,7 +2467,7 @@ location ^~ {from} {\n\ return 404; } } - # SECURITY-END + #SECURITY-END include %s/enable-php-''' % (fix.strip().replace(',', '|'), domains.strip().replace(',', ' '), pre_path) conf = re.sub(re_path, rconf, conf) mw.writeLog('网站管理', '站点[' + name + ']已开启防盗链!') From 501af3da157ee16c2c3ff2e5151534b91216a02b Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 12:01:46 +0800 Subject: [PATCH 32/42] Update plugins_api.py --- class/core/plugins_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class/core/plugins_api.py b/class/core/plugins_api.py index 97248eba1..936c0b444 100755 --- a/class/core/plugins_api.py +++ b/class/core/plugins_api.py @@ -139,7 +139,7 @@ class plugins_api: def initApi(self): plugin_names = { - 'openresty': '1.21.4.1', + 'openresty': '1.21.4.2', 'php': '56', 'swap': '1.1', 'mysql': '5.7', From 7f42054a141bcf0f85a075a7dfa036e576e32c38 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 12:29:39 +0800 Subject: [PATCH 33/42] Update ubuntu.sh --- scripts/install/ubuntu.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/install/ubuntu.sh b/scripts/install/ubuntu.sh index ba774f0fd..a5a9953c7 100644 --- a/scripts/install/ubuntu.sh +++ b/scripts/install/ubuntu.sh @@ -24,7 +24,8 @@ apt install -y locate locale-gen en_US.UTF-8 localedef -v -c -i en_US -f UTF-8 en_US.UTF-8 -SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +SSH_PORT_LINE=`cat /etc/ssh/sshd_config |grep Port | grep 22| tail -1` +SSH_PORT=${SSH_PORT_LINE/"Port "/""} echo "SSH PORT:${SSH_PORT}" if [ -f /usr/sbin/ufw ];then From e6b493237ddcf7079990250685b74804cb52396e Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 13:36:13 +0800 Subject: [PATCH 34/42] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=AE=89=E8=A3=85SSH=E7=AB=AF=E5=8F=A3=E8=AF=86?= =?UTF-8?q?=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + class/core/common.py | 14 ++++++++++++++ data/sql/default.sql | 5 ++--- scripts/install/alma.sh | 4 ++++ scripts/install/amazon.sh | 4 ++++ scripts/install/arch.sh | 4 ++++ scripts/install/debian.sh | 6 ++++++ scripts/install/fedora.sh | 4 ++++ scripts/install/freebsd.sh | 4 ++++ scripts/install/opensuse.sh | 4 ++++ scripts/install/rhel.sh | 4 ++++ scripts/install/ubuntu.sh | 7 +++++-- 12 files changed, 56 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 69626ac5c..27a6c7c0b 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443: * 使用mariadb二进制导入备份文件 * docker插件-镜像导入导出功能 * 网站设置反向代理升级功能 +* 优化初始化安装SSH端口识别 ### JSDelivr安装地址 diff --git a/class/core/common.py b/class/core/common.py index d44336015..311a100e4 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -33,6 +33,7 @@ from flask import redirect def init(): initDB() + initDBSshPort() initUserInfo() initInitD() initInitTask() @@ -62,6 +63,19 @@ def initDB(): print(str(ex)) +def initDBSshPort(): + # SSH端口必须放开 + import firewall_api + ssh_port = mw.execShell( + "cat /etc/ssh/sshd_config | grep 'Port \d*' | tail -1") + ssh_port = ssh_port.replace("Port ", '') + + if ssh_port == '': + firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH端口', 'port') + else: + firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH端口', 'port') + + def doContentReplace(src, dst): content = mw.readFile(src) content = content.replace("{$SERVER_PATH}", mw.getRunDir()) diff --git a/data/sql/default.sql b/data/sql/default.sql index 8cdd9bf63..6797e84ba 100755 --- a/data/sql/default.sql +++ b/data/sql/default.sql @@ -46,9 +46,8 @@ CREATE TABLE IF NOT EXISTS `firewall` ( INSERT INTO `firewall` (`id`, `port`, `ps`, `addtime`) VALUES (1, '80', '网站默认端口', '0000-00-00 00:00:00'), -(2, '22', 'SSH远程管理服务', '0000-00-00 00:00:00'), -(3, '443', 'HTTPS', '0000-00-00 00:00:00'), -(4, '888', 'phpMyAdmin默认端口', '0000-00-00 00:00:00'); +(2, '443', 'HTTPS', '0000-00-00 00:00:00'), +(3, '888', 'phpMyAdmin默认端口', '0000-00-00 00:00:00'); diff --git a/scripts/install/alma.sh b/scripts/install/alma.sh index cfee31f39..2aadcf3c9 100755 --- a/scripts/install/alma.sh +++ b/scripts/install/alma.sh @@ -15,6 +15,10 @@ dnf install -y crontabs dnf install -y mysql-devel SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # if [ -f /usr/sbin/iptables ];then diff --git a/scripts/install/amazon.sh b/scripts/install/amazon.sh index 9a1d953fc..b857bb4ee 100755 --- a/scripts/install/amazon.sh +++ b/scripts/install/amazon.sh @@ -22,6 +22,10 @@ yum install -y mysql-devel yum install -y expect SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # if [ -f /usr/sbin/iptables ];then diff --git a/scripts/install/arch.sh b/scripts/install/arch.sh index e6ce01131..4928d4f1b 100644 --- a/scripts/install/arch.sh +++ b/scripts/install/arch.sh @@ -55,6 +55,10 @@ echo y | pacman -Syu icu hwclock --systohc SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # if [ -f /usr/sbin/iptables ];then diff --git a/scripts/install/debian.sh b/scripts/install/debian.sh index c6508648c..481897bb7 100644 --- a/scripts/install/debian.sh +++ b/scripts/install/debian.sh @@ -26,8 +26,14 @@ fi ntpdate $NTPHOST | logger -t NTP SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" + + # choose lang cmd # dpkg-reconfigure --frontend=noninteractive locales if [ ! -f /usr/sbin/locale-gen ];then diff --git a/scripts/install/fedora.sh b/scripts/install/fedora.sh index 97ac1520d..95f77915b 100644 --- a/scripts/install/fedora.sh +++ b/scripts/install/fedora.sh @@ -18,6 +18,10 @@ yum install -y expect dnf install crontabs -y SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # if [ -f /usr/sbin/iptables ];then diff --git a/scripts/install/freebsd.sh b/scripts/install/freebsd.sh index a398c8c1b..21d413a0c 100644 --- a/scripts/install/freebsd.sh +++ b/scripts/install/freebsd.sh @@ -40,6 +40,10 @@ pkg install -y harfbuzz pkg autoremove -y SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # if [ -f /usr/sbin/iptables ];then diff --git a/scripts/install/opensuse.sh b/scripts/install/opensuse.sh index 8655db800..9f1b20500 100644 --- a/scripts/install/opensuse.sh +++ b/scripts/install/opensuse.sh @@ -53,6 +53,10 @@ zypper install -y freetype2-devel # zypper install -y php-config SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # if [ -f /usr/sbin/iptables ];then diff --git a/scripts/install/rhel.sh b/scripts/install/rhel.sh index d5e88133b..7a21c670c 100644 --- a/scripts/install/rhel.sh +++ b/scripts/install/rhel.sh @@ -48,6 +48,10 @@ if [ ! -d /root/.acme.sh ];then fi SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" # redhat , iptables no default diff --git a/scripts/install/ubuntu.sh b/scripts/install/ubuntu.sh index a5a9953c7..99bc148af 100644 --- a/scripts/install/ubuntu.sh +++ b/scripts/install/ubuntu.sh @@ -24,8 +24,11 @@ apt install -y locate locale-gen en_US.UTF-8 localedef -v -c -i en_US -f UTF-8 en_US.UTF-8 -SSH_PORT_LINE=`cat /etc/ssh/sshd_config |grep Port | grep 22| tail -1` -SSH_PORT=${SSH_PORT_LINE/"Port "/""} +SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` +if [ "$SSH_PORT" == "" ];then + SSH_PORT_LINE=`cat /etc/ssh/sshd_config | grep "Port \d*" | tail -1` + SSH_PORT=${SSH_PORT_LINE/"Port "/""} +fi echo "SSH PORT:${SSH_PORT}" if [ -f /usr/sbin/ufw ];then From 3addb46708826aa17b7794bcc3c01a1e30453ec7 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 13:46:19 +0800 Subject: [PATCH 35/42] Update common.py --- class/core/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/class/core/common.py b/class/core/common.py index 311a100e4..9cd1a5a45 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -71,9 +71,9 @@ def initDBSshPort(): ssh_port = ssh_port.replace("Port ", '') if ssh_port == '': - firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH端口', 'port') + firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH远程管理服务', 'port') else: - firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH端口', 'port') + firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port') def doContentReplace(src, dst): From d9f99e6b7c8cc82d68f75392097d0afa8a6073b9 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 14:17:01 +0800 Subject: [PATCH 36/42] Update common.py --- class/core/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/class/core/common.py b/class/core/common.py index 9cd1a5a45..4f3ee753e 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -66,9 +66,9 @@ def initDB(): def initDBSshPort(): # SSH端口必须放开 import firewall_api - ssh_port = mw.execShell( + cmd_data = mw.execShell( "cat /etc/ssh/sshd_config | grep 'Port \d*' | tail -1") - ssh_port = ssh_port.replace("Port ", '') + ssh_port = cmd_data[0].replace("Port ", '') if ssh_port == '': firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH远程管理服务', 'port') From 5aca7d7c26cc6b23c9a1f5e2c39562d5fc8d8abd Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 14:17:16 +0800 Subject: [PATCH 37/42] Update common.py --- class/core/common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/class/core/common.py b/class/core/common.py index 4f3ee753e..d503fa14b 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -69,7 +69,6 @@ def initDBSshPort(): cmd_data = mw.execShell( "cat /etc/ssh/sshd_config | grep 'Port \d*' | tail -1") ssh_port = cmd_data[0].replace("Port ", '') - if ssh_port == '': firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH远程管理服务', 'port') else: From 8040c8c67abbacdf05d4254f44eecb0aeb50c49d Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 14:21:25 +0800 Subject: [PATCH 38/42] Update common.py --- class/core/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class/core/common.py b/class/core/common.py index d503fa14b..ffbc5fbec 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -68,7 +68,7 @@ def initDBSshPort(): import firewall_api cmd_data = mw.execShell( "cat /etc/ssh/sshd_config | grep 'Port \d*' | tail -1") - ssh_port = cmd_data[0].replace("Port ", '') + ssh_port = cmd_data[0].replace("Port ", '').strip() if ssh_port == '': firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH远程管理服务', 'port') else: From 961c3423fd42a3a94369dc0e25e1c3df9dc5a9ce Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 14:29:52 +0800 Subject: [PATCH 39/42] Update common.py --- class/core/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class/core/common.py b/class/core/common.py index ffbc5fbec..20d10447d 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -67,7 +67,7 @@ def initDBSshPort(): # SSH端口必须放开 import firewall_api cmd_data = mw.execShell( - "cat /etc/ssh/sshd_config | grep 'Port \d*' | tail -1") + "cat /etc/ssh/sshd_config | grep '^Port \d*' | tail -1") ssh_port = cmd_data[0].replace("Port ", '').strip() if ssh_port == '': firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH远程管理服务', 'port') From b578f2fddc11150ac9c54b1d18d7018ad8c52e25 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 14:42:43 +0800 Subject: [PATCH 40/42] Update common.py --- class/core/common.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/class/core/common.py b/class/core/common.py index 20d10447d..f2153b1f6 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -70,9 +70,8 @@ def initDBSshPort(): "cat /etc/ssh/sshd_config | grep '^Port \d*' | tail -1") ssh_port = cmd_data[0].replace("Port ", '').strip() if ssh_port == '': - firewall_api.firewall_api().addAcceptPortArgs(22, 'SSH远程管理服务', 'port') - else: - firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port') + ssh_port = 22 + firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port') def doContentReplace(src, dst): From 4225d4c0402bfb7090140d62f6418e72044f4dd7 Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 14:43:14 +0800 Subject: [PATCH 41/42] Update common.py --- class/core/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class/core/common.py b/class/core/common.py index f2153b1f6..28f624fc6 100755 --- a/class/core/common.py +++ b/class/core/common.py @@ -70,7 +70,7 @@ def initDBSshPort(): "cat /etc/ssh/sshd_config | grep '^Port \d*' | tail -1") ssh_port = cmd_data[0].replace("Port ", '').strip() if ssh_port == '': - ssh_port = 22 + ssh_port = '22' firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port') From 8e16cbf7f9fca910a8239959faa80e9a50a0e1ab Mon Sep 17 00:00:00 2001 From: midoks Date: Sat, 5 Aug 2023 15:06:22 +0800 Subject: [PATCH 42/42] 0.15.2 --- class/core/config_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/class/core/config_api.py b/class/core/config_api.py index 751a7df54..ea50233dd 100755 --- a/class/core/config_api.py +++ b/class/core/config_api.py @@ -27,7 +27,7 @@ from flask import request class config_api: - __version = '0.15.1' + __version = '0.15.2' __api_addr = 'data/api.json' def __init__(self):
      代理目录目标地址状态操作名称代理目录目标地址缓存状态操作
      '+item.from+''+item.to+''+switchProxy+'\ - 详细 |\ - 删除\ -
      '+item.name+''+item.from+''+item.to+''+openCache+''+switchProxy+'\ + 详细 |\ + 编辑 |\ + 删除\ +
      '+rdata[i].subject+''+rdata[i].dns.join('
      ')+'
      '+rdata[i].notAfter+''+rdata[i].issuer.split(' ')[0]+'