mirror of
https://github.com/midoks/mdserver-web.git
synced 2026-10-10 04:19:26 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63e427b488 | ||
|
|
c688c692f9 | ||
|
|
c9f074b319 | ||
|
|
38b4042c5a | ||
|
|
bf32390f0e | ||
|
|
91a9be4cc0 | ||
|
|
be5f438f84 | ||
|
|
2705fd7ba2 | ||
|
|
4de7e72f0a | ||
|
|
da668c723c | ||
|
|
20624217bf | ||
|
|
2403af08c6 | ||
|
|
2350b73896 | ||
|
|
464fa9cc0f | ||
|
|
9a79f0b728 | ||
|
|
52cfff7038 | ||
|
|
8d42f8137c | ||
|
|
41fb9759a3 | ||
|
|
7d3833b2ef | ||
|
|
0badb053e0 | ||
|
|
80b9e7cbf7 | ||
|
|
94df21192f | ||
|
|
346d687368 | ||
|
|
46ec655365 | ||
|
|
e852020c38 | ||
|
|
d06e83676b | ||
|
|
7a511f8217 | ||
|
|
8c5021b9dc | ||
|
|
b7d50540ac | ||
|
|
2a95fcc59a | ||
|
|
2b04cb3947 | ||
|
|
7f0ad25342 | ||
|
|
09f7e6f5b5 | ||
|
|
17a7ffa0b4 | ||
|
|
ba6dcabd04 | ||
|
|
0ff5c170d3 | ||
|
|
b78e020993 | ||
|
|
9586eeda07 | ||
|
|
ea462aa51d | ||
|
|
aaac8b5239 | ||
|
|
2b86c375b0 | ||
|
|
600e2688f9 | ||
|
|
3537bc520f | ||
|
|
9ffdffadd6 | ||
|
|
3942f2fbf5 | ||
|
|
8ff2f217b3 | ||
|
|
480bd154c6 | ||
|
|
5eb3ed4524 | ||
|
|
50e78ae6f6 | ||
|
|
0ec9b31c2f | ||
|
|
191b54821e | ||
|
|
c2188a2c7e | ||
|
|
d23b64a92c | ||
|
|
3ae97e1c75 | ||
|
|
f0e7361436 | ||
|
|
5f85d41352 | ||
|
|
6fc8803446 | ||
|
|
b3120f3435 | ||
|
|
f9f1b1a113 | ||
|
|
2645297cee | ||
|
|
7f171f5986 | ||
|
|
c3b3e3b01c | ||
|
|
3824b394ad | ||
|
|
270660fb53 | ||
|
|
c4171a9506 | ||
|
|
222943e312 | ||
|
|
92f8a4e949 | ||
|
|
eff1f55a21 | ||
|
|
0b54da9747 | ||
|
|
0bec57937f | ||
|
|
6c64f8ee5e | ||
|
|
b65ad9de80 | ||
|
|
07be263d81 | ||
|
|
bf9cb52fec | ||
|
|
f7135a6ded | ||
|
|
7b98dde1aa | ||
|
|
b51f3fdd68 | ||
|
|
e02c52df49 | ||
|
|
730bc7171b | ||
|
|
c065eabb48 | ||
|
|
1ad1e3326d | ||
|
|
d4346a51bc | ||
|
|
8260cc5f4a | ||
|
|
021b299b7d | ||
|
|
a767e7e578 | ||
|
|
57da2aef27 | ||
|
|
5b43438cb1 | ||
|
|
7ab88a1bea | ||
|
|
31291a13c7 | ||
|
|
43d0b75d98 | ||
|
|
5490197b8a | ||
|
|
8f03574bce | ||
|
|
94487e0b3d | ||
|
|
45cc0159af | ||
|
|
504a618eb1 | ||
|
|
5e25849464 | ||
|
|
9bb59a1559 | ||
|
|
6883316efc | ||
|
|
de7ea503e5 | ||
|
|
4fcad95c79 | ||
|
|
75dc1bd70d | ||
|
|
44758e3e55 | ||
|
|
140624e62f | ||
|
|
65f90b473c | ||
|
|
0a089fcedf | ||
|
|
010624023f | ||
|
|
9399a14a92 | ||
|
|
2875b40e62 | ||
|
|
78c3686091 | ||
|
|
d7447197ec | ||
|
|
9b64ec5c6d | ||
|
|
dad51dad77 | ||
|
|
d89751f733 | ||
|
|
1dc486711b | ||
|
|
60a2f85f02 | ||
|
|
830d387ddb | ||
|
|
ae225780f9 | ||
|
|
e0a0a82d68 | ||
|
|
0b23c5f330 | ||
|
|
fb01c68f5a | ||
|
|
5755121fa5 | ||
|
|
3d1c613864 | ||
|
|
9590c4bb7d | ||
|
|
32c0bdf093 | ||
|
|
4f5424a746 | ||
|
|
81ba3bce9d | ||
|
|
22b3a1bc42 | ||
|
|
df9a34aa31 | ||
|
|
2400213533 | ||
|
|
465eb118a9 | ||
|
|
7e81aa109f | ||
|
|
b23b41c7a7 | ||
|
|
724a77ae81 | ||
|
|
3499ed74ee | ||
|
|
52997049e2 | ||
|
|
a96a36b087 | ||
|
|
5926f688a6 | ||
|
|
1b754f5c43 | ||
|
|
c4c20de520 | ||
|
|
616895785f | ||
|
|
29d6c8740a | ||
|
|
64aa9a9d01 | ||
|
|
ffbe8ba6d4 | ||
|
|
ed39c5d243 | ||
|
|
4bb2115040 | ||
|
|
6b0cf8129d | ||
|
|
ab7bbe942b | ||
|
|
a8a3fa1754 | ||
|
|
e343f33b47 | ||
|
|
f55367ab5e | ||
|
|
050bd158c1 | ||
|
|
d35a680fec | ||
|
|
4a4ddeaabe | ||
|
|
0e74b0cccf | ||
|
|
806e29577e | ||
|
|
75923f5363 | ||
|
|
834196883c | ||
|
|
341826c641 | ||
|
|
1bd1ce5b31 | ||
|
|
eef504e172 | ||
|
|
a0434ef7d6 | ||
|
|
893bbb8ea7 | ||
|
|
92e3e277cc | ||
|
|
58e48bf013 | ||
|
|
644760d5b0 | ||
|
|
d6ccd81def | ||
|
|
d32e71b2d9 | ||
|
|
ae9e56c56c | ||
|
|
d7c0285bbf | ||
|
|
5cc0957ffd | ||
|
|
1e44d64ace | ||
|
|
907851c413 | ||
|
|
0faafc654b | ||
|
|
4cdc399b77 | ||
|
|
a085e5b1ea | ||
|
|
bdbf4dddc6 | ||
|
|
5cee2f2b6d | ||
|
|
b9652a7940 | ||
|
|
dc7ddbcf6b | ||
|
|
87a8bfe59e | ||
|
|
cfdd5e5f73 | ||
|
|
e2acf621ca | ||
|
|
0711a922d2 | ||
|
|
055ea0ca0c | ||
|
|
772d9c50f6 | ||
|
|
0809b51725 | ||
|
|
4e901e6750 | ||
|
|
5c62397234 | ||
|
|
63021a3eab | ||
|
|
e617b07790 | ||
|
|
960eeed4ce | ||
|
|
ccf020bf6b | ||
|
|
c4918d8cd7 | ||
|
|
b3d3ceb058 | ||
|
|
17a301c745 | ||
|
|
1bfa2ae3ab | ||
|
|
9be5dcfd8a | ||
|
|
d9e8f1d4ad | ||
|
|
d85f544773 | ||
|
|
577ac1f8ee | ||
|
|
ed117a1b40 | ||
|
|
9d54f0b6cd | ||
|
|
707eced7bf | ||
|
|
dd96833c09 | ||
|
|
4c61143918 | ||
|
|
8cb8a1bc70 | ||
|
|
c55c3c23d1 | ||
|
|
04e6b9367a | ||
|
|
f4f25b8ab3 | ||
|
|
a0b0b9b294 | ||
|
|
699ad0b8ca | ||
|
|
a45eaf1c3b | ||
|
|
0f51a6d481 | ||
|
|
142d5f7ed8 | ||
|
|
72bd528a24 | ||
|
|
af2dc0585b | ||
|
|
0a0021b09d | ||
|
|
c5811d4494 | ||
|
|
e329892cd2 | ||
|
|
368324a813 | ||
|
|
6a7cc4f054 | ||
|
|
1d3cba599c | ||
|
|
7d902a50eb | ||
|
|
25feb7c0ad | ||
|
|
e15d1716e5 | ||
|
|
ee16e0142e | ||
|
|
68e06aa8f5 | ||
|
|
d88003ca52 | ||
|
|
8757c646f6 | ||
|
|
c3e9d8aa4c | ||
|
|
7e3983f612 | ||
|
|
a4e43b492d | ||
|
|
1f57517ea7 | ||
|
|
b2fe35771d | ||
|
|
00ce3e00d3 | ||
|
|
c7c28731a4 | ||
|
|
3305eab770 | ||
|
|
b595359f38 | ||
|
|
5dc06b90ca | ||
|
|
651fa7672c | ||
|
|
7a0db5abef | ||
|
|
d21a5dfacc | ||
|
|
0c49749b63 | ||
|
|
11bb65a739 | ||
|
|
ce44353cbf | ||
|
|
2e5c5ef5b9 | ||
|
|
d1b687476b | ||
|
|
a46eabce10 | ||
|
|
08e378a3e4 | ||
|
|
c80ce63a4b | ||
|
|
72bb94df42 | ||
|
|
e9b7aca47a | ||
|
|
f25d4f5a4f | ||
|
|
59fcef76fe | ||
|
|
4ab6ccbcbb | ||
|
|
fd457df3c8 | ||
|
|
147bec02a5 | ||
|
|
34c126fbb7 | ||
|
|
4d21c920a8 | ||
|
|
2d810fe7ab | ||
|
|
fb5260b9a5 | ||
|
|
32b5542534 | ||
|
|
c665486122 | ||
|
|
d3b885b1f9 | ||
|
|
e476e36420 | ||
|
|
587503dc67 | ||
|
|
cecfe9470f | ||
|
|
abc37acacc | ||
|
|
e0197fef3a | ||
|
|
04c4e7ddc8 | ||
|
|
6fb3e29a91 | ||
|
|
66fe66b479 | ||
|
|
4329d2470c | ||
|
|
0cd4527234 | ||
|
|
bdba9149f2 | ||
|
|
e05f7a9c3f | ||
|
|
bddd81c94d | ||
|
|
f470392382 | ||
|
|
895a250f06 | ||
|
|
dd579b7e5c | ||
|
|
cd0653d092 | ||
|
|
f2bc938ade | ||
|
|
dc694cae35 | ||
|
|
0b98e40fec | ||
|
|
10c40800ff | ||
|
|
424d9fa799 | ||
|
|
1350fc7a4a | ||
|
|
d678ade262 | ||
|
|
0b0b0bc9c5 | ||
|
|
f3eee40e1e | ||
|
|
8e0327a084 | ||
|
|
0a4b5529b9 | ||
|
|
a8c17e1f3c | ||
|
|
4d242dd322 | ||
|
|
272a08f4eb | ||
|
|
453009da40 | ||
|
|
9c8880e1bb | ||
|
|
4f716830ef | ||
|
|
b4d799f8bd | ||
|
|
e9fc7d5344 | ||
|
|
585d3d1839 | ||
|
|
3278dd23b5 | ||
|
|
5b406eaeb1 | ||
|
|
0a354f649d | ||
|
|
176dd4a5b8 | ||
|
|
4bb9cc2d67 | ||
|
|
f1edb26540 | ||
|
|
0692537cbd | ||
|
|
0710ca590a | ||
|
|
c19b12e8df | ||
|
|
99eeee19ef | ||
|
|
fff3707031 | ||
|
|
0d0cb4add1 | ||
|
|
5ed37443da | ||
|
|
25b836e6f5 | ||
|
|
4ca5c8e1a8 | ||
|
|
b522287a87 | ||
|
|
05cec7e0bf | ||
|
|
b731868e06 | ||
|
|
9c4ceca41f | ||
|
|
22d266e710 | ||
|
|
d35bf118ff | ||
|
|
1adb2f751c | ||
|
|
54e743037e | ||
|
|
6debb93fd1 | ||
|
|
7229f9c569 | ||
|
|
844dcbda00 | ||
|
|
af2b45a6f4 | ||
|
|
d848d41a71 | ||
|
|
826ebfb2e5 | ||
|
|
e1807c1585 | ||
|
|
6e9d5a19c0 | ||
|
|
6eadad5db4 | ||
|
|
2b2fc08120 | ||
|
|
175061884d | ||
|
|
cc3fa8ac95 | ||
|
|
c9d736e338 | ||
|
|
e4437e42f3 | ||
|
|
644fc2c81f | ||
|
|
d2314bf26f |
+2
-2
@@ -177,5 +177,5 @@ debug.out
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
mdioks.session-journal
|
mdioks.session-journal
|
||||||
*.session
|
*.session
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ PHP[72-82]支持phpMyAdmin[5.2.0]
|
|||||||
# 特别赞助
|
# 特别赞助
|
||||||
|
|
||||||
- [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan.pw/)
|
- [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan.pw/)
|
||||||
|
- [鲲鹏vpn,免费试用,解锁流媒体和chatGPT](https://down.xbjc888.top/?agent_code=github)
|
||||||
|
|
||||||
# AD - VPS推荐 - 🙏
|
# AD - VPS推荐 - 🙏
|
||||||
|
|
||||||
@@ -99,15 +100,20 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443:
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### 版本更新 0.15.2
|
### 版本更新 0.16.0
|
||||||
|
|
||||||
* OpenResty升级到1.21.4.2
|
yum install -y libargon2-devel
|
||||||
* 计划任务自动脚本运行时间
|
apt install -y libargon2-dev
|
||||||
* rsyncd添加优化
|
|
||||||
* 使用mariadb二进制导入备份文件
|
OP防火墙 - 重载即可
|
||||||
* docker插件-镜像导入导出功能
|
|
||||||
* 网站设置反向代理升级功能
|
* 增加PHP83。
|
||||||
* 优化初始化安装SSH端口识别
|
* 面板日志单独为一页并加入日志审计功能。
|
||||||
|
* 修复webssh服务器读取问题。
|
||||||
|
* 站点批量删除修复。
|
||||||
|
* OP防火墙-修复`自动强制验证`关闭不生效。
|
||||||
|
* 新增OneDrive备份插件。
|
||||||
|
* FTP备份优化。
|
||||||
|
|
||||||
### JSDelivr安装地址
|
### JSDelivr安装地址
|
||||||
|
|
||||||
@@ -166,6 +172,8 @@ curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev
|
|||||||
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install_dev.sh | bash
|
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install_dev.sh | bash
|
||||||
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/update_dev.sh | bash
|
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/update_dev.sh | bash
|
||||||
|
|
||||||
|
wget --no-check-certificate -O install.sh https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install.sh && bash install.sh
|
||||||
|
|
||||||
wget --no-check-certificate -O uninstall.sh https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/uninstall.sh && bash uninstall.sh
|
wget --no-check-certificate -O uninstall.sh https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/uninstall.sh && bash uninstall.sh
|
||||||
|
|
||||||
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/debug.sh | bash
|
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/debug.sh | bash
|
||||||
|
|||||||
+12
-8
@@ -1496,8 +1496,9 @@ fullchain.pem 粘贴到证书输入框
|
|||||||
'cert_timeout'] = int(time.time())
|
'cert_timeout'] = int(time.time())
|
||||||
|
|
||||||
if self.__config['orders'][i]['cert_timeout'] > start_time:
|
if self.__config['orders'][i]['cert_timeout'] > start_time:
|
||||||
writeLog(
|
msg = "|-本次跳过域名: {},未过期!".format(
|
||||||
"|-本次跳过域名: {},未过期!".format(self.__config['orders'][i]['domains'][0]))
|
self.__config['orders'][i]['domains'][0])
|
||||||
|
writeLog(msg)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 已删除的网站直接跳过续签
|
# 已删除的网站直接跳过续签
|
||||||
@@ -1514,8 +1515,9 @@ fullchain.pem 粘贴到证书输入框
|
|||||||
break
|
break
|
||||||
if not mw.M('domain').where("name=?", (domain,)).count() and not mw.M('binding').where("domain=?", domain).count():
|
if not mw.M('domain').where("name=?", (domain,)).count() and not mw.M('binding').where("domain=?", domain).count():
|
||||||
auth_to = None
|
auth_to = None
|
||||||
writeLog(
|
msg = "|-跳过被删除的域名: {}".format(
|
||||||
"|-跳过被删除的域名: {}".format(self.__config['orders'][i]['domains']))
|
self.__config['orders'][i]['domains'])
|
||||||
|
writeLog(msg)
|
||||||
if not auth_to:
|
if not auth_to:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -1526,15 +1528,17 @@ fullchain.pem 粘贴到证书输入框
|
|||||||
timeout = self.__config['orders'][i][
|
timeout = self.__config['orders'][i][
|
||||||
'next_retry_time'] - int(time.time())
|
'next_retry_time'] - int(time.time())
|
||||||
if timeout > 0:
|
if timeout > 0:
|
||||||
writeLog('|-本次跳过域名:{},因第上次续签失败,还需要等待{}小时后再重试'.format(
|
msg = '|-本次跳过域名:{},因第上次续签失败,还需要等待{}小时后再重试'.format(
|
||||||
self.__config['orders'][i]['domains'], int(timeout / 60 / 60)))
|
self.__config['orders'][i]['domains'], int(timeout / 60 / 60))
|
||||||
|
writeLog(msg)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 是否到了最大重试次数
|
# 是否到了最大重试次数
|
||||||
if 'retry_count' in self.__config['orders'][i]:
|
if 'retry_count' in self.__config['orders'][i]:
|
||||||
if self.__config['orders'][i]['retry_count'] >= 5:
|
if self.__config['orders'][i]['retry_count'] >= 5:
|
||||||
writeLog('|-本次跳过域名:{},因连续5次续签失败,不再续签此证书(可尝试手动续签此证书,成功后错误次数将被重置)'.format(
|
msg = '|-本次跳过域名:{},因连续5次续签失败,不再续签此证书(可尝试手动续签此证书,成功后错误次数将被重置)'.format(
|
||||||
self.__config['orders'][i]['domains']))
|
self.__config['orders'][i]['domains'])
|
||||||
|
writeLog(msg)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 加入到续签订单
|
# 加入到续签订单
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ from flask import request
|
|||||||
|
|
||||||
class config_api:
|
class config_api:
|
||||||
|
|
||||||
__version = '0.15.3'
|
__version = '0.16.0'
|
||||||
__api_addr = 'data/api.json'
|
__api_addr = 'data/api.json'
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
@@ -602,20 +602,22 @@ echo "--------------------------------------------------------------------------
|
|||||||
|
|
||||||
# 将Shell脚本写到文件
|
# 将Shell脚本写到文件
|
||||||
def writeShell(self, config):
|
def writeShell(self, config):
|
||||||
u_file = '/var/spool/cron/crontabs/root'
|
file = '/var/spool/cron/crontabs/root'
|
||||||
if not os.path.exists(u_file):
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
|
file = '/etc/crontab'
|
||||||
|
elif current_os.startswith("freebsd"):
|
||||||
|
file = '/var/cron/tabs/root'
|
||||||
|
|
||||||
|
if not os.path.exists(file):
|
||||||
file = '/var/spool/cron/root'
|
file = '/var/spool/cron/root'
|
||||||
if mw.isAppleSystem():
|
|
||||||
file = '/etc/crontab'
|
|
||||||
else:
|
|
||||||
file = u_file
|
|
||||||
|
|
||||||
if not os.path.exists(file):
|
if not os.path.exists(file):
|
||||||
mw.writeFile(file, '')
|
mw.writeFile(file, '')
|
||||||
conf = mw.readFile(file)
|
conf = mw.readFile(file)
|
||||||
conf += str(config) + "\n"
|
conf += str(config) + "\n"
|
||||||
if mw.writeFile(file, conf):
|
if mw.writeFile(file, conf):
|
||||||
if not os.path.exists(u_file):
|
if not os.path.exists(file):
|
||||||
mw.execShell("chmod 600 '" + file +
|
mw.execShell("chmod 600 '" + file +
|
||||||
"' && chown root.root " + file)
|
"' && chown root.root " + file)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -64,8 +64,13 @@ class files_api:
|
|||||||
filename = request.args.get('filename', '')
|
filename = request.args.get('filename', '')
|
||||||
if not os.path.exists(filename):
|
if not os.path.exists(filename):
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
is_attachment = True
|
||||||
|
if filename.endswith(".svg"):
|
||||||
|
is_attachment = False
|
||||||
|
|
||||||
response = make_response(send_from_directory(
|
response = make_response(send_from_directory(
|
||||||
os.path.dirname(filename), os.path.basename(filename), as_attachment=True))
|
os.path.dirname(filename), os.path.basename(filename), as_attachment=is_attachment))
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def zipApi(self):
|
def zipApi(self):
|
||||||
@@ -708,10 +713,7 @@ class files_api:
|
|||||||
return not path in nDirs
|
return not path in nDirs
|
||||||
|
|
||||||
def getDirSize(self, path):
|
def getDirSize(self, path):
|
||||||
if mw.isAppleSystem():
|
tmp = mw.execShell('du -sh ' + path)
|
||||||
tmp = mw.execShell('du -sh ' + path)
|
|
||||||
else:
|
|
||||||
tmp = mw.execShell('du -sbh ' + path)
|
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
def checkFileName(self, filename):
|
def checkFileName(self, filename):
|
||||||
|
|||||||
@@ -178,12 +178,6 @@ class firewall_api:
|
|||||||
limit = request.form.get('limit', '10').strip()
|
limit = request.form.get('limit', '10').strip()
|
||||||
return self.getList(int(p), int(limit))
|
return self.getList(int(p), int(limit))
|
||||||
|
|
||||||
def getLogListApi(self):
|
|
||||||
p = request.form.get('p', '1').strip()
|
|
||||||
limit = request.form.get('limit', '10').strip()
|
|
||||||
search = request.form.get('search', '').strip()
|
|
||||||
return self.getLogList(int(p), int(limit), search)
|
|
||||||
|
|
||||||
def getSshInfoApi(self):
|
def getSshInfoApi(self):
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
@@ -389,11 +383,6 @@ class firewall_api:
|
|||||||
|
|
||||||
return mw.returnData(True, '设置成功!')
|
return mw.returnData(True, '设置成功!')
|
||||||
|
|
||||||
def delPanelLogsApi(self):
|
|
||||||
mw.M('logs').where('id>?', (0,)).delete()
|
|
||||||
mw.writeLog('面板设置', '面板操作日志已清空!')
|
|
||||||
return mw.returnJson(True, '面板操作日志已清空!')
|
|
||||||
|
|
||||||
##### ----- start ----- ###
|
##### ----- start ----- ###
|
||||||
|
|
||||||
def getList(self, page, limit):
|
def getList(self, page, limit):
|
||||||
@@ -414,28 +403,6 @@ class firewall_api:
|
|||||||
data['page'] = mw.getPage(_page)
|
data['page'] = mw.getPage(_page)
|
||||||
return mw.getJson(data)
|
return mw.getJson(data)
|
||||||
|
|
||||||
def getLogList(self, page, limit, search=''):
|
|
||||||
find_search = ''
|
|
||||||
if search != '':
|
|
||||||
find_search = "type like '%" + search + "%' or log like '%" + \
|
|
||||||
search + "%' or addtime like '%" + search + "%'"
|
|
||||||
|
|
||||||
start = (page - 1) * limit
|
|
||||||
|
|
||||||
_list = mw.M('logs').where(find_search, ()).field(
|
|
||||||
'id,type,log,addtime').limit(str(start) + ',' + str(limit)).order('id desc').select()
|
|
||||||
data = {}
|
|
||||||
data['data'] = _list
|
|
||||||
|
|
||||||
count = mw.M('logs').where(find_search, ()).count()
|
|
||||||
_page = {}
|
|
||||||
_page['count'] = count
|
|
||||||
_page['tojs'] = 'getLogs'
|
|
||||||
_page['p'] = page
|
|
||||||
|
|
||||||
data['page'] = mw.getPage(_page)
|
|
||||||
return mw.getJson(data)
|
|
||||||
|
|
||||||
def addAcceptPort(self, port):
|
def addAcceptPort(self, port):
|
||||||
if self.__isUfw:
|
if self.__isUfw:
|
||||||
mw.execShell('ufw allow ' + port + '/tcp')
|
mw.execShell('ufw allow ' + port + '/tcp')
|
||||||
|
|||||||
@@ -0,0 +1,352 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
# MW-Linux面板
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
# Author: midoks <midoks@163.com>
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
# 日志类操作
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import psutil
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import mw
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
import pwd
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from flask import request
|
||||||
|
|
||||||
|
|
||||||
|
class logs_api:
|
||||||
|
|
||||||
|
__months = {'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06',
|
||||||
|
'Jul': '07', 'Aug': '08', 'Sep': '09', 'Sept': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12'}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def delPanelLogsApi(self):
|
||||||
|
mw.M('logs').where('id>?', (0,)).delete()
|
||||||
|
mw.writeLog('面板设置', '面板操作日志已清空!')
|
||||||
|
return mw.returnJson(True, '面板操作日志已清空!')
|
||||||
|
|
||||||
|
def getLogListApi(self):
|
||||||
|
p = request.form.get('p', '1').strip()
|
||||||
|
limit = request.form.get('limit', '10').strip()
|
||||||
|
search = request.form.get('search', '').strip()
|
||||||
|
return self.getLogList(int(p), int(limit), search)
|
||||||
|
|
||||||
|
def getLogList(self, page, limit, search=''):
|
||||||
|
find_search = ''
|
||||||
|
if search != '':
|
||||||
|
find_search = "type like '%" + search + "%' or log like '%" + \
|
||||||
|
search + "%' or addtime like '%" + search + "%'"
|
||||||
|
|
||||||
|
start = (page - 1) * limit
|
||||||
|
|
||||||
|
_list = mw.M('logs').where(find_search, ()).field(
|
||||||
|
'id,type,log,addtime').limit(str(start) + ',' + str(limit)).order('id desc').select()
|
||||||
|
data = {}
|
||||||
|
data['data'] = _list
|
||||||
|
|
||||||
|
count = mw.M('logs').where(find_search, ()).count()
|
||||||
|
_page = {}
|
||||||
|
_page['count'] = count
|
||||||
|
_page['tojs'] = 'getLogs'
|
||||||
|
_page['p'] = page
|
||||||
|
|
||||||
|
data['page'] = mw.getPage(_page)
|
||||||
|
return mw.getJson(data)
|
||||||
|
|
||||||
|
def getLogsTitle(self, log_name):
|
||||||
|
log_name = log_name.replace('.1', '')
|
||||||
|
if log_name in ['mw-update.log']:
|
||||||
|
return '面板更新日志'
|
||||||
|
if log_name in ['mw-install.log']:
|
||||||
|
return '面板安装日志'
|
||||||
|
if log_name in ['auth.log', 'secure'] or log_name.find('auth.') == 0:
|
||||||
|
return '授权日志'
|
||||||
|
if log_name in ['dmesg'] or log_name.find('dmesg') == 0:
|
||||||
|
return '内核缓冲区日志'
|
||||||
|
if log_name in ['syslog'] or log_name.find('syslog') == 0:
|
||||||
|
return '系统警告/错误日志'
|
||||||
|
if log_name in ['btmp']:
|
||||||
|
return '失败的登录记录'
|
||||||
|
if log_name in ['utmp', 'wtmp']:
|
||||||
|
return '登录和重启记录'
|
||||||
|
if log_name in ['lastlog']:
|
||||||
|
return '用户最后登录'
|
||||||
|
if log_name in ['yum.log']:
|
||||||
|
return 'yum包管理器日志'
|
||||||
|
if log_name in ['anaconda.log']:
|
||||||
|
return 'Anaconda日志'
|
||||||
|
if log_name in ['dpkg.log']:
|
||||||
|
return 'dpkg日志'
|
||||||
|
if log_name in ['daemon.log']:
|
||||||
|
return '系统后台守护进程日志'
|
||||||
|
if log_name in ['boot.log']:
|
||||||
|
return '启动日志'
|
||||||
|
if log_name in ['kern.log']:
|
||||||
|
return '内核日志'
|
||||||
|
if log_name in ['maillog', 'mail.log']:
|
||||||
|
return '邮件日志'
|
||||||
|
if log_name.find('Xorg') == 0:
|
||||||
|
return 'Xorg日志'
|
||||||
|
if log_name in ['cron.log']:
|
||||||
|
return '定时任务日志'
|
||||||
|
if log_name in ['alternatives.log']:
|
||||||
|
return '更新替代信息'
|
||||||
|
if log_name in ['debug']:
|
||||||
|
return '调试信息'
|
||||||
|
if log_name.find('apt') == 0:
|
||||||
|
return 'apt-get相关日志'
|
||||||
|
if log_name.find('installer') == 0:
|
||||||
|
return '系统安装相关日志'
|
||||||
|
if log_name in ['messages']:
|
||||||
|
return '综合日志'
|
||||||
|
return '{}日志'.format(log_name.split('.')[0])
|
||||||
|
|
||||||
|
def getAuditLogsFilesApi(self):
|
||||||
|
log_dir = '/var/log'
|
||||||
|
log_files = []
|
||||||
|
for log_file in os.listdir(log_dir):
|
||||||
|
log_suffix = log_file.split('.')[-1:]
|
||||||
|
if log_suffix[0] in ['gz', 'xz', 'bz2', 'asl']:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if log_file in ['.', '..', 'faillog', 'fontconfig.log', 'unattended-upgrades', 'tallylog']:
|
||||||
|
continue
|
||||||
|
|
||||||
|
filename = os.path.join(log_dir, log_file)
|
||||||
|
if os.path.isfile(filename):
|
||||||
|
file_size = os.path.getsize(filename)
|
||||||
|
if not file_size:
|
||||||
|
continue
|
||||||
|
|
||||||
|
tmp = {
|
||||||
|
'name': log_file,
|
||||||
|
'size': file_size,
|
||||||
|
'log_file': filename,
|
||||||
|
'title': self.getLogsTitle(log_file),
|
||||||
|
'uptime': os.path.getmtime(filename)
|
||||||
|
}
|
||||||
|
|
||||||
|
log_files.append(tmp)
|
||||||
|
else:
|
||||||
|
for next_name in os.listdir(filename):
|
||||||
|
if next_name[-3:] in ['.gz', '.xz']:
|
||||||
|
continue
|
||||||
|
next_file = os.path.join(filename, next_name)
|
||||||
|
if not os.path.isfile(next_file):
|
||||||
|
continue
|
||||||
|
file_size = os.path.getsize(next_file)
|
||||||
|
if not file_size:
|
||||||
|
continue
|
||||||
|
log_name = '{}/{}'.format(log_file, next_name)
|
||||||
|
tmp = {
|
||||||
|
'name': log_name,
|
||||||
|
'size': file_size,
|
||||||
|
'log_file': next_file,
|
||||||
|
'title': self.getLogsTitle(log_name),
|
||||||
|
'uptime': os.path.getmtime(next_file)
|
||||||
|
}
|
||||||
|
log_files.append(tmp)
|
||||||
|
log_files = sorted(log_files, key=lambda x: x['name'], reverse=True)
|
||||||
|
return mw.getJson(log_files)
|
||||||
|
|
||||||
|
def getAuditFileApi(self):
|
||||||
|
log_name = request.form.get('log_name', '').strip()
|
||||||
|
return self.getAuditLogsName(log_name)
|
||||||
|
|
||||||
|
def __to_date2(self, date_str):
|
||||||
|
tmp = date_str.split()
|
||||||
|
s_date = str(tmp[-1]) + '-' + self.__months.get(tmp[1],
|
||||||
|
tmp[1]) + '-' + tmp[2] + ' ' + tmp[3]
|
||||||
|
return s_date
|
||||||
|
|
||||||
|
def __to_date3(self, date_str):
|
||||||
|
tmp = date_str.split()
|
||||||
|
s_date = str(datetime.now().year) + '-' + \
|
||||||
|
self.__months.get(tmp[1], tmp[1]) + '-' + tmp[2] + ' ' + tmp[3]
|
||||||
|
return s_date
|
||||||
|
|
||||||
|
def __to_date4(self, date_str):
|
||||||
|
tmp = date_str.split()
|
||||||
|
s_date = str(datetime.now().year) + '-' + \
|
||||||
|
self.__months.get(tmp[0], tmp[0]) + '-' + tmp[1] + ' ' + tmp[2]
|
||||||
|
return s_date
|
||||||
|
|
||||||
|
def getAuditLast(self, log_name):
|
||||||
|
# 获取日志
|
||||||
|
cmd = '''LANG=en_US.UTF-8 last -n 200 -x -f {} |grep -v 127.0.0.1|grep -v " begins"'''.format(
|
||||||
|
'/var/log/' + log_name)
|
||||||
|
result = mw.execShell(cmd)
|
||||||
|
lastlog_list = []
|
||||||
|
for _line in result[0].split("\n"):
|
||||||
|
if not _line:
|
||||||
|
continue
|
||||||
|
tmp = {}
|
||||||
|
sp_arr = _line.split()
|
||||||
|
tmp['用户'] = sp_arr[0]
|
||||||
|
if sp_arr[0] == 'runlevel':
|
||||||
|
tmp['来源'] = sp_arr[4]
|
||||||
|
tmp['端口'] = ' '.join(sp_arr[1:4])
|
||||||
|
tmp['时间'] = self.__to_date3(
|
||||||
|
' '.join(sp_arr[5:])) + ' ' + ' '.join(sp_arr[-2:])
|
||||||
|
elif sp_arr[0] in ['reboot', 'shutdown']:
|
||||||
|
tmp['来源'] = sp_arr[3]
|
||||||
|
tmp['端口'] = ' '.join(sp_arr[1:3])
|
||||||
|
if sp_arr[-3] == '-':
|
||||||
|
tmp['时间'] = self.__to_date3(
|
||||||
|
' '.join(sp_arr[4:])) + ' ' + ' '.join(sp_arr[-3:])
|
||||||
|
else:
|
||||||
|
tmp['时间'] = self.__to_date3(
|
||||||
|
' '.join(sp_arr[4:])) + ' ' + ' '.join(sp_arr[-2:])
|
||||||
|
elif sp_arr[1] in ['tty1', 'tty', 'tty2', 'tty3', 'hvc0', 'hvc1', 'hvc2'] or len(sp_arr) == 9:
|
||||||
|
tmp['来源'] = ''
|
||||||
|
tmp['端口'] = sp_arr[1]
|
||||||
|
tmp['时间'] = self.__to_date3(
|
||||||
|
' '.join(sp_arr[2:])) + ' ' + ' '.join(sp_arr[-3:])
|
||||||
|
else:
|
||||||
|
tmp['来源'] = sp_arr[2]
|
||||||
|
tmp['端口'] = sp_arr[1]
|
||||||
|
tmp['时间'] = self.__to_date3(
|
||||||
|
' '.join(sp_arr[3:])) + ' ' + ' '.join(sp_arr[-3:])
|
||||||
|
|
||||||
|
# tmp['_line'] = _line
|
||||||
|
lastlog_list.append(tmp)
|
||||||
|
# lastlog_list = sorted(lastlog_list,key=lambda x:x['时间'],reverse=True)
|
||||||
|
return mw.returnData(True, 'ok!', lastlog_list)
|
||||||
|
|
||||||
|
def getAuditLastLog(self):
|
||||||
|
cmd = '''LANG=en_US.UTF-8 lastlog|grep -v Username'''
|
||||||
|
result = mw.execShell(cmd)
|
||||||
|
lastlog_list = []
|
||||||
|
for _line in result[0].split("\n"):
|
||||||
|
if not _line:
|
||||||
|
continue
|
||||||
|
tmp = {}
|
||||||
|
sp_arr = _line.split()
|
||||||
|
tmp['用户'] = sp_arr[0]
|
||||||
|
# tmp['_line'] = _line
|
||||||
|
if _line.find('Never logged in') != -1:
|
||||||
|
tmp['最后登录时间'] = '0'
|
||||||
|
tmp['最后登录来源'] = '-'
|
||||||
|
tmp['最后登录端口'] = '-'
|
||||||
|
lastlog_list.append(tmp)
|
||||||
|
continue
|
||||||
|
tmp['最后登录来源'] = sp_arr[2]
|
||||||
|
tmp['最后登录端口'] = sp_arr[1]
|
||||||
|
tmp['最后登录时间'] = self.__to_date2(' '.join(sp_arr[3:]))
|
||||||
|
|
||||||
|
lastlog_list.append(tmp)
|
||||||
|
lastlog_list = sorted(lastlog_list, key=lambda x: x[
|
||||||
|
'最后登录时间'], reverse=True)
|
||||||
|
for i in range(len(lastlog_list)):
|
||||||
|
if lastlog_list[i]['最后登录时间'] == '0':
|
||||||
|
lastlog_list[i]['最后登录时间'] = '从未登录过'
|
||||||
|
return mw.returnData(True, 'ok!', lastlog_list)
|
||||||
|
|
||||||
|
def parseAuditFile(self, log_name, result):
|
||||||
|
log_list = []
|
||||||
|
is_string = True
|
||||||
|
for _line in result.split("\n"):
|
||||||
|
if not _line.strip():
|
||||||
|
continue
|
||||||
|
if log_name.find('sa/sa') == -1:
|
||||||
|
if _line[:3] in self.__months:
|
||||||
|
_msg = _line[16:]
|
||||||
|
_tmp = _msg.split(": ")
|
||||||
|
_act = ''
|
||||||
|
if len(_tmp) > 1:
|
||||||
|
_act = _tmp[0]
|
||||||
|
_msg = _tmp[1]
|
||||||
|
else:
|
||||||
|
_msg = _tmp[0]
|
||||||
|
_line = {
|
||||||
|
"时间": self.__to_date4(_line[:16].strip()),
|
||||||
|
"角色": _act,
|
||||||
|
"事件": _msg
|
||||||
|
}
|
||||||
|
is_string = False
|
||||||
|
elif _line[:2] in ['19', '20', '21', '22', '23', '24']:
|
||||||
|
_msg = _line[19:]
|
||||||
|
_tmp = _msg.split(" ")
|
||||||
|
_act = _tmp[1]
|
||||||
|
_msg = ' '.join(_tmp[2:])
|
||||||
|
_line = {
|
||||||
|
"时间": _line[:19].strip(),
|
||||||
|
"角色": _act,
|
||||||
|
"事件": _msg
|
||||||
|
}
|
||||||
|
is_string = False
|
||||||
|
elif log_name.find('alternatives') == 0:
|
||||||
|
_tmp = _line.split(": ")
|
||||||
|
_last = _tmp[0].split(" ")
|
||||||
|
_act = _last[0]
|
||||||
|
_msg = ' '.join(_tmp[1:])
|
||||||
|
_line = {
|
||||||
|
"时间": ' '.join(_last[1:]).strip(),
|
||||||
|
"角色": _act,
|
||||||
|
"事件": _msg
|
||||||
|
}
|
||||||
|
is_string = False
|
||||||
|
else:
|
||||||
|
if not is_string:
|
||||||
|
if type(_line) != dict:
|
||||||
|
continue
|
||||||
|
|
||||||
|
log_list.append(_line)
|
||||||
|
|
||||||
|
return log_list
|
||||||
|
|
||||||
|
def getAuditLogsName(self, log_name):
|
||||||
|
# print(log_name)
|
||||||
|
if log_name in ['wtmp', 'btmp', 'utmp'] or log_name.find('wtmp') == 0 or log_name.find('btmp') == 0 or log_name.find('utmp') == 0:
|
||||||
|
return self.getAuditLast(log_name)
|
||||||
|
|
||||||
|
if log_name.find('lastlog') == 0:
|
||||||
|
return self.getAuditLastLog()
|
||||||
|
|
||||||
|
if log_name.find('sa/sa') == 0:
|
||||||
|
if log_name.find('sa/sar') == -1:
|
||||||
|
return mw.execShell("sar -f /var/log/{}".format(log_name))[0]
|
||||||
|
log_dir = '/var/log'
|
||||||
|
log_file = log_dir + '/' + log_name
|
||||||
|
if not os.path.exists(log_file):
|
||||||
|
return mw.returnData(False, '日志文件不存在!')
|
||||||
|
result = mw.getLastLine(log_file, 100)
|
||||||
|
try:
|
||||||
|
log_list = self.parseAuditFile(log_name, result)
|
||||||
|
_string = []
|
||||||
|
_dict = []
|
||||||
|
_list = []
|
||||||
|
for _line in log_list:
|
||||||
|
if isinstance(_line, str):
|
||||||
|
_string.append(_line.strip())
|
||||||
|
elif isinstance(_line, dict):
|
||||||
|
_dict.append(_line)
|
||||||
|
elif isinstance(_line, list):
|
||||||
|
_list.append(_line)
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
_str_len = len(_string)
|
||||||
|
_dict_len = len(_dict)
|
||||||
|
_list_len = len(_list)
|
||||||
|
if _str_len > _dict_len + _list_len:
|
||||||
|
return "\n".join(_string)
|
||||||
|
elif _dict_len > _str_len + _list_len:
|
||||||
|
return mw.returnData(True, 'ok!', _dict)
|
||||||
|
else:
|
||||||
|
return mw.returnData(True, 'ok!', _list)
|
||||||
|
|
||||||
|
except:
|
||||||
|
return mw.returnData(True, 'ok!', result)
|
||||||
+16
-7
@@ -349,7 +349,8 @@ def restartMw():
|
|||||||
|
|
||||||
def checkWebConfig():
|
def checkWebConfig():
|
||||||
op_dir = getServerDir() + '/openresty/nginx'
|
op_dir = getServerDir() + '/openresty/nginx'
|
||||||
cmd = "ulimit -n 10240 && " + op_dir + \
|
# "ulimit -n 10240 && " +
|
||||||
|
cmd = op_dir + \
|
||||||
"/sbin/nginx -t -c " + op_dir + "/conf/nginx.conf"
|
"/sbin/nginx -t -c " + op_dir + "/conf/nginx.conf"
|
||||||
result = execShell(cmd)
|
result = execShell(cmd)
|
||||||
searchStr = 'test is successful'
|
searchStr = 'test is successful'
|
||||||
@@ -1355,6 +1356,12 @@ def getCpuType():
|
|||||||
cpuinfo = execShell(cmd)
|
cpuinfo = execShell(cmd)
|
||||||
return cpuinfo[0].strip()
|
return cpuinfo[0].strip()
|
||||||
|
|
||||||
|
current_os = getOs()
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
cmd = "sysctl -a | egrep -i 'hw.model' | awk -F ':' '{print $2}'"
|
||||||
|
cpuinfo = execShell(cmd)
|
||||||
|
return cpuinfo[0].strip()
|
||||||
|
|
||||||
# 取CPU类型
|
# 取CPU类型
|
||||||
cpuinfo = open('/proc/cpuinfo', 'r').read()
|
cpuinfo = open('/proc/cpuinfo', 'r').read()
|
||||||
rep = "model\s+name\s+:\s+(.+)"
|
rep = "model\s+name\s+:\s+(.+)"
|
||||||
@@ -1411,7 +1418,7 @@ def makeConf():
|
|||||||
file = getRunDir() + '/data/json/config.json'
|
file = getRunDir() + '/data/json/config.json'
|
||||||
if not os.path.exists(file):
|
if not os.path.exists(file):
|
||||||
c = {}
|
c = {}
|
||||||
c['title'] = '金灵面板'
|
c['title'] = '老子面板'
|
||||||
c['home'] = 'http://github/midoks/mdserver-web'
|
c['home'] = 'http://github/midoks/mdserver-web'
|
||||||
c['recycle_bin'] = True
|
c['recycle_bin'] = True
|
||||||
c['template'] = 'default'
|
c['template'] = 'default'
|
||||||
@@ -1550,7 +1557,9 @@ def checkInput(data):
|
|||||||
|
|
||||||
def checkCert(certPath='ssl/certificate.pem'):
|
def checkCert(certPath='ssl/certificate.pem'):
|
||||||
# 验证证书
|
# 验证证书
|
||||||
openssl = '/usr/local/openssl/bin/openssl'
|
openssl = '/usr/bin/openssl'
|
||||||
|
if not os.path.exists(openssl):
|
||||||
|
openssl = '/usr/local/openssl/bin/openssl'
|
||||||
if not os.path.exists(openssl):
|
if not os.path.exists(openssl):
|
||||||
openssl = 'openssl'
|
openssl = 'openssl'
|
||||||
certPem = readFile(certPath)
|
certPem = readFile(certPath)
|
||||||
@@ -2097,15 +2106,15 @@ done
|
|||||||
|
|
||||||
|
|
||||||
def echoStart(tag):
|
def echoStart(tag):
|
||||||
print("=" * 90)
|
print("=" * 89)
|
||||||
print("★开始{}[{}]".format(tag, formatDate()))
|
print("★开始{}[{}]".format(tag, formatDate()))
|
||||||
print("=" * 90)
|
print("=" * 89)
|
||||||
|
|
||||||
|
|
||||||
def echoEnd(tag):
|
def echoEnd(tag):
|
||||||
print("=" * 90)
|
print("=" * 89)
|
||||||
print("☆{}完成[{}]".format(tag, formatDate()))
|
print("☆{}完成[{}]".format(tag, formatDate()))
|
||||||
print("=" * 90)
|
print("=" * 89)
|
||||||
print("\n")
|
print("\n")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2760,7 +2760,7 @@ location ^~ {from} {\n\
|
|||||||
|
|
||||||
self.saveCert(keyPath, certPath)
|
self.saveCert(keyPath, certPath)
|
||||||
|
|
||||||
msg = mw.getInfo('网站[{1}]开启SSL成功!', siteName)
|
msg = mw.getInfo('网站[{}]开启SSL成功!', siteName)
|
||||||
mw.writeLog('网站管理', msg)
|
mw.writeLog('网站管理', msg)
|
||||||
|
|
||||||
mw.restartWeb()
|
mw.restartWeb()
|
||||||
|
|||||||
@@ -274,26 +274,43 @@ class system_api:
|
|||||||
return title
|
return title
|
||||||
|
|
||||||
def getSystemVersion(self):
|
def getSystemVersion(self):
|
||||||
|
#
|
||||||
# 取操作系统版本
|
# 取操作系统版本
|
||||||
if mw.getOs() == 'darwin':
|
current_os = mw.getOs()
|
||||||
|
# mac
|
||||||
|
if current_os == 'darwin':
|
||||||
data = mw.execShell('sw_vers')[0]
|
data = mw.execShell('sw_vers')[0]
|
||||||
data_list = data.strip().split("\n")
|
data_list = data.strip().split("\n")
|
||||||
mac_version = ''
|
mac_version = ''
|
||||||
for x in data_list:
|
for x in data_list:
|
||||||
mac_version += x.split("\t")[1] + ' '
|
mac_version += x.split("\t")[1] + ' '
|
||||||
return mac_version
|
|
||||||
|
arch_ver = mw.execShell("arch")
|
||||||
|
return mac_version + " (" + arch_ver[0].strip() + ")"
|
||||||
|
|
||||||
|
# freebsd
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
version = mw.execShell(
|
||||||
|
"cat /etc/*-release | grep PRETTY_NAME | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
|
||||||
|
arch_ver = mw.execShell(
|
||||||
|
"sysctl -a | egrep -i 'hw.machine_arch' | awk -F ':' '{print $2}'")
|
||||||
|
return version[0].strip() + " (" + arch_ver[0].strip() + ")"
|
||||||
|
|
||||||
redhat_series = '/etc/redhat-release'
|
redhat_series = '/etc/redhat-release'
|
||||||
if os.path.exists(redhat_series):
|
if os.path.exists(redhat_series):
|
||||||
version = mw.readFile('/etc/redhat-release')
|
version = mw.readFile('/etc/redhat-release')
|
||||||
version = version.replace('release ', '').strip()
|
version = version.replace('release ', '').strip()
|
||||||
return version
|
|
||||||
|
arch_ver = mw.execShell("arch")
|
||||||
|
return version + " (" + arch_ver[0].strip() + ")"
|
||||||
|
|
||||||
os_series = '/etc/os-release'
|
os_series = '/etc/os-release'
|
||||||
if os.path.exists(os_series):
|
if os.path.exists(os_series):
|
||||||
version = mw.execShell(
|
version = mw.execShell(
|
||||||
"cat /etc/*-release | grep PRETTY_NAME | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
|
"cat /etc/*-release | grep PRETTY_NAME | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
|
||||||
return version[0].strip()
|
|
||||||
|
arch_ver = mw.execShell("arch")
|
||||||
|
return version[0].strip() + " (" + arch_ver[0].strip() + ")"
|
||||||
|
|
||||||
return '未识别系统信息'
|
return '未识别系统信息'
|
||||||
|
|
||||||
@@ -318,7 +335,7 @@ class system_api:
|
|||||||
cpuCount = psutil.cpu_count()
|
cpuCount = psutil.cpu_count()
|
||||||
cpuLogicalNum = psutil.cpu_count(logical=False)
|
cpuLogicalNum = psutil.cpu_count(logical=False)
|
||||||
used = psutil.cpu_percent(interval=interval)
|
used = psutil.cpu_percent(interval=interval)
|
||||||
|
cpuLogicalNum = 0
|
||||||
if os.path.exists('/proc/cpuinfo'):
|
if os.path.exists('/proc/cpuinfo'):
|
||||||
c_tmp = mw.readFile('/proc/cpuinfo')
|
c_tmp = mw.readFile('/proc/cpuinfo')
|
||||||
d_tmp = re.findall("physical id.+", c_tmp)
|
d_tmp = re.findall("physical id.+", c_tmp)
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ MDIR=$(dirname "$DIR")
|
|||||||
PATH=$PATH:$DIR/bin
|
PATH=$PATH:$DIR/bin
|
||||||
if [ -f bin/activate ];then
|
if [ -f bin/activate ];then
|
||||||
source bin/activate
|
source bin/activate
|
||||||
|
|
||||||
|
if [ "$?" != "0" ];then
|
||||||
|
echo "load local python env fail!"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export LC_ALL="en_US.UTF-8"
|
export LC_ALL="en_US.UTF-8"
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ if sys.platform != "darwin":
|
|||||||
|
|
||||||
sys.path.append(os.getcwd() + "/class/core")
|
sys.path.append(os.getcwd() + "/class/core")
|
||||||
import mw
|
import mw
|
||||||
|
import db
|
||||||
|
|
||||||
_ver = sys.version_info
|
_ver = sys.version_info
|
||||||
is_py2 = (_ver[0] == 2)
|
is_py2 = (_ver[0] == 2)
|
||||||
@@ -185,6 +186,35 @@ def backupAllFunc(stype):
|
|||||||
"path": "path",
|
"path": "path",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
backups = []
|
||||||
|
sql = db.Sql()
|
||||||
|
|
||||||
|
# print("stype:", stype)
|
||||||
|
# 提前获取-清理多余备份
|
||||||
|
if stype == 'site':
|
||||||
|
pid = sql.table('sites').where('name=?', (name,)).getField('id')
|
||||||
|
backups = sql.table('backup').where(
|
||||||
|
'type=? and pid=?', ('0', pid)).field('id,filename').select()
|
||||||
|
if stype == 'database':
|
||||||
|
db_path = mw.getServerDir() + '/mysql'
|
||||||
|
pid = mw.M('databases').dbPos(db_path, 'mysql').where(
|
||||||
|
'name=?', (name,)).getField('id')
|
||||||
|
backups = sql.table('backup').where(
|
||||||
|
'type=? and pid=?', ('1', pid)).field('id,filename').select()
|
||||||
|
if stype == 'path':
|
||||||
|
backup_path = backup_dir + '/path'
|
||||||
|
_name = 'path_{}'.format(os.path.basename(name))
|
||||||
|
backups = findPathName(backup_path, _name)
|
||||||
|
|
||||||
|
# 其他类型关系性数据库(mysql类的)
|
||||||
|
if stype.find('database_') > -1:
|
||||||
|
plugin_name = stype.replace('database_', '')
|
||||||
|
db_path = mw.getServerDir() + '/' + plugin_name
|
||||||
|
pid = mw.M('databases').dbPos(db_path, 'mysql').where(
|
||||||
|
'name=?', (name,)).getField('id')
|
||||||
|
backups = sql.table('backup').where(
|
||||||
|
'type=? and pid=?', ('1', pid)).field('id,filename').select()
|
||||||
|
|
||||||
args = stype + " " + name + " " + num
|
args = stype + " " + name + " " + num
|
||||||
cmd = 'python3 ' + mw.getRunDir() + '/scripts/backup.py ' + args
|
cmd = 'python3 ' + mw.getRunDir() + '/scripts/backup.py ' + args
|
||||||
if stype.find('database_') > -1:
|
if stype.find('database_') > -1:
|
||||||
@@ -213,19 +243,31 @@ def backupAllFunc(stype):
|
|||||||
filename = mw.execShell(find_new_file)[0].strip()
|
filename = mw.execShell(find_new_file)[0].strip()
|
||||||
if filename == "":
|
if filename == "":
|
||||||
mw.echoInfo("not find upload file!")
|
mw.echoInfo("not find upload file!")
|
||||||
return False
|
return ''
|
||||||
|
|
||||||
print("|-准备上传文件 {}".format(filename))
|
print("|-准备上传文件 {}".format(filename))
|
||||||
ftp = FtpPSClient()
|
ftp = FtpPSClient()
|
||||||
ftp.uploadFile(filename, stype)
|
ftp.uploadFile(filename, stype)
|
||||||
|
|
||||||
|
# print(backups)
|
||||||
|
backups = sorted(backups, key=lambda x: x['filename'], reverse=False)
|
||||||
|
mw.echoStart('开始删除远程备份')
|
||||||
|
num = int(num)
|
||||||
|
sep = len(backups) - num
|
||||||
|
if sep > -1:
|
||||||
|
for backup in backups:
|
||||||
|
fn = os.path.basename(backup['filename'])
|
||||||
|
object_name = ftp.buildDirName(stype, fn)
|
||||||
|
ftp.deleteFile(object_name)
|
||||||
|
mw.echoInfo("---已清理远程过期备份文件:" + object_name)
|
||||||
|
sep -= 1
|
||||||
|
if sep < 0:
|
||||||
|
break
|
||||||
|
mw.echoEnd('结束删除远程备份')
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
def backupSite():
|
|
||||||
# 备份站点
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def in_array(name, arr=[]):
|
def in_array(name, arr=[]):
|
||||||
for x in arr:
|
for x in arr:
|
||||||
if name == x:
|
if name == x:
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Executable
+19
@@ -0,0 +1,19 @@
|
|||||||
|
<div class="bt-form">
|
||||||
|
<div class='plugin_version'></div>
|
||||||
|
<div class="bt-w-main">
|
||||||
|
<div class="bt-w-menu">
|
||||||
|
<p class="bgw" onclick="pluginService('dynamic-tracking');">服务</p>
|
||||||
|
<p onclick="pluginInitD('dynamic-tracking');">自启动</p>
|
||||||
|
</div>
|
||||||
|
<div class="bt-w-con pd15">
|
||||||
|
<div class="soft-man-con"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
resetPluginWinHeight(300);
|
||||||
|
resetPluginWinWidth(500);
|
||||||
|
$.getScript( "/plugins/file?name=dynamic-tracking&f=static/js/dynamic-tracking.js", function(){
|
||||||
|
pluginService('dynamic-tracking', $('.plugin_version').attr('version'));
|
||||||
|
});
|
||||||
|
</script>
|
||||||
Executable
+228
@@ -0,0 +1,228 @@
|
|||||||
|
# coding:utf-8
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
|
sys.path.append(os.getcwd() + "/class/core")
|
||||||
|
import mw
|
||||||
|
|
||||||
|
app_debug = False
|
||||||
|
if mw.isAppleSystem():
|
||||||
|
app_debug = True
|
||||||
|
|
||||||
|
|
||||||
|
def getPluginName():
|
||||||
|
return 'dynamic-tracking'
|
||||||
|
|
||||||
|
|
||||||
|
def getPluginDir():
|
||||||
|
return mw.getPluginDir() + '/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
def getServerDir():
|
||||||
|
return mw.getServerDir() + '/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
def getInitDFile():
|
||||||
|
if app_debug:
|
||||||
|
return '/tmp/' + getPluginName()
|
||||||
|
return '/etc/init.d/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
def getInitDTpl():
|
||||||
|
path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def getArgs():
|
||||||
|
args = sys.argv[2:]
|
||||||
|
tmp = {}
|
||||||
|
args_len = len(args)
|
||||||
|
|
||||||
|
if args_len == 1:
|
||||||
|
t = args[0].strip('{').strip('}')
|
||||||
|
if t.strip() == '':
|
||||||
|
tmp = []
|
||||||
|
else:
|
||||||
|
t = t.split(':')
|
||||||
|
tmp[t[0]] = t[1]
|
||||||
|
tmp[t[0]] = t[1]
|
||||||
|
elif args_len > 1:
|
||||||
|
for i in range(len(args)):
|
||||||
|
t = args[i].split(':')
|
||||||
|
tmp[t[0]] = t[1]
|
||||||
|
return tmp
|
||||||
|
|
||||||
|
|
||||||
|
def checkArgs(data, ck=[]):
|
||||||
|
for i in range(len(ck)):
|
||||||
|
if not ck[i] in data:
|
||||||
|
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
|
||||||
|
return (True, mw.returnJson(True, 'ok'))
|
||||||
|
|
||||||
|
|
||||||
|
def status():
|
||||||
|
dir_path = getServerDir() + '/trace'
|
||||||
|
if not os.path.exists(dir_path):
|
||||||
|
os.mkdir(dir_path)
|
||||||
|
return 'start'
|
||||||
|
|
||||||
|
|
||||||
|
def dtOp(method):
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
|
def start():
|
||||||
|
return dtOp('start')
|
||||||
|
|
||||||
|
|
||||||
|
def stop():
|
||||||
|
return dtOp('stop')
|
||||||
|
|
||||||
|
|
||||||
|
def restart():
|
||||||
|
status = dtOp('restart')
|
||||||
|
return status
|
||||||
|
|
||||||
|
|
||||||
|
def reload():
|
||||||
|
return dtOp('reload')
|
||||||
|
|
||||||
|
|
||||||
|
def initdStatus():
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
|
def initdInstall():
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
|
def initdUinstall():
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
|
def get_file(args):
|
||||||
|
dir_path = getServerDir() + '/trace'
|
||||||
|
|
||||||
|
path = dir_path + '/' + args['file'] + '/main.svg'
|
||||||
|
|
||||||
|
if os.path.exists(path):
|
||||||
|
d = mw.readFile(path)
|
||||||
|
return mw.returnData(True, 'ok', d)
|
||||||
|
else:
|
||||||
|
return mw.returnData(False, '无效目录')
|
||||||
|
|
||||||
|
|
||||||
|
def get_file_path(args):
|
||||||
|
dir_path = getServerDir() + '/trace'
|
||||||
|
path = dir_path + '/' + args['file'] + '/main.svg'
|
||||||
|
if os.path.exists(path):
|
||||||
|
return mw.returnData(True, 'ok', path)
|
||||||
|
else:
|
||||||
|
return mw.returnData(False, '无效目录')
|
||||||
|
|
||||||
|
|
||||||
|
def dtGetFilePath():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['file'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
dir_path = getServerDir() + '/trace'
|
||||||
|
path = dir_path + '/' + args['file'] + '/main.svg'
|
||||||
|
if os.path.exists(path):
|
||||||
|
return mw.returnJson(True, 'ok', path)
|
||||||
|
else:
|
||||||
|
return mw.returnJson(False, '无效目录')
|
||||||
|
|
||||||
|
|
||||||
|
def dtRemoveFilePath():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['file'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
dir_path = getServerDir() + '/trace'
|
||||||
|
path = dir_path + '/' + args['file']
|
||||||
|
if os.path.exists(path):
|
||||||
|
mw.execShell('rm -rf ' + path)
|
||||||
|
return mw.returnJson(True, '删除成功!')
|
||||||
|
|
||||||
|
|
||||||
|
def dtFileList():
|
||||||
|
dir_path = getServerDir() + '/trace'
|
||||||
|
if not os.path.exists(dir_path):
|
||||||
|
os.mkdir(dir_path)
|
||||||
|
|
||||||
|
file_info = []
|
||||||
|
for name in os.listdir(dir_path):
|
||||||
|
if name == ".DS_Store":
|
||||||
|
continue
|
||||||
|
|
||||||
|
# print(name)
|
||||||
|
info = {}
|
||||||
|
try:
|
||||||
|
info['name'] = name
|
||||||
|
info['abs_path'] = dir_path + '/' + name + '/main.svg'
|
||||||
|
except Exception as e:
|
||||||
|
return mw.returnJson(False, str(e))
|
||||||
|
|
||||||
|
file_info.append(info)
|
||||||
|
|
||||||
|
file_info = sorted(file_info, key=lambda x: x['name'], reverse=False)
|
||||||
|
return mw.returnJson(True, 'ok!', file_info)
|
||||||
|
|
||||||
|
|
||||||
|
def dtSimpleTrace():
|
||||||
|
if mw.isAppleSystem():
|
||||||
|
return mw.returnJson(False, 'macosx只能手动执行!')
|
||||||
|
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['pid'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
plugins_shell = getPluginDir() + '/shell/simple_trace.sh'
|
||||||
|
cmd = plugins_shell + ' "' + args['pid'] + '"'
|
||||||
|
|
||||||
|
data = mw.execShell("bash " + cmd + " &")
|
||||||
|
return mw.returnJson(True, '执行成功!')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
func = sys.argv[1]
|
||||||
|
if func == 'status':
|
||||||
|
print(status())
|
||||||
|
elif func == 'start':
|
||||||
|
print(start())
|
||||||
|
elif func == 'stop':
|
||||||
|
print(stop())
|
||||||
|
elif func == 'restart':
|
||||||
|
print(restart())
|
||||||
|
elif func == 'reload':
|
||||||
|
print(reload())
|
||||||
|
elif func == 'initd_status':
|
||||||
|
print(initdStatus())
|
||||||
|
elif func == 'initd_install':
|
||||||
|
print(initdInstall())
|
||||||
|
elif func == 'initd_uninstall':
|
||||||
|
print(initdUinstall())
|
||||||
|
elif func == 'run_info':
|
||||||
|
print(runInfo())
|
||||||
|
elif func == 'conf':
|
||||||
|
print(getConf())
|
||||||
|
elif func == 'run_log':
|
||||||
|
print(runLog())
|
||||||
|
elif func == 'file_list':
|
||||||
|
print(dtFileList())
|
||||||
|
elif func == 'get_file_path':
|
||||||
|
print(dtGetFilePath())
|
||||||
|
elif func == 'remove_file_path':
|
||||||
|
print(dtRemoveFilePath())
|
||||||
|
elif func == 'simple_trace':
|
||||||
|
print(dtSimpleTrace())
|
||||||
|
else:
|
||||||
|
print('error')
|
||||||
Executable
+36
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"hook":[
|
||||||
|
{
|
||||||
|
"tag":"menu",
|
||||||
|
"menu": {
|
||||||
|
"title":"动态追踪",
|
||||||
|
"name":"dynamic-tracking",
|
||||||
|
"path":"static/html/index.html",
|
||||||
|
"css_path":"static/css/dynamic-tracking.css",
|
||||||
|
"js_path":"static/js/dynamic-tracking.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag":"global_static",
|
||||||
|
"global_static": {
|
||||||
|
"title":"动态追踪",
|
||||||
|
"name":"dynamic-tracking",
|
||||||
|
"css_path":"static/css/ico.css"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"sort": 7,
|
||||||
|
"ps": "专业使用,动态追踪调试程序<无侵入>![<span style='color:red;'>潜龙勿用|实验</span>]",
|
||||||
|
"name": "dynamic-tracking",
|
||||||
|
"title": "动态追踪",
|
||||||
|
"shell": "install.sh",
|
||||||
|
"versions":["0.1"],
|
||||||
|
"tip": "soft",
|
||||||
|
"checks": "server/dynamic-tracking",
|
||||||
|
"path": "server/dynamic-tracking",
|
||||||
|
"display": 1,
|
||||||
|
"author": "midoks",
|
||||||
|
"date": "2023-08-17",
|
||||||
|
"type": 0,
|
||||||
|
"pid": "4"
|
||||||
|
}
|
||||||
Executable
+88
@@ -0,0 +1,88 @@
|
|||||||
|
#!/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")
|
||||||
|
|
||||||
|
# cd /www/server/mdserver-web/plugins/dynamic-tracking && /bin/bash install.sh uninstall 1.0
|
||||||
|
# cd /www/server/mdserver-web/plugins/dynamic-tracking && /bin/bash install.sh install 1.0
|
||||||
|
|
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||||
|
VERSION=$2
|
||||||
|
|
||||||
|
if [ -f ${rootPath}/bin/activate ];then
|
||||||
|
source ${rootPath}/bin/activate
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
OSNAME=`bash ${rootPath}/scripts/getos.sh`
|
||||||
|
|
||||||
|
if [ "" == "$OSNAME" ];then
|
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "macos" != "$OSNAME" ];then
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
fi
|
||||||
|
|
||||||
|
Install_App()
|
||||||
|
{
|
||||||
|
|
||||||
|
echo '正在安装脚本文件...' > $install_tmp
|
||||||
|
mkdir -p $serverPath/source
|
||||||
|
mkdir -p $serverPath/dynamic-tracking
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# FlameGraph start
|
||||||
|
if [ ! -d $serverPath/dynamic-tracking/FlameGraph ];then
|
||||||
|
if [ ! -f $serverPath/source/FlameGraph.zip ]; then
|
||||||
|
wget --no-check-certificate -O $serverPath/source/FlameGraph.zip ${HTTP_PREFIX}github.com/brendangregg/FlameGraph/archive/refs/heads/master.zip
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $serverPath/source && unzip $serverPath/source/FlameGraph.zip
|
||||||
|
mv $serverPath/source/FlameGraph-master $serverPath/dynamic-tracking/FlameGraph
|
||||||
|
fi
|
||||||
|
# FlameGraph end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
shell_file=${curPath}/versions/${OSNAME}.sh
|
||||||
|
echo $shell_file
|
||||||
|
if [ ! -f $shell_file ];then
|
||||||
|
echo '不支持...' > $install_tmp
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
bash -x $shell_file
|
||||||
|
|
||||||
|
echo "cp -rf ${curPath}/shell $serverPath/dynamic-tracking"
|
||||||
|
cp -rf ${curPath}/shell $serverPath/dynamic-tracking
|
||||||
|
|
||||||
|
echo "${VERSION}" > $serverPath/dynamic-tracking/version.pl
|
||||||
|
echo '安装完成' > $install_tmp
|
||||||
|
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/dynamic-tracking/index.py start
|
||||||
|
# cd ${rootPath} && python3 ${rootPath}/plugins/dynamic-tracking/index.py initd_install
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Uninstall_App()
|
||||||
|
{
|
||||||
|
rm -rf $serverPath/dynamic-tracking
|
||||||
|
echo "Uninstall_App" > $install_tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
action=$1
|
||||||
|
if [ "${1}" == 'install' ];then
|
||||||
|
Install_App
|
||||||
|
else
|
||||||
|
Uninstall_App
|
||||||
|
fi
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
|
||||||
|
# debug
|
||||||
|
# cd /www/server/mdserver-web
|
||||||
|
# bash /www/server/mdserver-web/plugins/dynamic-tracking/shell/simple_macosx_trace.sh "22431"
|
||||||
|
|
||||||
|
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web
|
||||||
|
# bash /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/dynamic-tracking/shell/simple_macosx_trace.sh "22431"
|
||||||
|
|
||||||
|
# dtrace -x ustackframes=100 -n 'pid$target::mach_msg_trap:entry { @[ustack()] = count(); } tick-30s { exit(0); }' -p 18572 -o out.SystemUIServer_stacks
|
||||||
|
# /Users/midoks/Desktop/mwdev/server/dynamic-tracking/FlameGraph/stackcollapse.pl out.SystemUIServer_stacks > kernel.cbt
|
||||||
|
# /Users/midoks/Desktop/mwdev/server/dynamic-tracking/FlameGraph/flamegraph.pl kernel.cbt > kernel.svg
|
||||||
|
|
||||||
|
curPath=`pwd`
|
||||||
|
rootPath=$(dirname "$curPath")
|
||||||
|
serverPath=$(dirname "$rootPath")
|
||||||
|
|
||||||
|
sysName=`uname`
|
||||||
|
PID=$1
|
||||||
|
|
||||||
|
echo $rootPath # /Users/midoks/Desktop/mwdev/server
|
||||||
|
echo $curPath # /Users/midoks/Desktop/mwdev/server/mdserver-web
|
||||||
|
|
||||||
|
APP_DIR=${rootPath}/dynamic-tracking
|
||||||
|
DST_FILE_DIR=${APP_DIR}/trace/PID_${PID}
|
||||||
|
mkdir -p $DST_FILE_DIR
|
||||||
|
|
||||||
|
DST_FILE=${DST_FILE_DIR}/out.SystemUIServer_stacks
|
||||||
|
|
||||||
|
if [ ! -f $DST_FILE ];then
|
||||||
|
sudo dtrace -x ustackframes=100 -n 'pid$target::mach_msg_trap:entry { @[ustack()] = count(); } tick-30s { exit(0); }' -p "$PID" -o $DST_FILE
|
||||||
|
fi
|
||||||
|
|
||||||
|
${APP_DIR}/FlameGraph/stackcollapse.pl $DST_FILE > ${DST_FILE_DIR}/kernel.cbt
|
||||||
|
${APP_DIR}/FlameGraph/flamegraph.pl ${DST_FILE_DIR}/kernel.cbt > ${DST_FILE_DIR}/main.svg
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
|
||||||
|
# debug
|
||||||
|
# cd /www/server/mdserver-web
|
||||||
|
# bash /www/server/mdserver-web/plugins/dynamic-tracking/shell/simple_trace.sh "2401699"
|
||||||
|
|
||||||
|
|
||||||
|
curPath=`pwd`
|
||||||
|
rootPath=$(dirname "$curPath")
|
||||||
|
serverPath=$(dirname "$rootPath")
|
||||||
|
|
||||||
|
sysName=`uname`
|
||||||
|
PID=$1
|
||||||
|
|
||||||
|
echo $rootPath # /Users/midoks/Desktop/mwdev/server
|
||||||
|
echo $curPath # /Users/midoks/Desktop/mwdev/server/mdserver-web
|
||||||
|
|
||||||
|
APP_DIR=/www/server/dynamic-tracking
|
||||||
|
DST_FILE_DIR=${APP_DIR}/trace/PID_${PID}
|
||||||
|
mkdir -p $DST_FILE_DIR
|
||||||
|
|
||||||
|
# DST_FILE=${DST_FILE_DIR}/main.strace
|
||||||
|
|
||||||
|
# perf record -F 99 -p 335584 -g -- sleep 30
|
||||||
|
|
||||||
|
cd ${DST_FILE_DIR}
|
||||||
|
perf record -F 99 -p ${PID} -g -- sleep 30
|
||||||
|
|
||||||
|
perf script > out.perf
|
||||||
|
${APP_DIR}/FlameGraph/stackcollapse-perf.pl ${DST_FILE_DIR}/out.perf > ${DST_FILE_DIR}/out.folded
|
||||||
|
${APP_DIR}/FlameGraph/flamegraph.pl ${DST_FILE_DIR}/out.folded > ${DST_FILE_DIR}/main.svg
|
||||||
|
|
||||||
|
# perf record -F 99 -p 2401699 -g -- sleep 30
|
||||||
|
# perf script > out.perf
|
||||||
|
# /www/server/dynamic-tracking/FlameGraph/stackcollapse-perf.pl out.perf > out.folded
|
||||||
|
# /www/server/dynamic-tracking/FlameGraph/flamegraph.pl out.folded > php-zend-flame-graph.svg
|
||||||
|
|
||||||
|
# ${APP_DIR}/FlameGraph/stackcollapse.pl $DST_FILE > ${DST_FILE_DIR}/kernel.cbt
|
||||||
|
# ${APP_DIR}/FlameGraph/flamegraph.pl ${DST_FILE_DIR}/kernel.cbt > ${DST_FILE_DIR}/main.svg
|
||||||
|
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
.screen-all {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-right .panel-default{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-left .panel-default{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.data-collect {
|
||||||
|
width: 45px;
|
||||||
|
height: 30px;
|
||||||
|
border: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 2px;
|
||||||
|
margin-top: 10px;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #20a53a;
|
||||||
|
border-color: #20a53a;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#file_list .list {
|
||||||
|
list-style: none;
|
||||||
|
border-top: none;
|
||||||
|
border: 1px solid #ececec;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file_list .list li.active {
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file_list .tab-con{
|
||||||
|
padding: 0px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file_list .list li>span {
|
||||||
|
vertical-align: top;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file_list .list li {
|
||||||
|
display: inline-block;
|
||||||
|
height: 38px;
|
||||||
|
line-height: 38px;
|
||||||
|
color: #444;
|
||||||
|
border-bottom: 1px solid #ececec;
|
||||||
|
font-size: 13px;
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file_list .file {
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#file_list .list li .tootls{
|
||||||
|
width: 70px;
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 10px;
|
||||||
|
/* display: none; */
|
||||||
|
position: absolute;
|
||||||
|
right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*.tab-con .tab-block.on {
|
||||||
|
display: inline-block;
|
||||||
|
}*/
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
/* menu start */
|
||||||
|
.menu .current .menu_dynamic-tracking:hover {
|
||||||
|
background-image: url("/plugins/file?name=dynamic-tracking&f=ico.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu .menu_plugin_dynamic-tracking {
|
||||||
|
background-image: url("/plugins/file?name=dynamic-tracking&f=ico.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* menu end */
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<style>
|
||||||
|
.weblog{
|
||||||
|
font-size: 12px;
|
||||||
|
display:inline-block;
|
||||||
|
line-height:30px;
|
||||||
|
}
|
||||||
|
.weblog em{
|
||||||
|
font-style:normal;
|
||||||
|
color:#666;
|
||||||
|
margin: 0 30px;
|
||||||
|
}
|
||||||
|
.weblog span{
|
||||||
|
margin-right:5px;
|
||||||
|
}
|
||||||
|
.weblog a{
|
||||||
|
color:#20a53a;
|
||||||
|
}
|
||||||
|
.firewall-port-box{
|
||||||
|
margin-bottom:15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="main-content">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="pos-box bgw mtb15">
|
||||||
|
<div class="position f14 c9 pull-left">
|
||||||
|
<a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">动态追踪</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="search pull-right">
|
||||||
|
<form target="hid" onsubmit='return false;'>
|
||||||
|
<input type="text" id="searchValue" class="ser-text pull-left" placeholder="进程ID" />
|
||||||
|
<button type="button" class="data-collect pull-left">采样</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- //// -->
|
||||||
|
<div class="safe bgw pd15 mtb15" id="ff_box">
|
||||||
|
|
||||||
|
<div id="file_list" style="float:left;width:300px;">
|
||||||
|
<div class="tab-nav">
|
||||||
|
<span class="on">文件列表</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-con">
|
||||||
|
<div class="tab-block on">
|
||||||
|
<ul class="list" style="display: block; height: 94px;"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="flame_graph" style="float:left;">
|
||||||
|
<div class="tab-nav">
|
||||||
|
<span class="on">火焰图</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-con">
|
||||||
|
<iframe class="tab-block on" width="100%" height="100%"
|
||||||
|
src=""
|
||||||
|
frameborder="0"
|
||||||
|
border="0"
|
||||||
|
marginwidth="0"
|
||||||
|
marginheight="0"
|
||||||
|
scrolling="yes"
|
||||||
|
noresize=""
|
||||||
|
allowfullscreen="allowfullscreen"
|
||||||
|
mozallowfullscreen="mozallowfullscreen"
|
||||||
|
msallowfullscreen="msallowfullscreen"
|
||||||
|
oallowfullscreen="oallowfullscreen"
|
||||||
|
webkitallowfullscreen="webkitallowfullscreen"
|
||||||
|
allowfullscreen="true"></iframe>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- //// -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
+178
@@ -0,0 +1,178 @@
|
|||||||
|
function changeDivH(){
|
||||||
|
var l = $(window).height();
|
||||||
|
var w = $(window).width();
|
||||||
|
|
||||||
|
$('#ff_box').css('height',l-80-60);
|
||||||
|
|
||||||
|
$('#file_list').css('height',l-80-60);
|
||||||
|
$('#file_list .tab-con .list').css('height', l-80-60-70);
|
||||||
|
|
||||||
|
|
||||||
|
$('#flame_graph').css('height',l-80-60).css('width',w-300-200-40);
|
||||||
|
$('#flame_graph iframe').css('height',l-80-60-70);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
var tag = $.getUrlParam('tag');
|
||||||
|
if(tag == 'dynamic-tracking'){
|
||||||
|
dynamicTrackingLoad();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function dynamicTrackingLoad(){
|
||||||
|
changeDivH();
|
||||||
|
$(window).resize(function(){
|
||||||
|
changeDivH();
|
||||||
|
});
|
||||||
|
|
||||||
|
//加载采样数据列表
|
||||||
|
dtFileList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$('.data-collect').click(function(){
|
||||||
|
layer.msg('开始采样',{icon:0,time:2000});
|
||||||
|
var pid = $('#searchValue').val();
|
||||||
|
|
||||||
|
dtPost('simple_trace', '', {pid:pid}, function(rdata){
|
||||||
|
// console.log(rdata);
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
layer.msg(rdata['msg'],{icon:rdata['status']?1:2,time:2000,shade: [0.3, '#000']});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function dtPost(method, version, args,callback){
|
||||||
|
|
||||||
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||||
|
var req_data = {};
|
||||||
|
req_data['name'] = 'dynamic-tracking';
|
||||||
|
req_data['func'] = method;
|
||||||
|
req_data['version'] = version;
|
||||||
|
|
||||||
|
if (typeof(args) == 'string'){
|
||||||
|
req_data['args'] = JSON.stringify(toArrayObject(args));
|
||||||
|
} else {
|
||||||
|
req_data['args'] = JSON.stringify(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
$.post('/plugins/run', req_data, function(data) {
|
||||||
|
layer.close(loadT);
|
||||||
|
if (!data.status){
|
||||||
|
//错误展示10S
|
||||||
|
layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(typeof(callback) == 'function'){
|
||||||
|
callback(data);
|
||||||
|
}
|
||||||
|
},'json');
|
||||||
|
}
|
||||||
|
|
||||||
|
function dtPostCb(method, version, args,callback){
|
||||||
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||||
|
|
||||||
|
var pdata = {};
|
||||||
|
pdata['name'] = 'dynamic-tracking';
|
||||||
|
pdata['func'] = method;
|
||||||
|
args['version'] = version;
|
||||||
|
|
||||||
|
if (typeof(args) == 'string'){
|
||||||
|
pdata['args'] = JSON.stringify(toArrayObject(args));
|
||||||
|
} else {
|
||||||
|
pdata['args'] = JSON.stringify(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
$.post('/plugins/callback', pdata, function(data) {
|
||||||
|
layer.close(loadT);
|
||||||
|
if (!data.status){
|
||||||
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(typeof(callback) == 'function'){
|
||||||
|
callback(data);
|
||||||
|
}
|
||||||
|
},'json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function dtFileList(){
|
||||||
|
dtPost('file_list', '', {}, function(data){
|
||||||
|
var rdata = $.parseJSON(data.data);
|
||||||
|
var alist = rdata.data;
|
||||||
|
|
||||||
|
if (alist.length == 0){
|
||||||
|
var em ='<li class="data-file-list" style="text-align: center;">无数据</li>';
|
||||||
|
$('#file_list .list').html(em);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tli = '';
|
||||||
|
for (var i = 0; i < alist.length; i++) {
|
||||||
|
if (i==0){
|
||||||
|
tli +='<li title="双击打开浏览" class="data-file-list active" data-index="'+i+'" data-file="'+alist[i]['name']+'">\
|
||||||
|
<span class="file">'+alist[i]['name']+'</span>\
|
||||||
|
<span class="tootls">\
|
||||||
|
<span class="glyphicon glyphicon-link" aria-hidden="true" title="外部连接"></span>\
|
||||||
|
<span class="glyphicon glyphicon-trash" aria-hidden="true" title="删除"></span>\
|
||||||
|
</span>\
|
||||||
|
</li>';
|
||||||
|
} else{
|
||||||
|
tli +='<li class="data-file-list" data-index="'+i+'" data-file="'+alist[i]['name']+'">\
|
||||||
|
<span class="file">'+alist[i]['name']+'</span>\
|
||||||
|
<span class="tootls">\
|
||||||
|
<span class="glyphicon glyphicon-link" aria-hidden="true" title="外部连接"></span>\
|
||||||
|
<span class="glyphicon glyphicon-trash" aria-hidden="true" title="删除"></span>\
|
||||||
|
</span>\
|
||||||
|
</li>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#file_list .list').html(tli);
|
||||||
|
|
||||||
|
dtGetFile(alist[0]['name']);
|
||||||
|
$('#file_list li .file').click(function(){
|
||||||
|
$('#file_list li').removeClass('active');
|
||||||
|
$(this).parent().addClass('active');
|
||||||
|
var i = $(this).parent().data('index');
|
||||||
|
dtGetFile(alist[i]['name']);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$('#file_list li .glyphicon-link').click(function(){
|
||||||
|
var i = $(this).parent().parent().data('index');
|
||||||
|
var abs_p = alist[i]['abs_path'];
|
||||||
|
|
||||||
|
var durl = '/files/download?filename='+abs_p;
|
||||||
|
window.open(durl);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#file_list li .glyphicon-trash').click(function(){
|
||||||
|
var i = $(this).parent().parent().data('index');
|
||||||
|
var f = alist[i]['name'];
|
||||||
|
dtPost('remove_file_path', '',{file:f}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
layer.msg(rdata['msg'],{icon:rdata['status']?1:2,time:2000});
|
||||||
|
if (rdata.status){
|
||||||
|
dtFileList();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function dtGetFile(file){
|
||||||
|
dtPost('get_file_path', '', {file:file}, function(data){
|
||||||
|
var rdata = $.parseJSON(data.data);
|
||||||
|
// console.log(rdata);
|
||||||
|
if (!rdata.status){
|
||||||
|
layer.msg(rdata.msg,{icon:0,time:2000,shade: [2, '#000']});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var durl = '/files/download?filename='+rdata.data;
|
||||||
|
$('#flame_graph .tab-con .tab-block').attr('src',durl);
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#!/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
|
||||||
|
SYS_ARCH=`arch`
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#!/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
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
# apt-get install linux-perf
|
||||||
|
# apt-get update -y
|
||||||
|
# strace -p $(ps -ef|grep "pool www" | awk '{print $2}' | grep -v grep | tr '\n' ',' )
|
||||||
|
|
||||||
|
# perf record -F 99 -p 2401699 -g -- sleep 30
|
||||||
|
# perf script > out.perf
|
||||||
|
# /www/server/dynamic-tracking/FlameGraph/stackcollapse-perf.pl out.perf > out.folded
|
||||||
|
# /www/server/dynamic-tracking/FlameGraph/flamegraph.pl out.folded > php-zend-flame-graph.svg
|
||||||
|
|
||||||
|
# WWW_PID=$(ps -ef|grep "pool www" | awk '{print $2}' | grep -v grep | tr '\n' ',')
|
||||||
|
# WWW_PID=${WWW_PID//,/}
|
||||||
|
# WWW_PID=${var%,}
|
||||||
|
# perf record -F 99 -p "1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1127,1128,1129,1130,1131,1473,1768,2848,2962,21582,35891" \
|
||||||
|
# -g -- sleep 30
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/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
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
# 关于macosx使用dtrace
|
||||||
|
|
||||||
|
# https://groups.google.com/g/openresty/c/MswlH_8DDHA
|
||||||
|
# http://dtrace.org/blogs/brendan/2012/11/14/dtracing-in-anger/
|
||||||
|
|
||||||
|
|
||||||
|
# dtrace -x ustackframes=100 -n 'pid$target::mach_msg_trap:entry { @[ustack()] = count(); } tick-30s { exit(0); }' -p 18572 -o out.SystemUIServer_stacks
|
||||||
|
# /Users/midoks/Desktop/mwdev/server/dynamic-tracking/FlameGraph/stackcollapse.pl out.SystemUIServer_stacks > kernel.cbt
|
||||||
|
# /Users/midoks/Desktop/mwdev/server/dynamic-tracking/FlameGraph/flamegraph.pl kernel.cbt > kernel.svg
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#!/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
|
||||||
|
SYS_ARCH=`arch`
|
||||||
@@ -87,7 +87,7 @@ class backupTools:
|
|||||||
pid = mw.M('databases').dbPos(db_path, db_name).where(
|
pid = mw.M('databases').dbPos(db_path, db_name).where(
|
||||||
'name=?', (name,)).getField('id')
|
'name=?', (name,)).getField('id')
|
||||||
|
|
||||||
mw.M('backup').add('type,name,pid,filename,addtime,size', (1, os.path.basename(
|
mw.M('backup').add('type,name,pid,filename,addtime,size', (3, os.path.basename(
|
||||||
filename), pid, filename, endDate, os.path.getsize(filename)))
|
filename), pid, filename, endDate, os.path.getsize(filename)))
|
||||||
log = "数据库[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒"
|
log = "数据库[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒"
|
||||||
mw.writeLog('计划任务', log)
|
mw.writeLog('计划任务', log)
|
||||||
@@ -97,7 +97,7 @@ class backupTools:
|
|||||||
|
|
||||||
# 清理多余备份
|
# 清理多余备份
|
||||||
backups = mw.M('backup').where(
|
backups = mw.M('backup').where(
|
||||||
'type=? and pid=?', ('1', pid)).field('id,filename').select()
|
'type=? and pid=?', ('3', pid)).field('id,filename').select()
|
||||||
|
|
||||||
num = len(backups) - int(count)
|
num = len(backups) - int(count)
|
||||||
if num > 0:
|
if num > 0:
|
||||||
|
|||||||
+46
-11
@@ -31,8 +31,13 @@ def getServerDir():
|
|||||||
|
|
||||||
|
|
||||||
def getInitDFile():
|
def getInitDFile():
|
||||||
if app_debug:
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return '/tmp/' + getPluginName()
|
return '/tmp/' + getPluginName()
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
return '/etc/rc.d/' + getPluginName()
|
||||||
|
|
||||||
return '/etc/init.d/' + getPluginName()
|
return '/etc/init.d/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
@@ -88,7 +93,7 @@ def checkArgs(data, ck=[]):
|
|||||||
|
|
||||||
def status():
|
def status():
|
||||||
data = mw.execShell(
|
data = mw.execShell(
|
||||||
"ps -ef|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
"ps aux|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
||||||
if data[0] == '':
|
if data[0] == '':
|
||||||
return 'stop'
|
return 'stop'
|
||||||
return 'start'
|
return 'start'
|
||||||
@@ -113,8 +118,8 @@ def initDreplace():
|
|||||||
# systemd
|
# systemd
|
||||||
systemDir = mw.systemdCfgDir()
|
systemDir = mw.systemdCfgDir()
|
||||||
systemService = systemDir + '/memcached.service'
|
systemService = systemDir + '/memcached.service'
|
||||||
systemServiceTpl = getPluginDir() + '/init.d/memcached.service.tpl'
|
|
||||||
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
||||||
|
systemServiceTpl = getPluginDir() + '/init.d/memcached.service.tpl'
|
||||||
service_path = mw.getServerDir()
|
service_path = mw.getServerDir()
|
||||||
se_content = mw.readFile(systemServiceTpl)
|
se_content = mw.readFile(systemServiceTpl)
|
||||||
se_content = se_content.replace('{$SERVER_PATH}', service_path)
|
se_content = se_content.replace('{$SERVER_PATH}', service_path)
|
||||||
@@ -137,13 +142,20 @@ def initDreplace():
|
|||||||
def memOp(method):
|
def memOp(method):
|
||||||
file = initDreplace()
|
file = initDreplace()
|
||||||
|
|
||||||
if not mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
data = mw.execShell('systemctl ' + method + ' ' + getPluginName())
|
if current_os == "darwin":
|
||||||
|
data = mw.execShell(file + ' ' + method)
|
||||||
if data[1] == '':
|
if data[1] == '':
|
||||||
return 'ok'
|
return 'ok'
|
||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
data = mw.execShell(file + ' ' + method)
|
if current_os.startswith("freebsd"):
|
||||||
|
data = mw.execShell('service ' + getPluginName() + ' ' + method)
|
||||||
|
if data[1] == '':
|
||||||
|
return 'ok'
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
data = mw.execShell('systemctl ' + method + ' ' + getPluginName())
|
||||||
if data[1] == '':
|
if data[1] == '':
|
||||||
return 'ok'
|
return 'ok'
|
||||||
return data[1]
|
return data[1]
|
||||||
@@ -226,9 +238,15 @@ def saveConf():
|
|||||||
|
|
||||||
|
|
||||||
def initdStatus():
|
def initdStatus():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
if os.path.exists(initd_bin):
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
shell_cmd = 'systemctl status ' + \
|
shell_cmd = 'systemctl status ' + \
|
||||||
getPluginName() + ' | grep loaded | grep "enabled;"'
|
getPluginName() + ' | grep loaded | grep "enabled;"'
|
||||||
data = mw.execShell(shell_cmd)
|
data = mw.execShell(shell_cmd)
|
||||||
@@ -238,17 +256,34 @@ def initdStatus():
|
|||||||
|
|
||||||
|
|
||||||
def initdInstall():
|
def initdInstall():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
# freebsd initd install
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
import shutil
|
||||||
|
source_bin = initDreplace()
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
shutil.copyfile(source_bin, initd_bin)
|
||||||
|
mw.execShell('chmod +x ' + initd_bin)
|
||||||
|
mw.execShell('sysrc ' + getPluginName() + '_enable="YES"')
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl enable ' + getPluginName())
|
mw.execShell('systemctl enable ' + getPluginName())
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
def initdUinstall():
|
def initdUinstall():
|
||||||
if not app_debug:
|
current_os = mw.getOs()
|
||||||
if mw.isAppleSystem():
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
os.remove(initd_bin)
|
||||||
|
mw.execShell('sysrc ' + getPluginName() + '_enable="NO"')
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl disable ' + getPluginName())
|
mw.execShell('systemctl disable ' + getPluginName())
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ port = 27017
|
|||||||
fork = true
|
fork = true
|
||||||
auth = false
|
auth = false
|
||||||
|
|
||||||
# 5.0.2 - Master/slave replication is no longer supported
|
# Master/slave replication is no longer supported
|
||||||
#master = true
|
#master = true
|
||||||
|
|
||||||
pidfilepath = {$SERVER_PATH}/mongodb/mongodb.pid
|
pidfilepath = {$SERVER_PATH}/mongodb/mongodb.pid
|
||||||
|
|||||||
+37
-51
@@ -35,13 +35,8 @@ def getInitDFile():
|
|||||||
|
|
||||||
|
|
||||||
def getConf():
|
def getConf():
|
||||||
if mw.isAppleSystem():
|
path = getServerDir() + "/mongodb.conf"
|
||||||
path = getServerDir() + "/mongodb.conf"
|
return path
|
||||||
return path
|
|
||||||
|
|
||||||
if os.path.exists("/etc/mongodb.conf"):
|
|
||||||
return "/etc/mongodb.conf"
|
|
||||||
return "/etc/mongod.conf"
|
|
||||||
|
|
||||||
|
|
||||||
def getConfTpl():
|
def getConfTpl():
|
||||||
@@ -90,6 +85,14 @@ def initDreplace():
|
|||||||
os.mkdir(initD_path)
|
os.mkdir(initD_path)
|
||||||
file_bin = initD_path + '/' + getPluginName()
|
file_bin = initD_path + '/' + getPluginName()
|
||||||
|
|
||||||
|
logs_dir = getServerDir() + '/logs'
|
||||||
|
if not os.path.exists(logs_dir):
|
||||||
|
os.mkdir(logs_dir)
|
||||||
|
|
||||||
|
data_dir = getServerDir() + '/data'
|
||||||
|
if not os.path.exists(data_dir):
|
||||||
|
os.mkdir(data_dir)
|
||||||
|
|
||||||
# initd replace
|
# initd replace
|
||||||
content = mw.readFile(file_tpl)
|
content = mw.readFile(file_tpl)
|
||||||
content = content.replace('{$SERVER_PATH}', service_path)
|
content = content.replace('{$SERVER_PATH}', service_path)
|
||||||
@@ -101,6 +104,17 @@ def initDreplace():
|
|||||||
conf_content = conf_content.replace('{$SERVER_PATH}', service_path)
|
conf_content = conf_content.replace('{$SERVER_PATH}', service_path)
|
||||||
mw.writeFile(getServerDir() + '/mongodb.conf', conf_content)
|
mw.writeFile(getServerDir() + '/mongodb.conf', conf_content)
|
||||||
|
|
||||||
|
# systemd
|
||||||
|
systemDir = mw.systemdCfgDir()
|
||||||
|
systemService = systemDir + '/mongodb.service'
|
||||||
|
systemServiceTpl = getPluginDir() + '/init.d/mongodb.service.tpl'
|
||||||
|
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
||||||
|
service_path = mw.getServerDir()
|
||||||
|
se_content = mw.readFile(systemServiceTpl)
|
||||||
|
se_content = se_content.replace('{$SERVER_PATH}', service_path)
|
||||||
|
mw.writeFile(systemService, se_content)
|
||||||
|
mw.execShell('systemctl daemon-reload')
|
||||||
|
|
||||||
return file_bin
|
return file_bin
|
||||||
|
|
||||||
|
|
||||||
@@ -112,14 +126,10 @@ def mgOp(method):
|
|||||||
return 'ok'
|
return 'ok'
|
||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
cmd = 'systemctl ' + method + ' mongod'
|
data = mw.execShell('systemctl ' + method + ' ' + getPluginName())
|
||||||
if os.path.exists("/usr/lib/systemd/system/mongodb.service"):
|
|
||||||
cmd = 'systemctl ' + start + ' mongodb'
|
|
||||||
|
|
||||||
data = mw.execShell(cmd)
|
|
||||||
if data[1] == '':
|
if data[1] == '':
|
||||||
return 'ok'
|
return 'ok'
|
||||||
return data[1]
|
return 'fail'
|
||||||
|
|
||||||
|
|
||||||
def start():
|
def start():
|
||||||
@@ -162,13 +172,7 @@ def runInfo():
|
|||||||
result["version"] = serverStatus['version']
|
result["version"] = serverStatus['version']
|
||||||
result["uptime"] = serverStatus['uptime']
|
result["uptime"] = serverStatus['uptime']
|
||||||
|
|
||||||
result['db_path'] = '/var/lib/mongo'
|
result['db_path'] = getServerDir() + "/data"
|
||||||
|
|
||||||
if os.path.exists("/var/lib/mongodb"):
|
|
||||||
result['db_path'] = '/var/lib/mongodb'
|
|
||||||
|
|
||||||
if mw.isAppleSystem():
|
|
||||||
result['db_path'] = getServerDir() + "/data"
|
|
||||||
|
|
||||||
result["connections"] = serverStatus['connections']['current']
|
result["connections"] = serverStatus['connections']['current']
|
||||||
if 'catalogStats' in serverStatus:
|
if 'catalogStats' in serverStatus:
|
||||||
@@ -182,11 +186,7 @@ def initdStatus():
|
|||||||
if mw.isAppleSystem():
|
if mw.isAppleSystem():
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
shell_cmd = 'systemctl status mongod | grep loaded | grep "enabled;"'
|
shell_cmd = 'systemctl status mongodb | grep loaded | grep "enabled;"'
|
||||||
|
|
||||||
if os.path.exists("/usr/lib/systemd/system/mongodb.service"):
|
|
||||||
shell_cmd = 'systemctl status mongodb | grep loaded | grep "enabled;"'
|
|
||||||
|
|
||||||
data = mw.execShell(shell_cmd)
|
data = mw.execShell(shell_cmd)
|
||||||
if data[0] == '':
|
if data[0] == '':
|
||||||
return 'fail'
|
return 'fail'
|
||||||
@@ -197,10 +197,7 @@ def initdInstall():
|
|||||||
if mw.isAppleSystem():
|
if mw.isAppleSystem():
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
if os.path.exists("/usr/lib/systemd/system/mongodb.service"):
|
mw.execShell('systemctl enable mongodb')
|
||||||
mw.execShell('systemctl enable mongodb')
|
|
||||||
else:
|
|
||||||
mw.execShell('systemctl enable mongod')
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
@@ -208,24 +205,21 @@ def initdUinstall():
|
|||||||
if mw.isAppleSystem():
|
if mw.isAppleSystem():
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
if os.path.exists("/usr/lib/systemd/system/mongodb.service"):
|
mw.execShell('systemctl disable mongodb')
|
||||||
mw.execShell('systemctl disable mongodb')
|
|
||||||
else:
|
|
||||||
mw.execShell('systemctl disable mongod')
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
def runLog():
|
def runLog():
|
||||||
if mw.isAppleSystem():
|
f = getServerDir() + '/logs/mongodb.log'
|
||||||
return getServerDir() + '/logs/mongodb.log'
|
if os.path.exists(f):
|
||||||
|
return f
|
||||||
if os.path.exists("/var/log/mongodb/mongodb.log"):
|
return getServerDir() + '/logs.pl'
|
||||||
return "/var/log/mongodb/mongodb.log"
|
|
||||||
|
|
||||||
return "/var/log/mongodb/mongod.log"
|
|
||||||
|
|
||||||
|
|
||||||
def installPreInspection(version):
|
def installPreInspection(version):
|
||||||
|
if mw.isAppleSystem():
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
sys = mw.execShell(
|
sys = mw.execShell(
|
||||||
"cat /etc/*-release | grep PRETTY_NAME |awk -F = '{print $2}' | awk -F '\"' '{print $2}'| awk '{print $1}'")
|
"cat /etc/*-release | grep PRETTY_NAME |awk -F = '{print $2}' | awk -F '\"' '{print $2}'| awk '{print $1}'")
|
||||||
|
|
||||||
@@ -238,17 +232,9 @@ def installPreInspection(version):
|
|||||||
sysName = sys[0].strip().lower()
|
sysName = sys[0].strip().lower()
|
||||||
sysId = sys_id[0].strip()
|
sysId = sys_id[0].strip()
|
||||||
|
|
||||||
if not sysName in ('centos', 'fedora', 'ubuntu', 'debian'):
|
supportOs = ['centos', 'ubuntu', 'debian', 'opensuse']
|
||||||
return '暂时仅不支持{}'.format(sysName)
|
if not sysName in supportOs:
|
||||||
|
return '暂时仅支持{}'.format(','.join(supportOs))
|
||||||
if sysName == 'debian':
|
|
||||||
if version > 10:
|
|
||||||
return 'mongodb[' + version + ']不支持安装在debian[' + sysId + ']'
|
|
||||||
|
|
||||||
if sysName == 'ubuntu':
|
|
||||||
if version < 16:
|
|
||||||
return 'mongodb[' + version + ']不支持安装在ubuntu[' + sysId + ']'
|
|
||||||
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
"name": "mongodb",
|
"name": "mongodb",
|
||||||
"title": "Mongodb",
|
"title": "Mongodb",
|
||||||
"shell": "install.sh",
|
"shell": "install.sh",
|
||||||
"versions":["4.4","5.0"],
|
"install_pre_inspection":true,
|
||||||
"updates":["4.4","5.0"],
|
"versions":["4.4","5.0","6.0","7.0"],
|
||||||
"tip": "soft",
|
"tip": "soft",
|
||||||
"checks": "server/mongodb",
|
"checks": "server/mongodb",
|
||||||
"path": "server/mongodb",
|
"path": "server/mongodb",
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=MongoDB Database Server
|
||||||
|
Documentation=https://docs.mongodb.org/manual
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
#EnvironmentFile=-/etc/default/mongod
|
||||||
|
Environment="MONGODB_CONFIG_OVERRIDE_NOFORK=1"
|
||||||
|
PIDFile={$SERVER_PATH}/mongodb/mongodb.pid
|
||||||
|
ExecStart={$SERVER_PATH}/mongodb/bin/mongod -f {$SERVER_PATH}/mongodb/mongodb.conf
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
#RuntimeDirectory=mongodb
|
||||||
|
# file size
|
||||||
|
LimitFSIZE=infinity
|
||||||
|
# cpu time
|
||||||
|
LimitCPU=infinity
|
||||||
|
# virtual memory size
|
||||||
|
LimitAS=infinity
|
||||||
|
# open files
|
||||||
|
LimitNOFILE=64000
|
||||||
|
# processes/threads
|
||||||
|
LimitNPROC=64000
|
||||||
|
# locked memory
|
||||||
|
LimitMEMLOCK=infinity
|
||||||
|
# total threads (user+kernel)
|
||||||
|
TasksMax=infinity
|
||||||
|
TasksAccounting=false
|
||||||
|
|
||||||
|
# Recommended limits for mongod as specified in
|
||||||
|
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -30,8 +30,9 @@ app_start(){
|
|||||||
|
|
||||||
echo "Starting mongodb server..."
|
echo "Starting mongodb server..."
|
||||||
echo $EXEC -f $CONF
|
echo $EXEC -f $CONF
|
||||||
$EXEC -f $CONF >> {$SERVER_PATH}/mongodb/logs.pl 2>&1 &
|
$EXEC -f $CONF >> {$SERVER_PATH}/mongodb/logs.pl 1>&1 2>&1 &
|
||||||
}
|
}
|
||||||
|
|
||||||
app_stop(){
|
app_stop(){
|
||||||
if [ ! -f $PIDFILE ]
|
if [ ! -f $PIDFILE ]
|
||||||
then
|
then
|
||||||
@@ -42,10 +43,10 @@ app_stop(){
|
|||||||
kill -9 $PID
|
kill -9 $PID
|
||||||
while [ -x /proc/${PID} ]
|
while [ -x /proc/${PID} ]
|
||||||
do
|
do
|
||||||
echo "Waiting for Redis to shutdown ..."
|
echo "Waiting for mongodb to shutdown ..."
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
echo "Redis stopped"
|
echo "mongodb stopped"
|
||||||
rm -rf $PIDFILE
|
rm -rf $PIDFILE
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+287
@@ -0,0 +1,287 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
||||||
|
# cd /www/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
||||||
|
|
||||||
|
curPath=`pwd`
|
||||||
|
rootPath=$(dirname "$curPath")
|
||||||
|
rootPath=$(dirname "$rootPath")
|
||||||
|
serverPath=$(dirname "$rootPath")
|
||||||
|
|
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||||
|
VERSION=$2
|
||||||
|
|
||||||
|
sysName=`uname`
|
||||||
|
echo "use system: ${sysName}"
|
||||||
|
|
||||||
|
bash ${rootPath}/scripts/getos.sh
|
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl`
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
|
||||||
|
|
||||||
|
Install_app_mac()
|
||||||
|
{
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
if [ "$VERSION" == "5.0" ];then
|
||||||
|
G_VERSION="5.0.11"
|
||||||
|
elif [[ "$VERSION" == "4.4" ]]; then
|
||||||
|
G_VERSION="4.4.11"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $serverPath/source/mongodb-macos-x86_64-${G_VERSION}.tgz ];then
|
||||||
|
wget -O $serverPath/source/mongodb-macos-x86_64-${G_VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${G_VERSION}.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $serverPath/source && tar -zxvf mongodb-macos-x86_64-${G_VERSION}.tgz
|
||||||
|
cd mongodb-macos-x86_64-${G_VERSION} && mv ./* $serverPath/mongodb
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Install_Linux_Ubuntu()
|
||||||
|
{
|
||||||
|
##################### Ubuntu start #####################
|
||||||
|
if [ "$SYS_VERSION_ID" == "22" ]; then
|
||||||
|
echo "Not yet supported"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo $SYS_VERSION_ID
|
||||||
|
|
||||||
|
SOURCE_NAME=bionic
|
||||||
|
if [ "$SYS_VERSION_ID" == "18.04" ];then
|
||||||
|
SOURCE_NAME=bionic
|
||||||
|
elif [ "$SYS_VERSION_ID" == "16.04" ];then
|
||||||
|
SOURCE_NAME=xenial
|
||||||
|
elif [ "$SYS_VERSION_ID" == "20.04" ];then
|
||||||
|
SOURCE_NAME=focal
|
||||||
|
fi
|
||||||
|
|
||||||
|
# wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
|
||||||
|
# apt install -y gnupg
|
||||||
|
# touch /etc/apt/sources.list.d/mongodb-org-4.4.list
|
||||||
|
# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
|
||||||
|
|
||||||
|
|
||||||
|
wget -qO - https://www.mongodb.org/static/pgp/server-${VERSION}.asc | sudo apt-key add -
|
||||||
|
apt install -y gnupg
|
||||||
|
touch /etc/apt/sources.list.d/mongodb-org-${VERSION}.list
|
||||||
|
lsb_release -dc
|
||||||
|
|
||||||
|
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu ${SOURCE_NAME}/mongodb-org/${VERSION} multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-${VERSION}.list
|
||||||
|
|
||||||
|
apt update -y
|
||||||
|
apt install -y mongodb-org
|
||||||
|
##################### Ubuntu end #####################
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Uninstall_Linux_Ubuntu()
|
||||||
|
{
|
||||||
|
|
||||||
|
if [ -f /lib/systemd/system/mongod.service ] || [ -f /usr/lib/systemd/system/mongod.service ] ;then
|
||||||
|
systemctl stop mongod
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
apt purge -y mongodb-org*
|
||||||
|
apt autoremove -y
|
||||||
|
rm -r /var/log/mongodb
|
||||||
|
rm -r /var/lib/mongodb
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Install_Linux_Debian()
|
||||||
|
{
|
||||||
|
##################### debian start #####################
|
||||||
|
if [ "$SYS_VERSION_ID" -eq "11" ] && [ "$VERSION" -eq "4.4" ]; then
|
||||||
|
echo "Not yet supported"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ -f /usr/lib/systemd/system/mongod.service ];then
|
||||||
|
echo 'alreay install exist!'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
wget -qO - https://www.mongodb.org/static/pgp/server-${VERSION}.asc | sudo apt-key add -
|
||||||
|
apt install -y gnupg
|
||||||
|
wget -qO - https://www.mongodb.org/static/pgp/server-${VERSION}.asc | sudo apt-key add -
|
||||||
|
|
||||||
|
echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/${VERSION} main" | sudo tee /etc/apt/sources.list.d/mongodb-org-${VERSION}.list
|
||||||
|
|
||||||
|
apt update -y
|
||||||
|
apt install -y mongodb-org
|
||||||
|
|
||||||
|
|
||||||
|
echo "mongodb-org hold" | sudo dpkg --set-selections
|
||||||
|
echo "mongodb-org-server hold" | sudo dpkg --set-selections
|
||||||
|
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
|
||||||
|
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
|
||||||
|
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
|
||||||
|
|
||||||
|
##################### debian end #####################
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Uninstall_Linux_Debian()
|
||||||
|
{
|
||||||
|
systemctl stop mongod
|
||||||
|
apt purge -y mongodb-org*
|
||||||
|
apt autoremove -y
|
||||||
|
rm -r /var/log/mongodb
|
||||||
|
rm -r /var/lib/mongodb
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Install_Linux_Opensuse()
|
||||||
|
{
|
||||||
|
##################### opensuse start #####################
|
||||||
|
if [ "$SYS_VERSION_ID" -gt "15" ]; then
|
||||||
|
echo "Not yet supported"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ -f /usr/lib/systemd/system/mongod.service ];then
|
||||||
|
echo 'alreay exist!'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
rpm --import https://www.mongodb.org/static/pgp/server-${VERSION}.asc
|
||||||
|
zypper addrepo --gpgcheck "https://repo.mongodb.org/zypper/suse/15/mongodb-org/${VERSION}/x86_64/" mongodb
|
||||||
|
zypper -n install mongodb-org
|
||||||
|
# zypper install mongodb-org-4.4.15 mongodb-org-server-4.4.15 mongodb-org-shell-4.4.15 mongodb-org-mongos-4.4.15 mongodb-org-tools-4.4.15
|
||||||
|
|
||||||
|
|
||||||
|
##################### opensuse end #####################
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Uninstall_Linux_Opensuse()
|
||||||
|
{
|
||||||
|
systemctl stop mongod
|
||||||
|
zypper remove -y $(rpm -qa | grep mongodb-org)
|
||||||
|
rm -r /var/log/mongodb
|
||||||
|
rm -r /var/lib/mongo
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-org-server-5.0.4-1.el7.x86_64.rpm
|
||||||
|
Install_Linux_CentOS()
|
||||||
|
{
|
||||||
|
if [ -f /usr/lib/systemd/system/mongod.service ];then
|
||||||
|
echo 'alreay exist!'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
#清空mongo的repo源
|
||||||
|
rm -rf /etc/yum.repos.d/mongodb-org-*
|
||||||
|
##################### centos start #####################
|
||||||
|
echo "
|
||||||
|
[mongodb-org-${VERSION}]
|
||||||
|
name=MongoDB Repository
|
||||||
|
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/${VERSION}/x86_64/
|
||||||
|
gpgcheck=1
|
||||||
|
enabled=1
|
||||||
|
gpgkey=https://www.mongodb.org/static/pgp/server-${VERSION}.asc
|
||||||
|
" > /etc/yum.repos.d/mongodb-org-${VERSION}.repo
|
||||||
|
|
||||||
|
yum install -y mongodb-org
|
||||||
|
##################### centos end #####################
|
||||||
|
}
|
||||||
|
|
||||||
|
Uninstall_Linux_CentOS()
|
||||||
|
{
|
||||||
|
systemctl stop mongod
|
||||||
|
yum erase -y $(rpm -qa | grep mongodb-org)
|
||||||
|
rm -r /var/log/mongodb
|
||||||
|
rm -r /var/lib/mongo
|
||||||
|
rm -rf /etc/yum.repos.d/mongodb-org-${VERSION}.repo
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Install_app_linux()
|
||||||
|
{
|
||||||
|
if [ "$OSNAME" == "ubuntu" ];then
|
||||||
|
Install_Linux_Ubuntu
|
||||||
|
elif [ "$OSNAME" == "debian" ];then
|
||||||
|
Install_Linux_Debian
|
||||||
|
elif [ "$OSNAME" == "centos" ];then
|
||||||
|
Install_Linux_CentOS
|
||||||
|
elif [ "$OSNAME" == "opensuse" ];then
|
||||||
|
Install_Linux_Opensuse
|
||||||
|
else
|
||||||
|
echo "Not yet supported"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Install_app()
|
||||||
|
{
|
||||||
|
echo '正在安装脚本文件...' > $install_tmp
|
||||||
|
mkdir -p $serverPath/source
|
||||||
|
|
||||||
|
if [ "macos" == "$OSNAME" ];then
|
||||||
|
Install_app_mac
|
||||||
|
else
|
||||||
|
Install_app_linux
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$?" == "0" ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
echo "${VERSION}" > $serverPath/mongodb/version.pl
|
||||||
|
echo '安装完成' > $install_tmp
|
||||||
|
|
||||||
|
#初始化
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/mongodb/index.py start
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/mongodb/index.py initd_install
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Uninstall_app_linux()
|
||||||
|
{
|
||||||
|
##################
|
||||||
|
if [ "$OSNAME" == "ubuntu" ];then
|
||||||
|
Uninstall_Linux_Ubuntu
|
||||||
|
elif [ "$OSNAME" == "debian" ];then
|
||||||
|
Uninstall_Linux_Debian
|
||||||
|
elif [ "$OSNAME" == "centos" ];then
|
||||||
|
Uninstall_Linux_CentOS
|
||||||
|
elif [ "$OSNAME" == "opensuse" ];then
|
||||||
|
Uninstall_Linux_Opensuse
|
||||||
|
else
|
||||||
|
echo "ok"
|
||||||
|
fi
|
||||||
|
##################
|
||||||
|
}
|
||||||
|
|
||||||
|
Uninstall_app()
|
||||||
|
{
|
||||||
|
if [ "macos" == "$OSNAME" ];then
|
||||||
|
echo 'mac'
|
||||||
|
else
|
||||||
|
Uninstall_app_linux
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf $serverPath/mongodb
|
||||||
|
echo "Uninstall_mongodb" > $install_tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
action=$1
|
||||||
|
if [ "${1}" == 'install' ];then
|
||||||
|
Install_app
|
||||||
|
else
|
||||||
|
Uninstall_app
|
||||||
|
fi
|
||||||
Executable
+107
@@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
||||||
|
# cd /www/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
||||||
|
|
||||||
|
curPath=`pwd`
|
||||||
|
rootPath=$(dirname "$curPath")
|
||||||
|
rootPath=$(dirname "$rootPath")
|
||||||
|
serverPath=$(dirname "$rootPath")
|
||||||
|
|
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||||
|
VERSION=$2
|
||||||
|
|
||||||
|
sysName=`uname`
|
||||||
|
echo "use system: ${sysName}"
|
||||||
|
|
||||||
|
# bash ${rootPath}/scripts/getos.sh
|
||||||
|
# OSNAME=`cat ${rootPath}/data/osname.pl`
|
||||||
|
# SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
|
||||||
|
|
||||||
|
Install_app()
|
||||||
|
{
|
||||||
|
# ----- cpu start ------
|
||||||
|
if [ -z "${cpuCore}" ]; then
|
||||||
|
cpuCore="1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /proc/cpuinfo ];then
|
||||||
|
cpuCore=`cat /proc/cpuinfo | grep "processor" | wc -l`
|
||||||
|
fi
|
||||||
|
|
||||||
|
MEM_INFO=$(free -m|grep Mem|awk '{printf("%.f",($2)/1024)}')
|
||||||
|
if [ "${cpuCore}" != "1" ] && [ "${MEM_INFO}" != "0" ];then
|
||||||
|
if [ "${cpuCore}" -gt "${MEM_INFO}" ];then
|
||||||
|
cpuCore="${MEM_INFO}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
cpuCore="1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$cpuCore" -gt "2" ];then
|
||||||
|
cpuCore=`echo "$cpuCore" | awk '{printf("%.f",($1)*0.8)}'`
|
||||||
|
else
|
||||||
|
cpuCore="1"
|
||||||
|
fi
|
||||||
|
# ----- cpu end ------
|
||||||
|
|
||||||
|
echo '正在安装脚本文件...' > $install_tmp
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
cd ${rootPath}/plugins/php/lib && /bin/bash openssl.sh
|
||||||
|
echo "cd ${rootPath}/plugins/php/lib && /bin/bash openssl.sh"
|
||||||
|
export PKG_CONFIG_PATH=$serverPath/lib/openssl/lib/pkgconfig
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/mongodb-src-r${VERSION}.tar.gz ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/mongodb-src-r${VERSION}.tar.gz https://fastdl.mongodb.org/src/mongodb-src-r${VERSION}.tar.gz
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/mongodb-src-r${VERSION}.tar.gz https://fastdl.mongodb.org/src/mongodb-src-r${VERSION}.tar.gz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/mongodb-src-r${VERSION} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf $MG_DIR/mongodb-src-r${VERSION}.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $MG_DIR/mongodb-src-r${VERSION} && python3 -m pip install requirements_parser
|
||||||
|
cd $MG_DIR/mongodb-src-r${VERSION} && python3 -m pip install -r etc/pip/compile-requirements.txt
|
||||||
|
|
||||||
|
# cd $MG_DIR/mongodb-src-r${VERSION} && python3 buildscripts/scons.py all -j 2
|
||||||
|
# echo "cd $MG_DIR/mongodb-src-r${VERSION} && python3 buildscripts/scons.py all -j 2"
|
||||||
|
# cd $MG_DIR/mongodb-src-r${VERSION} && python3 buildscripts/scons.py all MONGO_VERSION=${VERSION} -j 4
|
||||||
|
|
||||||
|
|
||||||
|
cd $MG_DIR/mongodb-src-r${VERSION} && python3 buildscripts/scons.py install-mongod MONGO_VERSION=${VERSION} -j ${cpuCore}
|
||||||
|
cd $MG_DIR/mongodb-src-r${VERSION} && python3 buildscripts/scons.py DESTDIR=$serverPath/mongodb install-mongod MONGO_VERSION=${VERSION} \
|
||||||
|
--ssl=off
|
||||||
|
echo "cd $MG_DIR/mongodb-src-r${VERSION} && python3 buildscripts/scons.py DESTDIR=$serverPath/mongodb install MONGO_VERSION=${VERSION} \
|
||||||
|
--ssl=off CPPPATH=$serverPath/lib/openssl/include \
|
||||||
|
LIBPATH=$serverPath/lib/openssl/lib"
|
||||||
|
|
||||||
|
if [ "$?" == "0" ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
echo "${VERSION}" > $serverPath/mongodb/version.pl
|
||||||
|
echo '安装完成' > $install_tmp
|
||||||
|
|
||||||
|
#初始化
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/mongodb/index.py start
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/mongodb/index.py initd_install
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Uninstall_app()
|
||||||
|
{
|
||||||
|
|
||||||
|
rm -rf $serverPath/mongodb
|
||||||
|
echo "Uninstall_mongodb" > $install_tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
action=$1
|
||||||
|
if [ "${1}" == 'install' ];then
|
||||||
|
Install_app
|
||||||
|
else
|
||||||
|
Uninstall_app
|
||||||
|
fi
|
||||||
+51
-240
@@ -2,8 +2,15 @@
|
|||||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
export PATH
|
export PATH
|
||||||
|
|
||||||
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
# https://www.mongodb.com/try/download/community
|
||||||
# cd /www/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
|
||||||
|
'''
|
||||||
|
cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4
|
||||||
|
cd /www/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 7.0
|
||||||
|
|
||||||
|
cd /www/server/mdserver-web && python3 /www/server/mdserver-web/plugins/mongodb/index.py start
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
curPath=`pwd`
|
curPath=`pwd`
|
||||||
rootPath=$(dirname "$curPath")
|
rootPath=$(dirname "$curPath")
|
||||||
@@ -16,230 +23,48 @@ VERSION=$2
|
|||||||
sysName=`uname`
|
sysName=`uname`
|
||||||
echo "use system: ${sysName}"
|
echo "use system: ${sysName}"
|
||||||
|
|
||||||
bash ${rootPath}/scripts/getos.sh
|
OSNAME=`bash ${rootPath}/scripts/getos.sh`
|
||||||
OSNAME=`cat ${rootPath}/data/osname.pl`
|
|
||||||
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
|
||||||
|
|
||||||
|
if [ "" == "$OSNAME" ];then
|
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Install_app_mac()
|
|
||||||
{
|
|
||||||
mkdir -p $serverPath/mongodb
|
|
||||||
if [ "$VERSION" == "5.0" ];then
|
|
||||||
G_VERSION="5.0.11"
|
|
||||||
elif [[ "$VERSION" == "4.4" ]]; then
|
|
||||||
G_VERSION="4.4.11"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f $serverPath/source/mongodb-macos-x86_64-${G_VERSION}.tgz ];then
|
|
||||||
wget -O $serverPath/source/mongodb-macos-x86_64-${G_VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${G_VERSION}.tgz
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd $serverPath/source && tar -zxvf mongodb-macos-x86_64-${G_VERSION}.tgz
|
|
||||||
cd mongodb-macos-x86_64-${G_VERSION} && mv ./* $serverPath/mongodb
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Install_Linux_Ubuntu()
|
|
||||||
{
|
|
||||||
##################### Ubuntu start #####################
|
|
||||||
if [ "$SYS_VERSION_ID" == "22" ]; then
|
|
||||||
echo "Not yet supported"
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "macos" != "$OSNAME" ];then
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
|
||||||
echo $SYS_VERSION_ID
|
|
||||||
|
|
||||||
SOURCE_NAME=bionic
|
|
||||||
if [ "$SYS_VERSION_ID" == "18.04" ];then
|
|
||||||
SOURCE_NAME=bionic
|
|
||||||
elif [ "$SYS_VERSION_ID" == "16.04" ];then
|
|
||||||
SOURCE_NAME=xenial
|
|
||||||
elif [ "$SYS_VERSION_ID" == "20.04" ];then
|
|
||||||
SOURCE_NAME=focal
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
|
|
||||||
# apt install -y gnupg
|
|
||||||
# touch /etc/apt/sources.list.d/mongodb-org-4.4.list
|
|
||||||
# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
|
|
||||||
|
|
||||||
|
|
||||||
wget -qO - https://www.mongodb.org/static/pgp/server-${VERSION}.asc | sudo apt-key add -
|
|
||||||
apt install -y gnupg
|
|
||||||
touch /etc/apt/sources.list.d/mongodb-org-${VERSION}.list
|
|
||||||
lsb_release -dc
|
|
||||||
|
|
||||||
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu ${SOURCE_NAME}/mongodb-org/${VERSION} multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-${VERSION}.list
|
|
||||||
|
|
||||||
apt update -y
|
|
||||||
apt install -y mongodb-org
|
|
||||||
##################### Ubuntu end #####################
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Uninstall_Linux_Ubuntu()
|
|
||||||
{
|
|
||||||
|
|
||||||
if [ -f /lib/systemd/system/mongod.service ] || [ -f /usr/lib/systemd/system/mongod.service ] ;then
|
|
||||||
systemctl stop mongod
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
apt purge -y mongodb-org*
|
|
||||||
apt autoremove -y
|
|
||||||
rm -r /var/log/mongodb
|
|
||||||
rm -r /var/lib/mongodb
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Install_Linux_Debian()
|
|
||||||
{
|
|
||||||
##################### debian start #####################
|
|
||||||
if [ "$SYS_VERSION_ID" -eq "11" ] && [ "$VERSION" -eq "4.4" ]; then
|
|
||||||
echo "Not yet supported"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ -f /usr/lib/systemd/system/mongod.service ];then
|
|
||||||
echo 'alreay install exist!'
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
wget -qO - https://www.mongodb.org/static/pgp/server-${VERSION}.asc | sudo apt-key add -
|
|
||||||
apt install -y gnupg
|
|
||||||
wget -qO - https://www.mongodb.org/static/pgp/server-${VERSION}.asc | sudo apt-key add -
|
|
||||||
|
|
||||||
echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/${VERSION} main" | sudo tee /etc/apt/sources.list.d/mongodb-org-${VERSION}.list
|
|
||||||
|
|
||||||
apt update -y
|
|
||||||
apt install -y mongodb-org
|
|
||||||
|
|
||||||
|
|
||||||
echo "mongodb-org hold" | sudo dpkg --set-selections
|
|
||||||
echo "mongodb-org-server hold" | sudo dpkg --set-selections
|
|
||||||
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
|
|
||||||
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
|
|
||||||
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
|
|
||||||
|
|
||||||
##################### debian end #####################
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Uninstall_Linux_Debian()
|
|
||||||
{
|
|
||||||
systemctl stop mongod
|
|
||||||
apt purge -y mongodb-org*
|
|
||||||
apt autoremove -y
|
|
||||||
rm -r /var/log/mongodb
|
|
||||||
rm -r /var/lib/mongodb
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Install_Linux_Opensuse()
|
|
||||||
{
|
|
||||||
##################### opensuse start #####################
|
|
||||||
if [ "$SYS_VERSION_ID" -gt "15" ]; then
|
|
||||||
echo "Not yet supported"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ -f /usr/lib/systemd/system/mongod.service ];then
|
|
||||||
echo 'alreay exist!'
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
rpm --import https://www.mongodb.org/static/pgp/server-${VERSION}.asc
|
|
||||||
zypper addrepo --gpgcheck "https://repo.mongodb.org/zypper/suse/15/mongodb-org/${VERSION}/x86_64/" mongodb
|
|
||||||
zypper -n install mongodb-org
|
|
||||||
# zypper install mongodb-org-4.4.15 mongodb-org-server-4.4.15 mongodb-org-shell-4.4.15 mongodb-org-mongos-4.4.15 mongodb-org-tools-4.4.15
|
|
||||||
|
|
||||||
|
|
||||||
##################### opensuse end #####################
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Uninstall_Linux_Opensuse()
|
|
||||||
{
|
|
||||||
systemctl stop mongod
|
|
||||||
zypper remove -y $(rpm -qa | grep mongodb-org)
|
|
||||||
rm -r /var/log/mongodb
|
|
||||||
rm -r /var/lib/mongo
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-org-server-5.0.4-1.el7.x86_64.rpm
|
|
||||||
Install_Linux_CentOS()
|
|
||||||
{
|
|
||||||
if [ -f /usr/lib/systemd/system/mongod.service ];then
|
|
||||||
echo 'alreay exist!'
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
#清空mongo的repo源
|
|
||||||
rm -rf /etc/yum.repos.d/mongodb-org-*
|
|
||||||
##################### centos start #####################
|
|
||||||
echo "
|
|
||||||
[mongodb-org-${VERSION}]
|
|
||||||
name=MongoDB Repository
|
|
||||||
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/${VERSION}/x86_64/
|
|
||||||
gpgcheck=1
|
|
||||||
enabled=1
|
|
||||||
gpgkey=https://www.mongodb.org/static/pgp/server-${VERSION}.asc
|
|
||||||
" > /etc/yum.repos.d/mongodb-org-${VERSION}.repo
|
|
||||||
|
|
||||||
yum install -y mongodb-org
|
|
||||||
##################### centos end #####################
|
|
||||||
}
|
|
||||||
|
|
||||||
Uninstall_Linux_CentOS()
|
|
||||||
{
|
|
||||||
systemctl stop mongod
|
|
||||||
yum erase -y $(rpm -qa | grep mongodb-org)
|
|
||||||
rm -r /var/log/mongodb
|
|
||||||
rm -r /var/lib/mongo
|
|
||||||
rm -rf /etc/yum.repos.d/mongodb-org-${VERSION}.repo
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Install_app_linux()
|
|
||||||
{
|
|
||||||
if [ "$OSNAME" == "ubuntu" ];then
|
|
||||||
Install_Linux_Ubuntu
|
|
||||||
elif [ "$OSNAME" == "debian" ];then
|
|
||||||
Install_Linux_Debian
|
|
||||||
elif [ "$OSNAME" == "centos" ];then
|
|
||||||
Install_Linux_CentOS
|
|
||||||
elif [ "$OSNAME" == "opensuse" ];then
|
|
||||||
Install_Linux_Opensuse
|
|
||||||
else
|
|
||||||
echo "Not yet supported"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Install_app()
|
Install_app()
|
||||||
{
|
{
|
||||||
echo '正在安装脚本文件...' > $install_tmp
|
echo '正在安装脚本文件...' > $install_tmp
|
||||||
mkdir -p $serverPath/source
|
mkdir -p $serverPath/source
|
||||||
|
|
||||||
if [ "macos" == "$OSNAME" ];then
|
# if id mongodb &> /dev/null ;then
|
||||||
Install_app_mac
|
# echo "mongodb uid is `id -u mongodb`"
|
||||||
|
# echo "mongodb shell is `grep "^mongodb:" /etc/passwd |cut -d':' -f7 `"
|
||||||
|
# else
|
||||||
|
# groupadd mongodb
|
||||||
|
# useradd -g mongodb mongodb
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# if [ "centos" == "$OSNAME" ];then
|
||||||
|
# OSNAME=rhel
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# if [ "fedora" == "$OSNAME" ];then
|
||||||
|
# OSNAME=rhel
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# if [ "rocky" == "$OSNAME" ];then
|
||||||
|
# OSNAME=rhel
|
||||||
|
# fi
|
||||||
|
|
||||||
|
shell_file=${curPath}/versions/${VERSION}/${OSNAME}.sh
|
||||||
|
|
||||||
|
if [ -f $shell_file ];then
|
||||||
|
bash -x $shell_file
|
||||||
else
|
else
|
||||||
Install_app_linux
|
echo '不支持...' > $install_tmp
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$?" == "0" ];then
|
if [ "$?" == "0" ];then
|
||||||
@@ -253,34 +78,20 @@ Install_app()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Uninstall_app_linux()
|
|
||||||
{
|
|
||||||
##################
|
|
||||||
if [ "$OSNAME" == "ubuntu" ];then
|
|
||||||
Uninstall_Linux_Ubuntu
|
|
||||||
elif [ "$OSNAME" == "debian" ];then
|
|
||||||
Uninstall_Linux_Debian
|
|
||||||
elif [ "$OSNAME" == "centos" ];then
|
|
||||||
Uninstall_Linux_CentOS
|
|
||||||
elif [ "$OSNAME" == "opensuse" ];then
|
|
||||||
Uninstall_Linux_Opensuse
|
|
||||||
else
|
|
||||||
echo "ok"
|
|
||||||
fi
|
|
||||||
##################
|
|
||||||
}
|
|
||||||
|
|
||||||
Uninstall_app()
|
Uninstall_app()
|
||||||
{
|
{
|
||||||
if [ "macos" == "$OSNAME" ];then
|
cd ${rootPath} && python3 ${rootPath}/plugins/mongodb/index.py stop
|
||||||
echo 'mac'
|
rm -rf $serverPath/mongodb
|
||||||
else
|
|
||||||
Uninstall_app_linux
|
|
||||||
|
if [ -f /usr/lib/systemd/system/mongodb.service ] || [ -f /lib/systemd/system/mongodb.service ];then
|
||||||
|
systemctl stop mongodb
|
||||||
|
systemctl disable mongodb
|
||||||
|
rm -rf /usr/lib/systemd/system/mongodb.service
|
||||||
|
rm -rf /lib/systemd/system/mongodb.service
|
||||||
|
systemctl daemon-reload
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -rf $serverPath/mongodb
|
|
||||||
echo "Uninstall_mongodb" > $install_tmp
|
echo "Uninstall_mongodb" > $install_tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
#!/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=4.4.23
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
SYS_NAME_LEN=`echo "$SYS_NAME" | wc -L`
|
||||||
|
|
||||||
|
if [ "$SYS_NAME_LEN" == "1" ];then
|
||||||
|
SYS_NAME=${SYS_NAME}0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_ARCH" == "aarch64" ];then
|
||||||
|
if [ "$SYS_NAME" -gt "82" ];then
|
||||||
|
SYS_NAME="82"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "62" ];then
|
||||||
|
SYS_NAME="62"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "80" ];then
|
||||||
|
SYS_NAME="80"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "70" ];then
|
||||||
|
SYS_NAME="70"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-aarch64-rhel82-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-aarch64-rhel82-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.23.tgz
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-rhel${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -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
|
||||||
|
VERSION=4.4.23
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "10" ];then
|
||||||
|
SYS_NAME="10"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "10" ];then
|
||||||
|
SYS_NAME="10"
|
||||||
|
fi
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-debian${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME_TGZ} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME}} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#!/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=4.4.23
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/mongodb-macos-x86_64-${VERSION} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#!/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=4.4.23
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}' | awk -F . '{print $1}'`
|
||||||
|
|
||||||
|
SYS_NAME="15"
|
||||||
|
if [ "$SYS_VERSION_ID" -gt "15" ];then
|
||||||
|
SYS_NAME="15"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "12" ];then
|
||||||
|
SYS_NAME="12"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse15-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse12-4.4.23.tgz
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-suse${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#!/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=4.4.23
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
SYS_NAME_LEN=`echo "$SYS_NAME" | wc -L`
|
||||||
|
|
||||||
|
if [ "$SYS_NAME_LEN" == "1" ];then
|
||||||
|
SYS_NAME=${SYS_NAME}0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.23.tgz
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-ubuntu${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#!/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=4.4.23
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.23.tgz
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "2004" ];then
|
||||||
|
SYS_NAME="2004"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "1604" ];then
|
||||||
|
SYS_NAME="1604"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-ubuntu${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#!/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=5.0.20
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
SYS_NAME_LEN=`echo "$SYS_NAME" | wc -L`
|
||||||
|
|
||||||
|
if [ "$SYS_NAME_LEN" == "1" ];then
|
||||||
|
SYS_NAME=${SYS_NAME}0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_ARCH" == "aarch64" ];then
|
||||||
|
SYS_NAME="82"
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "80" ];then
|
||||||
|
SYS_NAME="80"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "70" ];then
|
||||||
|
SYS_NAME="70"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-rhel${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -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
|
||||||
|
VERSION=5.0.20
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "11" ];then
|
||||||
|
SYS_NAME="11"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "10" ];then
|
||||||
|
SYS_NAME="10"
|
||||||
|
fi
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-debian${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME_TGZ} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME}} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#!/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=5.0.20
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/mongodb-macos-x86_64-${VERSION} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#!/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=5.0.20
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}' | awk -F . '{print $1}'`
|
||||||
|
|
||||||
|
SYS_NAME="15"
|
||||||
|
if [ "$SYS_VERSION_ID" -gt "15" ];then
|
||||||
|
SYS_NAME="15"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "12" ];then
|
||||||
|
SYS_NAME="12"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse15-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse12-4.4.23.tgz
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-suse${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#!/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=5.0.20
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.23.tgz
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "2004" ];then
|
||||||
|
SYS_NAME="2004"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "1804" ];then
|
||||||
|
SYS_NAME="1804"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-ubuntu${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#!/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=6.0.9
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
SYS_NAME_LEN=`echo "$SYS_NAME" | wc -L`
|
||||||
|
|
||||||
|
if [ "$SYS_NAME_LEN" == "1" ];then
|
||||||
|
SYS_NAME=${SYS_NAME}0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_ARCH" == "aarch64" ];then
|
||||||
|
if [ "$SYS_NAME" -gt "90" ];then
|
||||||
|
SYS_NAME="90"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "82" ];then
|
||||||
|
SYS_NAME="82"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "90" ];then
|
||||||
|
SYS_NAME="90"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "70" ];then
|
||||||
|
SYS_NAME="70"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-rhel${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -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
|
||||||
|
VERSION=6.0.9
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "11" ];then
|
||||||
|
SYS_NAME="11"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "10" ];then
|
||||||
|
SYS_NAME="10"
|
||||||
|
fi
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-debian${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME_TGZ} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME}} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#!/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=6.0.9
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/mongodb-macos-x86_64-${VERSION} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#!/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=6.0.9
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}' | awk -F . '{print $1}'`
|
||||||
|
|
||||||
|
SYS_NAME="15"
|
||||||
|
if [ "$SYS_VERSION_ID" -gt "15" ];then
|
||||||
|
SYS_NAME="15"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "12" ];then
|
||||||
|
SYS_NAME="12"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse15-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse12-4.4.23.tgz
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-suse${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#!/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=6.0.9
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.23.tgz
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "2204" ];then
|
||||||
|
SYS_NAME="2204"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "1804" ];then
|
||||||
|
SYS_NAME="1804"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-ubuntu${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#!/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=7.0.0
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
SYS_NAME_LEN=`echo "$SYS_NAME" | wc -L`
|
||||||
|
|
||||||
|
if [ "$SYS_NAME_LEN" == "1" ];then
|
||||||
|
SYS_NAME=${SYS_NAME}0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_ARCH" == "aarch64" ];then
|
||||||
|
if [ "$SYS_NAME" -gt "90" ];then
|
||||||
|
SYS_NAME="90"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "82" ];then
|
||||||
|
SYS_NAME="82"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "90" ];then
|
||||||
|
SYS_NAME="90"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "70" ];then
|
||||||
|
SYS_NAME="70"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-rhel${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -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
|
||||||
|
VERSION=7.0.0
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "11" ];then
|
||||||
|
SYS_NAME="11"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "11" ];then
|
||||||
|
SYS_NAME="11"
|
||||||
|
fi
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-debian${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME_TGZ} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME}} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#!/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=7.0.0
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/mongodb-macos-x86_64-${VERSION}.tgz https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-${VERSION}.tgz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/mongodb-macos-x86_64-${VERSION} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf mongodb-macos-x86_64-${VERSION}.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#!/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=7.0.0
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}' | awk -F . '{print $1}'`
|
||||||
|
|
||||||
|
SYS_NAME="15"
|
||||||
|
if [ "$SYS_VERSION_ID" -gt "15" ];then
|
||||||
|
SYS_NAME="15"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "12" ];then
|
||||||
|
SYS_NAME="12"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse15-4.4.23.tgz
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-suse12-4.4.23.tgz
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-suse${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#!/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=7.0.0
|
||||||
|
SYS_ARCH=`arch`
|
||||||
|
|
||||||
|
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
SYS_NAME=${SYS_VERSION_ID/./}
|
||||||
|
# https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.23.tgz
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -gt "2204" ];then
|
||||||
|
SYS_NAME="2204"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SYS_NAME" -lt "2004" ];then
|
||||||
|
SYS_NAME="2004"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MG_DIR=$serverPath/source/mongodb
|
||||||
|
mkdir -p $MG_DIR
|
||||||
|
|
||||||
|
FILE_NAME=mongodb-linux-${SYS_ARCH}-ubuntu${SYS_NAME}-${VERSION}
|
||||||
|
FILE_NAME_TGZ=${FILE_NAME}.tgz
|
||||||
|
|
||||||
|
if [ ! -f $MG_DIR/${FILE_NAME_TGZ} ]; then
|
||||||
|
wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}
|
||||||
|
echo "wget --no-check-certificate -O $MG_DIR/${FILE_NAME_TGZ} https://fastdl.mongodb.org/linux/${FILE_NAME_TGZ}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $MG_DIR/${FILE_NAME} ];then
|
||||||
|
cd $MG_DIR && tar -zxvf ${FILE_NAME_TGZ}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $serverPath/mongodb/bin ];then
|
||||||
|
mkdir -p $serverPath/mongodb
|
||||||
|
cd $MG_DIR/${FILE_NAME} && cp -rf ./bin $serverPath/mongodb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,820 @@
|
|||||||
|
# coding:utf-8
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
import io
|
||||||
|
|
||||||
|
sys.path.append(os.getcwd() + "/class/core")
|
||||||
|
import mw
|
||||||
|
|
||||||
|
import oauthlib
|
||||||
|
import requests
|
||||||
|
import datetime
|
||||||
|
from requests_oauthlib import OAuth2Session
|
||||||
|
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
|
|
||||||
|
def setDebug(d=False):
|
||||||
|
DEBUG = d
|
||||||
|
|
||||||
|
|
||||||
|
class UnauthorizedError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ObjectNotFoundError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class msodclient:
|
||||||
|
|
||||||
|
plugin_dir = ''
|
||||||
|
server_dir = ''
|
||||||
|
credential_file = 'credentials.json'
|
||||||
|
user_conf = "user.conf"
|
||||||
|
token_file = 'token.pickle'
|
||||||
|
|
||||||
|
def __init__(self, plugin_dir, server_dir):
|
||||||
|
self.plugin_dir = plugin_dir
|
||||||
|
self.server_dir = server_dir
|
||||||
|
self.load()
|
||||||
|
|
||||||
|
def setDebug(self, d=False):
|
||||||
|
DEBUG = d
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
credential_path = os.path.join(self.plugin_dir, self.credential_file)
|
||||||
|
credential = json.loads(mw.readFile(credential_path))
|
||||||
|
# print(credential)
|
||||||
|
self.credential = credential["onedrive-international"]
|
||||||
|
|
||||||
|
self.authorize_url = '{0}{1}'.format(
|
||||||
|
self.credential['authority'],
|
||||||
|
self.credential['authorize_endpoint'])
|
||||||
|
self.token_url = '{0}{1}'.format(
|
||||||
|
self.credential['authority'],
|
||||||
|
self.credential['token_endpoint'])
|
||||||
|
|
||||||
|
self.token_path = os.path.join(self.server_dir, self.token_file)
|
||||||
|
self.root_uri = self.credential["api_uri"] + "/me/drive/root"
|
||||||
|
|
||||||
|
self.backup_path = 'backup'
|
||||||
|
|
||||||
|
def store_token(self, token):
|
||||||
|
"""存储token"""
|
||||||
|
enstr = mw.enDoubleCrypt('msodc', json.dumps(token))
|
||||||
|
mw.writeFile(self.token_path, enstr)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_store_token(self):
|
||||||
|
rdata = mw.readFile(self.token_path)
|
||||||
|
destr = mw.deDoubleCrypt('msodc', rdata)
|
||||||
|
return json.loads(destr)
|
||||||
|
|
||||||
|
def clear_token(self):
|
||||||
|
"""清除token记录"""
|
||||||
|
try:
|
||||||
|
if os.path.isfile(self.token_path):
|
||||||
|
os.remove(self.token_path)
|
||||||
|
except:
|
||||||
|
if DEBUG:
|
||||||
|
print("清除token失败。")
|
||||||
|
|
||||||
|
def refresh_token(self, origin_token):
|
||||||
|
"""刷新token"""
|
||||||
|
|
||||||
|
os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '1'
|
||||||
|
os.environ['OAUTHLIB_IGNORE_SCOPE_CHANGE'] = '1'
|
||||||
|
refresh_token = origin_token["refresh_token"]
|
||||||
|
aad_auth = OAuth2Session(
|
||||||
|
self.credential["client_id"],
|
||||||
|
scope=self.credential["scopes"],
|
||||||
|
redirect_uri=self.credential["redirect_uri"])
|
||||||
|
|
||||||
|
new_token = aad_auth.refresh_token(
|
||||||
|
self.token_url,
|
||||||
|
refresh_token=refresh_token,
|
||||||
|
client_id=self.credential["client_id"],
|
||||||
|
client_secret=self.credential["client_secret"])
|
||||||
|
return new_token
|
||||||
|
|
||||||
|
def get_token_from_authorized_url(self, authorized_url, expected_state=None):
|
||||||
|
"""通过授权编码获取访问token"""
|
||||||
|
|
||||||
|
# 忽略token scope与已请求的scope不一致
|
||||||
|
os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '1'
|
||||||
|
os.environ['OAUTHLIB_IGNORE_SCOPE_CHANGE'] = '1'
|
||||||
|
aad_auth = OAuth2Session(self.credential["client_id"],
|
||||||
|
state=expected_state,
|
||||||
|
scope=self.credential['scopes'],
|
||||||
|
redirect_uri=self.credential['redirect_uri'])
|
||||||
|
|
||||||
|
token = aad_auth.fetch_token(
|
||||||
|
self.token_url,
|
||||||
|
client_secret=self.credential["client_secret"],
|
||||||
|
authorization_response=authorized_url)
|
||||||
|
|
||||||
|
return token
|
||||||
|
|
||||||
|
def get_token(self):
|
||||||
|
token = self.get_store_token()
|
||||||
|
now = time.time()
|
||||||
|
|
||||||
|
expire_time = token["expires_at"] - 300
|
||||||
|
if now >= expire_time:
|
||||||
|
new_token = self.refresh_token(token)
|
||||||
|
self.store_token(new_token)
|
||||||
|
return new_token
|
||||||
|
|
||||||
|
return token
|
||||||
|
|
||||||
|
def get_sign_in_url(self):
|
||||||
|
"""生成签名地址"""
|
||||||
|
|
||||||
|
# Initialize the OAuth client
|
||||||
|
aad_auth = OAuth2Session(self.credential["client_id"],
|
||||||
|
scope=self.credential['scopes'],
|
||||||
|
redirect_uri=self.credential['redirect_uri'])
|
||||||
|
|
||||||
|
sign_in_url, state = aad_auth.authorization_url(self.authorize_url,
|
||||||
|
prompt='login')
|
||||||
|
|
||||||
|
return sign_in_url, state
|
||||||
|
|
||||||
|
def get_authorized_header(self):
|
||||||
|
token_obj = self.get_token()
|
||||||
|
token = token_obj["access_token"]
|
||||||
|
header = {
|
||||||
|
"Authorization": "Bearer " + token,
|
||||||
|
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) '
|
||||||
|
'AppleWebKit/537.36 (KHTML, like Gecko) '
|
||||||
|
'Chrome/67.0.3396.99 Safari/537.36'
|
||||||
|
}
|
||||||
|
return header
|
||||||
|
|
||||||
|
def get_user_from_ms(self):
|
||||||
|
"""查询用户信息"""
|
||||||
|
try:
|
||||||
|
headers = self.get_authorized_header()
|
||||||
|
user_api_base = self.credential["api_uri"] + "/me"
|
||||||
|
# select_user_info_uri = self.build_uri(base=user_api_base)
|
||||||
|
response = requests.get(user_api_base, headers=headers)
|
||||||
|
if DEBUG:
|
||||||
|
print("Debug get user:")
|
||||||
|
print(response.status_code)
|
||||||
|
print(response.text)
|
||||||
|
if response.status_code == 200:
|
||||||
|
response_data = response.json()
|
||||||
|
user_principal_name = response_data["userPrincipalName"]
|
||||||
|
return user_principal_name
|
||||||
|
except oauthlib.oauth2.rfc6749.errors.InvalidGrantError:
|
||||||
|
self.clear_auth()
|
||||||
|
if DEBUG:
|
||||||
|
print("用户授权已过期。")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def clear_auth(self):
|
||||||
|
self.clear_token()
|
||||||
|
self.clear_user()
|
||||||
|
|
||||||
|
def clear_user(self):
|
||||||
|
try:
|
||||||
|
# 清空user
|
||||||
|
path = os.path.join(self.server_dir, self.user_conf)
|
||||||
|
if os.path.isfile(path):
|
||||||
|
os.remove(path)
|
||||||
|
except:
|
||||||
|
if DEBUG:
|
||||||
|
print("清除user失败。")
|
||||||
|
|
||||||
|
def store_user(self):
|
||||||
|
"""更新并存储用户信息"""
|
||||||
|
user = self.get_user_from_ms()
|
||||||
|
if user:
|
||||||
|
path = os.path.join(self.server_dir, self.user_conf)
|
||||||
|
mw.writeFile(path, user)
|
||||||
|
else:
|
||||||
|
raise RuntimeError("无法获取用户信息。")
|
||||||
|
|
||||||
|
# --------------------- 文件操作功能 ----------------------
|
||||||
|
|
||||||
|
# 取目录路径
|
||||||
|
def get_path(self, path):
|
||||||
|
sep = ":"
|
||||||
|
if path == '/':
|
||||||
|
path = ''
|
||||||
|
if path[-1:] == '/':
|
||||||
|
path = path[:-1]
|
||||||
|
if path[:1] != "/" and path[:1] != sep:
|
||||||
|
path = "/" + path
|
||||||
|
if path == '/':
|
||||||
|
path = ''
|
||||||
|
# if path[:1] != sep:
|
||||||
|
# path = sep + path
|
||||||
|
try:
|
||||||
|
from urllib.parse import quote
|
||||||
|
except:
|
||||||
|
from urllib import quote
|
||||||
|
# path = quote(path)
|
||||||
|
|
||||||
|
return path.replace('//', '/')
|
||||||
|
|
||||||
|
def build_uri(self, path="", operate=None, base=None):
|
||||||
|
"""构建请求URL
|
||||||
|
|
||||||
|
API请求URI格式参考:
|
||||||
|
https://graph.microsoft.com/v1.0/me/drive/root:/bt_backup/:content
|
||||||
|
--------------------------------------------- ---------- --------
|
||||||
|
base path operate
|
||||||
|
各部分之间用“:”连接。
|
||||||
|
:param path 子资源路径
|
||||||
|
:param operate 对文件进行的操作,比如content,children
|
||||||
|
:return 请求url
|
||||||
|
"""
|
||||||
|
|
||||||
|
if base is None:
|
||||||
|
base = self.root_uri
|
||||||
|
path = self.get_path(path)
|
||||||
|
sep = ":"
|
||||||
|
if operate:
|
||||||
|
if operate[:1] != "/":
|
||||||
|
operate = "/" + operate
|
||||||
|
|
||||||
|
if path:
|
||||||
|
uri = base + sep + path
|
||||||
|
if operate:
|
||||||
|
uri += sep + operate
|
||||||
|
else:
|
||||||
|
uri = base
|
||||||
|
if operate:
|
||||||
|
uri += operate
|
||||||
|
|
||||||
|
return uri
|
||||||
|
|
||||||
|
def get_list(self, path="/"):
|
||||||
|
"""获取存储空间中的所有文件对象"""
|
||||||
|
|
||||||
|
list_uri = self.build_uri(path, operate="/children")
|
||||||
|
if DEBUG:
|
||||||
|
print("List uri:")
|
||||||
|
print(list_uri)
|
||||||
|
|
||||||
|
data = []
|
||||||
|
response = requests.get(list_uri, headers=self.get_authorized_header())
|
||||||
|
status_code = response.status_code
|
||||||
|
if status_code == 200:
|
||||||
|
if DEBUG:
|
||||||
|
print("DEBUG:")
|
||||||
|
print(response.json())
|
||||||
|
response_data = response.json()
|
||||||
|
drive_items = response_data["value"]
|
||||||
|
|
||||||
|
for item in drive_items:
|
||||||
|
tmp = {}
|
||||||
|
tmp['name'] = item["name"]
|
||||||
|
tmp['size'] = item["size"]
|
||||||
|
if "folder" in item:
|
||||||
|
# print("{} is folder:".format(item["name"]))
|
||||||
|
# print(item["folder"])
|
||||||
|
tmp["type"] = None
|
||||||
|
tmp['download'] = ""
|
||||||
|
if "file" in item:
|
||||||
|
tmp["type"] = "File"
|
||||||
|
tmp['download'] = item["@microsoft.graph.downloadUrl"]
|
||||||
|
# print("{} is file:".format(item["name"]))
|
||||||
|
# print(item["file"])
|
||||||
|
|
||||||
|
formats = ["%Y-%m-%dT%H:%M:%S.%fZ", "%Y-%m-%dT%H:%M:%SZ"]
|
||||||
|
t = None
|
||||||
|
for time_format in formats:
|
||||||
|
try:
|
||||||
|
t = datetime.datetime.strptime(
|
||||||
|
item["lastModifiedDateTime"], time_format)
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
t += datetime.timedelta(hours=8)
|
||||||
|
ts = int(
|
||||||
|
(time.mktime(t.timetuple()) + t.microsecond / 1000000.0))
|
||||||
|
tmp['time'] = ts
|
||||||
|
data.append(tmp)
|
||||||
|
|
||||||
|
mlist = {'path': path, 'list': data}
|
||||||
|
return mlist
|
||||||
|
|
||||||
|
def get_object(self, object_name):
|
||||||
|
"""查询对象信息"""
|
||||||
|
try:
|
||||||
|
get_uri = self.build_uri(path=object_name)
|
||||||
|
if DEBUG:
|
||||||
|
print("Get uri:")
|
||||||
|
print(get_uri)
|
||||||
|
response = requests.get(get_uri,
|
||||||
|
headers=self.get_authorized_header())
|
||||||
|
if response.status_code in [200]:
|
||||||
|
response_data = response.json()
|
||||||
|
if DEBUG:
|
||||||
|
print("Object info:")
|
||||||
|
print(response_data)
|
||||||
|
return response_data
|
||||||
|
if response.status_code == 404:
|
||||||
|
if DEBUG:
|
||||||
|
print("对象不存在。")
|
||||||
|
if DEBUG:
|
||||||
|
print("Get Object debug:")
|
||||||
|
print(response.status_code)
|
||||||
|
print(response.text)
|
||||||
|
except Exception as e:
|
||||||
|
if DEBUG:
|
||||||
|
print("Get object has excepiton:")
|
||||||
|
print(e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def is_folder(self, obj):
|
||||||
|
if "folder" in obj:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def delete_object_by_os(self, object_name):
|
||||||
|
"""删除对象
|
||||||
|
|
||||||
|
:param object_name:
|
||||||
|
:return: True 删除成功
|
||||||
|
其他 删除失败
|
||||||
|
"""
|
||||||
|
obj = self.get_object(object_name)
|
||||||
|
if obj is None:
|
||||||
|
if DEBUG:
|
||||||
|
print("对象不存在,删除操作未执行。")
|
||||||
|
return True
|
||||||
|
if self.is_folder(obj):
|
||||||
|
child_count = obj["folder"]["childCount"]
|
||||||
|
if child_count > 0:
|
||||||
|
if DEBUG:
|
||||||
|
print("文件夹不是空文件夹无法删除。")
|
||||||
|
return False
|
||||||
|
|
||||||
|
headers = self.get_authorized_header()
|
||||||
|
delete_uri = self.build_uri(object_name)
|
||||||
|
response = requests.delete(delete_uri, headers=headers)
|
||||||
|
if response.status_code == 204:
|
||||||
|
if DEBUG:
|
||||||
|
print("对象: {} 已被删除。".format(object_name))
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def delete_object(self, object_name, retries=2):
|
||||||
|
"""删除对象
|
||||||
|
|
||||||
|
:param object_name:
|
||||||
|
:param retries: 重试次数,默认2次
|
||||||
|
:return: True 删除成功
|
||||||
|
其他 删除失败
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
return self.delete_object_by_os(object_name)
|
||||||
|
except Exception as e:
|
||||||
|
print("删除文件异常:")
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
# 重试
|
||||||
|
if retries > 0:
|
||||||
|
print("重新尝试删除文件{}...".format(object_name))
|
||||||
|
return self.delete_object(
|
||||||
|
object_name,
|
||||||
|
retries=retries - 1)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def build_object_name(self, data_type, file_name):
|
||||||
|
"""根据数据类型构建对象存储名称
|
||||||
|
|
||||||
|
:param data_type:
|
||||||
|
:param file_name:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
prefix_dict = {
|
||||||
|
"site": "web",
|
||||||
|
"database": "db",
|
||||||
|
"path": "path",
|
||||||
|
}
|
||||||
|
file_regx = prefix_dict.get(data_type) + "_(.+)_20\d+_\d+(?:\.|_)"
|
||||||
|
sub_search = re.search(file_regx, file_name)
|
||||||
|
sub_path_name = ""
|
||||||
|
if sub_search:
|
||||||
|
sub_path_name = sub_search.groups()[0]
|
||||||
|
sub_path_name += '/'
|
||||||
|
|
||||||
|
# 构建OS存储路径
|
||||||
|
object_name = self.backup_path + '/' + \
|
||||||
|
data_type + '/' + \
|
||||||
|
sub_path_name + \
|
||||||
|
file_name
|
||||||
|
|
||||||
|
if object_name[:1] == "/":
|
||||||
|
object_name = object_name[1:]
|
||||||
|
|
||||||
|
return object_name
|
||||||
|
|
||||||
|
def delete_file(self, file_name, data_type=None):
|
||||||
|
"""删除文件
|
||||||
|
|
||||||
|
根据传入的文件名称和文件数据类型构建对象名称,再删除
|
||||||
|
:param file_name:
|
||||||
|
:param data_type: 数据类型 site/database/path
|
||||||
|
:return: True 删除成功
|
||||||
|
其他 删除失败
|
||||||
|
"""
|
||||||
|
|
||||||
|
object_name = self.build_object_name(data_type, file_name)
|
||||||
|
return self.delete_object(object_name)
|
||||||
|
|
||||||
|
def create_dir_by_step(self, parent_folder, sub_folder):
|
||||||
|
create_uri = self.build_uri(path=parent_folder, operate="/children")
|
||||||
|
|
||||||
|
if DEBUG:
|
||||||
|
print("Create dir uri:")
|
||||||
|
print(create_uri)
|
||||||
|
post_data = {
|
||||||
|
"name": sub_folder,
|
||||||
|
"folder": {"@odata.type": "microsoft.graph.folder"},
|
||||||
|
"@microsoft.graph.conflictBehavior": "fail"
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = self.get_authorized_header()
|
||||||
|
headers.update({"Content-type": "application/json"})
|
||||||
|
response = requests.post(create_uri, headers=headers, json=post_data)
|
||||||
|
if response.status_code in [201, 409]:
|
||||||
|
if DEBUG:
|
||||||
|
if response.status_code == 409:
|
||||||
|
print("目录:{} 已经存在。".format(sub_folder))
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
if DEBUG:
|
||||||
|
print("目录:{} 创建失败:".format(sub_folder))
|
||||||
|
print(response.status_code)
|
||||||
|
print(response.text)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def create_dir(self, dir_name):
|
||||||
|
"""创建远程目录
|
||||||
|
|
||||||
|
# API 请求结构
|
||||||
|
# POST /me/drive/root/children
|
||||||
|
# or
|
||||||
|
# POST /me/drive/root:/bt_backup/:/children
|
||||||
|
# Content - Type: application / json
|
||||||
|
|
||||||
|
# {
|
||||||
|
# "name": "New Folder",
|
||||||
|
# "folder": {},
|
||||||
|
# "@microsoft.graph.conflictBehavior": "rename"
|
||||||
|
# }
|
||||||
|
|
||||||
|
# Response: status code == 201 新创建/ 409 已存在
|
||||||
|
# @microsoft.graph.conflictBehavior: fail/rename/replace
|
||||||
|
|
||||||
|
:param dir_name: 目录名称
|
||||||
|
:param parent_id: 父目录ID
|
||||||
|
:return: True/False
|
||||||
|
"""
|
||||||
|
|
||||||
|
dir_name = self.get_path(dir_name.strip())
|
||||||
|
onedrive_business_reserved = r"[\*<>?:|#%]"
|
||||||
|
if re.search(onedrive_business_reserved, dir_name) \
|
||||||
|
or dir_name[-1] == "." or dir_name[:1] == "~":
|
||||||
|
if DEBUG:
|
||||||
|
print("文件夹名称包含非法字符。")
|
||||||
|
return False
|
||||||
|
|
||||||
|
parent_folder = self.get_path(os.path.split(dir_name)[0])
|
||||||
|
sub_folder = os.path.split(dir_name)[1]
|
||||||
|
|
||||||
|
# print("create_dir:", dir_name)
|
||||||
|
obj = self.get_object(dir_name)
|
||||||
|
# 判断对象是否存在
|
||||||
|
if obj is None:
|
||||||
|
if not self.create_dir_by_step(parent_folder, sub_folder):
|
||||||
|
|
||||||
|
# 兼容OneDrive 商业版文件夹创建
|
||||||
|
folder_array = dir_name.split("/")
|
||||||
|
parent_folder = self.get_path(folder_array[0])
|
||||||
|
for i in range(1, len(folder_array)):
|
||||||
|
sub_folder = folder_array[i]
|
||||||
|
if DEBUG:
|
||||||
|
print("Parent folder: {}".format(parent_folder))
|
||||||
|
print("Sub folder: {}".format(sub_folder))
|
||||||
|
if self.create_dir_by_step(parent_folder, sub_folder):
|
||||||
|
parent_folder += "/" + folder_array[i]
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
if self.is_folder(obj):
|
||||||
|
if DEBUG:
|
||||||
|
print("文件夹已存在。")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def resumable_upload(self,
|
||||||
|
local_file_name,
|
||||||
|
object_name=None,
|
||||||
|
progress_callback=None,
|
||||||
|
progress_file_name=None,
|
||||||
|
multipart_threshold=1024 * 1024 * 2,
|
||||||
|
part_size=1024 * 1024 * 5,
|
||||||
|
store_dir="/tmp",
|
||||||
|
auto_cancel=True,
|
||||||
|
retries=5,
|
||||||
|
):
|
||||||
|
"""断点续传
|
||||||
|
|
||||||
|
:param local_file_name: 本地文件名称
|
||||||
|
:param object_name: 指定OS中存储的对象名称
|
||||||
|
:param part_size: 指定分片上传的每个分片的大小。必须是320*1024的整数倍。
|
||||||
|
:param multipart_threshold: 文件长度大于该值时,则用分片上传。
|
||||||
|
:param progress_callback: 进度回调函数,默认是把进度信息输出到标准输出。
|
||||||
|
:param progress_file_name: 进度信息保存文件,进度格式参见[report_progress]
|
||||||
|
:param store_dir: 上传分片存储目录, 默认/tmp。
|
||||||
|
:param auto_cancel: 当备份失败是否自动取消上传记录
|
||||||
|
:param retries: 上传重试次数
|
||||||
|
:return: True上传成功/False or None上传失败
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
file_size_separation_value = 4 * 1024 * 1024
|
||||||
|
if part_size % 320 != 0:
|
||||||
|
if DEBUG:
|
||||||
|
print("Part size 必须是320的整数倍。")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if object_name is None:
|
||||||
|
temp_file_name = os.path.split(local_file_name)[1]
|
||||||
|
object_name = os.path.join(self.backup_path, temp_file_name)
|
||||||
|
|
||||||
|
# if progress_file_name:
|
||||||
|
# os.environ[PROGRESS_FILE_NAME] = progress_file_name
|
||||||
|
# progress_callback = report_progress
|
||||||
|
|
||||||
|
print("|-正在上传到 {}...".format(object_name))
|
||||||
|
dir_name = os.path.split(object_name)[0]
|
||||||
|
if not self.create_dir(dir_name):
|
||||||
|
if DEBUG:
|
||||||
|
print("目录创建失败!")
|
||||||
|
return False
|
||||||
|
|
||||||
|
local_file_size = os.path.getsize(local_file_name)
|
||||||
|
# if local_file_size < file_size_separation_value:
|
||||||
|
if False:
|
||||||
|
# 小文件上传
|
||||||
|
upload_uri = self.build_uri(path=object_name,
|
||||||
|
operate="/content")
|
||||||
|
if DEBUG:
|
||||||
|
print("Upload uri:")
|
||||||
|
print(upload_uri)
|
||||||
|
headers = self.get_authorized_header()
|
||||||
|
# headers.update({
|
||||||
|
# "Content-Type": "application/octet-stream"
|
||||||
|
# })
|
||||||
|
# files = {"file": (object_name, open(local_file_name, "rb"))}
|
||||||
|
file_data = open(local_file_name, "rb")
|
||||||
|
response = requests.put(upload_uri,
|
||||||
|
headers=headers,
|
||||||
|
data=file_data)
|
||||||
|
if DEBUG:
|
||||||
|
print("status code:")
|
||||||
|
print(response.status_code)
|
||||||
|
# print(response.text)
|
||||||
|
if response.status_code in [201, 200]:
|
||||||
|
if DEBUG:
|
||||||
|
print("文件上传成功!")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
# 大文件上传
|
||||||
|
|
||||||
|
# 1. 创建上传session
|
||||||
|
create_session_uri = self.build_uri(
|
||||||
|
path=object_name,
|
||||||
|
operate="createUploadSession")
|
||||||
|
headers = self.get_authorized_header()
|
||||||
|
response = requests.post(create_session_uri, headers=headers)
|
||||||
|
if response.status_code == 200:
|
||||||
|
response_data = response.json()
|
||||||
|
upload_url = response_data["uploadUrl"]
|
||||||
|
expiration_date_time = response_data["expirationDateTime"]
|
||||||
|
|
||||||
|
if DEBUG:
|
||||||
|
print("上传session已建立。")
|
||||||
|
print("Upload url: {}".format(upload_url))
|
||||||
|
print("Expiration datetime: {}".format(
|
||||||
|
expiration_date_time))
|
||||||
|
|
||||||
|
# 2. 分片上传文件
|
||||||
|
requests.adapters.DEFAULT_RETRIES = 1
|
||||||
|
session = requests.session()
|
||||||
|
session.keep_alive = False
|
||||||
|
|
||||||
|
# 开始分片上传
|
||||||
|
import math
|
||||||
|
parts = int(math.ceil(local_file_size / part_size))
|
||||||
|
for i in range(parts):
|
||||||
|
if DEBUG:
|
||||||
|
if i == parts - 1:
|
||||||
|
num = "最后"
|
||||||
|
else:
|
||||||
|
num = "第{}".format(i + 1)
|
||||||
|
print("正在上传{}部分...".format(num))
|
||||||
|
|
||||||
|
upload_range_start = i * part_size
|
||||||
|
upload_range_end = min(upload_range_start + part_size,
|
||||||
|
local_file_size)
|
||||||
|
content_length = upload_range_end - upload_range_start
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) '
|
||||||
|
'AppleWebKit/537.36 (KHTML, like Gecko) '
|
||||||
|
'Chrome/67.0.3396.99 Safari/537.36'
|
||||||
|
}
|
||||||
|
# 开发记录
|
||||||
|
# Content-Range和标准的http请求头中的Range作用有所不同
|
||||||
|
# Content-Range是OneDrive自定义的分片上传标识,格式也不一样
|
||||||
|
headers.update({
|
||||||
|
"Content-Length": repr(content_length),
|
||||||
|
"Content-Range": "bytes {}-{}/{}".format(
|
||||||
|
upload_range_start,
|
||||||
|
upload_range_end - 1,
|
||||||
|
local_file_size),
|
||||||
|
"Content-Type": "application/octet-stream"
|
||||||
|
})
|
||||||
|
|
||||||
|
if DEBUG:
|
||||||
|
print("Headers:")
|
||||||
|
print(headers)
|
||||||
|
|
||||||
|
'''# TODO 优化read的读取占用内存'''
|
||||||
|
f = io.open(local_file_name, "rb")
|
||||||
|
f.seek(upload_range_start)
|
||||||
|
upload_data = f.read(content_length)
|
||||||
|
sub_response = session.put(upload_url,
|
||||||
|
headers=headers,
|
||||||
|
data=upload_data)
|
||||||
|
|
||||||
|
expected_status_code = [200, 201, 202]
|
||||||
|
if sub_response.status_code in expected_status_code:
|
||||||
|
if DEBUG:
|
||||||
|
print("Response status code: {}, "
|
||||||
|
"bytes {}-{} 已上传成功。".format(
|
||||||
|
sub_response.status_code,
|
||||||
|
upload_range_start,
|
||||||
|
upload_range_end - 1)
|
||||||
|
)
|
||||||
|
print(sub_response.text)
|
||||||
|
if sub_response.status_code in [200, 201]:
|
||||||
|
if DEBUG:
|
||||||
|
print("文件 {} 上传成功。".format(object_name))
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(sub_response.status_code)
|
||||||
|
print(sub_response.text)
|
||||||
|
_error_msg = "Bytes {}-{} 分片上传失败。".format(
|
||||||
|
upload_range_start,
|
||||||
|
upload_range_end
|
||||||
|
)
|
||||||
|
if self.error_msg:
|
||||||
|
self.error_msg += r"\n"
|
||||||
|
self.error_msg += _error_msg
|
||||||
|
raise RuntimeError(_error_msg)
|
||||||
|
|
||||||
|
time.sleep(0.5)
|
||||||
|
else:
|
||||||
|
raise RuntimeError("session创建失败。")
|
||||||
|
|
||||||
|
except UnauthorizedError as e:
|
||||||
|
_error_msg = str(e)
|
||||||
|
if self.error_msg:
|
||||||
|
self.error_msg += r"\n"
|
||||||
|
self.error_msg += _error_msg
|
||||||
|
print(_error_msg)
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
print("文件上传出现错误:")
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
if self.error_msg:
|
||||||
|
self.error_msg += r"\n"
|
||||||
|
self.error_msg += "文件{}上传出现错误:{}".format(object_name, str(e))
|
||||||
|
|
||||||
|
try:
|
||||||
|
if upload_url:
|
||||||
|
if DEBUG:
|
||||||
|
print("正在清理上传session.")
|
||||||
|
session.delete(upload_url)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
f.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
session.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 重试断点续传
|
||||||
|
if retries > 0:
|
||||||
|
print("重试上传文件....")
|
||||||
|
return self.resumable_upload(
|
||||||
|
local_file_name,
|
||||||
|
object_name=object_name,
|
||||||
|
store_dir=store_dir,
|
||||||
|
part_size=part_size,
|
||||||
|
multipart_threshold=multipart_threshold,
|
||||||
|
progress_callback=progress_callback,
|
||||||
|
progress_file_name=progress_file_name,
|
||||||
|
retries=retries - 1,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if self.error_msg:
|
||||||
|
self.error_msg += r"\n"
|
||||||
|
self.error_msg += "文件{}上传失败。".format(object_name)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def upload_abs_file(self, file_name, remote_dir, *args, **kwargs):
|
||||||
|
"""按照数据类型上传文件
|
||||||
|
|
||||||
|
:param file_name: 上传文件名称
|
||||||
|
:param data_type: 数据类型 site/database/path
|
||||||
|
:return: True/False
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
import re
|
||||||
|
# 根据数据类型提取子分类名称
|
||||||
|
# 比如data_type=database,子分类名称是数据库的名称。
|
||||||
|
# 提取方式是从file_name中利用正则规则去提取。
|
||||||
|
self.error_msg = ""
|
||||||
|
|
||||||
|
file_name = os.path.abspath(file_name)
|
||||||
|
temp_name = os.path.split(file_name)[1]
|
||||||
|
object_name = 'backup/' + temp_name
|
||||||
|
|
||||||
|
print(file_name)
|
||||||
|
print(object_name)
|
||||||
|
|
||||||
|
return self.resumable_upload(file_name,
|
||||||
|
object_name=object_name,
|
||||||
|
*args,
|
||||||
|
**kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
if self.error_msg:
|
||||||
|
self.error_msg += r"\n"
|
||||||
|
self.error_msg += "文件上传出现错误:{}".format(str(e))
|
||||||
|
return False
|
||||||
|
|
||||||
|
def upload_file(self, file_name, data_type, *args, **kwargs):
|
||||||
|
"""按照数据类型上传文件
|
||||||
|
|
||||||
|
:param file_name: 上传文件名称
|
||||||
|
:param data_type: 数据类型 site/database/path
|
||||||
|
:return: True/False
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
import re
|
||||||
|
# 根据数据类型提取子分类名称
|
||||||
|
# 比如data_type=database,子分类名称是数据库的名称。
|
||||||
|
# 提取方式是从file_name中利用正则规则去提取。
|
||||||
|
self.error_msg = ""
|
||||||
|
|
||||||
|
if not file_name or not data_type:
|
||||||
|
_error_msg = "文件参数错误。"
|
||||||
|
print(_error_msg)
|
||||||
|
self.error_msg = _error_msg
|
||||||
|
return False
|
||||||
|
|
||||||
|
file_name = os.path.abspath(file_name)
|
||||||
|
temp_name = os.path.split(file_name)[1]
|
||||||
|
object_name = self.build_object_name(data_type, temp_name)
|
||||||
|
|
||||||
|
# dir_name = os.path.dirname(object_name)
|
||||||
|
# self.create_dir(dir_name)
|
||||||
|
if DEBUG:
|
||||||
|
print(file_name)
|
||||||
|
print(object_name)
|
||||||
|
print(dir_name)
|
||||||
|
|
||||||
|
return self.resumable_upload(file_name,
|
||||||
|
object_name=object_name,
|
||||||
|
*args,
|
||||||
|
**kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
if self.error_msg:
|
||||||
|
self.error_msg += r"\n"
|
||||||
|
self.error_msg += "文件上传出现错误:{}".format(str(e))
|
||||||
|
return False
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"onedrive-international": {
|
||||||
|
"client_id": "08125e6b-6502-4ac9-9548-ad682f00848d",
|
||||||
|
"client_secret": "0WA8Q~sZkZFZKv50ryP4ux~.fpVtbHw7BuTZmbQB",
|
||||||
|
"authority": "https://login.microsoftonline.com/common",
|
||||||
|
"token_endpoint": "/oauth2/v2.0/token",
|
||||||
|
"authorize_endpoint": "/oauth2/v2.0/authorize",
|
||||||
|
"scopes": "offline_access Files.ReadWrite.All User.Read",
|
||||||
|
"redirect_uri": "http://localhost",
|
||||||
|
"api_uri": "https://graph.microsoft.com/v1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,311 @@
|
|||||||
|
<style>
|
||||||
|
.upyunCon {
|
||||||
|
height: 428px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-place {
|
||||||
|
height: 62px;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-place .btn {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-place .place-input {
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 28px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 1px 0 0 -1px;
|
||||||
|
width: 340px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.place-input ul {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.place-input ul li {
|
||||||
|
background: url("/static/img/ico/ico-ltr.png") no-repeat right center;
|
||||||
|
float: left;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.place-input ul li a {
|
||||||
|
height: 28px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.upyunlist {
|
||||||
|
height: 516px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-bottom {
|
||||||
|
background-color: #fafafa;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
bottom: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-use {
|
||||||
|
line-height: 50px
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-list .cursor span {
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-title {
|
||||||
|
margin-top: 1px
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip {
|
||||||
|
font-size: 10px;
|
||||||
|
font-style: oblique;
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="upyunCon">
|
||||||
|
<div class="up-place pd15">
|
||||||
|
<button id="backBtn" class="btn btn-default btn-sm glyphicon glyphicon-arrow-left pull-left" title="后退"></button>
|
||||||
|
<input id="myPath" style="display:none;" type="text" value="">
|
||||||
|
<div class="place-input pull-left">
|
||||||
|
<div style="width:1400px;height:28px"><ul></ul></div>
|
||||||
|
</div>
|
||||||
|
<button class="refreshBtn btn btn-default btn-sm glyphicon glyphicon-refresh pull-left mr20" title="刷新" style="margin-left:-1px;"></button>
|
||||||
|
<button class="btn btn-default btn-sm pull-right btn-title" onclick="authApi()">授权</button>
|
||||||
|
<button class="btn btn-default btn-sm pull-right mr20 btn-title" onclick="createDir()">新建文件夹</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="upyunlist pd15">
|
||||||
|
<div class="divtable" style="margin-bottom:15px">
|
||||||
|
<table class="table table-hover">
|
||||||
|
<thead><tr><th>名称</th><th>大小</th><th>更新时间</th><th class="text-right">操作</th></tr></thead>
|
||||||
|
<tbody class="list-list"></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.check_api {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-place {
|
||||||
|
height: 62px;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-place .btn {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-place .place-input {
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 28px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 1px 0 0 -1px;
|
||||||
|
width: 340px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.place-input ul {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.place-input ul li {
|
||||||
|
background: url("/static/img/ico/ico-ltr.png") no-repeat right center;
|
||||||
|
float: left;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.place-input ul li a {
|
||||||
|
height: 28px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.upyunlist {
|
||||||
|
height: 546px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-bottom {
|
||||||
|
background-color: #fafafa;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
bottom: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up-use {
|
||||||
|
line-height: 50px
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-list .cursor span {
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-title {
|
||||||
|
margin-top: 1px
|
||||||
|
}
|
||||||
|
|
||||||
|
.step_item{
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step_item .serial_box{
|
||||||
|
display: inline-block;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step_item .serial{
|
||||||
|
width: 70px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
text-align: center;
|
||||||
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.step_item .serial span{
|
||||||
|
display: inline-block;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 28px;
|
||||||
|
font-size: 11px;
|
||||||
|
border-radius: 50%;
|
||||||
|
color: #20a53a;
|
||||||
|
border: 2px solid #20a53a;
|
||||||
|
}
|
||||||
|
.step_item .serial_title{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 30px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.step_two_url{
|
||||||
|
display: inline-block;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 380px;
|
||||||
|
/*text-overflow: ellipsis;*/
|
||||||
|
white-space: nowrap;
|
||||||
|
height: 35px;
|
||||||
|
line-height: 35px;
|
||||||
|
margin-right: 15px;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0 10px;
|
||||||
|
float: left;
|
||||||
|
width:360px;
|
||||||
|
padding-right: 35px;
|
||||||
|
}
|
||||||
|
.btn_btlink{
|
||||||
|
display: inline-block;
|
||||||
|
padding: 5px 10px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: pointer;
|
||||||
|
border: 1px solid #20a53a;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #20a53a;
|
||||||
|
margin-right:10px;
|
||||||
|
}
|
||||||
|
.btn_btlink:hover{
|
||||||
|
color: #fff;
|
||||||
|
background-color: #10952a;
|
||||||
|
border-color: #398439;
|
||||||
|
}
|
||||||
|
.btn_btlink a:visited{
|
||||||
|
color: #fff;
|
||||||
|
background-color: #10952a;
|
||||||
|
border-color: #398439;
|
||||||
|
}
|
||||||
|
.view_video{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.view_video ul li{
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.setp_one i{
|
||||||
|
position: absolute;
|
||||||
|
top: 8px;
|
||||||
|
left: 25px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
.OneDrive{
|
||||||
|
width:465px;
|
||||||
|
height:100px;
|
||||||
|
margin-bottom:10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/html" id="check_api">
|
||||||
|
<div class="check_api">
|
||||||
|
<div class="step_two">
|
||||||
|
<div class="step_item">
|
||||||
|
<div class="serial"><span>1</span></div>
|
||||||
|
<div class="serial_box">
|
||||||
|
<div class="serial_title">阅读简易操作教程:如何获取Microsoft OneDrive授权?</div>
|
||||||
|
<div class="serial_conter">
|
||||||
|
<div class="view_video">
|
||||||
|
<ul>
|
||||||
|
<li>1. 点击下面第<div class="serial" style="float: none;width: 45px;"><span>2</span></div>步中的 打开授权链接。<li>
|
||||||
|
<li>2. 在新窗口页面上登录Microsoft账号。阅读授权权限,并同意。<li>
|
||||||
|
<li>3. 页面跳转后,将浏览器的地址栏地址复制到第<div class="serial" style="float: none;width: 45px;"><span>3</span></div>步的文本框中。<li>
|
||||||
|
<li>4. 点击 获取授权,随即完成授权。<li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<hr/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="step_item pb15">
|
||||||
|
<div class="serial"><span>2</span></div>
|
||||||
|
<div class="serial_box">
|
||||||
|
<div class="serial_title">操作1:👇打开授权链接,根据网页提示对插件进行授权。</div>
|
||||||
|
<div class="serial_conter step_two" style="width: 500px;">
|
||||||
|
<input class="bt-input-text mr5 step_two_url" type="text" disabled>
|
||||||
|
<span class="ico-copy mr10" data-copy="" style="vertical-align: middle;cursor: pointer;margin-left: -37px;margin-right: 20px;"></span>
|
||||||
|
<a href="" class="btn_btlink open_btlink" target="_blank" style="padding: 7px 10px;">打开授权链接</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="step_item">
|
||||||
|
<div class="serial"><span>3</span></div>
|
||||||
|
<div class="serial_box">
|
||||||
|
<div class="serial_title">操作2:复制回浏览器跳转后的地址:</div>
|
||||||
|
<div class="serial_conter">
|
||||||
|
<textarea row="3" placeholder="验证URL地址" class="bt-input-text OneDrive" style="resize: none;"/></br>
|
||||||
|
<button type="button" class="btn btn-success btn-sm set_auth_btn">获取授权</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="/plugins/file?name=msonedrive&f=js/msonedrive.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$.getScript( "/plugins/file?name=msonedrive&f=js/msonedrive.js", function(){
|
||||||
|
odList('/');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,351 @@
|
|||||||
|
# coding:utf-8
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
# print(sys.platform)
|
||||||
|
if sys.platform != "darwin":
|
||||||
|
os.chdir("/www/server/mdserver-web")
|
||||||
|
|
||||||
|
|
||||||
|
sys.path.append(os.getcwd() + "/class/core")
|
||||||
|
import mw
|
||||||
|
import db
|
||||||
|
|
||||||
|
_ver = sys.version_info
|
||||||
|
is_py2 = (_ver[0] == 2)
|
||||||
|
is_py3 = (_ver[0] == 3)
|
||||||
|
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
|
if is_py2:
|
||||||
|
reload(sys)
|
||||||
|
sys.setdefaultencoding('utf-8')
|
||||||
|
|
||||||
|
app_debug = False
|
||||||
|
if mw.isAppleSystem():
|
||||||
|
app_debug = True
|
||||||
|
|
||||||
|
|
||||||
|
def getPluginName():
|
||||||
|
return 'msonedrive'
|
||||||
|
|
||||||
|
|
||||||
|
def getPluginDir():
|
||||||
|
return mw.getPluginDir() + '/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
def getServerDir():
|
||||||
|
return mw.getServerDir() + '/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
def in_array(name, arr=[]):
|
||||||
|
for x in arr:
|
||||||
|
if name == x:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
sys.path.append(getPluginDir() + "/class")
|
||||||
|
from msodclient import msodclient
|
||||||
|
|
||||||
|
|
||||||
|
msodc = msodclient(getPluginDir(), getServerDir())
|
||||||
|
msodc.setDebug(False)
|
||||||
|
|
||||||
|
|
||||||
|
def getArgs():
|
||||||
|
args = sys.argv[2:]
|
||||||
|
tmp = {}
|
||||||
|
args_len = len(args)
|
||||||
|
if args_len == 1:
|
||||||
|
t = args[0].strip('{').strip('}')
|
||||||
|
if t.strip() == '':
|
||||||
|
tmp = []
|
||||||
|
else:
|
||||||
|
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(':', 1)
|
||||||
|
tmp[t[0]] = t[1]
|
||||||
|
return tmp
|
||||||
|
|
||||||
|
|
||||||
|
def checkArgs(data, ck=[]):
|
||||||
|
for i in range(len(ck)):
|
||||||
|
if not ck[i] in data:
|
||||||
|
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
|
||||||
|
return (True, mw.returnJson(True, 'ok'))
|
||||||
|
|
||||||
|
|
||||||
|
def status():
|
||||||
|
return 'start'
|
||||||
|
|
||||||
|
|
||||||
|
def isAuthApi():
|
||||||
|
cfg = getServerDir() + "/user.conf"
|
||||||
|
if os.path.exists(cfg):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def getConf():
|
||||||
|
if not isAuthApi():
|
||||||
|
sign_in_url, state = msodc.get_sign_in_url()
|
||||||
|
return mw.returnJson(False, "未授权!", {'auth_url': sign_in_url})
|
||||||
|
return mw.returnJson(True, "OK")
|
||||||
|
|
||||||
|
|
||||||
|
def setAuthUrl():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['url'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
url = args['url']
|
||||||
|
|
||||||
|
try:
|
||||||
|
if url.startswith("http://"):
|
||||||
|
url = url.replace("http://", "https://")
|
||||||
|
token = msodc.get_token_from_authorized_url(authorized_url=url)
|
||||||
|
msodc.store_token(token)
|
||||||
|
msodc.store_user()
|
||||||
|
return mw.returnJson(True, "授权成功!")
|
||||||
|
except Exception as e:
|
||||||
|
return mw.returnJson(False, "授权失败2!:" + str(e))
|
||||||
|
return mw.returnJson(False, "授权失败!:" + str(e))
|
||||||
|
|
||||||
|
|
||||||
|
def clearAuth():
|
||||||
|
cfg = getServerDir() + "/user.conf"
|
||||||
|
if os.path.exists(cfg):
|
||||||
|
os.remove(cfg)
|
||||||
|
|
||||||
|
token = getServerDir() + "/token.pickle"
|
||||||
|
if os.path.exists(token):
|
||||||
|
os.remove(token)
|
||||||
|
|
||||||
|
return mw.returnJson(True, "清空授权成功!")
|
||||||
|
|
||||||
|
|
||||||
|
def getList():
|
||||||
|
cfg = getServerDir() + "/user.conf"
|
||||||
|
if not os.path.exists(cfg):
|
||||||
|
return mw.returnJson(False, "未配置,请点击`授权`", [])
|
||||||
|
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['path'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
try:
|
||||||
|
flist = msodc.get_list(args['path'])
|
||||||
|
return mw.returnJson(True, "ok", flist)
|
||||||
|
except Exception as e:
|
||||||
|
return mw.returnJson(False, str(e), [])
|
||||||
|
|
||||||
|
|
||||||
|
def createDir():
|
||||||
|
cfg = getServerDir() + "/user.conf"
|
||||||
|
if not os.path.exists(cfg):
|
||||||
|
return mw.returnJson(False, "未配置OneDrive,请点击`授权`", [])
|
||||||
|
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['path', 'name'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
file = args['path'] + "/" + args['name']
|
||||||
|
isok = msodc.create_dir(file)
|
||||||
|
if isok:
|
||||||
|
return mw.returnJson(True, "创建成功")
|
||||||
|
return mw.returnJson(False, "创建失败")
|
||||||
|
|
||||||
|
|
||||||
|
def deleteDir():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['dir_name', 'path'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
file = args['path'] + "/" + args['dir_name']
|
||||||
|
file = file.strip('/')
|
||||||
|
isok = msodc.delete_object(file)
|
||||||
|
if isok:
|
||||||
|
return mw.returnJson(True, "删除成功")
|
||||||
|
return mw.returnJson(False, "文件不为空,删除失败!")
|
||||||
|
|
||||||
|
|
||||||
|
def deleteFile():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['path', 'filename'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
file = args['path'] + "/" + args['filename']
|
||||||
|
file = file.strip('/')
|
||||||
|
isok = msodc.delete_object(file)
|
||||||
|
if isok:
|
||||||
|
return mw.returnJson(True, "删除成功")
|
||||||
|
return mw.returnJson(False, "删除失败")
|
||||||
|
|
||||||
|
|
||||||
|
def findPathName(path, filename):
|
||||||
|
f = os.scandir(path)
|
||||||
|
l = []
|
||||||
|
for ff in f:
|
||||||
|
t = {}
|
||||||
|
if ff.name.find(filename) > -1:
|
||||||
|
t['filename'] = path + '/' + ff.name
|
||||||
|
l.append(t)
|
||||||
|
return l
|
||||||
|
|
||||||
|
|
||||||
|
def backupAllFunc(stype):
|
||||||
|
if not isAuthApi():
|
||||||
|
mw.echoInfo("未授权API,无法使用!!!")
|
||||||
|
return ''
|
||||||
|
|
||||||
|
os.chdir(mw.getRunDir())
|
||||||
|
backup_dir = mw.getBackupDir()
|
||||||
|
run_dir = mw.getRunDir()
|
||||||
|
|
||||||
|
stype = sys.argv[1]
|
||||||
|
name = sys.argv[2]
|
||||||
|
num = sys.argv[3]
|
||||||
|
|
||||||
|
prefix_dict = {
|
||||||
|
"site": "web",
|
||||||
|
"database": "db",
|
||||||
|
"path": "path",
|
||||||
|
}
|
||||||
|
|
||||||
|
backups = []
|
||||||
|
sql = db.Sql()
|
||||||
|
|
||||||
|
# print("stype:", stype)
|
||||||
|
# 提前获取-清理多余备份
|
||||||
|
if stype == 'site':
|
||||||
|
pid = sql.table('sites').where('name=?', (name,)).getField('id')
|
||||||
|
backups = sql.table('backup').where(
|
||||||
|
'type=? and pid=?', ('0', pid)).field('id,filename').select()
|
||||||
|
if stype == 'database':
|
||||||
|
db_path = mw.getServerDir() + '/mysql'
|
||||||
|
pid = mw.M('databases').dbPos(db_path, 'mysql').where(
|
||||||
|
'name=?', (name,)).getField('id')
|
||||||
|
backups = sql.table('backup').where(
|
||||||
|
'type=? and pid=?', ('1', pid)).field('id,filename').select()
|
||||||
|
if stype == 'path':
|
||||||
|
backup_path = backup_dir + '/path'
|
||||||
|
_name = 'path_{}'.format(os.path.basename(name))
|
||||||
|
backups = findPathName(backup_path, _name)
|
||||||
|
|
||||||
|
# 其他类型关系性数据库(mysql类的)
|
||||||
|
if stype.find('database_') > -1:
|
||||||
|
plugin_name = stype.replace('database_', '')
|
||||||
|
db_path = mw.getServerDir() + '/' + plugin_name
|
||||||
|
pid = mw.M('databases').dbPos(db_path, 'mysql').where(
|
||||||
|
'name=?', (name,)).getField('id')
|
||||||
|
backups = sql.table('backup').where(
|
||||||
|
'type=? and pid=?', ('1', pid)).field('id,filename').select()
|
||||||
|
|
||||||
|
args = stype + " " + name + " " + num
|
||||||
|
cmd = 'python3 ' + run_dir + '/scripts/backup.py ' + args
|
||||||
|
if stype.find('database_') > -1:
|
||||||
|
plugin_name = stype.replace('database_', '')
|
||||||
|
args = "database " + name + " " + num
|
||||||
|
cmd = 'python3 ' + run_dir + '/plugins/' + \
|
||||||
|
plugin_name + '/scripts/backup.py ' + args
|
||||||
|
|
||||||
|
if stype == 'path':
|
||||||
|
name = os.path.basename(name)
|
||||||
|
|
||||||
|
# print("cmd:", cmd)
|
||||||
|
os.system(cmd)
|
||||||
|
|
||||||
|
# 开始执行上传信息.
|
||||||
|
if stype.find('database_') > -1:
|
||||||
|
bk_name = 'database'
|
||||||
|
plugin_name = stype.replace('database_', '')
|
||||||
|
bk_prefix = plugin_name + '/db'
|
||||||
|
stype = 'database'
|
||||||
|
else:
|
||||||
|
bk_prefix = prefix_dict[stype]
|
||||||
|
bk_name = stype
|
||||||
|
|
||||||
|
find_path = backup_dir + '/' + bk_name + '/' + bk_prefix + '_' + name
|
||||||
|
find_new_file = "ls " + find_path + \
|
||||||
|
"_* | grep '.gz' | cut -d \ -f 1 | awk 'END {print}'"
|
||||||
|
|
||||||
|
# print(find_new_file)
|
||||||
|
|
||||||
|
filename = mw.execShell(find_new_file)[0].strip()
|
||||||
|
if filename == "":
|
||||||
|
mw.echoInfo("not find upload file!")
|
||||||
|
return False
|
||||||
|
|
||||||
|
mw.echoInfo("准备上传文件 {}".format(filename))
|
||||||
|
mw.echoStart('开始上传')
|
||||||
|
msodc.upload_file(filename, stype)
|
||||||
|
mw.echoEnd('上传成功')
|
||||||
|
|
||||||
|
# print(backups)
|
||||||
|
backups = sorted(backups, key=lambda x: x['filename'], reverse=False)
|
||||||
|
mw.echoStart('开始删除远程备份')
|
||||||
|
num = int(num)
|
||||||
|
sep = len(backups) - num
|
||||||
|
if sep > -1:
|
||||||
|
for backup in backups:
|
||||||
|
fn = os.path.basename(backup['filename'])
|
||||||
|
msodc.delete_file(fn, stype)
|
||||||
|
mw.echoInfo("---已清理远程过期备份文件:" + fn)
|
||||||
|
sep -= 1
|
||||||
|
if sep < 0:
|
||||||
|
break
|
||||||
|
mw.echoEnd('结束删除远程备份')
|
||||||
|
|
||||||
|
return ''
|
||||||
|
|
||||||
|
|
||||||
|
def installPreInspection():
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
func = sys.argv[1]
|
||||||
|
if func == 'status':
|
||||||
|
print(status())
|
||||||
|
elif func == 'start':
|
||||||
|
print(start())
|
||||||
|
elif func == 'stop':
|
||||||
|
print(stop())
|
||||||
|
elif func == 'restart':
|
||||||
|
print(restart())
|
||||||
|
elif func == 'reload':
|
||||||
|
print(reload())
|
||||||
|
elif func == 'install_pre_inspection':
|
||||||
|
print(installPreInspection())
|
||||||
|
elif func == 'conf':
|
||||||
|
print(getConf())
|
||||||
|
elif func == 'set_auth_url':
|
||||||
|
print(setAuthUrl())
|
||||||
|
elif func == 'clear_auth':
|
||||||
|
print(clearAuth())
|
||||||
|
elif func == "get_list":
|
||||||
|
print(getList())
|
||||||
|
elif func == "create_dir":
|
||||||
|
print(createDir())
|
||||||
|
elif func == "delete_dir":
|
||||||
|
print(deleteDir())
|
||||||
|
elif func == 'delete_file':
|
||||||
|
print(deleteFile())
|
||||||
|
elif in_array(func, ['site', 'database', 'path']) or func.find('database_') > -1:
|
||||||
|
print(backupAllFunc(func))
|
||||||
|
else:
|
||||||
|
print('error')
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"hook":["backup"],
|
||||||
|
"title": "OneDrive",
|
||||||
|
"tip": "lib",
|
||||||
|
"name": "msonedrive",
|
||||||
|
"type": "sort",
|
||||||
|
"ps": "微软家的云网盘服务。",
|
||||||
|
"versions": "1.0",
|
||||||
|
"shell": "install.sh",
|
||||||
|
"checks": "server/msonedrive",
|
||||||
|
"author": "midoks",
|
||||||
|
"date": "2023-8-18",
|
||||||
|
"pid": "4"
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
PATH=/www/server/panel/pyenv/bin:/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=$2
|
||||||
|
|
||||||
|
if [ -f ${rootPath}/bin/activate ];then
|
||||||
|
source ${rootPath}/bin/activate
|
||||||
|
fi
|
||||||
|
|
||||||
|
Install_App()
|
||||||
|
{
|
||||||
|
pip install requests-oauthlib==1.3.0
|
||||||
|
mkdir -p $serverPath/msonedrive
|
||||||
|
echo '正在安装脚本文件...' > $install_tmp
|
||||||
|
|
||||||
|
echo "${VERSION}" > $serverPath/msonedrive/version.pl
|
||||||
|
echo '安装完成' > $install_tmp
|
||||||
|
|
||||||
|
echo "Successify"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Uninstall_App()
|
||||||
|
{
|
||||||
|
rm -rf $serverPath/msonedrive
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "${1}" == 'install' ];then
|
||||||
|
Install_App
|
||||||
|
elif [ "${1}" == 'uninstall' ];then
|
||||||
|
Uninstall_App
|
||||||
|
else
|
||||||
|
echo 'Error!';
|
||||||
|
fi
|
||||||
@@ -0,0 +1,258 @@
|
|||||||
|
|
||||||
|
function msodPost(method,args,callback){
|
||||||
|
var _args = null;
|
||||||
|
if (typeof(args) == 'string'){
|
||||||
|
_args = JSON.stringify(toArrayObject(args));
|
||||||
|
} else {
|
||||||
|
_args = JSON.stringify(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||||
|
$.post('/plugins/run', {name:'msonedrive', func:method, args:_args}, function(data) {
|
||||||
|
layer.close(loadT);
|
||||||
|
if (!data.status){
|
||||||
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(typeof(callback) == 'function'){
|
||||||
|
callback(data);
|
||||||
|
}
|
||||||
|
},'json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function createDir(){
|
||||||
|
layer.open({
|
||||||
|
type: 1,
|
||||||
|
area: "400px",
|
||||||
|
title: "创建目录",
|
||||||
|
closeBtn: 1,
|
||||||
|
shift: 5,
|
||||||
|
shadeClose: false,
|
||||||
|
btn: ['确定','取消'],
|
||||||
|
content:'<div class="bingfa bt-form c6" style="padding-bottom: 10px;">\
|
||||||
|
<p>\
|
||||||
|
<span class="span_tit">目录名称:</span>\
|
||||||
|
<input style="width: 200px;" type="text" name="newPath" value="">\
|
||||||
|
</p>\
|
||||||
|
</div>',
|
||||||
|
success:function(){
|
||||||
|
$("input[name='newPath']").focus().keyup(function(e){
|
||||||
|
if(e.keyCode == 13) $(".layui-layer-btn0").click();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
yes:function(index,layero){
|
||||||
|
var name = $("input[name='newPath']").val();
|
||||||
|
if(name == ''){
|
||||||
|
layer.msg('目录名称不能为空!',{icon:2});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var path = $("#myPath").val();
|
||||||
|
var dirname = name;
|
||||||
|
var loadT = layer.msg('正在创建目录['+dirname+']...',{icon:16,time:0,shade: [0.3, '#000']});
|
||||||
|
msodPost('create_dir', {path:path,name:dirname}, function(data){
|
||||||
|
layer.close(loadT);
|
||||||
|
var rdata = $.parseJSON(data.data);
|
||||||
|
if(rdata.status) {
|
||||||
|
showMsg(rdata.msg, function(){
|
||||||
|
layer.close(index);
|
||||||
|
odList(path);
|
||||||
|
} ,{icon:1}, 2000);
|
||||||
|
} else{
|
||||||
|
layer.msg(rdata.msg,{icon:2});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//设置API
|
||||||
|
function authApi(){
|
||||||
|
|
||||||
|
msodPost('conf', {}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
|
||||||
|
// console.log(rdata);
|
||||||
|
// console.log(rdata.data.auth_url);
|
||||||
|
var apicon = '';
|
||||||
|
if (rdata.status){
|
||||||
|
|
||||||
|
var html = '';
|
||||||
|
html += '<button id="clear_auth" onclick="clearAuth();" class="btn btn-default btn-sm">清空配置</button>';
|
||||||
|
|
||||||
|
var loadOpen = layer.open({
|
||||||
|
type: 1,
|
||||||
|
title: '已授权',
|
||||||
|
area: '240px',
|
||||||
|
content:'<div class="change-default pd20">'+html+'</div>',
|
||||||
|
success: function(){
|
||||||
|
$('#clear_auth').click(function(){
|
||||||
|
msodPost('clear_auth', {}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
showMsg(rdata.msg,function(){
|
||||||
|
layer.close(loadOpen);
|
||||||
|
odList('/');
|
||||||
|
},{icon:rdata.status?1:2},2000);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else{
|
||||||
|
apicon = '<div class="new_form">'+$("#check_api").html()+'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
var layer_auth = layer.open({
|
||||||
|
type: 1,
|
||||||
|
area: "620px",
|
||||||
|
title: "OneDrive授权",
|
||||||
|
closeBtn: 1,
|
||||||
|
shift: 5,
|
||||||
|
shadeClose: false,
|
||||||
|
content:apicon,
|
||||||
|
success:function(layero,index){
|
||||||
|
// console.log(layero,index);
|
||||||
|
if (!rdata.status){
|
||||||
|
$('.check_api .step_two_url').val(rdata.data['auth_url']);
|
||||||
|
$('.check_api .open_btlink').attr('href',rdata.data['auth_url']);
|
||||||
|
|
||||||
|
$('.check_api .ico-copy').click(function(){
|
||||||
|
copyPass(rdata.data['auth_url']);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.check_api .set_auth_btn').click(function(){
|
||||||
|
|
||||||
|
var url = $('.check_api .OneDrive').val();
|
||||||
|
if ( url == ''){
|
||||||
|
layer.msg("验证URL不能为空",{icon:2});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// console.log(url);
|
||||||
|
msodPost('set_auth_url', {url:url}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
var show_time = 2000;
|
||||||
|
if (!rdata.status){
|
||||||
|
show_time = 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
showMsg(rdata.msg,function(){
|
||||||
|
if (rdata.status){
|
||||||
|
layer.close(layer_auth);
|
||||||
|
odList('/');
|
||||||
|
}
|
||||||
|
},{icon:rdata.status?1:2},show_time);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//计算当前目录偏移
|
||||||
|
function upPathLeft(){
|
||||||
|
var UlWidth = $(".place-input ul").width();
|
||||||
|
var SpanPathWidth = $(".place-input").width() - 20;
|
||||||
|
var Ml = UlWidth - SpanPathWidth;
|
||||||
|
if(UlWidth > SpanPathWidth ){
|
||||||
|
$(".place-input ul").css("left",-Ml)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$(".place-input ul").css("left",0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function odList(path){
|
||||||
|
msodPost('get_list', {path:path}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
if(rdata.status === false){
|
||||||
|
showMsg(rdata.msg,function(){
|
||||||
|
authApi();
|
||||||
|
},{icon:2},2000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var mlist = rdata.data;
|
||||||
|
var listBody = ''
|
||||||
|
var listFiles = ''
|
||||||
|
for(var i=0;i<mlist.list.length;i++){
|
||||||
|
if(mlist.list[i].type == null){
|
||||||
|
listBody += '<tr><td class="cursor" onclick="odList(\''+(path+'/'+mlist.list[i].name).replace('//','/')+'\')"><span class="ico ico-folder"></span>\<span>'+mlist.list[i].name+'</span></td>\
|
||||||
|
<td>-</td>\
|
||||||
|
<td>-</td>\
|
||||||
|
<td class="text-right"><a class="btlink" onclick="deleteFile(\''+mlist.list[i].name+'\', true)">删除</a></td></tr>'
|
||||||
|
}else{
|
||||||
|
listFiles += '<tr><td class="cursor"><span class="ico ico-file"></span>\<span>'+mlist.list[i].name+'</span></td>\
|
||||||
|
<td>'+toSize(mlist.list[i].size)+'</td>\
|
||||||
|
<td>'+getLocalTime(mlist.list[i].time)+'</td>\
|
||||||
|
<td class="text-right"><a target="_blank" href="'+mlist.list[i].download+'" class="btlink">下载</a> | <a class="btlink" onclick="deleteFile(\''+mlist.list[i].name+'\', false)">删除</a></td></tr>'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listBody += listFiles;
|
||||||
|
|
||||||
|
var pathLi='';
|
||||||
|
var tmp = path.split('/')
|
||||||
|
var pathname = '';
|
||||||
|
var n = 0;
|
||||||
|
for(var i=0;i<tmp.length;i++){
|
||||||
|
if(n > 0 && tmp[i] == '') continue;
|
||||||
|
var dirname = tmp[i];
|
||||||
|
if(dirname == '') {
|
||||||
|
dirname = '根目录';
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
pathname += '/' + tmp[i];
|
||||||
|
pathname = pathname.replace('//','/');
|
||||||
|
pathLi += '<li><a title="'+pathname+'" onclick="osList(\''+pathname+'\')">'+dirname+'</a></li>';
|
||||||
|
}
|
||||||
|
var um = 1;
|
||||||
|
if(tmp[tmp.length-1] == '') um = 2;
|
||||||
|
var backPath = tmp.slice(0,tmp.length-um).join('/') || '/';
|
||||||
|
$('#myPath').val(path);
|
||||||
|
$(".upyunCon .place-input ul").html(pathLi);
|
||||||
|
$(".upyunlist .list-list").html(listBody);
|
||||||
|
|
||||||
|
upPathLeft();
|
||||||
|
|
||||||
|
$('#backBtn').unbind().click(function() {
|
||||||
|
odList(backPath);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.upyunCon .refreshBtn').unbind().click(function(){
|
||||||
|
odList(path);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//删除文件
|
||||||
|
function deleteFile(name, is_dir){
|
||||||
|
if (is_dir === false){
|
||||||
|
safeMessage('删除文件','删除后将无法恢复,真的要删除['+name+']吗?',function(){
|
||||||
|
var path = $("#myPath").val();
|
||||||
|
var filename = name;
|
||||||
|
msodPost('delete_file', {filename:filename,path:path}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
showMsg(rdata.msg,function(){
|
||||||
|
odList(path);
|
||||||
|
},{icon:rdata.status?1:2},2000);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
safeMessage('删除文件夹','删除后将无法恢复,真的要删除['+name+']吗?',function(){
|
||||||
|
var path = $("#myPath").val();
|
||||||
|
msodPost('delete_dir', {dir_name:name,path:path}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
showMsg(rdata.msg,function(){
|
||||||
|
odList(path);
|
||||||
|
},{icon:rdata.status?1:2},2000);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
# python3 plugins/msonedrive/t/test.py
|
||||||
|
|
||||||
|
|
||||||
|
# https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationMenuBlade/~/Overview/appId/08125e6b-6502-4ac9-9548-ad682f00848d/objectId/62b1d655-9828-47ed-be99-65eb18c3a929/isMSAApp~/false/defaultBlade/Overview/appSignInAudience/AzureADandPersonalMicrosoftAccount/servicePrincipalCreated~/true
|
||||||
|
|
||||||
|
# 0WA8Q~sZkZFZKv50ryP4ux~.fpVtbHw7BuTZmbQB
|
||||||
|
# client_id:d9878fac-8526-4ff6-8036-e1c92dd9dd80
|
||||||
|
|
||||||
|
# 08125e6b-6502-4ac9-9548-ad682f00848d
|
||||||
|
|
||||||
|
|
||||||
|
# https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id=d9878fac-8526-4ff6-8036-e1c92dd9dd80&redirect_uri=http://localhost&scope=offline_access+Files.ReadWrite.All+User.Read&state=cwopMdHiPIkze4MvgFL6WfSl8LdYAl&prompt=login
|
||||||
|
|
||||||
|
|
||||||
|
# http://localhost/?code=M.C106_BAY.2.3e12c859-6107-0c5b-9ef4-14b3fb8269ba&state=JzHdzHXmA7x6zl7Be6cJ6uOlf9Bg69
|
||||||
|
|
||||||
|
|
||||||
|
# python3 /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/msonedrive/index.py site t1.cn 3
|
||||||
|
# python3 /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/msonedrive/index.py database t1 3
|
||||||
|
# python3
|
||||||
|
# /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/msonedrive/index.py
|
||||||
|
# path /Users/midoks/Desktop/dev/python 3
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
from requests_oauthlib import OAuth2Session
|
||||||
|
|
||||||
|
sys.path.append(os.getcwd() + "/class/core")
|
||||||
|
import mw
|
||||||
|
|
||||||
|
|
||||||
|
def getPluginName():
|
||||||
|
return 'msonedrive'
|
||||||
|
|
||||||
|
|
||||||
|
def getPluginDir():
|
||||||
|
return mw.getPluginDir() + '/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
def getServerDir():
|
||||||
|
return mw.getServerDir() + '/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
|
sys.path.append(getPluginDir() + "/class")
|
||||||
|
from msodclient import msodclient
|
||||||
|
|
||||||
|
msodclient.setDebug(True)
|
||||||
|
msodc = msodclient(getPluginDir(), getServerDir())
|
||||||
|
|
||||||
|
|
||||||
|
# sign_in_url, state = msodc.get_sign_in_url()
|
||||||
|
# print(sign_in_url)
|
||||||
|
|
||||||
|
|
||||||
|
def set_auth_url(url):
|
||||||
|
try:
|
||||||
|
if url.startswith("http://"):
|
||||||
|
url = url.replace("http://", "https://")
|
||||||
|
token = msodc.get_token_from_authorized_url(
|
||||||
|
authorized_url=url)
|
||||||
|
msodc.store_token(token)
|
||||||
|
msodc.store_user()
|
||||||
|
return mw.returnJson(True, "授权成功!")
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return mw.returnJson(False, "授权失败2!:" + str(e))
|
||||||
|
return mw.returnJson(False, "授权失败!:" + str(e))
|
||||||
|
|
||||||
|
# url = 'http://localhost/?code=M.C106_BAY.2.310112f3-a158-c400-9667-d158cbd1de6c&state=jEJz0ucR9bpZYD9PGxp2GgRDotrzO6'
|
||||||
|
# token = set_auth_url(url)
|
||||||
|
# print(token)
|
||||||
|
|
||||||
|
# token = msodc.get_token()
|
||||||
|
# print("token:", token)
|
||||||
|
|
||||||
|
# t = msodc.get_list('/backup')
|
||||||
|
# print(t)
|
||||||
|
|
||||||
|
# t = msodc.create_dir('backup')
|
||||||
|
# print(t)
|
||||||
|
|
||||||
|
# t = msodc.delete_object('backup')
|
||||||
|
# print(t)
|
||||||
|
|
||||||
|
|
||||||
|
t = msodc.upload_file('web_t1.cn_20230830_134549.tar.gz', 'site')
|
||||||
|
print(t)
|
||||||
|
# print(msodc.error_msg)
|
||||||
|
|
||||||
|
# /Users/midoks/Desktop/mwdev/server/mdserver-web/paramiko.log
|
||||||
|
# backup/site/paramiko.log
|
||||||
|
# |-正在上传到 backup/site/paramiko.log...
|
||||||
|
# True
|
||||||
|
|
||||||
|
|
||||||
|
# t = msodc.upload_abs_file(
|
||||||
|
# 'web_t1.cn_20230830_134549.tar.gz', 'site')
|
||||||
|
# print(t)
|
||||||
|
# print(msodc.error_msg)
|
||||||
@@ -67,7 +67,7 @@ binlog-ignore-db = performance_schema
|
|||||||
#slave
|
#slave
|
||||||
log-slave-updates
|
log-slave-updates
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ binlog-ignore-db = performance_schema
|
|||||||
#slave
|
#slave
|
||||||
log_replica_updates
|
log_replica_updates
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
+20
-39
@@ -55,19 +55,20 @@ def is_number(s):
|
|||||||
|
|
||||||
def getArgs():
|
def getArgs():
|
||||||
args = sys.argv[2:]
|
args = sys.argv[2:]
|
||||||
|
|
||||||
tmp = {}
|
tmp = {}
|
||||||
args_len = len(args)
|
args_len = len(args)
|
||||||
|
|
||||||
if args_len == 1:
|
if args_len == 1:
|
||||||
t = args[0].strip('{').strip('}')
|
t = args[0].strip('{').strip('}')
|
||||||
t = t.split(':')
|
if t.strip() == '':
|
||||||
|
tmp = []
|
||||||
|
else:
|
||||||
|
t = t.split(':', 1)
|
||||||
|
tmp[t[0]] = t[1]
|
||||||
tmp[t[0]] = t[1]
|
tmp[t[0]] = t[1]
|
||||||
elif args_len > 1:
|
elif args_len > 1:
|
||||||
for i in range(len(args)):
|
for i in range(len(args)):
|
||||||
t = args[i].split(':')
|
t = args[i].split(':', 1)
|
||||||
tmp[t[0]] = t[1]
|
tmp[t[0]] = t[1]
|
||||||
|
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
|
|
||||||
@@ -2195,40 +2196,10 @@ def updateSlaveSSH(version=''):
|
|||||||
|
|
||||||
|
|
||||||
def getSlaveList(version=''):
|
def getSlaveList(version=''):
|
||||||
|
|
||||||
db = pMysqlDb()
|
db = pMysqlDb()
|
||||||
dlist = db.query('show slave status')
|
dlist = db.query('show slave status')
|
||||||
ret = []
|
|
||||||
for x in range(0, len(dlist)):
|
|
||||||
tmp = {}
|
|
||||||
tmp['Master_User'] = dlist[x]["Master_User"]
|
|
||||||
tmp['Master_Host'] = dlist[x]["Master_Host"]
|
|
||||||
tmp['Master_Port'] = dlist[x]["Master_Port"]
|
|
||||||
tmp['Master_Log_File'] = dlist[x]["Master_Log_File"]
|
|
||||||
tmp['Slave_IO_Running'] = dlist[x]["Slave_IO_Running"]
|
|
||||||
tmp['Slave_SQL_Running'] = dlist[x]["Slave_SQL_Running"]
|
|
||||||
tmp['Last_Error'] = dlist[x]["Last_Error"]
|
|
||||||
tmp['Last_IO_Error'] = dlist[x]["Last_IO_Error"]
|
|
||||||
tmp['Last_SQL_Error'] = dlist[x]["Last_SQL_Error"]
|
|
||||||
tmp['Slave_SQL_Running_State'] = dlist[x]["Slave_SQL_Running_State"]
|
|
||||||
|
|
||||||
tmp['Error'] = ''
|
|
||||||
if tmp['Last_Error'] != '':
|
|
||||||
tmp['Error'] = tmp['Last_Error']
|
|
||||||
|
|
||||||
if tmp['Last_IO_Error'] != '':
|
|
||||||
tmp['Error'] = tmp['Last_IO_Error']
|
|
||||||
|
|
||||||
if tmp['Last_SQL_Error'] != '':
|
|
||||||
tmp['Error'] = tmp['Last_SQL_Error']
|
|
||||||
|
|
||||||
if tmp['Error'] == '':
|
|
||||||
tmp['Error'] = tmp['Slave_SQL_Running_State']
|
|
||||||
|
|
||||||
ret.append(tmp)
|
|
||||||
data = {}
|
data = {}
|
||||||
data['data'] = ret
|
data['data'] = dlist
|
||||||
|
|
||||||
return mw.getJson(data)
|
return mw.getJson(data)
|
||||||
|
|
||||||
|
|
||||||
@@ -2501,6 +2472,16 @@ def doFullSyncUser(version=''):
|
|||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
sync_db = args['db']
|
sync_db = args['db']
|
||||||
|
sync_db_import = args['db']
|
||||||
|
|
||||||
|
if sync_db.lower() == 'all':
|
||||||
|
sync_db_import = ''
|
||||||
|
dbs = findBinlogSlaveDoDb()
|
||||||
|
dbs_str = ''
|
||||||
|
for x in dbs:
|
||||||
|
dbs_str += ' ' + x
|
||||||
|
sync_db = "--databases " + dbs_str.strip()
|
||||||
|
|
||||||
sync_sign = args['sign']
|
sync_sign = args['sign']
|
||||||
|
|
||||||
db = pMysqlDb()
|
db = pMysqlDb()
|
||||||
@@ -2539,7 +2520,7 @@ def doFullSyncUser(version=''):
|
|||||||
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
|
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
|
||||||
sock = getSocketFile()
|
sock = getSocketFile()
|
||||||
my_import_cmd = getServerDir() + '/bin/usr/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \
|
my_import_cmd = getServerDir() + '/bin/usr/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \
|
||||||
' ' + sync_db + ' < ' + bak_file
|
' ' + sync_db_import + ' < ' + bak_file
|
||||||
mw.execShell(my_import_cmd)
|
mw.execShell(my_import_cmd)
|
||||||
|
|
||||||
if version == '8.0':
|
if version == '8.0':
|
||||||
@@ -2741,8 +2722,8 @@ def installPreInspection(version):
|
|||||||
if not sysName in ('debian', 'ubuntu'):
|
if not sysName in ('debian', 'ubuntu'):
|
||||||
return '仅支持debian,ubuntu'
|
return '仅支持debian,ubuntu'
|
||||||
|
|
||||||
if (sysName == 'debian' and not sysId in('11', '10')):
|
if (sysName == 'debian' and not sysId in('12', '11', '10')):
|
||||||
return 'debian支持10,11'
|
return 'debian支持10,11,12'
|
||||||
|
|
||||||
if (sysName == 'ubuntu' and version == '5.7' and not sysId in ('18.04')):
|
if (sysName == 'ubuntu' and version == '5.7' and not sysId in ('18.04')):
|
||||||
return "Ubuntu Apt MySQL[" + version + "] 仅支持18.04"
|
return "Ubuntu Apt MySQL[" + version + "] 仅支持18.04"
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ binlog-ignore-db = performance_schema
|
|||||||
#slave
|
#slave
|
||||||
log-slave-updates
|
log-slave-updates
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ binlog-ignore-db = performance_schema
|
|||||||
#slave
|
#slave
|
||||||
log_replica_updates
|
log_replica_updates
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
@@ -46,19 +46,20 @@ def getServerDir():
|
|||||||
|
|
||||||
def getArgs():
|
def getArgs():
|
||||||
args = sys.argv[2:]
|
args = sys.argv[2:]
|
||||||
|
|
||||||
tmp = {}
|
tmp = {}
|
||||||
args_len = len(args)
|
args_len = len(args)
|
||||||
|
|
||||||
if args_len == 1:
|
if args_len == 1:
|
||||||
t = args[0].strip('{').strip('}')
|
t = args[0].strip('{').strip('}')
|
||||||
t = t.split(':')
|
if t.strip() == '':
|
||||||
|
tmp = []
|
||||||
|
else:
|
||||||
|
t = t.split(':', 1)
|
||||||
|
tmp[t[0]] = t[1]
|
||||||
tmp[t[0]] = t[1]
|
tmp[t[0]] = t[1]
|
||||||
elif args_len > 1:
|
elif args_len > 1:
|
||||||
for i in range(len(args)):
|
for i in range(len(args)):
|
||||||
t = args[i].split(':')
|
t = args[i].split(':', 1)
|
||||||
tmp[t[0]] = t[1]
|
tmp[t[0]] = t[1]
|
||||||
|
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
|
|
||||||
@@ -2450,6 +2451,16 @@ def doFullSyncUser(version=''):
|
|||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
sync_db = args['db']
|
sync_db = args['db']
|
||||||
|
sync_db_import = args['db']
|
||||||
|
|
||||||
|
if sync_db.lower() == 'all':
|
||||||
|
sync_db_import = ''
|
||||||
|
dbs = findBinlogSlaveDoDb()
|
||||||
|
dbs_str = ''
|
||||||
|
for x in dbs:
|
||||||
|
dbs_str += ' ' + x
|
||||||
|
sync_db = "--databases " + dbs_str.strip()
|
||||||
|
|
||||||
sync_sign = args['sign']
|
sync_sign = args['sign']
|
||||||
|
|
||||||
db = pMysqlDb()
|
db = pMysqlDb()
|
||||||
@@ -2488,7 +2499,7 @@ def doFullSyncUser(version=''):
|
|||||||
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
|
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
|
||||||
sock = getSocketFile()
|
sock = getSocketFile()
|
||||||
my_import_cmd = getServerDir() + '/bin/usr/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \
|
my_import_cmd = getServerDir() + '/bin/usr/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \
|
||||||
' ' + sync_db + ' < ' + bak_file
|
' ' + sync_db_import + ' < ' + bak_file
|
||||||
mw.execShell(my_import_cmd)
|
mw.execShell(my_import_cmd)
|
||||||
|
|
||||||
if version == '8.0':
|
if version == '8.0':
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ log-slave-updates = 1
|
|||||||
# Prevent replication from starting automatically with MySQL
|
# Prevent replication from starting automatically with MySQL
|
||||||
#skip-slave-start = 1
|
#skip-slave-start = 1
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ log-slave-updates = 1
|
|||||||
# Prevent replication from starting automatically with MySQL
|
# Prevent replication from starting automatically with MySQL
|
||||||
#skip-slave-start = 1
|
#skip-slave-start = 1
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ binlog-ignore-db = performance_schema
|
|||||||
# Prevent replication from starting automatically with MySQL
|
# Prevent replication from starting automatically with MySQL
|
||||||
#skip-slave-start = 1
|
#skip-slave-start = 1
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
slave_skip_errors=1062
|
slave_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ log_replica_updates = 1
|
|||||||
# Prevent replication from starting automatically with MySQL
|
# Prevent replication from starting automatically with MySQL
|
||||||
#skip_replica_start = 1
|
#skip_replica_start = 1
|
||||||
#replicate-do-db
|
#replicate-do-db
|
||||||
replica_skip_errors=1062
|
replica_skip_errors=1062,1396
|
||||||
replicate-ignore-db = information_schema
|
replicate-ignore-db = information_schema
|
||||||
replicate-ignore-db = performance_schema
|
replicate-ignore-db = performance_schema
|
||||||
replicate-ignore-db = mysql
|
replicate-ignore-db = mysql
|
||||||
|
|||||||
+68
-7
@@ -45,8 +45,12 @@ def getServerDir():
|
|||||||
|
|
||||||
|
|
||||||
def getInitDFile():
|
def getInitDFile():
|
||||||
if app_debug:
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return '/tmp/' + getPluginName()
|
return '/tmp/' + getPluginName()
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
return '/etc/rc.d/' + getPluginName()
|
||||||
return '/etc/init.d/' + getPluginName()
|
return '/etc/init.d/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
@@ -524,12 +528,26 @@ def initMysql8Pwd():
|
|||||||
def myOp(version, method):
|
def myOp(version, method):
|
||||||
# import commands
|
# import commands
|
||||||
init_file = initDreplace(version)
|
init_file = initDreplace(version)
|
||||||
|
current_os = mw.getOs()
|
||||||
try:
|
try:
|
||||||
isInited = initMysqlData()
|
isInited = initMysqlData()
|
||||||
if not isInited:
|
if not isInited:
|
||||||
mw.execShell('systemctl start mysql')
|
|
||||||
|
if current_os.startswith("freebsd"):
|
||||||
|
mw.execShell('service ' + getPluginName() + ' start')
|
||||||
|
else:
|
||||||
|
mw.execShell('systemctl start mysql')
|
||||||
|
|
||||||
initMysqlPwd()
|
initMysqlPwd()
|
||||||
mw.execShell('systemctl stop mysql')
|
|
||||||
|
if current_os.startswith("freebsd"):
|
||||||
|
mw.execShell('service ' + getPluginName() + ' stop')
|
||||||
|
else:
|
||||||
|
mw.execShell('systemctl stop mysql')
|
||||||
|
|
||||||
|
if current_os.startswith("freebsd"):
|
||||||
|
data = mw.execShell('service ' + getPluginName() + ' ' + method)
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl ' + method + ' mysql')
|
mw.execShell('systemctl ' + method + ' mysql')
|
||||||
return 'ok'
|
return 'ok'
|
||||||
@@ -610,9 +628,15 @@ def reload(version=''):
|
|||||||
|
|
||||||
|
|
||||||
def initdStatus():
|
def initdStatus():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
if os.path.exists(initd_bin):
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
shell_cmd = 'systemctl status mysql | grep loaded | grep "enabled;"'
|
shell_cmd = 'systemctl status mysql | grep loaded | grep "enabled;"'
|
||||||
data = mw.execShell(shell_cmd)
|
data = mw.execShell(shell_cmd)
|
||||||
if data[0] == '':
|
if data[0] == '':
|
||||||
@@ -621,17 +645,34 @@ def initdStatus():
|
|||||||
|
|
||||||
|
|
||||||
def initdInstall():
|
def initdInstall():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
import shutil
|
||||||
|
source_bin = initDreplace()
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
shutil.copyfile(source_bin, initd_bin)
|
||||||
|
mw.execShell('chmod +x ' + initd_bin)
|
||||||
|
mw.execShell('sysrc ' + getPluginName() + '_enable="YES"')
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl enable mysql')
|
mw.execShell('systemctl enable mysql')
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
def initdUinstall():
|
def initdUinstall():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
os.remove(initd_bin)
|
||||||
|
mw.execShell('sysrc ' + getPluginName() + '_enable="NO"')
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl disable mysql')
|
mw.execShell('systemctl disable mysql')
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
@@ -748,6 +789,9 @@ def runInfo(version):
|
|||||||
|
|
||||||
|
|
||||||
def myDbStatus(version):
|
def myDbStatus(version):
|
||||||
|
if status(version) == 'stop':
|
||||||
|
return mw.returnJson(False, 'MySQL未启动', [])
|
||||||
|
|
||||||
result = {}
|
result = {}
|
||||||
db = pMysqlDb()
|
db = pMysqlDb()
|
||||||
data = db.query('show variables')
|
data = db.query('show variables')
|
||||||
@@ -2368,6 +2412,9 @@ def updateSlaveSSH(version=''):
|
|||||||
|
|
||||||
|
|
||||||
def getSlaveList(version=''):
|
def getSlaveList(version=''):
|
||||||
|
if status(version) == 'stop':
|
||||||
|
return mw.returnJson(False, 'MySQL未启动', [])
|
||||||
|
|
||||||
db = pMysqlDb()
|
db = pMysqlDb()
|
||||||
dlist = db.query('show slave status')
|
dlist = db.query('show slave status')
|
||||||
data = {}
|
data = {}
|
||||||
@@ -2383,6 +2430,9 @@ def getSlaveSyncCmd(version=''):
|
|||||||
|
|
||||||
|
|
||||||
def initSlaveStatus(version=''):
|
def initSlaveStatus(version=''):
|
||||||
|
if status(version) == 'stop':
|
||||||
|
return mw.returnJson(False, 'MySQL未启动', [])
|
||||||
|
|
||||||
mode_file = getSyncModeFile()
|
mode_file = getSyncModeFile()
|
||||||
if not os.path.exists(mode_file):
|
if not os.path.exists(mode_file):
|
||||||
return mw.returnJson(False, '需要先设置同步配置')
|
return mw.returnJson(False, '需要先设置同步配置')
|
||||||
@@ -2664,6 +2714,16 @@ def doFullSyncUser(version=''):
|
|||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
sync_db = args['db']
|
sync_db = args['db']
|
||||||
|
sync_db_import = args['db']
|
||||||
|
|
||||||
|
if sync_db.lower() == 'all':
|
||||||
|
sync_db_import = ''
|
||||||
|
dbs = findBinlogSlaveDoDb()
|
||||||
|
dbs_str = ''
|
||||||
|
for x in dbs:
|
||||||
|
dbs_str += ' ' + x
|
||||||
|
sync_db = "--databases " + dbs_str.strip()
|
||||||
|
|
||||||
sync_sign = args['sign']
|
sync_sign = args['sign']
|
||||||
|
|
||||||
db = pMysqlDb()
|
db = pMysqlDb()
|
||||||
@@ -2702,7 +2762,8 @@ def doFullSyncUser(version=''):
|
|||||||
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
|
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
|
||||||
sock = getSocketFile()
|
sock = getSocketFile()
|
||||||
my_import_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \
|
my_import_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \
|
||||||
' ' + sync_db + ' < ' + bak_file
|
' ' + sync_db_import + ' < ' + bak_file
|
||||||
|
# print(my_import_cmd)
|
||||||
mw.execShell(my_import_cmd)
|
mw.execShell(my_import_cmd)
|
||||||
|
|
||||||
if version == '8.0':
|
if version == '8.0':
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"path": "server/mysql/VERSION",
|
"path": "server/mysql/VERSION",
|
||||||
"todo_versions":["5.6","5.7","8.0"],
|
"todo_versions":["5.6","5.7","8.0"],
|
||||||
"versions":["5.5", "5.6", "5.7","8.0"],
|
"versions":["5.5", "5.6", "5.7","8.0"],
|
||||||
"updates":["5.5.62","5.6.50", "5.7.32","8.0.30"],
|
"updates":["5.5.62","5.6.50", "5.7.32","8.0.34"],
|
||||||
"shell":"install.sh",
|
"shell":"install.sh",
|
||||||
"checks":"server/mysql",
|
"checks":"server/mysql",
|
||||||
"path":"server/mysql",
|
"path":"server/mysql",
|
||||||
@@ -19,4 +19,4 @@
|
|||||||
"home":"https://dev.mysql.com/downloads/mysql",
|
"home":"https://dev.mysql.com/downloads/mysql",
|
||||||
"date":"2017-11-24",
|
"date":"2017-11-24",
|
||||||
"pid": "2"
|
"pid": "2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,15 @@ Install_mysql()
|
|||||||
cd ${mysqlDir} && tar -zxvf ${mysqlDir}/mysql-5.5.62.tar.gz
|
cd ${mysqlDir} && tar -zxvf ${mysqlDir}/mysql-5.5.62.tar.gz
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
WHERE_DIR_GCC=/usr/bin/gcc
|
||||||
|
WHERE_DIR_GPP=/usr/bin/g++
|
||||||
|
if [ ! -f $WHERE_DIR_GCC ];then
|
||||||
|
WHERE_DIR_GCC=`which gcc`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $WHERE_DIR_GPP ];then
|
||||||
|
WHERE_DIR_GPP=`which g++`
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -d $serverPath/mysql ];then
|
if [ ! -d $serverPath/mysql ];then
|
||||||
cd ${mysqlDir}/mysql-5.5.62 && cmake \
|
cd ${mysqlDir}/mysql-5.5.62 && cmake \
|
||||||
@@ -81,8 +90,8 @@ Install_mysql()
|
|||||||
-DEXTRA_CHARSETS=all \
|
-DEXTRA_CHARSETS=all \
|
||||||
-DDEFAULT_CHARSET=utf8mb4 \
|
-DDEFAULT_CHARSET=utf8mb4 \
|
||||||
-DDEFAULT_COLLATION=utf8mb4_general_ci \
|
-DDEFAULT_COLLATION=utf8mb4_general_ci \
|
||||||
-DCMAKE_C_COMPILER=/usr/bin/gcc \
|
-DCMAKE_C_COMPILER=$WHERE_DIR_GCC \
|
||||||
-DCMAKE_CXX_COMPILER=/usr/bin/g++
|
-DCMAKE_CXX_COMPILER=$WHERE_DIR_GPP
|
||||||
make -j${cpuCore} && make install && make clean
|
make -j${cpuCore} && make install && make clean
|
||||||
|
|
||||||
if [ -d $serverPath/mysql ];then
|
if [ -d $serverPath/mysql ];then
|
||||||
|
|||||||
@@ -76,9 +76,9 @@ Install_mysql()
|
|||||||
OPENSSL_VERSION=`openssl version|awk '{print $2}'|awk -F '.' '{print $1}'`
|
OPENSSL_VERSION=`openssl version|awk '{print $2}'|awk -F '.' '{print $1}'`
|
||||||
if [ "${OPENSSL_VERSION}" -ge "3" ];then
|
if [ "${OPENSSL_VERSION}" -ge "3" ];then
|
||||||
#openssl version to high
|
#openssl version to high
|
||||||
cd ${rootPath}/plugins/php/lib && /bin/bash openssl.sh
|
cd ${rootPath}/plugins/php/lib && /bin/bash openssl10.sh
|
||||||
export PKG_CONFIG_PATH=$serverPath/lib/openssl/lib/pkgconfig
|
export PKG_CONFIG_PATH=$serverPath/lib/openssl10/lib/pkgconfig
|
||||||
OPTIONS="-DWITH_SSL=${serverPath}/lib/openssl"
|
OPTIONS="-DWITH_SSL=${serverPath}/lib/openssl10"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -d $serverPath/mysql ];then
|
if [ ! -d $serverPath/mysql ];then
|
||||||
|
|||||||
@@ -91,9 +91,9 @@ Install_mysql()
|
|||||||
OPENSSL_VERSION=`openssl version|awk '{print $2}'|awk -F '.' '{print $1}'`
|
OPENSSL_VERSION=`openssl version|awk '{print $2}'|awk -F '.' '{print $1}'`
|
||||||
if [ "${OPENSSL_VERSION}" -ge "3" ];then
|
if [ "${OPENSSL_VERSION}" -ge "3" ];then
|
||||||
#openssl version to high
|
#openssl version to high
|
||||||
cd ${rootPath}/plugins/php/lib && /bin/bash openssl.sh
|
cd ${rootPath}/plugins/php/lib && /bin/bash openssl_11.sh
|
||||||
export PKG_CONFIG_PATH=$serverPath/lib/openssl/lib/pkgconfig
|
export PKG_CONFIG_PATH=$serverPath/lib/openssl11/lib/pkgconfig
|
||||||
OPTIONS="-DWITH_SSL=${serverPath}/lib/openssl"
|
OPTIONS="-DWITH_SSL=${serverPath}/lib/openssl11"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -d $serverPath/mysql ];then
|
if [ ! -d $serverPath/mysql ];then
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ fi
|
|||||||
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
|
||||||
|
|
||||||
|
|
||||||
VERSION=8.0.30
|
VERSION=8.0.34
|
||||||
Install_mysql()
|
Install_mysql()
|
||||||
{
|
{
|
||||||
mkdir -p ${mysqlDir}
|
mkdir -p ${mysqlDir}
|
||||||
@@ -109,11 +109,12 @@ Install_mysql()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f ${mysqlDir}/mysql-boost-${VERSION}.tar.gz ];then
|
if [ ! -f ${mysqlDir}/mysql-boost-${VERSION}.tar.gz ];then
|
||||||
wget --no-check-certificate -O ${mysqlDir}/mysql-boost-${VERSION}.tar.gz --tries=3 https://cdn.mysql.com/archives/mysql-8.0/mysql-boost-${VERSION}.tar.gz
|
#wget --no-check-certificate -O ${mysqlDir}/mysql-boost-${VERSION}.tar.gz --tries=3 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-${VERSION}.tar.gz
|
||||||
|
wget --no-check-certificate -O ${mysqlDir}/mysql-boost-${VERSION}.tar.gz --tries=3 https://cdn.mysql.com/archives/mysql-8.0/mysql-boost-${VERSION}.tar.gz
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#检测文件是否损坏.
|
#检测文件是否损坏.
|
||||||
md5_mysql_ok=313d625fcaa932bd87b48f0cf9b40f1c
|
md5_mysql_ok=c8cfab52fbde1cca55accb3113c235eb
|
||||||
if [ -f ${mysqlDir}/mysql-boost-${VERSION}.tar.gz ];then
|
if [ -f ${mysqlDir}/mysql-boost-${VERSION}.tar.gz ];then
|
||||||
md5_mysql=`md5sum ${mysqlDir}/mysql-boost-${VERSION}.tar.gz | awk '{print $1}'`
|
md5_mysql=`md5sum ${mysqlDir}/mysql-boost-${VERSION}.tar.gz | awk '{print $1}'`
|
||||||
if [ "${md5_mysql_ok}" == "${md5_mysql}" ]; then
|
if [ "${md5_mysql_ok}" == "${md5_mysql}" ]; then
|
||||||
@@ -121,7 +122,7 @@ Install_mysql()
|
|||||||
else
|
else
|
||||||
# 重新下载
|
# 重新下载
|
||||||
rm -rf ${mysqlDir}/mysql-${VERSION}
|
rm -rf ${mysqlDir}/mysql-${VERSION}
|
||||||
wget --no-check-certificate -O ${mysqlDir}/mysql-boost-${VERSION}.tar.gz --tries=3 https://cdn.mysql.com/archives/mysql-8.0/mysql-boost-${VERSION}.tar.gz
|
wget --no-check-certificate -O ${mysqlDir}/mysql-boost-${VERSION}.tar.gz --tries=3 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-${VERSION}.tar.gz
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -162,10 +163,10 @@ Install_mysql()
|
|||||||
add-apt-repository ppa:ubuntu-toolchain-r/test
|
add-apt-repository ppa:ubuntu-toolchain-r/test
|
||||||
|
|
||||||
LIBTIRPC_VER=`pkg-config libtirpc --modversion`
|
LIBTIRPC_VER=`pkg-config libtirpc --modversion`
|
||||||
if [ ! -f ${mysqlDir}/libtirpc_1.2.5.orig.tar.bz2 ];then
|
if [ ! -f ${mysqlDir}/libtirpc_1.3.3.orig.tar.bz2 ];then
|
||||||
wget --no-check-certificate -O ${mysqlDir}/libtirpc_1.2.5.orig.tar.bz2 https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/libtirpc/1.2.5-1ubuntu0.1/libtirpc_1.2.5.orig.tar.bz2
|
wget --no-check-certificate -O ${mysqlDir}/libtirpc_1.3.3.orig.tar.bz2 https://downloads.sourceforge.net/libtirpc/libtirpc-1.3.3.tar.bz2
|
||||||
cd ${mysqlDir} && tar -jxvf libtirpc_1.2.5.orig.tar.bz2
|
cd ${mysqlDir} && tar -jxvf libtirpc_1.3.3.orig.tar.bz2
|
||||||
cd libtirpc-1.2.5 && ./configure
|
cd libtirpc-1.3.3 && ./configure
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
|
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
|
||||||
|
|||||||
@@ -245,6 +245,7 @@
|
|||||||
<p onclick="wafScreen();">首页</p>
|
<p onclick="wafScreen();">首页</p>
|
||||||
<p onclick="wafGloabl();">全局配置</p>
|
<p onclick="wafGloabl();">全局配置</p>
|
||||||
<p onclick="wafSite();">站点配置</p>
|
<p onclick="wafSite();">站点配置</p>
|
||||||
|
<p onclick="wafAreaLimit();">地区限制</p>
|
||||||
<p onclick="wafLogs();">封锁历史</p>
|
<p onclick="wafLogs();">封锁历史</p>
|
||||||
<!-- <p onclick="wafOpLogs();">操作日志</p> -->
|
<!-- <p onclick="wafOpLogs();">操作日志</p> -->
|
||||||
</div>
|
</div>
|
||||||
@@ -255,9 +256,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
<script src="/plugins/file?name=op_waf&f=js/op_waf.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
resetPluginWinWidth(800);
|
resetPluginWinWidth(800);
|
||||||
$.getScript( "/plugins/file?name=op_waf&f=js/op_waf.js", function(){
|
|
||||||
|
$.getScript( "/plugins/file?name=op_waf&f=js/op_waf.js", function(data, textStatus, jqxhr){
|
||||||
|
// console.log(data, textStatus, jqxhr);
|
||||||
pluginService('op_waf');
|
pluginService('op_waf');
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
+370
-158
@@ -1,5 +1,9 @@
|
|||||||
# coding:utf-8
|
# coding:utf-8
|
||||||
|
|
||||||
|
'''
|
||||||
|
cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/op_waf && bash install.sh install 0.3.2
|
||||||
|
python3 /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/op_waf/index.py reload
|
||||||
|
'''
|
||||||
import sys
|
import sys
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
@@ -73,6 +77,10 @@ def getConf():
|
|||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def dstWafConfPath():
|
||||||
|
return mw.getServerDir() + "/web_conf/nginx/vhost/opwaf.conf"
|
||||||
|
|
||||||
|
|
||||||
def pSqliteDb(dbname='logs'):
|
def pSqliteDb(dbname='logs'):
|
||||||
name = "waf"
|
name = "waf"
|
||||||
db_dir = getServerDir() + '/logs/'
|
db_dir = getServerDir() + '/logs/'
|
||||||
@@ -97,10 +105,9 @@ def pSqliteDb(dbname='logs'):
|
|||||||
return conn
|
return conn
|
||||||
|
|
||||||
|
|
||||||
def initDomainInfo():
|
def initDomainInfo(conf_reload=False):
|
||||||
data = []
|
data = []
|
||||||
path_domains = getJsonPath('domains')
|
path_domains = getJsonPath('domains')
|
||||||
|
|
||||||
_list = mw.M('sites').field('id,name,path').where(
|
_list = mw.M('sites').field('id,name,path').where(
|
||||||
'status=?', ('1',)).order('id desc').select()
|
'status=?', ('1',)).order('id desc').select()
|
||||||
|
|
||||||
@@ -122,11 +129,12 @@ def initDomainInfo():
|
|||||||
mw.writeFile(path_domains, cjson)
|
mw.writeFile(path_domains, cjson)
|
||||||
|
|
||||||
|
|
||||||
def initSiteInfo():
|
def initSiteInfo(conf_reload=False):
|
||||||
data = []
|
data = []
|
||||||
|
|
||||||
|
path_site = getJsonPath('site')
|
||||||
path_domains = getJsonPath('domains')
|
path_domains = getJsonPath('domains')
|
||||||
path_config = getJsonPath('config')
|
path_config = getJsonPath('config')
|
||||||
path_site = getJsonPath('site')
|
|
||||||
|
|
||||||
config_contents = mw.readFile(path_config)
|
config_contents = mw.readFile(path_config)
|
||||||
config_contents = json.loads(config_contents)
|
config_contents = json.loads(config_contents)
|
||||||
@@ -136,6 +144,8 @@ def initSiteInfo():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
site_contents = mw.readFile(path_site)
|
site_contents = mw.readFile(path_site)
|
||||||
|
if not site_contents:
|
||||||
|
site_contents = "{}"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
site_contents = "{}"
|
site_contents = "{}"
|
||||||
|
|
||||||
@@ -192,10 +202,11 @@ def initSiteInfo():
|
|||||||
mw.writeFile(path_site, cjson)
|
mw.writeFile(path_site, cjson)
|
||||||
|
|
||||||
|
|
||||||
def initTotalInfo():
|
def initTotalInfo(conf_reload=False):
|
||||||
data = []
|
data = []
|
||||||
path_domains = getJsonPath('domains')
|
|
||||||
path_total = getJsonPath('total')
|
path_total = getJsonPath('total')
|
||||||
|
path_domains = getJsonPath('domains')
|
||||||
|
|
||||||
domain_contents = mw.readFile(path_domains)
|
domain_contents = mw.readFile(path_domains)
|
||||||
domain_contents = json.loads(domain_contents)
|
domain_contents = json.loads(domain_contents)
|
||||||
@@ -230,10 +241,6 @@ def initTotalInfo():
|
|||||||
mw.writeFile(path_total, cjson)
|
mw.writeFile(path_total, cjson)
|
||||||
|
|
||||||
|
|
||||||
def dstWafConf():
|
|
||||||
return mw.getServerDir() + "/web_conf/nginx/vhost/opwaf.conf"
|
|
||||||
|
|
||||||
|
|
||||||
def contentReplace(content):
|
def contentReplace(content):
|
||||||
service_path = mw.getServerDir()
|
service_path = mw.getServerDir()
|
||||||
waf_root = getServerDir()
|
waf_root = getServerDir()
|
||||||
@@ -242,121 +249,245 @@ def contentReplace(content):
|
|||||||
content = content.replace('{$SERVER_PATH}', service_path)
|
content = content.replace('{$SERVER_PATH}', service_path)
|
||||||
content = content.replace('{$WAF_PATH}', waf_path)
|
content = content.replace('{$WAF_PATH}', waf_path)
|
||||||
content = content.replace('{$WAF_ROOT}', waf_root)
|
content = content.replace('{$WAF_ROOT}', waf_root)
|
||||||
|
|
||||||
|
if mw.isAppleSystem():
|
||||||
|
content = content.replace('{$MMDB_FILE_SUFFIX}', 'dylib')
|
||||||
|
else:
|
||||||
|
content = content.replace('{$MMDB_FILE_SUFFIX}', 'so')
|
||||||
|
|
||||||
return content
|
return content
|
||||||
|
|
||||||
|
|
||||||
def autoMakeLuaConfSingle(file):
|
def autoMakeLuaConfSingle(file, conf_reload=False):
|
||||||
# path = getPluginDir() + "/waf/rule/" + file + ".json"
|
|
||||||
path = getServerDir() + "/waf/rule/" + file + ".json"
|
path = getServerDir() + "/waf/rule/" + file + ".json"
|
||||||
to_path = getServerDir() + "/waf/conf/rule_" + file + ".lua"
|
dst_path = getServerDir() + "/waf/conf/rule_" + file + ".lua"
|
||||||
|
if not os.path.exists(dst_path) or conf_reload:
|
||||||
|
content = mw.readFile(path)
|
||||||
|
# print(content)
|
||||||
|
content = json.loads(content)
|
||||||
|
listToLuaFile(dst_path, content)
|
||||||
|
|
||||||
|
|
||||||
|
def autoCpImport(file):
|
||||||
|
path = getPluginDir() + "/waf/" + file + ".json"
|
||||||
|
dst_path = getServerDir() + "/waf/" + file + ".json"
|
||||||
content = mw.readFile(path)
|
content = mw.readFile(path)
|
||||||
# print(content)
|
mw.writeFile(dst_path, content)
|
||||||
content = json.loads(content)
|
|
||||||
listToLuaFile(to_path, content)
|
|
||||||
|
|
||||||
|
|
||||||
def autoMakeLuaImportSingle(file):
|
def autoMakeLuaImportSingle(file, conf_reload=False):
|
||||||
path = getServerDir() + "/waf/" + file + ".json"
|
path = getServerDir() + "/waf/" + file + ".json"
|
||||||
to_path = getServerDir() + "/waf/conf/waf_" + file + ".lua"
|
dst_path = getServerDir() + "/waf/conf/waf_" + file + ".lua"
|
||||||
content = mw.readFile(path)
|
if not os.path.exists(dst_path) or conf_reload:
|
||||||
# print(content)
|
content = mw.readFile(path)
|
||||||
content = json.loads(content)
|
# print(content)
|
||||||
listToLuaFile(to_path, content)
|
content = json.loads(content)
|
||||||
|
listToLuaFile(dst_path, content)
|
||||||
|
|
||||||
|
|
||||||
def autoMakeLuaHtmlSingle(file):
|
def autoMakeLuaHtmlSingle(file, conf_reload=False):
|
||||||
path = getServerDir() + "/waf/html/" + file + ".html"
|
path = getServerDir() + "/waf/html/" + file + ".html"
|
||||||
to_path = getServerDir() + "/waf/html/html_" + file + ".lua"
|
dst_path = getServerDir() + "/waf/html/html_" + file + ".lua"
|
||||||
|
if not os.path.exists(dst_path) or conf_reload:
|
||||||
|
content = mw.readFile(path)
|
||||||
|
htmlToLuaFile(dst_path, content)
|
||||||
|
|
||||||
|
|
||||||
|
def autoCpHtml(file):
|
||||||
|
path = getPluginDir() + "/waf/html/" + file + ".html"
|
||||||
|
dst_path = getServerDir() + "/waf/html/" + file + ".html"
|
||||||
content = mw.readFile(path)
|
content = mw.readFile(path)
|
||||||
htmlToLuaFile(to_path, content)
|
mw.writeFile(dst_path, content)
|
||||||
|
|
||||||
|
|
||||||
def autoMakeLuaConf():
|
def autoMakeLuaConf(conf_reload=False, cp_reload=False):
|
||||||
conf_list = ['args', 'cookie', 'ip_black', 'ip_white',
|
conf_list = ['args', 'cookie', 'ip_black', 'ip_white',
|
||||||
'ipv6_black', 'post', 'scan_black', 'url',
|
'ipv6_black', 'post', 'scan_black', 'url',
|
||||||
'url_white', 'user_agent']
|
'url_white', 'user_agent']
|
||||||
for x in conf_list:
|
for x in conf_list:
|
||||||
autoMakeLuaConfSingle(x)
|
autoMakeLuaConfSingle(x, conf_reload)
|
||||||
|
|
||||||
import_list = ['config', 'site', 'domains']
|
import_list = ['config', 'site', 'domains', 'area_limit']
|
||||||
for x in import_list:
|
for x in import_list:
|
||||||
autoMakeLuaImportSingle(x)
|
autoMakeLuaImportSingle(x, conf_reload)
|
||||||
|
|
||||||
html_list = ['get', 'post', 'safe_js', 'user_agent', 'cookie', 'other']
|
html_list = ['get', 'post', 'safe_js', 'user_agent', 'cookie', 'other']
|
||||||
for x in html_list:
|
for x in html_list:
|
||||||
autoMakeLuaHtmlSingle(x)
|
if cp_reload:
|
||||||
|
autoCpHtml(x)
|
||||||
|
autoMakeLuaHtmlSingle(x, conf_reload)
|
||||||
|
|
||||||
|
|
||||||
def initDefaultInfo():
|
def initDefaultInfo(conf_reload=False):
|
||||||
path = getServerDir()
|
path = getServerDir()
|
||||||
djson = path + "/waf/domains.json"
|
dst_path = path + "/waf/default.pl"
|
||||||
default_json = path + "/waf/default.json"
|
default_site = ''
|
||||||
if os.path.exists(djson):
|
if os.path.exists(dst_path):
|
||||||
content = mw.readFile(djson)
|
return True
|
||||||
content = json.loads(content)
|
source_path = path + "/waf/domains.json"
|
||||||
|
content = mw.readFile(source_path)
|
||||||
|
content = json.loads(content)
|
||||||
|
|
||||||
ddata = {}
|
ddata = {}
|
||||||
dlist = []
|
dlist = []
|
||||||
for i in content:
|
for i in content:
|
||||||
dlist.append(i["name"])
|
dlist.append(i["name"])
|
||||||
|
|
||||||
dlist.append('unset')
|
dlist.append('unset')
|
||||||
ddata["list"] = dlist
|
ddata["list"] = dlist
|
||||||
if len(ddata["list"]) < 1:
|
if len(ddata["list"]) < 1:
|
||||||
ddata["default"] = "unset"
|
default_site = "unset"
|
||||||
else:
|
else:
|
||||||
ddata["default"] = dlist[0]
|
default_site = dlist[0]
|
||||||
|
|
||||||
mw.writeFile(default_json, json.dumps(ddata))
|
mw.writeFile(dst_path, default_site)
|
||||||
|
|
||||||
|
|
||||||
def autoMakeConfig():
|
def getSiteListData():
|
||||||
path = getServerDir()
|
path = getServerDir()
|
||||||
|
source_path = path + "/waf/domains.json"
|
||||||
|
dst_path = path + "/waf/default.pl"
|
||||||
|
|
||||||
initDomainInfo()
|
content = mw.readFile(source_path)
|
||||||
initSiteInfo()
|
content = json.loads(content)
|
||||||
initTotalInfo()
|
dlist = []
|
||||||
autoMakeLuaConf()
|
for i in content:
|
||||||
|
dlist.append(i["name"])
|
||||||
|
dlist.append('unset')
|
||||||
|
|
||||||
|
default_site = mw.readFile(dst_path)
|
||||||
|
|
||||||
|
data = {}
|
||||||
|
data['list'] = dlist
|
||||||
|
data['default'] = default_site
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def restartWeb():
|
def setDefaultSite(name):
|
||||||
autoMakeConfig()
|
path = getServerDir()
|
||||||
|
dst_path = path + "/waf/default.pl"
|
||||||
|
mw.writeFile(dst_path, name)
|
||||||
|
return mw.returnJson(True, 'OK')
|
||||||
|
|
||||||
|
|
||||||
|
def getDefaultSite():
|
||||||
|
data = getSiteListData()
|
||||||
|
return mw.returnJson(True, 'OK', data)
|
||||||
|
|
||||||
|
|
||||||
|
def getCountry():
|
||||||
|
data = ['中国大陆以外的地区(包括[中国特别行政区:港,澳,台])', '中国大陆(不包括[中国特别行政区:港,澳,台])', '中国香港', '中国澳门', '中国台湾',
|
||||||
|
'美国', '日本', '英国', '德国', '韩国', '法国', '巴西', '加拿大', '意大利', '澳大利亚', '荷兰', '俄罗斯', '印度', '瑞典', '西班牙', '墨西哥',
|
||||||
|
'比利时', '南非', '波兰', '瑞士', '阿根廷', '印度尼西亚', '埃及', '哥伦比亚', '土耳其', '越南', '挪威', '芬兰', '丹麦', '乌克兰', '奥地利',
|
||||||
|
'伊朗', '智利', '罗马尼亚', '捷克', '泰国', '沙特阿拉伯', '以色列', '新西兰', '委内瑞拉', '摩洛哥', '马来西亚', '葡萄牙', '爱尔兰', '新加坡',
|
||||||
|
'欧洲联盟', '匈牙利', '希腊', '菲律宾', '巴基斯坦', '保加利亚', '肯尼亚', '阿拉伯联合酋长国', '阿尔及利亚', '塞舌尔', '突尼斯', '秘鲁', '哈萨克斯坦',
|
||||||
|
'斯洛伐克', '斯洛文尼亚', '厄瓜多尔', '哥斯达黎加', '乌拉圭', '立陶宛', '塞尔维亚', '尼日利亚', '克罗地亚', '科威特', '巴拿马', '毛里求斯', '白俄罗斯',
|
||||||
|
'拉脱维亚', '多米尼加', '卢森堡', '爱沙尼亚', '苏丹', '格鲁吉亚', '安哥拉', '玻利维亚', '赞比亚', '孟加拉国', '巴拉圭', '波多黎各', '坦桑尼亚',
|
||||||
|
'塞浦路斯', '摩尔多瓦', '阿曼', '冰岛', '叙利亚', '卡塔尔', '波黑', '加纳', '阿塞拜疆', '马其顿', '约旦', '萨尔瓦多', '伊拉克', '亚美尼亚', '马耳他',
|
||||||
|
'危地马拉', '巴勒斯坦', '斯里兰卡', '特立尼达和多巴哥', '黎巴嫩', '尼泊尔', '纳米比亚', '巴林', '洪都拉斯', '莫桑比克', '尼加拉瓜', '卢旺达', '加蓬',
|
||||||
|
'阿尔巴尼亚', '利比亚', '吉尔吉斯坦', '柬埔寨', '古巴', '喀麦隆', '乌干达', '塞内加尔', '乌兹别克斯坦', '黑山', '关岛', '牙买加', '蒙古', '文莱',
|
||||||
|
'英属维尔京群岛', '留尼旺', '库拉索岛', '科特迪瓦', '开曼群岛', '巴巴多斯', '马达加斯加', '伯利兹', '新喀里多尼亚', '海地', '马拉维', '斐济', '巴哈马',
|
||||||
|
'博茨瓦纳', '扎伊尔', '阿富汗', '莱索托', '百慕大', '埃塞俄比亚', '美属维尔京群岛', '列支敦士登', '津巴布韦', '直布罗陀', '苏里南', '马里', '也门',
|
||||||
|
'老挝', '塔吉克斯坦', '安提瓜和巴布达', '贝宁', '法属玻利尼西亚', '圣基茨和尼维斯', '圭亚那', '布基纳法索', '马尔代夫', '泽西岛', '摩纳哥', '巴布亚新几内亚',
|
||||||
|
'刚果', '塞拉利昂', '吉布提', '斯威士兰', '缅甸', '毛里塔尼亚', '法罗群岛', '尼日尔', '安道尔', '阿鲁巴', '布隆迪', '圣马力诺', '利比里亚',
|
||||||
|
'冈比亚', '不丹', '几内亚', '圣文森特岛', '荷兰加勒比区', '圣马丁', '多哥', '格陵兰', '佛得角', '马恩岛', '索马里', '法属圭亚那', '西萨摩亚',
|
||||||
|
'土库曼斯坦', '瓜德罗普', '马里亚那群岛', '瓦努阿图', '马提尼克', '赤道几内亚', '南苏丹', '梵蒂冈', '格林纳达', '所罗门群岛', '特克斯和凯科斯群岛', '多米尼克',
|
||||||
|
'乍得', '汤加', '瑙鲁', '圣多美和普林西比', '安圭拉岛', '法属圣马丁', '图瓦卢', '库克群岛', '密克罗尼西亚联邦', '根西岛', '东帝汶', '中非',
|
||||||
|
'几内亚比绍', '帕劳', '美属萨摩亚', '厄立特里亚', '科摩罗', '圣皮埃尔和密克隆', '瓦利斯和富图纳', '英属印度洋领地', '托克劳', '马绍尔群岛', '基里巴斯',
|
||||||
|
'纽埃', '诺福克岛', '蒙特塞拉特岛', '朝鲜', '马约特', '圣卢西亚', '圣巴泰勒米岛']
|
||||||
|
return mw.returnJson(True, 'ok', data)
|
||||||
|
|
||||||
|
|
||||||
|
def autoMakeConfig(conf_reload=False, cp_reload=False):
|
||||||
|
initDomainInfo(conf_reload)
|
||||||
|
initSiteInfo(conf_reload)
|
||||||
|
initTotalInfo(conf_reload)
|
||||||
|
autoMakeLuaConf(conf_reload, cp_reload)
|
||||||
|
initDefaultInfo(conf_reload)
|
||||||
|
|
||||||
|
|
||||||
|
def setConfRestartWeb():
|
||||||
|
autoMakeConfig(True, False)
|
||||||
mw.opWeb('stop')
|
mw.opWeb('stop')
|
||||||
mw.opWeb('start')
|
mw.opWeb('start')
|
||||||
|
|
||||||
|
|
||||||
def makeDstLua():
|
def restartWeb():
|
||||||
|
mw.opWeb('stop')
|
||||||
|
mw.opWeb('start')
|
||||||
|
|
||||||
|
|
||||||
|
def makeOpDstRunLua(conf_reload=False):
|
||||||
root_init_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_by_lua_file'
|
root_init_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_by_lua_file'
|
||||||
root_worker_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_worker_by_lua_file'
|
root_worker_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_worker_by_lua_file'
|
||||||
root_access_dir = mw.getServerDir() + '/web_conf/nginx/lua/access_by_lua_file'
|
root_access_dir = mw.getServerDir() + '/web_conf/nginx/lua/access_by_lua_file'
|
||||||
path = getServerDir()
|
path = getServerDir()
|
||||||
path_tpl = getPluginDir()
|
path_tpl = getPluginDir()
|
||||||
|
|
||||||
waf_common_tpl = path_tpl + "/waf/lua/waf_common.lua"
|
|
||||||
waf_common_dst = path + "/waf/lua/waf_common.lua"
|
waf_common_dst = path + "/waf/lua/waf_common.lua"
|
||||||
content = mw.readFile(waf_common_tpl)
|
if not os.path.exists(waf_common_dst) or conf_reload:
|
||||||
content = contentReplace(content)
|
waf_common_tpl = path_tpl + "/waf/lua/waf_common.lua"
|
||||||
mw.writeFile(waf_common_dst, content)
|
content = mw.readFile(waf_common_tpl)
|
||||||
|
content = contentReplace(content)
|
||||||
|
mw.writeFile(waf_common_dst, content)
|
||||||
|
|
||||||
waf_init_tpl = path_tpl + "/waf/lua/init_preload.lua"
|
|
||||||
waf_init_dst = root_init_dir + "/waf_init_preload.lua"
|
waf_init_dst = root_init_dir + "/waf_init_preload.lua"
|
||||||
content = mw.readFile(waf_init_tpl)
|
if not os.path.exists(waf_init_dst) or conf_reload:
|
||||||
content = contentReplace(content)
|
waf_init_tpl = path_tpl + "/waf/lua/init_preload.lua"
|
||||||
mw.writeFile(waf_init_dst, content)
|
content = mw.readFile(waf_init_tpl)
|
||||||
|
content = contentReplace(content)
|
||||||
|
mw.writeFile(waf_init_dst, content)
|
||||||
|
|
||||||
init_worker_tpl = path_tpl + "/waf/lua/init_worker.lua"
|
|
||||||
init_worker_dst = root_worker_dir + '/opwaf_init_worker.lua'
|
init_worker_dst = root_worker_dir + '/opwaf_init_worker.lua'
|
||||||
content = mw.readFile(init_worker_tpl)
|
if not os.path.exists(init_worker_dst) or conf_reload:
|
||||||
content = contentReplace(content)
|
init_worker_tpl = path_tpl + "/waf/lua/init_worker.lua"
|
||||||
mw.writeFile(init_worker_dst, content)
|
content = mw.readFile(init_worker_tpl)
|
||||||
|
content = contentReplace(content)
|
||||||
|
mw.writeFile(init_worker_dst, content)
|
||||||
|
|
||||||
access_file_tpl = path_tpl + "/waf/lua/init.lua"
|
|
||||||
access_file_dst = root_access_dir + '/opwaf_init.lua'
|
access_file_dst = root_access_dir + '/opwaf_init.lua'
|
||||||
content = mw.readFile(access_file_tpl)
|
if not os.path.exists(access_file_dst) or conf_reload:
|
||||||
content = contentReplace(content)
|
access_file_tpl = path_tpl + "/waf/lua/init.lua"
|
||||||
mw.writeFile(access_file_dst, content)
|
access_file_dst_s = path + "/waf/lua/init.lua"
|
||||||
|
content = mw.readFile(access_file_tpl)
|
||||||
|
content = contentReplace(content)
|
||||||
|
mw.writeFile(access_file_dst, content)
|
||||||
|
mw.writeFile(access_file_dst_s, content)
|
||||||
|
|
||||||
|
waf_mmdb_dst = path + "/waf/lua/waf_maxminddb.lua"
|
||||||
|
if not os.path.exists(waf_mmdb_dst) or conf_reload:
|
||||||
|
waf_mmdb_tpl = path_tpl + "/waf/lua/waf_maxminddb.lua"
|
||||||
|
content = mw.readFile(waf_mmdb_tpl)
|
||||||
|
content = contentReplace(content)
|
||||||
|
mw.writeFile(waf_mmdb_dst, content)
|
||||||
|
|
||||||
mw.opLuaMakeAll()
|
mw.opLuaMakeAll()
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def makeOpDstStopLua():
|
||||||
|
root_init_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_by_lua_file'
|
||||||
|
root_worker_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_worker_by_lua_file'
|
||||||
|
root_access_dir = mw.getServerDir() + '/web_conf/nginx/lua/access_by_lua_file'
|
||||||
|
|
||||||
|
waf_init_dst = root_init_dir + "/waf_init_preload.lua"
|
||||||
|
if os.path.exists(waf_init_dst):
|
||||||
|
os.remove(waf_init_dst)
|
||||||
|
|
||||||
|
init_worker_dst = root_worker_dir + '/opwaf_init_worker.lua'
|
||||||
|
if os.path.exists(init_worker_dst):
|
||||||
|
os.remove(init_worker_dst)
|
||||||
|
|
||||||
|
access_file_dst = root_access_dir + '/opwaf_init.lua'
|
||||||
|
if os.path.exists(access_file_dst):
|
||||||
|
os.remove(access_file_dst)
|
||||||
|
|
||||||
|
wafconf = dstWafConfPath()
|
||||||
|
if os.path.exists(wafconf):
|
||||||
|
os.remove(wafconf)
|
||||||
|
|
||||||
|
mw.opLuaMakeAll()
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def initDreplace():
|
def initDreplace():
|
||||||
@@ -377,30 +508,25 @@ def initDreplace():
|
|||||||
config = path + '/waf/config.json'
|
config = path + '/waf/config.json'
|
||||||
content = mw.readFile(config)
|
content = mw.readFile(config)
|
||||||
content = json.loads(content)
|
content = json.loads(content)
|
||||||
|
content['reqfile_path'] = path + "/waf/html"
|
||||||
wfDir = path + "/waf/html"
|
|
||||||
content['reqfile_path'] = wfDir
|
|
||||||
mw.writeFile(config, mw.getJson(content))
|
mw.writeFile(config, mw.getJson(content))
|
||||||
|
|
||||||
makeDstLua()
|
makeOpDstRunLua()
|
||||||
|
|
||||||
waf_conf = dstWafConf()
|
waf_conf = dstWafConfPath()
|
||||||
if not os.path.exists(waf_conf):
|
if not os.path.exists(waf_conf):
|
||||||
waf_tpl = getPluginDir() + "/conf/luawaf.conf"
|
waf_tpl = getPluginDir() + "/conf/luawaf.conf"
|
||||||
content = mw.readFile(waf_tpl)
|
content = mw.readFile(waf_tpl)
|
||||||
content = contentReplace(content)
|
content = contentReplace(content)
|
||||||
mw.writeFile(waf_conf, content)
|
mw.writeFile(waf_conf, content)
|
||||||
|
|
||||||
initDomainInfo()
|
autoMakeConfig(True, False)
|
||||||
initSiteInfo()
|
|
||||||
initTotalInfo()
|
|
||||||
autoMakeLuaConf()
|
|
||||||
initDefaultInfo()
|
|
||||||
|
|
||||||
pSqliteDb()
|
pSqliteDb()
|
||||||
|
|
||||||
if not mw.isAppleSystem():
|
if not mw.isAppleSystem():
|
||||||
mw.execShell("chown -R www:www " + path)
|
mw.execShell("chown -R www:www " + path)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
def status():
|
def status():
|
||||||
@@ -408,7 +534,7 @@ def status():
|
|||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
return 'stop'
|
return 'stop'
|
||||||
|
|
||||||
waf_conf = dstWafConf()
|
waf_conf = dstWafConfPath()
|
||||||
if not os.path.exists(waf_conf):
|
if not os.path.exists(waf_conf):
|
||||||
return 'stop'
|
return 'stop'
|
||||||
return 'start'
|
return 'start'
|
||||||
@@ -425,31 +551,12 @@ def start():
|
|||||||
|
|
||||||
|
|
||||||
def stop():
|
def stop():
|
||||||
root_init_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_by_lua_file'
|
|
||||||
root_worker_dir = mw.getServerDir() + '/web_conf/nginx/lua/init_worker_by_lua_file'
|
|
||||||
root_access_dir = mw.getServerDir() + '/web_conf/nginx/lua/access_by_lua_file'
|
|
||||||
|
|
||||||
waf_init_dst = root_init_dir + "/waf_init_preload.lua"
|
makeOpDstStopLua()
|
||||||
if os.path.exists(waf_init_dst):
|
|
||||||
os.remove(waf_init_dst)
|
|
||||||
|
|
||||||
init_worker_dst = root_worker_dir + '/opwaf_init_worker.lua'
|
|
||||||
if os.path.exists(init_worker_dst):
|
|
||||||
os.remove(init_worker_dst)
|
|
||||||
|
|
||||||
access_file_dst = root_access_dir + '/opwaf_init.lua'
|
|
||||||
if os.path.exists(access_file_dst):
|
|
||||||
os.remove(access_file_dst)
|
|
||||||
|
|
||||||
wafconf = dstWafConf()
|
|
||||||
if os.path.exists(wafconf):
|
|
||||||
os.remove(wafconf)
|
|
||||||
|
|
||||||
import tool_task
|
import tool_task
|
||||||
tool_task.removeBgTask()
|
tool_task.removeBgTask()
|
||||||
|
|
||||||
mw.opLuaMakeAll()
|
|
||||||
|
|
||||||
restartWeb()
|
restartWeb()
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
@@ -460,16 +567,16 @@ def restart():
|
|||||||
|
|
||||||
|
|
||||||
def reload():
|
def reload():
|
||||||
stop()
|
mw.opWeb('stop')
|
||||||
|
|
||||||
makeDstLua()
|
makeOpDstRunLua(True)
|
||||||
|
autoMakeConfig(True, False)
|
||||||
|
|
||||||
errlog = mw.getServerDir() + "/openresty/nginx/logs/error.log"
|
elog = mw.getServerDir() + "/openresty/nginx/logs/error.log"
|
||||||
mw.execShell('rm -rf ' + errlog)
|
if os.path.exists(elog):
|
||||||
|
mw.execShell('rm -rf ' + elog)
|
||||||
|
|
||||||
start()
|
mw.opWeb('start')
|
||||||
|
|
||||||
restartWeb()
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
@@ -519,7 +626,8 @@ def addRule():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(fpath, cjson)
|
mw.writeFile(fpath, cjson)
|
||||||
restartWeb()
|
|
||||||
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', content)
|
return mw.returnJson(True, '设置成功!', content)
|
||||||
|
|
||||||
|
|
||||||
@@ -541,7 +649,8 @@ def removeRule():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(fpath, cjson)
|
mw.writeFile(fpath, cjson)
|
||||||
restartWeb()
|
|
||||||
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', content)
|
return mw.returnJson(True, '设置成功!', content)
|
||||||
|
|
||||||
|
|
||||||
@@ -566,7 +675,8 @@ def setRuleState():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(fpath, cjson)
|
mw.writeFile(fpath, cjson)
|
||||||
restartWeb()
|
|
||||||
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', content)
|
return mw.returnJson(True, '设置成功!', content)
|
||||||
|
|
||||||
|
|
||||||
@@ -597,7 +707,8 @@ def modifyRule():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(fpath, cjson)
|
mw.writeFile(fpath, cjson)
|
||||||
restartWeb()
|
|
||||||
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', content)
|
return mw.returnJson(True, '设置成功!', content)
|
||||||
|
|
||||||
|
|
||||||
@@ -638,7 +749,8 @@ def addSiteRule():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
restartWeb()
|
|
||||||
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -674,7 +786,7 @@ def addIpWhite():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -696,7 +808,7 @@ def removeIpWhite():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -733,7 +845,7 @@ def addIpBlack():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -755,7 +867,7 @@ def removeIpBlack():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -774,7 +886,7 @@ def setIpv6Black():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -794,7 +906,7 @@ def delIpv6Black():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -818,7 +930,7 @@ def removeSiteRule():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -839,7 +951,7 @@ def setObjStatus():
|
|||||||
cjson = mw.getJson(cobj)
|
cjson = mw.getJson(cobj)
|
||||||
mw.writeFile(conf, cjson)
|
mw.writeFile(conf, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -859,13 +971,13 @@ def setRetry():
|
|||||||
cjson = mw.getJson(cobj)
|
cjson = mw.getJson(cobj)
|
||||||
mw.writeFile(conf, cjson)
|
mw.writeFile(conf, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', [])
|
return mw.returnJson(True, '设置成功!', [])
|
||||||
|
|
||||||
|
|
||||||
def setSafeVerify():
|
def setSafeVerify():
|
||||||
args = getArgs()
|
args = getArgs()
|
||||||
data = checkArgs(args, ['auto', 'time', 'cpu'])
|
data = checkArgs(args, ['auto', 'time', 'cpu', 'mode'])
|
||||||
if not data[0]:
|
if not data[0]:
|
||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
@@ -875,6 +987,7 @@ def setSafeVerify():
|
|||||||
|
|
||||||
cobj['safe_verify']['time'] = args['time']
|
cobj['safe_verify']['time'] = args['time']
|
||||||
cobj['safe_verify']['cpu'] = int(args['cpu'])
|
cobj['safe_verify']['cpu'] = int(args['cpu'])
|
||||||
|
cobj['safe_verify']['mode'] = args['mode']
|
||||||
|
|
||||||
if args['auto'] == '0':
|
if args['auto'] == '0':
|
||||||
cobj['safe_verify']['auto'] = False
|
cobj['safe_verify']['auto'] = False
|
||||||
@@ -884,7 +997,7 @@ def setSafeVerify():
|
|||||||
cjson = mw.getJson(cobj)
|
cjson = mw.getJson(cobj)
|
||||||
mw.writeFile(conf, cjson)
|
mw.writeFile(conf, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', [])
|
return mw.returnJson(True, '设置成功!', [])
|
||||||
|
|
||||||
|
|
||||||
@@ -915,7 +1028,7 @@ def setCcConf():
|
|||||||
cjson = mw.getJson(cobj)
|
cjson = mw.getJson(cobj)
|
||||||
mw.writeFile(conf, cjson)
|
mw.writeFile(conf, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', [])
|
return mw.returnJson(True, '设置成功!', [])
|
||||||
|
|
||||||
|
|
||||||
@@ -933,7 +1046,7 @@ def saveScanRule():
|
|||||||
cjson = mw.getJson(args)
|
cjson = mw.getJson(args)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!', [])
|
return mw.returnJson(True, '设置成功!', [])
|
||||||
|
|
||||||
|
|
||||||
@@ -973,26 +1086,6 @@ def getSiteConfig():
|
|||||||
return mw.returnJson(True, 'ok!', content)
|
return mw.returnJson(True, 'ok!', content)
|
||||||
|
|
||||||
|
|
||||||
def getSiteListData():
|
|
||||||
path = getServerDir() + "/waf/default.json"
|
|
||||||
data = mw.readFile(path)
|
|
||||||
return json.loads(data)
|
|
||||||
|
|
||||||
|
|
||||||
def setDefaultSite(name):
|
|
||||||
path = getServerDir() + "/waf/default.json"
|
|
||||||
data = mw.readFile(path)
|
|
||||||
data = json.loads(data)
|
|
||||||
data['default'] = name
|
|
||||||
mw.writeFile(path, json.dumps(data))
|
|
||||||
return mw.returnJson(True, 'OK')
|
|
||||||
|
|
||||||
|
|
||||||
def getDefaultSite():
|
|
||||||
data = getSiteListData()
|
|
||||||
return mw.returnJson(True, 'OK', data)
|
|
||||||
|
|
||||||
|
|
||||||
def getSiteConfigByName():
|
def getSiteConfigByName():
|
||||||
args = getArgs()
|
args = getArgs()
|
||||||
data = checkArgs(args, ['siteName'])
|
data = checkArgs(args, ['siteName'])
|
||||||
@@ -1027,7 +1120,7 @@ def addSiteCdnHeader():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '添加成功!')
|
return mw.returnJson(True, '添加成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -1048,7 +1141,7 @@ def removeSiteCdnHeader():
|
|||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
|
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '删除成功!')
|
return mw.returnJson(True, '删除成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -1103,6 +1196,8 @@ def getLogsList():
|
|||||||
domain = args['site']
|
domain = args['site']
|
||||||
tojs = args['tojs']
|
tojs = args['tojs']
|
||||||
|
|
||||||
|
setDefaultSite(domain)
|
||||||
|
|
||||||
conn = pSqliteDb('logs')
|
conn = pSqliteDb('logs')
|
||||||
|
|
||||||
field = 'time,ip,domain,server_name,method,uri,user_agent,rule_name,reason'
|
field = 'time,ip,domain,server_name,method,uri,user_agent,rule_name,reason'
|
||||||
@@ -1172,7 +1267,7 @@ def setObjOpen():
|
|||||||
|
|
||||||
cjson = mw.getJson(cobj)
|
cjson = mw.getJson(cobj)
|
||||||
mw.writeFile(conf, cjson)
|
mw.writeFile(conf, cjson)
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -1202,7 +1297,7 @@ def setSiteObjOpen():
|
|||||||
|
|
||||||
cjson = mw.getJson(content)
|
cjson = mw.getJson(content)
|
||||||
mw.writeFile(path, cjson)
|
mw.writeFile(path, cjson)
|
||||||
restartWeb()
|
setConfRestartWeb()
|
||||||
return mw.returnJson(True, '设置成功!')
|
return mw.returnJson(True, '设置成功!')
|
||||||
|
|
||||||
|
|
||||||
@@ -1216,6 +1311,117 @@ def getWafConf():
|
|||||||
return mw.readFile(conf)
|
return mw.readFile(conf)
|
||||||
|
|
||||||
|
|
||||||
|
def getAreaLimit():
|
||||||
|
conf = getJsonPath('area_limit')
|
||||||
|
if not os.path.exists(conf):
|
||||||
|
mw.writeFile(conf, '[]')
|
||||||
|
|
||||||
|
d = mw.readFile(conf)
|
||||||
|
data = json.loads(d)
|
||||||
|
return mw.returnJson(True, 'ok!', data)
|
||||||
|
|
||||||
|
|
||||||
|
def delAreaLimit():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['site', 'types', 'region'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
type_list = ["refuse", "accept"]
|
||||||
|
if not args['types'] in type_list:
|
||||||
|
return mw.returnJson(False, '输入的类型错误!')
|
||||||
|
|
||||||
|
region_l = args['region'].split(",")
|
||||||
|
site_l = args['site'].split(",")
|
||||||
|
|
||||||
|
paramMode = {}
|
||||||
|
for i in region_l:
|
||||||
|
if not i:
|
||||||
|
continue
|
||||||
|
i = i.strip()
|
||||||
|
if not i in paramMode:
|
||||||
|
paramMode[i] = "1"
|
||||||
|
|
||||||
|
sitesMode = {}
|
||||||
|
for i in site_l:
|
||||||
|
i = i.strip()
|
||||||
|
if not i:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not i in sitesMode:
|
||||||
|
sitesMode[i] = "1"
|
||||||
|
|
||||||
|
if len(paramMode) == 0:
|
||||||
|
return mw.returnJson(False, '输入的请求类型错误!')
|
||||||
|
if len(sitesMode) == 0:
|
||||||
|
return mw.returnJson(False, '输入的站点错误!')
|
||||||
|
|
||||||
|
conf = getJsonPath('area_limit')
|
||||||
|
t_data = json.loads(mw.readFile(conf))
|
||||||
|
|
||||||
|
data = {"site": sitesMode, "types": args['types'], "region": paramMode}
|
||||||
|
if not data in t_data:
|
||||||
|
return mw.returnJson(False, '不存在!')
|
||||||
|
|
||||||
|
t_data.remove(data)
|
||||||
|
mw.writeFile(conf, json.dumps(t_data))
|
||||||
|
|
||||||
|
setConfRestartWeb()
|
||||||
|
return mw.returnJson(True, '删除成功!')
|
||||||
|
|
||||||
|
|
||||||
|
def addAreaLimit():
|
||||||
|
args = getArgs()
|
||||||
|
data = checkArgs(args, ['site', 'types', 'region'])
|
||||||
|
if not data[0]:
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
type_list = ["refuse", "accept"]
|
||||||
|
if not args['types'] in type_list:
|
||||||
|
return mw.returnJson(False, '输入的类型错误!')
|
||||||
|
|
||||||
|
region_l = args['region'].split(",")
|
||||||
|
site_l = args['site'].split(",")
|
||||||
|
|
||||||
|
paramMode = {}
|
||||||
|
for i in region_l:
|
||||||
|
if not i:
|
||||||
|
continue
|
||||||
|
i = i.strip()
|
||||||
|
if not i in paramMode:
|
||||||
|
paramMode[i] = "1"
|
||||||
|
|
||||||
|
if '海外' in paramMode and '中国' in paramMode:
|
||||||
|
return mw.returnJson(False, '不允许设置【中国大陆】和【中国大陆以外地区】一同开启地区限制!')
|
||||||
|
|
||||||
|
sitesMode = {}
|
||||||
|
for i in site_l:
|
||||||
|
i = i.strip()
|
||||||
|
if not i:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not i in sitesMode:
|
||||||
|
sitesMode[i] = "1"
|
||||||
|
|
||||||
|
if len(paramMode) == 0:
|
||||||
|
return mw.returnJson(False, '输入的请求类型错误!')
|
||||||
|
if len(sitesMode) == 0:
|
||||||
|
return mw.returnJson(False, '输入的站点错误!')
|
||||||
|
|
||||||
|
conf = getJsonPath('area_limit')
|
||||||
|
t_data = json.loads(mw.readFile(conf))
|
||||||
|
|
||||||
|
data = {"site": sitesMode, "types": args['types'], "region": paramMode}
|
||||||
|
if data in t_data:
|
||||||
|
return mw.returnJson(False, '已存在!')
|
||||||
|
|
||||||
|
t_data.insert(0, data)
|
||||||
|
mw.writeFile(conf, json.dumps(t_data))
|
||||||
|
|
||||||
|
setConfRestartWeb()
|
||||||
|
return mw.returnJson(True, '添加成功!')
|
||||||
|
|
||||||
|
|
||||||
def cleanDropIp():
|
def cleanDropIp():
|
||||||
url = "http://127.0.0.1/clean_waf_drop_ip"
|
url = "http://127.0.0.1/clean_waf_drop_ip"
|
||||||
data = mw.httpGet(url)
|
data = mw.httpGet(url)
|
||||||
@@ -1228,13 +1434,13 @@ def testRun():
|
|||||||
# if not data[0]:
|
# if not data[0]:
|
||||||
# return data[1]
|
# return data[1]
|
||||||
|
|
||||||
conf_json = getServerDir() + "/waf/default.json"
|
default_path = getServerDir() + "/waf/default.pl"
|
||||||
data = mw.readFile(conf_json)
|
default_site = mw.readFile(default_path)
|
||||||
pdata = json.loads(data)
|
|
||||||
default_site = pdata['default']
|
|
||||||
|
|
||||||
url = "http://" + default_site + '/?t=../etc/passwd'
|
url = "http://" + default_site + '/?t=../etc/passwd'
|
||||||
returnData = mw.httpGet(url, 10)
|
returnData = mw.httpGet(url, 10)
|
||||||
|
|
||||||
|
# url = "https://" + default_site + '/?t=../etc/passwd'
|
||||||
|
# returnData = mw.httpGet(url, 3)
|
||||||
return mw.returnJson(True, '测试运行成功!', returnData)
|
return mw.returnJson(True, '测试运行成功!', returnData)
|
||||||
|
|
||||||
|
|
||||||
@@ -1311,6 +1517,8 @@ if __name__ == "__main__":
|
|||||||
print(getSiteConfig())
|
print(getSiteConfig())
|
||||||
elif func == 'get_default_site':
|
elif func == 'get_default_site':
|
||||||
print(getDefaultSite())
|
print(getDefaultSite())
|
||||||
|
elif func == 'get_country':
|
||||||
|
print(getCountry())
|
||||||
elif func == 'get_site_config_byname':
|
elif func == 'get_site_config_byname':
|
||||||
print(getSiteConfigByName())
|
print(getSiteConfigByName())
|
||||||
elif func == 'add_site_cdn_header':
|
elif func == 'add_site_cdn_header':
|
||||||
@@ -1329,8 +1537,12 @@ if __name__ == "__main__":
|
|||||||
print(getWafSrceen())
|
print(getWafSrceen())
|
||||||
elif func == 'waf_conf':
|
elif func == 'waf_conf':
|
||||||
print(getWafConf())
|
print(getWafConf())
|
||||||
elif func == 'waf_site':
|
elif func == 'get_area_limit':
|
||||||
print(getWafSite())
|
print(getAreaLimit())
|
||||||
|
elif func == 'add_area_limit':
|
||||||
|
print(addAreaLimit())
|
||||||
|
elif func == 'del_area_limit':
|
||||||
|
print(delAreaLimit())
|
||||||
elif func == 'clean_drop_ip':
|
elif func == 'clean_drop_ip':
|
||||||
print(cleanDropIp())
|
print(cleanDropIp())
|
||||||
elif func == 'test_run':
|
elif func == 'test_run':
|
||||||
|
|||||||
@@ -24,5 +24,5 @@
|
|||||||
"home":"https://github.com/loveshell/ngx_lua_waf",
|
"home":"https://github.com/loveshell/ngx_lua_waf",
|
||||||
"date":"2019-04-21",
|
"date":"2019-04-21",
|
||||||
"pid": "1",
|
"pid": "1",
|
||||||
"versions": ["0.2.6"]
|
"versions": ["0.3.2"]
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
export PATH
|
export PATH
|
||||||
|
|
||||||
|
# cd /www/server/mdserver-web/plugins/op_waf && bash install.sh install 0.3.0
|
||||||
|
|
||||||
curPath=`pwd`
|
curPath=`pwd`
|
||||||
rootPath=$(dirname "$curPath")
|
rootPath=$(dirname "$curPath")
|
||||||
rootPath=$(dirname "$rootPath")
|
rootPath=$(dirname "$rootPath")
|
||||||
@@ -36,7 +38,6 @@ Install_App(){
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# which luarocks
|
# which luarocks
|
||||||
# if [ "$?" != "0" ];then
|
|
||||||
if [ ! -d $serverPath/op_waf/luarocks ];then
|
if [ ! -d $serverPath/op_waf/luarocks ];then
|
||||||
cd $serverPath/source/op_waf && tar xvf luarocks-3.5.0.tar.gz
|
cd $serverPath/source/op_waf && tar xvf luarocks-3.5.0.tar.gz
|
||||||
# cd luarocks-3.9.1 && ./configure && make bootstrap
|
# cd luarocks-3.9.1 && ./configure && make bootstrap
|
||||||
@@ -83,11 +84,42 @@ Install_App(){
|
|||||||
cp -rf ${DEFAULT_DIR}/lsqlite3.so $serverPath/op_waf/waf/conf/lsqlite3.so
|
cp -rf ${DEFAULT_DIR}/lsqlite3.so $serverPath/op_waf/waf/conf/lsqlite3.so
|
||||||
fi
|
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
|
||||||
|
|
||||||
|
# download GeoLite Data
|
||||||
|
GeoLite2_TAG=2023.08.10
|
||||||
|
if [ ! -f $serverPath/op_waf/GeoLite2-City.mmdb ];then
|
||||||
|
wget --no-check-certificate -O $serverPath/op_waf/GeoLite2-City.mmdb ${HTTP_PREFIX}github.com/P3TERX/GeoLite.mmdb/releases/download/${GeoLite2_TAG}/GeoLite2-City.mmdb
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $serverPath/op_waf/GeoLite2-Country.mmdb ];then
|
||||||
|
wget --no-check-certificate -O $serverPath/op_waf/GeoLite2-Country.mmdb ${HTTP_PREFIX}github.com/P3TERX/GeoLite.mmdb/releases/download/${GeoLite2_TAG}/GeoLite2-Country.mmdb
|
||||||
|
fi
|
||||||
|
|
||||||
|
libmaxminddb_ver='1.7.1'
|
||||||
|
if [ ! -f $serverPath/op_waf/waf/mmdb/lib/libmaxminddb.a ] && [ ! -f $serverPath/op_waf/waf/mmdb/lib/libmaxminddb.so ];then
|
||||||
|
libmaxminddb_local_path=$serverPath/source/op_waf/libmaxminddb-${libmaxminddb_ver}.tar.gz
|
||||||
|
libmaxminddb_url_path=${HTTP_PREFIX}github.com/maxmind/libmaxminddb/releases/download/${libmaxminddb_ver}/libmaxminddb-${libmaxminddb_ver}.tar.gz
|
||||||
|
if [ ! -f ${libmaxminddb_local_path} ]; then
|
||||||
|
wget --no-check-certificate -O ${libmaxminddb_local_path} ${libmaxminddb_url_path}
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $serverPath/source/op_waf && tar -zxvf ${libmaxminddb_local_path} && \
|
||||||
|
cd $serverPath/source/op_waf/libmaxminddb-${libmaxminddb_ver} && \
|
||||||
|
./configure --prefix=$serverPath/op_waf/waf/mmdb && make && make install
|
||||||
|
fi
|
||||||
|
|
||||||
echo "${version}" > $serverPath/op_waf/version.pl
|
echo "${version}" > $serverPath/op_waf/version.pl
|
||||||
echo 'install ok' > $install_tmp
|
echo 'install ok' > $install_tmp
|
||||||
|
|
||||||
cd ${rootPath} && python3 ${rootPath}/plugins/op_waf/index.py start
|
cd ${rootPath} && python3 ${rootPath}/plugins/op_waf/index.py start
|
||||||
# cd ${rootPath} && python3 ${rootPath}/plugins/op_waf/index.py restart
|
echo "cd ${rootPath} && python3 ${rootPath}/plugins/op_waf/index.py start"
|
||||||
|
sleep 2
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/op_waf/index.py reload
|
||||||
}
|
}
|
||||||
|
|
||||||
Uninstall_App(){
|
Uninstall_App(){
|
||||||
|
|||||||
+246
-6
@@ -14,6 +14,19 @@ function owPost(method, args, callback){
|
|||||||
},'json');
|
},'json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function owPostN(method, args, callback){
|
||||||
|
$.post('/plugins/run', {name:'op_waf', func:method, args:JSON.stringify(args)}, function(data) {
|
||||||
|
if (!data.status){
|
||||||
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(typeof(callback) == 'function'){
|
||||||
|
callback(data);
|
||||||
|
}
|
||||||
|
},'json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function getRuleByName(rule_name, callback){
|
function getRuleByName(rule_name, callback){
|
||||||
owPost('get_rule', {rule_name:rule_name}, function(data){
|
owPost('get_rule', {rule_name:rule_name}, function(data){
|
||||||
@@ -227,7 +240,7 @@ function setRetry(retry_cycle, retry, retry_time, siteName) {
|
|||||||
|
|
||||||
|
|
||||||
//设置safe_verify规则
|
//设置safe_verify规则
|
||||||
function setSafeVerify(auto, cpu, time, siteName) {
|
function setSafeVerify(auto, cpu, time, mode,siteName) {
|
||||||
var svlayer = layer.open({
|
var svlayer = layer.open({
|
||||||
type: 1,
|
type: 1,
|
||||||
title: "设置强制安全验证",
|
title: "设置强制安全验证",
|
||||||
@@ -241,7 +254,18 @@ function setSafeVerify(auto, cpu, time, siteName) {
|
|||||||
</div>\
|
</div>\
|
||||||
<div class="line">\
|
<div class="line">\
|
||||||
<span class="tname">通行时间</span>\
|
<span class="tname">通行时间</span>\
|
||||||
<div class="info-r"><input class="bt-input-text" name="time" type="number" value="'+ time + '" /> 秒</div>\
|
<div class="info-r">\
|
||||||
|
<input class="bt-input-text" name="time" type="number" value="'+ time + '" /> 秒\
|
||||||
|
</div>\
|
||||||
|
</div>\
|
||||||
|
<div class="line">\
|
||||||
|
<span class="tname">验证模式</span>\
|
||||||
|
<div class="info-r">\
|
||||||
|
<select class="bt-input-text mr5" style="width:200px" name="mode">\
|
||||||
|
<option value="url" '+(mode=='url'?"selected=selected":"")+'>URL跳转验证</option>\
|
||||||
|
<option value="local" '+(mode=='local'?"selected=selected":"")+'>本地验证</option>\
|
||||||
|
</select>\
|
||||||
|
</div>\
|
||||||
</div>\
|
</div>\
|
||||||
<div class="line">\
|
<div class="line">\
|
||||||
<span class="tname">开启自动</span>\
|
<span class="tname">开启自动</span>\
|
||||||
@@ -249,8 +273,8 @@ function setSafeVerify(auto, cpu, time, siteName) {
|
|||||||
<select class="bt-input-text mr5" style="width:80px" name="auto">\
|
<select class="bt-input-text mr5" style="width:80px" name="auto">\
|
||||||
<option value="0" '+(auto==false?"selected=selected":"")+'>关闭</option>\
|
<option value="0" '+(auto==false?"selected=selected":"")+'>关闭</option>\
|
||||||
<option value="1" '+(auto==true?"selected=selected":"")+'>开启</option>\
|
<option value="1" '+(auto==true?"selected=selected":"")+'>开启</option>\
|
||||||
</select>\
|
</select>\
|
||||||
</div>\
|
</div>\
|
||||||
</div>\
|
</div>\
|
||||||
<ul class="help-info-text c7 ptb10">\
|
<ul class="help-info-text c7 ptb10">\
|
||||||
<li><font style="color:red;">全局设置强制安全验证</font></li>\
|
<li><font style="color:red;">全局设置强制安全验证</font></li>\
|
||||||
@@ -266,6 +290,7 @@ function setSafeVerify(auto, cpu, time, siteName) {
|
|||||||
siteName: siteName,
|
siteName: siteName,
|
||||||
cpu: $("input[name='cpu']").val(),
|
cpu: $("input[name='cpu']").val(),
|
||||||
auto: $("select[name='auto']").val(),
|
auto: $("select[name='auto']").val(),
|
||||||
|
mode: $("select[name='mode']").val(),
|
||||||
time: $("input[name='time']").val(),
|
time: $("input[name='time']").val(),
|
||||||
}
|
}
|
||||||
var act = 'set_safe_verify';
|
var act = 'set_safe_verify';
|
||||||
@@ -1036,7 +1061,7 @@ function wafGloabl(){
|
|||||||
<input class="btswitch btswitch-ios" id="close_safe_verify" type="checkbox" '+(rdata.safe_verify.open ? 'checked' : '')+'>\
|
<input class="btswitch btswitch-ios" id="close_safe_verify" type="checkbox" '+(rdata.safe_verify.open ? 'checked' : '')+'>\
|
||||||
<label class="btswitch-btn" for="close_safe_verify" onclick="setObjOpen(\'safe_verify\')"></label></div>\
|
<label class="btswitch-btn" for="close_safe_verify" onclick="setObjOpen(\'safe_verify\')"></label></div>\
|
||||||
</td>\
|
</td>\
|
||||||
<td class="text-right"><a class="btlink" onclick="setSafeVerify('+ rdata.safe_verify.auto + ',' + rdata.safe_verify.cpu + ',' + rdata.safe_verify.time + ')">设置</a> | <a class="btlink" href="javascript:;" onclick="onlineEditFile(0,\''+rdata['reqfile_path']+'/safe_js.html\')">响应内容</a></td>\
|
<td class="text-right"><a class="btlink" onclick="setSafeVerify('+ rdata.safe_verify.auto + ',' + rdata.safe_verify.cpu + ',' + rdata.safe_verify.time + ',\'' + rdata.safe_verify.mode + '\')">设置</a> | <a class="btlink" href="javascript:;" onclick="onlineEditFile(0,\''+rdata['reqfile_path']+'/safe_js.html\')">响应内容</a></td>\
|
||||||
</tr>\
|
</tr>\
|
||||||
<tr>\
|
<tr>\
|
||||||
<td>GET-URI过滤</td>\
|
<td>GET-URI过滤</td>\
|
||||||
@@ -1622,6 +1647,221 @@ function wafSite(){
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function wafAreaLimitRender(){
|
||||||
|
function keyVal(obj){
|
||||||
|
var str = [];
|
||||||
|
$.each(obj, function (index, item) {
|
||||||
|
if (item == 1) {
|
||||||
|
if (index == 'allsite') index = '所有站点';
|
||||||
|
if (index == '海外') index = '中国大陆以外的地区(包括[港,澳,台])';
|
||||||
|
if (index == '中国') index = '中国大陆(不包括[港,澳,台])';
|
||||||
|
str.push(index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return str.toString();
|
||||||
|
}
|
||||||
|
owPost('get_area_limit', {}, function(rdata) {
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
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 = '';
|
||||||
|
var type = rlist[i]['types'] === 'refuse' ? '拦截' : '只放行';
|
||||||
|
var region_str = keyVal(rlist[i]['region']);
|
||||||
|
var site_str = keyVal(rlist[i]['site']);
|
||||||
|
|
||||||
|
op += '<a data-id="'+i+'" href="javascript:;" class="area_limit_del btlink">删除</a>';
|
||||||
|
|
||||||
|
list += '<tr>';
|
||||||
|
list += '<td><span class="overflow_hide" style="width: 303px;" title="'+region_str+'"">' + region_str + '</span></td>';
|
||||||
|
list += '<td>' + site_str + '</td>';
|
||||||
|
list += '<td>' + type + '</td>';
|
||||||
|
|
||||||
|
list += '<td class="text-right">' + op + '</td>';
|
||||||
|
list += '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#con_list tbody').html(list);
|
||||||
|
$('.area_limit_del').click(function(){
|
||||||
|
var data_id = $(this).data('id');
|
||||||
|
|
||||||
|
var site = [],region = [];
|
||||||
|
$.each(rlist[data_id]['site'], function (index, item) {
|
||||||
|
site.push(index);
|
||||||
|
});
|
||||||
|
$.each(rlist[data_id]['region'], function (index, item) {
|
||||||
|
region.push(index);
|
||||||
|
});
|
||||||
|
|
||||||
|
var type = rlist[data_id]['types'];
|
||||||
|
|
||||||
|
owPost('del_area_limit', {
|
||||||
|
site:site.toString(),
|
||||||
|
region:region.toString(),
|
||||||
|
types:type,
|
||||||
|
}, function(rdata) {
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
showMsg(rdata.msg, function(){
|
||||||
|
if (rdata.status){
|
||||||
|
wafAreaLimit();
|
||||||
|
}
|
||||||
|
},{ icon: rdata.status ? 1 : 2 });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 地区限制
|
||||||
|
function wafAreaLimit(){
|
||||||
|
var con = '<div class="safe bgw">\
|
||||||
|
<button id="create_area_limit" 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 style="text-align:right;">操作</th></tr></thead>\
|
||||||
|
<tbody></tbody></table>\
|
||||||
|
</div>\
|
||||||
|
</div>\
|
||||||
|
</div>';
|
||||||
|
$(".soft-man-con").html(con);
|
||||||
|
wafAreaLimitRender();
|
||||||
|
|
||||||
|
$('#create_area_limit').click(function(){
|
||||||
|
var site_list;
|
||||||
|
var area_list;
|
||||||
|
var site_length = 0;
|
||||||
|
layer.open({
|
||||||
|
type: 1,
|
||||||
|
title: '添加地区限制',
|
||||||
|
area: ['450px','280px'],
|
||||||
|
closeBtn: 1,
|
||||||
|
btn: ['添加', '取消'],
|
||||||
|
content: '<div class="waf-form pd20">\
|
||||||
|
<div class="line">\
|
||||||
|
<span class="tname">类型</span>\
|
||||||
|
<div class="info-r c4">\
|
||||||
|
<select name="type" class="bt-input-text" style="width:230px">\
|
||||||
|
<option value="refuse" selected="">拦截</option>\
|
||||||
|
<option value="accept">只放行</option>\
|
||||||
|
</select>\
|
||||||
|
</div>\
|
||||||
|
</div>\
|
||||||
|
<div class="line">\
|
||||||
|
<span class="tname">站点</span>\
|
||||||
|
<div class="info-r">\
|
||||||
|
<div id="site_list"></div>\
|
||||||
|
</div>\
|
||||||
|
</div>\
|
||||||
|
<div class="line">\
|
||||||
|
<span class="tname">地区</span>\
|
||||||
|
<div class="info-r" id="area_list"></div>\
|
||||||
|
</div>\
|
||||||
|
</div>',
|
||||||
|
success: function (layers, index) {
|
||||||
|
document.getElementById('layui-layer' + index).getElementsByClassName('layui-layer-content')[0].style.overflow = 'unset';
|
||||||
|
|
||||||
|
site_list = xmSelect.render({
|
||||||
|
el: '#site_list',
|
||||||
|
language: 'zn',
|
||||||
|
toolbar: {show: true,},
|
||||||
|
paging: true,
|
||||||
|
pageSize: 10,
|
||||||
|
data: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
owPostN('get_default_site','', function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
var rlist = rdata.data.list;
|
||||||
|
|
||||||
|
|
||||||
|
var pdata = [];
|
||||||
|
for (var i = 0; i < rlist.length; i++) {
|
||||||
|
var tval = rlist[i];
|
||||||
|
if (tval != 'unset'){
|
||||||
|
var t = {name:rlist[i],value:rlist[i]};
|
||||||
|
pdata.push(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
site_length = pdata.length;
|
||||||
|
site_list.update({data:pdata});
|
||||||
|
});
|
||||||
|
|
||||||
|
area_list = xmSelect.render({
|
||||||
|
el: '#area_list',
|
||||||
|
language: 'zn',
|
||||||
|
toolbar: {show: true,},
|
||||||
|
filterable: true,
|
||||||
|
data: [],
|
||||||
|
});
|
||||||
|
owPostN('get_country','', function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
var rlist = rdata.data;
|
||||||
|
|
||||||
|
var pdata = [];
|
||||||
|
for (var i = 0; i < rlist.length; i++) {
|
||||||
|
var tval = rlist[i];
|
||||||
|
if (tval != 'unset'){
|
||||||
|
var t = {name:tval,value:tval};
|
||||||
|
pdata.push(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
area_list.update({data:pdata});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
yes: function (indexs) {
|
||||||
|
|
||||||
|
var reg_type = $('select[name="type"]').val();
|
||||||
|
var site_val = site_list.getValue('value');
|
||||||
|
var area_val = area_list.getValue('value');
|
||||||
|
|
||||||
|
if (area_val.length <1) return layer.msg('地区最少选一个!', { icon: 2 });
|
||||||
|
if (site_val.length <1) return layer.msg('站点最少选一个!', { icon: 2 });
|
||||||
|
|
||||||
|
var site = '';
|
||||||
|
if (site_length === site_val.length) {
|
||||||
|
site = 'allsite';
|
||||||
|
} else {
|
||||||
|
site = site_val.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
var area = area_val.join();
|
||||||
|
var region = area.replace('中国大陆以外的地区(包括[中国特别行政区:港,澳,台])', '海外')
|
||||||
|
.replace('中国大陆(不包括[中国特别行政区:港,澳,台])', '中国')
|
||||||
|
.replace('中国香港', '香港')
|
||||||
|
.replace('中国澳门', '澳门')
|
||||||
|
.replace('中国台湾', '台湾');
|
||||||
|
|
||||||
|
owPost('add_area_limit',{
|
||||||
|
site:site,
|
||||||
|
types:reg_type,
|
||||||
|
region:region,
|
||||||
|
}, function(rdata){
|
||||||
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
showMsg(rdata.msg, function(){
|
||||||
|
if (rdata.status){
|
||||||
|
layer.close(indexs);
|
||||||
|
wafAreaLimit();
|
||||||
|
}
|
||||||
|
},{ icon: rdata.status ? 1 : 2 });
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function wafLogRequest(page){
|
function wafLogRequest(page){
|
||||||
var args = {};
|
var args = {};
|
||||||
args['page'] = page;
|
args['page'] = page;
|
||||||
@@ -1797,7 +2037,7 @@ function wafLogs(){
|
|||||||
wafLogRequest(1);
|
wafLogRequest(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
owPost('get_default_site',{},function(rdata){
|
owPostN('get_default_site',{},function(rdata){
|
||||||
$('select[name="site"]').html('');
|
$('select[name="site"]').html('');
|
||||||
|
|
||||||
var rdata = $.parseJSON(rdata.data);
|
var rdata = $.parseJSON(rdata.data);
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -1 +1,66 @@
|
|||||||
{"reqfile_path": "{$WAF_PATH}/html", "retry": {"retry_time": 180, "is_open_global": 0, "retry": 6, "retry_cycle": 60}, "log": true, "scan": {"status": 444, "ps": "过滤常见扫描测试工具的渗透测试", "open": true, "reqfile": ""}, "cc": {"status": 444, "ps": "过虑CC攻击", "limit": 120, "endtime": 300, "open": true,"cycle": 60}, "safe_verify":{"status": 200,"ps": "强制安全校验", "reqfile": "safe_js.html","open": false,"cpu":50,"auto":true,"time":86400 },"get": {"status": 200, "ps": "过滤uri、uri参数中常见sql注入、xss等攻击", "open": true, "reqfile": "get.html"}, "log_save": 30, "user-agent": {"status": 200, "ps": "通常用于过滤浏览器、蜘蛛及一些自动扫描器", "open": true, "reqfile": "user_agent.html"}, "other": {"status": 200, "ps": "其它非通用过滤", "reqfile": "other.html"}, "cookie": {"status": 200, "ps": "过滤利用Cookie发起的渗透攻击", "open": true, "reqfile": "cookie.html"}, "logs_path": "/www/wwwlogs/waf", "post": {"status": 200, "ps": "过滤POST参数中常见sql注入、xss等攻击", "open": true, "reqfile": "post.html"}, "open": true}
|
{
|
||||||
|
"reqfile_path": "{$WAF_PATH}/html",
|
||||||
|
"retry": {
|
||||||
|
"retry_time": 180,
|
||||||
|
"is_open_global": 0,
|
||||||
|
"retry": 6,
|
||||||
|
"retry_cycle": 60
|
||||||
|
},
|
||||||
|
"log": true,
|
||||||
|
"scan": {
|
||||||
|
"status": 444,
|
||||||
|
"ps": "过滤常见扫描测试工具的渗透测试",
|
||||||
|
"open": true,
|
||||||
|
"reqfile": ""
|
||||||
|
},
|
||||||
|
"cc": {
|
||||||
|
"status": 444,
|
||||||
|
"ps": "过虑CC攻击",
|
||||||
|
"limit": 120,
|
||||||
|
"endtime": 300,
|
||||||
|
"open": true,
|
||||||
|
"cycle": 60
|
||||||
|
},
|
||||||
|
"safe_verify": {
|
||||||
|
"status": 200,
|
||||||
|
"ps": "强制安全校验",
|
||||||
|
"reqfile": "safe_js.html",
|
||||||
|
"open": false,
|
||||||
|
"mode":"local",
|
||||||
|
"cpu": 50,
|
||||||
|
"auto": true,
|
||||||
|
"time": 86400
|
||||||
|
},
|
||||||
|
"get": {
|
||||||
|
"status": 200,
|
||||||
|
"ps": "过滤uri、uri参数中常见sql注入、xss等攻击",
|
||||||
|
"open": true,
|
||||||
|
"reqfile": "get.html"
|
||||||
|
},
|
||||||
|
"log_save": 30,
|
||||||
|
"user-agent": {
|
||||||
|
"status": 200,
|
||||||
|
"ps": "通常用于过滤浏览器、蜘蛛及一些自动扫描器",
|
||||||
|
"open": true,
|
||||||
|
"reqfile": "user_agent.html"
|
||||||
|
},
|
||||||
|
"other": {
|
||||||
|
"status": 200,
|
||||||
|
"ps": "其它非通用过滤",
|
||||||
|
"reqfile": "other.html"
|
||||||
|
},
|
||||||
|
"cookie": {
|
||||||
|
"status": 200,
|
||||||
|
"ps": "过滤利用Cookie发起的渗透攻击",
|
||||||
|
"open": true,
|
||||||
|
"reqfile": "cookie.html"
|
||||||
|
},
|
||||||
|
"logs_path": "/www/wwwlogs/waf",
|
||||||
|
"post": {
|
||||||
|
"status": 200,
|
||||||
|
"ps": "过滤POST参数中常见sql注入、xss等攻击",
|
||||||
|
"open": true,
|
||||||
|
"reqfile": "post.html"
|
||||||
|
},
|
||||||
|
"open": true
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<div class="main">
|
<div class="main">
|
||||||
<div class="title">OP网站防火墙|安全校验</div>
|
<div class="title">OP网站防火墙|安全校验</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<p id="change">5</p>
|
<p id="change">3</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="status" style="display: none;">false</div>
|
<div id="status" style="display: none;">false</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -27,6 +27,15 @@
|
|||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
function getQueryString(name) {
|
||||||
|
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
|
||||||
|
let r = window.location.search.substr(1).match(reg);
|
||||||
|
if (r != null) {
|
||||||
|
return decodeURIComponent(r[2]);
|
||||||
|
};
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
function ajax(type,bool){
|
function ajax(type,bool){
|
||||||
var xhr = {};
|
var xhr = {};
|
||||||
if(typeof(type)=='undefined'){
|
if(typeof(type)=='undefined'){
|
||||||
@@ -125,22 +134,29 @@ function ajax(type,bool){
|
|||||||
return xhr;
|
return xhr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ajax('JSON',true).post('{uri}',{'pass':"ok"}, function(data){
|
|
||||||
if (data['status'] == 0){
|
|
||||||
document.getElementById('status').innerHTML = 'ok';
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var ok = setInterval(function(){
|
var ok = setInterval(function(){
|
||||||
var id = document.getElementById('change').innerHTML;
|
var id = document.getElementById('change').innerHTML;
|
||||||
id = id - 1;
|
id = id - 1;
|
||||||
if (id == 0){
|
if (id == 0){
|
||||||
document.getElementById('change').innerHTML = '稍等';
|
|
||||||
clearInterval(ok);
|
clearInterval(ok);
|
||||||
if (document.getElementById('status').innerHTML == 'ok'){
|
ajax('JSON',true).post('{uri}',{'pass':"ok"}, function(data){
|
||||||
location.reload();
|
if (data['status'] == 0 && data['msg'] == 'ok'){
|
||||||
}
|
document.getElementById('status').innerHTML = 'ok';
|
||||||
|
setTimeout(function(){
|
||||||
|
var f = getQueryString('f');
|
||||||
|
// console.log(f,typeof(f));
|
||||||
|
if (f && f!=''){
|
||||||
|
location.href = f;
|
||||||
|
} else {
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
},500);
|
||||||
|
} else{
|
||||||
|
document.getElementById('change').innerHTML = '?';
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
document.getElementById('change').innerHTML = id;
|
document.getElementById('change').innerHTML = id;
|
||||||
}
|
}
|
||||||
|
|||||||
+171
-18
@@ -35,10 +35,10 @@ local cookie_rules = require "rule_cookie"
|
|||||||
local url_rules = require "rule_url"
|
local url_rules = require "rule_url"
|
||||||
local url_white_rules = require "rule_url_white"
|
local url_white_rules = require "rule_url_white"
|
||||||
|
|
||||||
|
local waf_area_limit = require "waf_area_limit"
|
||||||
|
|
||||||
-- local server_name = string.gsub(C:get_sn(config_domains),'_','.')
|
-- local server_name = string.gsub(C:get_sn(config_domains),'_','.')
|
||||||
local server_name = C:get_sn(config_domains)
|
local server_name = C:get_sn(config_domains)
|
||||||
|
|
||||||
local function initParams()
|
local function initParams()
|
||||||
local data = {}
|
local data = {}
|
||||||
data['server_name'] = server_name
|
data['server_name'] = server_name
|
||||||
@@ -53,10 +53,12 @@ local function initParams()
|
|||||||
data['user_agent'] = data['request_header']['user-agent']
|
data['user_agent'] = data['request_header']['user-agent']
|
||||||
data['cookie'] = ngx.var.http_cookie
|
data['cookie'] = ngx.var.http_cookie
|
||||||
data['time'] = ngx.time()
|
data['time'] = ngx.time()
|
||||||
|
|
||||||
return data
|
return data
|
||||||
end
|
end
|
||||||
|
|
||||||
local params = initParams()
|
local params = initParams()
|
||||||
|
-- C:D(C:to_json(params))
|
||||||
C:setParams(params)
|
C:setParams(params)
|
||||||
|
|
||||||
local cpu_percent = ngx.shared.waf_limit:get("cpu_usage")
|
local cpu_percent = ngx.shared.waf_limit:get("cpu_usage")
|
||||||
@@ -307,14 +309,16 @@ local function is_open_waf_cc_increase()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- C:D("waf config:"..json.encode(config))
|
-- C:D("waf config:"..json.encode(config))
|
||||||
if cpu_percent >= config['safe_verify']['cpu'] then
|
if config['safe_verify']['auto'] then
|
||||||
return true
|
if cpu_percent >= config['safe_verify']['cpu'] then
|
||||||
end
|
|
||||||
|
|
||||||
if site_config[server_name] and site_config[server_name]['safe_verify']['open'] then
|
|
||||||
if cpu_percent >= site_config[server_name]['safe_verify']['cpu'] then
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if site_config[server_name] and site_config[server_name]['safe_verify']['open'] then
|
||||||
|
if cpu_percent >= site_config[server_name]['safe_verify']['cpu'] then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return false
|
return false
|
||||||
@@ -343,6 +347,7 @@ local function waf_cc_increase()
|
|||||||
local make_uri_str = "?token="..make_token
|
local make_uri_str = "?token="..make_token
|
||||||
local make_uri = "/"..make_uri_str
|
local make_uri = "/"..make_uri_str
|
||||||
|
|
||||||
|
-- C:D("token:"..tostring(params['uri_request_args']['token']))
|
||||||
if params['uri_request_args']['token'] then
|
if params['uri_request_args']['token'] then
|
||||||
ngx.header.content_type = "application/json"
|
ngx.header.content_type = "application/json"
|
||||||
local args_token = params['uri_request_args']['token']
|
local args_token = params['uri_request_args']['token']
|
||||||
@@ -352,18 +357,37 @@ local function waf_cc_increase()
|
|||||||
ngx.say(json.encode(data))
|
ngx.say(json.encode(data))
|
||||||
ngx.exit(200)
|
ngx.exit(200)
|
||||||
end
|
end
|
||||||
|
local data = get_return_state(0, "unset")
|
||||||
-- C:D("debug[args]:"..tostring(params['uri_request_args']['debug']))
|
ngx.say(json.encode(data))
|
||||||
-- if params['uri_request_args']['debug'] == 'ok' then
|
ngx.exit(200)
|
||||||
-- ngx.header.content_type = "application/json"
|
|
||||||
-- local data = get_return_state(0, "ok")
|
|
||||||
-- ngx.say(json.encode(data))
|
|
||||||
-- ngx.exit(200)
|
|
||||||
-- end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local cc_html = ngx.re.gsub(cc_safe_js_html, "{uri}", make_uri_str)
|
if not config['safe_verify']['mode'] then return false end
|
||||||
C:return_html(200, cc_html)
|
|
||||||
|
-- C:D(C:to_json(params['uri_request_args']))
|
||||||
|
if config['safe_verify']['mode'] == 'url' then
|
||||||
|
local page = 'safe_verify_'..cache_token
|
||||||
|
local request_uri = params['request_uri']
|
||||||
|
local to_url = '/?'..page..'&f='..request_uri
|
||||||
|
|
||||||
|
local cache_url_key = cache_token..':url'
|
||||||
|
local cache_url_val = ngx.shared.waf_limit:get(cache_url_key)
|
||||||
|
|
||||||
|
if params['uri_request_args'][page] then
|
||||||
|
local cc_html = ngx.re.gsub(cc_safe_js_html, "{uri}", make_uri_str)
|
||||||
|
return C:return_html(200, cc_html)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not cache_url_val then
|
||||||
|
ngx.shared.waf_limit:set(cache_url_key, request_uri,30)
|
||||||
|
return ngx.redirect(to_url)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if config['safe_verify']['mode'] == 'local' then
|
||||||
|
local cc_html = ngx.re.gsub(cc_safe_js_html, "{uri}", make_uri_str)
|
||||||
|
C:return_html(200, cc_html)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -529,16 +553,125 @@ local function waf_cookie()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local geo=nil
|
||||||
|
local waf_country=""
|
||||||
|
local geo2=nil
|
||||||
|
|
||||||
function waf()
|
|
||||||
|
local function initmaxminddb()
|
||||||
|
if geo==nil then
|
||||||
|
maxminddb ,geo = pcall(function() return require 'waf_maxminddb' end)
|
||||||
|
if not maxminddb then
|
||||||
|
C:D("debug waf error on :"..tostring(geo))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if type(geo)=='number' then return nil end
|
||||||
|
local ok2,data=pcall(function()
|
||||||
|
if not geo.initted() then
|
||||||
|
geo.init("{$WAF_ROOT}/GeoLite2-City.mmdb")
|
||||||
|
end
|
||||||
|
end )
|
||||||
|
if not ok2 then
|
||||||
|
geo=nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function get_ip_country(ip)
|
||||||
|
initmaxminddb()
|
||||||
|
if type(geo)=='number' then return "2" end
|
||||||
|
if geo==nil then return "2" end
|
||||||
|
if geo.lookup==nil then return "2" end
|
||||||
|
local res,err=geo.lookup(ip or ngx.var.remote_addr)
|
||||||
|
if not res then
|
||||||
|
return "2"
|
||||||
|
else
|
||||||
|
C:D("res:"..tostring(res))
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_country()
|
||||||
|
local ip = params['ip']
|
||||||
|
if ngx.shared.waf_limit:get("get_country"..ip) then
|
||||||
|
return ngx.shared.waf_limit:get("get_country"..ip)
|
||||||
|
end
|
||||||
|
local ip_postion=get_ip_country(ip)
|
||||||
|
if ip_postion=="2" then return false end
|
||||||
|
if ip_postion["country"]==nil then return false end
|
||||||
|
if ip_postion["country"]["names"]==nil then return false end
|
||||||
|
if ip_postion["country"]["names"]["zh-CN"]==nil then return false end
|
||||||
|
ngx.shared.waf_limit:set("get_country"..ip,ip_postion["country"]["names"]["zh-CN"],3600)
|
||||||
|
return ip_postion["country"]["names"]["zh-CN"]
|
||||||
|
end
|
||||||
|
|
||||||
|
local function area_limit(overall_country, server_name, status)
|
||||||
|
|
||||||
|
if not status then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if overall_country and overall_country~="" and C:count_size(waf_area_limit)>=1 then
|
||||||
|
for k, val in pairs(waf_area_limit) do
|
||||||
|
-- C:D(tostring(k)..':'..tostring(val['site']['allsite']) ..':'.. tostring(val['site']['allsite'] == '1') ..':'.. tostring(val['site']['allsite']))
|
||||||
|
if val['site']['allsite'] and val['site']['allsite'] == '1' and val['types'] == 'refuse' then
|
||||||
|
for rk, reg_val in pairs(val['region']) do
|
||||||
|
if rk == overall_country then
|
||||||
|
ngx.exit(403)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if val['site'][server_name] and val['site'][server_name] == '1' and val['types'] == 'refuse' then
|
||||||
|
for rk, reg_val in pairs(val['region']) do
|
||||||
|
if rk == overall_country then
|
||||||
|
ngx.exit(403)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if val['site']['allsite'] and val['site']['allsite'] == '1' and val['types'] == 'accept' then
|
||||||
|
for rk, reg_val in pairs(val['region']) do
|
||||||
|
if rk == overall_country then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ngx.exit(403)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if val['site'][server_name] and val['site'][server_name] == '1' and val['types'] == 'accept' then
|
||||||
|
for rk, reg_val in pairs(val['region']) do
|
||||||
|
if rk == overall_country then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ngx.exit(403)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function run_app_waf()
|
||||||
min_route()
|
min_route()
|
||||||
-- C:D("min_route")
|
-- C:D("min_route")
|
||||||
|
-- country limit
|
||||||
|
local waf_country = get_country()
|
||||||
|
if area_limit(waf_country, server_name, site_config[server_name]['open']) then return true end
|
||||||
|
|
||||||
if site_config[server_name] and site_config[server_name]['open'] then
|
if site_config[server_name] and site_config[server_name]['open'] then
|
||||||
|
|
||||||
|
|
||||||
-- white ip
|
-- white ip
|
||||||
if waf_ip_white() then return true end
|
if waf_ip_white() then return true end
|
||||||
-- C:D("waf_ip_white")
|
-- C:D("waf_ip_white")
|
||||||
|
|
||||||
|
|
||||||
-- url white
|
-- url white
|
||||||
if waf_url_white() then return true end
|
if waf_url_white() then return true end
|
||||||
-- C:D("waf_url_white")
|
-- C:D("waf_url_white")
|
||||||
@@ -589,4 +722,24 @@ function waf()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local waf_run_status = nil
|
||||||
|
function waf()
|
||||||
|
if waf_run_status then
|
||||||
|
run_app_waf()
|
||||||
|
else
|
||||||
|
local ok,waf_err=pcall(function()
|
||||||
|
run_app_waf()
|
||||||
|
end)
|
||||||
|
|
||||||
|
if waf_err ~= nil then
|
||||||
|
C:D("----waf error-----"..tostring(waf_err))
|
||||||
|
end
|
||||||
|
|
||||||
|
if ok then
|
||||||
|
waf_run_status = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
waf()
|
waf()
|
||||||
@@ -26,7 +26,7 @@ local function waf_timer_stats_total_log(premature)
|
|||||||
WAF_C:timer_stats_total()
|
WAF_C:timer_stats_total()
|
||||||
end
|
end
|
||||||
|
|
||||||
local waf_clean_expire_data = function(premature)
|
local function waf_clean_expire_data(premature)
|
||||||
WAF_C:clean_log()
|
WAF_C:clean_log()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ end
|
|||||||
|
|
||||||
function _M.initDB(self)
|
function _M.initDB(self)
|
||||||
local path = log_dir .. "/waf.db"
|
local path = log_dir .. "/waf.db"
|
||||||
db, err = sqlite3.open(path)
|
local db, err = sqlite3.open(path)
|
||||||
|
|
||||||
if err then
|
if err then
|
||||||
self:D("initDB err:"..tostring(err))
|
self:D("initDB err:"..tostring(err))
|
||||||
@@ -207,7 +207,7 @@ function _M.D(self, msg)
|
|||||||
local _msg = ''
|
local _msg = ''
|
||||||
if type(msg) == 'table' then
|
if type(msg) == 'table' then
|
||||||
for key, val in pairs(msg) do
|
for key, val in pairs(msg) do
|
||||||
_msg = tostring( key)..':'.."\n"
|
_msg = tostring(key)..':'.."\n"
|
||||||
end
|
end
|
||||||
elseif type(msg) == 'string' then
|
elseif type(msg) == 'string' then
|
||||||
_msg = msg
|
_msg = msg
|
||||||
@@ -277,6 +277,16 @@ function _M.setParams( self, params )
|
|||||||
self.params = params
|
self.params = params
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function _M.count_size(data)
|
||||||
|
local count=0
|
||||||
|
if type(data)~="table" then return count end
|
||||||
|
for k,v in pairs(data)
|
||||||
|
do
|
||||||
|
count=count+1
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function _M.is_min(self, ip1, ip2)
|
function _M.is_min(self, ip1, ip2)
|
||||||
n = 0
|
n = 0
|
||||||
@@ -360,7 +370,9 @@ end
|
|||||||
|
|
||||||
function _M.return_html(self, status, html)
|
function _M.return_html(self, status, html)
|
||||||
ngx.header.content_type = "text/html"
|
ngx.header.content_type = "text/html"
|
||||||
|
ngx.header.Cache_Control = "no-cache"
|
||||||
status = tonumber(status)
|
status = tonumber(status)
|
||||||
|
|
||||||
-- self:D("return_html:"..tostring(status))
|
-- self:D("return_html:"..tostring(status))
|
||||||
if status == 200 then
|
if status == 200 then
|
||||||
ngx.say(html)
|
ngx.say(html)
|
||||||
@@ -369,7 +381,7 @@ function _M.return_html(self, status, html)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function _M.read_file_body(self, filename)
|
function _M.read_file_body(self, filename)
|
||||||
fp = io.open(filename, 'r')
|
local fp = io.open(filename, 'r')
|
||||||
if fp == nil then
|
if fp == nil then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
@@ -821,5 +833,4 @@ function _M.t(self)
|
|||||||
ngx.say(',,,')
|
ngx.say(',,,')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
return _M
|
return _M
|
||||||
|
|||||||
@@ -0,0 +1,362 @@
|
|||||||
|
--[[
|
||||||
|
Copyright 2017-now anjia (anjia0532@gmail.com)
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- copy from https://github.com/lilien1010/lua-resty-maxminddb/blob/f96633e2428f8f7bcc1e2a7a28b747b33233a8db/resty/maxminddb.lua#L5-L12
|
||||||
|
|
||||||
|
local ffi = require ('ffi')
|
||||||
|
local ffi_new = ffi.new
|
||||||
|
local ffi_str = ffi.string
|
||||||
|
local ffi_cast = ffi.cast
|
||||||
|
local ffi_gc = ffi.gc
|
||||||
|
local C = ffi.C
|
||||||
|
|
||||||
|
local _M ={}
|
||||||
|
_M._VERSION = '1.3.3'
|
||||||
|
local mt = { __index = _M }
|
||||||
|
|
||||||
|
-- copy from https://github.com/lilien1010/lua-resty-maxminddb/blob/f96633e2428f8f7bcc1e2a7a28b747b33233a8db/resty/maxminddb.lua#L36-L126
|
||||||
|
ffi.cdef[[
|
||||||
|
|
||||||
|
typedef long int ssize_t;
|
||||||
|
|
||||||
|
typedef unsigned int mmdb_uint128_t __attribute__ ((__mode__(TI)));
|
||||||
|
|
||||||
|
typedef struct MMDB_entry_s {
|
||||||
|
struct MMDB_s *mmdb;
|
||||||
|
uint32_t offset;
|
||||||
|
} MMDB_entry_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_lookup_result_s {
|
||||||
|
bool found_entry;
|
||||||
|
MMDB_entry_s entry;
|
||||||
|
uint16_t netmask;
|
||||||
|
} MMDB_lookup_result_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_entry_data_s {
|
||||||
|
bool has_data;
|
||||||
|
union {
|
||||||
|
uint32_t pointer;
|
||||||
|
const char *utf8_string;
|
||||||
|
double double_value;
|
||||||
|
const uint8_t *bytes;
|
||||||
|
uint16_t uint16;
|
||||||
|
uint32_t uint32;
|
||||||
|
int32_t int32;
|
||||||
|
uint64_t uint64;
|
||||||
|
mmdb_uint128_t uint128;
|
||||||
|
bool boolean;
|
||||||
|
float float_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t offset;
|
||||||
|
uint32_t offset_to_next;
|
||||||
|
uint32_t data_size;
|
||||||
|
uint32_t type;
|
||||||
|
} MMDB_entry_data_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_entry_data_list_s {
|
||||||
|
MMDB_entry_data_s entry_data;
|
||||||
|
struct MMDB_entry_data_list_s *next;
|
||||||
|
} MMDB_entry_data_list_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_description_s {
|
||||||
|
const char *language;
|
||||||
|
const char *description;
|
||||||
|
} MMDB_description_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_metadata_s {
|
||||||
|
uint32_t node_count;
|
||||||
|
uint16_t record_size;
|
||||||
|
uint16_t ip_version;
|
||||||
|
const char *database_type;
|
||||||
|
struct {
|
||||||
|
size_t count;
|
||||||
|
const char **names;
|
||||||
|
} languages;
|
||||||
|
uint16_t binary_format_major_version;
|
||||||
|
uint16_t binary_format_minor_version;
|
||||||
|
uint64_t build_epoch;
|
||||||
|
struct {
|
||||||
|
size_t count;
|
||||||
|
MMDB_description_s **descriptions;
|
||||||
|
} description;
|
||||||
|
} MMDB_metadata_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_ipv4_start_node_s {
|
||||||
|
uint16_t netmask;
|
||||||
|
uint32_t node_value;
|
||||||
|
} MMDB_ipv4_start_node_s;
|
||||||
|
|
||||||
|
typedef struct MMDB_s {
|
||||||
|
uint32_t flags;
|
||||||
|
const char *filename;
|
||||||
|
ssize_t file_size;
|
||||||
|
const uint8_t *file_content;
|
||||||
|
const uint8_t *data_section;
|
||||||
|
uint32_t data_section_size;
|
||||||
|
const uint8_t *metadata_section;
|
||||||
|
uint32_t metadata_section_size;
|
||||||
|
uint16_t full_record_byte_size;
|
||||||
|
uint16_t depth;
|
||||||
|
MMDB_ipv4_start_node_s ipv4_start_node;
|
||||||
|
MMDB_metadata_s metadata;
|
||||||
|
} MMDB_s;
|
||||||
|
|
||||||
|
typedef char * pchar;
|
||||||
|
|
||||||
|
MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb, const char *const ipstr, int *const gai_error,int *const mmdb_error);
|
||||||
|
int MMDB_open(const char *const filename, uint32_t flags, MMDB_s *const mmdb);
|
||||||
|
int MMDB_aget_value(MMDB_entry_s *const start, MMDB_entry_data_s *const entry_data, const char *const *const path);
|
||||||
|
char *MMDB_strerror(int error_code);
|
||||||
|
|
||||||
|
int MMDB_get_entry_data_list(MMDB_entry_s *start, MMDB_entry_data_list_s **const entry_data_list);
|
||||||
|
void MMDB_free_entry_data_list(MMDB_entry_data_list_s *const entry_data_list);
|
||||||
|
void MMDB_close(MMDB_s *const mmdb);
|
||||||
|
const char *gai_strerror(int errcode);
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- error codes
|
||||||
|
-- https://github.com/maxmind/libmaxminddb/blob/master/include/maxminddb.h#L66
|
||||||
|
local MMDB_SUCCESS = 0
|
||||||
|
local MMDB_FILE_OPEN_ERROR = 1
|
||||||
|
local MMDB_CORRUPT_SEARCH_TREE_ERROR = 2
|
||||||
|
local MMDB_INVALID_METADATA_ERROR = 3
|
||||||
|
local MMDB_IO_ERROR = 4
|
||||||
|
local MMDB_OUT_OF_MEMORY_ERROR = 5
|
||||||
|
local MMDB_UNKNOWN_DATABASE_FORMAT_ERROR = 6
|
||||||
|
local MMDB_INVALID_DATA_ERROR = 7
|
||||||
|
local MMDB_INVALID_LOOKUP_PATH_ERROR = 8
|
||||||
|
local MMDB_LOOKUP_PATH_DOES_NOT_MATCH_DATA_ERROR = 9
|
||||||
|
local MMDB_INVALID_NODE_NUMBER_ERROR = 10
|
||||||
|
local MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR = 11
|
||||||
|
|
||||||
|
-- data type
|
||||||
|
-- https://github.com/maxmind/libmaxminddb/blob/master/include/maxminddb.h#L40
|
||||||
|
local MMDB_DATA_TYPE_EXTENDED = 0
|
||||||
|
local MMDB_DATA_TYPE_POINTER = 1
|
||||||
|
local MMDB_DATA_TYPE_UTF8_STRING = 2
|
||||||
|
local MMDB_DATA_TYPE_DOUBLE = 3
|
||||||
|
local MMDB_DATA_TYPE_BYTES = 4
|
||||||
|
local MMDB_DATA_TYPE_UINT16 = 5
|
||||||
|
local MMDB_DATA_TYPE_UINT32 = 6
|
||||||
|
local MMDB_DATA_TYPE_MAP = 7
|
||||||
|
local MMDB_DATA_TYPE_INT32 = 8
|
||||||
|
local MMDB_DATA_TYPE_UINT64 = 9
|
||||||
|
local MMDB_DATA_TYPE_UINT128 = 10
|
||||||
|
local MMDB_DATA_TYPE_ARRAY = 11
|
||||||
|
local MMDB_DATA_TYPE_CONTAINER = 12
|
||||||
|
local MMDB_DATA_TYPE_END_MARKER = 13
|
||||||
|
local MMDB_DATA_TYPE_BOOLEAN = 14
|
||||||
|
local MMDB_DATA_TYPE_FLOAT = 15
|
||||||
|
|
||||||
|
-- copy from https://github.com/lilien1010/lua-resty-maxminddb/blob/f96633e2428f8f7bcc1e2a7a28b747b33233a8db/resty/maxminddb.lua#L136-L138
|
||||||
|
-- you should install the libmaxminddb to your system
|
||||||
|
local maxm = ffi.load('{$WAF_ROOT}/waf/mmdb/lib/libmaxminddb.{$MMDB_FILE_SUFFIX}')
|
||||||
|
--https://github.com/maxmind/libmaxminddb
|
||||||
|
local mmdb = ffi_new('MMDB_s')
|
||||||
|
local initted = false
|
||||||
|
|
||||||
|
local function mmdb_strerror(rc)
|
||||||
|
return ffi_str(maxm.MMDB_strerror(rc))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function gai_strerror(rc)
|
||||||
|
return ffi_str(C.gai_strerror(rc))
|
||||||
|
end
|
||||||
|
|
||||||
|
function _M.init(dbfile)
|
||||||
|
if not initted then
|
||||||
|
local maxmind_ready = maxm.MMDB_open(dbfile,0,mmdb)
|
||||||
|
|
||||||
|
if maxmind_ready ~= MMDB_SUCCESS then
|
||||||
|
return nil, mmdb_strerror(maxmind_ready)
|
||||||
|
end
|
||||||
|
|
||||||
|
initted = true
|
||||||
|
|
||||||
|
ffi_gc(mmdb, maxm.MMDB_close)
|
||||||
|
end
|
||||||
|
return initted
|
||||||
|
end
|
||||||
|
|
||||||
|
function _M.initted()
|
||||||
|
return initted
|
||||||
|
end
|
||||||
|
|
||||||
|
-- https://github.com/maxmind/libmaxminddb/blob/master/src/maxminddb.c#L1938
|
||||||
|
-- LOCAL MMDB_entry_data_list_s *dump_entry_data_list( FILE *stream, MMDB_entry_data_list_s *entry_data_list, int indent, int *status)
|
||||||
|
local function _dump_entry_data_list(entry_data_list,status)
|
||||||
|
|
||||||
|
if not entry_data_list then
|
||||||
|
return nil,MMDB_INVALID_DATA_ERROR
|
||||||
|
end
|
||||||
|
|
||||||
|
local entry_data_item = entry_data_list[0].entry_data
|
||||||
|
local data_type = entry_data_item.type
|
||||||
|
local data_size = entry_data_item.data_size
|
||||||
|
local result
|
||||||
|
|
||||||
|
if data_type == MMDB_DATA_TYPE_MAP then
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
local size = entry_data_item.data_size
|
||||||
|
|
||||||
|
entry_data_list = entry_data_list[0].next
|
||||||
|
|
||||||
|
while(size > 0 and entry_data_list)
|
||||||
|
do
|
||||||
|
entry_data_item = entry_data_list[0].entry_data
|
||||||
|
data_type = entry_data_item.type
|
||||||
|
data_size = entry_data_item.data_size
|
||||||
|
|
||||||
|
if MMDB_DATA_TYPE_UTF8_STRING ~= data_type then
|
||||||
|
return nil,MMDB_INVALID_DATA_ERROR
|
||||||
|
end
|
||||||
|
|
||||||
|
local key = ffi_str(entry_data_item.utf8_string,data_size)
|
||||||
|
|
||||||
|
if not key then
|
||||||
|
return nil,MMDB_OUT_OF_MEMORY_ERROR
|
||||||
|
end
|
||||||
|
|
||||||
|
local val
|
||||||
|
entry_data_list = entry_data_list[0].next
|
||||||
|
entry_data_list,status,val = _dump_entry_data_list(entry_data_list)
|
||||||
|
|
||||||
|
if status ~= MMDB_SUCCESS then
|
||||||
|
return nil,status
|
||||||
|
end
|
||||||
|
|
||||||
|
result[key] = val
|
||||||
|
|
||||||
|
size = size -1
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
elseif entry_data_list[0].entry_data.type == MMDB_DATA_TYPE_ARRAY then
|
||||||
|
local size = entry_data_list[0].entry_data.data_size
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
entry_data_list = entry_data_list[0].next
|
||||||
|
|
||||||
|
local i = 1
|
||||||
|
while(i <= size and entry_data_list)
|
||||||
|
do
|
||||||
|
local val
|
||||||
|
entry_data_list,status,val = _dump_entry_data_list(entry_data_list)
|
||||||
|
|
||||||
|
if status ~= MMDB_SUCCESS then
|
||||||
|
return nil,nil,val
|
||||||
|
end
|
||||||
|
|
||||||
|
result[i] = val
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
entry_data_item = entry_data_list[0].entry_data
|
||||||
|
data_type = entry_data_item.type
|
||||||
|
data_size = entry_data_item.data_size
|
||||||
|
|
||||||
|
local val
|
||||||
|
-- string type "key":"val"
|
||||||
|
-- other type "key":val
|
||||||
|
-- default other type
|
||||||
|
if data_type == MMDB_DATA_TYPE_UTF8_STRING then
|
||||||
|
val = ffi_str(entry_data_item.utf8_string,data_size)
|
||||||
|
if not val then
|
||||||
|
status = MMDB_OUT_OF_MEMORY_ERROR
|
||||||
|
return nil,status
|
||||||
|
end
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_BYTES then
|
||||||
|
val = ffi_str(ffi_cast('char * ',entry_data_item.bytes),data_size)
|
||||||
|
if not val then
|
||||||
|
status = MMDB_OUT_OF_MEMORY_ERROR
|
||||||
|
return nil,status
|
||||||
|
end
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_DOUBLE then
|
||||||
|
val = entry_data_item.double_value
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_FLOAT then
|
||||||
|
val = entry_data_item.float_value
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_UINT16 then
|
||||||
|
val = entry_data_item.uint16
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_UINT32 then
|
||||||
|
val = entry_data_item.uint32
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_BOOLEAN then
|
||||||
|
val = entry_data_item.boolean
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_UINT64 then
|
||||||
|
val = entry_data_item.uint64
|
||||||
|
elseif data_type == MMDB_DATA_TYPE_INT32 then
|
||||||
|
val = entry_data_item.int32
|
||||||
|
else
|
||||||
|
return nil,MMDB_INVALID_DATA_ERROR
|
||||||
|
end
|
||||||
|
|
||||||
|
result = val
|
||||||
|
entry_data_list = entry_data_list[0].next
|
||||||
|
end
|
||||||
|
|
||||||
|
status = MMDB_SUCCESS
|
||||||
|
return entry_data_list,status,result
|
||||||
|
end
|
||||||
|
|
||||||
|
function _M.lookup(ip)
|
||||||
|
|
||||||
|
if not initted then
|
||||||
|
return nil, "not initialized"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- copy from https://github.com/lilien1010/lua-resty-maxminddb/blob/f96633e2428f8f7bcc1e2a7a28b747b33233a8db/resty/maxminddb.lua#L159-L176
|
||||||
|
local gai_error = ffi_new('int[1]')
|
||||||
|
local mmdb_error = ffi_new('int[1]')
|
||||||
|
|
||||||
|
local result = maxm.MMDB_lookup_string(mmdb,ip,gai_error,mmdb_error)
|
||||||
|
|
||||||
|
if mmdb_error[0] ~= MMDB_SUCCESS then
|
||||||
|
return nil,'lookup failed: ' .. mmdb_strerror(mmdb_error[0])
|
||||||
|
end
|
||||||
|
|
||||||
|
if gai_error[0] ~= MMDB_SUCCESS then
|
||||||
|
return nil,'lookup failed: ' .. gai_strerror(gai_error[0])
|
||||||
|
end
|
||||||
|
|
||||||
|
if true ~= result.found_entry then
|
||||||
|
return nil,'not found'
|
||||||
|
end
|
||||||
|
|
||||||
|
local entry_data_list = ffi_cast('MMDB_entry_data_list_s **const',ffi_new("MMDB_entry_data_list_s"))
|
||||||
|
|
||||||
|
local status = maxm.MMDB_get_entry_data_list(result.entry,entry_data_list)
|
||||||
|
|
||||||
|
if status ~= MMDB_SUCCESS then
|
||||||
|
return nil,'get entry data failed: ' .. mmdb_strerror(status)
|
||||||
|
end
|
||||||
|
|
||||||
|
local head = entry_data_list[0] -- Save so this can be passed to free fn.
|
||||||
|
local _,status,result = _dump_entry_data_list(entry_data_list)
|
||||||
|
maxm.MMDB_free_entry_data_list(head)
|
||||||
|
|
||||||
|
if status ~= MMDB_SUCCESS then
|
||||||
|
return nil,'dump entry data failed: ' .. mmdb_strerror(status)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
-- copy from https://github.com/lilien1010/lua-resty-maxminddb/blob/master/resty/maxminddb.lua#L208
|
||||||
|
-- https://www.maxmind.com/en/geoip2-databases you should download the mmdb file from maxmind
|
||||||
|
|
||||||
|
return _M;
|
||||||
+69
-18
@@ -11,9 +11,7 @@ import re
|
|||||||
sys.path.append(os.getcwd() + "/class/core")
|
sys.path.append(os.getcwd() + "/class/core")
|
||||||
import mw
|
import mw
|
||||||
|
|
||||||
|
|
||||||
app_debug = False
|
app_debug = False
|
||||||
|
|
||||||
if mw.isAppleSystem():
|
if mw.isAppleSystem():
|
||||||
app_debug = True
|
app_debug = True
|
||||||
|
|
||||||
@@ -31,8 +29,13 @@ def getServerDir():
|
|||||||
|
|
||||||
|
|
||||||
def getInitDFile():
|
def getInitDFile():
|
||||||
if app_debug:
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return '/tmp/' + getPluginName()
|
return '/tmp/' + getPluginName()
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
return '/etc/rc.d/' + getPluginName()
|
||||||
|
|
||||||
return '/etc/init.d/' + getPluginName()
|
return '/etc/init.d/' + getPluginName()
|
||||||
|
|
||||||
|
|
||||||
@@ -95,6 +98,14 @@ def getInitDTpl():
|
|||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def getPidFile():
|
||||||
|
file = getConf()
|
||||||
|
content = mw.readFile(file)
|
||||||
|
rep = 'pid\s*(.*);'
|
||||||
|
tmp = re.search(rep, content)
|
||||||
|
return tmp.groups()[0].strip()
|
||||||
|
|
||||||
|
|
||||||
def getFileOwner(filename):
|
def getFileOwner(filename):
|
||||||
import pwd
|
import pwd
|
||||||
stat = os.lstat(filename)
|
stat = os.lstat(filename)
|
||||||
@@ -118,13 +129,16 @@ def confReplace():
|
|||||||
user = 'www'
|
user = 'www'
|
||||||
user_group = 'www'
|
user_group = 'www'
|
||||||
|
|
||||||
if mw.getOs() == 'darwin':
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
# macosx do
|
# macosx do
|
||||||
user = mw.execShell(
|
user = mw.execShell(
|
||||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||||
# user = 'root'
|
# user = 'root'
|
||||||
user_group = 'staff'
|
user_group = 'staff'
|
||||||
content = content.replace('{$EVENT_MODEL}', 'kqueue')
|
content = content.replace('{$EVENT_MODEL}', 'kqueue')
|
||||||
|
elif current_os.startswith('freebsd'):
|
||||||
|
content = content.replace('{$EVENT_MODEL}', 'kqueue')
|
||||||
else:
|
else:
|
||||||
content = content.replace('{$EVENT_MODEL}', 'epoll')
|
content = content.replace('{$EVENT_MODEL}', 'epoll')
|
||||||
|
|
||||||
@@ -222,8 +236,8 @@ def initDreplace():
|
|||||||
# /usr/lib/systemd/system
|
# /usr/lib/systemd/system
|
||||||
systemDir = mw.systemdCfgDir()
|
systemDir = mw.systemdCfgDir()
|
||||||
systemService = systemDir + '/openresty.service'
|
systemService = systemDir + '/openresty.service'
|
||||||
systemServiceTpl = getPluginDir() + '/init.d/openresty.service.tpl'
|
|
||||||
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
if os.path.exists(systemDir) and not os.path.exists(systemService):
|
||||||
|
systemServiceTpl = getPluginDir() + '/init.d/openresty.service.tpl'
|
||||||
se_content = mw.readFile(systemServiceTpl)
|
se_content = mw.readFile(systemServiceTpl)
|
||||||
se_content = se_content.replace('{$SERVER_PATH}', service_path)
|
se_content = se_content.replace('{$SERVER_PATH}', service_path)
|
||||||
mw.writeFile(systemService, se_content)
|
mw.writeFile(systemService, se_content)
|
||||||
@@ -233,9 +247,8 @@ def initDreplace():
|
|||||||
|
|
||||||
|
|
||||||
def status():
|
def status():
|
||||||
data = mw.execShell(
|
pid_file = getPidFile()
|
||||||
"ps -ef|grep openresty |grep -v grep | grep -v python | awk '{print $2}'")
|
if not os.path.exists(pid_file):
|
||||||
if data[0] == '':
|
|
||||||
return 'stop'
|
return 'stop'
|
||||||
return 'start'
|
return 'start'
|
||||||
|
|
||||||
@@ -249,20 +262,33 @@ def restyOp(method):
|
|||||||
if not check_data[1].find('test is successful') > -1:
|
if not check_data[1].find('test is successful') > -1:
|
||||||
return check_data[1]
|
return check_data[1]
|
||||||
|
|
||||||
if not mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
data = mw.execShell('systemctl ' + method + ' openresty')
|
if current_os == "darwin":
|
||||||
|
data = mw.execShell(file + ' ' + method)
|
||||||
if data[1] == '':
|
if data[1] == '':
|
||||||
return 'ok'
|
return 'ok'
|
||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
data = mw.execShell(file + ' ' + method)
|
if current_os.startswith("freebsd"):
|
||||||
|
data = mw.execShell('service openresty ' + method)
|
||||||
|
if data[1] == '':
|
||||||
|
return 'ok'
|
||||||
|
return data[1]
|
||||||
|
|
||||||
|
data = mw.execShell('systemctl ' + method + ' openresty')
|
||||||
if data[1] == '':
|
if data[1] == '':
|
||||||
return 'ok'
|
return 'ok'
|
||||||
return data[1]
|
return data[1]
|
||||||
|
|
||||||
|
|
||||||
def op_submit_systemctl_restart():
|
def op_submit_systemctl_restart():
|
||||||
|
current_os = mw.getOs()
|
||||||
|
if current_os.startswith("freebsd"):
|
||||||
|
mw.execShell('service openresty restart')
|
||||||
|
return True
|
||||||
|
|
||||||
mw.execShell('systemctl restart openresty')
|
mw.execShell('systemctl restart openresty')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def op_submit_init_restart(file):
|
def op_submit_init_restart(file):
|
||||||
@@ -280,11 +306,9 @@ def restyOp_restart():
|
|||||||
|
|
||||||
if not mw.isAppleSystem():
|
if not mw.isAppleSystem():
|
||||||
threading.Timer(2, op_submit_systemctl_restart, args=()).start()
|
threading.Timer(2, op_submit_systemctl_restart, args=()).start()
|
||||||
# submit_restart1()
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
threading.Timer(2, op_submit_init_restart, args=(file,)).start()
|
threading.Timer(2, op_submit_init_restart, args=(file,)).start()
|
||||||
# submit_restart2(file)
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
@@ -293,7 +317,11 @@ def start():
|
|||||||
|
|
||||||
|
|
||||||
def stop():
|
def stop():
|
||||||
return restyOp('stop')
|
r = restyOp('stop')
|
||||||
|
pid_file = getPidFile()
|
||||||
|
if os.path.exists(pid_file):
|
||||||
|
os.remove(pid_file)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
def restart():
|
def restart():
|
||||||
@@ -306,10 +334,15 @@ def reload():
|
|||||||
|
|
||||||
|
|
||||||
def initdStatus():
|
def initdStatus():
|
||||||
|
current_os = mw.getOs()
|
||||||
if mw.isAppleSystem():
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
if os.path.exists(initd_bin):
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
shell_cmd = 'systemctl status openresty | grep loaded | grep "enabled;"'
|
shell_cmd = 'systemctl status openresty | grep loaded | grep "enabled;"'
|
||||||
data = mw.execShell(shell_cmd)
|
data = mw.execShell(shell_cmd)
|
||||||
if data[0] == '':
|
if data[0] == '':
|
||||||
@@ -318,17 +351,35 @@ def initdStatus():
|
|||||||
|
|
||||||
|
|
||||||
def initdInstall():
|
def initdInstall():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
# freebsd initd install
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
import shutil
|
||||||
|
source_bin = initDreplace()
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
shutil.copyfile(source_bin, initd_bin)
|
||||||
|
mw.execShell('chmod +x ' + initd_bin)
|
||||||
|
mw.execShell('sysrc ' + getPluginName() + '_enable="YES"')
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl enable openresty')
|
mw.execShell('systemctl enable openresty')
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|
||||||
def initdUinstall():
|
def initdUinstall():
|
||||||
if mw.isAppleSystem():
|
current_os = mw.getOs()
|
||||||
|
if current_os == 'darwin':
|
||||||
return "Apple Computer does not support"
|
return "Apple Computer does not support"
|
||||||
|
|
||||||
|
if current_os.startswith('freebsd'):
|
||||||
|
initd_bin = getInitDFile()
|
||||||
|
os.remove(initd_bin)
|
||||||
|
mw.execShell('sysrc ' + getPluginName() + '_enable="NO"')
|
||||||
|
return 'ok'
|
||||||
|
|
||||||
mw.execShell('systemctl disable openresty')
|
mw.execShell('systemctl disable openresty')
|
||||||
return 'ok'
|
return 'ok'
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||||
export PATH
|
export PATH
|
||||||
|
|
||||||
# cd /www/server/mdserver-web/plugins/openresty && bash install.sh install 1.21.4.1
|
# cd /www/server/mdserver-web/plugins/openresty && bash install.sh install 1.21.4.2
|
||||||
|
|
||||||
curPath=`pwd`
|
curPath=`pwd`
|
||||||
rootPath=$(dirname "$curPath")
|
rootPath=$(dirname "$curPath")
|
||||||
@@ -77,10 +77,14 @@ Install_openresty()
|
|||||||
|
|
||||||
cd ${openrestyDir} && tar -zxvf openresty-${VERSION}.tar.gz
|
cd ${openrestyDir} && tar -zxvf openresty-${VERSION}.tar.gz
|
||||||
|
|
||||||
|
OPTIONS=''
|
||||||
|
if [ "$VERSION" != "1.21.4.2" ];then
|
||||||
|
OPTIONS=" ${OPTIONS} --with-ipv6 "
|
||||||
|
fi
|
||||||
# --with-openssl=$serverPath/source/lib/openssl-1.0.2q
|
# --with-openssl=$serverPath/source/lib/openssl-1.0.2q
|
||||||
cd ${openrestyDir}/openresty-${VERSION} && ./configure \
|
cd ${openrestyDir}/openresty-${VERSION} && ./configure \
|
||||||
--prefix=$serverPath/openresty \
|
--prefix=$serverPath/openresty \
|
||||||
--with-ipv6 \
|
$OPTIONS \
|
||||||
--with-stream \
|
--with-stream \
|
||||||
--with-http_v2_module \
|
--with-http_v2_module \
|
||||||
--with-http_ssl_module \
|
--with-http_ssl_module \
|
||||||
@@ -92,7 +96,7 @@ Install_openresty()
|
|||||||
# --with-debug
|
# --with-debug
|
||||||
# 用于调式
|
# 用于调式
|
||||||
|
|
||||||
make -j${cpuCore} && make install && make clean
|
gmake -j${cpuCore} && gmake install && gmake clean
|
||||||
|
|
||||||
if [ -d $serverPath/openresty ];then
|
if [ -d $serverPath/openresty ];then
|
||||||
echo "${VERSION}" > $serverPath/openresty/version.pl
|
echo "${VERSION}" > $serverPath/openresty/version.pl
|
||||||
|
|||||||
@@ -62,10 +62,6 @@ cd ${curPath} && sh -x $curPath/versions/$2/install.sh $1
|
|||||||
|
|
||||||
if [ "${action}" == "install" ] && [ -d ${serverPath}/php-yum/${type} ];then
|
if [ "${action}" == "install" ] && [ -d ${serverPath}/php-yum/${type} ];then
|
||||||
|
|
||||||
#初始化
|
|
||||||
cd ${rootPath} && python3 ${rootPath}/plugins/php-yum/index.py start ${type}
|
|
||||||
cd ${rootPath} && python3 ${rootPath}/plugins/php-yum/index.py initd_install ${type}
|
|
||||||
|
|
||||||
# 安装通用扩展
|
# 安装通用扩展
|
||||||
echo "install PHP-YUM[${type}] extend start"
|
echo "install PHP-YUM[${type}] extend start"
|
||||||
cd ${rootPath}/plugins/php-yum/versions && bash common.sh ${type} install mysqlnd
|
cd ${rootPath}/plugins/php-yum/versions && bash common.sh ${type} install mysqlnd
|
||||||
@@ -82,6 +78,10 @@ if [ "${action}" == "install" ] && [ -d ${serverPath}/php-yum/${type} ];then
|
|||||||
cd ${rootPath}/plugins/php-yum/versions && bash common.sh ${type} install mbstring
|
cd ${rootPath}/plugins/php-yum/versions && bash common.sh ${type} install mbstring
|
||||||
echo "install PHP-YUM[${type}] extend end"
|
echo "install PHP-YUM[${type}] extend end"
|
||||||
|
|
||||||
|
#初始化
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/php-yum/index.py start ${type}
|
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/php-yum/index.py initd_install ${type}
|
||||||
|
|
||||||
if [ ! -f /usr/local/bin/composer ];then
|
if [ ! -f /usr/local/bin/composer ];then
|
||||||
cd /tmp
|
cd /tmp
|
||||||
curl -sS https://getcomposer.org/installer | /opt/remi/php${type}/root/usr/bin/php
|
curl -sS https://getcomposer.org/installer | /opt/remi/php${type}/root/usr/bin/php
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user