Compare commits

..
64 Commits
Author SHA1 Message Date
Mr Chen 59a2765b2f AD删除 2023-08-08 13:24:29 +08:00
Mr Chen 612c104cca Merge pull request #432 from midoks/dev
PHP - libzip库修复
2023-08-05 17:35:09 +08:00
midoks 550ca7681a Update libzip.sh 2023-08-05 17:31:16 +08:00
midoks 6a09706362 Update libzip.sh 2023-08-05 17:30:26 +08:00
midoks ca040e8986 Update install.sh 2023-08-05 17:23:52 +08:00
midoks 6fcc980d5d Update libzip.sh 2023-08-05 17:19:39 +08:00
midoks b69adc9c7d Update libzip.sh 2023-08-05 17:09:10 +08:00
midoks 67da343705 Update libzip.sh 2023-08-05 17:05:48 +08:00
midoks 4b47e27a54 Update libzip.sh 2023-08-05 17:01:05 +08:00
midoks fba3ddc9a5 Update libzip.sh 2023-08-05 16:44:39 +08:00
Mr Chen 4769ce5be8 Merge pull request #431 from midoks/dev
0.15.2
2023-08-05 15:12:37 +08:00
midoks 8e16cbf7f9 0.15.2 2023-08-05 15:06:22 +08:00
midoks 4225d4c040 Update common.py 2023-08-05 14:43:14 +08:00
midoks b578f2fddc Update common.py 2023-08-05 14:42:43 +08:00
midoks 961c3423fd Update common.py 2023-08-05 14:29:52 +08:00
midoks 8040c8c67a Update common.py 2023-08-05 14:21:25 +08:00
midoks 5aca7d7c26 Update common.py 2023-08-05 14:17:16 +08:00
midoks d9f99e6b7c Update common.py 2023-08-05 14:17:01 +08:00
midoks 3addb46708 Update common.py 2023-08-05 13:46:19 +08:00
midoks e6b493237d 优化初始化安装SSH端口识别 2023-08-05 13:36:13 +08:00
midoks 7f42054a14 Update ubuntu.sh 2023-08-05 12:29:39 +08:00
midoks 501af3da15 Update plugins_api.py 2023-08-05 12:01:46 +08:00
midoks 68727cbe91 Update site_api.py 2023-08-05 11:28:33 +08:00
midoks c5207961f3 Update index.py 2023-08-05 01:52:49 +08:00
midoks a04e05c7e8 Update index.py 2023-08-05 01:19:42 +08:00
midoks 5b8cca24aa Update index.py 2023-08-05 00:46:41 +08:00
midoks cafe58f3fc Update index.py 2023-08-05 00:45:04 +08:00
midoks d1e2781eb9 Update index.py 2023-08-05 00:44:48 +08:00
midoks 67c899fc84 Update index.py 2023-08-05 00:43:06 +08:00
midoks 7432548ff9 Update index.py 2023-08-05 00:24:35 +08:00
midoks 0c2c136097 Update index.py 2023-08-04 23:58:21 +08:00
midoks 2a7e21951b Update my8.0.cnf 2023-08-04 22:49:18 +08:00
midoks 066185e404 网站设置反向代理升级功能 2023-08-04 20:27:20 +08:00
midoks bd431f1647 docker阶段性完成 2023-08-03 18:37:14 +08:00
midoks 0a6e88d81d update 2023-08-03 17:00:12 +08:00
midoks 02c9988ef7 Update docker.js 2023-08-03 00:24:13 +08:00
midoks 5ee7df4a46 Update nginx.conf 2023-08-03 00:14:16 +08:00
midoks 5f382c0034 update 2023-08-03 00:06:01 +08:00
midoks 63d17c4d77 Update docker.js 2023-08-02 23:24:10 +08:00
midoks 38722c1dc2 Update index.py 2023-08-02 17:51:29 +08:00
midoks ea982b7261 Update README.md 2023-08-02 17:50:22 +08:00
midoks 73d9edced8 使用mariadb二进制导入备份文件 2023-08-02 17:36:27 +08:00
midoks af03c004a3 Update rsyncd.js 2023-08-02 15:35:30 +08:00
midoks ddd9e70ac2 Update rsyncd.js 2023-08-02 15:29:32 +08:00
midoks 8976a7a147 Update rsyncd.js 2023-08-02 15:26:55 +08:00
midoks 677ff8ec0c Update README.md 2023-08-02 15:10:42 +08:00
midoks 47d240e2b8 rsyncd添加优化 2023-08-02 15:10:23 +08:00
midoks 1f7bd76875 Update crontab_api.py 2023-08-02 14:27:04 +08:00
midoks f04c70f022 计划任务自动脚本运行时间 2023-08-02 14:04:00 +08:00
midoks 5044cc5db9 Update README.md 2023-08-02 00:06:51 +08:00
midoks 4329b90ac4 Update info.json 2023-08-01 23:58:10 +08:00
midoks f7873b6dcd Update init_cmd.py 2023-07-25 00:03:20 +08:00
midoks a80d666786 update 2023-07-24 23:52:38 +08:00
Mr Chen 0598704dce Merge pull request #428 from midoks/dev
修复centos9源安装问题
2023-07-22 12:54:17 +08:00
midoks 8f19a05755 Update rhel.sh 2023-07-22 12:53:07 +08:00
midoks f320d7cc69 Update rhel.sh 2023-07-22 12:26:56 +08:00
midoks 1e97929a24 Update push_notice_msg.py 2023-07-21 12:10:55 +08:00
Mr Chen c66bbac97e Merge pull request #427 from midoks/dev
python3.7 urllib3在亚马逊降级
2023-07-20 16:14:22 +08:00
midoks 1f7a0d2795 Create r3.7.txt 2023-07-20 16:04:18 +08:00
midoks f05ce79e63 Update rhel.sh 2023-07-20 15:55:11 +08:00
midoks 9f3d06191a PHP提示优化 2023-07-19 18:35:27 +08:00
Mr Chen 2c6614a5ff Merge pull request #426 from midoks/dev
赞助换域名
2023-07-18 15:23:49 +08:00
midoks 905bad29cf Update README.md 2023-07-18 15:22:19 +08:00
midoks 9ba572a8ce AD修改 2023-07-16 17:23:45 +08:00
46 changed files with 1311 additions and 628 deletions
+9 -12
View File
@@ -79,7 +79,7 @@ PHP[72-82]支持phpMyAdmin[5.2.0]
# 特别赞助 # 特别赞助
- [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan.la/) - [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan.pw/)
# AD - VPS推荐 - 🙏 # AD - VPS推荐 - 🙏
@@ -88,7 +88,6 @@ PHP[72-82]支持phpMyAdmin[5.2.0]
| 服务商 | LOGO | 推广地址 | 优惠码 | | 服务商 | LOGO | 推广地址 | 优惠码 |
| ------------- |----------|-----------|-------| | ------------- |----------|-----------|-------|
| digitalvirt |[![digitalvirt](https://digitalvirt.com/templates/BlueWhite/img/logo-dark.svg)](https://digitalvirt.com/aff.php?aff=154) | https://digitalvirt.com/aff.php?aff=154 | mdserver-web | | digitalvirt |[![digitalvirt](https://digitalvirt.com/templates/BlueWhite/img/logo-dark.svg)](https://digitalvirt.com/aff.php?aff=154) | https://digitalvirt.com/aff.php?aff=154 | mdserver-web |
| mvirtua |[![mvirtua](https://mvirtua.com/upload/logo-black.png)](https://mvirtua.com/aff/FUSKXVDH) | https://mvirtua.com/aff/FUSKXVDH | mdserver-web (全场8折)|
# Docker # Docker
@@ -100,17 +99,15 @@ 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。 * rsyncd添加优化
* nezha保存优化。 * 使用mariadb二进制导入备份文件
* OP防火墙优化(站点配置-状态关闭后,不再防御)-已安装的,需要重载。 * docker插件-镜像导入导出功能
* 修复子目录绑定-伪静态问题。 * 网站设置反向代理升级功能
* [插件]docker - 添加IP地址池。 * 优化初始化安装SSH端口识别
* PHP下载中国优化。
* 监控页面-自定义时间优化。
### JSDelivr安装地址 ### JSDelivr安装地址
+12
View File
@@ -33,6 +33,7 @@ from flask import redirect
def init(): def init():
initDB() initDB()
initDBSshPort()
initUserInfo() initUserInfo()
initInitD() initInitD()
initInitTask() initInitTask()
@@ -62,6 +63,17 @@ def initDB():
print(str(ex)) print(str(ex))
def initDBSshPort():
# SSH端口必须放开
import firewall_api
cmd_data = mw.execShell(
"cat /etc/ssh/sshd_config | grep '^Port \d*' | tail -1")
ssh_port = cmd_data[0].replace("Port ", '').strip()
if ssh_port == '':
ssh_port = '22'
firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port')
def doContentReplace(src, dst): def doContentReplace(src, dst):
content = mw.readFile(src) content = mw.readFile(src)
content = content.replace("{$SERVER_PATH}", mw.getRunDir()) content = content.replace("{$SERVER_PATH}", mw.getRunDir())
+1 -1
View File
@@ -27,7 +27,7 @@ from flask import request
class config_api: class config_api:
__version = '0.15.1' __version = '0.15.2'
__api_addr = 'data/api.json' __api_addr = 'data/api.json'
def __init__(self): def __init__(self):
+21 -2
View File
@@ -508,6 +508,22 @@ class crontab_api:
else: else:
head = "#!/bin/bash\nPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin\nexport PATH\n" head = "#!/bin/bash\nPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin\nexport PATH\n"
start_head = '''
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`
'''
source_bin_activate = ''' source_bin_activate = '''
export LANG=en_US.UTF-8 export LANG=en_US.UTF-8
MW_PATH=%s/bin/activate MW_PATH=%s/bin/activate
@@ -515,7 +531,7 @@ if [ -f $MW_PATH ];then
source $MW_PATH source $MW_PATH
fi''' % (mw.getRunDir(),) fi''' % (mw.getRunDir(),)
head = head + source_bin_activate + "\n" head = head + start_head + source_bin_activate + "\n"
log = '.log' log = '.log'
script_dir = mw.getRunDir() + "/scripts" script_dir = mw.getRunDir() + "/scripts"
@@ -557,7 +573,10 @@ fi''' % (mw.getRunDir(),)
shell += ''' shell += '''
echo "----------------------------------------------------------------------------" echo "----------------------------------------------------------------------------"
endDate=`date +"%Y-%m-%d %H:%M:%S"` 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 "----------------------------------------------------------------------------" echo "----------------------------------------------------------------------------"
''' '''
cronPath = mw.getServerDir() + '/cron' cronPath = mw.getServerDir() + '/cron'
+6
View File
@@ -1215,6 +1215,12 @@ def formatDate(format="%Y-%m-%d %H:%M:%S", times=None):
return time.strftime(format, time_local) 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): def checkIp(ip):
# 检查是否为IPv4地址 # 检查是否为IPv4地址
import re import re
+1 -1
View File
@@ -139,7 +139,7 @@ class plugins_api:
def initApi(self): def initApi(self):
plugin_names = { plugin_names = {
'openresty': '1.21.4.1', 'openresty': '1.21.4.2',
'php': '56', 'php': '56',
'swap': '1.1', 'swap': '1.1',
'mysql': '5.7', 'mysql': '5.7',
+90 -38
View File
@@ -1870,19 +1870,16 @@ class site_api:
if _id == '' or _siteName == '': if _id == '' or _siteName == '':
return mw.returnJson(False, "必填项不能为空!") return mw.returnJson(False, "必填项不能为空!")
_old_config = mw.readFile( proxy_file = "{}/{}/{}.conf".format(self.proxyPath, _siteName, _id)
"{}/{}/{}.conf".format(self.proxyPath, _siteName, _id)) mw.backFile(proxy_file)
if _old_config == False: mw.writeFile(proxy_file, _config)
return mw.returnJson(False, "非法操作")
mw.writeFile("{}/{}/{}.conf".format(self.proxyPath,
_siteName, _id), _config)
rule_test = mw.checkWebConfig() rule_test = mw.checkWebConfig()
if rule_test != True: if rule_test != True:
mw.writeFile("{}/{}/{}.conf".format(self.proxyPath, mw.restoreFile(proxy_file)
_siteName, _id), _old_config) mw.removeBackFile(proxy_file)
return mw.returnJson(False, "OpenResty 配置测试不通过, 请重试: {}".format(rule_test)) return mw.returnJson(False, "OpenResty 配置测试不通过, 请重试: {}".format(rule_test))
mw.removeBackFile(proxy_file)
self.operateRedirectConf(_siteName, 'start') self.operateRedirectConf(_siteName, 'start')
mw.restartWeb() mw.restartWeb()
return mw.returnJson(True, "ok") return mw.returnJson(True, "ok")
@@ -1923,21 +1920,20 @@ class site_api:
_from = request.form.get('from', '') _from = request.form.get('from', '')
_to = request.form.get('to', '') _to = request.form.get('to', '')
_host = request.form.get('host', '') _host = request.form.get('host', '')
_name = request.form.get('name', '')
_open_proxy = request.form.get('open_proxy', '') _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, "必填项不能为空") 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})+.?" 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): if not re.match(rep, _to):
return mw.returnJson(False, "错误的目标地址!") return mw.returnJson(False, "错误的目标地址!")
# _to = _to.strip("/")
# get host from url # get host from url
try: try:
if _host == "$host": if _host == "$host":
@@ -1946,7 +1942,11 @@ class site_api:
except: except:
return mw.returnJson(False, "错误的目标地址") 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\ tpl = "#PROXY-START\n\
location ^~ {from} {\n\ location ^~ {from} {\n\
proxy_pass {to};\n\ proxy_pass {to};\n\
@@ -1954,11 +1954,28 @@ location ^~ {from} {\n\
proxy_set_header X-Real-IP $remote_addr;\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 X-Forwarded-For $proxy_add_x_forwarded_for;\n\
proxy_set_header REMOTE-HOST $remote_addr;\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\ \n\
add_header X-Cache $upstream_cache_status;\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\ \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\ set $static_files_app 0; \n\
if ( $uri ~* \"\.(gif|png|jpg|css|js|woff|woff2)$\" )\n\ if ( $uri ~* \"\.(gif|png|jpg|css|js|woff|woff2)$\" )\n\
{\n\ {\n\
@@ -1969,8 +1986,7 @@ location ^~ {from} {\n\
{\n\ {\n\
add_header Cache-Control no-cache;\n\ add_header Cache-Control no-cache;\n\
}\n\ }\n\
}\n\ "
#PROXY-END"
# replace # replace
if _from[0] != '/': if _from[0] != '/':
@@ -1978,28 +1994,69 @@ location ^~ {from} {\n\
tpl = tpl.replace("{from}", _from, 999) tpl = tpl.replace("{from}", _from, 999)
tpl = tpl.replace("{to}", _to) tpl = tpl.replace("{to}", _to)
tpl = tpl.replace("{host}", _host, 999) tpl = tpl.replace("{host}", _host, 999)
tpl = tpl.replace("{cache_time}", _cache_time, 999)
_id = mw.md5("{}+{}+{}".format(_from, _to, _siteName)) 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: for item in data:
if item["id"] == _id: if item["name"] == _name:
return mw.returnJson(False, "已存在该规则!") return mw.returnJson(False, "名称重复!")
if item["from"] == _from: if item["from"] == _from:
return mw.returnJson(False, "代理目录已存在!") return mw.returnJson(False, "代理目录已存在!")
data.append({ data.append({
"name": _name,
"from": _from, "from": _from,
"to": _to, "to": _to,
"host": _host, "host": _host,
"id": _id "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': if _open_proxy != 'on':
conf_file = "{}/{}.conf.txt".format( os.rename(conf_proxy, conf_bk)
self.getProxyPath(_siteName), _id)
mw.writeFile(data_path, json.dumps(data))
mw.writeFile(conf_file, tpl)
mw.writeFile(proxy_site_path, json.dumps(data))
self.operateProxyConf(_siteName, 'start') self.operateProxyConf(_siteName, 'start')
mw.restartWeb() mw.restartWeb()
return mw.returnJson(True, "ok", {"hash": _id}) return mw.returnJson(True, "ok", {"hash": _id})
@@ -2030,10 +2087,10 @@ location ^~ {from} {\n\
self.getProxyPath(_siteName), _id) self.getProxyPath(_siteName), _id)
mw.execShell(cmd) mw.execShell(cmd)
except: except:
return mw.returnJson(False, "删除失败!") return mw.returnJson(False, "删除反代失败!")
mw.restartWeb() mw.restartWeb()
return mw.returnJson(True, "删除成功!") return mw.returnJson(True, "删除反代成功!")
def getSiteTypesApi(self): def getSiteTypesApi(self):
# 取网站分类 # 取网站分类
@@ -2762,9 +2819,4 @@ location ^~ {from} {\n\
mw.execShell("chattr +i " + filename) mw.execShell("chattr +i " + filename)
return mw.returnJson(True, '已打开防跨站设置!') 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
+2 -3
View File
@@ -46,9 +46,8 @@ CREATE TABLE IF NOT EXISTS `firewall` (
INSERT INTO `firewall` (`id`, `port`, `ps`, `addtime`) VALUES INSERT INTO `firewall` (`id`, `port`, `ps`, `addtime`) VALUES
(1, '80', '网站默认端口', '0000-00-00 00:00:00'), (1, '80', '网站默认端口', '0000-00-00 00:00:00'),
(2, '22', 'SSH远程管理服务', '0000-00-00 00:00:00'), (2, '443', 'HTTPS', '0000-00-00 00:00:00'),
(3, '443', 'HTTPS', '0000-00-00 00:00:00'), (3, '888', 'phpMyAdmin默认端口', '0000-00-00 00:00:00');
(4, '888', 'phpMyAdmin默认端口', '0000-00-00 00:00:00');
+2 -9
View File
@@ -39,17 +39,10 @@ server
allow all; allow all;
} }
location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{ {
expires 30d; 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 /dev/null;
} }
+3 -10
View File
@@ -35,18 +35,11 @@ server
allow all; allow all;
} }
location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{ {
error_log /dev/null;
access_log /dev/null;
expires 30d; expires 30d;
error_log off;
access_log /dev/null;
}
location ~ .*\\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
} }
access_log {$LOGPATH}/{$SERVER_MAIN}_{$DIRBIND}.log; access_log {$LOGPATH}/{$SERVER_MAIN}_{$DIRBIND}.log;
+1
View File
@@ -40,6 +40,7 @@
<p onclick="pluginInitD('docker');">自启动</p> <p onclick="pluginInitD('docker');">自启动</p>
<p onclick="dockerConList();">容器列表</p> <p onclick="dockerConList();">容器列表</p>
<p onclick="dockerImageList();">镜像列表</p> <p onclick="dockerImageList();">镜像列表</p>
<p onclick="dockerImageOutput();">镜像导出</p>
<p onclick="dockerIpList();">IP地址池</p> <p onclick="dockerIpList();">IP地址池</p>
<p onclick="repoList();">仓库</p> <p onclick="repoList();">仓库</p>
</div> </div>
+135
View File
@@ -429,6 +429,92 @@ def dockerRemoveImage():
return mw.returnJson(False, '删除失败, 当前镜像正在使用!') 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): def dockerLoginCheck(user_name, user_pass, registry):
# 登陆验证 # 登陆验证
cmd = 'docker login -u=%s -p %s %s' % (user_name, user_pass, registry) cmd = 'docker login -u=%s -p %s %s' % (user_name, user_pass, registry)
@@ -523,6 +609,45 @@ def __release_port(port):
return "Release failed {}".format(e) 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(): def dockerCreateCon():
args = getArgs() args = getArgs()
data = checkArgs(args, ['environments', 'command', data = checkArgs(args, ['environments', 'command',
@@ -703,6 +828,14 @@ if __name__ == "__main__":
print(dockerPullReg()) print(dockerPullReg())
elif func == 'image_list': elif func == 'image_list':
print(imageListData()) 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': elif func == 'docker_get_iplist':
print(getDockerIpList()) print(getDockerIpList())
elif func == 'docker_del_ip': elif func == 'docker_del_ip':
@@ -715,6 +848,8 @@ if __name__ == "__main__":
print(dockerCreateCon()) print(dockerCreateCon())
elif func == 'docker_remove_image': elif func == 'docker_remove_image':
print(dockerRemoveImage()) print(dockerRemoveImage())
elif func == 'docker_port_check':
print(dockerPortCheck())
elif func == 'docker_login': elif func == 'docker_login':
print(dockerLogin()) print(dockerLogin())
elif func == 'docker_logout': elif func == 'docker_logout':
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"sort": 7, "sort": 7,
"ps": "Docker 是一个开源的应用容器引擎(开发测试中)", "ps": "Docker是一个开源的应用容器引擎",
"name": "docker", "name": "docker",
"title": "Docker", "title": "Docker",
"shell": "install.sh", "shell": "install.sh",
+255 -35
View File
@@ -1,3 +1,9 @@
function dPostOrgin(args, callback) {
$.post('/plugins/run', args, function(data) {
callback(data);
}, '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 loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
@@ -12,7 +18,7 @@ function dPost(method, version, args,callback){
req_data['args'] = JSON.stringify(args); req_data['args'] = JSON.stringify(args);
} }
$.post('/plugins/run', req_data, function(data) { dPostOrgin(req_data, function(data) {
layer.close(loadT); layer.close(loadT);
if (!data.status) { if (!data.status) {
//错误展示10S //错误展示10S
@@ -23,7 +29,7 @@ function dPost(method, version, args,callback){
if (typeof(callback) == 'function') { if (typeof(callback) == 'function') {
callback(data); callback(data);
} }
},'json'); });
} }
function dPostCallbak(method, version, args, callback) { function dPostCallbak(method, version, args, callback) {
@@ -66,13 +72,13 @@ function logsCon(id){
title: 'Docker日志', title: 'Docker日志',
area: '600px', area: '600px',
closeBtn: 2, closeBtn: 2,
content:'<div class="bt-form">' content: '<div class="bt-form">' +
+'<pre class="crontab-log" style="overflow: auto; \ '<pre class="crontab-log" style="overflow: auto; \
border: 0px none; line-height:23px;padding: 15px; \ border: 0px none; line-height:23px;padding: 15px; \
margin: 0px; white-space: pre-wrap; height: 405px; \ margin: 0px; white-space: pre-wrap; height: 405px; \
background-color: rgb(51,51,51);color:#f1f1f1;\ background-color: rgb(51,51,51);color:#f1f1f1;\
border-radius:0px;">'+ (rdata.msg == '' ? 'No logs':rdata.msg) +'</pre>' border-radius:0px;">' + (rdata.msg == '' ? 'No logs' : rdata.msg) + '</pre>' +
+'</div>', '</div>',
success: function(index, layers) { success: function(index, layers) {
$(".crontab-log").scrollTop(1000000); $(".crontab-log").scrollTop(1000000);
} }
@@ -191,7 +197,7 @@ function createConTemplate(){
dPost('get_docker_create_info', '', {}, function(rdata) { dPost('get_docker_create_info', '', {}, function(rdata) {
var rdata = $.parseJSON(rdata.data); var rdata = $.parseJSON(rdata.data);
console.log(rdata); // console.log(rdata);
var rdata = rdata.data; var rdata = rdata.data;
var imageOpt = ''; var imageOpt = '';
for (var i = 0; i < rdata.images.length; i++) { for (var i = 0; i < rdata.images.length; i++) {
@@ -280,25 +286,21 @@ function createConTemplate(){
</div>\ </div>\
</div>', </div>',
success: function() { success: function() {
$(".bt-cancel").click(function(){
layer.close(layer_index);
});
$(".plus").click(function() { $(".plus").click(function() {
var name1 = $(".type-port input[name='name1']").val(); var name1 = $(".type-port input[name='name1']").val();
var name2 = $(".type-port input[name='name2']").val(); var name2 = $(".type-port input[name='name2']").val();
if (name1 < 1 || name1 > 65535 || name2 < 1 || name2 > 65535 || isNaN(name1) || isNaN(name2)) { 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}); layer.msg('端口设置值范围无效,范围 [1-65535]', { icon: 2 });
return; return;
} }
var portval = $('#portabletr')[0].childNodes; var portval = $('#portabletr')[0].childNodes;
for (var i = 0; i < portval.length; i++) { for (var i = 0; i < portval.length; i++) {
if(portval[i].childNodes[0].innerText == '当前未添加目录映射') continue; if (portval[i].childNodes[0].innerText == '当前未添加端口映射') continue;
var sport = portval[i].childNodes[2].innerText; var sport = portval[i].childNodes[2].innerText;
if (name2 == sport) { if (name2 == sport) {
layer.msg('The port ['+name2+'] is already in the mapping list!',{icon:2}); layer.msg('端口 [' + name2 + '] 已在映射列表中!', { icon: 2 });
return; return;
} }
} }
@@ -307,15 +309,22 @@ function createConTemplate(){
address = '*'; address = '*';
} }
var port = address + ':' + name2; var port = address + ':' + name2;
var loadT = layer.msg('Testing <img src="/static/img/ing.gif">',{icon:16,time:0,shade: [0.3, "#000"]}); var loadT = layer.msg('正在检测中... <img src="/static/img/ing.gif">', { icon: 16, time: 0, shade: [0.3, "#000"] });
$.post('/plugin?action=a&name=docker&s=IsPortExists',{port:port},function(rdata){ dPost('docker_port_check', '',{port:port}, function(rdata){
layer.close(loadT); layer.close(loadT);
if(rdata !== false){ var rdata = $.parseJSON(rdata.data);
layer.msg('Port ['+name2+'] is already in the mapping list!',{icon:2}); if (rdata.status){
layer.msg('端口 [' + name2 + ']已在映射列表中!', { icon: 2 });
return; return;
} }
var selecttype = $(".type-port select").val(); var selecttype = $(".type-port select").val();
var portable= '<tr><td>'+name1+'</td><td>'+selecttype+'</td><td>'+name2+'</td><td class="text-right" width="60"><a href="javascript:;" class="btlink minus">Del</a></td></tr>'; var portable = '<tr>\
<td>' + name1 + '</td>\
<td>' + selecttype + '</td>\
<td>' + name2 + '</td>\
<td class="text-right" width="60"><a href="javascript:;" class="btlink minus">删除</a></td>\
</tr>';
$("#portabletr").append(portable); $("#portabletr").append(portable);
$(".more1").remove(); $(".more1").remove();
$(".minus").click(function() { $(".minus").click(function() {
@@ -335,10 +344,10 @@ function createConTemplate(){
} }
var portval = $('#portabletr2')[0].childNodes; var portval = $('#portabletr2')[0].childNodes;
for (var i = 0; i < portval.length; i++) { for (var i = 0; i < portval.length; i++) {
if(portval[i].childNodes[0].innerText == '当前未添加目录映射') continue; if (portval[i].childNodes[0].innerText == '当前未添加端口映射') continue;
var sport = portval[i].childNodes[2].innerText; var sport = portval[i].childNodes[2].innerText;
if (path2 == sport) { if (path2 == sport) {
layer.msg('Directory ['+path2+'] is already in the mapping list!',{icon:2}); layer.msg('目录 [' + path2 + '] 已在映射列表中!', { icon: 2 });
return; return;
} }
} }
@@ -346,7 +355,7 @@ function createConTemplate(){
var portable = '<tr>\ var portable = '<tr>\
<td class="td_width_1" title="' + path1 + '">' + path1 + '</td>\ <td class="td_width_1" title="' + path1 + '">' + path1 + '</td>\
<td>' + selecttype + '</td><td title="' + path2 + '" class="td_width_1" style="max-width: 138px;">' + path2 + '</td>\ <td>' + selecttype + '</td><td title="' + path2 + '" class="td_width_1" style="max-width: 138px;">' + path2 + '</td>\
<td class="text-right" width="50"><a href="javascript:;" class="btlink minus2">Del</a></td>\ <td class="text-right" width="50"><a href="javascript:;" class="btlink minus2">删除</a></td>\
</tr>'; </tr>';
$("#portabletr2").append(portable); $("#portabletr2").append(portable);
$(".more2").remove(); $(".more2").remove();
@@ -367,26 +376,36 @@ function createConTemplate(){
//遍历端口映射 //遍历端口映射
for (var i = 0; i < portval.length; i++) { for (var i = 0; i < portval.length; i++) {
// console.log(portval[i].childNodes[0].innerText);
if (portval[i].childNodes[0].innerText == '当前未添加端口映射') { if (portval[i].childNodes[0].innerText == '当前未添加端口映射') {
continue; continue;
} }
var port = portval[i].childNodes[0].innerText.replace(/\s/g,'');
var dport = port + '/' + portval[i].childNodes[1].innerText.toLowerCase().replace(/\s/g,''); // console.log(i,portval[i].children[0].innerText);
var sport = [address,parseInt(portval[i].childNodes[2].innerText.replace(/\s/g,''))]; // console.log(i,portval[i].childNodes[0].innerText);
var port = portval[i].children[0].innerText.replace(/\s/g, '');
var dport = port + '/' + portval[i].children[1].innerText.toLowerCase().replace(/\s/g, '');
var sport = [address, parseInt(portval[i].children[2].innerText.replace(/\s/g, ''))];
ports[dport] = sport ports[dport] = sport
accept.push(port); accept.push(port);
} }
//遍历目录映射 //遍历目录映射
volumes['/sys/fs/cgroup'] = {'bind':'/sys/fs/cgroup', 'mode': 'rw'}; volumes['/sys/fs/cgroup'] = {
'bind': '/sys/fs/cgroup',
'mode': 'rw'
};
for (var i = 0; i < portval2.length; i++) { for (var i = 0; i < portval2.length; i++) {
if (portval2[i].childNodes[0].innerText.replace(/\s/g, ' ') == '当前未添加目录映射') { if (portval2[i].childNodes[0].innerText.replace(/\s/g, ' ') == '当前未添加目录映射') {
continue; continue;
} }
var dpath = portval2[i].childNodes[2].innerText.replace(/\s/g, ''); var dpath = portval2[i].childNodes[2].innerText.replace(/\s/g, '');
var spath = {'bind':portval2[i].childNodes[0].innerText.replace(/\s/g,''),'mode':portval2[i].childNodes[1].innerText.toLowerCase().replace(/\s/g,'')}; var spath = {
volumes[dpath] = spath 'bind': portval2[i].childNodes[0].innerText.replace(/\s/g, ''),
'mode': portval2[i].childNodes[1].innerText.toLowerCase().replace(/\s/g, '')
};
volumes[dpath] = spath;
} }
var data = { var data = {
@@ -410,6 +429,8 @@ function createConTemplate(){
layer.msg('CPU配额设置值范围应为 [1-100]!', { icon: 2 }); layer.msg('CPU配额设置值范围应为 [1-100]!', { icon: 2 });
return; return;
} }
// console.log(data);
dPost('docker_create_con','', data, function(rdata){ dPost('docker_create_con','', data, function(rdata){
var rdata = $.parseJSON(rdata.data); var rdata = $.parseJSON(rdata.data);
showMsg(rdata.msg,function(){ showMsg(rdata.msg,function(){
@@ -523,14 +544,14 @@ function dockerPullImagesFileTemplate(){
'<div class="conter official_pull pd15"><div class="line">' + '<div class="conter official_pull pd15"><div class="line">' +
'<span class="tname">镜像名:</span>\ '<span class="tname">镜像名:</span>\
<div class="info-r c4">\ <div class="info-r c4">\
<input class="bt-input-text mr5" type="text" name="official_pull_name" style="width:218px" value="">\ <input class="bt-input-text mr5" type="text" name="official_pull_name" style="width:218px" value="" placeholder="memcached:latest">\
<button type="button" class="btn btn-sm btn-success official_pull_btn">获取</button>\ <button type="button" class="btn btn-sm btn-success official_pull_btn">获取</button>\
</div>' + </div>' +
'</div></div>' + '</div></div>' +
'<div class="conter public_pull pd15" style="display: none;"><div class="line">' + '<div class="conter public_pull pd15" style="display: none;"><div class="line">' +
'<span class="tname">镜像名:</span>\ '<span class="tname">镜像名:</span>\
<div class="info-r c4">\ <div class="info-r c4">\
<input class="bt-input-text mr5" type="text" name="public_pull_path" style="width:218px" value="">\ <input class="bt-input-text mr5" type="text" name="public_pull_path" style="width:218px" value="" placeholder="memcached:latest">\
<button type="button" class="btn btn-sm btn-success public_pull_btn">获取</button>\ <button type="button" class="btn btn-sm btn-success public_pull_btn">获取</button>\
</div>' + </div>' +
'</div></div>' + '</div></div>' +
@@ -634,6 +655,207 @@ function dockerImageList(){
dockerImageListRender(); 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_pick_list', '', {}, function(rdata) {
var rdata = $.parseJSON(rdata.data);
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 += '<a href="javascript:;" onclick="dockerGetFileBytes(\'' + rlist[i]['file'] + '\')" class="btlink">下载</a> | ';
op += '<a href="javascript:;" onclick="dockerLoadFile(\'' + rlist[i]['file'] + '\')" class="btlink">导入</a> | ';
op += '<a href="javascript:;" onclick="dockerDeleteFile(\'' + rlist[i]['file'] + '\')" class="btlink">删除</a>';
list += '<tr>';
list += '<td>' + rlist[i]['name'] + '</td>';
list += '<td>' + rlist[i]['size'] + '</td>';
list += '<td>' + rlist[i]['time'] + '</td>';
list += '<td class="text-right">' + op + '</td>';
list += '</tr>';
}
$('#con_list tbody').html(list);
});
}
//上传文件
function uploadImageFiles(upload_dir) {
var image_layer = layer.open({
type: 1,
closeBtn: 1,
title: "上传导入文件[" + upload_dir + ']',
area: ['500px', '300px'],
shadeClose: false,
content: '<div class="fileUploadDiv">\
<input type="hidden" id="input-val" value="' + upload_dir + '" />\
<input type="file" id="file_input" multiple="true" autocomplete="off" />\
<button type="button" id="opt" autocomplete="off">添加文件</button>\
<button type="button" id="up" autocomplete="off" >开始上传</button>\
<span id="totalProgress" style="position: absolute;top: 7px;right: 147px;"></span>\
<span style="float:right;margin-top: 9px;">\
<font>文件编码:</font>\
<select id="fileCodeing" >\
<option value="byte">二进制</option>\
<option value="utf-8">UTF-8</option>\
<option value="gb18030">GB2312</option>\
</select>\
</span>\
<button type="button" id="filesClose" autocomplete="off">关闭</button>\
<ul id="up_box"></ul>\
</div>',
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 = '<tr><td colspan="5" align="center">当前无镜像</td></tr>';
continue;
}
var versionData = imageList[i].RepoTags,
version, reg = new RegExp('((?<=:)[0-9A-z/.-]*)$');
version = versionData.match(reg);
_tbody += "<tr><td><input data-name='" + imageList[i].RepoTags + "' type='checkbox' name='images'></td>\
<td><span class='max_span' title='" + imageList[i].RepoTags + "'>" + imageList[i].RepoTags + "</span></td>\
<td>" + version[0] + "</td>\
<td>" + toSize(imageList[i].Size) + "</td></tr>";
}
var layerS = layer.open({
type: 1,
title: "选择镜像",
area: '500px',
closeBtn: 2,
btn: ['打包', '取消'],
shadeClose: false,
content: '<div class="divtable images_pull" style="padding:10px;">\
<table class="table" id="images_table">\
<thead><tr>\
<th style="padding:8px 10px;"><input type="checkbox" name="images_all"></th>\
<th>名称</th>\
<th>版本</th>\
<th>大小</th>\
</tr></thead>\
<tbody>' + _tbody + '</tbody>\
</table>\
</div>',
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 = '<div class="safe bgw">\
<button onclick="dockerImagePick()" class="btn btn-success btn-sm" type="button" style="margin-right: 5px;">镜像打包</button>\
<button id="btn_image_upload" class="btn btn-default btn-sm" type="button" style="margin-right: 5px;">上传镜像</button>\
<div class="divtable mtb10">\
<div class="tablescroll">\
<table id="con_list" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>名称</th>\
<th>大小</th>\
<th>时间</th>\
<th style="text-align:right;">操作</th></tr></thead>\
<tbody></tbody></table>\
</div>\
<div id="databasePage" class="dataTables_paginate paging_bootstrap page"></div>\
</div>\
</div>';
$(".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();
}
function deleteIpList(address) { function deleteIpList(address) {
safeMessage('删除IP', '你将删除从IP地址池[' + address + '],确定?', function() { safeMessage('删除IP', '你将删除从IP地址池[' + address + '],确定?', function() {
dPost('docker_del_ip', '', { address: address }, function(rdata) { dPost('docker_del_ip', '', { address: address }, function(rdata) {
@@ -791,8 +1013,7 @@ function repoLogin(){
function delRepo(address) { function delRepo(address) {
safeMessage('退出', '你将退出 [' + address + '],确定?', function() { safeMessage('退出', '你将退出 [' + address + '],确定?', function() {
dPost('docker_logout', '', dPost('docker_logout', '', { registry: address },
{registry:address},
function(rdata) { function(rdata) {
var rdata = $.parseJSON(rdata.data); var rdata = $.parseJSON(rdata.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
@@ -831,6 +1052,7 @@ function repoListRender(){
$('#con_list tbody').html(list); $('#con_list tbody').html(list);
}); });
} }
function repoList() { function repoList() {
var con = '<div class="safe bgw">\ var con = '<div class="safe bgw">\
@@ -860,5 +1082,3 @@ function repoList(){
repoListRender(); repoListRender();
} }
+2 -2
View File
@@ -739,7 +739,7 @@ def importDbBackup():
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
sock = getSocketFile() 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 ' ' + name + ' < ' + file_path_sql
# print(mysql_cmd) # print(mysql_cmd)
@@ -800,7 +800,7 @@ def importDbExternal():
sock = getSocketFile() sock = getSocketFile()
os.environ["MYSQL_PWD"] = pwd 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 pwd + ' ' + name + ' < ' + import_sql
# print(mysql_cmd) # print(mysql_cmd)
+2 -2
View File
@@ -8,8 +8,8 @@ default-character-set = UTF8MB4
[mysqld] [mysqld]
!include {$SERVER_APP_PATH}/etc/mode/classic.cnf !include {$SERVER_APP_PATH}/etc/mode/classic.cnf
sha256_password_private_key_path=mysql.pem sha256_password_private_key_path={$SERVER_APP_PATH}/data/mysql.pem
sha256_password_public_key_path=mysql.pub sha256_password_public_key_path={$SERVER_APP_PATH}/data/mysql.pub
authentication_policy=mysql_native_password authentication_policy=mysql_native_password
pid-file = {$SERVER_APP_PATH}/data/mysql.pid pid-file = {$SERVER_APP_PATH}/data/mysql.pid
+15 -4
View File
@@ -167,7 +167,6 @@ def pMysqlDb():
def makeInitRsaKey(version=''): def makeInitRsaKey(version=''):
datadir = getServerDir() + "/data" datadir = getServerDir() + "/data"
mysql_pem = datadir + "/mysql.pem" mysql_pem = datadir + "/mysql.pem"
if not os.path.exists(mysql_pem): if not os.path.exists(mysql_pem):
rdata = mw.execShell( rdata = mw.execShell(
@@ -176,7 +175,6 @@ def makeInitRsaKey(version=''):
rdata = mw.execShell( rdata = mw.execShell(
'cd ' + datadir + ' && openssl rsa -in mysql.pem -pubout -out mysql.pub') 'cd ' + datadir + ' && openssl rsa -in mysql.pem -pubout -out mysql.pub')
# print(rdata) # print(rdata)
if not mw.isAppleSystem(): if not mw.isAppleSystem():
mw.execShell('cd ' + datadir + ' && chmod 400 mysql.pem') mw.execShell('cd ' + datadir + ' && chmod 400 mysql.pem')
mw.execShell('cd ' + datadir + ' && chmod 444 mysql.pub') mw.execShell('cd ' + datadir + ' && chmod 444 mysql.pub')
@@ -251,6 +249,14 @@ def initDreplace(version=''):
return file_bin 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=''): def status(version=''):
path = getConf() path = getConf()
if not os.path.exists(path): if not os.path.exists(path):
@@ -450,7 +456,7 @@ def initMysqlPwd():
def initMysql8Pwd(): def initMysql8Pwd():
time.sleep(2) time.sleep(8)
serverdir = getServerDir() serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf" myconf = serverdir + "/etc/my.cnf"
@@ -540,7 +546,12 @@ def my8cmd(version, method):
else: else:
mw.execShell('systemctl start mysql') mw.execShell('systemctl start mysql')
for x in range(10):
mydb_status = process_status()
if mydb_status == 'start':
initMysql8Pwd() initMysql8Pwd()
break
time.sleep(1)
if mw.isAppleSystem(): if mw.isAppleSystem():
cmd_init_stop = init_file + ' stop' cmd_init_stop = init_file + ' stop'
@@ -562,11 +573,11 @@ def my8cmd(version, method):
def appCMD(version, action): def appCMD(version, action):
makeInitRsaKey(version)
if version == '8.0' or version == '5.7': if version == '8.0' or version == '5.7':
status = my8cmd(version, action) status = my8cmd(version, action)
else: else:
status = myOp(version, action) status = myOp(version, action)
makeInitRsaKey(version)
return status return status
+19 -12
View File
@@ -60,19 +60,26 @@ http
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m; limit_conn_zone $server_name zone=perserver:10m;
server_tokens off; # CACEH_BEGIN
access_log off; 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;
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_tokens off;
access_log /dev/null;
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;
}
}
include {$SERVER_PATH}/web_conf/nginx/vhost/*.conf; include {$SERVER_PATH}/web_conf/nginx/vhost/*.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;
}
}
@@ -0,0 +1,4 @@
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
+12
View File
@@ -180,6 +180,17 @@ def confReplace():
cmd_s = 'chmod u+s ' + ng_exe_bin cmd_s = 'chmod u+s ' + ng_exe_bin
os.system('echo %s|sudo -S %s' % (sudoPwd, cmd_s)) 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(): def initDreplace():
@@ -290,6 +301,7 @@ def restart():
def reload(): def reload():
confReplace()
return restyOp('reload') return restyOp('reload')
+2 -2
View File
@@ -12,6 +12,6 @@
"home":"http://openresty.org", "home":"http://openresty.org",
"date":"2017-11-24", "date":"2017-11-24",
"pid": "1", "pid": "1",
"versions": ["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.1"] "updates": ["1.17.8.2","1.19.3.1","1.21.4.2"]
} }
+1 -1
View File
@@ -658,7 +658,7 @@ function phpLibConfig(version){
//安装扩展 //安装扩展
function installPHPLib(version, name, title, pathinfo) { function installPHPLib(version, name, title, pathinfo) {
layer.confirm('您真的要安装{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() { layer.confirm('您真的要卸载{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() {
name = name.toLowerCase(); name = name.toLowerCase();
var data = "name=" + name + "&version=" + version + "&type=1"; var data = "name=" + name + "&version=" + version + "&type=1";
+1 -1
View File
@@ -672,7 +672,7 @@ function installPHPLib(version, name, title, pathinfo) {
//卸载扩展 //卸载扩展
function uninstallPHPLib(version, name, title, pathinfo) { function uninstallPHPLib(version, name, title, pathinfo) {
layer.confirm('您真的要安装{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() { layer.confirm('您真的要卸载{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() {
name = name.toLowerCase(); name = name.toLowerCase();
var data = 'name=' + name + '&version=' + version; var data = 'name=' + name + '&version=' + version;
phpPost('uninstall_lib', version, data, function(data){ phpPost('uninstall_lib', version, data, function(data){
+1 -1
View File
@@ -665,7 +665,7 @@ function installPHPLib(version, name, title, pathinfo) {
//卸载扩展 //卸载扩展
function uninstallPHPLib(version, name, title, pathinfo) { function uninstallPHPLib(version, name, title, pathinfo) {
layer.confirm('您真的要安装{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() { layer.confirm('您真的要卸载{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() {
name = name.toLowerCase(); name = name.toLowerCase();
var data = 'name=' + name + '&version=' + version; var data = 'name=' + name + '&version=' + version;
phpPost('uninstall_lib', version, data, function(data){ phpPost('uninstall_lib', version, data, function(data){
+15 -5
View File
@@ -13,19 +13,29 @@ rootPath=$(dirname "$rootPath")
SERVER_ROOT=$rootPath/lib SERVER_ROOT=$rootPath/lib
SOURCE_ROOT=$rootPath/source/lib SOURCE_ROOT=$rootPath/source/lib
cn=$(curl -fsSL -m 10 http://ipinfo.io/json | grep "\"country\": \"CN\"")
HTTP_PREFIX="https://"
if [ ! -z "$cn" ];then
HTTP_PREFIX="https://ghproxy.com/"
fi
if [ ! -d ${SERVER_ROOT}/libzip ];then if [ ! -d ${SERVER_ROOT}/libzip ];then
cd $SOURCE_ROOT cd $SOURCE_ROOT
if [ ! -f ${SOURCE_ROOT}/libzip-1.3.2.tar.gz ];then if [ ! -f ${SOURCE_ROOT}/libzip-1.3.2.tar.gz ];then
wget --no-check-certificate -O libzip-1.3.2.tar.gz --no-check-certificate https://nih.at/libzip/libzip-1.3.2.tar.gz -T 20 wget --no-check-certificate -O libzip-1.3.2.tar.gz ${HTTP_PREFIX}github.com/midoks/mdserver-web/releases/download/init/libzip-1.3.2.tar.gz -T 20
fi fi
tar -zxvf libzip-1.3.2.tar.gz tar -zxvf libzip-1.3.2.tar.gz
cd libzip-1.3.2 cd ${SOURCE_ROOT}/libzip-1.3.2
./configure --prefix=${SERVER_ROOT}/libzip && make && make install ./configure --prefix=${SERVER_ROOT}/libzip && make && make install
#cd $SOURCE_ROOT #cd $SOURCE_ROOT
#rm -rf libzip-1.3.2
#rm -rf libzip-1.3.2.tar.gz if [ "$?" == "0" ];then
rm -rf ${SOURCE_ROOT}/libzip-1.3.2
rm -rf ${SOURCE_ROOT}/libzip-1.3.2.tar.gz
fi
fi fi
+1 -1
View File
@@ -124,7 +124,7 @@ fi
if [ ! -d $serverPath/php/${PHP_VER} ];then if [ ! -d $serverPath/php/${PHP_VER} ];then
cd $sourcePath/php/php${PHP_VER} && make clean cd $sourcePath/php/php${PHP_VER} && make clean
./buildconf --force # ./buildconf --force
./configure \ ./configure \
--prefix=$serverPath/php/${PHP_VER} \ --prefix=$serverPath/php/${PHP_VER} \
--exec-prefix=$serverPath/php/${PHP_VER} \ --exec-prefix=$serverPath/php/${PHP_VER} \
+11 -11
View File
@@ -782,20 +782,20 @@ def lsyncdAdd():
info['rsync'] = rsync info['rsync'] = rsync
if not 'exclude' in info:
info["exclude"] = [
"/**.upload.tmp",
"**/*.log",
"**/*.tmp",
"**/*.temp",
".git",
".gitignore",
".user.ini",
]
data = getDefaultConf() data = getDefaultConf()
slist = data['send']["list"] slist = data['send']["list"]
res = lsyncdListFindName(slist, info['name']) 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]: if res[0]:
list_index = res[1] list_index = res[1]
slist[list_index] = info slist[list_index] = info
+4 -4
View File
@@ -476,7 +476,7 @@ function lsyncdExclude(name){
} }
function lsyncdConfLog(){ function lsyncdConfLog(){
pluginStandAloneLogs("rsyncd","","lsyncd_conf_log");; pluginRollingLogs("rsyncd","","lsyncd_conf_log");;
} }
function lsyncdSend(){ function lsyncdSend(){
@@ -492,7 +492,7 @@ function lsyncdSend(){
con += '<div style="padding-top:1px;">\ con += '<div style="padding-top:1px;">\
<button class="btn btn-success btn-sm" onclick="createSendTask();">创建发送任务</button>\ <button class="btn btn-success btn-sm" onclick="createSendTask();">创建发送任务</button>\
<button class="btn btn-success btn-sm" onclick="lsyncdConfLog();">日志</button>\ <button class="btn btn-success btn-sm" onclick="lsyncdConfLog();">自动同步日志</button>\
</div>'; </div>';
con += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">'; con += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
@@ -532,7 +532,7 @@ function lsyncdSend(){
'<td>' + period +'</td>' + '<td>' + period +'</td>' +
'<td>\ '<td>\
<a class="btlink" onclick="lsyncdRun(\''+list[i]['name']+'\')">同步</a>\ <a class="btlink" onclick="lsyncdRun(\''+list[i]['name']+'\')">同步</a>\
| <a class="btlink" onclick="lsyncdLog(\''+list[i]['name']+'\')">日志</a>\ | <a class="btlink" onclick="lsyncdLog(\''+list[i]['name']+'\')">手动日志</a>\
| <a class="btlink" onclick="lsyncdExclude(\''+list[i]['name']+'\')">过滤器</a>\ | <a class="btlink" onclick="lsyncdExclude(\''+list[i]['name']+'\')">过滤器</a>\
| <a class="btlink" onclick="createSendTask(\''+list[i]['name']+'\')">编辑</a>\ | <a class="btlink" onclick="createSendTask(\''+list[i]['name']+'\')">编辑</a>\
| <a class="btlink" onclick="lsyncdDelete(\''+list[i]['name']+'\')">删除</a>\ | <a class="btlink" onclick="lsyncdDelete(\''+list[i]['name']+'\')">删除</a>\
@@ -562,7 +562,7 @@ function rsyncdConf(){
} }
function rsyncdLog(){ function rsyncdLog(){
pluginStandAloneLogs("rsyncd","","run_log"); pluginRollingLogs("rsyncd","","run_log");
} }
+1 -1
View File
@@ -22,6 +22,6 @@ def init(bot):
bot.set_my_commands( bot.set_my_commands(
commands=[ commands=[
telebot.types.BotCommand("start", "查看帮助信息"), telebot.types.BotCommand("start", "查看帮助信息"),
telebot.types.BotCommand("faq", "查看bbs帖子主题【不要忘记:冒号】"), telebot.types.BotCommand("faq", "查看bbs帖子主题【?:】"),
], ],
) )
+4 -4
View File
@@ -42,7 +42,7 @@ def send_msg(bot, tag='ad', trigger_time=300):
# 信号只在一个周期内执行一次|end # 信号只在一个周期内执行一次|end
# https://t.me/gjgzs2022 | 22/m # https://t.me/gjgzs2022 | 22/m
# 代付支付宝微信❤️淘宝帮付/💰流量变现💰集团收量/🕵️‍♀️实名认证/接码✅过人脸👤 | 28/m # 高价收量 👑 集团收量 ❤️ 流量变现/支付宝代付 ❤️ 微信代付/实名认证/过人脸🕵️‍♀️各种账号处理✅ | 28/m
# https://zhaoziyuan.la/ | web | 15/m | 2m | next,7/15 # https://zhaoziyuan.la/ | web | 15/m | 2m | next,7/15
# 香港高防CDN |9/m # 香港高防CDN |9/m
# mvirtua | web | 7/m # mvirtua | web | 7/m
@@ -57,15 +57,15 @@ def send_msg(bot, tag='ad', trigger_time=300):
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
text="🕵️‍♀️实名认证/接码✅过人脸👤", url='https://t.me/zhanzhangyewu') text="实名认证/过人脸🕵️‍♀️各种账号处理✅", url='https://t.me/zhanzhangyewu')
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
text="代付支付宝微信❤️淘宝帮付", url='https://t.me/Uxuanzhenpin') text="支付宝代付 ❤️ 微信代付", url='https://t.me/Uxuanzhenpin')
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
text="💰流量变现💰集团收量", url='https://t.me/taohaozhan') text="高价收量 👑 集团收量 ❤️ 流量变现", url='https://t.me/maccms_jccms/93')
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
@@ -51,8 +51,8 @@ def send_msg(bot, tag='ad', trigger_time=300):
# 信号只在一个周期内执行一次|end # 信号只在一个周期内执行一次|end
# https://t.me/gjgzs2022 | 22/m # https://t.me/gjgzs2022 | 22/m
# 代付支付宝微信❤️淘宝帮付/💰流量变现💰集团收量/🕵️‍♀️实名认证/接码✅过人脸👤 | 28/m # 高价收量 👑 集团收量 ❤️ 流量变现/支付宝代付 ❤️ 微信代付/实名认证/过人脸🕵️‍♀️各种账号处理✅ | 28/m
# https://zhaoziyuan.la/ | web | 15/m | 2m | next,7/15 # https://zhaoziyuan.la/ | web | 15/m | 2m | next,9/15
# 香港高防CDN |9/m # 香港高防CDN |9/m
# mvirtua | web | 7/m # mvirtua | web | 7/m
keyboard = [ keyboard = [
@@ -66,15 +66,15 @@ def send_msg(bot, tag='ad', trigger_time=300):
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
text="🕵️‍♀️实名认证/接码✅过人脸👤", url='https://t.me/zhanzhangyewu') text="实名认证/过人脸🕵️‍♀️各种账号处理✅", url='https://t.me/zhanzhangyewu')
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
text="代付支付宝微信❤️淘宝帮付", url='https://t.me/Uxuanzhenpin') text="支付宝代付 ❤️ 微信代付", url='https://t.me/Uxuanzhenpin')
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
text="💰流量变现💰集团收量", url='https://t.me/taohaozhan') text="高价收量 👑 集团收量 ❤️ 流量变现", url='https://t.me/maccms_jccms/93')
], ],
[ [
types.InlineKeyboardButton( types.InlineKeyboardButton(
+13 -17
View File
@@ -189,26 +189,22 @@ def run(bot, message):
return bot return bot
# print(text_body) # print(text_body)
if isThisCmd('/faq:', text_body): if isThisCmd('/?:', text_body):
cmd_text = getReadCmd('/faq:', text_body) cmd_text = getReadCmd('/?:', text_body)
return searchFaq(bot, message, cmd_text) return searchFaq(bot, message, cmd_text)
# if isThisCmd('/debug', text_body): # if text_body.find('?') > -1 or text_body.find('?') > -1:
# cmd_text = getReadCmd('/debug', text_body) # return_msg = "你似乎在寻找【" + text_body + "】答案:\n"
# return searchDebug(bot, message, cmd_text) # 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" # markup = types.InlineKeyboardMarkup(keyboard)
return_msg += "/faq:开始寻找你的问题\n" # bot.reply_to(message, return_msg, reply_markup=markup)
keyboard = [
[
types.InlineKeyboardButton(
text="如未找到,可以在论坛补充你的提问!", url='https://bbs.midoks.me'),
]
]
markup = types.InlineKeyboardMarkup(keyboard)
bot.reply_to(message, return_msg, reply_markup=markup)
return bot return bot
+10 -17
View File
@@ -789,18 +789,15 @@ function batchPasteTo(data,path){
function getSuffixName(fileName){ function getSuffixName(fileName){
var extArr = fileName.split("."); 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', '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', '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', 'pptx','txt','xlsb','xlsx','7z','cab','iso','rar','zip','gz','bt','file','apk','bookfolder',
'folder','folder-empty','folder-unempty','fromchromefolder','documentfolder','fromphonefolder', 'folder','folder-empty','fromchromefolder','documentfolder','fromphonefolder',
'mix','musicfolder','picturefolder','videofolder','sefolder','access','mdb','accdb','sql','c', 'mix','musicfolder','picturefolder','videofolder','sefolder','access','mdb','accdb',
'cpp','cs','js','fla','flv','htm','html','java','mht','url','xml','ai','bmp','cdr', 'fla','doc','docm','dotx','dotm','dot','pdf',
'gif','ico','jpeg','jpg','JPG','png','psd','webp','ape','avi','flv','mkv','mov','mp3','mp4','mpeg', 'ppt','pptm','pot','xls','csv','xlsm','scss','svg','pl','py','php','md','json','sh','conf'];
'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'];
var extLastName = extArr[extArr.length - 1]; var extLastName = extArr[extArr.length - 1];
for(var i=0; i<exts.length; i++){ for(var i=0; i<exts.length; i++){
if(exts[i]==extLastName){ if(exts[i]==extLastName){
@@ -818,13 +815,9 @@ function getExtName(fileName){
'jpeg','jpg','JPG','png','psd','webp','ape','avi','flv','mkv','mov','mp3','mp4', 'jpeg','jpg','JPG','png','psd','webp','ape','avi','flv','mkv','mov','mp3','mp4',
'mpeg','mpg','rm','rmvb','swf','wav','webm','wma','wmv','rtf','docx','fdf','potm', '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', 'pptx','txt','xlsb','xlsx','7z','cab','iso','rar','zip','gz','bt','file','apk','bookfolder',
'folder','folder-empty','folder-unempty','fromchromefolder','documentfolder','fromphonefolder', 'folder-empty','fromchromefolder','documentfolder','fromphonefolder',
'mix','musicfolder','picturefolder','videofolder','sefolder','access','mdb','accdb','sql','c', 'mix','musicfolder','picturefolder','videofolder','sefolder','access','mdb','accdb',
'cpp','cs','js','fla','flv','htm','html','java','log','mht','url','xml','ai','bmp','cdr', 'fla','flv','doc','docm','dotx','dotm','dot','pdf','ppt','pptm','pot','xls','csv','xlsm'];
'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'];
var extLastName = extArr[extArr.length - 1]; var extLastName = extArr[extArr.length - 1];
for(var i=0; i<exts.length; i++){ for(var i=0; i<exts.length; i++){
if(exts[i]==extLastName){ if(exts[i]==extLastName){
@@ -842,7 +835,7 @@ function ShowEditMenu(){
$(this).removeClass("hover"); $(this).removeClass("hover");
}).click(function(){ }).click(function(){
$(this).addClass("on").siblings().removeClass("on"); $(this).addClass("on").siblings().removeClass("on");
}) });
} }
//取磁盘 //取磁盘
+226 -79
View File
@@ -1561,82 +1561,164 @@ function to301(siteName, type, obj){
} }
function toProxySwitch(){ //反向代理
function toProxy(siteName, type, obj) {
// 设置 页面展示
if(type == 1) {
var proxy_title = "创建反向代理";
if (typeof(obj) != 'undefined'){
proxy_title = "编辑反向代理";
}
layer.open({
type: 1,
area: '650px',
title: proxy_title,
closeBtn: 1,
shift: 5,
shadeClose: false,
btn: ['提交','关闭'],
content: "<form id='form_proxy' class='divtable pd15' style='padding-bottom: 10px'>\
<div class='line'>\
<span class='tname'>开启代理</span>\
<div class='info-r ml0 mt5'>\
<input name='open_proxy' class='btswitch btswitch-ios' type='checkbox' checked>\
<label id='open_proxy' class='btswitch-btn' for='openProxy' style='float:left'></label>\
<div style='display: inline-block'>\
<span class='tname' style='margin-left:15px;position: relative;top: -5px;'>是否缓存</span>\
<input class='btswitch btswitch-ios' type='checkbox' name='open_cache'>\
<label class='btswitch-btn' id='open_cache' for='openCache' style='float:left'></label>\
</div>\
</div>\
</div>\
<div class='line'>\
<span class='tname'>名称</span>\
<div class='info-r ml0'>\
<input name='name' value='index' placeholder='请输入名称' class='bt-input-text mr5' type='text' style='width:200px''>\
</div>\
</div>\
<div class='line' style='display:none' id='cache_time'>\
<span class='tname'>缓存时间</span>\
<div class='info-r ml0'>\
<input name='cache_time' value='1' class='bt-input-text mr5' type='text' style='width:200px''>分钟\
</div>\
</div>\
<div class='line'>\
<span class='tname'>代理目录</span>\
<div class='info-r ml0'>\
<input name='from' value='/' placeholder='/' class='bt-input-text mr5' type='text' style='width:200px''>\
</div>\
</div>\
<div class='line'>\
<span class='tname'>目标URL</span>\
<div class='info-r ml0'>\
<input name='to' class='bt-input-text mr5' type='text' style='width:200px;float: left;margin-right:0px''>\
<span class='tname' style='width:90px'>发送域名</span>\
<input name='host' value='$host' class='bt-input-text mr5' type='text' style='width:200px'>\
</div>\
</div>\
<input name='id' value='' type='hidden'>\
<div class='help-info-text c7'>\
<ul class='help-info-text c7'>\
<li>代理目录:访问这个目录时将会把目标URL的内容返回并显示</li>\
<li>目标URL:可以填写你需要代理的站点,目标URL必须为可正常访问的URL,否则将返回错误</li>\
<li>发送域名:将域名添加到请求头传递到代理服务器,默认为目标URL域名,若设置不当可能导致代理无法正常运行</li>\
</ul>\
</div>\
</form>",
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; var status = $("input[name='open_proxy']").prop("checked")==true?1:0;
if(status==1){ if(status==1){
$("input[name='open_proxy']").prop("checked",false); $("input[name='open_proxy']").prop("checked",false);
}else{ }else{
$("input[name='open_proxy']").prop("checked",true); $("input[name='open_proxy']").prop("checked",true);
} }
} });
//反向代理 $('#open_cache').click(function(){
function toProxy(siteName, type, obj) { var status = $("input[name='open_cache']").prop("checked")==true?1:0;
// 设置 页面展示 if(status==1){
if(type == 1) { $('#cache_time').hide();
var proxy_form = layer.open({ $("input[name='open_cache']").prop("checked",false);
type: 1, }else{
area: '650px', $('#cache_time').show();
title: "创建反向代理", $("input[name='open_cache']").prop("checked",true);
closeBtn: 1, }
shift: 5, });
shadeClose: false, },
btn: ['提交','关闭'], yes:function(index,layer_ro){
content: "<form id='form_redirect' class='divtable pd15' style='padding-bottom: 10px'>" + var data = $('#form_proxy').serializeArray();
"<div class='line'>" +
'<span class="tname">开启代理</span>'+
"<div class='info-r ml0'>" +
"<input name='open_proxy' class='btswitch btswitch-ios' type='checkbox' checked><label id='open_proxy' class='btswitch-btn' for='openProxy' onclick='toProxySwitch();'></label>" +
"</div>" +
"</div>" +
"<div class='line'>"+
"<span class='tname'>代理目录</span>" +
"<div class='info-r ml0'>" +
"<input name='from' value='/' placeholder='/' class='bt-input-text mr5' type='text' style='width:200px''>" +
"</div>" +
"</div>" +
"<div class='line'>" +
"<span class='tname'>目标URL</span>" +
"<div class='info-r ml0'>" +
"<input name='to' class='bt-input-text mr5' type='text' style='width:200px;float: left;margin-right:0px''>" +
"<span class='tname' style='width:90px'>发送域名</span>" +
"<input name='host' value='$host' class='bt-input-text mr5' type='text' style='width:200px'>" +
"</div>" +
"</div>" +
"<div class='help-info-text c7'>" +
"<ul class='help-info-text c7'>" +
"<li>代理目录:访问这个目录时将会把目标URL的内容返回并显示</li>" +
"<li>目标URL:可以填写你需要代理的站点,目标URL必须为可正常访问的URL,否则将返回错误</li>" +
"<li>发送域名:将域名添加到请求头传递到代理服务器,默认为目标URL域名,若设置不当可能导致代理无法正常运行</li>" +
"</ul>" +
"</div>" +
"</form>",
yes:function(){
var data = $('#form_redirect').serializeArray();
var t = {}; var t = {};
t['name'] = 'siteName'; t['name'] = 'siteName';
t['value'] = siteName; t['value'] = siteName;
data.push(t); 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) { $.post('/site/set_proxy',data, function(res) {
layer.close(loading); layer.close(loading);
if (res.status) { if (!res.status){
layer.close(proxy_form); layer.msg(res.msg, {icon: 2,time:10000});
toProxy(siteName) return;
} else {
layer.msg(res.msg, {icon: 2});
} }
showMsg(proxy_title+"成功!",function(){
layer.close(index);
toProxy(siteName);
},{icon: 1, time:2000});
},'json'); },'json');
} }
}); });
} }
if (type == 2) { 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) { $.post('/site/del_proxy', {siteName: siteName,id: obj,}, function(res) {
layer.close(loading);
if (res.status == true) { if (res.status == true) {
layer.msg('删除成功', {time: 1000,icon: 1}); showMsg('删除成功', function(){
toProxy(siteName) toProxy(siteName);
},{time: 1000,icon: 1});
} else { } else {
layer.msg(res.msg, {time: 1000,icon: 2}); layer.msg(res.msg, {time: 1000,icon: 2});
} }
@@ -1650,7 +1732,11 @@ function toProxy(siteName, type, obj) {
var data = {siteName: siteName,id: obj}; var data = {siteName: siteName,id: obj};
$.post('/site/get_proxy_conf', data, function(res) { $.post('/site/get_proxy_conf', data, function(res) {
layer.close(laoding); layer.close(laoding);
if (res.status == true) { if (!res.status){
layer.msg('请求错误!!', {time: 3000,icon: 2});
return;
}
var mBody = "<div class='webEdit-box' style='padding: 20px'>\ var mBody = "<div class='webEdit-box' style='padding: 20px'>\
<textarea style='height: 320px; width: 445px; margin-left: 20px; line-height:18px' id='configProxyBody'>"+res.data.result+"</textarea>\ <textarea style='height: 320px; width: 445px; margin-left: 20px; line-height:18px' id='configProxyBody'>"+res.data.result+"</textarea>\
<div class='info-r'>\ <div class='info-r'>\
@@ -1699,41 +1785,65 @@ function toProxy(siteName, type, obj) {
return true; return true;
}, },
}); });
} else {
layer.msg('请求错误!!', {time: 3000,icon: 2});
}
},'json'); },'json');
return return;
} }
if (type == 10 || type == 11) { if (type == 10 || type == 11) {
//[11]启动 或 停止[10] //[11]启动 或 停止[10]
status = type==10 ? '0' : '1'; status = type==10 ? '0' : '1';
var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); 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); layer.close(loading);
if (res.status == true) { if (!rdata.status){
layer.msg('设置成功', {icon: 1});
toProxy(siteName);
} else {
layer.msg(res.msg, {time: 3000,icon: 2}); 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'); },'json');
return; return;
} }
var body = '<div id="proxy_list" class="bt_table">\ var body = '<div id="proxy_list" class="bt_table">\
<div style="padding-bottom: 10px">\ <div style="padding-bottom: 10px">\
<button type="button" title="添加反向代理" class="btn btn-success btn-sm mr5" onclick="toProxy(\''+siteName+'\',1)" ><span>添加反向代理</span></button>\ <button type="button" title="添加反向代理" class="btn btn-success btn-sm mr5" onclick="toProxy(\''+siteName+'\',1)" >\
<span>添加反向代理</span>\
</button>\
</div>\ </div>\
<div class="divtable" style="max-height:200px;">\ <div class="divtable" style="max-height:200px;">\
<table class="table table-hover" >\ <table class="table table-hover" >\
<thead style="position: relative;z-index: 1;">\ <thead style="position: relative;z-index: 1;">\
<tr>\ <tr>\
<th><span data-index="1"><span>代理目录</span></span></th>\ <th>名称</th>\
<th><span data-index="2"><span>目标地址</span></span></th>\ <th>代理目录</th>\
<th><span data-index="2"><span>状态</span></span></th>\ <th>目标地址</th>\
<th><span data-index="3"><span>操作</span></span></th>\ <th>缓存</th>\
<th>状态</th>\
<th>操作</th>\
</tr>\ </tr>\
</thead>\ </thead>\
<tbody id="md-301-body"></tbody>\ <tbody id="md-301-body"></tbody>\
@@ -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']}); 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) { $.post("/site/get_proxy_list", {siteName: siteName},function (res) {
layer.close(loading); layer.close(loading);
if (res.status === true) { if (!res.status){
let data = res.data.result; layer.msg(res.msg, {icon:2});
data.forEach(function(item){ return;
}
var data = res.data.result;
for (var i = 0; i < data.length; i++) {
var item = data[i];
var switchProxy = '<span onclick="toProxy(\''+siteName+'\', 10, \''+ item.id +'\')" style="color:rgb(92, 184, 92);" class="btlink glyphicon glyphicon-play"></span>'; var switchProxy = '<span onclick="toProxy(\''+siteName+'\', 10, \''+ item.id +'\')" style="color:rgb(92, 184, 92);" class="btlink glyphicon glyphicon-play"></span>';
if (!item['status']){ if (!item['status']){
switchProxy = '<span onclick="toProxy(\''+siteName+'\', 11, \''+ item.id +'\')" style="color:rgb(255, 0, 0);" class="btlink glyphicon glyphicon-pause"></span>'; switchProxy = '<span onclick="toProxy(\''+siteName+'\', 11, \''+ item.id +'\')" style="color:rgb(255, 0, 0);" class="btlink glyphicon glyphicon-pause"></span>';
} }
var openCache = '<span data-index="'+i+'" class="btlink cache off">未开启</span>';
if (item['open_cache'] == 'on'){
openCache = '<span data-index="'+i+'" class="btlink cache on">已开启</span>';
}
let tmp = '<tr>\ let tmp = '<tr>\
<td><span data-index="1"><span>'+item.from+'</span></span></td>\ <td>'+item.name+'</td>\
<td><span data-index="2"><span>'+item.to+'</span></span></td>\ <td>'+item.from+'</td>\
<td>'+item.to+'</td>\
<td>'+openCache+'</td>\
<td>'+switchProxy+'</td>\ <td>'+switchProxy+'</td>\
<td>\ <td>\
<span data-index="4" onclick="toProxy(\''+siteName+'\', 3, \''+ item.id +'\')" class="btlink">详细</span> |\ <span data-index="'+i+'" class="btlink detail">详细</span> |\
<span data-index="4" onclick="toProxy(\''+siteName+'\', 2, \''+ item.id +'\')" class="btlink">删除</span>\ <span data-index="'+i+'" class="btlink edit">编辑</span> |\
<span data-index="'+i+'" class="btlink delete">删除</span>\
</td>\ </td>\
</tr>'; </tr>';
$("#md-301-body").append(tmp); $("#md-301-body").append(tmp);
})
} else {
layer.msg(res.msg, {icon:2});
} }
$('#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'); },'json');
///////// /////////
} }
@@ -1779,7 +1925,8 @@ function sslAdmin(siteName){
var rdata = data['data']; var rdata = data['data'];
var tbody = ''; var tbody = '';
for(var i=0;i<rdata.length;i++){ for(var i=0;i<rdata.length;i++){
tbody += '<tr><td>'+rdata[i].subject+'</td>\ tbody += '<tr>\
<td>'+rdata[i].subject+'</td>\
<td>'+rdata[i].dns.join('<br>')+'</td>\ <td>'+rdata[i].dns.join('<br>')+'</td>\
<td>'+rdata[i].notAfter+'</td>\ <td>'+rdata[i].notAfter+'</td>\
<td>'+rdata[i].issuer.split(' ')[0]+'</td>\ <td>'+rdata[i].issuer.split(' ')[0]+'</td>\
+18
View File
@@ -4854,3 +4854,21 @@ select[disabled]{
font-weight: 400; 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;
}
+4
View File
@@ -15,6 +15,10 @@ dnf install -y crontabs
dnf install -y mysql-devel 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}'` 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}" echo "SSH PORT:${SSH_PORT}"
# if [ -f /usr/sbin/iptables ];then # if [ -f /usr/sbin/iptables ];then
+4
View File
@@ -22,6 +22,10 @@ yum install -y mysql-devel
yum install -y expect yum install -y expect
SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` 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}" echo "SSH PORT:${SSH_PORT}"
# if [ -f /usr/sbin/iptables ];then # if [ -f /usr/sbin/iptables ];then
+4
View File
@@ -55,6 +55,10 @@ echo y | pacman -Syu icu
hwclock --systohc hwclock --systohc
SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` 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}" echo "SSH PORT:${SSH_PORT}"
# if [ -f /usr/sbin/iptables ];then # if [ -f /usr/sbin/iptables ];then
+6
View File
@@ -26,8 +26,14 @@ fi
ntpdate $NTPHOST | logger -t NTP 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}'` 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}" echo "SSH PORT:${SSH_PORT}"
# choose lang cmd # choose lang cmd
# dpkg-reconfigure --frontend=noninteractive locales # dpkg-reconfigure --frontend=noninteractive locales
if [ ! -f /usr/sbin/locale-gen ];then if [ ! -f /usr/sbin/locale-gen ];then
+4
View File
@@ -18,6 +18,10 @@ yum install -y expect
dnf install crontabs -y dnf install crontabs -y
SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` 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}" echo "SSH PORT:${SSH_PORT}"
# if [ -f /usr/sbin/iptables ];then # if [ -f /usr/sbin/iptables ];then
+4
View File
@@ -40,6 +40,10 @@ pkg install -y harfbuzz
pkg autoremove -y pkg autoremove -y
SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` 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}" echo "SSH PORT:${SSH_PORT}"
# if [ -f /usr/sbin/iptables ];then # if [ -f /usr/sbin/iptables ];then
+4
View File
@@ -53,6 +53,10 @@ zypper install -y freetype2-devel
# zypper install -y php-config # 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}'` 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}" echo "SSH PORT:${SSH_PORT}"
# if [ -f /usr/sbin/iptables ];then # if [ -f /usr/sbin/iptables ];then
+14 -1
View File
@@ -31,6 +31,9 @@ fi
echo "install remi source" echo "install remi source"
if [ "$VERSION_ID" == "9" ];then if [ "$VERSION_ID" == "9" ];then
# dnf upgrade --refresh -y
dnf config-manager --set-enabled crb
echo "install remi start" echo "install remi start"
if [ ! -f /etc/yum.repos.d/remi.repo ];then if [ ! -f /etc/yum.repos.d/remi.repo ];then
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-9.rpm rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-9.rpm
@@ -45,6 +48,10 @@ if [ ! -d /root/.acme.sh ];then
fi fi
SSH_PORT=`netstat -ntpl|grep sshd|grep -v grep | sed -n "1,1p" | awk '{print $4}' | awk -F : '{print $2}'` 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}" echo "SSH PORT:${SSH_PORT}"
# redhat , iptables no default # redhat , iptables no default
@@ -138,7 +145,7 @@ fi
$PKGMGR makecache $PKGMGR makecache
$PKGMGR groupinstall -y "Development Tools" $PKGMGR groupinstall -y "Development Tools"
if [ $VERSION_ID -ge 8 ];then if [ "$VERSION_ID" -ge "8" ];then
# EL8 及以上 # EL8 及以上
# find repo # find repo
@@ -151,6 +158,12 @@ if [ $VERSION_ID -ge 8 ];then
REPOS="${REPOS},${REPO_VAR}" REPOS="${REPOS},${REPO_VAR}"
fi fi
done done
if [ "$REPOS" == "--enablerepo=" ];then
# if not find, reset emtpy
REPOS=''
fi
REPOS=${REPOS//=,/=} REPOS=${REPOS//=,/=}
echo "REPOS:${REPOS}" echo "REPOS:${REPOS}"
+4
View File
@@ -25,6 +25,10 @@ locale-gen en_US.UTF-8
localedef -v -c -i en_US -f UTF-8 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=`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}" echo "SSH PORT:${SSH_PORT}"
if [ -f /usr/sbin/ufw ];then if [ -f /usr/sbin/ufw ];then
+1
View File
@@ -0,0 +1 @@
urllib3==1.21.1