mirror of
https://github.com/midoks/mdserver-web.git
synced 2026-10-10 04:19:26 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85fc333d2c | ||
|
|
5bc27a4725 | ||
|
|
e5acf206f5 | ||
|
|
ae7afc2eb5 | ||
|
|
5c8527a5de | ||
|
|
274592229e | ||
|
|
60ddb13f8e | ||
|
|
f62af00fb7 | ||
|
|
9c6faefffd | ||
|
|
c9e27c2add | ||
|
|
97b1e8b9b3 | ||
|
|
18cdcd1436 | ||
|
|
7d783c64b6 | ||
|
|
0b65d69750 | ||
|
|
693dbb8cf1 | ||
|
|
117a99e729 | ||
|
|
45d4b8a5de | ||
|
|
a5791051b1 | ||
|
|
dc3f8f8e0b | ||
|
|
bf1d00c012 | ||
|
|
51cf851cea | ||
|
|
1e09408eb9 | ||
|
|
7659865caf | ||
|
|
ad1851d068 | ||
|
|
e174652afc | ||
|
|
a95e7aacd7 | ||
|
|
6aa638ef9a | ||
|
|
6f3d50bae5 | ||
|
|
301a5a95b8 | ||
|
|
d35b9dccc7 | ||
|
|
82680605ac | ||
|
|
5b148b3d1a | ||
|
|
714acd20e5 | ||
|
|
bf58cd8acc | ||
|
|
059053d27c | ||
|
|
185e73c26a | ||
|
|
569511d321 | ||
|
|
f88bf5059f | ||
|
|
05b63b8d2b | ||
|
|
3a197b273d | ||
|
|
f4fdbab41c | ||
|
|
f6b2940657 | ||
|
|
78b9ac5df0 | ||
|
|
3ea4272307 | ||
|
|
efc7cee9ad | ||
|
|
5c4805453d | ||
|
|
f6da241c85 | ||
|
|
d5b6eb2325 | ||
|
|
6ed2cddf71 | ||
|
|
9c31d76442 | ||
|
|
7aecbaf7df | ||
|
|
ee81a86d24 | ||
|
|
0a60d66732 | ||
|
|
c3e3cff472 | ||
|
|
194d46eb6a | ||
|
|
d66bc94edc | ||
|
|
fb4ffcd343 | ||
|
|
10c235e317 | ||
|
|
9c156928d8 | ||
|
|
771905d7f6 | ||
|
|
cd21b3f3e7 | ||
|
|
982026db24 | ||
|
|
f9b91d9989 | ||
|
|
f7b1159bd7 | ||
|
|
6aa49ddbcf | ||
|
|
866eddac1d | ||
|
|
af0cce4216 | ||
|
|
3951322d86 | ||
|
|
dfdd16b444 | ||
|
|
aa8fec2b7e | ||
|
|
2a8958ab84 | ||
|
|
f5125670ee | ||
|
|
2a8d4fb7a9 | ||
|
|
59f7fe2290 | ||
|
|
928db6e7e7 | ||
|
|
f3927bd6cf | ||
|
|
bb92727b56 | ||
|
|
21b80b1fce | ||
|
|
637da92834 | ||
|
|
f5859626a9 | ||
|
|
003449eb0a | ||
|
|
d27f926191 | ||
|
|
7483247d4d | ||
|
|
1ad841d3af | ||
|
|
27376d879c | ||
|
|
8b824447c1 | ||
|
|
a1d26dcd45 | ||
|
|
5e68c7bf0a | ||
|
|
481ae16713 | ||
|
|
2d2bd39f9e | ||
|
|
7246a878a5 | ||
|
|
542ee3cdb0 | ||
|
|
69503b223b | ||
|
|
78d8fa7ebf | ||
|
|
21e9d8f2d8 | ||
|
|
3c6adfbd44 | ||
|
|
c0e70abe6d | ||
|
|
f174e71228 | ||
|
|
7a9a811ea6 | ||
|
|
c7e3d9d9a3 | ||
|
|
161f7a1bc0 | ||
|
|
175cce0131 | ||
|
|
3735897ed2 | ||
|
|
30bfa5a630 | ||
|
|
594fdb4712 | ||
|
|
31a441ea02 | ||
|
|
06f7087fad | ||
|
|
e7b8f5afdc | ||
|
|
6b57addfa7 | ||
|
|
aea435fbaf | ||
|
|
9cd6656946 | ||
|
|
4f7df4b3c3 | ||
|
|
70d12b7b8d | ||
|
|
fe576c820a | ||
|
|
b48a53e0d7 | ||
|
|
4701839c33 | ||
|
|
916bc67c4d | ||
|
|
d7bba830cc | ||
|
|
7a28f8f57a | ||
|
|
41ee25aa7b | ||
|
|
c8aa91cfa3 | ||
|
|
98f27498b0 | ||
|
|
5444fe6455 | ||
|
|
9627c6e47b | ||
|
|
13597d6282 | ||
|
|
d09494e3aa | ||
|
|
d35439d286 | ||
|
|
ced48bab47 | ||
|
|
fe2df6cc8d | ||
|
|
8bdfe15101 | ||
|
|
42e9983b88 | ||
|
|
9b7c0b6f99 | ||
|
|
e421292c9e | ||
|
|
7b4d31779a | ||
|
|
f3b09056f3 | ||
|
|
a92ccea6c5 | ||
|
|
9da77a0a9b | ||
|
|
c233ecaaa7 | ||
|
|
5828b8b8cb | ||
|
|
a4a1a2c83c | ||
|
|
0e20bc182c | ||
|
|
99c0b0a81a | ||
|
|
3fa199fec4 | ||
|
|
194c36c6d8 | ||
|
|
2fb542f6b4 | ||
|
|
60af43ed31 | ||
|
|
9f02cf9744 | ||
|
|
846bd270df | ||
|
|
d910d4f462 | ||
|
|
13f5b1bf02 | ||
|
|
1fc3fd6247 | ||
|
|
36e3feb886 | ||
|
|
0ca34afacd | ||
|
|
ffb3288f3d | ||
|
|
e2f68a73ed | ||
|
|
92fa8da2f6 | ||
|
|
7c96ddd63e | ||
|
|
c4e7872179 | ||
|
|
d399cb2bb4 | ||
|
|
985cbc7eca | ||
|
|
27ed21a17d | ||
|
|
972165ba1a | ||
|
|
e76eb4d0e8 | ||
|
|
fd05c40dbb | ||
|
|
a1a7fa5c82 | ||
|
|
531de1407f | ||
|
|
ca455f13e8 | ||
|
|
ab5342b01f | ||
|
|
a5a57c5718 | ||
|
|
27999b21e6 | ||
|
|
d2c6caeef2 | ||
|
|
de30d8a41f | ||
|
|
d3abc8e7b2 | ||
|
|
b7aad65eb5 | ||
|
|
240b1dec27 | ||
|
|
4756e0f68b | ||
|
|
59f62b948a | ||
|
|
0ab0741031 | ||
|
|
2fd2f6e844 | ||
|
|
e534c6177a | ||
|
|
897c6322fc | ||
|
|
201e93f946 | ||
|
|
a78fd957ec | ||
|
|
3ce037b0a1 | ||
|
|
f3176340f8 | ||
|
|
7bfe096e8d | ||
|
|
066428fca8 | ||
|
|
a1313846c8 | ||
|
|
0433123abd | ||
|
|
72e99844dd | ||
|
|
3a7882e7fa | ||
|
|
bec2a9a12c | ||
|
|
8f02363782 | ||
|
|
939c847f3e | ||
|
|
a623039db7 | ||
|
|
b7f49a1839 | ||
|
|
f1f60870f6 | ||
|
|
3b04739fd4 | ||
|
|
fdf1e0b0be | ||
|
|
d3385f526f | ||
|
|
20f9095b93 | ||
|
|
757cf483a2 | ||
|
|
1712cfd024 | ||
|
|
2b524cbe75 | ||
|
|
607d384000 | ||
|
|
14cdc7b82e | ||
|
|
c3219bcba2 | ||
|
|
a12c4dd78e | ||
|
|
39c6f19592 | ||
|
|
f18c05a097 | ||
|
|
80f296ea19 | ||
|
|
b3e9283a58 | ||
|
|
2e140a3ae1 | ||
|
|
4d733c8886 | ||
|
|
62a7320baf | ||
|
|
3dc7c2f5c1 | ||
|
|
fe62bbee06 | ||
|
|
f7c0cd82a0 | ||
|
|
13a2014558 | ||
|
|
5981f94376 | ||
|
|
005e0f1513 | ||
|
|
63a0f0fbdc | ||
|
|
edc0be11a1 | ||
|
|
908b6e67c6 | ||
|
|
dfe46332db | ||
|
|
fcdf2e18b2 | ||
|
|
3c8f9bcf96 | ||
|
|
ebadd6d80d | ||
|
|
6062699074 | ||
|
|
df9d57ba70 | ||
|
|
ffca953539 | ||
|
|
bd4946124f | ||
|
|
8e18c63cee | ||
|
|
d201ca2574 | ||
|
|
b644f91090 | ||
|
|
931f51cf59 | ||
|
|
0909a11fd9 | ||
|
|
2ba2833699 | ||
|
|
20389263fb | ||
|
|
86141ccf3a | ||
|
|
b2fdf84ca0 | ||
|
|
8fbc456e1a | ||
|
|
4e43382496 | ||
|
|
0326d4f112 | ||
|
|
a87c13c5e0 | ||
|
|
5f3720c855 | ||
|
|
f548e020c4 | ||
|
|
7f21781c0b | ||
|
|
680b0f09f2 | ||
|
|
482943a63c | ||
|
|
2871aee18e | ||
|
|
ff46d9b36e | ||
|
|
fd5fcba543 |
@@ -0,0 +1,16 @@
|
||||
name: sync2gitee
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
repo-sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Mirror the Github organization repos to Gitee.
|
||||
uses: Yikun/hub-mirror-action@master
|
||||
with:
|
||||
src: 'github/midoks'
|
||||
dst: 'gitee/midoks'
|
||||
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
|
||||
dst_token: ${{ secrets.GITEE_TOKEN }}
|
||||
static_list: "mdserver-web"
|
||||
force_update: true
|
||||
@@ -88,6 +88,7 @@ PHP[72-82]支持phpMyAdmin[5.2.0]
|
||||
| 服务商 | LOGO | 推广地址 | 优惠码 |
|
||||
| ------------- |----------|-----------|-------|
|
||||
| digitalvirt |[](https://digitalvirt.com/aff.php?aff=154) | https://digitalvirt.com/aff.php?aff=154 | mdserver-web |
|
||||
| mvirtua |[](https://mvirtua.com/aff/FUSKXVDH) | https://mvirtua.com/aff/FUSKXVDH | mdserver-web (全场8折)|
|
||||
|
||||
# Docker
|
||||
|
||||
@@ -99,11 +100,17 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443:
|
||||
```
|
||||
|
||||
|
||||
### 版本更新 0.14.2
|
||||
### 版本更新 0.15.1
|
||||
|
||||
* 加入TgClient插件
|
||||
* 网站防篡改程序(测试中)
|
||||
* Docker(测试中)
|
||||
* 升级功能优化。
|
||||
* 域名伪静态保存优化。
|
||||
* 自动同步gitee。
|
||||
* nezha保存优化。
|
||||
* OP防火墙优化(站点配置-状态关闭后,不再防御)-已安装的,需要重载。
|
||||
* 修复子目录绑定-伪静态问题。
|
||||
* [插件]docker - 添加IP地址池。
|
||||
* PHP下载中国优化。
|
||||
* 监控页面-自定义时间优化。
|
||||
|
||||
### JSDelivr安装地址
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ from route import app, socketio
|
||||
from gevent.pywsgi import WSGIServer
|
||||
from geventwebsocket.handler import WebSocketHandler
|
||||
|
||||
|
||||
from gevent import monkey
|
||||
monkey.patch_all()
|
||||
|
||||
|
||||
@@ -930,7 +930,8 @@ fi
|
||||
index).encode()
|
||||
)
|
||||
X509Req.set_pubkey(pk)
|
||||
X509Req.set_version(2)
|
||||
# X509Req.set_version(2)
|
||||
X509Req.set_version(0)
|
||||
X509Req.sign(pk, self.__digest)
|
||||
return OpenSSL.crypto.dump_certificate_request(OpenSSL.crypto.FILETYPE_ASN1, X509Req)
|
||||
|
||||
|
||||
@@ -840,7 +840,8 @@ class cert_request:
|
||||
index).encode()
|
||||
)
|
||||
X509Req.set_pubkey(pk)
|
||||
X509Req.set_version(2)
|
||||
# X509Req.set_version(2)
|
||||
X509Req.set_version(0)
|
||||
X509Req.sign(pk, self.__digest)
|
||||
return OpenSSL.crypto.dump_certificate_request(OpenSSL.crypto.FILETYPE_ASN1, X509Req)
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ from flask import request
|
||||
|
||||
class config_api:
|
||||
|
||||
__version = '0.14.2'
|
||||
__version = '0.15.1'
|
||||
__api_addr = 'data/api.json'
|
||||
|
||||
def __init__(self):
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ class Sql():
|
||||
self.__DB_TABLE = table
|
||||
return self
|
||||
|
||||
def where(self, where, param):
|
||||
def where(self, where, param=()):
|
||||
# WHERE条件
|
||||
if where:
|
||||
self.__OPT_WHERE = " WHERE " + where
|
||||
|
||||
+1
-1
@@ -1405,7 +1405,7 @@ def makeConf():
|
||||
file = getRunDir() + '/data/json/config.json'
|
||||
if not os.path.exists(file):
|
||||
c = {}
|
||||
c['title'] = '金蝉面板'
|
||||
c['title'] = '金灵面板'
|
||||
c['home'] = 'http://github/midoks/mdserver-web'
|
||||
c['recycle_bin'] = True
|
||||
c['template'] = 'default'
|
||||
|
||||
@@ -71,8 +71,9 @@ class plugins_api:
|
||||
if not mw.isNumber(sType):
|
||||
sType = 0
|
||||
|
||||
# print sPage
|
||||
data = self.getPluginList(sType, int(sPage))
|
||||
# print(sPage, sType)
|
||||
search = request.args.get('search', '').lower()
|
||||
data = self.getPluginList(sType, search, int(sPage))
|
||||
return mw.getJson(data)
|
||||
|
||||
def menuGetAbsPath(self, tag, path):
|
||||
@@ -781,7 +782,18 @@ class plugins_api:
|
||||
print(e)
|
||||
return plugins_info
|
||||
|
||||
def getAllListPage(self, sType='0', page=1, pageSize=10):
|
||||
def searchKey(self, info, kw):
|
||||
try:
|
||||
if info['title'].lower().find(kw) > -1:
|
||||
return True
|
||||
if info['ps'].lower().find(kw) > -1:
|
||||
return True
|
||||
if info['name'].lower().find(kw) > -1:
|
||||
return True
|
||||
except Exception as e:
|
||||
return False
|
||||
|
||||
def getAllListPage(self, sType='0', kw='', page=1, pageSize=10):
|
||||
plugins_info = []
|
||||
for dirinfo in os.listdir(self.__plugin_dir):
|
||||
if dirinfo[0:1] == '.':
|
||||
@@ -792,11 +804,13 @@ class plugins_api:
|
||||
if os.path.exists(json_file):
|
||||
try:
|
||||
data = json.loads(mw.readFile(json_file))
|
||||
# 判断是否搜索
|
||||
if kw != '' and not self.searchKey(data, kw):
|
||||
continue
|
||||
tmp_data = self.makeList(data, sType)
|
||||
for index in range(len(tmp_data)):
|
||||
plugins_info.append(tmp_data[index])
|
||||
except Exception as e:
|
||||
print(json_file)
|
||||
print(mw.getTracebackInfo())
|
||||
|
||||
start = (page - 1) * pageSize
|
||||
@@ -927,14 +941,14 @@ class plugins_api:
|
||||
|
||||
return plugins_info
|
||||
|
||||
def getPluginList(self, sType, sPage=1, sPageSize=10):
|
||||
# print sType, sPage, sPageSize
|
||||
def getPluginList(self, sType, kw='', sPage=1, sPageSize=10):
|
||||
# print(sType, kw, sPage, sPageSize)
|
||||
|
||||
ret = {}
|
||||
ret['type'] = json.loads(mw.readFile(self.__type))
|
||||
# plugins_info = self.getAllListThread(sType)
|
||||
# plugins_info = self.getAllListProcess(sType)
|
||||
data = self.getAllListPage(sType, sPage, sPageSize)
|
||||
data = self.getAllListPage(sType, kw, sPage, sPageSize)
|
||||
ret['data'] = data[0]
|
||||
|
||||
args = {}
|
||||
|
||||
+22
-5
@@ -101,19 +101,31 @@ class site_api:
|
||||
limit = request.form.get('limit', '10')
|
||||
p = request.form.get('p', '1')
|
||||
type_id = request.form.get('type_id', '0').strip()
|
||||
search = request.form.get('search', '').strip()
|
||||
|
||||
start = (int(p) - 1) * (int(limit))
|
||||
|
||||
siteM = mw.M('sites').field('id,name,path,status,ps,addtime,edate')
|
||||
if type_id != '' and int(type_id) >= 0:
|
||||
siteM.where('type_id=?', (type_id,))
|
||||
|
||||
sql_where = ''
|
||||
if search != '':
|
||||
sql_where = " name like '%" + search + "%' or ps like '%" + search + "%' "
|
||||
|
||||
if type_id != '' and int(type_id) >= 0 and search != '':
|
||||
sql_where = sql_where + " and type_id=" + type_id + ""
|
||||
elif type_id != '' and int(type_id) >= 0:
|
||||
sql_where = " type_id=" + type_id
|
||||
|
||||
if sql_where != '':
|
||||
siteM.where(sql_where)
|
||||
|
||||
_list = siteM.limit((str(start)) + ',' +
|
||||
limit).order('id desc').select()
|
||||
|
||||
for i in range(len(_list)):
|
||||
_list[i]['backup_count'] = mw.M('backup').where(
|
||||
"pid=? AND type=?", (_list[i]['id'], 0)).count()
|
||||
if _list != None:
|
||||
for i in range(len(_list)):
|
||||
_list[i]['backup_count'] = mw.M('backup').where(
|
||||
"pid=? AND type=?", (_list[i]['id'], 0)).count()
|
||||
|
||||
_ret = {}
|
||||
_ret['data'] = _list
|
||||
@@ -775,6 +787,9 @@ class site_api:
|
||||
mw.execShell('echo "lets" > "' + path + '/README"')
|
||||
elif ssl_type == 'acme':
|
||||
ssl_acme_dir = mw.getAcmeDir() + '/' + site_name
|
||||
if not os.path.exists(ssl_acme_dir):
|
||||
ssl_acme_dir = mw.getAcmeDir() + '/' + site_name + '_ecc'
|
||||
|
||||
acme_csrpath = ssl_acme_dir + '/fullchain.cer'
|
||||
acme_keypath = ssl_acme_dir + '/' + site_name + '.key'
|
||||
if mw.md5(mw.readFile(acme_csrpath)) == mw.md5(mw.readFile(csr_path)):
|
||||
@@ -1420,6 +1435,8 @@ class site_api:
|
||||
data['data'] = mw.readFile(filename)
|
||||
data['rlist'] = []
|
||||
for ds in os.listdir(self.rewritePath):
|
||||
if ds[0:1] == '.':
|
||||
continue
|
||||
if ds == 'list.txt':
|
||||
continue
|
||||
data['rlist'].append(ds[0:len(ds) - 5])
|
||||
|
||||
@@ -755,6 +755,8 @@ class system_api:
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
P_VER=`python3 -V | awk '{print $2}'`
|
||||
|
||||
if [ ! -f /www/server/mdserver-web/bin/activate ];then
|
||||
cd /www/server/mdserver-web && python3 -m venv .
|
||||
cd /www/server/mdserver-web && source /www/server/mdserver-web/bin/activate
|
||||
@@ -769,6 +771,14 @@ if [ ! -z "$cn" ];then
|
||||
fi
|
||||
|
||||
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/requirements.txt -i $PIPSRC
|
||||
|
||||
P_VER_D=`echo "$P_VER"|awk -F '.' '{print $1}'`
|
||||
P_VER_M=`echo "$P_VER"|awk -F '.' '{print $2}'`
|
||||
NEW_P_VER=${P_VER_D}.${P_VER_M}
|
||||
|
||||
if [ -f /www/server/mdserver-web/version/r${NEW_P_VER}.txt ];then
|
||||
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/version/r${NEW_P_VER}.txt -i $PIPSRC
|
||||
fi
|
||||
'''
|
||||
os.system(update_env)
|
||||
self.restartMw()
|
||||
|
||||
@@ -16,7 +16,7 @@ mw_start_task()
|
||||
{
|
||||
isStart=$(ps aux |grep 'task.py'|grep -v grep|awk '{print $2}')
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "Starting mw-tasks... \c"
|
||||
echo -e "starting mw-tasks... \c"
|
||||
cd $DIR && python3 task.py >> ${DIR}/logs/task.log 2>&1 &
|
||||
sleep 0.3
|
||||
isStart=$(ps aux |grep 'task.py'|grep -v grep|awk '{print $2}')
|
||||
@@ -30,7 +30,7 @@ mw_start_task()
|
||||
fi
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
else
|
||||
echo "Starting mw-tasks... mw-tasks (pid $(echo $isStart)) already running"
|
||||
echo "starting mw-tasks... mw-tasks (pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
+20
-17
@@ -16,6 +16,7 @@ cd /www/server/mdserver-web/plugins/php/versions && bash all_test.sh
|
||||
| CentOS 9 Stream |✅ |✅ |
|
||||
| Debian 10.3 |✅ |✅ |
|
||||
| Debian 11.3 |✅ |✅ |
|
||||
| Debian 12.0 |✅ |✅ |
|
||||
| Ubuntu 18.04 |✅ |✅ |
|
||||
| Ubuntu 20.04 |✅ |✅ |
|
||||
| Ubuntu 22.04 |✅ |✅ |
|
||||
@@ -28,23 +29,24 @@ cd /www/server/mdserver-web/plugins/php/versions && bash all_test.sh
|
||||
|
||||
|
||||
|
||||
| 系统名称 |PHP53 |PHP54 |PHP55 |PHP56 |PHP70 |PHP71 |PHP72 |PHP73 |PHP74 |PHP80 |PHP81 |
|
||||
| ----------------- |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
|
||||
| CentOS 7.9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| CentOS 8.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| CentOS 8 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| CentOS 9 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Debian 10.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Debian 11.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 18.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 20.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 22.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Fedora 31 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Fedora 32 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| AlmaLinux 9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| RockyLinux 8.6 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Arch Linux |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| openSUSE 15.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| 系统名称 |PHP53 |PHP54 |PHP55 |PHP56 |PHP70 |PHP71 |PHP72 |PHP73 |PHP74 |PHP80 |PHP81 |PHP82 |
|
||||
| ----------------- |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
|
||||
| CentOS 7.9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| CentOS 8.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| CentOS 8 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| CentOS 9 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Debian 10.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Debian 11.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Debian 12 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 18.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 20.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 22.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Fedora 31 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Fedora 32 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| AlmaLinux 9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| RockyLinux 8.6 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| Arch Linux |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
| openSUSE 15.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
|
||||
|
||||
|
||||
|
||||
@@ -56,6 +58,7 @@ cd /www/server/mdserver-web/plugins/php/versions && bash all_test.sh
|
||||
| CentOS 9 Stream |✅ |✅ |✅ |✅ |
|
||||
| Debian 10.3 |✅ |✅ |✅ |✅ |
|
||||
| Debian 11.3 |✅ |✅ |✅ |✅ |
|
||||
| Debian 12 |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 18.04 |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 20.04 |✅ |✅ |✅ |✅ |
|
||||
| Ubuntu 22.04 |✅ |✅ |✅ |✅ |
|
||||
|
||||
@@ -1,10 +1,47 @@
|
||||
<style type="text/css">
|
||||
|
||||
.docker-sub {
|
||||
border-bottom: 1px solid #ccc;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.docker-sub .on {
|
||||
border-bottom: 2px solid #20a53a;
|
||||
color: #20a53a;
|
||||
font-weight: bold;
|
||||
font-family: "宋体";
|
||||
}
|
||||
.docker-sub span {
|
||||
display: inline-block;
|
||||
font-size: 14px;
|
||||
height: 30px;
|
||||
padding: 0 25px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.docker-environments {
|
||||
resize: none;
|
||||
width: 330px;
|
||||
height: 80px;
|
||||
line-height: 20px;
|
||||
padding: 5px 8px;
|
||||
border: 1px solid #ddd;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="bt-form">
|
||||
<div class='plugin_version'></div>
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('docker');">服务</p>
|
||||
<p onclick="pluginInitD('docker');">自启动</p>
|
||||
<p onclick="dockerList();">容器列表</p>
|
||||
<p onclick="dockerConList();">容器列表</p>
|
||||
<p onclick="dockerImageList();">镜像列表</p>
|
||||
<p onclick="dockerIpList();">IP地址池</p>
|
||||
<p onclick="repoList();">仓库</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
@@ -12,7 +49,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
resetPluginWinWidth(700);
|
||||
resetPluginWinWidth(800);
|
||||
resetPluginWinHeight(400);
|
||||
$.getScript( "/plugins/file?name=docker&f=js/docker.js", function(){
|
||||
pluginService('docker', $('.plugin_version').attr('version'));
|
||||
|
||||
+570
-14
@@ -5,15 +5,28 @@ import io
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import json
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
import docker
|
||||
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getDClient():
|
||||
try:
|
||||
client = docker.from_env()
|
||||
except Exception as e:
|
||||
client = docker.DockerClient(
|
||||
base_url='unix:///Users/midoks/.docker/run/docker.sock')
|
||||
return client
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'docker'
|
||||
|
||||
@@ -26,12 +39,6 @@ def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def getConf():
|
||||
path = getServerDir() + "/redis.conf"
|
||||
return path
|
||||
@@ -48,7 +55,7 @@ def getInitDTpl():
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[3:]
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
@@ -57,19 +64,27 @@ def getArgs():
|
||||
if t.strip() == '':
|
||||
tmp = []
|
||||
else:
|
||||
t = t.split(':')
|
||||
t = t.split(':', 1)
|
||||
tmp[t[0]] = t[1]
|
||||
tmp[t[0]] = t[1]
|
||||
elif args_len > 1:
|
||||
for i in range(len(args)):
|
||||
t = args[i].split(':')
|
||||
t = args[i].split(':', 1)
|
||||
tmp[t[0]] = t[1]
|
||||
return tmp
|
||||
|
||||
|
||||
def checkArgs(self, data, ck=[]):
|
||||
for i in range(len(ck)):
|
||||
print(data[i])
|
||||
if not ck[i] in data:
|
||||
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
|
||||
return (True, mw.returnJson(True, 'ok'))
|
||||
|
||||
|
||||
def status():
|
||||
data = mw.execShell(
|
||||
"ps -ef|grep dockerd |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
|
||||
"ps -ef|grep docker |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
|
||||
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
@@ -138,9 +153,516 @@ def initdUinstall():
|
||||
mw.execShell('systemctl disable ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
# UTC时间转换为时间戳
|
||||
|
||||
def runLog():
|
||||
return getServerDir() + '/data/redis.log'
|
||||
|
||||
def utc_to_local(utc_time_str, utc_format='%Y-%m-%dT%H:%M:%S'):
|
||||
import pytz
|
||||
import datetime
|
||||
import time
|
||||
local_tz = pytz.timezone('Asia/Chongqing')
|
||||
local_format = "%Y-%m-%d %H:%M"
|
||||
utc_dt = datetime.datetime.strptime(utc_time_str, utc_format)
|
||||
local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
|
||||
time_str = local_dt.strftime(local_format)
|
||||
return int(time.mktime(time.strptime(time_str, local_format)))
|
||||
|
||||
|
||||
def conList():
|
||||
c = getDClient()
|
||||
clist = c.containers.list(all=True)
|
||||
conList = []
|
||||
for con in clist:
|
||||
tmp = con.attrs
|
||||
tmp['Created'] = utc_to_local(tmp['Created'].split('.')[0])
|
||||
conList.append(tmp)
|
||||
return conList
|
||||
|
||||
|
||||
def conListData():
|
||||
try:
|
||||
clist = conList()
|
||||
except Exception as e:
|
||||
return mw.returnJson(False, '未开启Docker')
|
||||
return mw.returnJson(True, 'ok', clist)
|
||||
|
||||
|
||||
def dockerRemoveCon():
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['Hostname'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
Hostname = args['Hostname']
|
||||
|
||||
c = getDClient()
|
||||
try:
|
||||
conFind = c.containers.get(Hostname)
|
||||
try:
|
||||
path_list = conFind.attrs['GraphDriver'][
|
||||
'Data']['LowerDir'].split(':')
|
||||
for i in path_list:
|
||||
mw.execShell('chattr -R -i %s' % i)
|
||||
except:
|
||||
pass
|
||||
conFind.remove(force=True)
|
||||
return mw.returnJson(True, '成功删除!')
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, '删除失败!' + str(ex))
|
||||
|
||||
|
||||
def dockerLogCon():
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['Hostname'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
Hostname = args['Hostname']
|
||||
|
||||
c = getDClient()
|
||||
try:
|
||||
conFind = c.containers.get(Hostname)
|
||||
if not conFind:
|
||||
return mw.returnJson(False, 'The specified container does not exist!')
|
||||
log = conFind.logs()
|
||||
if not isinstance(log, str):
|
||||
log = log.decode()
|
||||
return mw.returnJson(True, log)
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, 'Get Logs failed')
|
||||
|
||||
|
||||
def dockerRunCon():
|
||||
# 启动容器
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['Hostname'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
Hostname = args['Hostname']
|
||||
c = getDClient()
|
||||
try:
|
||||
conFind = c.containers.get(Hostname)
|
||||
if not conFind:
|
||||
return mw.returnJson(False, 'The specified container does not exist!')
|
||||
conFind.start()
|
||||
return mw.returnJson(True, '启动成功!')
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, '启动失败!' + str(ex))
|
||||
|
||||
|
||||
def dockerStopCon():
|
||||
# 停止容器
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['Hostname'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
Hostname = args['Hostname']
|
||||
c = getDClient()
|
||||
try:
|
||||
conFind = c.containers.get(Hostname)
|
||||
if not conFind:
|
||||
return mw.returnJson(False, 'The specified container does not exist!')
|
||||
conFind.stop()
|
||||
return mw.returnJson(True, '停止成功!')
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, '停止失败!' + str(ex))
|
||||
|
||||
|
||||
def dockerExec():
|
||||
# 容器执行命令
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['Hostname'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
Hostname = args['Hostname']
|
||||
|
||||
debug_path = 'data/debug.pl'
|
||||
if os.path.exists(debug_path):
|
||||
return mw.returnJson(False, '开发模式不能进入!')
|
||||
|
||||
c = getDClient()
|
||||
try:
|
||||
conFind = c.containers.get(Hostname)
|
||||
cmd = 'docker container exec -it %s /bin/sh' % Hostname
|
||||
return mw.returnJson(True, cmd)
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, '连接失败!')
|
||||
|
||||
|
||||
def imageList():
|
||||
imageList = []
|
||||
c = getDClient()
|
||||
ilist = c.images.list()
|
||||
for image in ilist:
|
||||
tmp_attrs = image.attrs
|
||||
if len(tmp_attrs['RepoTags']) == 1:
|
||||
tmp_image = {}
|
||||
tmp_image['Id'] = tmp_attrs['Id'].split(':')[1][:12]
|
||||
tmp_image['RepoTags'] = tmp_attrs['RepoTags'][0]
|
||||
tmp_image['Size'] = tmp_attrs['Size']
|
||||
tmp_image['Labels'] = tmp_attrs['Config']['Labels']
|
||||
tmp_image['Comment'] = tmp_attrs['Comment']
|
||||
tmp_image['Created'] = utc_to_local(
|
||||
tmp_attrs['Created'].split('.')[0])
|
||||
imageList.append(tmp_image)
|
||||
else:
|
||||
for i in range(len(tmp_attrs['RepoTags'])):
|
||||
tmp_image = {}
|
||||
tmp_image['Id'] = tmp_attrs['Id'].split(':')[1][:12]
|
||||
tmp_image['RepoTags'] = tmp_attrs['RepoTags'][i]
|
||||
tmp_image['Size'] = tmp_attrs['Size']
|
||||
tmp_image['Labels'] = tmp_attrs['Config']['Labels']
|
||||
tmp_image['Comment'] = tmp_attrs['Comment']
|
||||
tmp_image['Created'] = utc_to_local(
|
||||
tmp_attrs['Created'].split('.')[0])
|
||||
imageList.append(tmp_image)
|
||||
imageList = sorted(imageList, key=lambda x: x['Created'], reverse=True)
|
||||
return imageList
|
||||
|
||||
|
||||
def dockerPull():
|
||||
# pull Dockr 官方镜像
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['images'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
images = args['images']
|
||||
if ':' in images:
|
||||
pass
|
||||
else:
|
||||
images = images + ':latest'
|
||||
|
||||
c = getDClient()
|
||||
try:
|
||||
ret = c.images.pull(images)
|
||||
if ret:
|
||||
return mw.returnJson(True, '拉取成功!')
|
||||
else:
|
||||
return mw.returnJson(False, '拉取失败,请检查镜像名称或是否需要登录docker进行下载')
|
||||
except:
|
||||
ret = mw.execShell('docker image pull %s' % images)
|
||||
if 'invalid' in ret[-1]:
|
||||
return mw.returnJson(False, '拉取失败,请检查镜像名称或是否需要登录docker进行下载')
|
||||
else:
|
||||
return mw.returnJson(True, '拉取成功!')
|
||||
|
||||
|
||||
def dockerPlulPath(path):
|
||||
if not path and path == '':
|
||||
return mw.returnJson(False, 'Invalid address')
|
||||
|
||||
ret = mw.execShell('docker image pull %s' % path)
|
||||
if 'invalid' in ret[-1]:
|
||||
return mw.returnJson(False, '拉取失败,请检查镜像名称或是否需要登录docker进行下载')
|
||||
else:
|
||||
return mw.returnJson(True, '拉取成功!')
|
||||
|
||||
|
||||
def dockerPullReg():
|
||||
# pull Dockr 官方镜像
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['path'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
path = args['path']
|
||||
return dockerPlulPath(path)
|
||||
|
||||
|
||||
# 判断镜像是否存在
|
||||
def checkImage(path):
|
||||
image_list = imageList()
|
||||
for i in image_list:
|
||||
if path == i["RepoTags"]:
|
||||
return mw.returnData(False, '镜像已存在!')
|
||||
|
||||
|
||||
def dockerPullPrivateNew():
|
||||
# pull Dockr 官方镜像
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['path'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
path = args['path']
|
||||
check = checkImage(path)
|
||||
if check:
|
||||
return mw.getJson(check)
|
||||
|
||||
my_repo = repoList()
|
||||
if not my_repo:
|
||||
return mw.returnJson(False, '未登录任何私人存储库,请登录然后拉取')
|
||||
return dockerPlulPath(path)
|
||||
|
||||
|
||||
def imageListData():
|
||||
try:
|
||||
ilist = imageList()
|
||||
except Exception as e:
|
||||
return mw.returnJson(False, '未开启Docker')
|
||||
return mw.returnJson(True, 'ok', ilist)
|
||||
|
||||
|
||||
def dockerRemoveImage():
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['imageId', 'repoTags'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
repoTags = args['repoTags']
|
||||
imageId = args['imageId']
|
||||
|
||||
c = getDClient()
|
||||
try:
|
||||
c.images.remove(repoTags)
|
||||
return mw.returnJson(True, '成功删除')
|
||||
except:
|
||||
try:
|
||||
c.images.remove(imageId)
|
||||
return mw.returnJson(True, '成功删除!')
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, '删除失败, 当前镜像正在使用!')
|
||||
|
||||
|
||||
def dockerLoginCheck(user_name, user_pass, registry):
|
||||
# 登陆验证
|
||||
cmd = 'docker login -u=%s -p %s %s' % (user_name, user_pass, registry)
|
||||
# print(cmd)
|
||||
login_test = mw.execShell(cmd)
|
||||
# print(login_test)
|
||||
ret = 'required$|Error'
|
||||
ret2 = re.findall(ret, login_test[-1])
|
||||
if len(ret2) == 0:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def getDockerIpListData():
|
||||
# 取IP列表
|
||||
path = getServerDir()
|
||||
ipConf = path + '/iplist.json'
|
||||
if not os.path.exists(ipConf):
|
||||
return []
|
||||
iplist = json.loads(mw.readFile(ipConf))
|
||||
return iplist
|
||||
|
||||
|
||||
def getDockerIpList():
|
||||
data = getDockerIpListData()
|
||||
return mw.returnJson(True, 'ok!', data)
|
||||
|
||||
|
||||
def dockerAddIP():
|
||||
# 添加IP
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['address', 'netmask', 'gateway'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
path = getServerDir()
|
||||
ipConf = path + '/iplist.json'
|
||||
if not os.path.exists(ipConf):
|
||||
iplist = []
|
||||
mw.writeFile(ipConf, json.dumps(iplist))
|
||||
|
||||
iplist = json.loads(mw.readFile(ipConf))
|
||||
ipInfo = {
|
||||
'address': args['address'],
|
||||
'netmask': args['netmask'],
|
||||
'gateway': args['gateway'],
|
||||
}
|
||||
iplist.append(ipInfo)
|
||||
mw.writeFile(ipConf, json.dumps(iplist))
|
||||
return mw.returnJson(True, '添加成功!')
|
||||
|
||||
|
||||
def dockerDelIP():
|
||||
# 删除IP
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['address'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
path = getServerDir()
|
||||
ipConf = path + '/iplist.json'
|
||||
if not os.path.exists(ipConf):
|
||||
return mw.returnJson(False, '指定的IP不存在。!')
|
||||
iplist = json.loads(mw.readFile(ipConf))
|
||||
newList = []
|
||||
for ipInfo in iplist:
|
||||
if ipInfo['address'] == args['address']:
|
||||
continue
|
||||
newList.append(ipInfo)
|
||||
mw.writeFile(ipConf, json.dumps(newList))
|
||||
return mw.returnJson(True, '成功删除!')
|
||||
|
||||
|
||||
def getDockerCreateInfo():
|
||||
# 取创建依赖
|
||||
import psutil
|
||||
data = {}
|
||||
data['images'] = imageList()
|
||||
data['memSize'] = int(psutil.virtual_memory().total / 1024 / 1024)
|
||||
data['iplist'] = getDockerIpListData()
|
||||
return mw.returnJson(True, 'ok!', data)
|
||||
|
||||
|
||||
def __release_port(port):
|
||||
from collections import namedtuple
|
||||
try:
|
||||
import firewall_api
|
||||
firewall_api.firewall_api().addAcceptPortArgs(port, 'docker', 'port')
|
||||
return port
|
||||
except Exception as e:
|
||||
return "Release failed {}".format(e)
|
||||
|
||||
|
||||
def dockerCreateCon():
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['environments', 'command',
|
||||
'entrypoint', 'image', 'mem_limit', 'ports', 'volumes'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
environments = args['environments']
|
||||
environments = environments.strip().split()
|
||||
|
||||
command = args['command']
|
||||
entrypoint = args['entrypoint']
|
||||
image = args['image']
|
||||
mem_limit = args['mem_limit']
|
||||
ports = args['ports']
|
||||
ports = ports.replace('[', '(').replace(']', ')')
|
||||
volumes = args['volumes']
|
||||
|
||||
# if __name__ == "__main__":
|
||||
# print(args)
|
||||
try:
|
||||
|
||||
c = getDClient()
|
||||
conObject = c.containers.run(
|
||||
image=image,
|
||||
mem_limit=mem_limit + 'M',
|
||||
ports=eval(ports),
|
||||
auto_remove=False,
|
||||
command=command,
|
||||
detach=True,
|
||||
stdin_open=True,
|
||||
tty=True,
|
||||
entrypoint=entrypoint,
|
||||
privileged=True,
|
||||
volumes=json.loads(volumes),
|
||||
cpu_shares=10,
|
||||
environment=environments
|
||||
)
|
||||
if conObject:
|
||||
__release_port(ports)
|
||||
return mw.returnJson(True, '创建成功!')
|
||||
|
||||
return mw.returnJson(False, '创建失败!')
|
||||
except docker.errors.APIError as ex:
|
||||
return mw.returnJson(False, '创建失败!' + str(ex))
|
||||
|
||||
|
||||
def dockerLogin():
|
||||
args = getArgs()
|
||||
|
||||
# print(args)
|
||||
data = checkArgs(args, ['user', 'passwd', 'hub_name',
|
||||
'namespace', 'registry', 'repository_name'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
user_name = args['user']
|
||||
user_pass = args['passwd']
|
||||
registry = args['registry']
|
||||
hub_name = args['hub_name']
|
||||
namespace = args['namespace']
|
||||
repository_name = args['repository_name']
|
||||
|
||||
ret_status = dockerLoginCheck(user_name, user_pass, registry)
|
||||
path = getServerDir()
|
||||
if ret_status:
|
||||
user_file = path + '/user.json'
|
||||
user_info = mw.readFile(user_file)
|
||||
if not user_info:
|
||||
user_info = []
|
||||
else:
|
||||
user_info = json.loads(user_info)
|
||||
|
||||
ret = {}
|
||||
ret['user_name'] = user_name
|
||||
ret['user_pass'] = user_pass
|
||||
ret['registry'] = registry
|
||||
ret['hub_name'] = hub_name
|
||||
ret['namespace'] = namespace
|
||||
ret['repository_name'] = repository_name
|
||||
if not registry:
|
||||
ret['registry'] = "docker.io"
|
||||
user_info.append(ret)
|
||||
mw.writeFile(user_file, json.dumps(user_info))
|
||||
return mw.returnJson(True, '成功登录!')
|
||||
return mw.returnJson(False, '登录失败!')
|
||||
|
||||
|
||||
# 删除用户信息
|
||||
def delete_user_info(registry):
|
||||
path = getServerDir()
|
||||
user_file = path + '/user.json'
|
||||
user_info = mw.readFile(user_file)
|
||||
if user_info:
|
||||
user_info = json.loads(user_info)
|
||||
for i in range(len(user_info)):
|
||||
if registry in user_info[i].values():
|
||||
del(user_info[i])
|
||||
mw.writeFile(user_file, json.dumps(user_info))
|
||||
return True
|
||||
|
||||
|
||||
def dockerLogout():
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['registry'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
registry = args['registry']
|
||||
if registry == "docker.io":
|
||||
registry = ""
|
||||
login_test = mw.execShell('docker logout %s' % registry)
|
||||
if registry == "":
|
||||
registry = "docker.io"
|
||||
ret = 'required$|Error'
|
||||
ret2 = re.findall(ret, login_test[-1])
|
||||
delete_user_info(registry)
|
||||
if len(ret2) == 0:
|
||||
return mw.returnJson(True, '退出成功')
|
||||
else:
|
||||
return mw.returnJson(True, '退出失败')
|
||||
|
||||
|
||||
def repoList():
|
||||
path = getServerDir()
|
||||
repostory_info = []
|
||||
user_file = path + '/user.json'
|
||||
|
||||
if os.path.exists(user_file):
|
||||
user_info = mw.readFile(user_file)
|
||||
user_info = json.loads(user_info)
|
||||
for i in user_info:
|
||||
tmp = {}
|
||||
tmp["hub_name"] = i["hub_name"]
|
||||
tmp["registry"] = i["registry"]
|
||||
tmp["namespace"] = i["namespace"]
|
||||
tmp['repository_name'] = i["repository_name"]
|
||||
repostory_info.append(tmp)
|
||||
|
||||
return mw.returnJson(True, 'ok', repostory_info)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
@@ -163,7 +685,41 @@ if __name__ == "__main__":
|
||||
print(initdUinstall())
|
||||
elif func == 'conf':
|
||||
print(getConf())
|
||||
elif func == 'run_log':
|
||||
print(runLog())
|
||||
elif func == 'con_list':
|
||||
print(conListData())
|
||||
elif func == 'docker_con_log':
|
||||
print(dockerLogCon())
|
||||
elif func == 'docker_remove_con':
|
||||
print(dockerRemoveCon())
|
||||
elif func == 'docker_run_con':
|
||||
print(dockerRunCon())
|
||||
elif func == 'docker_stop_con':
|
||||
print(dockerStopCon())
|
||||
elif func == 'docker_exec':
|
||||
print(dockerExec())
|
||||
elif func == 'docker_pull':
|
||||
print(dockerPull())
|
||||
elif func == 'docker_pull_reg':
|
||||
print(dockerPullReg())
|
||||
elif func == 'image_list':
|
||||
print(imageListData())
|
||||
elif func == 'docker_get_iplist':
|
||||
print(getDockerIpList())
|
||||
elif func == 'docker_del_ip':
|
||||
print(dockerDelIP())
|
||||
elif func == 'docker_add_ip':
|
||||
print(dockerAddIP())
|
||||
elif func == 'get_docker_create_info':
|
||||
print(getDockerCreateInfo())
|
||||
elif func == 'docker_create_con':
|
||||
print(dockerCreateCon())
|
||||
elif func == 'docker_remove_image':
|
||||
print(dockerRemoveImage())
|
||||
elif func == 'docker_login':
|
||||
print(dockerLogin())
|
||||
elif func == 'docker_logout':
|
||||
print(dockerLogout())
|
||||
elif func == 'repo_list':
|
||||
print(repoList())
|
||||
else:
|
||||
print('error')
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
"author": "Zend",
|
||||
"date": "2017-04-01",
|
||||
"home": "https://docker.io",
|
||||
"doc1":"https://docker-py.readthedocs.io/",
|
||||
"type": 0,
|
||||
"pid": "2"
|
||||
}
|
||||
@@ -13,13 +13,17 @@ serverPath=$(dirname "$rootPath")
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
VERSION=$2
|
||||
|
||||
if [ -f ${rootPath}/bin/activate ];then
|
||||
source ${rootPath}/bin/activate
|
||||
fi
|
||||
|
||||
Install_Docker()
|
||||
{
|
||||
which docker
|
||||
if [ "$?" == "0" ];then
|
||||
echo '安装已经完成docker' > $install_tmp
|
||||
exit 0
|
||||
fi
|
||||
# which docker
|
||||
# if [ "$?" == "0" ];then
|
||||
# echo '安装已经完成docker' > $install_tmp
|
||||
# exit 0
|
||||
# fi
|
||||
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/source
|
||||
@@ -28,6 +32,9 @@ Install_Docker()
|
||||
curl -fsSL https://get.docker.com | bash
|
||||
mkdir -p $serverPath/docker
|
||||
fi
|
||||
|
||||
pip install docker
|
||||
pip install pytz
|
||||
|
||||
if [ -d $serverPath/docker ];then
|
||||
echo "${VERSION}" > $serverPath/docker/version.pl
|
||||
|
||||
+806
-2
@@ -53,8 +53,812 @@ function dPostCallbak(method, version, args,callback){
|
||||
},'json');
|
||||
}
|
||||
|
||||
function dockerList(){
|
||||
$(".soft-man-con").html('');
|
||||
|
||||
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});
|
||||
return;
|
||||
};
|
||||
layer.open({
|
||||
type:1,
|
||||
title:'Docker日志',
|
||||
area: '600px',
|
||||
closeBtn: 2,
|
||||
content:'<div class="bt-form">'
|
||||
+'<pre class="crontab-log" style="overflow: auto; \
|
||||
border: 0px none; line-height:23px;padding: 15px; \
|
||||
margin: 0px; white-space: pre-wrap; height: 405px; \
|
||||
background-color: rgb(51,51,51);color:#f1f1f1;\
|
||||
border-radius:0px;">'+ (rdata.msg == '' ? 'No logs':rdata.msg) +'</pre>'
|
||||
+'</div>',
|
||||
success:function(index,layers){
|
||||
$(".crontab-log").scrollTop(1000000);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function deleteCon(Hostname){
|
||||
// 删除容器
|
||||
safeMessage('删除容器 ', '删除容器 ['+Hostname+'], 确定?',function(){
|
||||
dPost('docker_remove_con','',{Hostname:Hostname},function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
dockerConListRender();
|
||||
}
|
||||
},{icon:rdata.status?1:2});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function startCon(Hostname){
|
||||
dPost('docker_run_con','',{Hostname:Hostname},function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
dockerConListRender();
|
||||
}
|
||||
},{icon:rdata.status?1:2});
|
||||
});
|
||||
}
|
||||
|
||||
function stopCon(Hostname){
|
||||
dPost('docker_stop_con','',{Hostname:Hostname},function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
dockerConListRender();
|
||||
}
|
||||
},{icon:rdata.status?1:2});
|
||||
});
|
||||
}
|
||||
|
||||
function execCon(Hostname){
|
||||
webShell();
|
||||
var pdata_socket = {};
|
||||
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);
|
||||
clearInterval(shell);
|
||||
}
|
||||
},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);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
var list = '';
|
||||
var rlist = rdata.data;
|
||||
|
||||
for (var i = 0; i < rlist.length; i++) {
|
||||
var docker_status = 'stop';
|
||||
var status = '<span class="glyphicon glyphicon-pause" style="color:red;font-size:12px"></span>';
|
||||
if (rlist[i]['State']['Status'] == 'running'){
|
||||
docker_status = 'start';
|
||||
status = '<span class="glyphicon glyphicon-play" style="color:#20a53a;font-size:12px"></span>';
|
||||
}
|
||||
|
||||
var op = '';
|
||||
op += '<a href="javascript:;" onclick="execCon(\''+rlist[i]['Config']['Hostname']+'\')" class="btlink">终端</a> | ';
|
||||
op += '<a href="javascript:;" onclick="logsCon(\''+rlist[i]['Id']+'\')" class="btlink">日志</a> | ';
|
||||
op += '<a href="javascript:;" onclick="deleteCon(\''+rlist[i]['Config']['Hostname']+'\')" class="btlink">删除</a>';
|
||||
|
||||
list += '<tr>';
|
||||
list += '<td>'+rlist[i]['Name'].substring(1)+'</td>';
|
||||
list += '<td>'+rlist[i]['Config']['Image']+'</td>';
|
||||
list += '<td>'+getFormatTime(rlist[i]['Created'])+'</td>';
|
||||
|
||||
|
||||
if (docker_status == 'start'){
|
||||
list += '<td style="cursor:pointer;" align="center" onclick="stopCon(\''+rlist[i]['Config']['Hostname']+'\')">'+status+'</td>';
|
||||
} else{
|
||||
list += '<td style="cursor:pointer;" align="center" onclick="startCon(\''+rlist[i]['Config']['Hostname']+'\')">'+status+'</td>';
|
||||
}
|
||||
list += '<td class="text-right">'+op+'</td>';
|
||||
list += '</tr>';
|
||||
}
|
||||
|
||||
$('#con_list tbody').html(list);
|
||||
});
|
||||
}
|
||||
|
||||
function createConTemplate(){
|
||||
|
||||
dPost('get_docker_create_info','',{},function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
console.log(rdata);
|
||||
var rdata = rdata.data;
|
||||
var imageOpt = '';
|
||||
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 += '<option value="'+rdata.images[i].RepoTags+'">'+imageName+'</option>';
|
||||
}
|
||||
var iplistOpt = '';
|
||||
for(var i=0;i<rdata.iplist.length;i++){
|
||||
iplistOpt += '<option value="'+rdata.iplist[i].address+'">'+rdata.iplist[i].address+'</option>';
|
||||
}
|
||||
|
||||
var layer_index = layer.open({
|
||||
type: 1,
|
||||
title: "创建容器",
|
||||
area: '556',
|
||||
closeBtn: 2,
|
||||
shadeClose: false,
|
||||
btn: ['确定', '取消'],
|
||||
content: '<div class="bt-form pd20 pb70 ceart-docker new_tname">\
|
||||
<div class="line">\
|
||||
<span class="tname">镜像</span>\
|
||||
<div class="info-r c4"><select class="bt-input-text docker-image" style="width:330px">'+imageOpt+'</select></div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname">绑定IP</span>\
|
||||
<div class="info-r c4"><select class="bt-input-text docker-address" style="width:330px"><option value="0.0.0.0">0.0.0.0</optin>'+iplistOpt+'</select></div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname">端口映射</span>\
|
||||
<div class="info-r c4">\
|
||||
<div class="type-port">\
|
||||
<input class="bt-input-text" name="name1" type="number" placeholder="容器端口" style="width:110px;margin-right:15px">\
|
||||
<select class="bt-input-text" style="width:90px;margin-right:15px"><option value="TCP">TCP</optin><option value="UDP">UDP</optin></select>\
|
||||
<input class="bt-input-text" name="name2" type="number" placeholder="服务器端口" style="width:90px">\
|
||||
<span class="plus glyphicon glyphicon-plus" style="color: #20a53a;font-size: 11px;"></span>\
|
||||
</div>\
|
||||
<div class="divtable" style="max-height:100px;overflow:auto; margin-top:15px;width:330px;padding-left: 0px;">\
|
||||
<table class="table table-hover">\
|
||||
<tbody id="portabletr"><tr class="more1"><td>当前未添加端口映射</td></tr></tbody>\
|
||||
</table>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname">目录映射</span>\
|
||||
<div class="info-r c4">\
|
||||
<div class="type-volumes">\
|
||||
<input class="bt-input-text" name="path1" type="text" placeholder="容器目录" style="width:110px;margin-right:15px">\
|
||||
<select class="bt-input-text" style="width:90px;margin-right:15px"><option value="rw">read-write</optin><option value="ro">read only</optin></select>\
|
||||
<input class="bt-input-text" name="path2" type="text" placeholder="服务器目录" style="width:90px">\
|
||||
<span class="plus2 glyphicon glyphicon-plus" style="color: #20a53a;font-size: 11px;"></span>\
|
||||
</div>\
|
||||
<div class="divtable" style="max-height:100px;overflow:auto; margin-top:15px;width:330px;padding-left: 0px;">\
|
||||
<table class="table table-hover">\
|
||||
<tbody id="portabletr2"><tr class="more2"><td>当前未添加目录映射</td></tr></tbody>\
|
||||
</table>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname" style="height: auto;line-height: 20px;">环境变量<br>(每行一个)</span>\
|
||||
<div class="info-r c4" style="margin-bottom: 0;">\
|
||||
<div class="type-volumes">\
|
||||
<textarea placeholder="Add variables format as following, one per line:\nJAVA_HOME=/usr/local/java8 HOSTNAME=master" name="environments" class="docker-environments"></textarea>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname">内存配额</span>\
|
||||
<div class="info-r c4"><input class="bt-input-text mr5 docker-mem" type="number" style="width:100px" value="'+parseInt(rdata.memSize/2)+'">\
|
||||
<span class="dc-un">MB</span><i class="help">不超过, '+ rdata.memSize +'MB</i></div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname">CPU配额</span>\
|
||||
<div class="info-r c4">\
|
||||
<input class="bt-input-text mr5 docker-cpu" type="number" max="100" min="1" style="width:100px" value="100">\
|
||||
<span class="dc-un"></span><i class="help">越大,占用的CPU越多</i></div>\
|
||||
</div>\
|
||||
<div class="line">\
|
||||
<span class="tname">执行命令</span>\
|
||||
<div class="info-r c4"><input class="bt-input-text docker-command" type="text" style="width:330px" value="" placeholder="/bin/bash"></div>\
|
||||
</div>\
|
||||
<div class="line" style="display:none">\
|
||||
<span class="tname">entrypoint</span>\
|
||||
<div class="info-r c4"><input class="bt-input-text docker-entrypoint" type="text" style="width:300px" value=""></div>\
|
||||
</div>\
|
||||
</div>',
|
||||
success:function(){
|
||||
$(".bt-cancel").click(function(){
|
||||
layer.close(layer_index);
|
||||
});
|
||||
|
||||
|
||||
$(".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});
|
||||
return;
|
||||
}
|
||||
|
||||
var portval = $('#portabletr')[0].childNodes;
|
||||
for(var i=0;i<portval.length;i++){
|
||||
if(portval[i].childNodes[0].innerText == '当前未添加目录映射') continue;
|
||||
var sport = portval[i].childNodes[2].innerText;
|
||||
if(name2 == sport){
|
||||
layer.msg('The port ['+name2+'] is already in the mapping list!',{icon:2});
|
||||
return;
|
||||
}
|
||||
}
|
||||
var address = $('.docker-address').val();
|
||||
if(address == '0.0.0.0'){
|
||||
address = '*';
|
||||
}
|
||||
var port = address + ':' + name2;
|
||||
var loadT = layer.msg('Testing <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){
|
||||
layer.close(loadT);
|
||||
if(rdata !== false){
|
||||
layer.msg('Port ['+name2+'] is already in the mapping list!',{icon:2});
|
||||
return;
|
||||
}
|
||||
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>';
|
||||
$("#portabletr").append(portable);
|
||||
$(".more1").remove();
|
||||
$(".minus").click(function(){
|
||||
$(this).parents("tr").remove();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$(".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});
|
||||
return;
|
||||
}
|
||||
var portval = $('#portabletr2')[0].childNodes;
|
||||
for(var i=0;i<portval.length;i++){
|
||||
if(portval[i].childNodes[0].innerText == '当前未添加目录映射') continue;
|
||||
var sport = portval[i].childNodes[2].innerText;
|
||||
if(path2 == sport){
|
||||
layer.msg('Directory ['+path2+'] is already in the mapping list!',{icon:2});
|
||||
return;
|
||||
}
|
||||
}
|
||||
var selecttype = $(".type-volumes select").val();
|
||||
var portable= '<tr>\
|
||||
<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 class="text-right" width="50"><a href="javascript:;" class="btlink minus2">Del</a></td>\
|
||||
</tr>';
|
||||
$("#portabletr2").append(portable);
|
||||
$(".more2").remove();
|
||||
$(".minus2").click(function(){
|
||||
$(this).parents("tr").remove();
|
||||
});
|
||||
});
|
||||
},
|
||||
yes:function(layero,layer_id){
|
||||
var ports = {};
|
||||
var volumes = {};
|
||||
var portval = $('#portabletr')[0].childNodes;
|
||||
var address = $('.docker-address').val();
|
||||
var portval2 = $('#portabletr2')[0].childNodes;
|
||||
var command = $('.docker-command').val()
|
||||
var entrypoint = $('.docker-entrypoint').val()
|
||||
var accept = [];
|
||||
|
||||
//遍历端口映射
|
||||
for(var i=0;i<portval.length;i++){
|
||||
// console.log(portval[i].childNodes[0].innerText);
|
||||
if(portval[i].childNodes[0].innerText == '当前未添加端口映射') {
|
||||
continue;
|
||||
}
|
||||
var port = portval[i].childNodes[0].innerText.replace(/\s/g,'');
|
||||
var dport = port + '/' + portval[i].childNodes[1].innerText.toLowerCase().replace(/\s/g,'');
|
||||
var sport = [address,parseInt(portval[i].childNodes[2].innerText.replace(/\s/g,''))];
|
||||
ports[dport] = sport
|
||||
accept.push(port);
|
||||
}
|
||||
|
||||
//遍历目录映射
|
||||
volumes['/sys/fs/cgroup'] = {'bind':'/sys/fs/cgroup', 'mode': 'rw'};
|
||||
for(var i=0;i<portval2.length;i++){
|
||||
if(portval2[i].childNodes[0].innerText.replace(/\s/g,' ') == '当前未添加目录映射') {
|
||||
continue;
|
||||
}
|
||||
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,'')};
|
||||
volumes[dpath] = spath
|
||||
}
|
||||
|
||||
var data = {
|
||||
image:$('.docker-image').val(),
|
||||
ports:JSON.stringify(ports),
|
||||
accept:JSON.stringify(accept),
|
||||
volumes:JSON.stringify(volumes),
|
||||
environments:$('.docker-environments').val(),
|
||||
mem_limit:$('.docker-mem').val(),
|
||||
cpu_shares:$('.docker-cpu').val(),
|
||||
command:command,
|
||||
entrypoint:entrypoint
|
||||
}
|
||||
|
||||
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});
|
||||
return;
|
||||
}
|
||||
dPost('docker_create_con','', data, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
layer.close(layer_index);
|
||||
dockerConListRender();
|
||||
}
|
||||
},{ icon: rdata.status ? 1 : 2 });
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function dockerConList(){
|
||||
|
||||
var con = '<div class="safe bgw">\
|
||||
<button onclick="createConTemplate();" class="btn btn-success 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>状态</th>\
|
||||
<th style="text-align:right;">操作</th></tr></thead>\
|
||||
<tbody></tbody></table>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>';
|
||||
|
||||
$(".soft-man-con").html(con);
|
||||
dockerConListRender();
|
||||
}
|
||||
|
||||
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) {
|
||||
dockerImageListRender();
|
||||
}
|
||||
},{ icon: rdata.status ? 1 : 2 });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function pullImages(tag, id){
|
||||
console.log(tag, id);
|
||||
layer.msg('开发中!',{ icon: 2 });
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 += '<a href="javascript:;" onclick="pullImages(\''+rlist[i]['RepoTags']+'\',\''+rlist[i]['Id']+'\')" class="btlink">拉取</a> | ';
|
||||
op += '<a href="javascript:;" onclick="deleteImages(\''+rlist[i]['RepoTags']+'\',\''+rlist[i]['Id']+'\')" class="btlink">删除</a>';
|
||||
|
||||
list += '<tr>';
|
||||
list += '<td>'+rlist[i]['RepoTags']+'</td>';
|
||||
list += '<td>'+tag+'</td>';
|
||||
list += '<td>'+toSize(rlist[i]['Size'])+'</td>';
|
||||
list += '<td>'+license+'</td>';
|
||||
list += '<td>'+desc+'</td>';
|
||||
list += '<td class="text-right">'+op+'</td>';
|
||||
list += '</tr>';
|
||||
}
|
||||
|
||||
$('#con_list tbody').html(list);
|
||||
});
|
||||
}
|
||||
|
||||
function dockerPullImagesFileTemplate(){
|
||||
// 拉取镜像文件模板
|
||||
var layer_index = layer.open({
|
||||
type: 1,
|
||||
title: "获取镜像",
|
||||
area: '500px',
|
||||
closeBtn: 2,
|
||||
shadeClose: false,
|
||||
content: '<div class="bt-docker pd20">'+
|
||||
'<div class="docker-sub">'+
|
||||
'<span class="on">官方库</span>'+
|
||||
'<span>公共库</span>'+
|
||||
'<span>私有库</span>'+
|
||||
'</div>'+
|
||||
'<div class="bt-form bt-docker-con">'+
|
||||
'<div class="conter official_pull pd15"><div class="line">'+
|
||||
'<span class="tname">镜像名:</span>\
|
||||
<div class="info-r c4">\
|
||||
<input class="bt-input-text mr5" type="text" name="official_pull_name" style="width:218px" value="">\
|
||||
<button type="button" class="btn btn-sm btn-success official_pull_btn">获取</button>\
|
||||
</div>'+
|
||||
'</div></div>'+
|
||||
'<div class="conter public_pull pd15" style="display: none;"><div class="line">'+
|
||||
'<span class="tname">镜像名:</span>\
|
||||
<div class="info-r c4">\
|
||||
<input class="bt-input-text mr5" type="text" name="public_pull_path" style="width:218px" value="">\
|
||||
<button type="button" class="btn btn-sm btn-success public_pull_btn">获取</button>\
|
||||
</div>'+
|
||||
'</div></div>'+
|
||||
'<div class="conter private_pull pd15" style="display: none;">'+
|
||||
'<div class="line"><span class="tname">镜像地址:</span>\
|
||||
<div class="info-r c4">\
|
||||
<input class="bt-input-text mr5" type="text" name="private_pull_path" style="width:218px" value="">\
|
||||
<button type="button" class="btn btn-sm btn-success private_pull_btn">获取</button>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>',
|
||||
success:function(layero,layer_id){
|
||||
|
||||
$('.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(){
|
||||
var name = $('[name="official_pull_name"]').val();
|
||||
if(name == ''){
|
||||
layer.msg('镜像名不能为空!');
|
||||
return;
|
||||
}
|
||||
dPost('docker_pull','',{images:name}, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
layer.close(layer_index);
|
||||
dockerImageListRender();
|
||||
|
||||
}
|
||||
},{ icon: rdata.status ? 1 : 2 });
|
||||
});
|
||||
});
|
||||
|
||||
$('.public_pull_btn').click(function(){
|
||||
var path = $('[name="public_pull_path"]').val();
|
||||
if(path == ''){
|
||||
layer.msg('公共网络镜像地址不能为空。');
|
||||
return;
|
||||
}
|
||||
|
||||
dPost('docker_pull_reg','',{path:path}, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
layer.close(layer_index);
|
||||
dockerImageListRender();
|
||||
}
|
||||
},{ icon: rdata.status ? 1 : 2 });
|
||||
});
|
||||
});
|
||||
$('.private_pull_btn').click(function(){
|
||||
var path = $('[name="private_pull_path"]').val();
|
||||
if(path == ''){
|
||||
layer.msg('专用镜像地址不能为空!');
|
||||
return
|
||||
}
|
||||
|
||||
dPost('docker_pull_private_new','',{path:path}, function(rdata){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg,function(){
|
||||
if(rdata.status) {
|
||||
layer.close(layer_index);
|
||||
dockerImageListRender();
|
||||
}
|
||||
},{ icon: rdata.status ? 1 : 2 });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function dockerImageList(){
|
||||
|
||||
var con = '<div class="safe bgw">\
|
||||
<button onclick="dockerPullImagesFileTemplate()" class="btn btn-success 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>证书</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);
|
||||
|
||||
dockerImageListRender();
|
||||
}
|
||||
|
||||
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) {
|
||||
dockerIpListRender();
|
||||
}
|
||||
},{ icon: rdata.status ? 1 : 2 });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
var list = '';
|
||||
var rlist = rdata.data;
|
||||
|
||||
for (var i = 0; i < rlist.length; i++) {
|
||||
|
||||
var op = '';
|
||||
op += '<a href="javascript:;" onclick="deleteIpList(\''+rlist[i]['address']+'\')" class="btlink">删除</a>';
|
||||
|
||||
list += '<tr>';
|
||||
list += '<td>'+rlist[i]['address']+'</td>';
|
||||
list += '<td>'+rlist[i]['netmask']+'</td>';
|
||||
list += '<td>'+rlist[i]['gateway']+'</td>';
|
||||
list += '<td class="text-right">'+op+'</td>';
|
||||
list += '</tr>';
|
||||
}
|
||||
|
||||
$('#ip_list tbody').html(list);
|
||||
});
|
||||
}
|
||||
|
||||
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){
|
||||
var rdata = $.parseJSON(rdata.data);
|
||||
showMsg(rdata.msg, function(){
|
||||
dockerIpListRender();
|
||||
},{icon:rdata.status?1:2})
|
||||
});
|
||||
}
|
||||
|
||||
function dockerIpList(){
|
||||
var con = '<div class="safe bgw">\
|
||||
<div class="search_input">\
|
||||
<input class="bt-input-text mr5" type="text" style="width:150px" name="address" placeholder="IP地址">\
|
||||
<input class="bt-input-text mr5" name="netmask" type="text" style="width:150px" placeholder="子网掩码">\
|
||||
<input name="gateway" class="bt-input-text mr5" type="text" style="width:150px" placeholder="网关">\
|
||||
<button class="btn btn-success btn-sm va0" onclick="dockerAddIpPool()">添加</button>\
|
||||
</div>\
|
||||
<div class="divtable mtb10">\
|
||||
<div class="tablescroll">\
|
||||
<table id="ip_list" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
|
||||
<thead><tr>\
|
||||
<th>IP地址</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);
|
||||
|
||||
dockerIpListRender();
|
||||
}
|
||||
|
||||
// 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 += '<option value="'+ obj.arry[i] +'">'+ obj.arry[i] +'</option>';
|
||||
}
|
||||
var layer_index = layer.open({
|
||||
type: 1,
|
||||
title: "登录到存储库",
|
||||
area: '450px',
|
||||
closeBtn: 2,
|
||||
shadeClose: false,
|
||||
content: '<div class="bt-docker-con docker_content">'+
|
||||
'<style>.line .tname{width:120px;}</style>'+
|
||||
'<div class="soft-man-con pd20 pb70 private_pull">'+
|
||||
'<div class="line"><span class="tname">Repository Type</span><div class="info-r c4"><select class="bt-input-text mr5 project_version" name="dtype" style="width:250px">'+ _option1 +'</select></div></div>'+
|
||||
'<div class="line"><span class="tname">Name:</span><div class="info-r"><input class="bt-input-text" type="text" name="ctm_name" style="width:250px" value="'+obj.name+'"></div></div>'+
|
||||
'<div class="line"><span class="tname">Username:</span><div class="info-r"><input class="bt-input-text" type="text" name="user" style="width:250px" value="'+obj.user_name+'"></div></div>'+
|
||||
'<div class="line"><span class="tname">Password:</span><div class="info-r"><input class="bt-input-text" type="password" name="passwd" style="width:250px" value="'+obj.user_pass+'"></div></div>'+
|
||||
'<div class="line"><span class="tname">Repository Name:</span><div class="info-r"><input class="bt-input-text" type="text" name="hub_name" style="width:250px" value="'+obj.hub_name+'"></div></div>'+
|
||||
'<div class="line"><span class="tname">Namespaces:</span><div class="info-r"><input class="bt-input-text" type="text" name="namespace" style="width:250px" value="'+obj.namespace+'"></div></div>'+
|
||||
'<div class="line" style="display:none"><span class="tname">Registry:</span><div class="info-r"><input class="bt-input-text" type="text" name="registry" style="width:250px" value="'+obj.registry+'"></div></div>'+
|
||||
'<div class="bt-form-submit-btn"><button type="button" class="btn btn-sm btn-success login_aliyun">登录</button></div>'+
|
||||
'</div>'+
|
||||
'</div>',
|
||||
success:function(){
|
||||
$('[name="dtype"]').change(function(e){
|
||||
var docker_type = $(this).val();
|
||||
if(docker_type == 'Other Repository'){
|
||||
$('.docker_content .line').show();
|
||||
}else{
|
||||
$('.docker_content .line').filter(":lt(3)").show().end().filter(":gt(4)").hide();
|
||||
}
|
||||
});
|
||||
$('.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();
|
||||
|
||||
var args = {
|
||||
user:user,
|
||||
passwd:passwd,
|
||||
registry:'',
|
||||
repository_name:name,
|
||||
hub_name:hub_name,
|
||||
namespace:namespace
|
||||
};
|
||||
if($('[name="dtype"]').val() == 'Docker Repository'){
|
||||
args.registry = '';
|
||||
}else{
|
||||
args.registry = registry;
|
||||
}
|
||||
|
||||
console.log(obj);
|
||||
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){
|
||||
repoListRender();
|
||||
layer.close(layer_index);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
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) {
|
||||
repoListRender();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
var list = '';
|
||||
var rlist = rdata.data;
|
||||
|
||||
for (var i = 0; i < rlist.length; i++) {
|
||||
|
||||
list += '<tr>';
|
||||
list += '<td>'+rlist[i]['hub_name']+'</td>';
|
||||
list += '<td>'+rlist[i]['repository_name']+'</td>';
|
||||
list += '<td>'+rlist[i]['namespace']+'</td>';
|
||||
list += '<td>'+rlist[i]['registry']+'</td>';
|
||||
list += '<td class="text-right"><a href="javascript:;" onclick="delRepo(\''+rlist[i]['registry']+'\')" class="btlink">删除</a></td>';
|
||||
list += '</tr>';
|
||||
}
|
||||
|
||||
$('#con_list tbody').html(list);
|
||||
});
|
||||
}
|
||||
function repoList(){
|
||||
|
||||
var con = '<div class="safe bgw">\
|
||||
<button id="docker_login" title="" class="btn btn-success 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>Name</th>\
|
||||
<th>Repository Name</th>\
|
||||
<th>NameSpace</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);
|
||||
|
||||
//login
|
||||
$('#docker_login').click(function(){
|
||||
repoLogin();
|
||||
});
|
||||
|
||||
repoListRender();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ max_connections = 500
|
||||
max_connect_errors = 100
|
||||
open_files_limit = 65535
|
||||
|
||||
skip-name-resolve=1
|
||||
skip_name_resolve=1
|
||||
#skip-grant-tables
|
||||
#skip-networking
|
||||
#skip-external-locking
|
||||
|
||||
@@ -41,7 +41,7 @@ max_connections = 500
|
||||
max_connect_errors = 100
|
||||
open_files_limit = 65535
|
||||
|
||||
skip-name-resolve=1
|
||||
skip_name_resolve=1
|
||||
#skip-grant-tables
|
||||
#skip-networking
|
||||
#skip-external-locking
|
||||
|
||||
@@ -17,6 +17,7 @@ datadir = {$SERVER_APP_PATH}/data
|
||||
log-error = {$SERVER_APP_PATH}/data/error.log
|
||||
server-id = {$SERVER_ID}
|
||||
|
||||
explicit_defaults_for_timestamp=true
|
||||
default_storage_engine = InnoDB
|
||||
|
||||
|
||||
@@ -40,7 +41,7 @@ max_connect_errors = 100
|
||||
open_files_limit = 2560
|
||||
max_allowed_packet = 128M
|
||||
|
||||
skip_name_resolve = 1
|
||||
skip_name_resolve=1
|
||||
skip-ssl
|
||||
#skip-networking
|
||||
#skip-external-locking
|
||||
@@ -95,7 +96,7 @@ innodb_file_per_table = 1
|
||||
innodb_large_prefix = 1
|
||||
|
||||
secure-file-priv={$SERVER_APP_PATH}/tmp
|
||||
|
||||
#secure-file-priv=disabled
|
||||
[mysqldump]
|
||||
quick
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ max_connect_errors = 100
|
||||
open_files_limit = 2560
|
||||
max_allowed_packet = 128M
|
||||
|
||||
skip_name_resolve = 1
|
||||
skip_name_resolve=1
|
||||
#skip-networking
|
||||
#skip-external-locking
|
||||
#loose-skip-innodb
|
||||
|
||||
@@ -383,7 +383,7 @@ def initMysql57Data():
|
||||
myconf = serverdir + "/etc/my.cnf"
|
||||
user = pGetDbUser()
|
||||
cmd = 'cd ' + serverdir + ' && ./bin/mysqld --defaults-file=' + myconf + \
|
||||
' --initialize-insecure --explicit_defaults_for_timestamp'
|
||||
' --initialize-insecure --explicit_defaults_for_timestamp --user=mysql'
|
||||
data = mw.execShell(cmd)
|
||||
# print(data)
|
||||
return False
|
||||
|
||||
@@ -181,7 +181,7 @@ function changeMySQLDataPath(act) {
|
||||
$.post('/database?action=GetMySQLInfo', '', function(rdata) {
|
||||
var LimitCon = '<p class="conf_p">\
|
||||
<input id="datadir" class="phpUploadLimit bt-input-text mr5" style="width:350px;" type="text" value="' + rdata.datadir + '" name="datadir">\
|
||||
<span onclick="ChangePath(\'datadir\')" class="glyphicon glyphicon-folder-open cursor mr20" style="width:auto"></span><button class="btn btn-success btn-sm" onclick="changeMySQLDataPath(1)">' + lan.soft.mysql_to + '</button>\
|
||||
<span onclick="changePath(\'datadir\')" class="glyphicon glyphicon-folder-open cursor mr20" style="width:auto"></span><button class="btn btn-success btn-sm" onclick="changeMySQLDataPath(1)">' + lan.soft.mysql_to + '</button>\
|
||||
</p>';
|
||||
$(".soft-man-con").html(LimitCon);
|
||||
});
|
||||
|
||||
@@ -86,6 +86,7 @@ Install_mysql()
|
||||
make -j${cpuCore} && make install && make clean
|
||||
|
||||
if [ -d $serverPath/mysql ];then
|
||||
rm -rf ${mysqlDir}/mysql-${VERSION}
|
||||
echo '5.5' > $serverPath/mysql/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
else
|
||||
|
||||
@@ -105,6 +105,7 @@ Install_mysql()
|
||||
|
||||
|
||||
if [ -d $serverPath/mysql ];then
|
||||
rm -rf ${mysqlDir}/mysql-${VERSION}
|
||||
echo '5.6' > $serverPath/mysql/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
else
|
||||
|
||||
@@ -118,6 +118,7 @@ Install_mysql()
|
||||
make -j${cpuCore} && make install && make clean
|
||||
|
||||
if [ -d $serverPath/mysql ];then
|
||||
rm -rf ${mysqlDir}/mysql-${VERSION}
|
||||
echo '5.7' > $serverPath/mysql/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
else
|
||||
|
||||
@@ -210,6 +210,7 @@ Install_mysql()
|
||||
make -j${cpuCore} && make install && make clean
|
||||
|
||||
if [ -d $serverPath/mysql ];then
|
||||
rm -rf ${mysqlDir}/mysql-${VERSION}
|
||||
echo '8.0' > $serverPath/mysql/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
else
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 878 B |
Executable
+26
@@ -0,0 +1,26 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class='plugin_version'></div>
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('nezha',$('.plugin_version').attr('version'));">面板服务</p>
|
||||
<p onclick="pluginInitD('nezha',$('.plugin_version').attr('version'));">面板自启动</p>
|
||||
<p onclick="nezha.cfg($('.plugin_version').attr('version'));">面板配置</p>
|
||||
<p onclick="pluginConfig('nezha', $('.plugin_version').attr('version'), 'conf');">面板配置文件</p>
|
||||
<p onclick="pluginService('nezha', $('.plugin_version').attr('version'), 'agent');">AGENT服务</p>
|
||||
<p onclick="pluginInitD('nezha', $('.plugin_version').attr('version'), 'agent');">AGENT自启动</p>
|
||||
<p onclick="nezha.agent_cfg($('.plugin_version').attr('version'));">AGENT配置</p>
|
||||
<p onclick="nezha.readme();">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
resetPluginWinHeight(530);
|
||||
$.getScript( "/plugins/file?name=nezha&f=js/nezha.js", function(){
|
||||
nezha.init();
|
||||
pluginService('nezha');
|
||||
});
|
||||
</script>
|
||||
Executable
+364
@@ -0,0 +1,364 @@
|
||||
# coding:utf-8
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import socket
|
||||
import json
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
class App:
|
||||
__setupPath = '/www/server/nezha'
|
||||
__cfg = ''
|
||||
__agent_cfg = ''
|
||||
|
||||
def __init__(self):
|
||||
self.__setupPath = self.getServerDir()
|
||||
self.__cfg = self.__setupPath + '/nezha.cfg'
|
||||
self.__agent_cfg = self.__setupPath + '/agent.cfg'
|
||||
|
||||
def getArgs(self):
|
||||
args = sys.argv[3:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':', 1)
|
||||
tmp[t[0]] = t[1]
|
||||
elif args_len > 1:
|
||||
for i in range(len(args)):
|
||||
t = args[i].split(':', 1)
|
||||
tmp[t[0]] = t[1]
|
||||
|
||||
return tmp
|
||||
|
||||
def checkArgs(self, data, ck=[]):
|
||||
for i in range(len(ck)):
|
||||
if not ck[i] in data:
|
||||
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
|
||||
return (True, mw.returnJson(True, 'ok'))
|
||||
|
||||
def __release_port(self, port):
|
||||
from collections import namedtuple
|
||||
try:
|
||||
import firewall_api
|
||||
firewall_api.firewall_api().addAcceptPortArgs(port, 'nezha', 'port')
|
||||
return port
|
||||
except Exception as e:
|
||||
return "Release failed {}".format(e)
|
||||
|
||||
def openPort(self):
|
||||
for i in ["9527", "5555"]:
|
||||
self.__release_port(i)
|
||||
return True
|
||||
|
||||
def getPluginName(self):
|
||||
return 'nezha'
|
||||
|
||||
def getPluginDir(self):
|
||||
return mw.getPluginDir() + '/' + self.getPluginName()
|
||||
|
||||
def getServerDir(self):
|
||||
return mw.getServerDir() + '/' + self.getPluginName()
|
||||
|
||||
def getInitdConfTpl(self):
|
||||
path = self.getPluginDir() + "/init.d/nezha.tpl"
|
||||
return path
|
||||
|
||||
def getInitdAgentConfTpl(self):
|
||||
path = self.getPluginDir() + "/init.d/nezha-agent.tpl"
|
||||
return path
|
||||
|
||||
def getHomeDir(self):
|
||||
if mw.isAppleSystem():
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
return '/Users/' + user
|
||||
else:
|
||||
return '/root'
|
||||
|
||||
def getRunUser(self):
|
||||
if mw.isAppleSystem():
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
return user
|
||||
else:
|
||||
return 'root'
|
||||
|
||||
def status(self):
|
||||
cmd = "ps -ef|grep " + self.getPluginName() + \
|
||||
" |grep -v grep | grep -v nezha-agent | grep -v python | awk '{print $2}'"
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return "stop"
|
||||
return 'start'
|
||||
|
||||
def status_agent(self):
|
||||
cmd = "ps -ef | grep nezha-agent | grep -v grep | grep -v python | awk '{print $2}'"
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
def contentReplace(self, content):
|
||||
|
||||
service_path = mw.getServerDir()
|
||||
content = content.replace('{$ROOT_PATH}', mw.getRootDir())
|
||||
content = content.replace('{$SERVER_PATH}', service_path)
|
||||
content = content.replace('{$RUN_USER}', self.getRunUser())
|
||||
content = content.replace('{$HOME_DIR}', self.getHomeDir())
|
||||
|
||||
return content
|
||||
|
||||
def initDreplace(self):
|
||||
|
||||
file_tpl = self.getInitdConfTpl()
|
||||
service_path = mw.getServerDir()
|
||||
|
||||
initD_path = self.getServerDir() + '/init.d'
|
||||
if not os.path.exists(initD_path):
|
||||
os.mkdir(initD_path)
|
||||
self.openPort()
|
||||
|
||||
file_bin = initD_path + '/' + self.getPluginName()
|
||||
|
||||
if not os.path.exists(file_bin):
|
||||
content = mw.readFile(file_tpl)
|
||||
content = self.contentReplace(content)
|
||||
mw.writeFile(file_bin, content)
|
||||
mw.execShell('chmod +x ' + file_bin)
|
||||
|
||||
# systemd
|
||||
systemDir = mw.systemdCfgDir()
|
||||
systemService = systemDir + '/nezha.service'
|
||||
systemServiceTpl = self.getPluginDir() + '/init.d/nezha.service.tpl'
|
||||
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
||||
service_path = mw.getServerDir()
|
||||
se_content = mw.readFile(systemServiceTpl)
|
||||
se_content = self.contentReplace(se_content)
|
||||
mw.writeFile(systemService, se_content)
|
||||
mw.execShell('systemctl daemon-reload')
|
||||
|
||||
return file_bin
|
||||
|
||||
def contentAgentReplace(self, content):
|
||||
path = self.__agent_cfg
|
||||
if os.path.exists(path):
|
||||
data = self.get_agent_cfg()
|
||||
content = content.replace('{$APP_HOST}', data['host'])
|
||||
content = content.replace('{$APP_SECRET}', data['secret'])
|
||||
|
||||
return content
|
||||
|
||||
def initDAgent(self):
|
||||
file_tpl = self.getInitdAgentConfTpl()
|
||||
|
||||
initD_path = self.getServerDir() + '/init.d'
|
||||
if not os.path.exists(initD_path):
|
||||
os.mkdir(initD_path)
|
||||
|
||||
file_agent_bin = initD_path + '/nezha-agent'
|
||||
|
||||
content = mw.readFile(file_tpl)
|
||||
content = self.contentReplace(content)
|
||||
content = self.contentAgentReplace(content)
|
||||
mw.writeFile(file_agent_bin, content)
|
||||
mw.execShell('chmod +x ' + file_agent_bin)
|
||||
|
||||
# systemd
|
||||
sysDir = mw.systemdCfgDir()
|
||||
sysService = sysDir + '/nezha-agent.service'
|
||||
sysServiceTpl = self.getPluginDir() + '/init.d/nezha-agent.service.tpl'
|
||||
service_path = mw.getServerDir()
|
||||
content = mw.readFile(sysServiceTpl)
|
||||
content = self.contentReplace(content)
|
||||
content = self.contentAgentReplace(content)
|
||||
mw.writeFile(sysService, content)
|
||||
mw.execShell('systemctl daemon-reload')
|
||||
|
||||
return file_agent_bin
|
||||
|
||||
def init_cfg(self):
|
||||
self.initDreplace()
|
||||
self.initDAgent()
|
||||
|
||||
def imOp(self, method):
|
||||
|
||||
file = self.initDreplace()
|
||||
|
||||
if not mw.isAppleSystem():
|
||||
cmd = 'systemctl {} {}'.format(method, self.getPluginName())
|
||||
data = mw.execShell(cmd)
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
data = mw.execShell(file + ' ' + method)
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[0]
|
||||
|
||||
def start(self):
|
||||
return self.imOp('start')
|
||||
|
||||
def stop(self):
|
||||
return self.imOp('stop')
|
||||
|
||||
def restart(self):
|
||||
return self.imOp('restart')
|
||||
|
||||
def reload(self):
|
||||
return self.imOp('reload')
|
||||
|
||||
def agOp(self, method):
|
||||
file = self.initDAgent()
|
||||
|
||||
path = self.__agent_cfg
|
||||
if not os.path.exists(path):
|
||||
return '请先设置Agent配置!'
|
||||
|
||||
if not mw.isAppleSystem():
|
||||
cmd = 'systemctl {} {}'.format(method, 'nezha-agent')
|
||||
data = mw.execShell(cmd)
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
data = mw.execShell(file + ' ' + method)
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[0]
|
||||
|
||||
def start_agent(self):
|
||||
return self.agOp('start')
|
||||
|
||||
def stop_agent(self):
|
||||
return self.agOp('stop')
|
||||
|
||||
def restart_agent(self):
|
||||
return self.agOp('restart')
|
||||
|
||||
def reload_agent(self):
|
||||
return self.agentOp('reload')
|
||||
|
||||
def initd_status(self):
|
||||
cmd = 'systemctl status nezha | grep loaded | grep "enabled;"'
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'fail'
|
||||
return 'ok'
|
||||
|
||||
def initd_install(self):
|
||||
mw.execShell('systemctl enable nezha')
|
||||
return 'ok'
|
||||
|
||||
def initd_uninstall(self):
|
||||
mw.execShell('systemctl disable nezha')
|
||||
return 'ok'
|
||||
|
||||
def initd_status_agent(self):
|
||||
cmd = 'systemctl status nezha-agent | grep loaded | grep "enabled;"'
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'fail'
|
||||
return 'ok'
|
||||
|
||||
def initd_install_agent(self):
|
||||
mw.execShell('systemctl enable nezha-agent')
|
||||
return 'ok'
|
||||
|
||||
def initd_uninstall_agent(self):
|
||||
mw.execShell('systemctl disable nezha-agent')
|
||||
return 'ok'
|
||||
|
||||
def conf(self):
|
||||
return self.getServerDir() + '/dashboard/data/config.yaml'
|
||||
|
||||
def nezha_cfg(self):
|
||||
path = self.__cfg
|
||||
if not os.path.exists(path):
|
||||
d = {}
|
||||
cmd_un = 'cd ' + self.getServerDir() + '/dashboard && ./nezha conf -u ""'
|
||||
mw.execShell(cmd_un)
|
||||
td = mw.execShell(cmd_un)
|
||||
d['username'] = td[0].strip()
|
||||
|
||||
pwd = mw.getRandomString(16)
|
||||
cmd_pwd = 'cd ' + self.getServerDir() + '/dashboard && ./nezha conf -u "" -p ' + pwd
|
||||
td = mw.execShell(cmd_pwd)
|
||||
d['password'] = pwd
|
||||
|
||||
mw.writeFile(path, mw.enDoubleCrypt('nezha', mw.getJson(d)))
|
||||
|
||||
info = mw.readFile(path)
|
||||
info = mw.deDoubleCrypt('nezha', info)
|
||||
|
||||
info = json.loads(info)
|
||||
return mw.returnJson(True, 'ok', info)
|
||||
|
||||
def nezha_save_cfg(self):
|
||||
args = self.getArgs()
|
||||
data = self.checkArgs(args, ['username', 'password'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
path = self.__cfg
|
||||
|
||||
cmd = 'cd ' + self.getServerDir() + '/dashboard && ./nezha conf -su "' + \
|
||||
args['username'] + '" -p ' + args['password']
|
||||
# print(cmd)
|
||||
t = mw.execShell(cmd)
|
||||
# print(t)
|
||||
mw.writeFile(path, mw.enDoubleCrypt('nezha', mw.getJson(args)))
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
|
||||
def get_agent_cfg(self):
|
||||
path = self.__agent_cfg
|
||||
info = mw.readFile(path)
|
||||
info = mw.deDoubleCrypt('agent', info)
|
||||
info = json.loads(info)
|
||||
return info
|
||||
|
||||
def agent_cfg(self):
|
||||
path = self.__agent_cfg
|
||||
if not os.path.exists(path):
|
||||
d = {}
|
||||
d['host'] = '127.0.0.1:5555'
|
||||
d['secret'] = 'secret'
|
||||
mw.writeFile(path, mw.enDoubleCrypt('agent', mw.getJson(d)))
|
||||
|
||||
info = self.get_agent_cfg()
|
||||
return mw.returnJson(True, 'ok', info)
|
||||
|
||||
def agent_save_cfg(self):
|
||||
args = self.getArgs()
|
||||
data = self.checkArgs(args, ['host', 'secret'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
path = self.__agent_cfg
|
||||
mw.writeFile(path, mw.enDoubleCrypt('agent', mw.getJson(args)))
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
|
||||
def run_log(self):
|
||||
return self.getServerDir() + '/logs/nezha.log'
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
classApp = App()
|
||||
try:
|
||||
data = eval("classApp." + func + "()")
|
||||
print(data)
|
||||
except Exception as e:
|
||||
print('error:' + str(e))
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"sort": 7,
|
||||
"ps": "哪吒监控面板/改造版",
|
||||
"name": "nezha",
|
||||
"title": "哪吒监控",
|
||||
"shell": "install.sh",
|
||||
"versions":["0.15.2"],
|
||||
"tip": "soft",
|
||||
"checks": "server/nezha",
|
||||
"path": "server/nezha",
|
||||
"display": 1,
|
||||
"author": "midoks",
|
||||
"date": "2023-06-26",
|
||||
"home": "https://github.com/midoks/nezha",
|
||||
"doc1": "https://nezha.wiki/",
|
||||
"type": 0,
|
||||
"pid": "5"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
[Unit]
|
||||
Description=Nezha Agent
|
||||
After=syslog.target
|
||||
#After=network.target
|
||||
#After=nezha-dashboard.service
|
||||
|
||||
[Service]
|
||||
# Modify these two values and uncomment them if you have
|
||||
# repos with lots of files and get an HTTP error 500 because
|
||||
# of that
|
||||
###
|
||||
#LimitMEMLOCK=infinity
|
||||
#LimitNOFILE=65535
|
||||
Type=simple
|
||||
User=root
|
||||
Group=root
|
||||
WorkingDirectory={$SERVER_PATH}/nezha/agent/
|
||||
ExecStart={$SERVER_PATH}/nezha/agent/nezha-agent -s {$APP_HOST} -p {$APP_SECRET}
|
||||
Restart=always
|
||||
#Environment=DEBUG=true
|
||||
|
||||
# Some distributions may not support these hardening directives. If you cannot start the service due
|
||||
# to an unknown option, comment out the ones not supported by your version of systemd.
|
||||
#ProtectSystem=full
|
||||
#PrivateDevices=yes
|
||||
#PrivateTmp=yes
|
||||
#NoNewPrivileges=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
# chkconfig: 2345 55 25
|
||||
# description: Nezha Agent Service
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: Nezha Agent
|
||||
# Required-Start: $all
|
||||
# Required-Stop: $all
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: starts Nezha Agent
|
||||
# Description: starts the Nezha Agent
|
||||
### END INIT INFO
|
||||
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
if [ -f /etc/init.d/functions ];then
|
||||
. /etc/init.d/functions
|
||||
fi
|
||||
|
||||
if [ -f /etc/rc.d/init.d/functions ];then
|
||||
. /etc/rc.d/init.d/functions
|
||||
fi
|
||||
|
||||
SERVICENAME=nezha-agent
|
||||
LOG_PATH={$SERVER_PATH}/nezha/logs
|
||||
APP_PATH={$SERVER_PATH}/nezha/agent
|
||||
APP_HOST={$APP_HOST}
|
||||
APP_SECRET={$APP_SECRET}
|
||||
|
||||
|
||||
app_start(){
|
||||
isStart=`ps -ef|grep "${SERVICENAME}" | grep -v grep | grep -v python | grep -v "/bin/bash" | awk '{print $2}'`
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "Starting ${SERVICENAME}... \c"
|
||||
cd $APP_PATH
|
||||
exec nohup ${APP_PATH}/${SERVICENAME} -d -s ${APP_HOST} -p ${APP_SECRET} >> ${LOG_PATH}/${SERVICENAME}.log 2>&1 &
|
||||
isStart=""
|
||||
while [[ "$isStart" == "" ]];
|
||||
do
|
||||
echo -e ".\c"
|
||||
sleep 0.5
|
||||
isStart=$(ps -ef|grep "${SERVICENAME}" |grep -v grep | grep -v python | grep -v "/bin/bash" | awk '{print $2}')
|
||||
let n+=1
|
||||
if [ $n -gt 15 ];then
|
||||
break;
|
||||
fi
|
||||
done
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "\033[31mError: ${SERVICENAME} service startup failed.\033[0m"
|
||||
return;
|
||||
fi
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
else
|
||||
echo "Starting ${SERVICENAME}(pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
app_stop(){
|
||||
pids=`ps -ef | grep "${SERVICENAME}" | grep -v grep | grep -v python | grep -v "/bin/bash" |awk '{print $2}'`
|
||||
arr=($pids)
|
||||
echo -e "Stopping ${SERVICENAME}... \c"
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
# echo "$p"
|
||||
kill -9 $p
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
}
|
||||
|
||||
app_status(){
|
||||
isStart=`ps -ef | grep "${SERVICENAME}" | grep -v grep | grep -v python | grep -v "/bin/bash" | awk '{print $2}'`
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "${SERVICENAME} not running"
|
||||
else
|
||||
echo -e "${SERVICENAME}(pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
'start') app_start;;
|
||||
'stop') app_stop;;
|
||||
'status') app_status;;
|
||||
'reload')
|
||||
app_stop
|
||||
app_start;;
|
||||
'restart')
|
||||
app_stop
|
||||
app_start;;
|
||||
esac
|
||||
@@ -0,0 +1,30 @@
|
||||
[Unit]
|
||||
Description=Nezha Dashborad
|
||||
After=syslog.target
|
||||
After=network.target
|
||||
After=mariadb.service mysqld.service postgresql.service memcached.service redis.service
|
||||
|
||||
[Service]
|
||||
# Modify these two values and uncomment them if you have
|
||||
# repos with lots of files and get an HTTP error 500 because
|
||||
# of that
|
||||
###
|
||||
#LimitMEMLOCK=infinity
|
||||
#LimitNOFILE=65535
|
||||
Type=simple
|
||||
#User=root
|
||||
#Group=root
|
||||
WorkingDirectory={$SERVER_PATH}/nezha/dashboard/
|
||||
ExecStart={$SERVER_PATH}/nezha/dashboard/nezha web
|
||||
Restart=always
|
||||
#Environment=DEBUG=true
|
||||
|
||||
# Some distributions may not support these hardening directives. If you cannot start the service due
|
||||
# to an unknown option, comment out the ones not supported by your version of systemd.
|
||||
ProtectSystem=full
|
||||
PrivateDevices=yes
|
||||
PrivateTmp=yes
|
||||
NoNewPrivileges=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,87 @@
|
||||
#!/bin/bash
|
||||
# chkconfig: 2345 55 25
|
||||
# description: Nezha Service
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: Nezha
|
||||
# Required-Start: $all
|
||||
# Required-Stop: $all
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: starts Nezha
|
||||
# Description: starts the Nezha
|
||||
### END INIT INFO
|
||||
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
if [ -f /etc/init.d/functions ];then
|
||||
. /etc/init.d/functions
|
||||
fi
|
||||
|
||||
if [ -f /etc/rc.d/init.d/functions ];then
|
||||
. /etc/rc.d/init.d/functions
|
||||
fi
|
||||
|
||||
SERVICENAME=nezha
|
||||
LOG_PATH={$SERVER_PATH}/${SERVICENAME}/logs
|
||||
APP_PATH={$SERVER_PATH}/${SERVICENAME}/dashboard
|
||||
|
||||
|
||||
app_start(){
|
||||
isStart=`ps -ef|grep "${SERVICENAME} web" | grep -v grep | grep -v python | grep -v "/bin/bash" | awk '{print $2}'`
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "Starting ${SERVICENAME}... \c"
|
||||
cd $APP_PATH && exec nohup ${APP_PATH}/${SERVICENAME} web >> ${LOG_PATH}/${SERVICENAME}.log 2>&1 &
|
||||
isStart=""
|
||||
while [[ "$isStart" == "" ]];
|
||||
do
|
||||
echo -e ".\c"
|
||||
sleep 0.5
|
||||
isStart=$(ps -ef|grep "${SERVICENAME} web" |grep -v grep | grep -v python | grep -v "/bin/bash" | awk '{print $2}')
|
||||
let n+=1
|
||||
if [ $n -gt 15 ];then
|
||||
break;
|
||||
fi
|
||||
done
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "\033[31mError: ${SERVICENAME} service startup failed.\033[0m"
|
||||
return;
|
||||
fi
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
else
|
||||
echo "Starting ${SERVICENAME}(pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
app_stop(){
|
||||
pids=`ps -ef | grep "${SERVICENAME} web" | grep -v grep | grep -v python | grep -v "/bin/bash" |awk '{print $2}'`
|
||||
arr=($pids)
|
||||
echo -e "Stopping ${SERVICENAME}... \c"
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
# echo "$p"
|
||||
kill -9 $p
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
}
|
||||
|
||||
app_status(){
|
||||
isStart=`ps -ef | grep "${SERVICENAME} web" | grep -v grep | grep -v python | grep -v "/bin/bash" | awk '{print $2}'`
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "${SERVICENAME} not running"
|
||||
else
|
||||
echo -e "${SERVICENAME}(pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
'start') app_start;;
|
||||
'stop') app_stop;;
|
||||
'status') app_status;;
|
||||
'reload')
|
||||
app_stop
|
||||
app_start;;
|
||||
'restart')
|
||||
app_stop
|
||||
app_start;;
|
||||
esac
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
action=$1
|
||||
type=$2
|
||||
|
||||
if [ "${2}" == "" ];then
|
||||
echo '缺少安装脚本...' > $install_tmp
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -d $curPath/versions/$2 ];then
|
||||
echo '缺少安装脚本2...' > $install_tmp
|
||||
exit 0
|
||||
fi
|
||||
|
||||
sh -x $curPath/versions/$2/install.sh $1
|
||||
|
||||
if [ "${action}" == "uninstall" ];then
|
||||
if [ -f /usr/lib/systemd/system/nezha.service ] || [ -f /lib/systemd/system/nezha.service ] ;then
|
||||
systemctl stop nezha
|
||||
systemctl disable nezha
|
||||
rm -rf /usr/lib/systemd/system/nezha.service
|
||||
rm -rf /lib/systemd/system/nezha.service
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
|
||||
if [ -f /usr/lib/systemd/system/nezha-agent.service ] || [ -f /lib/systemd/system/nezha-agent.service ] ;then
|
||||
systemctl stop nezha-agent
|
||||
systemctl disable nezha-agent
|
||||
rm -rf /usr/lib/systemd/system/nezha-agent.service
|
||||
rm -rf /lib/systemd/system/nezha-agent.service
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
fi
|
||||
Executable
+184
@@ -0,0 +1,184 @@
|
||||
var nezha = {
|
||||
plugin_name: 'nezha',
|
||||
init: function () {
|
||||
var _this = this;
|
||||
},
|
||||
|
||||
send:function(info){
|
||||
var tips = info['tips'];
|
||||
var method = info['method'];
|
||||
var args = info['data'];
|
||||
var callback = info['success'];
|
||||
|
||||
var loadT = layer.msg(tips, { icon: 16, time: 0, shade: 0.3 });
|
||||
|
||||
var data = {};
|
||||
data['name'] = 'nezha';
|
||||
data['func'] = method;
|
||||
data['version'] = $('.plugin_version').attr('version');
|
||||
|
||||
if (typeof(args) == 'string'){
|
||||
data['args'] = JSON.stringify(toArrayObject(args));
|
||||
} else {
|
||||
data['args'] = JSON.stringify(args);
|
||||
}
|
||||
|
||||
$.post('/plugins/run', data, function(res) {
|
||||
layer.close(loadT);
|
||||
if (!res.status){
|
||||
layer.msg(res.msg,{icon:2,time:10000});
|
||||
return;
|
||||
}
|
||||
|
||||
var ret_data = $.parseJSON(res.data);
|
||||
console.log("send:",ret_data);
|
||||
// if (!ret_data.status){
|
||||
// layer.msg(ret_data.msg,{icon:2,time:2000});
|
||||
// return;
|
||||
// }
|
||||
|
||||
// console.log("send2:",ret_data);
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(ret_data);
|
||||
}
|
||||
},'json');
|
||||
},
|
||||
|
||||
postCallback:function(info){
|
||||
var tips = info['tips'];
|
||||
var method = info['method'];
|
||||
var args = info['data'];
|
||||
var callback = info['success'];
|
||||
|
||||
var loadT = layer.msg(tips, { icon: 16, time: 0, shade: 0.3 });
|
||||
|
||||
var data = {};
|
||||
data['name'] = 'nezha';
|
||||
data['func'] = method;
|
||||
data['version'] = $('.plugin_version').attr('version');
|
||||
|
||||
if (typeof(args) == 'string'){
|
||||
data['args'] = JSON.stringify(toArrayObject(args));
|
||||
} else {
|
||||
data['args'] = JSON.stringify(args);
|
||||
}
|
||||
|
||||
$.post('/plugins/callback', data, function(res) {
|
||||
layer.close(loadT);
|
||||
if (!res.status){
|
||||
layer.msg(res.msg,{icon:2,time:10000});
|
||||
return;
|
||||
}
|
||||
|
||||
var ret_data = $.parseJSON(res.data);
|
||||
if (!ret_data.status){
|
||||
layer.msg(ret_data.msg,{icon:2,time:2000});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(res);
|
||||
}
|
||||
},'json');
|
||||
},
|
||||
|
||||
repeatPwd:function (a, id) {
|
||||
$("#"+id).val(randomStrPwd(a))
|
||||
},
|
||||
|
||||
save_cfg:function(version){
|
||||
var username = $("input[name='username']").val();
|
||||
var password = $("input[name='password']").val();
|
||||
|
||||
this.send({
|
||||
tips:'正在设置中...',
|
||||
data:{'username':username,'password':password},
|
||||
method:'nezha_save_cfg',
|
||||
success:function(rdata){
|
||||
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
cfg:function(version){
|
||||
this.send({
|
||||
tips:'正在获取中...',
|
||||
method:'nezha_cfg',
|
||||
success:function(data){
|
||||
var d = data.data;
|
||||
var value = '<p>\
|
||||
<span>用户名</span>\
|
||||
<input id="nz_username" style="width: 160px;" class="bt-input-text mr5" name="username" value="'+d['username']+'" type="text">\
|
||||
,<span title="随机用户名" class="glyphicon glyphicon-repeat cursor" onclick="nezha.repeatPwd(8,\'nz_username\')"></span>\
|
||||
</p>';
|
||||
|
||||
value += '<p>\
|
||||
<span>密码</span>\
|
||||
<input id="nz_password" style="width: 160px;" class="bt-input-text mr5" name="password" value="'+d['password']+'" type="text">\
|
||||
,<span title="随机密码" class="glyphicon glyphicon-repeat cursor" onclick="nezha.repeatPwd(16,\'nz_password\')"></span>\
|
||||
</p>';
|
||||
var conf = '<style>.conf_p p{margin-bottom: 2px;} .conf_p span {width: 50px;}</style><div class="conf_p" style="margin-bottom:0">\
|
||||
' + value + '\
|
||||
<div style="margin-top:10px; padding-right:15px" class="text-right">\
|
||||
<button class="btn btn-success btn-sm mr5" onclick="nezha.cfg(\'' + version + '\')">刷新</button>\
|
||||
<button class="btn btn-success btn-sm" onclick="nezha.save_cfg(\'' + version + '\')">保存</button>\
|
||||
</div>\
|
||||
</div>'
|
||||
$(".soft-man-con").html(conf);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
agent_save_cfg:function(version){
|
||||
var host = $("input[name='host']").val();
|
||||
var secret = $("input[name='secret']").val();
|
||||
|
||||
this.send({
|
||||
tips:'正在设置中...',
|
||||
data:{'host':host,'secret':secret},
|
||||
method:'agent_save_cfg',
|
||||
success:function(rdata){
|
||||
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
agent_cfg:function(version){
|
||||
this.send({
|
||||
tips:'正在获取中...',
|
||||
method:'agent_cfg',
|
||||
success:function(data){
|
||||
var d = data.data;
|
||||
var value = '<p>\
|
||||
<span>地址</span>\
|
||||
<input id="nz_username" style="width: 160px;" class="bt-input-text mr5" name="host" value="'+d['host']+'" type="text">\
|
||||
,<font>如1.1.1.1:5444</font>\
|
||||
</p>';
|
||||
|
||||
value += '<p>\
|
||||
<span>密钥</span>\
|
||||
<input id="nz_password" style="width: 160px;" class="bt-input-text mr5" name="secret" value="'+d['secret']+'" type="text">\
|
||||
,<font>密钥</font>\
|
||||
</p>';
|
||||
var conf = '<style>.conf_p p{margin-bottom: 2px;} .conf_p span {width: 50px;}</style><div class="conf_p" style="margin-bottom:0">\
|
||||
' + value + '\
|
||||
<div style="margin-top:10px; padding-right:15px" class="text-right">\
|
||||
<button class="btn btn-success btn-sm mr5" onclick="nezha.agent_cfg(\'' + version + '\')">刷新</button>\
|
||||
<button class="btn btn-success btn-sm" onclick="nezha.agent_save_cfg(\'' + version + '\')">保存</button>\
|
||||
</div>\
|
||||
</div>'
|
||||
$(".soft-man-con").html(conf);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
readme:function (){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>安装时不会自动启动。</li>';
|
||||
readme += '<li>哪吒面板是改造版,用户名和密码登录【面板配置】,不依赖github/gitee/gitlab。</li>';
|
||||
readme += '<li>Agent需要先手动填写正确信息。</li>';
|
||||
readme += '</ul>';
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
}
|
||||
Executable
+158
@@ -0,0 +1,158 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
VERSION=0.15.2
|
||||
|
||||
# bash install.sh install 0.15.2
|
||||
# cd /www/server/mdserver-web/plugins/nezha && bash install.sh install 0.15.2
|
||||
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/nezha && bash install.sh install 0.15.2
|
||||
|
||||
bash ${rootPath}/scripts/getos.sh
|
||||
OSNAME=`cat ${rootPath}/data/osname.pl`
|
||||
OSNAME_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||
|
||||
|
||||
ARCH="amd64"
|
||||
|
||||
get_arch() {
|
||||
TMP_ARCH=`arch`
|
||||
if [ "$TMP_ARCH" == "x86_64" ];then
|
||||
ARCH="amd64"
|
||||
elif [ "$TMP_ARCH" == "aarch64" ];then
|
||||
ARCH="arm64"
|
||||
else
|
||||
echo $ARCH
|
||||
fi
|
||||
}
|
||||
|
||||
load_vars() {
|
||||
OS=$(uname | tr '[:upper:]' '[:lower:]')
|
||||
TARGET_DIR="$serverPath/nezha/dashboard"
|
||||
|
||||
|
||||
## China_IP
|
||||
if [[ -z "${CN}" ]]; then
|
||||
if [[ $(curl -m 10 -s https://ipapi.co/json | grep 'China') != "" ]]; then
|
||||
CN=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "${CN}" ]]; then
|
||||
GITHUB_RAW_URL="raw.githubusercontent.com/midoks/nezha/main"
|
||||
GITHUB_URL="github.com"
|
||||
else
|
||||
GITHUB_RAW_URL="cdn.jsdelivr.net/gh/midoks/nezha@main"
|
||||
GITHUB_URL="dn-dao-github-mirror.daocloud.io"
|
||||
fi
|
||||
|
||||
echo $GITHUB_RAW_URL
|
||||
echo $GITHUB_URL
|
||||
}
|
||||
|
||||
# download file
|
||||
download_file() {
|
||||
url="${1}"
|
||||
destination="${2}"
|
||||
|
||||
printf "Fetching ${url} \n\n"
|
||||
|
||||
if test -x "$(command -v curl)"; then
|
||||
code=$(curl --connect-timeout 15 -w '%{http_code}' -L "${url}" -o "${destination}")
|
||||
elif test -x "$(command -v wget)"; then
|
||||
code=$(wget -t2 -T15 -O "${destination}" --server-response "${url}" 2>&1 | awk '/^ HTTP/{print $2}' | tail -1)
|
||||
else
|
||||
printf "\e[1;31mNeither curl nor wget was available to perform http requests.\e[0m\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${code}" != 200 ]; then
|
||||
printf "\e[1;31mRequest failed with code %s\e[0m\n" $code
|
||||
exit 1
|
||||
else
|
||||
printf "\n\e[1;33mDownload succeeded\e[0m\n"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
Install_dashborad(){
|
||||
echo '正在安装哪吒监控...' > $install_tmp
|
||||
mkdir -p $serverPath/source
|
||||
|
||||
if [ ! -f $TARGET_DIR/nezha ];then
|
||||
|
||||
DOWNLOAD_URL="https://${GITHUB_URL}/midoks/nezha/releases/download/v${VERSION}/nezha-${OS}-${ARCH}.zip"
|
||||
|
||||
DOWNLOAD_FILE="$(mktemp).zip"
|
||||
download_file $DOWNLOAD_URL $DOWNLOAD_FILE
|
||||
|
||||
if [ ! -d $TARGET_DIR ]; then
|
||||
mkdir -p $TARGET_DIR
|
||||
fi
|
||||
|
||||
unzip $DOWNLOAD_FILE -d $TARGET_DIR
|
||||
rm -rf $DOWNLOAD_FILE
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
Install_agent(){
|
||||
echo -e "正在下载监控端" > $install_tmp
|
||||
mkdir -p $serverPath/source
|
||||
|
||||
version=v0.15.1
|
||||
|
||||
AGENT_TARGET_DIR="$serverPath/nezha/agent"
|
||||
|
||||
DOWNLOAD_URL="https://${GITHUB_URL}/nezhahq/agent/releases/download/${version}/nezha-agent_${OS}_${ARCH}.zip"
|
||||
DOWNLOAD_FILE="$(mktemp).zip"
|
||||
|
||||
if [ ! -f $AGENT_TARGET_DIR/nezha-agent ];then
|
||||
download_file $DOWNLOAD_URL $DOWNLOAD_FILE
|
||||
|
||||
if [ ! -d $AGENT_TARGET_DIR ]; then
|
||||
mkdir -p $AGENT_TARGET_DIR
|
||||
fi
|
||||
|
||||
unzip $DOWNLOAD_FILE -d $AGENT_TARGET_DIR
|
||||
rm -rf $DOWNLOAD_FILE
|
||||
fi
|
||||
}
|
||||
|
||||
Install_App()
|
||||
{
|
||||
load_vars
|
||||
get_arch
|
||||
|
||||
Install_dashborad
|
||||
Install_agent
|
||||
|
||||
if [ -d $serverPath/nezha ];then
|
||||
echo "$VERSION" > $serverPath/nezha/version.pl
|
||||
cd ${rootPath} && python3 ${rootPath}/plugins/nezha/index.py init_cfg
|
||||
fi
|
||||
echo 'install successful' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_App()
|
||||
{
|
||||
cd ${rootPath} && python3 ${rootPath}/plugins/nezha/index.py initd_uninstall
|
||||
cd ${rootPath} && python3 ${rootPath}/plugins/nezha/index.py initd_uninstall_agent
|
||||
cd ${rootPath} && python3 ${rootPath}/plugins/nezha/index.py stop
|
||||
cd ${rootPath} && python3 ${rootPath}/plugins/nezha/index.py stop_agent
|
||||
rm -rf $serverPath/nezha
|
||||
echo "install fail" > $install_tmp
|
||||
}
|
||||
|
||||
action=$1
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_App
|
||||
else
|
||||
Uninstall_App
|
||||
fi
|
||||
@@ -533,49 +533,51 @@ end
|
||||
function waf()
|
||||
min_route()
|
||||
-- C:D("min_route")
|
||||
-- white ip
|
||||
if waf_ip_white() then return true end
|
||||
-- C:D("waf_ip_white")
|
||||
|
||||
-- url white
|
||||
if waf_url_white() then return true end
|
||||
-- C:D("waf_url_white")
|
||||
|
||||
-- black ip
|
||||
if waf_ip_black() then return true end
|
||||
-- C:D("waf_ip_black")
|
||||
|
||||
-- 封禁ip返回
|
||||
if waf_drop_ip() then return true end
|
||||
-- C:D("waf_drop_ip")
|
||||
|
||||
-- ua check
|
||||
if waf_user_agent() then return true end
|
||||
-- C:D("waf_user_agent")
|
||||
if waf_url() then return true end
|
||||
-- C:D("waf_url")
|
||||
|
||||
-- cc setting
|
||||
if waf_cc_increase() then return true end
|
||||
-- C:D("waf_cc_increase")
|
||||
if waf_cc() then return true end
|
||||
-- C:D("waf_cc")
|
||||
|
||||
-- cookie检查
|
||||
if waf_cookie() then return true end
|
||||
-- C:D("waf_cookie")
|
||||
|
||||
-- args参数拦截
|
||||
if waf_get_args() then return true end
|
||||
-- C:D("waf_get_args")
|
||||
|
||||
-- 扫描软件禁止
|
||||
if waf_scan_black() then return true end
|
||||
-- C:D("waf_scan_black")
|
||||
if waf_post() then return true end
|
||||
-- C:D("waf_post")
|
||||
|
||||
if site_config[server_name] and site_config[server_name]['open'] then
|
||||
-- white ip
|
||||
if waf_ip_white() then return true end
|
||||
-- C:D("waf_ip_white")
|
||||
|
||||
-- url white
|
||||
if waf_url_white() then return true end
|
||||
-- C:D("waf_url_white")
|
||||
|
||||
-- black ip
|
||||
if waf_ip_black() then return true end
|
||||
-- C:D("waf_ip_black")
|
||||
|
||||
-- 封禁ip返回
|
||||
if waf_drop_ip() then return true end
|
||||
-- C:D("waf_drop_ip")
|
||||
|
||||
-- ua check
|
||||
if waf_user_agent() then return true end
|
||||
-- C:D("waf_user_agent")
|
||||
if waf_url() then return true end
|
||||
-- C:D("waf_url")
|
||||
|
||||
-- cc setting
|
||||
if waf_cc_increase() then return true end
|
||||
-- C:D("waf_cc_increase")
|
||||
if waf_cc() then return true end
|
||||
-- C:D("waf_cc")
|
||||
|
||||
-- cookie检查
|
||||
if waf_cookie() then return true end
|
||||
-- C:D("waf_cookie")
|
||||
|
||||
-- args参数拦截
|
||||
if waf_get_args() then return true end
|
||||
-- C:D("waf_get_args")
|
||||
|
||||
-- 扫描软件禁止
|
||||
if waf_scan_black() then return true end
|
||||
-- C:D("waf_scan_black")
|
||||
if waf_post() then return true end
|
||||
-- C:D("waf_post")
|
||||
--------------------------------------------------------
|
||||
--------------------------------------------------------
|
||||
if X_Forwarded() then return true end
|
||||
-- C:D("X_Forwarded")
|
||||
if post_X_Forwarded() then return true end
|
||||
|
||||
@@ -12,9 +12,9 @@ version=$1
|
||||
action=$2
|
||||
|
||||
if [ -f /lib/systemd/system/php${version}-php-fpm.service ];then
|
||||
systemctl ${action} php${version}
|
||||
systemctl ${action} php${version}-php-fpm
|
||||
elif [[ -f /usr/lib/systemd/system/php${version}-php-fpm.service ]]; then
|
||||
systemctl ${action} php${version}
|
||||
systemctl ${action} php${version}-php-fpm
|
||||
else
|
||||
$serverPath/php/init.d/php${version} ${action}
|
||||
fi
|
||||
@@ -7,6 +7,7 @@ Description=The PHP {$VERSION} FastCGI Process Manager
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Environment="LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/www/server/lib/icu/lib"
|
||||
PIDFile={$SERVER_PATH}/php/{$VERSION}/var/run/php-fpm.pid
|
||||
ExecStart={$SERVER_PATH}/php/{$VERSION}/sbin/php-fpm --nodaemonize --fpm-config {$SERVER_PATH}/php/{$VERSION}/etc/php-fpm.conf
|
||||
ExecReload=/bin/kill -USR2 $MAINPID
|
||||
|
||||
@@ -49,6 +49,7 @@ fi
|
||||
|
||||
cd ${curPath} && sh -x $curPath/versions/$2/install.sh $1
|
||||
|
||||
|
||||
if [ "${action}" == "install" ] && [ -d ${serverPath}/php/${type} ];then
|
||||
|
||||
#初始化
|
||||
@@ -59,6 +60,7 @@ if [ "${action}" == "install" ] && [ -d ${serverPath}/php/${type} ];then
|
||||
echo "install PHP${type} extend start"
|
||||
|
||||
# cd /www/server/mdserver-web/plugins/php/versions/common && bash iconv.sh install 53
|
||||
# cd /www/server/mdserver-web/plugins/php/versions/common && bash intl.sh install 73
|
||||
# cd /www/server/mdserver-web/plugins/php/versions/common && bash gd.sh install 56
|
||||
# cd /www/server/mdserver-web/plugins/php/versions/common && bash openssl.sh install 56
|
||||
# cd /www/server/mdserver-web/plugins/php/versions/common && bash sodium.sh install 81
|
||||
@@ -72,7 +74,6 @@ if [ "${action}" == "install" ] && [ -d ${serverPath}/php/${type} ];then
|
||||
cd ${rootPath}/plugins/php/versions/common && bash gettext.sh install ${type}
|
||||
cd ${rootPath}/plugins/php/versions/common && bash redis.sh install ${type}
|
||||
cd ${rootPath}/plugins/php/versions/common && bash memcached.sh install ${type}
|
||||
cd ${rootPath}/plugins/php/versions/common && bash zlib.sh install ${type}
|
||||
|
||||
if [ "${type}" -gt "72" ];then
|
||||
cd ${rootPath}/plugins/php/versions/common && bash zip.sh install ${type}
|
||||
|
||||
@@ -15,11 +15,20 @@ SOURCE_ROOT=$rootPath/source/lib
|
||||
|
||||
if [ ! -d ${SERVER_ROOT}/freetype ];then
|
||||
cd $SOURCE_ROOT
|
||||
wget -O freetype-2.12.1.tar.gz --no-check-certificate https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz -T 5
|
||||
tar zxvf freetype-2.12.1.tar.gz
|
||||
cd freetype-2.12.1
|
||||
|
||||
if [ ! -f $SOURCE_ROOT/freetype-2.12.1.tar.gz ];then
|
||||
wget -O freetype-2.12.1.tar.gz --no-check-certificate https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz -T 5
|
||||
fi
|
||||
|
||||
if [ ! -d $SOURCE_ROOT/freetype-2.12.1 ];then
|
||||
tar zxvf freetype-2.12.1.tar.gz
|
||||
cd freetype-2.12.1
|
||||
else
|
||||
cd freetype-2.12.1
|
||||
fi
|
||||
|
||||
./configure --prefix=${SERVER_ROOT}/freetype && make && make install
|
||||
cd $SOURCE_ROOT
|
||||
cd $SOURCE_ROOT && rm -rf freetype-2.12.1
|
||||
#rm -rf freetype-2.12.1.tar.gz
|
||||
#rm -rf freetype-2.12.1
|
||||
|
||||
fi
|
||||
@@ -15,11 +15,20 @@ SOURCE_ROOT=$rootPath/source/lib
|
||||
|
||||
if [ ! -d ${SERVER_ROOT}/freetype_old ];then
|
||||
cd $SOURCE_ROOT
|
||||
wget -O freetype-2.7.1.tar.gz --no-check-certificate https://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz -T 5
|
||||
tar zxvf freetype-2.7.1.tar.gz
|
||||
cd freetype-2.7.1
|
||||
|
||||
if [ ! -f $SOURCE_ROOT/freetype-2.7.1.tar.gz ];then
|
||||
wget -O freetype-2.7.1.tar.gz --no-check-certificate https://download.savannah.gnu.org/releases/freetype/freetype-2.7.1.tar.gz -T 5
|
||||
fi
|
||||
|
||||
if [ ! -d $SOURCE_ROOT/freetype-2.7.1 ];then
|
||||
tar zxvf freetype-2.7.1.tar.gz
|
||||
cd freetype-2.7.1
|
||||
else
|
||||
cd freetype-2.7.1
|
||||
fi
|
||||
|
||||
./configure --prefix=${SERVER_ROOT}/freetype_old && make && make install
|
||||
#cd $SOURCE_ROOT
|
||||
cd $SOURCE_ROOT && rm -rf freetype-2.7.1
|
||||
|
||||
#rm -rf freetype-2.7.1.tar.gz
|
||||
#rm -rf freetype-2.7.1
|
||||
fi
|
||||
@@ -24,6 +24,22 @@ mkdir -p $serverPath/php
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.gz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.gz https://museum.php.net/php5/php-${version}.tar.gz
|
||||
fi
|
||||
|
||||
@@ -24,6 +24,22 @@ mkdir -p $serverPath/php
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php5/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -24,6 +24,22 @@ mkdir -p $serverPath/php
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.gz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.gz https://museum.php.net/php5/php-${version}.tar.gz
|
||||
fi
|
||||
|
||||
@@ -23,6 +23,22 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_old.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php5/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -23,6 +23,22 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_old.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php5/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -23,6 +23,22 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_old.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php7/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -23,6 +23,22 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_old.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php7/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -24,6 +24,22 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_old.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php7/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -28,6 +28,21 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_old.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php7/php-${version}.tar.xz
|
||||
|
||||
@@ -10,7 +10,6 @@ sourcePath=${serverPath}/source
|
||||
sysName=`uname`
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
|
||||
function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; }
|
||||
function version_le() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"; }
|
||||
function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }
|
||||
@@ -29,8 +28,29 @@ cd ${rootPath}/plugins/php/lib && /bin/bash freetype_new.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash libzip.sh
|
||||
|
||||
# redat ge 8
|
||||
which yum
|
||||
if [ "$?" == "0" ];then
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash oniguruma.sh
|
||||
fi
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://museum.php.net/php7/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -16,7 +16,7 @@ function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)"
|
||||
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }
|
||||
|
||||
|
||||
version=8.0.27
|
||||
version=8.0.29
|
||||
PHP_VER=80
|
||||
Install_php()
|
||||
{
|
||||
@@ -28,7 +28,29 @@ mkdir -p $serverPath/php
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash freetype_new.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
# redat ge 8
|
||||
which yum
|
||||
if [ "$?" == "0" ];then
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash oniguruma.sh
|
||||
fi
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://www.php.net/distributions/php-${version}.tar.xz
|
||||
|
||||
@@ -16,7 +16,7 @@ function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)"
|
||||
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }
|
||||
|
||||
|
||||
version=8.1.15
|
||||
version=8.1.20
|
||||
PHP_VER=81
|
||||
Install_php()
|
||||
{
|
||||
@@ -28,9 +28,30 @@ mkdir -p $serverPath/php
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash freetype_new.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
# redat ge 8
|
||||
which yum
|
||||
if [ "$?" == "0" ];then
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash oniguruma.sh
|
||||
fi
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://www.php.net/distributions/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -16,7 +16,7 @@ function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)"
|
||||
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }
|
||||
|
||||
|
||||
version=8.2.2
|
||||
version=8.2.7
|
||||
PHP_VER=82
|
||||
Install_php()
|
||||
{
|
||||
@@ -28,9 +28,30 @@ mkdir -p $serverPath/php
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash freetype_new.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash zlib.sh
|
||||
|
||||
# redat ge 8
|
||||
which yum
|
||||
if [ "$?" == "0" ];then
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash oniguruma.sh
|
||||
fi
|
||||
|
||||
if [ ! -d $sourcePath/php/php${PHP_VER} ];then
|
||||
|
||||
# ----------------------------------------------------------------------- #
|
||||
# 中国优化安装
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
LOCAL_ADDR=common
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
fi
|
||||
|
||||
if [ "$LOCAL_ADDR" == "cn" ];then
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://mirrors.sohu.com/php/php-${version}.tar.xz
|
||||
fi
|
||||
fi
|
||||
# ----------------------------------------------------------------------- #
|
||||
|
||||
|
||||
if [ ! -f $sourcePath/php/php-${version}.tar.xz ];then
|
||||
wget --no-check-certificate -O $sourcePath/php/php-${version}.tar.xz https://www.php.net/distributions/php-${version}.tar.xz
|
||||
fi
|
||||
|
||||
@@ -38,9 +38,10 @@ done
|
||||
|
||||
cd $DIR
|
||||
PHP_VER_LIST=(53 54 55 56 70 71 72 73 74 80 81 82)
|
||||
# yar
|
||||
PHP_EXT_LIST=(ioncube ZendGuardLoader pdo mysqlnd sqlite3 openssl pcntl opcache mcrypt fileinfo \
|
||||
exif gd intl memcache memcached redis imagemagick xdebug xhprof \
|
||||
swoole yaf yar yac apc mongo mongodb solr seaslog mbstring iconv phalcon)
|
||||
swoole yaf yac apc mongo mongodb solr seaslog mbstring iconv phalcon)
|
||||
|
||||
for PHP_VER in ${PHP_VER_LIST[@]}; do
|
||||
echo "php${PHP_VER} -- start"
|
||||
|
||||
@@ -11,9 +11,37 @@ rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
sourcePath=${serverPath}/source/php
|
||||
|
||||
|
||||
# _os=`uname`
|
||||
|
||||
# if [ ${_os} == "Darwin" ]; then
|
||||
# OSNAME='macos'
|
||||
# elif grep -Eq "openSUSE" /etc/*-release; then
|
||||
# OSNAME='opensuse'
|
||||
# elif grep -Eq "FreeBSD" /etc/*-release; then
|
||||
# OSNAME='freebsd'
|
||||
# elif grep -Eqi "CentOS" /etc/issue || grep -Eqi "CentOS" /etc/*-release; then
|
||||
# OSNAME='rhel'
|
||||
# elif grep -Eqi "Fedora" /etc/issue || grep -Eqi "Fedora" /etc/*-release; then
|
||||
# OSNAME='rhel'
|
||||
# elif grep -Eqi "Rocky" /etc/issue || grep -Eqi "Rocky" /etc/*-release; then
|
||||
# OSNAME='rhel'
|
||||
# elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eqi "AlmaLinux" /etc/*-release; then
|
||||
# OSNAME='rhel'
|
||||
# elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eqi "Amazon Linux" /etc/*-release; then
|
||||
# OSNAME='amazon'
|
||||
# elif grep -Eqi "Debian" /etc/issue || grep -Eqi "Debian" /etc/*-release; then
|
||||
# OSNAME='debian'
|
||||
# elif grep -Eqi "Ubuntu" /etc/issue || grep -Eqi "Ubuntu" /etc/*-release; then
|
||||
# OSNAME='ubuntu'
|
||||
# else
|
||||
# OSNAME='unknow'
|
||||
# fi
|
||||
|
||||
actionType=$1
|
||||
version=$2
|
||||
|
||||
|
||||
LIBNAME=intl
|
||||
LIBV=0
|
||||
|
||||
@@ -33,7 +61,9 @@ else
|
||||
fi
|
||||
|
||||
OPTIONS=''
|
||||
if [ "$version" -lt "71" ];then
|
||||
if [ "$version" -lt "74" ];then
|
||||
|
||||
# cd /www/server/mdserver-web/plugins/php/lib && /bin/bash icu.sh
|
||||
cd ${rootPath}/plugins/php/lib && /bin/bash icu.sh
|
||||
OPTIONS="--with-icu-dir=${serverPath}/lib/icu"
|
||||
fi
|
||||
|
||||
@@ -23,7 +23,7 @@ if [ "$version" -lt "73" ];then
|
||||
fi
|
||||
|
||||
if [ "$version" -gt "74" ];then
|
||||
LIBV=5.1.2
|
||||
LIBV=5.2.1
|
||||
fi
|
||||
|
||||
LIB_PATH_NAME=lib/php
|
||||
|
||||
@@ -32,6 +32,11 @@ if [ "$version" -eq "72" ] || [ "$version" -eq "73" ];then
|
||||
fi
|
||||
|
||||
|
||||
if [ "$version" -gt "74" ];then
|
||||
LIBV=3.3.5
|
||||
fi
|
||||
|
||||
|
||||
LIB_PATH_NAME=lib/php
|
||||
if [ -d $serverPath/php/${version}/lib64 ];then
|
||||
LIB_PATH_NAME=lib64
|
||||
|
||||
@@ -51,10 +51,11 @@ Install_pureftp()
|
||||
|
||||
# https://github.com/jedisct1/pure-ftpd/releases/download/1.0.49/pure-ftpd-1.0.49.tar.gz
|
||||
# https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.49.tar.gz
|
||||
# DOWNLOAD=https://github.com/jedisct1/pure-ftpd/releases/download/${VER}/pure-ftpd-${VER}.tar.gz
|
||||
|
||||
|
||||
VER=$1
|
||||
DOWNLOAD=https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-${VER}.tar.gz
|
||||
DOWNLOAD=https://github.com/jedisct1/pure-ftpd/releases/download/${VER}/pure-ftpd-${VER}.tar.gz
|
||||
# DOWNLOAD=https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-${VER}.tar.gz
|
||||
|
||||
# curl -sSLo pure-ftpd-1.0.49.tar.gz https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.49.tar.gz
|
||||
if [ ! -f $serverPath/source/pureftp/pure-ftpd-${VER}.tar.gz ];then
|
||||
@@ -68,14 +69,14 @@ Install_pureftp()
|
||||
md5_check=`md5sum $serverPath/source/pureftp/pure-ftpd-${VER}.tar.gz | awk '{print $1}'`
|
||||
if [ "${md5_ok}" == "${md5_check}" ]; then
|
||||
echo "pure-ftpd file check ok"
|
||||
else
|
||||
# 重新下载
|
||||
rm -rf $serverPath/source/pureftp/pure-ftpd-${VER}
|
||||
wget --no-check-certificate -O $serverPath/source/pureftp/pure-ftpd-${VER}.tar.gz $DOWNLOAD
|
||||
# curl -sSLo $serverPath/source/pureftp/pure-ftpd-${VER}.tar.gz $DOWNLOAD
|
||||
fi
|
||||
fi
|
||||
|
||||
# Last Download Method
|
||||
if [ ! -f $serverPath/source/pureftp/pure-ftpd-${VER}.tar.gz ];then
|
||||
wget --no-check-certificate -O $serverPath/source/pureftp/pure-ftpd-${VER}.tar.gz https://dl.midoks.me/soft/ftp/pure-ftpd-${VER}.tar.gz -T 3
|
||||
fi
|
||||
|
||||
if [ ! -d $serverPath/source/pureftp/pure-ftpd-${VER} ];then
|
||||
cd $serverPath/source/pureftp && tar zxvf pure-ftpd-${VER}.tar.gz
|
||||
fi
|
||||
|
||||
@@ -923,10 +923,12 @@
|
||||
"python",
|
||||
"python3",
|
||||
"ifdown",
|
||||
"node"
|
||||
"node",
|
||||
"sd-pam"
|
||||
],
|
||||
"process_exclude": [
|
||||
"php-fpm",
|
||||
"git",
|
||||
"mysqld",
|
||||
"mongod",
|
||||
"dockerd",
|
||||
|
||||
@@ -171,6 +171,12 @@ def reload():
|
||||
content = mw.readFile(tgbot_tpl)
|
||||
mw.writeFile(tgbot_dst, content)
|
||||
|
||||
tgpush_tpl = getPluginDir() + '/startup/tgpush.py'
|
||||
tgpush_dst = getServerDir() + '/tgpush.py'
|
||||
|
||||
content = mw.readFile(tgpush_tpl)
|
||||
mw.writeFile(tgpush_dst, content)
|
||||
|
||||
ext_src = getPluginDir() + '/startup/extend'
|
||||
ext_dst = getServerDir()
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ tg_start(){
|
||||
echo -e "starting tgbot... \c"
|
||||
cd $mw_path
|
||||
python3 {$APP_PATH}/tgbot.py >> {$APP_PATH}/task.log &
|
||||
python3 {$APP_PATH}/tgpush.py >> {$APP_PATH}/push.log &
|
||||
isStart=""
|
||||
while [[ "$isStart" == "" ]];
|
||||
do
|
||||
@@ -64,6 +65,15 @@ tg_stop(){
|
||||
kill -9 $p > /dev/null 2>&1
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
|
||||
|
||||
echo -e "stopping tgpush ... \c";
|
||||
arr=`ps aux|grep 'tgpush.py'|grep -v grep|awk '{print $2}'`
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
kill -9 $p > /dev/null 2>&1
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
|
||||
@@ -41,37 +41,35 @@ def send_msg(bot, tag='ad', trigger_time=300):
|
||||
mw.writeFile(lock_file, json.dumps(lock_data))
|
||||
# 信号只在一个周期内执行一次|end
|
||||
|
||||
# https://t.me/gjgzs2022 | 19/m
|
||||
# ♻️CMS导航网♻️/💰流量变现💰 | 28/m
|
||||
# CK资源采集 |29/m
|
||||
# 高防服务器CDN请联系玥玥 |3/m
|
||||
|
||||
# https://zhaoziyuan.la/ | 15/m | 2m | next,5/15
|
||||
|
||||
# https://t.me/gjgzs2022 | 22/m
|
||||
# 代付支付宝微信❤️淘宝帮付/💰流量变现💰集团收量/🕵️♀️实名认证/接码✅过人脸👤 | 28/m
|
||||
# https://zhaoziyuan.la/ | web | 15/m | 2m | next,7/15
|
||||
# 香港高防CDN |9/m
|
||||
# mvirtua | web | 7/m
|
||||
keyboard = [
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="海外服务器高防CDN请联系玥玥", url='https://t.me/CDNYUEYUE')
|
||||
text="实卡接码🙎♂️代实名/过人脸🅾️开飞机会员", url='https://t.me/gjgzs2022')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="CK资源采集", url='https://ckzy1.com/')
|
||||
text="香港高防CDN、免实名、试用30天", url='https://www.100dun.com')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="♻️CMS导航网♻️", url='https://t.me/maccms_jccms')
|
||||
text="🕵️♀️实名认证/接码✅过人脸👤", url='https://t.me/zhanzhangyewu')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="💰流量变现💰", url='https://t.me/taohaozhan')
|
||||
text="代付支付宝微信❤️淘宝帮付", url='https://t.me/Uxuanzhenpin')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="🙎♂️代实名🙍♀️过人脸🅾️国际阿里云腾讯云(赞助商)", url='https://t.me/gjgzs2022')
|
||||
text="💰流量变现💰集团收量", url='https://t.me/taohaozhan')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="倩倩CDN服务器", url='https://t.me/KLT_12'),
|
||||
text="官网", url='https://github.com/midoks/mdserver-web'),
|
||||
types.InlineKeyboardButton(
|
||||
text="💎DigitalVirt(赞助商)", url='https://digitalvirt.com/aff.php?aff=154')
|
||||
],
|
||||
|
||||
@@ -22,6 +22,16 @@ chat_id = -1001578009023
|
||||
# chat_id = 5568699210
|
||||
|
||||
|
||||
def writeLog(log_str):
|
||||
if __name__ == "__main__":
|
||||
print(log_str)
|
||||
|
||||
now = mw.getDateFromNow()
|
||||
log_file = mw.getServerDir() + '/tgbot/task.log'
|
||||
mw.writeFileLog(now + ':' + log_str, log_file, limit_size=5 * 1024)
|
||||
return True
|
||||
|
||||
|
||||
def get_newest_tid():
|
||||
|
||||
api_new = 'https://bbs.midoks.me/plugin.php?id=external_api&f=bbs_newest'
|
||||
@@ -86,7 +96,13 @@ def send_msg(bot, tag='ad', trigger_time=300):
|
||||
|
||||
|
||||
def run(bot):
|
||||
send_msg(bot, 'push_bbs_newest_tid', 300)
|
||||
|
||||
try:
|
||||
send_msg(bot, 'push_bbs_newest_tid', 300)
|
||||
except Exception as e:
|
||||
writeLog('-----push_bbs_newest_tid error start -------')
|
||||
print(mw.getTracebackInfo())
|
||||
writeLog('-----push_bbs_newest_tid error start -------')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -22,6 +22,16 @@ chat_id = -1001578009023
|
||||
# chat_id = 5568699210
|
||||
|
||||
|
||||
def writeLog(log_str):
|
||||
if __name__ == "__main__":
|
||||
print(log_str)
|
||||
|
||||
now = mw.getDateFromNow()
|
||||
log_file = mw.getServerDir() + '/tgbot/task.log'
|
||||
mw.writeFileLog(now + ':' + log_str, log_file, limit_size=5 * 1024)
|
||||
return True
|
||||
|
||||
|
||||
def send_msg(bot, tag='ad', trigger_time=300):
|
||||
# 信号只在一个周期内执行一次|start
|
||||
lock_file = mw.getServerDir() + '/tgbot/lock.json'
|
||||
@@ -40,34 +50,35 @@ def send_msg(bot, tag='ad', trigger_time=300):
|
||||
mw.writeFile(lock_file, json.dumps(lock_data))
|
||||
# 信号只在一个周期内执行一次|end
|
||||
|
||||
# https://t.me/gjgzs2022 | 19/m
|
||||
# ♻️CMS导航网♻️/💰流量变现💰 | 28/m
|
||||
# CK资源采集 |29/m
|
||||
# 高防服务器CDN请联系玥玥 |3/m
|
||||
# https://t.me/gjgzs2022 | 22/m
|
||||
# 代付支付宝微信❤️淘宝帮付/💰流量变现💰集团收量/🕵️♀️实名认证/接码✅过人脸👤 | 28/m
|
||||
# https://zhaoziyuan.la/ | web | 15/m | 2m | next,7/15
|
||||
# 香港高防CDN |9/m
|
||||
# mvirtua | web | 7/m
|
||||
keyboard = [
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="海外服务器高防CDN请联系玥玥", url='https://t.me/CDNYUEYUE')
|
||||
text="实卡接码🙎♂️代实名/过人脸🅾️开飞机会员", url='https://t.me/gjgzs2022')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="CK资源采集", url='https://ckzy1.com/')
|
||||
text="香港高防CDN、免实名、试用30天", url='https://www.100dun.com')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="♻️CMS导航网♻️", url='https://t.me/maccms_jccms')
|
||||
text="🕵️♀️实名认证/接码✅过人脸👤", url='https://t.me/zhanzhangyewu')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="💰流量变现💰", url='https://t.me/taohaozhan')
|
||||
text="代付支付宝微信❤️淘宝帮付", url='https://t.me/Uxuanzhenpin')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="🙎♂️代实名🙍♀️过人脸🅾️国际阿里云腾讯云(赞助商)", url='https://t.me/gjgzs2022')
|
||||
text="💰流量变现💰集团收量", url='https://t.me/taohaozhan')
|
||||
],
|
||||
[
|
||||
types.InlineKeyboardButton(
|
||||
text="倩倩CDN服务器", url='https://t.me/KLT_12'),
|
||||
text="官网", url='https://github.com/midoks/mdserver-web'),
|
||||
types.InlineKeyboardButton(
|
||||
text="💎DigitalVirt(赞助商)", url='https://digitalvirt.com/aff.php?aff=154')
|
||||
],
|
||||
@@ -99,7 +110,7 @@ def send_msg(bot, tag='ad', trigger_time=300):
|
||||
|
||||
def run(bot):
|
||||
try:
|
||||
send_msg(bot, 'notice_msg', 180)
|
||||
send_msg(bot, 'notice_msg', 90)
|
||||
except Exception as e:
|
||||
writeLog('-----push_notice_msg error start -------')
|
||||
print(mw.getTracebackInfo())
|
||||
|
||||
@@ -95,15 +95,6 @@ for p in init_list:
|
||||
writeLog(mw.getTracebackInfo())
|
||||
writeLog('-----init error end -------')
|
||||
|
||||
# @bot.message_handler(commands=['start', 'help'])
|
||||
# def hanle_start_help(message):
|
||||
# bot.reply_to(message, "hello world")
|
||||
|
||||
|
||||
# @bot.message_handler(commands=['mw_echo'])
|
||||
# def hanle_mw_echo(message):
|
||||
# bot.reply_to(message, message.text)
|
||||
|
||||
|
||||
@bot.message_handler(commands=['chat_id'])
|
||||
def hanle_get_chat_id(message):
|
||||
@@ -136,42 +127,6 @@ def callback_query_handler(call):
|
||||
writeLog('-----callback_query_handler error end -------')
|
||||
|
||||
|
||||
def runBotPushTask():
|
||||
plist = getStartExtCfgByTag('push')
|
||||
for p in plist:
|
||||
try:
|
||||
script = p['name'].split('.')[0]
|
||||
__import__(script).run(bot)
|
||||
except Exception as e:
|
||||
writeLog('-----runBotPushTask error start -------')
|
||||
writeLog(mw.getTracebackInfo())
|
||||
writeLog('-----runBotPushTask error end -------')
|
||||
|
||||
|
||||
def botPush():
|
||||
while True:
|
||||
runBotPushTask()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
def runBotPushOtherTask():
|
||||
plist = getStartExtCfgByTag('other')
|
||||
for p in plist:
|
||||
try:
|
||||
script = p['name'].split('.')[0]
|
||||
__import__(script).run(bot)
|
||||
except Exception as e:
|
||||
writeLog('-----runBotPushOtherTask error start -------')
|
||||
writeLog(mw.getTracebackInfo())
|
||||
writeLog('-----runBotPushOtherTask error end -------')
|
||||
|
||||
|
||||
def botPushOther():
|
||||
while True:
|
||||
runBotPushOtherTask()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
def runBot(bot):
|
||||
try:
|
||||
bot.polling()
|
||||
@@ -184,14 +139,6 @@ def runBot(bot):
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# 机器人推送任务
|
||||
botPushTask = threading.Thread(target=botPush)
|
||||
botPushTask.start()
|
||||
|
||||
# 机器人其他推送任务
|
||||
botPushOtherTask = threading.Thread(target=botPushOther)
|
||||
botPushOtherTask.start()
|
||||
|
||||
writeLog('启动成功')
|
||||
runBot(bot)
|
||||
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
# coding:utf-8
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import json
|
||||
import base64
|
||||
import threading
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
import telebot
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'tgbot'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
sys.path.append(getServerDir() + "/extend")
|
||||
|
||||
|
||||
def getConfigData():
|
||||
cfg_path = getServerDir() + "/data.cfg"
|
||||
if not os.path.exists(cfg_path):
|
||||
mw.writeFile(cfg_path, '{}')
|
||||
t = mw.readFile(cfg_path)
|
||||
return json.loads(t)
|
||||
|
||||
|
||||
def writeConf(data):
|
||||
cfg_path = getServerDir() + "/data.cfg"
|
||||
mw.writeFile(cfg_path, json.dumps(data))
|
||||
return True
|
||||
|
||||
|
||||
def getExtCfg():
|
||||
cfg_path = getServerDir() + "/extend.cfg"
|
||||
if not os.path.exists(cfg_path):
|
||||
mw.writeFile(cfg_path, '{}')
|
||||
t = mw.readFile(cfg_path)
|
||||
return json.loads(t)
|
||||
|
||||
|
||||
def getStartExtCfgByTag(tag='push'):
|
||||
# 获取开启的扩展
|
||||
elist = getExtCfg()
|
||||
rlist = []
|
||||
for x in elist:
|
||||
if x['tag'] == tag and x['status'] == 'start':
|
||||
rlist.append(x)
|
||||
return rlist
|
||||
|
||||
|
||||
def writeLog(log_str):
|
||||
if __name__ == "__main__":
|
||||
print(log_str)
|
||||
|
||||
now = mw.getDateFromNow()
|
||||
log_file = getServerDir() + '/push.log'
|
||||
mw.writeFileLog(now + ':' + log_str, log_file, limit_size=5 * 1024)
|
||||
return True
|
||||
|
||||
# start tgbot
|
||||
cfg = getConfigData()
|
||||
while True:
|
||||
cfg = getConfigData()
|
||||
if 'bot' in cfg and 'app_token' in cfg['bot']:
|
||||
if cfg['bot']['app_token'] != '' and cfg['bot']['app_token'] != 'app_token':
|
||||
break
|
||||
writeLog('等待输入配置,填写app_token')
|
||||
time.sleep(3)
|
||||
|
||||
|
||||
bot = telebot.TeleBot(cfg['bot']['app_token'])
|
||||
|
||||
|
||||
def runBotPushTask():
|
||||
plist = getStartExtCfgByTag('push')
|
||||
for p in plist:
|
||||
try:
|
||||
script = p['name'].split('.')[0]
|
||||
__import__(script).run(bot)
|
||||
except Exception as e:
|
||||
writeLog('-----runBotPushTask error start -------')
|
||||
writeLog(mw.getTracebackInfo())
|
||||
writeLog('-----runBotPushTask error end -------')
|
||||
|
||||
|
||||
def botPush():
|
||||
while True:
|
||||
runBotPushTask()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
def runBotPushOtherTask():
|
||||
plist = getStartExtCfgByTag('other')
|
||||
for p in plist:
|
||||
try:
|
||||
script = p['name'].split('.')[0]
|
||||
__import__(script).run(bot)
|
||||
except Exception as e:
|
||||
writeLog('-----runBotPushOtherTask error start -------')
|
||||
writeLog(mw.getTracebackInfo())
|
||||
writeLog('-----runBotPushOtherTask error end -------')
|
||||
|
||||
|
||||
def botPushOther():
|
||||
while True:
|
||||
runBotPushOtherTask()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# 机器人推送任务
|
||||
botPushTask = threading.Thread(target=botPush)
|
||||
botPushTask.start()
|
||||
|
||||
# 机器人其他推送任务
|
||||
botPushOtherTask = threading.Thread(target=botPushOther)
|
||||
botPushOtherTask.start()
|
||||
@@ -2,6 +2,7 @@ function readme(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>在填写好配置信息好后,还要执行下面命令。进行手机号和短信码验证。再重启,即可正常使用</li>';
|
||||
readme += '<li>cd /www/server/mdserver-web && source bin/activate && python3 /www/server/tgclient/tgclient.py</li>';
|
||||
readme += '<li>https://my.telegram.org/auth</li>';
|
||||
readme += '</ul>';
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
# coding:utf-8
|
||||
|
||||
# func: 在其他发送推送AD
|
||||
# url: https://docs.telethon.dev/en/stable/modules/client.html
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import json
|
||||
import base64
|
||||
import threading
|
||||
import asyncio
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
from telethon import utils
|
||||
from telethon import functions, types
|
||||
from telethon.tl.functions.messages import AddChatUserRequest
|
||||
from telethon.tl.functions.channels import InviteToChannelRequest
|
||||
# 指定群ID
|
||||
chat_id_list = [-1001578009023]
|
||||
filter_g_id = [-1001771526434]
|
||||
|
||||
|
||||
msg_ad = "本人软件推广(10s)\n\n"
|
||||
msg_ad += "开源Linux面板【mdserver-web】,站长必备,无毒,源码为证。\n"
|
||||
msg_ad += "不收费,全靠TG乞讨! \n"
|
||||
msg_ad += "看个人简介,加入群聊,一起进步!\n"
|
||||
# msg_ad += "https://github.com/midoks/mdserver-web \n"
|
||||
# msg_ad += "\n"
|
||||
# msg_ad += "加入群聊,一起进步! \n"
|
||||
# msg_ad += "https://t.me/mdserver_web \n"
|
||||
# msg_ad += "不收费,无毒。源码为证。全靠TG乞讨!😭\n\n"
|
||||
# msg_ad += "捐赠地址 USDT(TRC20)\n"
|
||||
# msg_ad += "TVbNgrpeGBGZVm5gTLa21ADP7RpnPFhjya\n"
|
||||
# msg_ad += "日行一善,以后必定大富大贵\n"
|
||||
|
||||
|
||||
async def writeLog(log_str):
|
||||
if __name__ == "__main__":
|
||||
print(log_str)
|
||||
|
||||
now = mw.getDateFromNow()
|
||||
log_file = mw.getServerDir() + '/tgclient/task.log'
|
||||
mw.writeFileLog(now + ':' + log_str, log_file, limit_size=5 * 1024)
|
||||
return True
|
||||
|
||||
async def send_msg(client, chat_id, tag='ad', trigger_time=600):
|
||||
# 信号只在一个周期内执行一次|start
|
||||
lock_file = mw.getServerDir() + '/tgclient/lock.json'
|
||||
if not os.path.exists(lock_file):
|
||||
mw.writeFile(lock_file, '{}')
|
||||
|
||||
lock_data = json.loads(mw.readFile(lock_file))
|
||||
if tag in lock_data:
|
||||
diff_time = time.time() - lock_data[tag]['do_time']
|
||||
if diff_time >= trigger_time:
|
||||
lock_data[tag]['do_time'] = time.time()
|
||||
else:
|
||||
return False, 0, 0
|
||||
else:
|
||||
lock_data[tag] = {'do_time': time.time()}
|
||||
mw.writeFile(lock_file, json.dumps(lock_data))
|
||||
# 信号只在一个周期内执行一次|end
|
||||
|
||||
msg = await client.send_message(chat_id, msg_ad)
|
||||
await asyncio.sleep(10)
|
||||
await client.delete_messages(chat_id, msg)
|
||||
await asyncio.sleep(3)
|
||||
|
||||
async def run(client):
|
||||
client.parse_mode = 'html'
|
||||
# for chat_id in chat_id_list:
|
||||
# await send_msg(client, chat_id)
|
||||
# await asyncio.sleep(30)
|
||||
|
||||
info = await client.get_dialogs()
|
||||
for chat in info:
|
||||
if chat.is_group and not chat.id in filter_g_id:
|
||||
chat_id = str(chat.id)
|
||||
if chat_id[0:4] != '-100':
|
||||
continue
|
||||
|
||||
# print(chat)
|
||||
await writeLog('name:{0} id:{1} is_user:{2} is_channel:{3} is_group:{4}'.format(
|
||||
chat.name, chat.id, chat.is_user, chat.is_channel, chat.is_group))
|
||||
try:
|
||||
await send_msg(client, chat.id, 'ad_' + str(chat.id))
|
||||
except Exception as e:
|
||||
await writeLog(str(chat))
|
||||
await writeLog(str(e))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
@@ -21,11 +21,22 @@ from telebot.util import quick_markup
|
||||
|
||||
|
||||
# 指定群ID
|
||||
chat_id_list = [-1001578009023, -1001979545570]
|
||||
chat_id_list = [-1001979545570]
|
||||
# 别人群ID[有API调用限制]
|
||||
chat_id_list_other = [-1001578009023, -1001771526434]
|
||||
|
||||
async def writeLog(log_str):
|
||||
if __name__ == "__main__":
|
||||
print(log_str)
|
||||
|
||||
now = mw.getDateFromNow()
|
||||
log_file = mw.getServerDir() + '/tgclient/task.log'
|
||||
mw.writeFileLog(now + ':' + log_str, log_file, limit_size=5 * 1024)
|
||||
return True
|
||||
|
||||
async def run(client):
|
||||
while True:
|
||||
for chat_id in chat_id_list:
|
||||
for chat_id in chat_id_list:
|
||||
try:
|
||||
s = await client.send_message(chat_id, '开始自动检测已经注销群成员...')
|
||||
count = 0
|
||||
async for user in client.iter_participants(chat_id):
|
||||
@@ -38,7 +49,20 @@ async def run(client):
|
||||
await client.edit_message(chat_id, s.id, '自动检测已经注销群成员完毕!!!')
|
||||
await asyncio.sleep(3)
|
||||
await client.delete_messages(chat_id, s)
|
||||
await asyncio.sleep(300)
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
writeLog(str(e))
|
||||
|
||||
for chat_id in chat_id_list_other:
|
||||
try:
|
||||
async for user in client.iter_participants(chat_id):
|
||||
if user.deleted:
|
||||
msg = await client.kick_participant(chat_id, user)
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
writeLog(str(e))
|
||||
|
||||
await asyncio.sleep(300)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -22,36 +22,34 @@ from telethon.tl.functions.channels import InviteToChannelRequest
|
||||
# 指定群ID
|
||||
chat_id = -1001979545570
|
||||
filter_user_id = 5568699210
|
||||
filter_g_id = [-1001771526434]
|
||||
|
||||
|
||||
async def run(client):
|
||||
while True:
|
||||
info = await client.get_dialogs()
|
||||
for chat in info:
|
||||
print('name:{0} ids:{1} is_user:{2} is_channel:{3} is_group:{4}'.format(
|
||||
chat.name, chat.id, chat.is_user, chat.is_channel, chat.is_group))
|
||||
if chat.is_group and chat.id != chat_id:
|
||||
list_user = []
|
||||
async for user in client.iter_participants(chat.id):
|
||||
# print(chat.id, user.id, user.first_name)
|
||||
if filter_user_id != user.id and user.username != None and user.bot == False:
|
||||
# print(user.first_name)
|
||||
list_user.append(user.username)
|
||||
# await client(AddChatUserRequest(
|
||||
# chat_id=chat_id, # chat_id
|
||||
# user_id=user.username, # 被邀请人id
|
||||
# fwd_limit=1000 # Allow the user to see the 10 last messages
|
||||
# ))
|
||||
# print(list_user)
|
||||
try:
|
||||
await client(InviteToChannelRequest(
|
||||
channel=chat_id, # chat_id
|
||||
users=list_user, # 被邀请人id
|
||||
))
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
info = await client.get_dialogs()
|
||||
for chat in info:
|
||||
is_sleep = True
|
||||
print('name:{0} id:{1} is_user:{2} is_channel:{3} is_group:{4}'.format(
|
||||
chat.name, chat.id, chat.is_user, chat.is_channel, chat.is_group))
|
||||
if chat.is_group and chat.id != chat_id:
|
||||
list_user = []
|
||||
async for user in client.iter_participants(chat.id):
|
||||
if chat.id in filter_g_id:
|
||||
is_sleep = False
|
||||
continue
|
||||
|
||||
await asyncio.sleep(80000)
|
||||
await asyncio.sleep(80000)
|
||||
if filter_user_id != user.id and user.username != None and user.bot == False:
|
||||
list_user.append(user.username)
|
||||
print(list_user)
|
||||
try:
|
||||
await client(InviteToChannelRequest(
|
||||
channel=chat_id, # chat_id
|
||||
users=list_user, # 被邀请人id
|
||||
))
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
if is_sleep:
|
||||
await asyncio.sleep(90000)
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# coding:utf-8
|
||||
|
||||
# func: 临时测试
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import json
|
||||
import base64
|
||||
import threading
|
||||
import asyncio
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
from telethon import utils
|
||||
from telethon import functions, types
|
||||
from telethon.tl.functions.messages import AddChatUserRequest
|
||||
from telethon.tl.functions.channels import InviteToChannelRequest
|
||||
# 指定群ID
|
||||
chat_id = -1001979545570
|
||||
filter_user_id = 5568699210
|
||||
filter_g_id = [-1001771526434]
|
||||
|
||||
|
||||
async def run(client):
|
||||
|
||||
my_channel = await client.get_entity(PeerChannel(-1001173826177))
|
||||
print(my_channel)
|
||||
|
||||
for i in range(9999999999):
|
||||
try:
|
||||
v = -1001000000000 - i
|
||||
my_channel = await client.get_entity(PeerChannel(v))
|
||||
print(my_channel)
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
# -1001809140739
|
||||
# -1001800000000
|
||||
# -1000000000001
|
||||
|
||||
info = await client.get_dialogs()
|
||||
for chat in info:
|
||||
if not chat.is_group and chat.is_channel:
|
||||
print('name:{0} id:{1} is_user:{2} is_channel:{3} is_group:{4}'.format(
|
||||
chat.name, chat.id, chat.is_user, chat.is_channel, chat.is_group))
|
||||
await asyncio.sleep(10)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
@@ -12,7 +12,10 @@ import asyncio
|
||||
import logging
|
||||
|
||||
# python /Users/midoks/Desktop/mwdev/server/tgclient/tgclient.py
|
||||
# cd /www/server/mdserver-web && python3 /www/server/tgclient/tgclient.py
|
||||
|
||||
'''
|
||||
cd /www/server/mdserver-web && source bin/activate && python3 /www/server/tgclient/tgclient.py
|
||||
'''
|
||||
|
||||
from telethon import TelegramClient
|
||||
|
||||
@@ -96,7 +99,7 @@ while True:
|
||||
|
||||
client = TelegramClient('mdioks', cfg['bot']['api_id'], cfg['bot']['api_hash'])
|
||||
|
||||
async def plugins_run():
|
||||
async def plugins_run_task():
|
||||
plist = getStartExtCfgByTag('client')
|
||||
for p in plist:
|
||||
try:
|
||||
@@ -107,6 +110,11 @@ async def plugins_run():
|
||||
writeLog(mw.getTracebackInfo())
|
||||
writeLog('----- client error end -------')
|
||||
|
||||
async def plugins_run():
|
||||
while True:
|
||||
await plugins_run_task()
|
||||
time.sleep(1)
|
||||
|
||||
async def main(loop):
|
||||
await client.start()
|
||||
|
||||
|
||||
+7
-7
@@ -1,22 +1,22 @@
|
||||
setuptools>=33.1.1
|
||||
Werkzeug>=1.0.1
|
||||
wheel==0.37.1
|
||||
wheel>=0.37.1
|
||||
gunicorn==20.1.0
|
||||
requests==2.27.1
|
||||
requests>=2.27.1
|
||||
urllib3>=1.21.1
|
||||
flask==2.0.3
|
||||
flask>=2.0.3
|
||||
flask-session==0.3.2
|
||||
flask-helper==0.19
|
||||
flask-bcrypt==1.0.1
|
||||
flask-caching>=1.10.1
|
||||
cache==1.0.3
|
||||
gevent==21.12.0
|
||||
gevent==22.10.2
|
||||
gevent-websocket==0.10.1
|
||||
psutil==5.9.1
|
||||
chardet==3.0.4
|
||||
flask-sqlalchemy==2.3.2
|
||||
pyOpenSSL==22.0.0
|
||||
cryptography==36.0.1
|
||||
pyOpenSSL==23.2.0
|
||||
cryptography>=40.0.2
|
||||
configparser==5.2.0
|
||||
python-engineio==4.3.2
|
||||
python-socketio>=4.2.0
|
||||
@@ -30,4 +30,4 @@ Jinja2>=2.11.2
|
||||
PyMySQL==1.0.2
|
||||
whitenoise==5.3.0
|
||||
pyTelegramBotAPI
|
||||
telebot
|
||||
telebot
|
||||
@@ -0,0 +1,15 @@
|
||||
#PROXY-START/
|
||||
# root /www/server/nezha/dashboard/resource;
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:9527;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
}
|
||||
location ~ ^/(ws|terminal/.+)$ {
|
||||
proxy_pass http://127.0.0.1:9527;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
#PROXY-END/
|
||||
+8
-2
@@ -47,7 +47,7 @@ cache.init_app(app, config={'CACHE_TYPE': 'simple'})
|
||||
|
||||
try:
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/mw_session.db'
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/py_mw_session.db'
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
|
||||
app.config['SESSION_TYPE'] = 'sqlalchemy'
|
||||
app.config['SESSION_SQLALCHEMY'] = sdb
|
||||
@@ -60,7 +60,6 @@ except:
|
||||
str(sys.version_info[0])
|
||||
app.config['SESSION_FILE_THRESHOLD'] = 1024
|
||||
app.config['SESSION_FILE_MODE'] = 384
|
||||
mw.execShell("pip install flask_sqlalchemy &")
|
||||
|
||||
app.secret_key = uuid.UUID(int=uuid.getnode()).hex[-12:]
|
||||
app.config['SESSION_PERMANENT'] = True
|
||||
@@ -178,6 +177,13 @@ def requestCheck():
|
||||
return domain_check
|
||||
|
||||
|
||||
@app.after_request
|
||||
def requestAfter(response):
|
||||
response.headers['soft'] = 'mdserver-web'
|
||||
response.headers['mw-version'] = app.config.version
|
||||
return response
|
||||
|
||||
|
||||
def isLogined():
|
||||
if 'login' in session and 'username' in session and session['login'] == True:
|
||||
userInfo = mw.M('users').where(
|
||||
|
||||
@@ -36,10 +36,14 @@ $('input[name="host_ip"]').change(function(){
|
||||
|
||||
$('input[name="port"]').change(function(){
|
||||
var port = $(this).val();
|
||||
var old_port = $(this).data('port');
|
||||
$('.btn_port').removeAttr('disabled');
|
||||
$('.btn_port').unbind().click(function(){
|
||||
$.post('/config/set_port','port='+port, function(rdata){
|
||||
showMsg(rdata.msg,function(){window.location.reload();},{icon:rdata.status?1:2},2000);
|
||||
showMsg(rdata.msg,function(){
|
||||
window.location.href = window.location.href.replace(old_port,port);
|
||||
// window.location.reload();
|
||||
},{icon:rdata.status?1:2},5000);
|
||||
},'json');
|
||||
});
|
||||
});
|
||||
|
||||
+128
-221
@@ -1,78 +1,100 @@
|
||||
//默认显示7天周期图表
|
||||
|
||||
setTimeout(function(){
|
||||
Wday(0,'getload');
|
||||
},500);
|
||||
},100);
|
||||
setTimeout(function(){
|
||||
Wday(0,'cpu');
|
||||
},500);
|
||||
},200);
|
||||
setTimeout(function(){
|
||||
Wday(0,'mem');
|
||||
},1000);
|
||||
},500);
|
||||
setTimeout(function(){
|
||||
Wday(0,'disk');
|
||||
},1500);
|
||||
},100);
|
||||
setTimeout(function(){
|
||||
Wday(0,'network');
|
||||
},2000);
|
||||
},1500);
|
||||
|
||||
$(".st").hover(function(){
|
||||
|
||||
$(".searcTime .st").click(function(){
|
||||
var status = $(this).data('status');
|
||||
if (status == 'show'){
|
||||
$(this).next().hide();
|
||||
$(this).data('status','hide');
|
||||
} else{
|
||||
$(this).next().show();
|
||||
$(this).data('status','show');
|
||||
}
|
||||
});
|
||||
|
||||
//自定义时间-切换
|
||||
$(".searcTime .st").hover(function(){
|
||||
$(this).data('status','show');
|
||||
$(this).next().show();
|
||||
},function(){
|
||||
$(this).next().hide();
|
||||
$(this).next().hover(function(){
|
||||
$(this).show();
|
||||
},function(){
|
||||
$(this).hide();
|
||||
})
|
||||
// $(this).next().hide();
|
||||
// $(this).next().hover(function(){
|
||||
// $(this).show();
|
||||
// },function(){
|
||||
// $(this).hide();
|
||||
// })
|
||||
})
|
||||
|
||||
$(".searcTime .gt").click(function(){
|
||||
$(this).addClass("on").siblings().removeClass("on");
|
||||
})
|
||||
$(".loadbtn").click(function(){
|
||||
$(this).parents(".searcTime").find("span").removeClass("on");
|
||||
$(this).parents(".searcTime").find(".st").addClass("on");
|
||||
var b = (new Date($(this).parent().find(".btime").val()).getTime())/1000;
|
||||
var e = (new Date($(this).parent().find(".etime").val()).getTime())/1000;
|
||||
|
||||
|
||||
//渲染日期时间范围 start
|
||||
var render_dlist = [
|
||||
'loadbtn_rtime',
|
||||
'cpubtn_rtime',
|
||||
'membtn_rtime',
|
||||
'diskbtn_rtime',
|
||||
'networkbtn_rtime'
|
||||
];
|
||||
|
||||
for (var i = 0; i < render_dlist.length; i++) {
|
||||
|
||||
laydate.render({
|
||||
elem: '#'+render_dlist[i]
|
||||
,type: 'datetime'
|
||||
,range: true
|
||||
});
|
||||
|
||||
|
||||
var b = getBeforeDate(28).replaceAll('/','-') + " 00:00:00";
|
||||
var e = getBeforeDate(0).replaceAll('/','-') + " 23:59:59";
|
||||
|
||||
$('#'+render_dlist[i]).val(b + ' - ' + e);
|
||||
}
|
||||
//渲染日期时间范围 end
|
||||
|
||||
|
||||
$('.sbtn').click(function(){
|
||||
$(".searcTime .st").next().hide();
|
||||
|
||||
var rtime = $(this).parent().find(".rtime").val();
|
||||
var rarr = rtime.split(' - ');
|
||||
|
||||
var b = (new Date(rarr[0]).getTime())/1000;
|
||||
var e = (new Date(rarr[1]).getTime())/1000;
|
||||
|
||||
b = Math.round(b);
|
||||
e = Math.round(e);
|
||||
getload(b,e)
|
||||
})
|
||||
$(".cpubtn").click(function(){
|
||||
$(this).parents(".searcTime").find("span").removeClass("on");
|
||||
$(this).parents(".searcTime").find(".st").addClass("on");
|
||||
var b = (new Date($(this).parent().find(".btime").val()).getTime())/1000;
|
||||
var e = (new Date($(this).parent().find(".etime").val()).getTime())/1000;
|
||||
b = Math.round(b);
|
||||
e = Math.round(e);
|
||||
cpu(b,e)
|
||||
})
|
||||
$(".membtn").click(function(){
|
||||
$(this).parents(".searcTime").find("span").removeClass("on");
|
||||
$(this).parents(".searcTime").find(".st").addClass("on");
|
||||
var b = (new Date($(this).parent().find(".btime").val()).getTime())/1000;
|
||||
var e = (new Date($(this).parent().find(".etime").val()).getTime())/1000;
|
||||
b = Math.round(b);
|
||||
e = Math.round(e);
|
||||
mem(b,e)
|
||||
})
|
||||
$(".diskbtn").click(function(){
|
||||
$(this).parents(".searcTime").find("span").removeClass("on");
|
||||
$(this).parents(".searcTime").find(".st").addClass("on");
|
||||
var b = (new Date($(this).parent().find(".btime").val()).getTime())/1000;
|
||||
var e = (new Date($(this).parent().find(".etime").val()).getTime())/1000;
|
||||
b = Math.round(b);
|
||||
e = Math.round(e);
|
||||
disk(b,e)
|
||||
})
|
||||
$(".networkbtn").click(function(){
|
||||
$(this).parents(".searcTime").find("span").removeClass("on");
|
||||
$(this).parents(".searcTime").find(".st").addClass("on");
|
||||
var b = (new Date($(this).parent().find(".btime").val()).getTime())/1000;
|
||||
var e = (new Date($(this).parent().find(".etime").val()).getTime())/1000;
|
||||
b = Math.round(b);
|
||||
e = Math.round(e);
|
||||
network(b,e)
|
||||
})
|
||||
|
||||
if ($(this).hasClass('loadbtn')){
|
||||
getload(b,e);
|
||||
} else if ($(this).hasClass('cpubtn')){
|
||||
cpu(b,e);
|
||||
}else if ($(this).hasClass('membtn')){
|
||||
mem(b,e);
|
||||
} else if ($(this).hasClass('diskbtn')){
|
||||
disk(b,e);
|
||||
}
|
||||
});
|
||||
|
||||
//指定天数
|
||||
function Wday(day,name){
|
||||
var now = (new Date().getTime())/1000;
|
||||
@@ -94,19 +116,19 @@ function Wday(day,name){
|
||||
}
|
||||
switch (name){
|
||||
case "cpu":
|
||||
cpu(b,e);
|
||||
cpu(b, e);
|
||||
break;
|
||||
case "mem":
|
||||
mem(b,e);
|
||||
mem(b, e);
|
||||
break;
|
||||
case "disk":
|
||||
disk(b,e);
|
||||
disk(b, e);
|
||||
break;
|
||||
case "network":
|
||||
network(b,e);
|
||||
network(b, e);
|
||||
break;
|
||||
case "getload":
|
||||
getload(b,e);
|
||||
getload(b, e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -119,6 +141,7 @@ function getToday(){
|
||||
return str;
|
||||
}
|
||||
|
||||
getStatus();
|
||||
//取监控状态
|
||||
function getStatus(){
|
||||
loadT = layer.msg('正在读取,请稍候...',{icon:16,time:0})
|
||||
@@ -141,7 +164,7 @@ function getStatus(){
|
||||
|
||||
},'json');
|
||||
}
|
||||
getStatus();
|
||||
|
||||
|
||||
//设置监控状态
|
||||
function setControl(act, value=false){
|
||||
@@ -172,8 +195,9 @@ function setControl(act, value=false){
|
||||
|
||||
loadT = layer.msg('正在处理,请稍候...',{icon:16,time:0})
|
||||
$.post('/system/set_control','type='+type+'&day='+day,function(rdata){
|
||||
layer.close(loadT);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2});
|
||||
showMsg(rdata.msg, function(){
|
||||
layer.close(loadT);
|
||||
},{icon:rdata.status?1:2})
|
||||
},'json');
|
||||
}
|
||||
|
||||
@@ -183,8 +207,9 @@ function closeControl(){
|
||||
layer.confirm('您真的清空所有监控记录吗?',{title:'清空记录',icon:3,closeBtn:1}, function() {
|
||||
loadT = layer.msg('正在处理,请稍候...',{icon:16,time:0})
|
||||
$.post('/system/set_control','type=del',function(rdata){
|
||||
layer.close(loadT);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2});
|
||||
showMsg(rdata.msg, function(){
|
||||
layer.close(loadT);
|
||||
},{icon:rdata.status?1:2})
|
||||
},'json');
|
||||
});
|
||||
}
|
||||
@@ -199,19 +224,18 @@ function getBeforeDate(n){
|
||||
var day=d.getDate();
|
||||
if(day <= n){
|
||||
if(mon>1) {
|
||||
mon=mon-1;
|
||||
}
|
||||
else {
|
||||
year = year-1;
|
||||
mon = 12;
|
||||
mon = mon-1;
|
||||
} else {
|
||||
year = year-1;
|
||||
mon = 12;
|
||||
}
|
||||
}
|
||||
d.setDate(d.getDate()-n);
|
||||
year = d.getFullYear();
|
||||
mon=d.getMonth()+1;
|
||||
day=d.getDate();
|
||||
s = year+"/"+(mon<10?('0'+mon):mon)+"/"+(day<10?('0'+day):day);
|
||||
return s;
|
||||
s = year+"/"+(mon<10?('0'+mon):mon)+"/"+(day<10?('0'+day):day);
|
||||
return s;
|
||||
}
|
||||
//cpu
|
||||
function cpu(b,e){
|
||||
@@ -229,20 +253,14 @@ function cpu(b,e){
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'cross'
|
||||
},
|
||||
axisPointer: { type: 'cross' },
|
||||
formatter: '{b}<br />{a}: {c}%'
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: xData,
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
axisLine:{ lineStyle:{ color:"#666"} }
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
@@ -250,16 +268,8 @@ function cpu(b,e){
|
||||
boundaryGap: [0, '100%'],
|
||||
min:0,
|
||||
max: 100,
|
||||
splitLine:{
|
||||
lineStyle:{
|
||||
color:"#ddd"
|
||||
}
|
||||
},
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
splitLine:{ lineStyle:{ color:"#ddd" } },
|
||||
axisLine:{ lineStyle:{ color:"#666" } }
|
||||
},
|
||||
dataZoom: [{
|
||||
type: 'inside',
|
||||
@@ -286,17 +296,13 @@ function cpu(b,e){
|
||||
smooth:true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(0, 153, 238)'
|
||||
}
|
||||
},
|
||||
itemStyle: { normal: { color: 'rgb(0, 153, 238)' } },
|
||||
data: yData
|
||||
}
|
||||
]
|
||||
};
|
||||
myChartCpu.setOption(option);
|
||||
window.addEventListener("resize",function(){
|
||||
window.addEventListener("resize",function(){
|
||||
myChartCpu.resize();
|
||||
});
|
||||
},'json');
|
||||
@@ -318,20 +324,14 @@ function mem(b,e){
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'cross'
|
||||
},
|
||||
axisPointer: { type: 'cross' },
|
||||
formatter: '{b}<br />{a}: {c}%'
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: xData,
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
axisLine:{ lineStyle:{ color:"#666" } }
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
@@ -339,16 +339,8 @@ function mem(b,e){
|
||||
boundaryGap: [0, '100%'],
|
||||
min:0,
|
||||
max: 100,
|
||||
splitLine:{
|
||||
lineStyle:{
|
||||
color:"#ddd"
|
||||
}
|
||||
},
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
splitLine:{ lineStyle:{ color:"#ddd" } },
|
||||
axisLine:{ lineStyle:{ color:"#666" } }
|
||||
},
|
||||
dataZoom: [{
|
||||
type: 'inside',
|
||||
@@ -375,11 +367,7 @@ function mem(b,e){
|
||||
smooth:true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(0, 153, 238)'
|
||||
}
|
||||
},
|
||||
itemStyle: { normal: { color: 'rgb(0, 153, 238)' } },
|
||||
data: zData
|
||||
}
|
||||
]
|
||||
@@ -423,26 +411,14 @@ function disk(b,e){
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: xData,
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
axisLine:{ lineStyle:{ color:"#666" }}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: '单位:KB/s',
|
||||
boundaryGap: [0, '100%'],
|
||||
splitLine:{
|
||||
lineStyle:{
|
||||
color:"#ddd"
|
||||
}
|
||||
},
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
splitLine:{ lineStyle:{ color:"#ddd"} },
|
||||
axisLine:{ lineStyle:{ color:"#666" } }
|
||||
},
|
||||
dataZoom: [{
|
||||
type: 'inside',
|
||||
@@ -469,11 +445,7 @@ function disk(b,e){
|
||||
smooth:true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(255, 70, 131)'
|
||||
}
|
||||
},
|
||||
itemStyle: { normal: { color: 'rgb(255, 70, 131)' } },
|
||||
data: rData
|
||||
},
|
||||
{
|
||||
@@ -482,11 +454,7 @@ function disk(b,e){
|
||||
smooth:true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgba(46, 165, 186, .7)'
|
||||
}
|
||||
},
|
||||
itemStyle: { normal: { color: 'rgba(46, 165, 186, .7)'} },
|
||||
data: wData
|
||||
}
|
||||
]
|
||||
@@ -522,9 +490,7 @@ function network(b,e){
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'cross'
|
||||
}
|
||||
axisPointer: { type: 'cross' }
|
||||
},
|
||||
legend: {
|
||||
data:[lan.index.net_up,lan.index.net_down]
|
||||
@@ -533,26 +499,14 @@ function network(b,e){
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: xData,
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
axisLine:{ lineStyle:{ color:"#666" } }
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: lan.index.unit+':KB/s',
|
||||
boundaryGap: [0, '100%'],
|
||||
splitLine:{
|
||||
lineStyle:{
|
||||
color:"#ddd"
|
||||
}
|
||||
},
|
||||
axisLine:{
|
||||
lineStyle:{
|
||||
color:"#666"
|
||||
}
|
||||
}
|
||||
splitLine:{ lineStyle:{ color:"#ddd" } },
|
||||
axisLine:{ lineStyle:{ color:"#666" } }
|
||||
},
|
||||
dataZoom: [{
|
||||
type: 'inside',
|
||||
@@ -579,11 +533,7 @@ function network(b,e){
|
||||
smooth:true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(255, 140, 0)'
|
||||
}
|
||||
},
|
||||
itemStyle: { normal: { color: 'rgb(255, 140, 0)' } },
|
||||
data: yData
|
||||
},
|
||||
{
|
||||
@@ -592,11 +542,7 @@ function network(b,e){
|
||||
smooth:true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(30, 144, 255)'
|
||||
}
|
||||
},
|
||||
itemStyle: { normal: { color: 'rgb(30, 144, 255)' } },
|
||||
data: zData
|
||||
}
|
||||
]
|
||||
@@ -879,17 +825,8 @@ function getload(b,e){
|
||||
{
|
||||
name: '资源使用率%',
|
||||
type: 'line',
|
||||
lineStyle: {
|
||||
normal: {
|
||||
width: 2,
|
||||
color: 'rgb(255, 140, 0)'
|
||||
}
|
||||
},
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(255, 140, 0)'
|
||||
}
|
||||
},
|
||||
lineStyle: { normal: { width: 2, color: 'rgb(255, 140, 0)'}},
|
||||
itemStyle: {normal: { color: 'rgb(255, 140, 0)' }},
|
||||
data: yData
|
||||
},
|
||||
{
|
||||
@@ -897,17 +834,8 @@ function getload(b,e){
|
||||
yAxisIndex: 1,
|
||||
name: '1分钟',
|
||||
type: 'line',
|
||||
lineStyle: {
|
||||
normal: {
|
||||
width: 2,
|
||||
color: 'rgb(30, 144, 255)'
|
||||
}
|
||||
},
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(30, 144, 255)'
|
||||
}
|
||||
},
|
||||
lineStyle: { normal: {width: 2,color: 'rgb(30, 144, 255)' }},
|
||||
itemStyle: { normal: { color: 'rgb(30, 144, 255)'} },
|
||||
data: zData
|
||||
},
|
||||
{
|
||||
@@ -915,17 +843,8 @@ function getload(b,e){
|
||||
yAxisIndex: 1,
|
||||
name: '5分钟',
|
||||
type: 'line',
|
||||
lineStyle: {
|
||||
normal: {
|
||||
width: 2,
|
||||
color: 'rgb(0, 178, 45)'
|
||||
}
|
||||
},
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(0, 178, 45)'
|
||||
}
|
||||
},
|
||||
lineStyle: { normal: { width: 2, color: 'rgb(0, 178, 45)'} },
|
||||
itemStyle: { normal: { color: 'rgb(0, 178, 45)' } },
|
||||
data: aData
|
||||
},
|
||||
{
|
||||
@@ -933,28 +852,16 @@ function getload(b,e){
|
||||
yAxisIndex: 1,
|
||||
name: '15分钟',
|
||||
type: 'line',
|
||||
lineStyle: {
|
||||
normal: {
|
||||
width: 2,
|
||||
color: 'rgb(147, 38, 255)'
|
||||
}
|
||||
},
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: 'rgb(147, 38, 255)'
|
||||
}
|
||||
},
|
||||
lineStyle: { normal: { width: 2, color: 'rgb(147, 38, 255)'}},
|
||||
itemStyle: { normal: { color: 'rgb(147, 38, 255)' } },
|
||||
data: bData
|
||||
}
|
||||
],
|
||||
textStyle: {
|
||||
color: '#666',
|
||||
fontSize: 12
|
||||
}
|
||||
textStyle: { color: '#666',fontSize: 12}
|
||||
}
|
||||
myChartgetload.setOption(option);
|
||||
window.addEventListener("resize",function(){
|
||||
myChartgetload.resize();
|
||||
})
|
||||
},'json')
|
||||
},'json');
|
||||
}
|
||||
+234
-63
@@ -233,16 +233,41 @@ function changePathCallback(default_dir, callback) {
|
||||
closeBtn: 1,
|
||||
shift: 5,
|
||||
shadeClose: false,
|
||||
content: "<div class='changepath'><div class='path-top'><button type='button' class='btn btn-default btn-sm' onclick='backFile()'><span class='glyphicon glyphicon-share-alt'></span>返回</button>\
|
||||
<div class='place' id='PathPlace'>当前路径:<span></span></div></div><div class='path-con'><div class='path-con-left'><dl><dt id='changecomlist' onclick='backMyComputer()'>计算机</dt></dl></div>\
|
||||
<div class='path-con-right'><ul class='default' id='computerDefautl'></ul><div class='file-list divtable'>\
|
||||
<table class='table table-hover' style='border:0 none'>\
|
||||
<thead><tr class='file-list-head'><th width='40%'>文件名</th><th width='20%'>修改时间</th><th width='10%'>权限</th><th width='10%'>所有者</th><th width='10%'></th></tr></thead>\
|
||||
<tbody id='tbody' class='list-list'></tbody></table></div></div></div></div><div class='getfile-btn' style='margin-top:0'>\
|
||||
<button type='button' class='btn btn-default btn-sm pull-left' onclick='createFolder()'>新建文件夹</button>\
|
||||
<button type='button' class='btn btn-danger btn-sm mr5 btn-close'>关闭</button>\
|
||||
<button type='button' class='btn btn-success btn-sm btn-choose'>选择</button>\
|
||||
</div>",
|
||||
content: "<div class='changepath'>\
|
||||
<div class='path-top'>\
|
||||
<button type='button' class='btn btn-default btn-sm' onclick='backFile()'>\
|
||||
<span class='glyphicon glyphicon-share-alt'></span>返回\
|
||||
</button>\
|
||||
<div class='place' id='PathPlace'>当前路径:<span></span></div>\
|
||||
</div>\
|
||||
<div class='path-con'>\
|
||||
<div class='path-con-left'>\
|
||||
<dl><dt id='changecomlist' onclick='backMyComputer()'>计算机</dt></dl>\
|
||||
</div>\
|
||||
<div class='path-con-right'>\
|
||||
<ul class='default' id='computerDefautl'></ul>\
|
||||
<div class='file-list divtable'>\
|
||||
<table class='table table-hover' style='border:0 none'>\
|
||||
<thead>\
|
||||
<tr class='file-list-head'>\
|
||||
<th width='40%'>文件名</th>\
|
||||
<th width='20%'>修改时间</th>\
|
||||
<th width='10%'>权限</th>\
|
||||
<th width='10%'>所有者</th>\
|
||||
<th width='10%'></th>\
|
||||
</tr>\
|
||||
</thead>\
|
||||
<tbody id='tbody' class='list-list'></tbody>\
|
||||
</table>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='getfile-btn' style='margin-top:0'>\
|
||||
<button type='button' class='btn btn-default btn-sm pull-left' onclick='createFolder()'>新建文件夹</button>\
|
||||
<button type='button' class='btn btn-danger btn-sm mr5 btn-close'>关闭</button>\
|
||||
<button type='button' class='btn btn-success btn-sm btn-choose'>选择</button>\
|
||||
</div>",
|
||||
success:function(layero,layer_index){
|
||||
$('.btn-close').click(function(){
|
||||
layer.close(layer_index);
|
||||
@@ -274,16 +299,38 @@ function changePath(d) {
|
||||
closeBtn: 1,
|
||||
shift: 5,
|
||||
shadeClose: false,
|
||||
content: "<div class='changepath'><div class='path-top'><button type='button' class='btn btn-default btn-sm' onclick='backFile()'><span class='glyphicon glyphicon-share-alt'></span>返回</button>\
|
||||
<div class='place' id='PathPlace'>当前路径:<span></span></div></div><div class='path-con'><div class='path-con-left'><dl><dt id='changecomlist' onclick='backMyComputer()'>计算机</dt></dl></div>\
|
||||
<div class='path-con-right'><ul class='default' id='computerDefautl'></ul><div class='file-list divtable'>\
|
||||
<table class='table table-hover' style='border:0 none'>\
|
||||
<thead><tr class='file-list-head'><th width='40%'>文件名</th><th width='20%'>修改时间</th><th width='10%'>权限</th><th width='10%'>所有者</th><th width='10%'></th></tr></thead>\
|
||||
<tbody id='tbody' class='list-list'></tbody></table></div></div></div></div><div class='getfile-btn' style='margin-top:0'>\
|
||||
content: "\
|
||||
<div class='changepath'>\
|
||||
<div class='path-top'>\
|
||||
<button type='button' class='btn btn-default btn-sm' onclick='backFile()'><span class='glyphicon glyphicon-share-alt'></span>返回</button>\
|
||||
<div class='place' id='PathPlace'>当前路径:<span></span></div>\
|
||||
</div>\
|
||||
<div class='path-con'>\
|
||||
<div class='path-con-left'><dl><dt id='changecomlist' onclick='backMyComputer()'>计算机</dt></dl></div>\
|
||||
<div class='path-con-right'>\
|
||||
<ul class='default' id='computerDefautl'></ul>\
|
||||
<div class='file-list divtable'>\
|
||||
<table class='table table-hover' style='border:0 none'>\
|
||||
<thead>\
|
||||
<tr class='file-list-head'>\
|
||||
<th width='40%'>文件名</th>\
|
||||
<th width='20%'>修改时间</th>\
|
||||
<th width='10%'>权限</th>\
|
||||
<th width='10%'>所有者</th>\
|
||||
<th width='10%'></th>\
|
||||
</tr>\
|
||||
</thead>\
|
||||
<tbody id='tbody' class='list-list'></tbody>\
|
||||
</table>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class='getfile-btn' style='margin-top:0'>\
|
||||
<button type='button' class='btn btn-default btn-sm pull-left' onclick='createFolder()'>新建文件夹</button>\
|
||||
<button type='button' class='btn btn-danger btn-sm mr5' onclick=\"layer.close(getCookie('changePath'))\">关闭</button>\
|
||||
<button type='button' class='btn btn-success btn-sm' onclick='getfilePath()'>选择</button>\
|
||||
</div>"
|
||||
</div>"
|
||||
});
|
||||
setCookie("changePath", c);
|
||||
var b = $("#" + d).val();
|
||||
@@ -323,7 +370,13 @@ function getDiskList(b) {
|
||||
e = e.substring(0, 10) + "..."
|
||||
}
|
||||
}
|
||||
d += "<tr><td onclick=\"getDiskList('" + h.PATH + "/" + g[0] + "')\" title='" + g[0] + "'><span class='glyphicon glyphicon-folder-open'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td><td>" + g[3] + "</td><td>" + g[4] + "</td><td><span class='delfile-btn' onclick=\"NewDelFile('" + h.PATH + "/" + g[0] + "')\">X</span></td></tr>"
|
||||
d += "<tr>\
|
||||
<td onclick=\"getDiskList('" + h.PATH + "/" + g[0] + "')\" title='" + g[0] + "'>\
|
||||
<span class='glyphicon glyphicon-folder-open'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td>\
|
||||
<td>" + g[3] + "</td>\
|
||||
<td>" + g[4] + "</td>\
|
||||
<td><span class='delfile-btn' onclick=\"NewDelFile('" + h.PATH + "/" + g[0] + "')\">X</span></td>\
|
||||
</tr>";
|
||||
}
|
||||
if(h.FILES != null && h.FILES != "") {
|
||||
for(var f = 0; f < h.FILES.length; f++) {
|
||||
@@ -337,7 +390,13 @@ function getDiskList(b) {
|
||||
e = e.substring(0, 10) + "..."
|
||||
}
|
||||
}
|
||||
d += "<tr><td title='" + g[0] + "'><span class='glyphicon glyphicon-file'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td><td>" + g[3] + "</td><td>" + g[4] + "</td><td></td></tr>"
|
||||
d += "<tr>\
|
||||
<td title='" + g[0] + "'><span class='glyphicon glyphicon-file'></span>" + e + "</td>\
|
||||
<td>" + getLocalTime(g[2]) + "</td>\
|
||||
<td>" + g[3] + "</td>\
|
||||
<td>" + g[4] + "</td>\
|
||||
<td></td>\
|
||||
</tr>";
|
||||
}
|
||||
}
|
||||
$(".default").hide();
|
||||
@@ -720,7 +779,12 @@ function safeMessage(j, h, g, f) {
|
||||
area: "350px",
|
||||
closeBtn: 1,
|
||||
shadeClose: true,
|
||||
content: "<div class='bt-form webDelete pd20 pb70'><p>" + h + "</p>" + f + "<div class='vcode'>"+lan.bt.cal_msg+"<span class='text'>" + sumtext + "</span>=<input type='number' id='vcodeResult' value=''></div><div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm bt-cancel'>"+lan.public.cancel+"</button> <button type='button' id='toSubmit' class='btn btn-success btn-sm' >"+lan.public.ok+"</button></div></div>"
|
||||
content: "<div class='bt-form webDelete pd20 pb70'>\
|
||||
<p>" + h + "</p>" + f + "<div class='vcode'>"+lan.bt.cal_msg+"<span class='text'>" + sumtext + "</span>=<input type='number' id='vcodeResult' value=''></div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' class='btn btn-danger btn-sm bt-cancel'>"+lan.public.cancel+"</button>\
|
||||
<button type='button' id='toSubmit' class='btn btn-success btn-sm' >"+lan.public.ok+"</button></div>\
|
||||
</div>"
|
||||
});
|
||||
$("#vcodeResult").focus().keyup(function(a) {
|
||||
if(a.keyCode == 13) {
|
||||
@@ -856,16 +920,32 @@ function GetTaskList(a) {
|
||||
case "-1":
|
||||
f = true;
|
||||
if(g.data[d].type != "download") {
|
||||
b = "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>正在安装 <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">关闭</a></span><span class='opencmd'></span><pre class='cmd'></pre></li>"
|
||||
b = "<li>\
|
||||
<span class='titlename'>" + g.data[d].name + "</span>\
|
||||
<span class='state'>正在安装 <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">关闭</a></span>\
|
||||
<span class='opencmd'></span><pre class='cmd'></pre>\
|
||||
</li>";
|
||||
} else {
|
||||
b = "<li><div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span><span class='com-progress'>0%</span><span class='state'>下载中 <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">"+lan.public.close+"</a></span></li>"
|
||||
b = "<li>\
|
||||
<div class='line-progress' style='width:0%'></div>\
|
||||
<span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span>\
|
||||
<span class='com-progress'>0%</span><span class='state'>\
|
||||
下载中 <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">"+lan.public.close+"</a>\
|
||||
</span>\
|
||||
</li>";
|
||||
}
|
||||
break;
|
||||
case "0":
|
||||
c += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>等待</span> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">删除</a></li>";
|
||||
c += "<li>\
|
||||
<span class='titlename'>" + g.data[d].name + "</span>\
|
||||
<span class='state'>等待</span> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">删除</a>\
|
||||
</li>";
|
||||
break;
|
||||
case "1":
|
||||
e += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + g.data[d].addtime + " "+'已完成'+" "+ '耗时' + (g.data[d].end - g.data[d].start)+"秒</span></li>"
|
||||
e += "<li>\
|
||||
<span class='titlename'>" + g.data[d].name + "</span>\
|
||||
<span class='state'>" + g.data[d].addtime + " "+'已完成'+" "+ '耗时' + (g.data[d].end - g.data[d].start)+"秒</span>\
|
||||
</li>";
|
||||
}
|
||||
}
|
||||
$("#srunning").html(b + c);
|
||||
@@ -1070,7 +1150,8 @@ function bindPanel(a,type,ip,btid,url,user,pw){
|
||||
btn = "<button type='button' class='btn btn-success btn-sm' onclick=\"bindPanel(1,'b')\">添加</button>";
|
||||
} else {
|
||||
titleName = '修改关联' + ip;
|
||||
btn = "<button type='button' class='btn btn-default btn-sm' onclick=\"bindPaneldel('"+btid+"')\">删除</button><button type='button' class='btn btn-success btn-sm' onclick=\"bindPanel(1,'c','"+ip+"','"+btid+"')\" style='margin-left:7px'>修改</button>";
|
||||
btn = "<button type='button' class='btn btn-default btn-sm' onclick=\"bindPaneldel('"+btid+"')\">删除</button>\
|
||||
<button type='button' class='btn btn-success btn-sm' onclick=\"bindPanel(1,'c','"+ip+"','"+btid+"')\" style='margin-left:7px'>修改</button>";
|
||||
}
|
||||
if(url == undefined) url="http://";
|
||||
if(user == undefined) user="";
|
||||
@@ -1255,13 +1336,37 @@ function remind(a){
|
||||
for(var d = 0; d < g.data.length; d++) {
|
||||
if(g.data[d].status != '1'){
|
||||
task_count++;
|
||||
e += '<tr><td><input type="checkbox"></td><td><div class="titlename c3">'+g.data[d].name+'</span><span class="rs-status">【'+lan.bt.task_the+'】<span><span class="rs-time">耗时['+ getSFM(g.data[d].end - g.data[d].start) +']</span></div></td><td class="text-right c3">'+g.data[d].addtime+'</td></tr>'
|
||||
e += '<tr>\
|
||||
<td><input type="checkbox"></td>\
|
||||
<td>\
|
||||
<div class="titlename c3">\
|
||||
<span>'+g.data[d].name+'</span>\
|
||||
<span class="rs-status">【'+lan.bt.task_the+'】<span>\
|
||||
<span class="rs-time">耗时['+ getSFM(g.data[d].end - g.data[d].start) +']</span>\
|
||||
</div>\
|
||||
</td>\
|
||||
<td class="text-right c3">'+g.data[d].addtime+'</td>\
|
||||
</tr>';
|
||||
} else{
|
||||
e += '<tr><td><input type="checkbox"></td><td><div class="titlename c3">'+g.data[d].name+'</span><span class="rs-status">【'+lan.bt.task_ok+'】<span><span class="rs-time">耗时['+ getSFM(g.data[d].end - g.data[d].start) +']</span></div></td><td class="text-right c3">'+g.data[d].addtime+'</td></tr>';
|
||||
e += '<tr>\
|
||||
<td><input type="checkbox"></td>\
|
||||
<td>\
|
||||
<div class="titlename c3">'+g.data[d].name+'</span>\
|
||||
<span class="rs-status">【'+lan.bt.task_ok+'】<span>\
|
||||
<span class="rs-time">耗时['+ getSFM(g.data[d].end - g.data[d].start) +']</span>\
|
||||
</div>\
|
||||
</td>\
|
||||
<td class="text-right c3">'+g.data[d].addtime+'</td>\
|
||||
</tr>';
|
||||
}
|
||||
}
|
||||
var con = '<div class="divtable"><table class="table table-hover">\
|
||||
<thead><tr><th width="20"><input id="Rs-checkAll" type="checkbox" onclick="RscheckSelect()"></th><th>'+lan.bt.task_name+'</th><th class="text-right">'+lan.bt.task_time+'</th></tr></thead>\
|
||||
<thead>\
|
||||
<tr>\
|
||||
<th width="20"><input id="Rs-checkAll" type="checkbox" onclick="RscheckSelect()"></th>\
|
||||
<th>'+lan.bt.task_name+'</th><th class="text-right">'+lan.bt.task_time+'</th>\
|
||||
</tr>\
|
||||
</thead>\
|
||||
<tbody id="remind">'+e+'</tbody>\
|
||||
</table></div>\
|
||||
<div class="mtb15" style="height:32px">\
|
||||
@@ -1325,12 +1430,26 @@ function getReloads() {
|
||||
c += f[e] + "<br>"
|
||||
}
|
||||
if(h.task[g].name.indexOf("扫描") != -1) {
|
||||
b = "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>正在扫描<img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + h.task[g].id + ")\">关闭</a></span><span class='opencmd'></span><div class='cmd'>" + c + "</div></li>"
|
||||
b = "<li>\
|
||||
<span class='titlename'>" + h.task[g].name + "</span>\
|
||||
<span class='state'>正在扫描<img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + h.task[g].id + ")\">关闭</a></span>\
|
||||
<span class='opencmd'></span>\
|
||||
<div class='cmd'>" + c + "</div>\
|
||||
</li>";
|
||||
} else {
|
||||
b = "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>正在安装<img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + h.task[g].id + ")\">关闭</a></span><div class='cmd'>" + c + "</div></li>"
|
||||
b = "<li>\
|
||||
<span class='titlename'>" + h.task[g].name + "</span>\
|
||||
<span class='state'>正在安装<img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + h.task[g].id + ")\">关闭</a></span>\
|
||||
<div class='cmd'>" + c + "</div>\
|
||||
</li>";
|
||||
}
|
||||
} else {
|
||||
b = "<li><div class='line-progress' style='width:" + h.msg.pre + "%'></div><span class='titlename'>" + h.task[g].name + "<a style='margin-left:130px;'>" + (toSize(h.msg.used) + "/" + toSize(h.msg.total)) + "</a></span><span class='com-progress'>" + h.msg.pre + "%</span><span class='state'>"+lan.bt.task_downloading+" <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + h.task[g].id + ")\">"+lan.public.close+"</a></span></li>"
|
||||
b = "<li>\
|
||||
<div class='line-progress' style='width:" + h.msg.pre + "%'></div>\
|
||||
<span class='titlename'>" + h.task[g].name + "<a style='margin-left:130px;'>" + (toSize(h.msg.used) + "/" + toSize(h.msg.total)) + "</a></span>\
|
||||
<span class='com-progress'>" + h.msg.pre + "%</span>\
|
||||
<span class='state'>"+lan.bt.task_downloading+" <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + h.task[g].id + ")\">"+lan.public.close+"</a></span>\
|
||||
</li>"
|
||||
}
|
||||
} else {
|
||||
d += "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>等待 | <a style='color:green' href=\"javascript:removeTask(" + h.task[g].id + ')">删除</a></span></li>'
|
||||
@@ -1380,14 +1499,24 @@ function tasklist(a){
|
||||
case "-1":
|
||||
f = true;
|
||||
if(g.data[d].type != "download") {
|
||||
b = "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state pull-right c6'>正在安装<img src='/static/img/ing.gif'> | <a class='btlink' href=\"javascript:removeTask(" + g.data[d].id + ")\">关闭</a></span><span class='opencmd'></span><pre class='cmd'></pre></li>"
|
||||
b = "<li>\
|
||||
<span class='titlename'>" + g.data[d].name + "</span>\
|
||||
<span class='state pull-right c6'>正在安装<img src='/static/img/ing.gif'> | <a class='btlink' href=\"javascript:removeTask(" + g.data[d].id + ")\">关闭</a></span>\
|
||||
<span class='opencmd'></span><pre class='cmd'></pre>\
|
||||
</li>";
|
||||
} else {
|
||||
b = "<li><div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span><span class='com-progress'>0%</span><span class='state'>下载中 <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">关闭</a></span></li>"
|
||||
b = "<li>\
|
||||
<div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span>\
|
||||
<span class='com-progress'>0%</span><span class='state'>下载中 <img src='/static/img/ing.gif'> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\">关闭</a></span>\
|
||||
</li>";
|
||||
}
|
||||
task_count++;
|
||||
break;
|
||||
case "0":
|
||||
c += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state pull-right c6'>等待</span> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\" class='btlink'>"+lan.public.del+"</a></li>";
|
||||
c += "<li>\
|
||||
<span class='titlename'>" + g.data[d].name + "</span>\
|
||||
<span class='state pull-right c6'>等待</span> | <a href=\"javascript:removeTask(" + g.data[d].id + ")\" class='btlink'>"+lan.public.del+"</a>\
|
||||
</li>";
|
||||
task_count++;
|
||||
break;
|
||||
}
|
||||
@@ -1704,7 +1833,8 @@ function showSpeed(filename) {
|
||||
* 显示进度窗口
|
||||
*/
|
||||
function showSpeedWindow(msg, speed_log_func_name, callback){
|
||||
var speed_msg = "<pre style='margin-bottom: 0px;height:250px;text-align: left;background-color: #000;color: #fff;white-space: pre-wrap;' id='speed_log_lst'>[MSG]</pre>";
|
||||
var speed_msg = "<pre style='margin-bottom: 0px;height:250px;text-align: left;background-color: #000;\
|
||||
color: #fff;white-space: pre-wrap;' id='speed_log_lst'>[MSG]</pre>";
|
||||
var showSpeedKey = layer.open({
|
||||
title: false,
|
||||
type: 1,
|
||||
@@ -1924,14 +2054,19 @@ function utf8to16(str) {
|
||||
}
|
||||
|
||||
|
||||
function pluginService(_name, version){
|
||||
var data = {name:_name, func:'status'}
|
||||
function pluginService(_name, version, _suffix_name=''){
|
||||
|
||||
var default_name = 'status';
|
||||
if ( _suffix_name != '' ){
|
||||
default_name = 'status_'+_suffix_name;
|
||||
}
|
||||
|
||||
var data = {name:_name, func:default_name};
|
||||
if ( typeof(version) != 'undefined' ){
|
||||
data['version'] = version;
|
||||
} else {
|
||||
version = '';
|
||||
}
|
||||
// console.log(version);
|
||||
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', data, function(data) {
|
||||
@@ -1941,27 +2076,39 @@ function pluginService(_name, version){
|
||||
return;
|
||||
}
|
||||
if (data.data == 'start'){
|
||||
pluginSetService(_name, true, version);
|
||||
pluginSetService(_name, true, version, _suffix_name);
|
||||
} else {
|
||||
pluginSetService(_name, false, version);
|
||||
pluginSetService(_name, false, version, _suffix_name);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function pluginSetService(_name ,status, version){
|
||||
function pluginSetService(_name ,status, version, _suffix_name=''){
|
||||
|
||||
var default_name = 'status';
|
||||
var restart_name = 'restart';
|
||||
var reload_name = 'reload';
|
||||
var status_ss = (status?'stop':'start');
|
||||
if ( _suffix_name != '' ){
|
||||
default_name = 'status_'+_suffix_name;
|
||||
restart_name = 'restart_'+_suffix_name;
|
||||
reload_name = 'reload_'+_suffix_name;
|
||||
status_ss = status_ss+'_'+_suffix_name;
|
||||
}
|
||||
|
||||
var serviceCon ='<p class="status">当前状态:<span>'+(status ? '开启' : '关闭' )+
|
||||
'</span><span style="color: '+
|
||||
(status?'#20a53a;':'red;')+
|
||||
' margin-left: 3px;" class="glyphicon ' + (status?'glyphicon glyphicon-play':'glyphicon-pause')+'"></span></p><div class="sfm-opt">\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpService(\''+_name+'\',\''+(status?'stop':'start')+'\',\''+version+'\')">'+(status?'停止':'启动')+'</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpService(\''+_name+'\',\'restart\',\''+version+'\')">重启</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpService(\''+_name+'\',\'reload\',\''+version+'\')">重载配置</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpService(\''+_name+'\',\''+status_ss+'\',\''+version+'\',\''+_suffix_name+'\')">'+(status?'停止':'启动')+'</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpService(\''+_name+'\',\''+restart_name+'\',\''+version+'\',\''+_suffix_name+'\')">重启</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpService(\''+_name+'\',\''+reload_name+'\',\''+version+'\',\''+_suffix_name+'\')">重载配置</button>\
|
||||
</div>';
|
||||
$(".soft-man-con").html(serviceCon);
|
||||
}
|
||||
|
||||
|
||||
function pluginOpService(a, b, v) {
|
||||
function pluginOpService(a, b, v, _suffix_name='') {
|
||||
|
||||
var c = "name=" + a + "&func=" + b;
|
||||
if(v != ''){
|
||||
@@ -1969,26 +2116,33 @@ function pluginOpService(a, b, v) {
|
||||
}
|
||||
|
||||
var d = "";
|
||||
|
||||
b = b.split('_')[0];
|
||||
switch(b) {
|
||||
case "stop":d = '停止';break;
|
||||
case "start":d = '启动';break;
|
||||
case "restart":d = '重启';break;
|
||||
case "reload":d = '重载';break;
|
||||
}
|
||||
layer.confirm( msgTpl('您真的要{1}{2}{3}服务吗?', [d,a,v]), {icon:3,closeBtn: 1}, function() {
|
||||
var e = layer.msg(msgTpl('正在{1}{2}{3}服务,请稍候...',[d,a,v]), {icon: 16,time: 0});
|
||||
|
||||
_ver = v;
|
||||
if(v != ''){
|
||||
_ver = '【' + v + '】';
|
||||
}
|
||||
|
||||
layer.confirm( msgTpl('您真的要{1}{2}{3}服务吗?', [d,a,_ver]), {icon:3,closeBtn: 1}, function() {
|
||||
var e = layer.msg(msgTpl('正在{1}{2}{3}服务,请稍候...',[d,a,_ver]), {icon: 16,time: 0});
|
||||
$.post("/plugins/run", c, function(g) {
|
||||
layer.close(e);
|
||||
|
||||
|
||||
var f = g.data == 'ok' ? msgTpl('{1}{2}服务已{3}',[a,v,d]) : msgTpl('{1}{2}服务{3}失败!',[a,v,d]);
|
||||
var f = g.data == 'ok' ? msgTpl('{1}{2}服务已{3}',[a,_ver,d]) : msgTpl('{1}{2}服务{3}失败!',[a,_ver,d]);
|
||||
layer.msg(f, {icon: g.data == 'ok' ? 1 : 2});
|
||||
|
||||
if( b != "reload" && g.data == 'ok' ) {
|
||||
if ( b == 'start' ) {
|
||||
pluginSetService(a, true, v);
|
||||
pluginSetService(a, true, v, _suffix_name);
|
||||
} else if ( b == 'stop' ){
|
||||
pluginSetService(a, false, v);
|
||||
pluginSetService(a, false, v, _suffix_name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2209,14 +2363,18 @@ function pluginConfigSave(fileName) {
|
||||
},'json');
|
||||
}
|
||||
|
||||
|
||||
|
||||
function pluginInitD(_name,_version){
|
||||
function pluginInitD(_name, _version, _suffix_name=''){
|
||||
if (typeof _version == 'undefined'){
|
||||
_version = '';
|
||||
}
|
||||
|
||||
var default_name = 'initd_status';
|
||||
if ( _suffix_name != '' ){
|
||||
default_name = 'initd_status_'+_suffix_name;
|
||||
}
|
||||
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:_name, func:'initd_status',version : _version}, function(data) {
|
||||
$.post('/plugins/run', {name:_name, func:default_name, version : _version}, function(data) {
|
||||
layer.close(loadT);
|
||||
if( !data.status ){
|
||||
layer.msg(data.msg,{icon:0,time:3000,shade: [0.3, '#000']});
|
||||
@@ -2227,35 +2385,48 @@ function pluginInitD(_name,_version){
|
||||
return;
|
||||
}
|
||||
if (data.data == 'ok'){
|
||||
pluginSetInitD(_name, _version, true);
|
||||
pluginSetInitD(_name, _version, true, _suffix_name);
|
||||
} else {
|
||||
pluginSetInitD(_name, _version, false);
|
||||
pluginSetInitD(_name, _version, false, _suffix_name);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function pluginSetInitD(_name, _version, status){
|
||||
function pluginSetInitD(_name, _version, status,_suffix_name=''){
|
||||
|
||||
var default_name = (status?'initd_uninstall':'initd_install');
|
||||
if ( _suffix_name != '' ){
|
||||
default_name = default_name + '_' + _suffix_name;
|
||||
}
|
||||
|
||||
var serviceCon ='<p class="status">当前状态:<span>'+(status ? '已加载' : '未加载' )+
|
||||
'</span><span style="color: '+
|
||||
(status?'#20a53a;':'red;')+
|
||||
' margin-left: 3px;" class="glyphicon ' + (status?'glyphicon glyphicon-play':'glyphicon-pause')+'"></span></p><div class="sfm-opt">\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpInitD(\''+_name+'\',\''+_version+'\',\''+(status?'initd_uninstall':'initd_install')+'\')">'+(status?'卸载':'加载')+'</button>\
|
||||
<button class="btn btn-default btn-sm" onclick="pluginOpInitD(\''+_name+'\',\''+_version+'\',\''+default_name+'\',\''+_suffix_name+'\')">'+(status?'卸载':'加载')+'</button>\
|
||||
</div>';
|
||||
$(".soft-man-con").html(serviceCon);
|
||||
}
|
||||
|
||||
function pluginOpInitD(a, _version, b) {
|
||||
function pluginOpInitD(a, _version, b, _suffix_name='') {
|
||||
var c = "name=" + a + "&func=" + b + "&version="+_version;
|
||||
var d = "";
|
||||
b = b.split('_'+_suffix_name)[0];
|
||||
switch(b) {
|
||||
case "initd_install":d = '加载';break;
|
||||
case "initd_uninstall":d = '卸载';break;
|
||||
}
|
||||
layer.confirm( msgTpl('您真的要{1}{2}{3}服务吗?', [d,a,_version]), {icon:3,closeBtn: 1}, function() {
|
||||
var e = layer.msg(msgTpl('正在{1}{2}{3}服务,请稍候...',[d,a,_version]), {icon: 16,time: 0});
|
||||
|
||||
_ver = _version;
|
||||
if(_version != ''){
|
||||
_ver = '【' + _version + '】';
|
||||
}
|
||||
|
||||
layer.confirm( msgTpl('您真的要{1}{2}{3}服务吗?', [d,a,_ver]), {icon:3,closeBtn: 1}, function() {
|
||||
var e = layer.msg(msgTpl('正在{1}{2}{3}服务,请稍候...',[d,a,_ver]), {icon: 16,time: 0});
|
||||
$.post("/plugins/run", c, function(g) {
|
||||
layer.close(e);
|
||||
var f = g.data == 'ok' ? msgTpl('{1}{3}服务已{2}',[a,d,_version]) : msgTpl('{1}{3}服务{2}失败!',[a,d,_version]);
|
||||
var f = g.data == 'ok' ? msgTpl('{1}{3}服务已{2}',[a,d,_ver]) : msgTpl('{1}{3}服务{2}失败!',[a,d,_ver]);
|
||||
layer.msg(f, {icon: g.data == 'ok' ? 1 : 2});
|
||||
|
||||
if ( b == 'initd_install' && g.data == 'ok' ) {
|
||||
|
||||
+31
-23
@@ -4,8 +4,8 @@
|
||||
* @param {String} search 搜索条件
|
||||
*/
|
||||
function getWeb(page, search, type_id) {
|
||||
search = $("#SearchValue").prop("value");
|
||||
page = page == undefined ? '1':page;
|
||||
var search = $("#SearchValue").prop("value");
|
||||
var page = page == undefined ? '1':page;
|
||||
var order = getCookie('order');
|
||||
if(order){
|
||||
order = '&order=' + order;
|
||||
@@ -127,7 +127,7 @@
|
||||
if(databak == null){
|
||||
databak = '';
|
||||
}
|
||||
$(this).hide().after("<input class='baktext' type='text' data-id='"+dataid+"' name='bak' value='" + databak + "' placeholder='备注信息' onblur='getBakPost(\"sites\")' />");
|
||||
$(this).hide().after("<input class='baktext' type='text' data-id='"+dataid+"' data-page='"+page+"' name='bak' value='" + databak + "' placeholder='备注信息' onblur='getBakPost(\"sites\")' />");
|
||||
$(".baktext").focus();
|
||||
});
|
||||
|
||||
@@ -138,22 +138,23 @@
|
||||
|
||||
function getBakPost(b) {
|
||||
$(".baktext").hide().prev().show();
|
||||
var c = $(".baktext").attr("data-id");
|
||||
var id = $(".baktext").attr("data-id");
|
||||
var page = $(".baktext").attr("data-page");
|
||||
var a = $(".baktext").val();
|
||||
if(a == "") {
|
||||
a = '空';
|
||||
}
|
||||
setWebPs(b, c, a);
|
||||
$("a[data-id='" + c + "']").html(a);
|
||||
setWebPs(b, id, a,page);
|
||||
$("a[data-id='" + id + "']").html(a);
|
||||
$(".baktext").remove();
|
||||
}
|
||||
|
||||
function setWebPs(b, e, a) {
|
||||
function setWebPs(b, id, ps,page) {
|
||||
var d = layer.load({shade: true,shadeClose: false});
|
||||
var c = 'ps=' + a;
|
||||
$.post('/site/set_ps', 'id=' + e + "&" + c, function(data) {
|
||||
var ps = 'ps=' + ps;
|
||||
$.post('/site/set_ps', 'id=' + id + "&" + ps, function(data) {
|
||||
if(data['status']) {
|
||||
getWeb(1);
|
||||
getWeb(page);
|
||||
layer.closeAll();
|
||||
layer.msg('修改成功!', {icon: 1});
|
||||
} else {
|
||||
@@ -1300,7 +1301,7 @@ function showRewrite(rdata){
|
||||
<select class='bt-input-text mr20' id='myRewrite' name='rewrite' style='width:30%;'>"+rList+"</select>\
|
||||
<textarea class='bt-input-text mtb15' style='height: 260px; width: 470px; line-height:18px;padding:5px;' id='rewriteBody'>"+rdata.data+"</textarea>\
|
||||
</div>\
|
||||
<button id='SetRewriteBtn' class='btn btn-success btn-sm' onclick=\"SetRewrite('"+rdata.filename+"')\">保存</button>\
|
||||
<button id='setRewriteBtn' class='btn btn-success btn-sm'>保存</button>\
|
||||
<ul class='help-info-text c7 ptb10'>\
|
||||
<li>请选择您的应用,若设置伪静态后,网站无法正常访问,请尝试设置回default</li>\
|
||||
<li>您可以对伪静态规则进行修改,修改完后保存即可。</li>\
|
||||
@@ -1313,14 +1314,21 @@ function showRewrite(rdata){
|
||||
closeBtn: 1,
|
||||
shift: 5,
|
||||
shadeClose: true,
|
||||
content:webBakHtml
|
||||
});
|
||||
|
||||
$("#myRewrite").change(function(){
|
||||
var rewriteName = $(this).val();
|
||||
$.post('/files/get_body','path='+rdata['rewrite_dir']+'/'+rewriteName+'.conf',function(fileBody){
|
||||
$("#rewriteBody").val(fileBody.data.data);
|
||||
},'json');
|
||||
content:webBakHtml,
|
||||
success:function(){
|
||||
|
||||
$("#myRewrite").change(function(){
|
||||
var rewriteName = $(this).val();
|
||||
$.post('/files/get_body','path='+rdata['rewrite_dir']+'/'+rewriteName+'.conf',function(fileBody){
|
||||
$("#rewriteBody").val(fileBody.data.data);
|
||||
},'json');
|
||||
});
|
||||
|
||||
$('#setRewriteBtn').click(function(){
|
||||
var data = $("#rewriteBody").val();
|
||||
setRewrite(rdata.filename, encodeURIComponent(data));
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1333,7 +1341,7 @@ function addDirBinding(id){
|
||||
return;
|
||||
}
|
||||
|
||||
var data = 'id='+id+'&domain='+domain+'&dirName='+dirName
|
||||
var data = 'id='+id+'&domain='+domain+'&dirName='+dirName;
|
||||
$.post('/site/add_dir_bind',data,function(rdata){
|
||||
dirBinding(id);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2});
|
||||
@@ -2427,7 +2435,7 @@ function rewrite(siteName){
|
||||
$("#SetRewriteBtn").click(function(){
|
||||
$("#rewriteBody").empty();
|
||||
$("#rewriteBody").text(editor.getValue());
|
||||
setRewrite(filename);
|
||||
setRewrite(filename, encodeURIComponent(editor.getValue()));
|
||||
});
|
||||
$("#SetRewriteBtnTel").click(function(){
|
||||
$("#rewriteBody").empty();
|
||||
@@ -2459,8 +2467,8 @@ function rewrite(siteName){
|
||||
|
||||
|
||||
//设置伪静态
|
||||
function setRewrite(filename){
|
||||
var data = 'data='+encodeURIComponent($("#rewriteBody").val())+'&path='+filename+'&encoding=utf-8';
|
||||
function setRewrite(filename,data){
|
||||
var data = 'data='+data+'&path='+filename+'&encoding=utf-8';
|
||||
var loadT = layer.msg(lan.site.saving_txt,{icon:16,time:0,shade: [0.3, '#000']});
|
||||
$.post('/site/set_rewrite',data,function(rdata){
|
||||
layer.close(loadT);
|
||||
|
||||
@@ -1805,7 +1805,7 @@ html .menu .menu_exit:hover {
|
||||
|
||||
.view1,
|
||||
.view2 {
|
||||
margin-bottom: 15px
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.searcTime {
|
||||
@@ -1840,7 +1840,7 @@ html .menu .menu_exit:hover {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
float: left;
|
||||
line-height: 16px
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.searcTime .ss .st {
|
||||
@@ -1848,7 +1848,7 @@ html .menu .menu_exit:hover {
|
||||
border: #ddd 1px solid;
|
||||
margin-right: -1px;
|
||||
cursor: pointer;
|
||||
float: left
|
||||
float: left;
|
||||
}
|
||||
|
||||
.searcTime .ss .time {
|
||||
@@ -1859,26 +1859,27 @@ html .menu .menu_exit:hover {
|
||||
position: absolute;
|
||||
right: -1px;
|
||||
top: 27px;
|
||||
width: 217px;
|
||||
z-index: 99
|
||||
width: 306px;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.searcTime .ss .time span {
|
||||
margin-bottom: 10px;
|
||||
display: block
|
||||
display: block;
|
||||
}
|
||||
|
||||
.searcTime .ss .time input {
|
||||
border: 1px solid #ddd;
|
||||
height: 22px;
|
||||
padding: 0 5px;
|
||||
width: 132px
|
||||
margin-left:5px;
|
||||
width: 227px;
|
||||
}
|
||||
|
||||
.searcTime .ss .time input:focus {
|
||||
border: #66afe9 1px solid;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6)
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
|
||||
}
|
||||
|
||||
.searcTime .ss .sbtn {
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
<p class="mtb15">
|
||||
<span class="set-tit text-right">面板端口</span>
|
||||
<input id="banport" name="port" class="inputtxt bt-input-text" type="numner" value="{{data['port']}}" maxlength="5">
|
||||
<input data-port="{{data['port']}}" id="banport" name="port" class="inputtxt bt-input-text" type="numner" value="{{data['port']}}" maxlength="5">
|
||||
<button type="button" class="btn btn-success btn-sm ml5 btn_port" disabled>保存</button>
|
||||
<span class="set-info c7">建议端口范围7200 - 65535</span>
|
||||
</p>
|
||||
|
||||
@@ -51,14 +51,15 @@
|
||||
<div class="ss">
|
||||
<span class="st">自定义时间</span>
|
||||
<div class="time">
|
||||
<span class="bt">开始时间<input class="btime" type="text" value="2017/1/10 00:00:00"></span>
|
||||
<span class="et">结束时间<input class="etime" type="text" value="2017/1/13 00:00:00"></span>
|
||||
<span class="bt">时间范围
|
||||
<input id="loadbtn_rtime" class="rtime" type="text" value="2023-07-06 00:00:00 - 2023-08-08 00:00:00">
|
||||
</span>
|
||||
<div class="sbtn loadbtn">提交</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="getloadview" style="width:100%; height:330px"></div>
|
||||
<div id="getloadview" style="width:100%; height:330px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -67,12 +68,18 @@
|
||||
<div class="bgw pb15">
|
||||
<div class="title c6 plr15">
|
||||
<h3 class="c-tit f16">CPU</h3>
|
||||
<div class="searcTime pull-right"><span class="tit">区间检索:</span><span class="gt" onclick="Wday(1,'cpu')">昨天</span><span class="gt on" onclick="Wday(0,'cpu')">今天</span><span class="gt" onclick="Wday(7,'cpu')">最近7天</span><span class="gt" onclick="Wday(30,'cpu')">最近30天</span>
|
||||
<div class="searcTime pull-right">
|
||||
<span class="tit">区间检索:</span>
|
||||
<span class="gt" onclick="Wday(1,'cpu')">昨天</span>
|
||||
<span class="gt on" onclick="Wday(0,'cpu')">今天</span>
|
||||
<span class="gt" onclick="Wday(7,'cpu')">最近7天</span>
|
||||
<span class="gt" onclick="Wday(30,'cpu')">最近30天</span>
|
||||
<div class="ss">
|
||||
<span class="st">自定义时间</span>
|
||||
<div class="time">
|
||||
<span class="bt">开始时间<input class="btime" type="text" value="2017/1/10 00:00:00"></span>
|
||||
<span class="et">结束时间<input class="etime" type="text" value="2017/1/13 00:00:00"></span>
|
||||
<span class="bt">时间范围
|
||||
<input id="cpubtn_rtime" class="rtime" type="text" value="2023-07-06 00:00:00 - 2023-08-08 00:00:00">
|
||||
</span>
|
||||
<div class="sbtn cpubtn">提交</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -87,12 +94,18 @@
|
||||
<div class="bgw pb15">
|
||||
<div class="title c6 plr15">
|
||||
<h3 class="c-tit f16">内存</h3>
|
||||
<div class="searcTime pull-right"><span class="tit">区间检索:</span><span class="gt" onclick="Wday(1,'mem')">昨天</span><span class="gt on" onclick="Wday(0,'mem')">今天</span><span class="gt" onclick="Wday(7,'mem')">最近7天</span><span class="gt" onclick="Wday(30,'mem')">最近30天</span>
|
||||
<div class="searcTime pull-right">
|
||||
<span class="tit">区间检索:</span>
|
||||
<span class="gt" onclick="Wday(1,'mem')">昨天</span>
|
||||
<span class="gt on" onclick="Wday(0,'mem')">今天</span>、
|
||||
<span class="gt" onclick="Wday(7,'mem')">最近7天</span>
|
||||
<span class="gt" onclick="Wday(30,'mem')">最近30天</span>
|
||||
<div class="ss">
|
||||
<span class="st">自定义时间</span>
|
||||
<div class="time">
|
||||
<span class="bt">开始时间<input class="btime" type="text" value="2017/1/10 00:00:00"></span>
|
||||
<span class="et">结束时间<input class="etime" type="text" value="2017/1/13 00:00:00"></span>
|
||||
<span class="bt">时间范围
|
||||
<input id="membtn_rtime" class="rtime" type="text" value="2023-07-06 00:00:00 - 2023-08-08 00:00:00">
|
||||
</span>
|
||||
<div class="sbtn membtn">提交</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -107,12 +120,18 @@
|
||||
<div class="bgw pb15">
|
||||
<div class="title c6 plr15 mb15">
|
||||
<h3 class="c-tit f16">磁盘IO</h3>
|
||||
<div class="searcTime pull-right"><span class="tit">$data['lan']['S1']</span><span class="gt" onclick="Wday(1,'disk')">昨天</span><span class="gt on" onclick="Wday(0,'disk')">今天</span><span class="gt" onclick="Wday(7,'disk')">最近7天</span><span class="gt" onclick="Wday(30,'disk')">最近30天</span>
|
||||
<div class="searcTime pull-right">
|
||||
<span class="tit">$data['lan']['S1']</span>
|
||||
<span class="gt" onclick="Wday(1,'disk')">昨天</span>
|
||||
<span class="gt on" onclick="Wday(0,'disk')">今天</span>
|
||||
<span class="gt" onclick="Wday(7,'disk')">最近7天</span>
|
||||
<span class="gt" onclick="Wday(30,'disk')">最近30天</span>
|
||||
<div class="ss">
|
||||
<span class="st">自定义时间</span>
|
||||
<div class="time">
|
||||
<span class="bt">开始时间<input class="btime" type="text" value="2017/1/10 00:00:00"></span>
|
||||
<span class="et">结束时间<input class="etime" type="text" value="2017/1/13 00:00:00"></span>
|
||||
<span class="bt">时间范围
|
||||
<input id="diskbtn_rtime" class="rtime" type="text" value="2023-07-06 00:00:00 - 2023-08-08 00:00:00">
|
||||
</span>
|
||||
<div class="sbtn diskbtn">提交</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -127,12 +146,18 @@
|
||||
<div class="bgw pb15">
|
||||
<div class="title c6 plr15 mb15">
|
||||
<h3 class="c-tit f16">网络IO</h3>
|
||||
<div class="searcTime pull-right"><span class="tit">$data['lan']['S1']</span><span class="gt" onclick="Wday(1,'network')">昨天</span><span class="gt on" onclick="Wday(0,'network')">今天</span><span class="gt" onclick="Wday(7,'network')">最近7天</span><span class="gt" onclick="Wday(30,'network')">最近30天</span>
|
||||
<div class="searcTime pull-right">
|
||||
<span class="tit">$data['lan']['S1']</span>
|
||||
<span class="gt" onclick="Wday(1,'network')">昨天</span>
|
||||
<span class="gt on" onclick="Wday(0,'network')">今天</span>
|
||||
<span class="gt" onclick="Wday(7,'network')">最近7天</span>
|
||||
<span class="gt" onclick="Wday(30,'network')">最近30天</span>
|
||||
<div class="ss">
|
||||
<span class="st">自定义时间</span>
|
||||
<div class="time">
|
||||
<span class="bt">开始时间<input class="btime" type="text" value="2017/1/10 00:00:00"></span>
|
||||
<span class="et">结束时间<input class="etime" type="text" value="2017/1/13 00:00:00"></span>
|
||||
<span class="bt">时间范围
|
||||
<input id="networkbtn_rtime" class="rtime" type="text" value="2023-07-06 00:00:00 - 2023-08-08 00:00:00">
|
||||
</span>
|
||||
<div class="sbtn networkbtn">提交</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -146,6 +171,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="/static/laydate/laydate.js?v={{config.version}}"></script>
|
||||
<script src="/static/app/control.js?v={{config.version}}"></script>
|
||||
|
||||
{% endblock %}
|
||||
@@ -54,8 +54,8 @@
|
||||
<ul id="rmenu" class="dropdown-menu" style="display:none">
|
||||
<li onclick="javascript:batch(1);"><a style="cursor: pointer;">复制</a></li>
|
||||
<li onclick="javascript:batch(2);"><a style="cursor: pointer;">剪切</a></li>
|
||||
<li onclick="javascript:batch(5);"><a style="cursor: pointer;">权限</a></li>
|
||||
<li onclick="javascript:batch(3);"><a style="cursor: pointer;">压缩</a></li>
|
||||
<li onclick="javascript:batch(3);"><a style="cursor: pointer;">权限</a></li>
|
||||
<li onclick="javascript:batch(5);"><a style="cursor: pointer;">压缩</a></li>
|
||||
<li onclick="javascript:batch(4);"><a style="cursor: pointer;">删除</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
<a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">软件管理</span>
|
||||
</div>
|
||||
<div class="search pull-right">
|
||||
<form target="hid" onsubmit='getSList()'>
|
||||
<input type="text" id="SearchValue" class="ser-text pull-left" placeholder="搜索" />
|
||||
<form target="_self" onsubmit='getSList();return false;'>
|
||||
<input type="text" id="SearchValue" class="ser-text pull-left" placeholder="搜索" autocomplete="false" />
|
||||
<button type="button" class="ser-sub pull-left" onclick='getSList()'></button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
+23
-16
@@ -22,32 +22,32 @@ fi
|
||||
|
||||
if [ ${_os} == "Darwin" ]; then
|
||||
OSNAME='macos'
|
||||
elif grep -Eq "openSUSE" /etc/*-release; then
|
||||
elif grep -Eqi "openSUSE" /etc/*-release; then
|
||||
OSNAME='opensuse'
|
||||
zypper refresh
|
||||
zypper install cron wget curl zip unzip
|
||||
elif grep -Eq "FreeBSD" /etc/*-release; then
|
||||
elif grep -Eqi "FreeBSD" /etc/*-release; then
|
||||
OSNAME='freebsd'
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eqi "CentOS" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget curl zip unzip tar crontabs
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
|
||||
OSNAME='fedora'
|
||||
yum install -y wget curl zip unzip tar crontabs
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eq "Rocky" /etc/*-release; then
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eqi "Fedora" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget curl zip unzip tar crontabs
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eq "AlmaLinux" /etc/*-release; then
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eqi "Rocky" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget curl zip unzip tar crontabs
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eq "Amazon Linux" /etc/*-release; then
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eqi "AlmaLinux" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget curl zip unzip tar crontabs
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eqi "Amazon Linux" /etc/*-release; then
|
||||
OSNAME='amazon'
|
||||
yum install -y wget curl zip unzip tar crontabs
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/os-release; then
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eqi "Debian" /etc/os-release; then
|
||||
OSNAME='debian'
|
||||
apt update -y
|
||||
apt install -y wget curl zip unzip tar cron
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/os-release; then
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eqi "Ubuntu" /etc/os-release; then
|
||||
OSNAME='ubuntu'
|
||||
apt update -y
|
||||
apt install -y wget curl zip unzip tar cron
|
||||
@@ -56,16 +56,24 @@ else
|
||||
fi
|
||||
|
||||
|
||||
# cn=$(curl --insecure -fsSL -m 10 https://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
# HTTP_PREFIX="https://"
|
||||
# LOCAL_ADDR=common
|
||||
# ping -c 1 github.com > /dev/null 2>&1
|
||||
# if [ "$?" != "0" ];then
|
||||
# LOCAL_ADDR=cn
|
||||
# HTTP_PREFIX="https://ghproxy.com/"
|
||||
# fi
|
||||
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
HTTP_PREFIX="https://"
|
||||
LOCAL_ADDR=common
|
||||
ping -c 1 github.com > /dev/null 2>&1
|
||||
if [ "$?" != "0" ];then
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
fi
|
||||
|
||||
echo "local:${LOCAL_ADDR}"
|
||||
|
||||
if [ $OSNAME != "macos" ];then
|
||||
if id www &> /dev/null ;then
|
||||
echo ""
|
||||
@@ -106,7 +114,6 @@ if [ $OSNAME != "macos" ];then
|
||||
tar xvzf /tmp/acme.tar.gz -C /tmp
|
||||
cd /tmp/acme.sh-master
|
||||
bash acme.sh install
|
||||
cd -
|
||||
fi
|
||||
|
||||
if [ ! -d /root/.acme.sh ];then
|
||||
|
||||
@@ -18,7 +18,9 @@ yum install -y python3-devel
|
||||
yum install -y python3-pip
|
||||
yum install -y python-devel
|
||||
yum install -y vixie-cron
|
||||
yum install -y curl-devel libmcrypt libmcrypt-devel
|
||||
yum install -y curl-devel
|
||||
yum install -y libmcrypt
|
||||
yum install -y libmcrypt-devel
|
||||
yum install -y mysql-devel
|
||||
yum install -y expect
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ else
|
||||
fi
|
||||
|
||||
apt-get update -y
|
||||
apt install -y wget curl lsof unzip tar cron expect locate
|
||||
apt install -y wget curl lsof unzip tar cron expect locate lrzsz
|
||||
apt install -y python3-pip python3-dev python3-venv
|
||||
|
||||
|
||||
@@ -141,6 +141,7 @@ apt install -y devscripts
|
||||
apt install -y net-tools
|
||||
apt install -y autoconf
|
||||
apt install -y gcc
|
||||
apt install -y patchelf
|
||||
|
||||
apt install -y libffi-dev
|
||||
apt install -y cmake automake make
|
||||
@@ -188,7 +189,12 @@ fi
|
||||
#https://blog.csdn.net/qq_36228377/article/details/123154344
|
||||
# ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
|
||||
if [ ! -d /usr/include/curl ];then
|
||||
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
|
||||
SYS_ARCH=`arch`
|
||||
if [ -f /usr/include/x86_64-linux-gnu/curl ];then
|
||||
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
|
||||
else
|
||||
ln -s /usr/include/${SYS_ARCH}-linux-gnu/curl /usr/include/curl
|
||||
fi
|
||||
fi
|
||||
|
||||
apt install -y graphviz bison re2c flex libsqlite3-dev libonig-dev perl g++ libtool libxslt1-dev
|
||||
|
||||
@@ -68,7 +68,7 @@ yum install -y epel-release
|
||||
|
||||
yum install -y libevent libevent-devel zip libmcrypt libmcrypt-devel
|
||||
yum install -y gcc libffi-devel python-devel openssl-devel
|
||||
yum install -y curl-devel libmcrypt libmcrypt-devel python3-devel
|
||||
yum install -y libmcrypt libmcrypt-devel python3-devel
|
||||
|
||||
yum install -y wget python-devel python-imaging libicu-devel unzip bzip2-devel gcc libxml2 libxml2-devel libjpeg-devel libpng-devel libwebp libwebp-devel pcre pcre-devel crontabs
|
||||
yum install -y net-tools
|
||||
|
||||
+48
-11
@@ -2,6 +2,7 @@
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
export LANG=en_US.UTF-8
|
||||
SYS_ARCH=`arch`
|
||||
|
||||
if [ ! -f /usr/bin/applydeltarpm ];then
|
||||
yum -y provides '*/applydeltarpm'
|
||||
@@ -28,6 +29,16 @@ if [ $VERSION_ID -ge 8 ];then
|
||||
PKGMGR='dnf'
|
||||
fi
|
||||
|
||||
echo "install remi source"
|
||||
if [ "$VERSION_ID" == "9" ];then
|
||||
echo "install remi start"
|
||||
if [ ! -f /etc/yum.repos.d/remi.repo ];then
|
||||
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-9.rpm
|
||||
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
|
||||
fi
|
||||
echo "install remi end"
|
||||
fi
|
||||
|
||||
#https need
|
||||
if [ ! -d /root/.acme.sh ];then
|
||||
curl https://get.acme.sh | sh
|
||||
@@ -77,16 +88,28 @@ echo "SSH PORT:${SSH_PORT}"
|
||||
# fi
|
||||
# echo "iptables wrap start"
|
||||
|
||||
|
||||
echo "firewall open common port start"
|
||||
if [ ! -f /usr/sbin/firewalld ];then
|
||||
$PKGMGR install firewalld -y
|
||||
systemctl enable firewalld
|
||||
#取消服务锁定
|
||||
systemctl unmask firewalld
|
||||
systemctl start firewalld
|
||||
|
||||
|
||||
sed -i 's#AllowZoneDrifting=yes#AllowZoneDrifting=no#g' /etc/firewalld/firewalld.conf
|
||||
firewall-cmd --reload
|
||||
|
||||
#安装就开启
|
||||
systemctl restart firewalld
|
||||
fi
|
||||
|
||||
if [ -f /usr/sbin/firewalld ];then
|
||||
# look
|
||||
# firewall-cmd --list-all
|
||||
|
||||
# systemctl status firewalld
|
||||
# firewall-cmd --zone=public --remove-port=80/tcp --permanent
|
||||
|
||||
if [ "$SSH_PORT" != "" ];then
|
||||
firewall-cmd --permanent --zone=public --add-port=${SSH_PORT}/tcp
|
||||
else
|
||||
@@ -99,12 +122,10 @@ if [ ! -f /usr/sbin/firewalld ];then
|
||||
# firewall-cmd --permanent --zone=public --add-port=3306/tcp
|
||||
# firewall-cmd --permanent --zone=public --add-port=30000-40000/tcp
|
||||
|
||||
sed -i 's#AllowZoneDrifting=yes#AllowZoneDrifting=no#g' /etc/firewalld/firewalld.conf
|
||||
firewall-cmd --reload
|
||||
|
||||
#安装时不开启
|
||||
systemctl stop firewalld
|
||||
|
||||
fi
|
||||
echo "firewall open common port end"
|
||||
|
||||
$PKGMGR install -y epel-release
|
||||
if [ ! -z "$cn" ];then
|
||||
@@ -119,11 +140,25 @@ $PKGMGR groupinstall -y "Development Tools"
|
||||
|
||||
if [ $VERSION_ID -ge 8 ];then
|
||||
# EL8 及以上
|
||||
if [ $VERSION_ID -ge 9 ];then
|
||||
REPOS='--enablerepo=appstream,baseos,epel,extras,crb'
|
||||
else
|
||||
REPOS='--enablerepo=appstream,baseos,epel,extras,powertools'
|
||||
fi
|
||||
|
||||
# find repo
|
||||
|
||||
REPO_LIST=(remi appstream baseos epel extras crb powertools)
|
||||
REPOS='--enablerepo='
|
||||
for REPO_VAR in ${REPO_LIST[@]}
|
||||
do
|
||||
if [ -f /etc/yum.repos.d/${REPO_VAR}.repo ];then
|
||||
REPOS="${REPOS},${REPO_VAR}"
|
||||
fi
|
||||
done
|
||||
REPOS=${REPOS//=,/=}
|
||||
echo "REPOS:${REPOS}"
|
||||
|
||||
# if [ $VERSION_ID -ge 9 ];then
|
||||
# REPOS='--enablerepo=remi,appstream,baseos,epel,extras,crb'
|
||||
# else
|
||||
# REPOS='--enablerepo=remi,appstream,baseos,epel,extras,powertools'
|
||||
# fi
|
||||
|
||||
for rpms in gcc gcc-c++ lsof autoconf bzip2 bzip2-devel c-ares-devel \
|
||||
ca-certificates cairo-devel cmake crontabs curl curl-devel diffutils e2fsprogs e2fsprogs-devel \
|
||||
@@ -133,8 +168,10 @@ if [ $VERSION_ID -ge 8 ];then
|
||||
libpng libpng-devel libstdc++.so.6 libtirpc libtirpc-devel libtool libtool-libs libwebp libwebp-devel \
|
||||
libxml2 libxml2-devel libxslt libxslt-devel libarchive make mysql-devel ncurses ncurses-devel net-tools \
|
||||
oniguruma oniguruma-devel patch pcre pcre-devel perl perl-Data-Dumper perl-devel procps psmisc python3-devel \
|
||||
openssl openssl-devel \
|
||||
readline-devel rpcgen sqlite-devel tar unzip vim-minimal wget zip zlib zlib-devel ;
|
||||
do
|
||||
# dnf --enablerepo=remi,appstream,baseos,epel,extras,powertools install -y oniguruma5php-devel
|
||||
dnf $REPOS install -y $rpms;
|
||||
if [ "$?" != "0" ];then
|
||||
dnf install -y $rpms;
|
||||
|
||||
@@ -75,6 +75,7 @@ apt install -y net-tools
|
||||
apt install -y python3-dev
|
||||
apt install -y autoconf
|
||||
apt install -y gcc
|
||||
apt install -y lrzsz
|
||||
|
||||
apt install -y libffi-dev
|
||||
apt install -y cmake automake make
|
||||
@@ -108,11 +109,17 @@ apt install -y libicu-dev
|
||||
apt install -y build-essential
|
||||
|
||||
apt install -y libcurl4-openssl-dev
|
||||
apt install -y libcurl4-nss-dev
|
||||
apt install -y curl libcurl4-gnutls-dev
|
||||
#https://blog.csdn.net/qq_36228377/article/details/123154344
|
||||
# ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
|
||||
if [ ! -d /usr/include/curl ];then
|
||||
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
|
||||
SYS_ARCH=`arch`
|
||||
if [ -f /usr/include/x86_64-linux-gnu/curl ];then
|
||||
ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl
|
||||
else
|
||||
ln -s /usr/include/${SYS_ARCH}-linux-gnu/curl /usr/include/curl
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
+21
-18
@@ -32,27 +32,27 @@ elif grep -Eq "openSUSE" /etc/*-release; then
|
||||
zypper refresh
|
||||
elif grep -Eq "FreeBSD" /etc/*-release; then
|
||||
OSNAME='freebsd'
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eqi "CentOS" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
|
||||
OSNAME='fedora'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eq "Rocky" /etc/*-release; then
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eqi "Fedora" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eq "AlmaLinux" /etc/*-release; then
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eqi "Rocky" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eq "Amazon Linux" /etc/*-release; then
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eqi "AlmaLinux" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eqi "Amazon Linux" /etc/*-release; then
|
||||
OSNAME='amazon'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eqi "Debian" /etc/*-release; then
|
||||
OSNAME='debian'
|
||||
apt update -y
|
||||
apt install -y devscripts
|
||||
apt install -y wget zip unzip
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eqi "Ubuntu" /etc/*-release; then
|
||||
OSNAME='ubuntu'
|
||||
apt install -y wget zip unzip
|
||||
else
|
||||
@@ -60,19 +60,23 @@ else
|
||||
fi
|
||||
|
||||
|
||||
# HTTP_PREFIX="https://"
|
||||
# LOCAL_ADDR=common
|
||||
# ping -c 1 github.com > /dev/null 2>&1
|
||||
# if [ "$?" != "0" ];then
|
||||
# LOCAL_ADDR=cn
|
||||
# HTTP_PREFIX="https://ghproxy.com/"
|
||||
# fi
|
||||
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
HTTP_PREFIX="https://"
|
||||
LOCAL_ADDR=common
|
||||
ping -c 1 github.com > /dev/null 2>&1
|
||||
if [ "$?" != "0" ];then
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
fi
|
||||
|
||||
# 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
|
||||
echo "local:${LOCAL_ADDR}"
|
||||
|
||||
if [ $OSNAME != "macos" ];then
|
||||
mkdir -p /www/server
|
||||
@@ -106,7 +110,6 @@ if [ $OSNAME != "macos" ];then
|
||||
tar xvzf /tmp/acme.tar.gz -C /tmp
|
||||
cd /tmp/acme.sh-master
|
||||
bash acme.sh install
|
||||
cd -
|
||||
fi
|
||||
|
||||
if [ ! -d /root/.acme.sh ];then
|
||||
|
||||
+44
-20
@@ -1,6 +1,15 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; }
|
||||
function version_le() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"; }
|
||||
function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }
|
||||
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }
|
||||
|
||||
P_VER=`python3 -V | awk '{print $2}'`
|
||||
echo "python:$P_VER"
|
||||
sleep 1
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
@@ -48,15 +57,20 @@ else
|
||||
fi
|
||||
|
||||
|
||||
# HTTP_PREFIX="https://"
|
||||
# LOCAL_ADDR=common
|
||||
# ping -c 1 github.com > /dev/null 2>&1
|
||||
# if [ "$?" != "0" ];then
|
||||
# LOCAL_ADDR=cn
|
||||
# HTTP_PREFIX="https://ghproxy.com/"
|
||||
# fi
|
||||
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
HTTP_PREFIX="https://"
|
||||
LOCAL_ADDR=common
|
||||
ping -c 1 ipinfo.io > /dev/null 2>&1
|
||||
if [ "$?" == "0" ];then
|
||||
CN=$(curl -fsSL -m 10 http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
if [ ! -z "$CN" ];then
|
||||
LOCAL_ADDR=cn
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
fi
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
fi
|
||||
|
||||
PIPSRC="https://pypi.python.org/simple"
|
||||
@@ -64,32 +78,42 @@ if [ "$LOCAL_ADDR" != "common" ];then
|
||||
PIPSRC="https://pypi.tuna.tsinghua.edu.cn/simple"
|
||||
fi
|
||||
|
||||
echo "local:${LOCAL_ADDR}"
|
||||
echo "pypi source:$PIPSRC"
|
||||
|
||||
#面板需要的库
|
||||
if [ ! -f /usr/local/bin/pip3 ] && [ ! -f /usr/bin/pip3 ];then
|
||||
python3 -m pip install --upgrade pip setuptools wheel -i $PIPSRC
|
||||
|
||||
which pip3 && pip3 install --upgrade pip -i $PIPSRC
|
||||
pip3 install --upgrade pip setuptools wheel -i $PIPSRC
|
||||
fi
|
||||
|
||||
which pip && pip install --upgrade pip -i $PIPSRC
|
||||
pip3 install --upgrade pip setuptools wheel -i $PIPSRC
|
||||
|
||||
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/requirements.txt -i $PIPSRC
|
||||
|
||||
# pip3 install flask-caching==1.10.1
|
||||
# pip3 install mysqlclient
|
||||
|
||||
if [ ! -f /www/server/mdserver-web/bin/activate ];then
|
||||
cd /www/server/mdserver-web && python3 -m venv .
|
||||
if version_ge "$P_VER" "3.11.0" ;then
|
||||
cd /www/server/mdserver-web && python3 -m venv /www/server/mdserver-web
|
||||
else
|
||||
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/requirements.txt -i $PIPSRC
|
||||
cd /www/server/mdserver-web && python3 -m venv .
|
||||
fi
|
||||
cd /www/server/mdserver-web && source /www/server/mdserver-web/bin/activate
|
||||
else
|
||||
cd /www/server/mdserver-web && source /www/server/mdserver-web/bin/activate
|
||||
fi
|
||||
|
||||
pip install --upgrade pip -i $PIPSRC
|
||||
pip3 install --upgrade pip -i $PIPSRC
|
||||
pip3 install --upgrade setuptools -i $PIPSRC
|
||||
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/requirements.txt -i $PIPSRC
|
||||
|
||||
echo "lib ok!"
|
||||
# pip3 install flask-caching==1.10.1
|
||||
# pip3 install mysqlclient
|
||||
|
||||
# Different versions use different python lib
|
||||
P_VER_D=`echo "$P_VER"|awk -F '.' '{print $1}'`
|
||||
P_VER_M=`echo "$P_VER"|awk -F '.' '{print $2}'`
|
||||
NEW_P_VER=${P_VER_D}.${P_VER_M}
|
||||
|
||||
if [ -f /www/server/mdserver-web/version/r${NEW_P_VER}.txt ];then
|
||||
echo "cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/version/r${NEW_P_VER}.txt"
|
||||
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/version/r${NEW_P_VER}.txt -i $PIPSRC
|
||||
fi
|
||||
|
||||
echo "lib ok!"
|
||||
+14
-14
@@ -22,33 +22,33 @@ fi
|
||||
|
||||
if [ ${_os} == "Darwin" ]; then
|
||||
OSNAME='macos'
|
||||
elif grep -Eq "openSUSE" /etc/*-release; then
|
||||
elif grep -Eqi "openSUSE" /etc/*-release; then
|
||||
OSNAME='opensuse'
|
||||
zypper refresh
|
||||
elif grep -Eq "FreeBSD" /etc/*-release; then
|
||||
elif grep -Eqi "FreeBSD" /etc/*-release; then
|
||||
OSNAME='freebsd'
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
|
||||
OSNAME='centos'
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eqi "CentOS" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
|
||||
OSNAME='fedora'
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eqi "Fedora" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eq "Rocky" /etc/*-release; then
|
||||
OSNAME='rocky'
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eqi "Rocky" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eq "AlmaLinux" /etc/*-release; then
|
||||
OSNAME='alma'
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eqi "AlmaLinux" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eq "Amazon Linux" /etc/*-release; then
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eqi "Amazon Linux" /etc/*-release; then
|
||||
OSNAME='amazon'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eqi "Debian" /etc/*-release; then
|
||||
OSNAME='debian'
|
||||
apt install -y wget zip unzip
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eqi "Ubuntu" /etc/*-release; then
|
||||
OSNAME='ubuntu'
|
||||
apt install -y wget zip unzip
|
||||
elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
|
||||
elif grep -Eqi "Raspbian" /etc/issue || grep -Eqi "Raspbian" /etc/*-release; then
|
||||
OSNAME='raspbian'
|
||||
else
|
||||
OSNAME='unknow'
|
||||
|
||||
+26
-18
@@ -22,47 +22,55 @@ fi
|
||||
|
||||
if [ ${_os} == "Darwin" ]; then
|
||||
OSNAME='macos'
|
||||
elif grep -Eq "openSUSE" /etc/*-release; then
|
||||
elif grep -Eqi "openSUSE" /etc/*-release; then
|
||||
OSNAME='opensuse'
|
||||
zypper refresh
|
||||
elif grep -Eq "FreeBSD" /etc/*-release; then
|
||||
elif grep -Eqi "FreeBSD" /etc/*-release; then
|
||||
OSNAME='freebsd'
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
|
||||
elif grep -Eqi "CentOS" /etc/issue || grep -Eqi "CentOS" /etc/*-release; then
|
||||
OSNAME='centos'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
|
||||
OSNAME='fedora'
|
||||
elif grep -Eqi "Fedora" /etc/issue || grep -Eqi "Fedora" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eq "Rocky" /etc/*-release; then
|
||||
OSNAME='rocky'
|
||||
elif grep -Eqi "Rocky" /etc/issue || grep -Eqi "Rocky" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eq "AlmaLinux" /etc/*-release; then
|
||||
OSNAME='alma'
|
||||
elif grep -Eqi "AlmaLinux" /etc/issue || grep -Eqi "AlmaLinux" /etc/*-release; then
|
||||
OSNAME='rhel'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eq "Amazon Linux" /etc/*-release; then
|
||||
elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eqi "Amazon Linux" /etc/*-release; then
|
||||
OSNAME='amazon'
|
||||
yum install -y wget zip unzip
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
|
||||
elif grep -Eqi "Debian" /etc/issue || grep -Eqi "Debian" /etc/*-release; then
|
||||
OSNAME='debian'
|
||||
apt install -y wget zip unzip
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
|
||||
elif grep -Eqi "Ubuntu" /etc/issue || grep -Eqi "Ubuntu" /etc/*-release; then
|
||||
OSNAME='ubuntu'
|
||||
apt install -y wget zip unzip
|
||||
elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
|
||||
elif grep -Eqi "Raspbian" /etc/issue || grep -Eqi "Raspbian" /etc/*-release; then
|
||||
OSNAME='raspbian'
|
||||
else
|
||||
OSNAME='unknow'
|
||||
fi
|
||||
|
||||
# cn=$(curl -fsSL -m 10 http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
# HTTP_PREFIX="https://"
|
||||
# LOCAL_ADDR=common
|
||||
# ping -c 1 github.com > /dev/null 2>&1
|
||||
# if [ "$?" != "0" ];then
|
||||
# LOCAL_ADDR=cn
|
||||
# HTTP_PREFIX="https://ghproxy.com/"
|
||||
# fi
|
||||
|
||||
cn=$(curl -fsSL -m 10 -s http://ipinfo.io/json | grep "\"country\": \"CN\"")
|
||||
HTTP_PREFIX="https://"
|
||||
LOCAL_ADDR=common
|
||||
ping -c 1 github.com > /dev/null 2>&1
|
||||
if [ "$?" != "0" ];then
|
||||
if [ ! -z "$cn" ];then
|
||||
LOCAL_ADDR=cn
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
HTTP_PREFIX="https://ghproxy.com/"
|
||||
fi
|
||||
|
||||
|
||||
CP_CMD=/usr/bin/cp
|
||||
if [ -f /bin/cp ];then
|
||||
CP_CMD=/bin/cp
|
||||
@@ -78,7 +86,7 @@ if [ "$LOCAL_ADDR" != "common" ];then
|
||||
rm -rf /tmp/master.zip
|
||||
rm -rf /tmp/mdserver-web
|
||||
else
|
||||
curl --insecure -sSLo /tmp/dev.zip https://github.com/midoks/mdserver-web/archive/refs/heads/dev.zip
|
||||
curl --insecure -sSLo /tmp/dev.zip ${HTTP_PREFIX}github.com/midoks/mdserver-web/archive/refs/heads/dev.zip
|
||||
cd /tmp && unzip /tmp/dev.zip
|
||||
$CP_CMD -rf /tmp/mdserver-web-dev/* /www/server/mdserver-web
|
||||
rm -rf /tmp/dev.zip
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
cryptography==36.0.1
|
||||
flask==2.0.3
|
||||
pyOpenSSL==22.0.0
|
||||
requests==2.27.1
|
||||
Reference in New Issue
Block a user