Compare commits

...

3882 Commits
0.17.4 ... dev

Author SHA1 Message Date
6f365e122a Create install.sh 2026-11-05 20:31:10 +08:00
e3229efe1b Update install.sh 2026-11-05 20:27:25 +08:00
710acecff7 update 2026-11-05 20:21:13 +08:00
9c7a155be0 update 2026-11-05 20:18:44 +08:00
157a5da6f1 Update index.py 2026-11-05 19:19:31 +08:00
7ee5ed5808 up 2026-11-05 19:02:31 +08:00
e8a96959a5 Update install.sh 2026-11-05 18:56:26 +08:00
a4845acbb6 Update index.py 2026-11-05 18:44:11 +08:00
fec638007c Update setting.py 2026-11-05 16:49:15 +08:00
80f7a0de38 Update setting.py 2026-11-05 16:42:39 +08:00
a3bb9ac80a Update setting.py 2026-11-05 16:30:21 +08:00
3dcc6e3349 Update setting.py 2026-11-05 16:28:18 +08:00
60870a4e5d Update setting.py 2026-11-05 16:18:39 +08:00
ea635bc960 Update setting.py 2026-11-05 16:08:12 +08:00
749c8443ee Update setting.py 2026-11-05 16:06:46 +08:00
052120c25e Update setting.py 2026-11-05 16:05:48 +08:00
a2b3b86c43 Update setting.py 2026-11-05 16:05:37 +08:00
6d57e3dd40 Update mw.tpl 2026-11-05 15:45:41 +08:00
a67689d890 Update mw.tpl 2026-11-05 15:36:24 +08:00
b6bffedf06 Update mw.tpl 2026-11-05 15:34:52 +08:00
e07eaf4226 Update mw.tpl 2026-11-05 15:32:05 +08:00
dd9e9d4899 Update mw.tpl 2026-11-05 15:17:19 +08:00
cd1d80915a Update mw.tpl 2026-11-05 15:14:19 +08:00
40f64ab3e8 Update install.sh 2026-11-05 14:55:31 +08:00
69ba921ec4 Update index.py 2026-11-05 14:54:39 +08:00
255fbcd688 Update index.py 2026-11-05 14:35:35 +08:00
24e12b70c8 Update index.py 2026-11-05 14:35:02 +08:00
0feee48ea8 Update install.sh 2026-11-05 14:31:22 +08:00
5cd8c5ae2c Update index.py 2026-11-05 14:28:11 +08:00
28a75eaedc Update index.py 2026-11-05 14:26:12 +08:00
50d0794f4a Update index.py 2026-11-05 14:23:24 +08:00
755e53f4d7 Update index.py 2026-11-05 14:20:13 +08:00
1876027bd2 update 2026-11-05 14:14:23 +08:00
26b06f9bb2 Update index.py 2026-11-05 14:10:37 +08:00
8f67d35260 update 2026-11-05 13:40:46 +08:00
7fa78c78e2 更加优化匹配 2026-11-05 13:37:37 +08:00
ae7276300f Update install.sh 2026-11-05 11:57:54 +08:00
420816ff4e Update requirements.txt 2026-11-05 09:58:54 +08:00
df34a7ef9b Update plugin.py 2026-11-05 00:12:28 +08:00
e1b199c8d5 Update plugin.py 2026-11-05 00:07:29 +08:00
Mr Chen
e6060847ef Merge pull request #965 from midoks/dev
常规更新
2026-11-04 15:52:18 +08:00
7ff1530684 update 2026-11-04 15:35:08 +08:00
cd0ad7488e update 2026-11-04 15:33:18 +08:00
6a0f81154a Update index.py 2026-11-04 15:31:09 +08:00
Mr Chen
096c736c28 Merge pull request #964 from midoks/dev
常规优化
2026-11-04 14:51:09 +08:00
7d01a487dc Merge branch 'master' into dev 2026-11-04 14:47:28 +08:00
ba95ef1537 Update install.sh 2026-11-04 14:43:26 +08:00
01035018c4 Update install.sh 2026-11-04 14:43:07 +08:00
8aa12b979a Update install.sh 2026-11-04 14:40:26 +08:00
98dc9e5bd8 Update tool_cron.py 2026-11-04 14:34:10 +08:00
4ebadc28c9 Update tool_cron.py 2026-11-04 14:32:34 +08:00
02115226fa Update tool_cron.py 2026-11-04 14:31:51 +08:00
f661aea83c Update manticore.conf 2026-11-04 14:17:36 +08:00
cfd3abf97b Update manticore.conf 2026-11-04 14:15:16 +08:00
b5d1c8cfcf Update manticore.conf 2026-11-04 14:12:11 +08:00
98156cc1cb Update sql_mysql.py 2026-11-04 14:01:56 +08:00
33a0dc6014 Update my.cnf 2026-11-04 13:57:38 +08:00
95a6f86e5d Update sql_mysql.py 2026-11-04 13:52:16 +08:00
74ac55b01d Update info.json 2026-11-04 13:50:19 +08:00
518cc78670 Update none.conf 2026-11-04 13:45:04 +08:00
43727decf0 update 2026-11-04 13:12:33 +08:00
599b3a7f4a Update install.sh 2026-11-04 13:05:29 +08:00
bf6c18c57a Update install.sh 2026-11-04 13:04:06 +08:00
34838bb238 update 2026-11-04 12:58:55 +08:00
1a356e516c Update index.py 2026-11-04 12:45:23 +08:00
15e273aa6f Update index.py 2026-11-04 12:44:21 +08:00
Mr Chen
4c3d3bf41d Merge pull request #963 from midoks/dev
常规优化
2026-11-04 12:43:49 +08:00
f782bacc64 update 2026-11-04 12:41:48 +08:00
7e62ab62f9 Update index.py 2026-11-04 11:45:38 +08:00
aaa8644348 Update mariadb.js 2026-11-04 11:43:26 +08:00
53797c7f56 Update index.py 2026-11-04 11:42:18 +08:00
c9302f406e Update my.cnf 2026-11-04 11:10:00 +08:00
7ad881c8ad mysql 同时过滤系统表
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
replicate-wild-ignore-table = sys.%
2026-11-04 11:06:28 +08:00
015e57f96d update 2026-11-04 10:21:48 +08:00
84b94a172e Update index.py 2026-11-04 10:11:25 +08:00
c1380945ef Update index.py 2026-11-04 10:11:02 +08:00
2d80df003e Update my5.7.cnf 2026-11-04 01:16:28 +08:00
568cdaa0ad Update my5.7.cnf 2026-11-04 01:13:19 +08:00
d11e4807df Update my5.7.cnf 2026-11-04 01:12:00 +08:00
Mr Chen
f6bc08cec1 Merge pull request #962 from midoks/dev
update
2026-11-04 00:47:06 +08:00
d723afb96e update 2026-11-04 00:26:05 +08:00
Mr Chen
6c2aa089f3 Merge pull request #961 from midoks/dev
常规优化
2026-11-04 00:06:02 +08:00
35e1ff2e96 update 2026-11-04 00:04:52 +08:00
bee9e89ed5 Update index.py 2026-11-03 22:46:33 +08:00
d0b622906f Update index.py 2026-11-03 22:37:34 +08:00
56f7edcb55 update 2026-11-03 22:36:17 +08:00
4acbc0363f Merge branch 'master' into dev 2026-11-03 22:26:50 +08:00
79013db685 Merge branch 'master' into dev 2026-11-03 22:19:05 +08:00
Mr Chen
eb5b5e5ce8 Merge pull request #960 from midoks/dev
常规更新
2026-11-03 22:16:20 +08:00
b9e6469635 update 2026-11-03 22:04:11 +08:00
56ab927f8c update 2026-11-03 21:56:19 +08:00
3d74320e76 update 2026-11-03 21:25:14 +08:00
0371eaa37a Update index.py 2026-11-03 17:01:41 +08:00
713dbfcda5 Update index.py 2026-11-03 16:47:50 +08:00
93ef2848ed Update mariadb.js 2026-11-03 16:38:47 +08:00
8750cf0f74 Update mariadb.js 2026-11-03 16:38:38 +08:00
af32a1e54d Update index.py 2026-11-03 16:23:42 +08:00
2a7c63029a Update index.py 2026-11-03 15:56:48 +08:00
f8fe7bea19 Update index.py 2026-11-03 15:55:08 +08:00
ef2814bafe Update index.py 2026-11-03 14:14:09 +08:00
220fef5f4d Update index.py 2026-11-03 14:13:36 +08:00
2835c111d0 update 2026-11-03 14:10:41 +08:00
6d0dcf3112 Update index.py 2026-11-03 14:06:44 +08:00
28307ce8e8 Update index.py 2026-11-03 14:01:04 +08:00
282fbed37d Update index.py 2026-11-03 13:53:13 +08:00
101b6d06bc Update mysql-community.js 2026-11-03 13:46:27 +08:00
8de4c74696 update 2026-11-03 13:45:35 +08:00
ba62972820 update 2026-11-03 13:34:34 +08:00
ec512f50af update 2026-11-03 13:08:43 +08:00
3261f54649 update 2026-11-03 12:28:50 +08:00
ec38ba9e21 update 2026-11-03 12:22:57 +08:00
9e1dc94a08 Update install.sh 2026-11-03 12:19:41 +08:00
40a76ac81e 主从同步模式 切换功能 2026-11-03 12:12:16 +08:00
721245b9ad Update my26.10.cnf 2026-11-03 12:02:37 +08:00
cb4ae9b74f Update my26.7.cnf 2026-11-03 12:01:15 +08:00
Mr Chen
5524ecf4e0 Merge pull request #959 from midoks/dev
常规更新
2026-11-03 12:00:47 +08:00
dbb2718892 update 2026-11-03 11:59:39 +08:00
88fc903d80 update 2026-11-03 11:56:07 +08:00
Mr Chen
242c30f7cb Merge pull request #958 from midoks/dev
常规更新
2026-11-03 11:29:36 +08:00
c944b7c585 update 2026-11-03 11:17:45 +08:00
dc2e2695be update 2026-11-03 11:05:28 +08:00
f5b86ea189 update 2026-11-03 11:04:36 +08:00
b6c2f7f3a1 Update index.py 2026-11-03 10:57:31 +08:00
81003f75b7 Update backup.py 2026-11-03 10:55:25 +08:00
d6dc330083 Update postgresql.js 2026-11-03 10:53:49 +08:00
fd0cbe10fc update 2026-11-03 10:51:15 +08:00
4ed77e82be update 2026-11-03 10:29:58 +08:00
Mr Chen
de0e89f056 Merge pull request #957 from midoks/dev
常规优化
2026-11-03 10:22:32 +08:00
29da5146f6 数据类开启卸载检查 2026-11-03 10:19:24 +08:00
e951089b45 Update index.py 2026-11-03 10:14:05 +08:00
909d65ad83 update 2026-11-03 10:13:20 +08:00
27cac55b8f Update index.py 2026-11-03 10:06:26 +08:00
0ee6ae3713 Update index.py 2026-11-03 09:58:32 +08:00
fb97160cfb Update index.py 2026-11-03 09:58:04 +08:00
96b00526fe Update install.sh 2026-11-03 09:55:18 +08:00
909fe6d0f1 Update sql_postgresql.py 2026-11-03 09:54:01 +08:00
f2e9f4c5e8 update 2026-11-03 09:52:15 +08:00
3b629b1296 Merge branch 'master' into dev 2026-11-02 23:51:58 +08:00
5cee415030 Merge branch 'master' into dev 2026-11-02 23:49:49 +08:00
Mr Chen
141e52d42a Merge pull request #956 from midoks/dev
常规更新
2026-11-02 23:48:47 +08:00
1b21f3c814 Update app.js 2026-11-02 23:46:15 +08:00
4ddc2fef8e update 2026-11-02 23:42:40 +08:00
18b259a5a5 Update app.js 2026-11-02 23:35:06 +08:00
2e2288a691 update 2026-11-02 23:32:29 +08:00
d03ae1db7b Update app.js 2026-11-02 23:15:15 +08:00
418355a571 update 2026-11-02 23:12:34 +08:00
340b53aa62 update 2026-11-02 23:01:21 +08:00
dd0628a7fb Update install.sh 2026-11-02 22:50:47 +08:00
3e5b48d2ad Update index.py 2026-11-02 22:28:54 +08:00
Mr Chen
815148a722 Merge pull request #955 from midoks/dev
常规优化
2026-11-02 22:21:33 +08:00
47aadfd877 Merge branch 'master' into dev 2026-11-02 22:19:31 +08:00
42bfd9a934 update 2026-11-02 22:01:40 +08:00
55df1b7613 Update backup.py 2026-11-02 21:50:01 +08:00
6bc3fc5707 Update index.py 2026-11-02 21:42:33 +08:00
19771181dd update 2026-11-02 21:42:27 +08:00
f0b65332bd Update index.py 2026-11-02 21:28:35 +08:00
7dd8a1eb4f Update index.py 2026-11-02 21:24:39 +08:00
f584c18d7e Update index.py 2026-11-02 21:16:53 +08:00
b023044473 Update index.py 2026-11-02 21:13:07 +08:00
dfa7ffdb53 Update index.py 2026-11-02 21:08:45 +08:00
a5a6eb7e5f update 2026-11-02 21:07:24 +08:00
eac88f1d26 update 2026-11-02 21:03:09 +08:00
518f693948 Update index.py 2026-11-02 20:56:05 +08:00
43684e9b20 update 2026-11-02 20:53:54 +08:00
59a7bb5584 update 2026-11-02 20:49:31 +08:00
f623fd9dcf Update postgresql.js 2026-11-02 20:41:50 +08:00
9db36d45af update 2026-11-02 20:33:57 +08:00
ff5670797a Update backup.py 2026-11-02 20:31:56 +08:00
54ad7e5fd0 update 2026-11-02 20:10:08 +08:00
2970aa4b8c Update index.py 2026-11-02 20:08:36 +08:00
d2e5751542 Update index.py 2026-11-02 20:07:59 +08:00
ba5f6f4958 Update index.py 2026-11-02 20:07:11 +08:00
b220552f92 update 2026-11-02 20:04:47 +08:00
d02981cee5 Update backup.py 2026-11-02 19:46:25 +08:00
96d5246415 Update index.py 2026-11-02 19:35:17 +08:00
ea284049c0 update 2026-11-02 19:02:40 +08:00
5c44bb10d1 Update index.py 2026-11-02 18:55:21 +08:00
c7c834fb75 Update postgresql.js 2026-11-02 18:55:16 +08:00
2ade5e490c update 2026-11-02 18:40:38 +08:00
6c61d3f3c0 Update postgresql.js 2026-11-02 18:30:25 +08:00
ab19878a80 Update mw.tpl 2026-11-02 18:11:02 +08:00
c27abfde3c Update install_mac.sh 2026-11-02 17:54:06 +08:00
411b21cdec Update install_mac.sh 2026-11-02 17:48:46 +08:00
26e21e631d update 2026-11-02 17:46:47 +08:00
Mr Chen
653068f2c2 Merge pull request #954 from midoks/dev
常规优化
2026-11-02 17:42:54 +08:00
188c63826f mysql-community mac 2026-11-02 17:41:02 +08:00
1820fc724f Update install.sh 2026-11-02 17:32:37 +08:00
645519b983 update 2026-11-02 17:27:57 +08:00
f97e015bbc update 2026-11-02 17:22:03 +08:00
9d47a385f5 update 2026-11-02 16:56:59 +08:00
ca06c68d24 update 2026-11-02 16:53:59 +08:00
841873418c update 2026-11-02 16:32:58 +08:00
05a6f093ab update 2026-11-02 16:31:45 +08:00
a916104d33 update 2026-11-02 16:30:09 +08:00
4609c360ac mongodb命令导入 2026-11-02 16:18:22 +08:00
b3acf3647f Update mysql.js 2026-11-02 16:10:51 +08:00
400c9d1276 Update mysql.js 2026-11-02 15:09:57 +08:00
Mr Chen
59bd655bb1 Merge pull request #953 from midoks/dev
常规优化
2026-11-02 07:52:20 +08:00
8227253b74 update 2026-11-02 07:42:26 +08:00
4e5604dc27 Update mariadb.js 2026-11-02 07:36:44 +08:00
2e238e6982 Update index.py 2026-11-02 07:33:01 +08:00
c5df0f256c Update index.py 2026-11-02 07:32:03 +08:00
6bd73131ce Update index.py 2026-11-02 07:29:19 +08:00
309422a41c update 2026-11-02 07:26:34 +08:00
6aa7d9dc20 update 2026-11-02 07:24:45 +08:00
565e1cc882 Update index.py 2026-11-02 07:24:33 +08:00
Mr Chen
5c1e292da9 Merge pull request #952 from midoks/dev
常规优化
2026-11-01 19:44:53 +08:00
6db1ee133d update 2026-11-01 19:35:10 +08:00
Mr Chen
383cec2ee5 Merge pull request #951 from midoks/dev
兼容更新+mysql备份可指定到表备份
2026-11-01 15:45:08 +08:00
dfa2163407 Update plugin.py 2026-11-01 15:32:23 +08:00
ed9a9b7860 Update plugin.py 2026-11-01 15:26:22 +08:00
5af49dc081 Merge branch 'master' into dev 2026-11-01 14:51:45 +08:00
d4f425abf8 备份不走sqlite了 2026-11-01 14:49:39 +08:00
1867ee01f1 update 2026-11-01 14:45:00 +08:00
81fe83e0a1 update 2026-11-01 14:31:42 +08:00
f266ec86c0 Create backup.py 2026-11-01 14:22:44 +08:00
e5d6357fae update 2026-11-01 14:20:52 +08:00
7967b36088 Update backup.py 2026-11-01 14:03:52 +08:00
d7471fe882 Update index.py 2026-11-01 13:56:19 +08:00
b4b67c8f48 update 2026-11-01 13:56:02 +08:00
63ae895f12 Update index.py 2026-11-01 13:53:27 +08:00
5dd77ee747 Update backup.py 2026-11-01 13:50:33 +08:00
6071dfa5f1 Update index.py 2026-11-01 13:46:01 +08:00
11d8d813d2 update 2026-11-01 13:40:40 +08:00
f337a60dc1 Update index.py 2026-11-01 13:16:07 +08:00
33f66ab3b1 Update index.py 2026-11-01 13:14:27 +08:00
eb71732d20 Update index.py 2026-11-01 13:07:09 +08:00
fbc9340960 Update index.py 2026-11-01 13:01:15 +08:00
a2f14f4121 Update index.py 2026-11-01 12:26:38 +08:00
ce8c7474ce Update backup.py 2026-11-01 12:24:13 +08:00
85d9f1409a Update index.py 2026-11-01 12:19:10 +08:00
c29dfee004 Update backup.py 2026-11-01 12:12:04 +08:00
618f938462 update 2026-11-01 12:08:34 +08:00
4e7927f9bc Update crontab.py 2026-11-01 03:24:26 +08:00
212f29438d Update crontab.py 2026-11-01 03:16:28 +08:00
3b6d9c3310 Update crontab.py 2026-11-01 03:15:13 +08:00
c01cb01d71 Update crontab.py 2026-11-01 03:14:31 +08:00
712863b766 Update crontab.py 2026-11-01 03:11:14 +08:00
601a80950f Update crontab.py 2026-11-01 03:10:21 +08:00
9f46ceac33 Update crontab.js 2026-11-01 03:08:58 +08:00
ad9b9be7fe Update crontab.py 2026-11-01 03:05:36 +08:00
2be6ac36ef Update crontab.py 2026-11-01 03:04:11 +08:00
fdb8ca205f Update crontab.py 2026-11-01 03:01:49 +08:00
f1024c165a Update crontab.py 2026-11-01 02:58:01 +08:00
9efc85f10d Update crontab.py 2026-11-01 02:52:33 +08:00
dd592b40ee Update crontab.py 2026-11-01 02:52:02 +08:00
9103646150 Update crontab.py 2026-11-01 02:50:05 +08:00
cae2680862 Update crontab.py 2026-11-01 02:48:41 +08:00
e3099a946b Update crontab.py 2026-11-01 02:44:49 +08:00
3f1da50025 Update crontab.py 2026-11-01 02:41:36 +08:00
fbd70eb4f9 Update crontab.py 2026-11-01 02:40:11 +08:00
ef0d6d5265 Update crontab.py 2026-11-01 02:36:43 +08:00
1e6932cd01 Update crontab.py 2026-11-01 02:36:08 +08:00
d173586d49 Update crontab.py 2026-11-01 02:28:51 +08:00
717269dadc Update crontab.py 2026-11-01 02:25:23 +08:00
21c4f93e02 Update crontab.py 2026-11-01 02:18:09 +08:00
c36a03bfb3 Update index.py 2026-11-01 02:12:49 +08:00
a71927917c Update index.py 2026-11-01 02:06:55 +08:00
2f5d5835c5 Update config.inc.php 2026-11-01 01:46:11 +08:00
e95b42df77 Update __init__.py 2026-11-01 01:41:09 +08:00
5c6dbbbb0c Update index.py 2026-11-01 01:27:59 +08:00
a151516eab Update index.py 2026-11-01 01:16:10 +08:00
3a590c7feb Update index.py 2026-11-01 01:12:08 +08:00
e9f0e1962e update 2026-11-01 01:10:39 +08:00
c4fda1362d Update mw.py 2026-11-01 01:05:35 +08:00
f31343b2a5 Update index.py 2026-11-01 01:00:10 +08:00
90b414d373 Update index.py 2026-11-01 00:55:03 +08:00
3eab70db4c Update index.py 2026-11-01 00:46:11 +08:00
e0810bb8d6 Update index.py 2026-11-01 00:45:15 +08:00
96a32d5c8f 更加公用 2026-11-01 00:44:10 +08:00
d45cfb5fe8 Update crontab.js 2026-11-01 00:29:32 +08:00
08753ae96d mysql支持表备份 2026-11-01 00:27:45 +08:00
465e55848f Update crontab.py 2026-10-31 23:51:28 +08:00
4492a97155 Update crontab.js 2026-10-31 23:41:38 +08:00
ba46d568bf Update crontab.js 2026-10-31 22:55:35 +08:00
d87d5d5349 Update crontab.js 2026-10-31 18:54:29 +08:00
76ea3e3375 update 2026-10-31 18:54:26 +08:00
ef47145135 Update crontab.js 2026-10-31 18:12:30 +08:00
43a9ee7368 Update crontab.py 2026-10-31 18:12:24 +08:00
6646e0c46c Update crontab.py 2026-10-31 18:01:10 +08:00
535dbb2e37 Update __init__.py 2026-10-31 18:01:03 +08:00
035953c7f5 Update install.sh 2026-10-31 18:00:28 +08:00
6a9ce81d46 update 2026-10-31 17:16:19 +08:00
f2a6824632 Update ssh_terminal.py 2026-10-31 11:57:54 +08:00
594976373e Update requirements.txt 2026-10-31 11:54:09 +08:00
45704f1c31 update 2026-10-30 17:07:22 +08:00
ce57885343 Create rapira85.toml 2026-10-30 16:55:33 +08:00
4d143ef959 Update crontab.js 2026-10-30 10:47:18 +08:00
9a0f9a759c Update install.sh 2026-10-30 10:10:34 +08:00
6341f00f46 update 2026-10-30 10:09:58 +08:00
f517568251 Update crontab.js 2026-10-29 21:02:44 +08:00
1ff6d0c2cb Update crontab.js 2026-10-29 19:17:44 +08:00
5e28039573 update 2026-10-29 18:36:48 +08:00
Mr Chen
d7757bee0d Merge pull request #949 from midoks/dev
update
2026-10-29 12:01:57 +08:00
6b18511708 Update install.sh 2026-10-29 12:00:41 +08:00
4a3e0791d3 update 2026-10-29 11:52:00 +08:00
7c25d3f6c3 Update install.sh 2026-10-29 11:41:54 +08:00
8ef38674d7 Update install.sh 2026-10-29 11:24:40 +08:00
e84cbf1d76 Update install.sh 2026-10-29 11:24:24 +08:00
14f622d252 Update install.sh 2026-10-29 11:16:08 +08:00
8bb2bfacdc Update install.sh 2026-10-29 11:13:52 +08:00
191c4b1331 Update install.sh 2026-10-29 11:11:41 +08:00
7bed2b977e update 2026-10-29 11:11:28 +08:00
b6c09b2b37 update 2026-10-29 11:03:15 +08:00
Mr Chen
1bd5251dc0 Merge pull request #948 from midoks/dev
更新优化
2026-10-28 10:40:32 +08:00
ecf1b6b600 Update install.sh 2026-10-27 23:03:09 +08:00
22cca82967 Update install.sh 2026-10-27 23:02:43 +08:00
cd66e42b1a Update install.sh 2026-10-27 23:00:26 +08:00
d887fa1b50 Update install.sh 2026-10-27 22:59:57 +08:00
55870ca08a Update my9.7.cnf 2026-10-27 22:51:21 +08:00
2ce1d49386 Update install_generic.sh 2026-10-27 22:47:35 +08:00
a0226ccbcd Update install_generic.sh 2026-10-27 22:47:02 +08:00
de7c14ec62 Update index.py 2026-10-27 22:42:03 +08:00
0c2cfd6d9a Update index.py 2026-10-27 22:41:21 +08:00
4ca78b9a91 Update my26.10.cnf 2026-10-27 22:37:56 +08:00
8219c2d2ed Update install_generic.sh 2026-10-27 22:31:47 +08:00
9f22ce949c Update install_generic.sh 2026-10-27 22:28:29 +08:00
d76c21c54b Update install_generic.sh 2026-10-27 22:28:12 +08:00
30c5cee81a update 2026-10-27 22:24:42 +08:00
e2d0ac6d89 update 2026-10-27 22:11:37 +08:00
3578a65d6e Update my9.7.cnf 2026-10-27 22:04:14 +08:00
c8331b800b update 2026-10-27 21:58:20 +08:00
1e7dc18c21 update 2026-10-27 21:46:06 +08:00
046da1868e Update install_generic.sh 2026-10-27 21:38:37 +08:00
ef7068ebd2 Update install_generic.sh 2026-10-27 21:37:47 +08:00
0525667032 Update install_generic.sh 2026-10-27 21:34:15 +08:00
6198ca02da Update install_generic.sh 2026-10-27 21:32:05 +08:00
4d4fd90fc6 Update install.sh 2026-10-27 21:29:58 +08:00
acfc4d710b Update install.sh 2026-10-27 21:29:43 +08:00
4fd12f4d73 update 2026-10-27 21:23:42 +08:00
9a8bb9f94b update 2026-10-27 21:22:30 +08:00
170f758bc9 Update install.sh 2026-10-27 21:19:34 +08:00
8b7d563fac update 2026-10-27 21:18:03 +08:00
6f9e0cdd8f update 2026-10-27 21:16:58 +08:00
0a3af7a0c0 Create install_generic.sh 2026-10-27 21:16:25 +08:00
c90a2facac update 2026-10-27 21:15:35 +08:00
92d56bddab update 2026-10-27 21:07:39 +08:00
a3bab2da47 Update install.sh 2026-10-27 21:02:19 +08:00
d51a3ac1f7 Update info.json 2026-10-27 20:45:25 +08:00
04774bddc3 update 2026-10-27 20:45:00 +08:00
770f1532da update 2026-10-27 17:47:37 +08:00
d09872c2f3 update 2026-10-27 17:30:36 +08:00
e77369cd25 Update install.sh 2026-10-27 17:12:00 +08:00
69897a208c update 2026-10-27 17:10:57 +08:00
1f5c5ac66e update 2026-10-27 17:08:36 +08:00
3a7f8f09cb Update opcache.sh 2026-10-26 13:13:39 +08:00
77d2b9e323 update 2026-10-26 13:11:27 +08:00
d56c271cc4 update 2026-10-26 04:16:03 +08:00
b4aecf5d0c update 2026-10-26 04:15:29 +08:00
e55e23c845 Update rapira.js 2026-10-26 04:05:37 +08:00
e2977dbbc4 Update mcrypt.sh 2026-10-26 04:04:34 +08:00
8ad94ffeff Update install.sh 2026-10-26 04:02:58 +08:00
c94ff04dcf update 2026-10-26 04:00:20 +08:00
65f10ca22f Update sodium.sh 2026-10-26 03:53:59 +08:00
a1127b3bc0 Update sodium.sh 2026-10-26 03:52:48 +08:00
81c16d1a3d update 2026-10-26 03:47:17 +08:00
b1b4c82457 Update rapira.toml 2026-10-26 03:46:09 +08:00
515b22b103 update 2026-10-26 03:45:19 +08:00
c200165057 update 2026-10-26 03:24:02 +08:00
64c30893d5 update 2026-10-26 03:09:50 +08:00
98b8dce5fd up 2026-10-26 03:06:09 +08:00
0d9b7b6edf Update gd_old.sh 2026-10-26 02:59:15 +08:00
b72bb1fa87 update 2026-10-26 02:58:58 +08:00
d85131266c update 2026-10-26 02:56:59 +08:00
22da275f5b up 2026-10-26 02:51:34 +08:00
f6d65b9e33 update 2026-10-26 02:49:41 +08:00
ebc07becd0 update 2026-10-26 02:48:03 +08:00
024f2c2369 update 2026-10-26 02:45:33 +08:00
2b93fb684b update 2026-10-26 02:43:27 +08:00
b2daf6bf65 update 2026-10-26 02:37:33 +08:00
3ee0f553e9 update 2026-10-26 02:26:03 +08:00
f206da8278 Update apcu.sh 2026-10-26 02:07:49 +08:00
edbaeb37f5 update 2026-10-26 02:07:42 +08:00
46847833d0 update 2026-10-26 01:57:13 +08:00
4303a62b1b update 2026-10-26 01:12:09 +08:00
d6d5babf81 Update dispatcher.toml 2026-10-26 00:46:27 +08:00
8e5b10bda3 Update worker.toml 2026-10-26 00:45:45 +08:00
8e54ee987c Update index.py 2026-10-26 00:42:09 +08:00
929b30ce73 update 2026-10-26 00:38:38 +08:00
c085fa7066 update 2026-10-26 00:30:21 +08:00
783e71f189 update 2026-10-26 00:18:37 +08:00
ae1ffd313c Update doh.conf 2026-10-25 22:46:56 +08:00
122c0b5f64 Update doh.conf 2026-10-25 12:53:13 +08:00
21e496f22e Update doh.conf 2026-10-25 12:52:25 +08:00
d92b3039e2 Update doh.conf 2026-10-25 12:49:37 +08:00
ea57812191 Update info.json 2026-10-25 12:46:02 +08:00
d72238df45 update 2026-10-25 12:45:22 +08:00
55aab8d86d Update install.sh 2026-10-25 12:34:49 +08:00
f8d4d9e4cf update 2026-10-25 12:32:30 +08:00
90afa6446c Update install.sh 2026-10-25 09:58:41 +08:00
5e468c548a Update install.sh 2026-10-25 09:58:16 +08:00
48f4521ef6 Update install.sh 2026-10-25 09:55:12 +08:00
ccd48cecfb update 2026-10-25 09:52:31 +08:00
0757638b2e Update install.sh 2026-10-25 09:46:55 +08:00
68cb547d5f update 2026-10-25 08:13:29 +08:00
1f7c494d82 Update install.sh 2026-10-24 14:58:04 +08:00
Mr Chen
8e58783964 Merge pull request #947 from midoks/dev
redis在线更新支持
2026-10-24 14:14:35 +08:00
bfdc0639b6 update 2026-10-24 14:12:33 +08:00
337a7d87e4 Update install.sh 2026-10-24 14:08:47 +08:00
38c062220c redis 在线升级支持 2026-10-24 14:01:26 +08:00
f639acec86 Merge branch 'master' into dev 2026-10-24 12:54:12 +08:00
02ba38a01a Update install.sh 2026-10-24 12:30:18 +08:00
ea8487b14c up 2026-10-24 12:27:40 +08:00
Mr Chen
f0b613865b Merge pull request #946 from midoks/dev
0.19.0
2026-10-24 10:37:42 +08:00
b142f37045 Update install.sh 2026-10-24 02:04:36 +08:00
45eeb3c045 update 2026-10-24 02:03:38 +08:00
ab99d972cd update 2026-10-24 01:44:03 +08:00
08562a12a2 Update install.sh 2026-10-24 01:37:52 +08:00
d7e62bbfa1 update 2026-10-24 01:36:21 +08:00
5829c48995 update 2026-10-24 01:33:12 +08:00
cd133fc278 update 2026-10-24 01:24:21 +08:00
8a2a4d1a84 update 2026-10-24 01:03:12 +08:00
Mr Chen
a225b98432 Merge pull request #945 from midoks/dev
优化
2026-10-24 01:01:25 +08:00
1acd50b3f3 Update install.sh 2026-10-24 00:59:41 +08:00
5279fe0ba7 Update soft.js 2026-10-24 00:56:26 +08:00
a73f7d86a9 Update version.py 2026-10-24 00:47:15 +08:00
5fe7e4b43d update 2026-10-24 00:43:18 +08:00
d50d666fb2 Update install.sh 2026-10-24 00:42:30 +08:00
86229586f1 update 2026-10-24 00:42:06 +08:00
2947dea3dd Merge branch 'master' into dev 2026-10-24 00:38:28 +08:00
264534ff2c update 2026-10-24 00:38:16 +08:00
82655592d7 Update index.py 2026-10-24 00:35:57 +08:00
Mr Chen
85f90e8ce6 Merge pull request #944 from midoks/dev
优化
2026-10-24 00:29:19 +08:00
450ae37f05 Update index.py 2026-10-24 00:22:55 +08:00
07d0eff75b update 2026-10-24 00:16:33 +08:00
8697bea0d3 Update info.json 2026-10-23 23:59:14 +08:00
a06839fe20 Update info.json 2026-10-23 23:55:31 +08:00
6542113a21 Merge branch 'master' into dev 2026-10-23 23:53:11 +08:00
63d04b8c75 update 2026-10-23 23:50:05 +08:00
71b409a970 update 2026-10-23 23:48:31 +08:00
e0bcc720cc Update soft.html 2026-10-23 23:44:27 +08:00
8bcabd055b update 2026-10-23 23:38:02 +08:00
94597476ac update 2026-10-23 23:33:27 +08:00
a5172d4b5a update 2026-10-23 23:10:50 +08:00
ee79ea55db update 2026-10-23 23:04:31 +08:00
2230c2b632 update 2026-10-23 22:48:12 +08:00
9b231554ef update 2026-10-23 22:43:49 +08:00
ccc499359b Update fcgi_client.py 2026-10-23 22:38:02 +08:00
c5ba0dd8a2 openresty 支持在线升级 2026-10-23 22:31:44 +08:00
3811979f7e update 2026-10-23 22:14:26 +08:00
fb17b7e3a1 update 2026-10-23 22:08:10 +08:00
6ea79b8b28 支持插件更新功能 2026-10-23 22:03:48 +08:00
037e360e3d Update install.sh 2026-10-23 21:49:47 +08:00
3e4a995d5a Update info.json 2026-10-23 21:42:51 +08:00
9d7056184a Update public.js 2026-10-23 21:40:37 +08:00
8aad54b2eb Update index.py 2026-10-23 21:37:41 +08:00
9639dc0e19 Merge branch 'master' into dev 2026-10-23 19:45:14 +08:00
Mr Chen
1f816c4c09 Merge pull request #943 from midoks/dev
简单优化
2026-10-23 19:44:27 +08:00
d88c3d812e Create e.cfg 2026-10-23 19:40:00 +08:00
de3f060e8b Update requirements.txt 2026-10-23 19:32:50 +08:00
2c740726e2 Update lib.sh 2026-10-23 19:31:53 +08:00
01fcadf7c9 update 2026-10-23 19:30:25 +08:00
21378014c4 Update lib.sh 2026-10-23 19:29:50 +08:00
765e3d7d1a Update lib.sh 2026-10-23 19:29:11 +08:00
2bd77e5830 update 2026-10-23 19:20:46 +08:00
b5c61af33c Update plugin.py 2026-10-23 18:13:14 +08:00
ac7df862c1 Update info.json 2026-10-23 14:12:40 +08:00
ae30e8c740 update 2026-10-23 13:29:04 +08:00
db4cd40e35 Update sql_mysql.py 2026-10-23 13:19:34 +08:00
592cdc3e17 Update soft.html 2026-10-23 12:09:24 +08:00
Mr Chen
9a84276abf Merge pull request #942 from midoks/dev
优化
2026-10-22 16:52:22 +08:00
1c70d6381b Merge branch 'master' into dev 2026-10-22 16:51:48 +08:00
556da39be8 Update install.sh 2026-10-22 15:53:22 +08:00
59c8d02c7d Update install.sh 2026-10-22 15:52:03 +08:00
3b0b53d1b5 update 2026-10-22 15:44:47 +08:00
996cbfb279 Update install.sh 2026-10-22 15:37:43 +08:00
e47ad14cb1 Update install.sh 2026-10-22 15:36:50 +08:00
8921647180 update 2026-10-22 15:35:12 +08:00
Mr Chen
2d7933e715 Merge pull request #941 from midoks/dev
局部优化
2026-10-22 14:15:00 +08:00
cffe463779 update 2026-10-22 14:00:45 +08:00
2a0e7c090d Update install.sh 2026-10-22 13:47:58 +08:00
eab8ed9551 Update install.sh 2026-10-22 13:46:50 +08:00
Mr Chen
e9c3b5d135 Merge pull request #940 from midoks/dev
php 支持手动升级
2026-10-22 12:38:02 +08:00
59076d4750 update 2026-10-22 12:36:43 +08:00
8aa84d22a8 Update install.sh 2026-10-22 12:28:35 +08:00
cfb26034b1 Update install.sh 2026-10-22 12:27:30 +08:00
953980ee47 Update install.sh 2026-10-22 12:26:27 +08:00
994198517a Update install.sh 2026-10-22 12:26:07 +08:00
98728b2eb8 Update install.sh 2026-10-22 12:23:49 +08:00
6498606e69 update 2026-10-22 12:23:29 +08:00
Mr Chen
d17ba4d785 Merge pull request #939 from midoks/dev
php升级
2026-10-22 12:00:07 +08:00
e4eeed3559 update 2026-10-22 11:59:23 +08:00
b100204b37 Update rapira.toml 2026-10-18 11:01:26 +08:00
82ff3e3d0a Update rapira.js 2026-10-17 14:38:47 +08:00
0b2223bce0 Update rapira.js 2026-10-17 14:35:50 +08:00
a43b723b09 Update rapira.js 2026-10-17 14:34:17 +08:00
96551f49ca Update rapira.js 2026-10-17 14:32:51 +08:00
8e32d37985 Update rapira.toml 2026-10-17 14:21:49 +08:00
d1da238ddc update 2026-10-17 14:07:59 +08:00
7260a2be21 Create rapira.conf 2026-10-17 14:02:10 +08:00
7562d50e58 Update phpinfo.conf 2026-10-17 13:29:05 +08:00
e77ae8763b Update index.py 2026-10-17 13:28:22 +08:00
a0e51c75fe Update index.py 2026-10-17 13:22:00 +08:00
6021a5e6e2 Update enable-rapira.conf 2026-10-17 13:12:48 +08:00
e50e222955 Update index.py 2026-10-17 13:07:00 +08:00
531dd665c9 update 2026-10-17 13:02:17 +08:00
a79c0a1a9b update 2026-10-17 11:41:47 +08:00
9ef144c304 Update rapira.toml 2026-10-16 12:58:36 +08:00
5402af8df7 Update index.py 2026-10-16 12:38:11 +08:00
99802125dc Update index.py 2026-10-16 12:37:51 +08:00
705647cd3b Update rapira.toml 2026-10-16 11:54:05 +08:00
0ea2eeab7f Update rapira.toml 2026-10-16 11:53:31 +08:00
727cde1352 Update rapira.toml 2026-10-16 11:53:11 +08:00
6ef6358cbb update 2026-10-16 11:44:30 +08:00
6acb303ac9 update 2026-10-16 11:32:27 +08:00
a80e5492b8 Update index.html 2026-10-16 11:24:05 +08:00
4358b1a520 update 2026-10-16 11:11:00 +08:00
ad1a7c22a6 Update index.py 2026-10-16 11:01:33 +08:00
2f3af23e6d Update index.html 2026-10-15 16:23:17 +08:00
89a26d294d Update public.js 2026-10-15 15:43:36 +08:00
f83faeacac update 2026-10-15 15:42:08 +08:00
fb7c27c205 Update index.py 2026-10-15 15:37:08 +08:00
3f958c7083 Update index.html 2026-10-15 15:33:09 +08:00
60b6689318 Update index.py 2026-10-15 15:32:29 +08:00
ba94e81367 update 2026-10-15 15:05:36 +08:00
89c8c68b88 Update requirements.txt 2026-10-15 15:00:58 +08:00
e78ae7e4de Update requirements.txt 2026-10-15 15:00:32 +08:00
f87cadd3ce Update index.html 2026-10-15 14:59:44 +08:00
1631e149ea Update index.py 2026-10-15 14:58:02 +08:00
d84f585bff Update index.py 2026-10-15 14:52:00 +08:00
7e9091b341 update 2026-10-15 14:51:02 +08:00
7020d3e198 Update install.sh 2026-10-15 14:39:55 +08:00
9d8e0ded8f Update install.sh 2026-10-15 14:25:05 +08:00
090e8fa160 Create rapira.source.toml 2026-10-15 14:20:21 +08:00
83746675e7 Update install.sh 2026-10-15 14:19:57 +08:00
74d73d76cd Update index_php.py 2026-10-13 13:03:48 +08:00
6bfedde66d Update install.sh 2026-10-13 13:02:00 +08:00
554bee4040 Update install.sh 2026-10-13 13:01:27 +08:00
a1005adf04 Update install.sh 2026-10-13 11:43:52 +08:00
cbed47d825 update 2026-10-13 10:55:20 +08:00
abb7da896b Update index.py 2026-10-11 15:39:00 +08:00
e62a69ac45 update 2026-10-11 15:31:57 +08:00
769285736b update 2026-10-11 15:29:04 +08:00
8d2eaa94bd Update index.html 2026-10-11 15:07:48 +08:00
a31143e0e8 Update install.sh 2026-10-11 15:05:22 +08:00
584551f764 update 2026-10-11 15:04:11 +08:00
8b60a65bbd Update index.py 2026-10-11 14:52:34 +08:00
c13df7c25b Update index.py 2026-10-11 14:52:08 +08:00
ad30ba776c Update index.py 2026-10-11 14:51:43 +08:00
de3451993f Update install.sh 2026-10-11 14:45:56 +08:00
fde9b49f39 Update rapira.service.tpl 2026-10-11 14:39:51 +08:00
cff0e9442c Update install.sh 2026-10-11 14:34:11 +08:00
5cb57d89de Update install.sh 2026-10-11 14:29:32 +08:00
fadcbaa1bb Update install.sh 2026-10-11 14:29:01 +08:00
911554f6df Update install.sh 2026-10-11 14:27:46 +08:00
77b525d955 Update install.sh 2026-10-11 14:19:44 +08:00
b872a2bb53 Update install.sh 2026-10-11 14:19:29 +08:00
818444d4f4 Update install.sh 2026-10-11 14:17:47 +08:00
63e16e05aa Update install.sh 2026-10-11 13:56:53 +08:00
06743894a3 Update install.sh 2026-10-11 12:48:56 +08:00
2d665235c8 update 2026-10-11 12:43:17 +08:00
72311a2801 update 2026-10-09 12:42:45 +08:00
d7ba290ed3 up 2026-10-09 11:08:59 +08:00
e0d2984bae Update install.sh 2026-10-09 10:51:30 +08:00
ecdbe8d014 Update install.sh 2026-10-09 10:40:39 +08:00
7d57e320b8 Update install.sh 2026-10-09 10:40:27 +08:00
cf16b729f6 Create install.sh 2026-10-09 10:01:12 +08:00
366c5c91aa Update install.sh 2026-10-09 09:37:39 +08:00
173cf2985e Update install.sh 2026-10-09 09:17:39 +08:00
0bdba73f25 Update install.sh 2026-10-09 09:14:55 +08:00
24d25e69ad Update install.sh 2026-10-09 09:09:41 +08:00
d3e6297503 Update site.css 2026-10-08 21:30:53 +08:00
76b5f15115 update 2026-10-08 19:17:46 +08:00
cfa92b637a update 2026-10-08 18:52:56 +08:00
f07e75e508 init rapira 2026-10-08 18:42:21 +08:00
4220300731 Update site.css 2026-09-22 19:11:55 +08:00
Mr Chen
43b464866f Merge pull request #938 from midoks/dev
HDD和SSD磁盘识别
2026-09-22 16:31:43 +08:00
7bf5dbb4f3 Update site.css 2026-09-22 16:13:41 +08:00
9fe8453898 Update index.js 2026-09-22 16:05:43 +08:00
b421cf261f Update index.js 2026-09-22 16:02:45 +08:00
75d28763ee Update index.js 2026-09-22 15:58:28 +08:00
25533fa8bc Update main.py 2026-09-22 15:34:24 +08:00
04294e6cbe Update main.py 2026-09-22 15:28:38 +08:00
f0550ba6b3 Update main.py 2026-09-22 15:21:43 +08:00
88d0733d95 Update install.sh 2026-09-13 13:17:11 +08:00
74633e155a update 2026-09-13 12:59:14 +08:00
7d8d7a8c6f Create openssl_40.sh 2026-09-13 10:32:35 +08:00
Mr Chen
32956578b2 Merge pull request #937 from midoks/dev
bash符合标准
2026-09-11 22:52:09 +08:00
4efdf7606c update 2026-09-11 22:48:34 +08:00
a61644861b update 2026-09-11 22:39:42 +08:00
e60570e380 update 2026-09-11 22:25:42 +08:00
ad160cb23e update 2026-09-11 22:10:30 +08:00
73f58ced9a update 2026-09-11 21:57:55 +08:00
36ca82c1b4 update 2026-09-11 21:52:24 +08:00
acd46f4724 update 2026-09-11 21:28:59 +08:00
370ff99134 update 2026-09-11 21:10:03 +08:00
aa317ee2f5 update 2026-09-11 20:47:27 +08:00
44600b5657 update 2026-09-11 20:42:39 +08:00
ea45316a32 update 2026-09-11 20:32:22 +08:00
6cd13022f1 Update install.sh 2026-09-11 20:31:05 +08:00
91ff2f7550 update 2026-09-11 20:30:55 +08:00
483b5b090d Update install.sh 2026-09-11 20:18:46 +08:00
6087931c58 Update install.sh 2026-09-11 20:18:28 +08:00
9014fd8911 Update install.sh 2026-09-11 20:18:07 +08:00
76f7f51d80 Update install.sh 2026-09-11 20:15:43 +08:00
0c4902e01e Update install.sh 2026-09-11 20:13:34 +08:00
175fb089cd Update install.sh 2026-09-11 20:13:11 +08:00
7b8a4a38b3 Update install.sh 2026-09-11 20:12:33 +08:00
ebf920ed12 Update install.sh 2026-09-11 20:08:55 +08:00
bb8591f5e5 update 2026-09-11 20:06:25 +08:00
b8573e1f1f Update plugin.py 2026-09-11 20:04:59 +08:00
dacc1e5ad8 update 2026-09-11 20:00:47 +08:00
8cc64e32dd update 2026-09-11 19:55:44 +08:00
1d294cc3b1 Update index.py 2026-09-11 19:51:42 +08:00
f9da2e4391 update 2026-09-11 19:46:15 +08:00
3b78079cd2 Update install.sh 2026-09-11 19:35:40 +08:00
07a0a1be48 Update install.sh 2026-09-11 19:31:44 +08:00
837f95e571 Merge branch 'master' into dev 2026-09-09 01:45:29 +08:00
Mr Chen
909d818caa Merge pull request #936 from ramondelee/patch-2
Update freetype_new.sh
2026-09-09 01:44:12 +08:00
ramondelee
355ceebbd7 Update freetype_new.sh
修复freetype下载失败问题
2026-09-08 21:12:36 +08:00
6ae1370709 Merge branch 'master' into dev 2026-09-08 12:02:31 +08:00
Mr Chen
93b5d8b8b4 Merge pull request #935 from ramondelee/patch-1
Update freetype_old.sh
2026-09-08 12:02:10 +08:00
ramondelee
be461a15a9 Update freetype_old.sh
修复freetype下载失败问题
2026-09-07 22:23:11 +08:00
c239f35382 Update firewall.py 2026-09-02 08:25:34 +08:00
49d57af719 Update linux.conf 2026-08-27 13:36:19 +08:00
Mr Chen
19fc0fdc51 Merge pull request #934 from midoks/dev
常规更新
2026-08-26 18:16:57 +08:00
c1fd4fa24c Update __init__.py 2026-08-26 18:15:43 +08:00
7239b22759 update 2026-08-16 00:14:39 +08:00
f5fa94ae95 Update update.sh 2026-08-08 10:09:28 +08:00
Mr Chen
b679ea035d Merge pull request #933 from midoks/dev
常规优化
2026-07-22 13:05:42 +08:00
49bbca8faa Update index.py 2026-07-22 13:03:46 +08:00
8b86cd5e63 up 2026-07-22 13:00:43 +08:00
698e3ffd81 update 2026-07-22 12:55:33 +08:00
Mr Chen
c2284dcee5 Merge pull request #932 from midoks/dev
兼容Ubuntu 26.04 LTS
2026-07-21 20:43:06 +08:00
b68c9edc3e Update index.py 2026-07-21 20:37:12 +08:00
650365997a Update index.py 2026-07-21 20:36:34 +08:00
3279404595 Update info.json 2026-07-21 20:35:41 +08:00
d32a94dccf Update install.sh 2026-07-21 20:34:44 +08:00
80d846f247 Update install.sh 2026-07-21 20:31:08 +08:00
eadcbe336d Update install.sh 2026-07-21 20:26:57 +08:00
474d0f075f Update install.sh 2026-07-21 20:26:33 +08:00
2d6a41e19f Update install.sh 2026-07-21 12:03:36 +08:00
1f24944417 Update caddy.service.tpl 2026-07-21 11:51:42 +08:00
4ab3409e54 Update index.py 2026-07-21 11:43:14 +08:00
c3ad146303 update 2026-07-21 11:38:30 +08:00
745cd304fb Update install.sh 2026-07-21 00:33:05 +08:00
e6efefd1fd Update install.sh 2026-07-21 00:11:57 +08:00
1350404c58 Update install.sh 2026-07-21 00:10:03 +08:00
9cdd2274fa Update install.sh 2026-07-21 00:08:53 +08:00
cc204ad721 Update install.sh 2026-07-21 00:00:26 +08:00
8eb1614b31 Update install.sh 2026-07-20 23:50:41 +08:00
9c2e9627ec update 2026-07-20 23:48:18 +08:00
87123c526a update 2026-07-20 23:45:15 +08:00
7c3ebc6e35 Update ubuntu.sh 2026-07-20 23:42:08 +08:00
6c5bf63424 Update ubuntu.sh 2026-07-20 23:38:00 +08:00
13fd47e7d4 Update ubuntu.sh 2026-07-20 23:36:38 +08:00
fc1321584a Update ubuntu.sh 2026-07-20 23:36:25 +08:00
bab3ae16d3 Update ubuntu.sh 2026-07-20 23:33:35 +08:00
ab8498e519 Update ubuntu.sh 2026-07-20 23:33:13 +08:00
0e480c7ad8 update 2026-07-20 23:29:01 +08:00
7ed8558ff0 Update ubuntu.sh 2026-07-20 23:22:35 +08:00
4ed2f0caa9 update 2026-07-20 23:19:31 +08:00
f275eabe1b Update file.py 2026-07-20 23:08:01 +08:00
fe13ab1e5f Update file.py 2026-07-20 23:07:46 +08:00
6ed045cf94 update 2026-07-20 22:41:10 +08:00
ef333ff142 update 2026-07-20 22:23:37 +08:00
dac2f5240f Update install.sh 2026-07-20 22:18:45 +08:00
cebfc2fc91 update 2026-07-20 22:17:22 +08:00
1da865c1b2 Update install.sh 2026-07-20 16:46:29 +08:00
2abdaaa7ce Update install.sh 2026-07-20 16:45:08 +08:00
c62142cf6b Update requirements.txt 2026-07-20 16:04:57 +08:00
7c1820b6cd update 2026-07-20 15:59:27 +08:00
a24af95d24 Update install.sh 2026-07-20 15:39:32 +08:00
1326c282c8 Update requirements.txt 2026-07-20 15:33:13 +08:00
b7e84749f1 Update debian.sh 2026-07-20 15:26:10 +08:00
8a65158540 Update db.py 2026-07-20 15:21:46 +08:00
a576c521a2 Update ubuntu.sh 2026-07-20 15:17:24 +08:00
736a387a71 Update ubuntu.sh 2026-07-20 15:15:23 +08:00
090205c372 update 2026-07-20 13:41:03 +08:00
fda0bddc8f Update db.py 2026-07-20 13:26:23 +08:00
292b18468d Update db.py 2026-07-20 13:24:57 +08:00
47aab245fc Update panel_task.py 2026-07-20 12:42:24 +08:00
39bd601825 Update mw.py 2026-07-20 12:32:39 +08:00
b744adeb13 Update monitor.py 2026-07-20 11:46:30 +08:00
7b70f9fc99 Merge branch 'master' into dev 2026-07-19 22:06:00 +08:00
Mr Chen
0723f751b3 Merge pull request #930 from midoks/dependabot/pip/python-engineio-4.13.2
Bump python-engineio from 4.3.2 to 4.13.2
2026-07-19 22:05:47 +08:00
1fd8617a12 Update push_notice_msg.py 2026-07-17 23:21:19 +08:00
dependabot[bot]
2fec8fcef4 Bump python-engineio from 4.3.2 to 4.13.2
Bumps [python-engineio](https://github.com/miguelgrinberg/python-engineio) from 4.3.2 to 4.13.2.
- [Release notes](https://github.com/miguelgrinberg/python-engineio/releases)
- [Changelog](https://github.com/miguelgrinberg/python-engineio/blob/main/CHANGES.md)
- [Commits](https://github.com/miguelgrinberg/python-engineio/compare/v4.3.2...v4.13.2)

---
updated-dependencies:
- dependency-name: python-engineio
  dependency-version: 4.13.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-14 21:18:01 +00:00
Mr Chen
51a48afa71 Merge pull request #929 from ccbkkb/patch-1
Fix return statement for unban IP function
2026-07-13 13:12:38 +08:00
ccbkkb
76919faca7 Fix return statement for unban IP function 2026-07-13 10:50:19 +08:00
Mr Chen
9bcbeaf1a5 Merge pull request #928 from midoks/dev
常规更新
2026-07-09 17:11:23 +08:00
d0de121721 Update update.sh 2026-07-09 15:14:16 +08:00
957e2db3d0 Update update.sh 2026-07-09 15:06:33 +08:00
fb0be5549d Update update.sh 2026-07-09 15:04:40 +08:00
8a9132d557 Update update.sh 2026-07-09 14:52:08 +08:00
04d10435c2 Update update.sh 2026-07-09 14:51:29 +08:00
92543e10fa Update update.sh 2026-07-09 14:46:38 +08:00
cd427dcbf3 Update update.sh 2026-07-09 14:46:26 +08:00
Mr Chen
ddb5e0285b Merge pull request #927 from midoks/dev
常规更新
2026-07-09 14:24:08 +08:00
75610a4559 Update crontab.js 2026-07-09 14:22:26 +08:00
b8f7a45f61 Update push_notice_msg.py 2026-07-09 12:58:16 +08:00
Mr Chen
37d5ce719e Merge pull request #926 from midoks/dev
常规更新
2026-07-08 16:47:46 +08:00
ef9053aa7e Update webstats_index.py 2026-07-08 16:47:05 +08:00
018fcb7afb Update index.py 2026-07-08 16:46:45 +08:00
5cc9a67152 Update mw.py 2026-07-07 23:54:17 +08:00
54895f1d0a Update mw.py 2026-07-07 23:38:29 +08:00
91dfecf882 up 2026-07-07 23:36:34 +08:00
2f09e227d1 Update tool_migrate.py 2026-07-07 23:12:23 +08:00
5d0463836e Update mw.py 2026-07-07 23:11:02 +08:00
Mr Chen
fb6499cb35 Merge pull request #925 from midoks/dev
常规更新
2026-07-07 02:35:02 +08:00
0bbfb58e67 Update index.py 2026-07-07 02:32:34 +08:00
Mr Chen
fcd780a7d3 Merge pull request #924 from midoks/dev
常规更新
2026-07-07 02:19:41 +08:00
4f4d1e7580 Update webstats_common.lua 2026-07-07 02:15:57 +08:00
6e2a8e0a12 up 2026-07-07 02:12:09 +08:00
817b4b36c7 Update webstats.conf 2026-07-07 02:06:03 +08:00
Mr Chen
0ba89cbb9e Merge pull request #923 from midoks/dev
常规更新
2026-07-06 21:13:07 +08:00
4e3e7864be Update tool_migrate.py 2026-07-06 21:02:13 +08:00
6f51eaa298 update 2026-07-06 20:59:32 +08:00
39bd87e868 Update tool_migrate.py 2026-07-06 20:54:00 +08:00
18443aab60 Update tool_migrate.py 2026-07-06 20:49:20 +08:00
b88ea7aa3c update 2026-07-06 20:32:36 +08:00
6a6f6e6062 Update tool_migrate.py 2026-07-06 20:27:17 +08:00
5839dbcd6b Update tool_migrate.py 2026-07-06 20:05:10 +08:00
b46f45569e Update tool_migrate.py 2026-07-06 20:01:23 +08:00
5cdc5af8cd Update tool_migrate.py 2026-07-06 19:50:13 +08:00
4f38a9f3ff Update tool_migrate.py 2026-07-06 19:49:58 +08:00
9c83695187 Create tool_migrate.py 2026-07-06 19:44:14 +08:00
f9be534101 update 2026-07-06 19:24:36 +08:00
58ab48ac15 Update webstats_common.lua 2026-07-06 19:11:48 +08:00
f34e93192d Update webstats_common.lua 2026-07-06 19:10:17 +08:00
31106f2b13 Update webstats_common.lua 2026-07-06 19:03:27 +08:00
468cc54cf5 Update webstats_common.lua 2026-07-06 18:55:25 +08:00
728a38c55c Update webstats_log.lua 2026-07-06 18:35:05 +08:00
Mr Chen
b2b23b0e3b Merge pull request #922 from midoks/dev
常规更新
2026-07-05 15:51:08 +08:00
167dd11548 Update webstats_log.lua 2026-07-05 15:47:23 +08:00
03fdbf2604 Merge branch 'master' into dev 2026-07-05 15:43:18 +08:00
edbdec8370 Update init.sql 2026-07-05 15:42:44 +08:00
8f1c9f9471 up 2026-07-05 15:38:54 +08:00
d35d16943d up 2026-07-05 15:34:56 +08:00
3ac4270dee Update stats.js 2026-07-05 15:30:16 +08:00
90777e08ff update 2026-07-05 15:28:56 +08:00
b47d1262ac Update push_notice_msg.py 2026-07-05 15:11:57 +08:00
e28081a7c5 Update stats.js 2026-07-05 15:04:05 +08:00
5f7d6c1488 Create webstats_common.lua.bk1.txt 2026-07-05 14:46:32 +08:00
59385e11be Merge branch 'master' into dev 2026-07-05 14:21:28 +08:00
Mr Chen
a668d88791 Merge pull request #921 from midoks/dev
常规更新
2026-07-05 14:13:11 +08:00
e62bd7c5a6 Update webstats_log.lua 2026-07-05 14:07:31 +08:00
1ad3d2f187 Update webstats_log.lua 2026-07-05 13:41:19 +08:00
bf06af14ed Update webstats_log.lua 2026-07-05 13:24:37 +08:00
Mr Chen
805c96f260 Merge pull request #920 from midoks/dev
常规更新
2026-07-05 12:33:28 +08:00
8ccba2f6d5 Update webstats_log.lua 2026-07-05 04:08:00 +08:00
2e9f01d3ee Update webstats_log.lua 2026-07-05 04:05:19 +08:00
d1dcdd4f25 Update webstats_common.lua 2026-07-05 03:58:34 +08:00
60958d1403 Update webstats_common.lua 2026-07-05 03:56:13 +08:00
5530b14f36 Update webstats_common.lua 2026-07-05 03:36:39 +08:00
64c9942ee1 Update webstats_common.lua 2026-07-05 03:36:26 +08:00
bc1437dac4 Update webstats_init_worker.lua 2026-07-05 03:27:35 +08:00
1d9576e838 Update webstats_log.lua 2026-07-05 03:27:11 +08:00
8b275a5df4 Update webstats_log.lua 2026-07-05 03:18:14 +08:00
40d9334dcf Update index.py 2026-07-05 02:45:28 +08:00
98c0242819 Update index.py 2026-07-05 02:39:23 +08:00
a2fb03f9b8 Update index.py 2026-07-05 02:31:20 +08:00
98815ac5c3 update 2026-07-05 02:29:29 +08:00
073dd20c96 update 2026-07-05 01:16:02 +08:00
23af9085a9 update 2026-07-05 00:51:14 +08:00
bcaec6b6ee Update install.sh 2026-07-04 23:42:10 +08:00
4063bea922 Update webstats_common.lua 2026-07-04 23:02:54 +08:00
9f864b3407 Update webstats_common.lua 2026-07-04 22:56:49 +08:00
01ac598e39 Update webstats_common.lua 2026-07-04 22:43:20 +08:00
77a0d3af36 Update webstats_common.lua 2026-07-04 22:35:03 +08:00
8d34bbea47 Update webstats_common.lua 2026-07-04 22:33:43 +08:00
be18e98001 Update webstats_common.lua 2026-07-04 22:23:56 +08:00
754e0f98f9 Update webstats_common.lua 2026-07-04 22:23:43 +08:00
07f893b6a1 Update webstats_common.lua 2026-07-04 22:21:17 +08:00
Mr Chen
c1497ec44e Merge pull request #919 from midoks/dev
常规更新
2026-07-03 12:05:30 +08:00
55d4784fe2 Update webstats_common.lua 2026-07-02 14:30:04 +08:00
f26e8bc520 update 2026-07-02 14:22:10 +08:00
7b5f1a4253 up 2026-07-02 14:12:32 +08:00
1058fb7e1f Update webstats_log.lua 2026-07-02 14:01:50 +08:00
0f1b95cdfc up 2026-07-02 13:54:31 +08:00
8ea16fcd85 Update webstats_common.lua 2026-07-02 13:32:22 +08:00
b4b9496980 Update webstats_common.lua 2026-07-02 13:15:12 +08:00
8dfd26361f Update webstats_common.lua 2026-07-02 13:06:32 +08:00
cb5bd32b86 Update webstats_common.lua 2026-07-02 13:02:31 +08:00
2584330d40 update 2026-07-02 12:52:05 +08:00
ebe6333ac9 up 2026-07-02 12:50:35 +08:00
534892280e up 2026-07-02 12:45:28 +08:00
df05cf69cf Update tool_migrate.py 2026-07-02 12:27:43 +08:00
2f782cf6a2 Update db.py 2026-07-02 12:26:19 +08:00
6f483c17e6 Create tool_migrate_bak.py 2026-07-02 11:42:13 +08:00
e64610a2dc Update mw.py 2026-06-30 20:18:46 +08:00
Mr Chen
7673a16779 Merge pull request #918 from midoks/dev
常规更新
2026-06-29 00:51:56 +08:00
d73fe4b29c Update __init__.py 2026-06-29 00:51:14 +08:00
2c61be084b Update __init__.py 2026-06-29 00:38:56 +08:00
fe5f8d1997 Update __init__.py 2026-06-29 00:38:08 +08:00
2653291ded Update __init__.py 2026-06-29 00:37:42 +08:00
417f91a2e8 Update init_cron.py 2026-06-29 00:19:10 +08:00
Mr Chen
08625e85bb Merge pull request #917 from midoks/dev
常规更新
2026-06-28 23:23:15 +08:00
c554c19a12 Update site.py 2026-06-28 23:10:34 +08:00
d7d08f2f12 Update site.py 2026-06-28 23:09:46 +08:00
Mr Chen
bafe45a2f9 Merge pull request #916 from midoks/dev
常规优化
2026-06-28 22:44:26 +08:00
a11d24723d Update README.md 2026-06-28 22:43:37 +08:00
3b858476f1 Update version.py 2026-06-28 22:41:13 +08:00
5560b68ac1 Update site.js 2026-06-28 22:40:26 +08:00
8bfd381363 Update site.py 2026-06-28 22:38:29 +08:00
c6cfe2a22c Update mw.py 2026-06-28 22:34:51 +08:00
4ed274dedc Update gd_old.sh 2026-06-28 22:26:28 +08:00
Mr Chen
283c815de7 Merge pull request #915 from midoks/dev
哪吒监控更新,同步官方
2026-06-22 18:00:56 +08:00
c72c1bc889 Update update.sh 2026-06-22 17:59:31 +08:00
6e61a535ca Update update.sh 2026-06-22 17:54:37 +08:00
c1f69ea1c7 Update update.sh 2026-06-22 17:51:11 +08:00
984599c56f Update update.sh 2026-06-22 17:50:22 +08:00
038bb31ec3 Update update.sh 2026-06-22 17:48:58 +08:00
1ac541d16e Update update.sh 2026-06-22 17:48:47 +08:00
ecaa0e99c5 Update update.sh 2026-06-22 17:45:38 +08:00
666ebeef0d Update update.sh 2026-06-22 17:43:53 +08:00
b39a936fa4 Update update.sh 2026-06-22 17:41:12 +08:00
d434dce568 Update update.sh 2026-06-22 17:40:21 +08:00
6acb390133 Update update.sh 2026-06-22 17:30:59 +08:00
3c6f3c50c4 Update update.sh 2026-06-22 17:28:40 +08:00
c52e707421 Update update.sh 2026-06-22 17:21:11 +08:00
5fb998c221 update 2026-06-22 17:15:18 +08:00
a0989ea833 Update nezha.js 2026-06-22 17:12:09 +08:00
5e565c06a0 Update nezha.js 2026-06-22 17:09:22 +08:00
69b96aa5fa Create update.sh 2026-06-22 17:08:16 +08:00
bce9de1494 Update nezha.js 2026-06-22 17:05:57 +08:00
3de7928be7 Update nezha.js 2026-06-22 17:05:30 +08:00
41630ef01a Update install.sh 2026-06-22 17:03:46 +08:00
bf29cb1a4d Update index.py 2026-06-22 16:59:49 +08:00
8f79a4ab86 update 2026-06-22 16:59:23 +08:00
0ad933c5ad Update nezha.js 2026-06-22 16:55:33 +08:00
5ed9470d83 update 2026-06-22 16:53:26 +08:00
cac468f454 Update plugin.py 2026-06-22 16:33:54 +08:00
f0f9dcf4de Update index.py 2026-06-22 16:32:59 +08:00
3e0e84a4f6 Update index.py 2026-06-22 16:09:53 +08:00
ef8080b420 Update index.py 2026-06-22 16:05:57 +08:00
b5fab1fb10 Update plugin.py 2026-06-22 16:03:41 +08:00
c3f019d4ff Update plugin.py 2026-06-22 16:00:40 +08:00
701f172276 Update plugin.py 2026-06-22 15:56:05 +08:00
9e8c736cb4 Update install.sh 2026-06-22 15:31:31 +08:00
c8589d750c Update info.json 2026-06-22 15:30:42 +08:00
5bb20a01de update 2026-06-22 15:16:01 +08:00
6e4bf9da3e Update nezha.js 2026-06-22 15:02:39 +08:00
c21ddb5c63 Update install.sh 2026-06-22 14:43:12 +08:00
431295cec9 update 2026-06-22 14:42:54 +08:00
180cb84b2c Update index.py 2026-06-22 14:42:14 +08:00
66b5f322d9 Update index.py 2026-06-22 14:41:00 +08:00
f00dc248bd Update install.sh 2026-06-22 14:40:16 +08:00
dbba5db9f7 Update info.json 2026-06-22 14:40:06 +08:00
3a8b799df6 Update index.py 2026-06-22 14:39:29 +08:00
0b99a4ae74 update 2026-06-22 14:35:51 +08:00
99b77d347a update 2026-06-22 14:30:08 +08:00
8235a88ecc Update nezha.js 2026-06-22 14:27:32 +08:00
564ba30f91 Update install.sh 2026-06-22 14:23:48 +08:00
aa8535d513 update 2026-06-22 14:22:40 +08:00
a02ef2575b Update install.sh 2026-06-22 14:21:10 +08:00
a0be16c0fa Update install.sh 2026-06-22 14:12:24 +08:00
548d87e339 Update install.sh 2026-06-22 14:12:14 +08:00
c704aa0817 Update install.sh 2026-06-22 14:10:03 +08:00
c6a060fde5 Update install.sh 2026-06-22 14:09:51 +08:00
762e88cc44 Update index.py 2026-06-22 14:05:03 +08:00
b7f671d1d5 update 2026-06-22 14:04:45 +08:00
48706d01f9 Update index.py 2026-06-22 14:04:21 +08:00
fb53354956 Update index.py 2026-06-22 14:03:54 +08:00
5995147054 Update index.py 2026-06-22 13:59:22 +08:00
fed9f458d1 Update install.sh 2026-06-22 13:49:41 +08:00
7987564401 Update install.sh 2026-06-22 13:45:08 +08:00
90ae21fb8b Update nezha.service.tpl 2026-06-22 13:43:14 +08:00
56a78d174d Update install.sh 2026-06-22 13:31:25 +08:00
37da947b90 Update install.sh 2026-06-22 13:31:09 +08:00
f23e272027 Update install.sh 2026-06-22 13:27:25 +08:00
10afc0a2d5 Update install.sh 2026-06-22 13:19:13 +08:00
f59c8ea533 Update install.sh 2026-06-22 13:17:26 +08:00
4153ea7431 update 2026-06-22 13:16:32 +08:00
2c73577798 Update nezha.js 2026-06-22 13:08:33 +08:00
0b5c53ef7e Update index.html 2026-06-22 12:55:34 +08:00
0fca0d54f8 Update info.json 2026-06-22 12:53:08 +08:00
3da0c5b2b6 Update install.sh 2026-06-22 12:52:55 +08:00
d8519bc1c3 update 2026-06-22 12:49:08 +08:00
33a4a799c5 Update index.py 2026-06-22 12:48:46 +08:00
358a021ba6 Update install.sh 2026-06-22 12:47:54 +08:00
6dba9c25b6 update 2026-06-22 12:47:23 +08:00
Mr Chen
1f724c802b Merge pull request #914 from midoks/dependabot/pip/gevent-23.9.0
Bump gevent from 22.10.2 to 23.9.0
2026-06-21 10:36:12 +08:00
dependabot[bot]
67e3dd0035 Bump gevent from 22.10.2 to 23.9.0
Bumps [gevent](https://github.com/gevent/gevent) from 22.10.2 to 23.9.0.
- [Release notes](https://github.com/gevent/gevent/releases)
- [Changelog](https://github.com/gevent/gevent/blob/master/docs/changelog_pre.rst)
- [Commits](https://github.com/gevent/gevent/compare/22.10.2...23.9.0)

---
updated-dependencies:
- dependency-name: gevent
  dependency-version: 23.9.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-21 02:35:26 +00:00
Mr Chen
de657829fd Merge pull request #913 from midoks/dev
常规更新
2026-06-21 10:33:03 +08:00
a2c27134a8 update 2026-06-21 10:30:30 +08:00
66c60ec10e Update r3.9.txt 2026-06-21 10:25:42 +08:00
867b39d8e1 Update r3.9.txt 2026-06-21 10:25:12 +08:00
1c8997d44a Update requirements.txt 2026-06-21 10:23:14 +08:00
88b5112e30 Update requirements.txt 2026-06-21 10:20:39 +08:00
3874b6a25a Update mw.py 2026-06-21 10:18:48 +08:00
Mr Chen
8ba6587c57 Merge pull request #912 from midoks/dev
常规更新
2026-06-21 10:17:02 +08:00
3ebe36f785 Update mw.py 2026-06-21 10:13:07 +08:00
Mr Chen
34ed0b96d3 Merge pull request #910 from midoks/dev
常规更新
2026-06-20 19:38:45 +08:00
ab353d2268 Update mw.py 2026-06-20 19:36:23 +08:00
Mr Chen
fd6f013480 Merge pull request #909 from midoks/dev
证书读取兼容
2026-06-20 19:31:31 +08:00
4d0b7bc127 Update mw.py 2026-06-20 19:27:39 +08:00
ce917b227f Merge branch 'master' into dev 2026-06-20 18:58:41 +08:00
dec1bb04e8 Merge branch 'master' into dev 2026-06-20 18:57:49 +08:00
Mr Chen
a1093c17bc Merge pull request #908 from midoks/dev
常规更新
2026-06-20 18:56:05 +08:00
8110fbf701 Update openresty.js 2026-06-20 18:44:03 +08:00
cf502ebf05 Update openresty.js 2026-06-20 18:37:41 +08:00
7c7837b967 up 2026-06-20 18:25:40 +08:00
3bfc1cacb0 Update openresty.js 2026-06-20 18:20:52 +08:00
cd2ea26608 Update openresty.js 2026-06-20 18:15:52 +08:00
dcf8159d1c update 2026-06-20 18:11:57 +08:00
Mr Chen
1bdab80b5d Merge pull request #907 from midoks/dev
常规更新
2026-06-20 15:33:43 +08:00
241c4dc600 Update install.sh 2026-06-20 15:24:32 +08:00
18e93d2b24 Update info.json 2026-06-20 15:13:08 +08:00
084cf6b761 Update info.json 2026-06-20 14:42:54 +08:00
47ddf5f4e6 Update install.sh 2026-06-20 14:40:58 +08:00
325321f5d4 Update install.sh 2026-06-20 14:32:38 +08:00
ecbeca3d35 Update install.sh 2026-06-20 14:29:40 +08:00
862b434c72 Update install.sh 2026-06-20 14:29:10 +08:00
6376ed3b7b update 2026-06-20 14:28:23 +08:00
42e40d1718 Update push_notice_msg.py 2026-06-18 14:33:55 +08:00
1c1cc12058 Update install.sh 2026-06-18 02:23:01 +08:00
e648b88a74 Update install.sh 2026-06-18 02:05:24 +08:00
Mr Chen
6fea46f7c8 Merge pull request #905 from midoks/dev
常规更新
2026-06-17 18:21:27 +08:00
a06e5a6e55 Update gd_old.sh 2026-06-17 18:21:15 +08:00
85bf429a08 Update freetype_old.sh 2026-06-17 18:14:30 +08:00
dd6ba45cdd Update gd_old.sh 2026-06-17 17:39:36 +08:00
ab967efa64 Update gd_old.sh 2026-06-17 17:16:14 +08:00
369505e1a0 Update r3.9.txt 2026-06-12 18:18:08 +08:00
86d858a0fb Update r3.9.txt 2026-06-12 18:15:50 +08:00
d1f5158276 Update r3.9.txt 2026-06-12 18:13:48 +08:00
Mr Chen
db83b0f78c Merge pull request #904 from midoks/dev
常规更新
2026-06-12 18:07:52 +08:00
24fcc5a0c6 Update requirements.txt 2026-06-12 17:51:47 +08:00
Mr Chen
9cb3d474aa Merge pull request #900 from midoks/dev
常规更新
2026-06-12 16:29:24 +08:00
0adfebfad6 Update install.sh 2026-06-12 16:25:58 +08:00
66c4225aa3 update 2026-06-09 11:11:15 +08:00
6ddef9ffda Update setting.py 2026-06-08 17:56:08 +08:00
27a1b22e6f Update setting.py 2026-06-08 17:54:45 +08:00
f9c18cb225 update 2026-06-07 00:10:11 +08:00
b97733328a Update plugin.py 2026-06-05 11:47:25 +08:00
Mr Chen
2fe17aefd9 Merge pull request #899 from midoks/dev
常规更新
2026-06-01 19:10:03 +08:00
acddca54cd update 2026-06-01 19:06:13 +08:00
7d80fb31ce Update install.sh 2026-06-01 18:52:36 +08:00
Mr Chen
8ac1d78053 Merge pull request #898 from midoks/dev
常规优化
2026-06-01 11:53:03 +08:00
468d6d7752 Update op_waf_index.py 2026-06-01 11:50:38 +08:00
f49d789411 update 2026-06-01 11:49:51 +08:00
1f56115fbb update 2026-05-21 17:35:19 +08:00
20d277102e Update install.sh 2026-05-21 11:08:06 +08:00
47b4036f09 Update install.sh 2026-05-21 10:32:07 +08:00
Mr Chen
ee9e154fec Merge pull request #897 from midoks/dev
openresty 1.29.2.4
2026-05-21 10:26:24 +08:00
85256b4fb6 Update install.sh 2026-05-21 10:24:37 +08:00
Mr Chen
16be671f1d Merge pull request #896 from midoks/dev
常规更新
2026-05-20 16:08:41 +08:00
af880115ab update 2026-05-17 18:06:54 +08:00
e64ac8f616 Update info.json 2026-05-17 18:01:47 +08:00
a7d4206b77 update 2026-05-17 17:58:29 +08:00
5a80690404 update 2026-05-17 17:55:47 +08:00
9b0d71d4ac Update phplib.conf 2026-05-17 17:54:01 +08:00
729f77d8db Update opcache.sh 2026-05-17 17:53:53 +08:00
e89f96aa2d Update phplib.conf 2026-05-17 17:50:16 +08:00
Mr Chen
f05f81cace Merge pull request #893 from midoks/dev
常规优化
2026-05-09 20:20:59 +08:00
f4883ee708 Update webstats_index.py 2026-05-09 20:18:45 +08:00
043fb739d9 Update index.py 2026-05-09 20:04:41 +08:00
b19aa8702b Update index.py 2026-05-09 20:01:39 +08:00
f4e0744879 update 2026-05-09 19:59:09 +08:00
Mr Chen
d7c822f86d Merge pull request #892 from midoks/dev
常规更新
2026-05-09 14:31:10 +08:00
c8f8e217e5 update 2026-05-09 14:26:41 +08:00
Mr Chen
bfec7f1fe8 Merge pull request #891 from midoks/dev
常规更新
2026-05-07 19:07:02 +08:00
21fce1f618 Update index.py 2026-05-07 19:05:07 +08:00
b5987b57ad Update task.py 2026-05-07 18:48:04 +08:00
e8c1cb08a7 update 2026-05-07 18:47:45 +08:00
0de3a16898 Update index.py 2026-05-07 18:42:07 +08:00
278bd7f38e Update debian.sh 2026-05-07 17:50:16 +08:00
4a3b9db324 Update debian.sh 2026-05-07 17:47:48 +08:00
b3e8e96875 Update index.py 2026-05-07 17:06:56 +08:00
f5e50c6d76 Update index.py 2026-05-07 16:59:27 +08:00
c551c2ee1a Update index.py 2026-05-07 16:55:58 +08:00
3fb8406e7b Update index.py 2026-05-07 16:53:30 +08:00
50d12407c9 Update install.sh 2026-05-07 16:48:13 +08:00
17931bb0ea Update install.sh 2026-05-07 16:48:03 +08:00
6d30940920 Update index.py 2026-05-07 16:46:31 +08:00
3a4c985baf Update index.py 2026-05-07 16:45:59 +08:00
Mr Chen
960d8b6cb8 Merge pull request #890 from midoks/dev
mongodb 兼容低版本
2026-05-07 16:34:36 +08:00
9b7e9d4ffa update 2026-05-07 16:29:03 +08:00
c1a646c0d7 Merge branch 'master' into dev 2026-05-07 16:25:26 +08:00
48ef0e7a65 Update index.py 2026-05-07 16:22:03 +08:00
8dff306a91 Update index.py 2026-05-07 16:20:03 +08:00
a935acbc95 update 2026-05-07 16:12:16 +08:00
b1f9c99eb1 Update mw.tpl 2026-05-07 16:04:53 +08:00
0851f749c3 Update mw.tpl 2026-05-07 15:57:20 +08:00
3a7d9f84c7 Update install.sh 2026-05-07 15:22:12 +08:00
b43b35ccab Update install.sh 2026-05-07 15:21:29 +08:00
5fc6eacc53 update 2026-05-07 15:11:09 +08:00
bd782362e8 update 2026-05-07 15:06:37 +08:00
32151a176f update 2026-05-07 15:04:27 +08:00
f7c88d2086 update 2026-05-07 14:01:26 +08:00
1eb76f2b90 update 2026-05-07 13:56:40 +08:00
226b3e049d Merge branch 'master' into dev 2026-05-07 12:58:58 +08:00
Mr Chen
7f0e9851cd Merge pull request #889 from midoks/dev
常规优化
2026-05-07 12:58:41 +08:00
15df77940e Update index.py 2026-05-07 12:09:57 +08:00
9781516552 Update plugin.py 2026-05-07 12:05:18 +08:00
a23264a542 update 2026-05-07 12:03:23 +08:00
0e7845985a Update install.sh 2026-05-07 11:51:06 +08:00
93efe45347 Update install.sh 2026-05-07 11:40:52 +08:00
a46f824e1e Update install.sh 2026-05-07 11:40:09 +08:00
Mr Chen
0de9f036bc Merge pull request #888 from midoks/dev
常规优化
2026-05-01 19:19:07 +08:00
275f2515d6 优化 2026-05-01 19:17:05 +08:00
b4604928ec Update panel_task.py 2026-05-01 18:53:42 +08:00
5a79b4021a update 2026-04-23 23:09:01 +08:00
280fd38039 Create r3.9.txt 2026-04-23 15:29:05 +08:00
Mr Chen
b032364616 Merge pull request #887 from midoks/dev
常规更新
2026-04-23 00:24:22 +08:00
a430aaee97 Update index.py 2026-04-23 00:19:46 +08:00
f4ee2ca3b9 Update install.sh 2026-04-23 00:12:59 +08:00
92b9212b31 update 2026-04-23 00:12:57 +08:00
73656e60ff Update nginx.conf 2026-04-22 23:02:44 +08:00
401329d80c update 2026-04-22 22:32:25 +08:00
Mr Chen
6131970724 Merge pull request #886 from midoks/dev
常规优化
2026-04-21 20:51:12 +08:00
85dcc4b78a update 2026-04-21 20:27:46 +08:00
34a1bf7e28 Update mw.tpl 2026-04-15 20:33:51 +08:00
Mr Chen
afdccefa98 Merge pull request #885 from midoks/dev
0.18.6
2026-04-15 20:00:09 +08:00
e1fd0a5535 Delete r3.9.txt 2026-04-15 19:54:42 +08:00
15d2cd7342 update 2026-04-15 19:53:22 +08:00
Mr Chen
f5fda8b71f Merge pull request #884 from midoks/dev
紧急‼️更新。计划任务修改未鉴权
2026-04-15 19:33:41 +08:00
8586dbbe8b Update site_default.py 2026-04-15 19:32:07 +08:00
c508c71f60 Update __init__.py 2026-04-15 19:28:57 +08:00
Mr Chen
33cabc8e2d Merge pull request #883 from midoks/dev
简单优化
2026-04-15 17:33:09 +08:00
e244d477e2 Update mw.tpl 2026-04-15 17:08:47 +08:00
c2f81e182a update 2026-04-15 17:02:25 +08:00
d7c68cfaa9 Update mw.tpl 2026-04-15 16:42:15 +08:00
b1aa5b8183 Update install.sh 2026-04-15 16:34:01 +08:00
877b1dacf8 Update mw.tpl 2026-04-15 16:28:58 +08:00
8eef664e50 Update mw.tpl 2026-04-15 16:28:16 +08:00
f0581f5038 Update mw.tpl 2026-04-15 16:27:42 +08:00
0b584d48b8 up 2026-04-15 16:06:58 +08:00
9199875c51 Update mw.tpl 2026-04-15 15:41:19 +08:00
e062cc4870 Update __init__.py 2026-04-15 15:10:36 +08:00
2ba4d87b75 Update mw.tpl 2026-04-15 15:08:37 +08:00
4b4c0df77d update 2026-04-15 14:03:21 +08:00
b5e4f32fa5 Update __init__.py 2026-04-15 13:56:05 +08:00
27ca45b088 Update http.tpl 2026-04-15 13:45:02 +08:00
345e38a560 Create http.tpl 2026-04-15 13:26:43 +08:00
176e4c8b3e update 2026-04-15 13:22:15 +08:00
81083dd30c Delete test_apache_install.sh 2026-04-14 18:31:17 +08:00
9a5a09438e Update mw.tpl 2026-04-14 18:26:12 +08:00
f17447b2f1 Update mw.tpl 2026-04-14 18:11:18 +08:00
930eb14a8a Update mw.tpl 2026-04-14 18:04:35 +08:00
08951f8c2e Update mw.tpl 2026-04-14 18:00:02 +08:00
c74bb01c3c Update mw.tpl 2026-04-14 17:53:14 +08:00
34b9b189d4 Update mw.tpl 2026-04-14 17:43:22 +08:00
960aca266e Update mw.tpl 2026-04-14 17:32:55 +08:00
840e04dc55 Update index.py 2026-04-12 12:01:09 +08:00
defaf3f970 Update index.py 2026-04-12 12:01:02 +08:00
b8b2349b6c update 2026-04-12 11:49:35 +08:00
c3c4671f76 update 2026-04-12 11:23:54 +08:00
d9811d9d50 Update index.py 2026-04-12 11:10:47 +08:00
da515f8595 Update install.sh 2026-04-11 23:57:37 +08:00
467a8af504 Update httpd.conf 2026-04-11 23:55:46 +08:00
ed16571d44 Update install.sh 2026-04-11 23:53:49 +08:00
6d06f1fbce update 2026-04-11 23:53:31 +08:00
9a59b2ad3f Update install.sh 2026-04-11 23:51:33 +08:00
1dc03ca5ae Update httpd.service.tpl 2026-04-11 22:13:45 +08:00
260de6eae5 Update index.py 2026-04-11 22:05:27 +08:00
2458377010 Update index.py 2026-04-11 22:03:17 +08:00
d4a7f2bbc8 Update httpd.conf 2026-04-11 21:59:01 +08:00
1b8b009b58 Update httpd.conf 2026-04-11 21:55:10 +08:00
a6623058b5 Update httpd.conf 2026-04-11 21:52:11 +08:00
aa385a5e30 Update httpd.conf 2026-04-11 21:51:03 +08:00
67e9113b48 Update index.py 2026-04-11 21:45:10 +08:00
9667279bf6 Update index.py 2026-04-11 21:44:45 +08:00
84e94c1122 update 2026-04-11 21:43:44 +08:00
12fd04b296 Update index.py 2026-04-11 21:34:11 +08:00
2e5ab39fee Update install.sh 2026-04-11 21:32:54 +08:00
b975fedfee update 2026-04-11 21:24:15 +08:00
0670bca67d Update index.py 2026-04-11 21:00:23 +08:00
9a976fdd3c update 2026-04-11 20:56:29 +08:00
91d189cf00 Update index.py 2026-04-11 20:45:19 +08:00
b97e0df6c5 Update index.py 2026-04-11 20:44:54 +08:00
e966df976f Update index.py 2026-04-11 20:42:40 +08:00
530347c847 Update index.py 2026-04-11 20:41:55 +08:00
fc5acaf0be Update index.py 2026-04-11 20:40:07 +08:00
affea597bf Update index.py 2026-04-11 20:38:39 +08:00
732ad976bf Update index.py 2026-04-11 20:37:11 +08:00
b0133162f0 Update index.py 2026-04-11 20:36:30 +08:00
0fa462c385 Update index.py 2026-04-11 20:36:17 +08:00
f7d7ee6b43 update 2026-04-11 20:30:00 +08:00
b769b79b9a update 2026-04-11 20:23:44 +08:00
320001b3a3 Update httpd.service.tpl 2026-04-11 20:14:46 +08:00
5c53bb3853 up 2026-04-11 19:10:59 +08:00
584ac773b3 Update install.sh 2026-04-11 17:01:44 +08:00
be6e034153 Update install.sh 2026-04-11 16:57:04 +08:00
b85bb698d0 up 2026-04-11 16:56:03 +08:00
ecab1a45b9 up 2026-04-11 16:46:12 +08:00
d3a7f7a732 Update install.sh 2026-04-11 16:34:01 +08:00
30b106c5c2 Update install.sh 2026-04-11 16:32:44 +08:00
5b8148b83d Update install.sh 2026-04-11 16:32:04 +08:00
a973696501 Update install.sh 2026-04-11 16:30:49 +08:00
5bb5ad7ba8 Update install.sh 2026-04-11 16:22:08 +08:00
72188223ae Update install.sh 2026-04-11 16:19:02 +08:00
4fbd037af1 update 2026-04-11 16:18:12 +08:00
9789ab6e37 Update index.py 2026-04-11 15:04:56 +08:00
f766039139 caddy 2026-04-11 15:01:26 +08:00
9aad09be9a Update install.sh 2026-04-11 13:02:33 +08:00
Mr Chen
ea07a3e3ce Merge pull request #879 from midoks/dev
php pgsql扩展
2026-04-10 17:44:02 +08:00
4e9ea630d7 Update phplib.conf 2026-04-10 17:39:25 +08:00
c4aeecdf3a Update phplib.conf 2026-04-10 17:38:55 +08:00
ab36c69729 Update phplib.conf 2026-04-10 17:35:32 +08:00
ade7d1f735 Update phplib.conf 2026-04-10 17:33:13 +08:00
5c7d62c59b update 2026-04-10 17:31:20 +08:00
772de4e67b update 2026-04-10 17:29:14 +08:00
Mr Chen
2505f3904d Merge pull request #878 from midoks/dev
软件更新
2026-04-10 17:25:35 +08:00
ea06ede236 update 2026-04-10 16:40:29 +08:00
d9132fad5a update 2026-04-10 16:34:32 +08:00
b20148b93f update 2026-04-10 16:21:58 +08:00
41dde8a164 Update info.json 2026-04-10 16:14:31 +08:00
c83c4b052b update 2026-04-10 16:12:34 +08:00
3dad8258df Update setting.py 2026-04-08 22:58:17 +08:00
60f358510c Update nginx.conf 2026-04-08 19:03:54 +08:00
Mr Chen
46e5e5fbdc Merge pull request #876 from midoks/dev
常规优化
2026-04-08 00:24:22 +08:00
6561a63956 Update nginx.conf 2026-04-08 00:03:10 +08:00
9a390616ad Update nginx.conf 2026-04-08 00:02:27 +08:00
815ede7e1a Update nginx.conf 2026-04-08 00:01:20 +08:00
4960657be7 Update nginx.conf 2026-04-08 00:00:26 +08:00
Mr Chen
0b18aa4906 Merge pull request #875 from midoks/dev
Update __init__.py
2026-04-07 23:34:44 +08:00
f040827bc8 Update __init__.py 2026-04-07 23:27:43 +08:00
Mr Chen
876c3b2ecd Merge pull request #874 from midoks/dev
openresty配置优化
2026-04-07 15:30:38 +08:00
52c30a1e0e Update index.py 2026-04-07 15:27:00 +08:00
f2d93564a5 Update index.py 2026-04-07 15:24:46 +08:00
f19213d6f7 Update index.py 2026-04-07 15:23:08 +08:00
0e378ea982 Update openresty.js 2026-04-07 15:21:10 +08:00
51d8d48218 Update index.py 2026-04-07 15:18:28 +08:00
0f560a3594 update 2026-04-07 15:16:08 +08:00
Mr Chen
07ea3e39b9 Merge pull request #873 from midoks/dev
常规更新
2026-04-06 10:10:17 +08:00
50851ad62a Update mw.tpl 2026-04-06 10:04:31 +08:00
d45a956520 Update mw.tpl 2026-04-06 09:57:47 +08:00
7e9e95b7d2 Update mw.tpl 2026-04-06 09:56:49 +08:00
c02255dd08 Update mw.tpl 2026-04-06 09:55:18 +08:00
c465e15e96 Update __init__.py 2026-04-06 09:48:31 +08:00
Mr Chen
1da99434b3 Merge pull request #872 from midoks/dev
更新
2026-04-05 15:28:24 +08:00
368db8d94c up 2026-04-05 15:19:19 +08:00
a05c8cc3ea Update __init__.py 2026-04-05 15:12:45 +08:00
7d7ef2788e Update install.sh 2026-04-05 14:52:17 +08:00
93844b0e20 Update install.sh 2026-04-05 14:44:22 +08:00
Mr Chen
45b8e7cc28 Merge pull request #871 from midoks/dev
反代优化
2026-04-05 11:53:30 +08:00
59aea26e72 Update site.py 2026-04-05 11:51:16 +08:00
Mr Chen
a3a3a737ed Merge pull request #870 from midoks/dev
常规更新
2026-04-04 23:43:59 +08:00
69c048cfa6 Update index.py 2026-04-04 23:41:58 +08:00
045543f27a Update index.py 2026-04-04 23:41:05 +08:00
Mr Chen
3369821875 Merge pull request #869 from midoks/dev
面板优化
2026-04-04 23:09:53 +08:00
e880edd680 Update __init__.py 2026-04-04 22:59:04 +08:00
c5d516949d Update mw.tpl 2026-04-04 22:41:13 +08:00
cd695e5024 Update __init__.py 2026-04-04 22:37:01 +08:00
f97dd9747f Update __init__.py 2026-04-04 22:25:03 +08:00
67ed60731b Update __init__.py 2026-04-04 22:13:31 +08:00
d2c756a08a Update __init__.py 2026-04-04 22:13:22 +08:00
976d8a16e4 Update __init__.py 2026-04-04 22:08:54 +08:00
55f7a181cd 去掉 whitenoise , 使用flask static原生的功能 2026-04-04 21:28:51 +08:00
55d0ebad03 支持br和zstd 2026-04-04 21:04:47 +08:00
Mr Chen
5db9a064ca Merge pull request #868 from midoks/dev
常规更新
2026-04-04 19:26:23 +08:00
2a5fe72a34 Update mw.tpl 2026-04-04 19:24:57 +08:00
fd6d36b6d9 Update install.sh 2026-04-04 13:31:44 +08:00
Mr Chen
2aafc85fae Merge pull request #867 from midoks/dev
Update mw.py
2026-04-04 10:50:25 +08:00
3905f4ed28 Update mw.py 2026-04-04 10:38:24 +08:00
Mr Chen
c6570ac499 Merge pull request #866 from midoks/dev
openresty http3 较为完美实现
2026-04-04 01:08:23 +08:00
9241be1f5f Update mw.py 2026-04-04 01:01:22 +08:00
4fbd695f4e Update site.py 2026-04-04 00:42:07 +08:00
05b72a0c7e update 2026-04-04 00:29:52 +08:00
09ab982a4a Update site.js 2026-04-04 00:26:07 +08:00
70b2f20ca8 Update nginx.conf 2026-04-04 00:18:19 +08:00
4f12a096e7 up 2026-04-04 00:09:46 +08:00
ea5df706a8 Update site.py 2026-04-03 21:47:02 +08:00
d92dae066d Update install.sh 2026-04-03 21:13:22 +08:00
Mr Chen
40345f6cb9 Merge pull request #865 from midoks/dev
openresty优化
2026-04-03 14:18:42 +08:00
8aaf0eb99e Update site.py 2026-04-03 14:11:28 +08:00
cd1885477d Update site.py 2026-04-03 14:08:08 +08:00
28bb578170 Update site.py 2026-04-03 14:07:25 +08:00
2965df19cb Update site.py 2026-04-03 13:57:58 +08:00
36929f3ab4 Update nginx.conf 2026-04-03 13:54:14 +08:00
e1f7ea8f18 Update nginx.conf 2026-04-03 13:53:53 +08:00
7e4b603582 Update nginx.conf 2026-04-03 13:47:53 +08:00
f82eaee49e Update alpine.sh 2026-04-03 13:19:13 +08:00
e1fe3d959a update 2026-04-03 13:17:45 +08:00
86d3dd2c88 bash zstd 2026-04-03 13:13:59 +08:00
127e3ae325 openresty 2026-04-03 12:31:24 +08:00
16c8c3c873 Update nginx.conf 2026-04-03 12:30:09 +08:00
58fbd9c581 Update install.sh 2026-04-03 11:52:44 +08:00
91f75c60c6 Update install.sh 2026-04-03 11:52:02 +08:00
dee60a5a34 Update install.sh 2026-04-03 11:37:38 +08:00
013d53c346 Update install.sh 2026-04-03 11:33:11 +08:00
d42e28f713 Update site.py 2026-04-03 11:09:37 +08:00
dc69407d76 Update push_notice_msg.py 2026-04-03 10:51:29 +08:00
ab228bb8d4 Update push_ad.py 2026-04-03 10:33:27 +08:00
772ba40108 Update site.py 2026-04-03 03:44:44 +08:00
f143e2ea49 Update site.py 2026-04-03 03:44:36 +08:00
dd32fc58eb Update site.py 2026-04-03 03:35:43 +08:00
30f499f3cd update 2026-04-03 03:22:17 +08:00
c7325645be Update install.sh 2026-04-03 03:16:53 +08:00
dfca75f19a Update install.sh 2026-04-03 03:16:07 +08:00
70005b3b82 Update install.sh 2026-04-03 03:14:47 +08:00
e51e2dfe27 Update install.sh 2026-04-03 03:12:58 +08:00
57ddcb47f2 update 2026-04-03 03:09:19 +08:00
0ec2764369 update 2026-04-03 02:59:24 +08:00
2215a7895e update 2026-04-03 02:57:18 +08:00
bac86bd8e0 Update install.sh 2026-04-03 02:55:55 +08:00
3f9540a415 Update site.py 2026-04-03 02:38:07 +08:00
e5be78e832 Update site.py 2026-04-03 02:37:52 +08:00
8a03d1c704 Update site.py 2026-04-03 02:36:55 +08:00
1655fd33eb Update site.py 2026-04-03 02:36:23 +08:00
af93e5d00e Update site.py 2026-04-03 02:35:43 +08:00
f2f1f1c879 Update site.py 2026-04-03 02:23:45 +08:00
fd7179c3f5 Update site.py 2026-04-03 02:21:16 +08:00
bbf4200b42 Update site.py 2026-04-03 02:20:25 +08:00
e50877ba5d Update site.py 2026-04-03 02:20:15 +08:00
61cf4eb964 Update site.py 2026-04-03 02:20:05 +08:00
87ca7fdc8d Update site.py 2026-04-03 02:17:27 +08:00
7745bbe60c Update site.py 2026-04-03 02:01:47 +08:00
949ebf83e3 Update site.py 2026-04-03 02:01:13 +08:00
6744282bf1 Update site.py 2026-04-03 01:58:18 +08:00
5b374b0410 Update site.py 2026-04-03 01:56:58 +08:00
efaa97b9bd Update site.py 2026-04-03 01:50:13 +08:00
87c5dd5fa7 Update site.py 2026-04-03 01:48:15 +08:00
023a5b75b4 Update site.py 2026-04-03 01:46:54 +08:00
7e6a5de0f1 Update site.py 2026-04-03 01:43:21 +08:00
348500a288 Update site.py 2026-04-03 01:42:42 +08:00
27be26d12d Update site.py 2026-04-03 01:39:09 +08:00
4932eab08a Update site.py 2026-04-03 01:34:08 +08:00
341e2ed7ff Update site.py 2026-04-03 01:28:38 +08:00
7af6dac964 Update site.py 2026-04-03 01:19:43 +08:00
f94d23723c Update site.py 2026-04-03 01:14:40 +08:00
170005fb79 Update site.py 2026-04-03 01:07:59 +08:00
5ebe3fd95c Update site.py 2026-04-03 01:06:01 +08:00
d49d2247c9 Update site.py 2026-04-03 01:04:27 +08:00
593c90f605 Update site.py 2026-04-03 01:02:40 +08:00
fa41140aed Update site.py 2026-04-03 01:01:33 +08:00
e246509ebf Update site.py 2026-04-03 00:59:29 +08:00
81db94ac8a Update site.py 2026-04-03 00:58:19 +08:00
de29c766b3 Update site.py 2026-04-03 00:45:37 +08:00
3e96586c8e Update site.py 2026-04-03 00:39:50 +08:00
7eac6cadb0 Update nginx.conf 2026-04-03 00:33:25 +08:00
414ba32541 Update nginx.conf 2026-04-03 00:33:11 +08:00
8d4db5b574 Update site.py 2026-04-03 00:33:01 +08:00
422b904e00 Update site.py 2026-04-03 00:32:41 +08:00
5ce627ee0b Update site.py 2026-04-03 00:32:03 +08:00
3ddb6f9abc Update site.py 2026-04-03 00:31:53 +08:00
583f2a17b5 Update site.py 2026-04-03 00:31:33 +08:00
e628f1f6d5 update 2026-04-03 00:29:12 +08:00
89f21867a5 Update nginx.conf 2026-04-03 00:13:41 +08:00
4dd557feee Update nginx.conf 2026-04-03 00:12:18 +08:00
cc315db34b Update nginx.conf 2026-04-03 00:10:35 +08:00
086692e668 Update nginx.conf 2026-04-03 00:05:59 +08:00
e7528205f6 Update nginx.conf 2026-04-03 00:05:27 +08:00
af735e196e Update site.py 2026-04-02 23:37:24 +08:00
7dd59c3346 Update install.sh 2026-04-02 20:29:06 +08:00
1c6ade5b77 Update install.sh 2026-04-02 20:26:25 +08:00
f714da7662 Update install.sh 2026-04-02 11:25:02 +08:00
907ae1db04 update 2026-04-02 11:16:32 +08:00
691dd4a7bd Update install.sh 2026-04-02 11:12:33 +08:00
b1f531446a Update install.sh 2026-04-02 11:02:47 +08:00
c5aeaf1452 update 2026-04-02 10:48:59 +08:00
c27914c957 Update install.sh 2026-04-02 10:48:35 +08:00
6424e1e416 Update install.sh 2026-04-02 10:44:41 +08:00
0fc0e12c08 update 2026-04-02 10:39:45 +08:00
dfc3e79709 Update install.sh 2026-04-02 10:39:20 +08:00
f0b515ff5c Update install.sh 2026-04-02 10:38:53 +08:00
2f39e3277f Update install.sh 2026-04-02 10:38:25 +08:00
6576794456 Update install.sh 2026-04-02 10:34:20 +08:00
bdc8223c6c Update install.sh 2026-04-02 10:24:57 +08:00
d68cf3b557 Update install.sh 2026-04-02 10:22:40 +08:00
11787d290b Update install.sh 2026-04-02 10:16:00 +08:00
047a14dcbc up 2026-04-02 10:11:11 +08:00
f9d441a97f Update install.sh 2026-04-01 15:11:46 +08:00
Mr Chen
9cee124afd Merge pull request #864 from midoks/dev
openresty 加入br功能
2026-04-01 01:44:11 +08:00
43cf348b72 Update mw.py 2026-04-01 01:16:49 +08:00
86eb344492 Update mw.py 2026-04-01 00:56:32 +08:00
9030628090 Update mw.py 2026-04-01 00:52:26 +08:00
f6d39c7be3 Update install.sh 2026-04-01 00:46:49 +08:00
a9931b114e Update mw.py 2026-04-01 00:44:32 +08:00
87d9ce4486 Update install.sh 2026-04-01 00:32:21 +08:00
b61256221a Update install.sh 2026-04-01 00:24:09 +08:00
e9f43cb6f4 openresty 所有版本加入br的扩展 2026-04-01 00:17:53 +08:00
be79a9b4f9 Update install.sh 2026-04-01 00:13:38 +08:00
a3ff2fbefe Update install.sh 2026-04-01 00:12:31 +08:00
8d032cd867 Update nginx.conf 2026-04-01 00:05:10 +08:00
71392cd54f Update install.sh 2026-03-31 23:54:37 +08:00
92f14b1c12 Update install.sh 2026-03-31 23:41:37 +08:00
7e9674c7a7 Update install.sh 2026-03-31 23:41:06 +08:00
ccf0b070b0 Update install.sh 2026-03-31 23:17:08 +08:00
a9536cccd1 Update install.sh 2026-03-31 23:15:28 +08:00
5f26bdcefb Update install.sh 2026-03-31 23:13:55 +08:00
015c901047 Update install.sh 2026-03-31 23:08:23 +08:00
201ac15aea Update install.sh 2026-03-31 23:01:40 +08:00
04725db699 Update install.sh 2026-03-31 22:50:08 +08:00
9b72c785b5 Update install.sh 2026-03-31 22:49:46 +08:00
ca20d585da Update install.sh 2026-03-31 22:27:58 +08:00
48bcb80dd7 Update install.sh 2026-03-31 22:25:26 +08:00
e4bf1f0d53 Update install.sh 2026-03-31 22:18:23 +08:00
769764ad17 Update install.sh 2026-03-31 20:49:26 +08:00
Mr Chen
cbf732d072 Merge pull request #863 from midoks/dev
opcache优化
2026-03-21 23:50:54 +08:00
9a60ded31c Update opcache.sh 2026-03-21 23:47:55 +08:00
f7fa4a6dc5 Update opcache.sh 2026-03-21 23:41:33 +08:00
Mr Chen
d2f653decb Merge pull request #862 from midoks/dev
Update r3.6.txt
2026-03-21 15:04:06 +08:00
7471265010 Update r3.6.txt 2026-03-21 15:00:26 +08:00
Mr Chen
60e5dc0e57 Merge pull request #861 from midoks/dev
AI插件+swoole优化
2026-03-21 14:58:31 +08:00
9aacf8ca41 update 2026-03-21 14:52:16 +08:00
b91b4cd5b2 Update swoole.sh 2026-03-21 14:50:13 +08:00
e5843a4f40 Merge branch 'master' into dev 2026-03-21 11:17:28 +08:00
97259b5a14 Update phplib.conf 2026-03-21 11:17:17 +08:00
e0e56faa5d Update swoole.sh 2026-03-18 15:26:47 +08:00
f837fb31fc Update push_notice_msg.py 2026-03-17 18:41:35 +08:00
d1eef0a8c5 update 2026-03-17 18:15:40 +08:00
4a657451ed update 2026-03-17 18:08:50 +08:00
Mr Chen
68a5af4bef Merge pull request #859 from ccbkkb/master 2026-03-16 08:35:12 +08:00
ccbkkb
d0018d4de8 Update mw.py 2026-03-15 23:20:27 +08:00
ccbkkb
38dd92754a Fix: 修复安装时公网IP获取失败的问题(使用cloudflare接口替换v6r.ipip.net接口)
v6r.ipip.net return 502
2026-03-15 23:18:03 +08:00
1f2d68ffd2 Update ollama.js 2026-03-12 16:31:31 +08:00
f18d0c998f Update install.sh 2026-03-12 16:26:06 +08:00
374e2e6b91 Update install.sh 2026-03-12 16:23:42 +08:00
b2e439c94e Update install.sh 2026-03-12 16:21:57 +08:00
875d616cbf Update install.sh 2026-03-12 16:21:07 +08:00
837e229d11 Update ollama.js 2026-03-12 16:19:04 +08:00
8fd038cd11 Update install.sh 2026-03-12 16:18:42 +08:00
ca8b44dd8d update 2026-03-12 16:16:07 +08:00
e8f767a56b Update index.py 2026-03-12 16:07:46 +08:00
b531c48083 update 2026-03-12 16:00:51 +08:00
bbab1c13a2 Update info.json 2026-03-12 13:04:27 +08:00
4334b48ab1 Update info.json 2026-03-07 17:50:30 +08:00
ab1ca7af80 Update install.sh 2026-03-03 15:09:01 +08:00
ac54b65c87 update 2026-03-03 15:08:45 +08:00
35db1ff6b2 Update init_cron.py 2026-02-25 12:35:44 +08:00
Mr Chen
126bdcca73 Merge pull request #858 from midoks/dev
简单ui优化
2026-02-23 01:31:19 +08:00
5cfcb71759 up 2026-02-23 01:21:44 +08:00
e6a54b08f1 Update info.json 2026-02-13 13:29:48 +08:00
Mr Chen
434ac7b577 Merge pull request #857 from midoks/dev
常规更新
2026-02-05 11:58:03 +08:00
7e3b3fae1c Update install.sh 2026-02-05 11:57:00 +08:00
4c52629ba7 update 2026-02-05 10:37:31 +08:00
135b9b6e09 Update php.js 2026-02-05 10:32:43 +08:00
1647065b04 Update php.js 2026-02-05 10:30:01 +08:00
bf6b39707a Update php.js 2026-02-05 10:29:39 +08:00
4a4450260f Update php.js 2026-02-05 10:26:28 +08:00
Mr Chen
4701234c94 Merge pull request #856 from midoks/dev
可迁移ssh终端配置
2026-02-01 18:15:42 +08:00
8c4c4a25cb Update index.py 2026-02-01 17:43:09 +08:00
7be14d2d8c Update index.py 2026-02-01 17:40:58 +08:00
d8b387fbad Update index.py 2026-02-01 17:38:32 +08:00
6087377e8e Update index.py 2026-02-01 17:37:25 +08:00
e5797ef6a8 Update index.py 2026-02-01 17:37:09 +08:00
6817cafbfa update 2026-02-01 14:08:19 +08:00
bcdfeb03a8 Update index.py 2026-02-01 13:56:28 +08:00
Mr Chen
8854328697 Merge pull request #855 from midoks/dev
快捷连接ssh
2026-02-01 03:49:25 +08:00
0d83b2a59f Update cmd.md 2026-02-01 03:48:43 +08:00
691b4b5e59 Update mw.tpl 2026-02-01 03:47:15 +08:00
c4bffbda11 Update mw.tpl 2026-02-01 03:45:08 +08:00
ef7da60ec0 Update mw.tpl 2026-02-01 03:40:41 +08:00
95275c1b39 Update mw.tpl 2026-02-01 03:39:53 +08:00
944714e4ba update 2026-02-01 03:34:07 +08:00
aa7962c959 update 2026-02-01 03:07:48 +08:00
97c13d5f44 Update panel_tools.py 2026-01-31 17:56:36 +08:00
004faffc4c Update mw.tpl 2026-01-31 17:55:07 +08:00
eeef2abaf3 update 2026-01-31 17:54:34 +08:00
3a70c388cc update 2026-01-31 17:41:18 +08:00
Mr Chen
b81044106e Merge pull request #853 from midoks/dev
常规更新
2026-01-24 20:56:24 +08:00
a5230d1da4 Update swoole.sh 2026-01-24 20:38:53 +08:00
c1223aaee4 Update swoole.sh 2026-01-24 20:38:37 +08:00
7175315abc Update swoole.sh 2026-01-24 20:37:47 +08:00
00f4a722e1 Merge branch 'master' into dev 2026-01-24 20:35:53 +08:00
664d847a71 Update swoole.sh 2026-01-24 20:35:28 +08:00
21dedb7748 Update swoole.sh 2026-01-24 20:34:14 +08:00
88a0c5dc57 update 2026-01-24 20:29:30 +08:00
4677c39b97 Update phplib.conf 2026-01-24 20:28:17 +08:00
00b145d673 Update lib.sh 2026-01-24 20:27:43 +08:00
f04fff354a Update lib.sh 2026-01-24 20:27:18 +08:00
ca4264b838 Update brotli.sh 2026-01-24 20:22:21 +08:00
0e4047c36f Update phplib.conf 2026-01-24 20:16:38 +08:00
1f3bb11a5d Merge branch 'master' into dev 2026-01-20 12:13:15 +08:00
Mr Chen
f7a103ff89 Merge pull request #852 from midoks/dev
常规优化
2026-01-20 12:13:08 +08:00
555c326b0c Update lib.sh 2026-01-20 12:12:27 +08:00
4f74a770af Update lib.sh 2026-01-20 12:03:31 +08:00
b26b14a0f2 Update lib.sh 2026-01-20 11:55:14 +08:00
Mr Chen
7d0e8c96ee Merge pull request #851 from midoks/dev
Update my9.3.cnf
2026-01-15 18:41:15 +08:00
a14439f128 Update my9.3.cnf 2026-01-15 18:40:38 +08:00
Mr Chen
4de8aba54a Merge pull request #850 from midoks/dev
常规更新
2026-01-15 14:49:19 +08:00
3814dda46e Update ubuntu.sh 2026-01-15 14:45:39 +08:00
923716dd08 Update debian.sh 2026-01-15 14:33:16 +08:00
fa0f86c8a0 Update debian.sh 2026-01-15 14:31:53 +08:00
efb8d29f78 Update debian.sh 2026-01-15 14:30:10 +08:00
22c71009df Update debian.sh 2026-01-15 14:29:10 +08:00
4e48bae0ad Update debian.sh 2026-01-15 13:46:14 +08:00
Mr Chen
ce55c5c011 Merge pull request #849 from midoks/dev
常规更新
2026-01-14 22:01:16 +08:00
7daf02e94c Update index.py 2026-01-14 21:59:05 +08:00
e4fdf60b8a Update index.py 2026-01-14 21:56:59 +08:00
b9ae73d865 Update index.py 2026-01-14 21:47:59 +08:00
Mr Chen
e9583db6a7 Merge pull request #848 from midoks/dev
Update my9.3.cnf
2026-01-14 21:43:48 +08:00
89eda3c702 Update my9.3.cnf 2026-01-14 21:38:03 +08:00
Mr Chen
245e0e038b Merge pull request #847 from midoks/dev
版本更新
2026-01-14 21:22:30 +08:00
010579aa1b Create mysql9.3.service.tpl 2026-01-14 21:17:13 +08:00
24e8337b41 update 2026-01-14 21:10:58 +08:00
d5f6224236 update 2026-01-14 13:13:42 +08:00
9ec8fe921d Update push_notice_msg.py 2026-01-12 11:23:13 +08:00
6fd1d294e5 update 2025-12-21 14:53:26 +08:00
d48c7271c0 up 2025-12-21 14:26:27 +08:00
d155c675f2 up 2025-12-21 14:25:48 +08:00
3a56faf123 update 2025-12-21 10:56:35 +08:00
Mr Chen
bc74608271 Merge pull request #845 from midoks/dev
ca证书可选择
2025-12-20 21:02:18 +08:00
484a615981 Update ssl_acme.py 2025-12-20 20:56:40 +08:00
efe92ba356 Update site.py 2025-12-20 20:49:25 +08:00
25f4a815fd acme证书选择 2025-12-20 20:46:58 +08:00
74f774bc3b Update push_notice_msg.py 2025-12-19 15:42:20 +08:00
Mr Chen
e871beda8e Merge pull request #844 from midoks/dev
PHP85 openssl bug解决
2025-12-11 15:43:54 +08:00
ddc3011dd9 update 2025-12-11 14:46:13 +08:00
9bf9322994 Update redis.sh 2025-12-11 14:41:54 +08:00
325d1567a7 Update redis.sh 2025-12-11 14:41:26 +08:00
e3ed7fde45 update 2025-12-11 14:39:58 +08:00
e8810cc2a7 update 2025-12-11 14:30:16 +08:00
bf101519d8 Update install.sh 2025-12-11 12:48:10 +08:00
58e1302b75 Update install.sh 2025-12-10 20:35:15 +08:00
750a070fbb Update obf_proxy.conf 2025-12-09 18:16:12 +08:00
e8b3131d2e Update obf_proxy.conf 2025-12-09 18:15:58 +08:00
c00cc887e4 Delete obf.conf 2025-12-09 17:24:12 +08:00
6fb8a5bbe5 update 2025-12-09 17:24:09 +08:00
952fcc2a1e delete 2025-12-09 17:23:07 +08:00
d070592491 Update install.sh 2025-12-08 14:50:12 +08:00
4fe64ddcb1 update 2025-12-07 00:37:52 +08:00
a10f10aa61 Update obf.lua 2025-12-07 00:22:53 +08:00
db2ad358cf Update util.lua 2025-12-07 00:14:03 +08:00
124b19525f Update nginx.conf 2025-12-07 00:01:36 +08:00
a64b9e1ab2 Update nginx.conf 2025-12-06 23:59:07 +08:00
a936daf95b update 2025-12-06 23:45:53 +08:00
dba64f9ea7 Update obf.lua 2025-12-06 23:42:21 +08:00
2e6555a8cb Update tpl.lua 2025-12-06 23:41:32 +08:00
52003c2d58 Update obf.conf 2025-12-06 20:07:31 +08:00
da028d6665 update 2025-12-06 20:05:34 +08:00
01a7746ae9 Update obf.lua 2025-12-06 19:57:10 +08:00
827fe3578f update 2025-12-06 19:45:44 +08:00
d4cf1d9aca Update tpl.lua 2025-12-06 19:36:30 +08:00
c2a4be71c4 Create tpl_v5.lua 2025-12-06 19:35:32 +08:00
404fd0dfdd update 2025-12-06 17:14:40 +08:00
9ffd7c91b7 Update util.lua 2025-12-06 16:27:00 +08:00
fc20046aaf Update tpl.lua 2025-12-06 16:25:59 +08:00
934ccba81f update 2025-12-06 16:23:54 +08:00
4db502e0f1 up 2025-12-06 15:54:47 +08:00
dd9dbd8321 Create obf_v4.lua 2025-12-06 14:06:04 +08:00
47102edfef update 2025-12-06 14:04:12 +08:00
9b86a6ee33 Create obf_v3.lua 2025-12-06 13:58:31 +08:00
9cb4dbc79d Update obf.lua 2025-12-05 15:51:00 +08:00
4789e40574 up 2025-12-05 15:42:20 +08:00
39109ae40b Update obf.lua 2025-12-05 15:26:37 +08:00
b6ffe579e0 update 2025-12-05 15:11:40 +08:00
d2b94a9a0e Update obf.conf 2025-12-05 14:49:20 +08:00
809022b388 update 2025-12-05 14:30:44 +08:00
5c2c614a65 混淆配置 2025-12-05 05:48:48 +08:00
a0934d9aaf Update site.js 2025-12-05 04:49:40 +08:00
19ac2d9a0a Update obf.lua 2025-12-05 04:29:46 +08:00
ae5870556a update 2025-12-05 04:27:19 +08:00
87c42c810e Update index.py 2025-12-05 04:15:42 +08:00
d7d36b44b2 Update index.py 2025-12-05 04:13:51 +08:00
9bb44d3ae5 Update index.py 2025-12-05 04:13:29 +08:00
f216c03a7b Update index.py 2025-12-05 04:13:23 +08:00
d091fc48f6 Update index.py 2025-12-05 04:11:16 +08:00
0eeae3a7ff html混淆代码 2025-12-05 04:06:40 +08:00
22c26c97f7 Merge branch 'master' into dev 2025-12-04 16:46:48 +08:00
Mr Chen
86c6416090 Merge pull request #843 from clutter0584/clutter0584-patch-1
Update index.py
2025-12-04 16:46:12 +08:00
clutter0584
123c07efe0 Update index.py
修复supervisor多进程任务重启失败的bug
2025-12-01 10:34:07 +08:00
d64f01bc54 update 2025-11-30 19:20:05 +08:00
415d7988b9 Create t.md 2025-11-29 16:43:28 +08:00
f846a1ac83 Create doh.conf 2025-11-29 16:07:23 +08:00
e95269d539 Update install.sh 2025-11-29 15:52:51 +08:00
4161a3afc1 Update doh.service.tpl 2025-11-29 15:50:22 +08:00
f842ed7b3d Update doh.js 2025-11-29 15:40:36 +08:00
66c8bb7c78 update 2025-11-29 15:35:49 +08:00
cd499edd6c update 2025-11-29 15:34:38 +08:00
51d4e187b6 update 2025-11-29 15:24:12 +08:00
a75f648b71 Update index.py 2025-11-29 15:18:26 +08:00
66a253b4e9 Update index.py 2025-11-29 15:16:50 +08:00
076f8e0365 Update index.py 2025-11-29 15:16:44 +08:00
37c850cf6c Update index.py 2025-11-29 15:15:14 +08:00
dc93213811 Update index.py 2025-11-29 15:11:18 +08:00
56d8c6c236 Update index.py 2025-11-29 15:08:30 +08:00
0a0b114baf Update index.py 2025-11-29 15:07:51 +08:00
7c444b3c53 update 2025-11-29 14:57:11 +08:00
f4c72266ea update 2025-11-29 14:50:24 +08:00
f45e6c885e Update install.sh 2025-11-29 14:29:17 +08:00
c4646a7de6 Update install.sh 2025-11-29 14:27:52 +08:00
37be254f25 Update install.sh 2025-11-29 14:21:54 +08:00
21d6244c3c Update install.sh 2025-11-29 14:11:06 +08:00
d141e67f52 Update install.sh 2025-11-29 14:09:16 +08:00
d2c4a79791 Update install.sh 2025-11-29 14:06:22 +08:00
240058005f Update install.sh 2025-11-29 14:05:10 +08:00
6d31f3791b update 2025-11-29 13:59:51 +08:00
7fba05d0d5 Update .gitignore 2025-11-23 22:27:30 +08:00
Mr Chen
44ead9f469 Merge pull request #842 from midoks/dev
常规更新
2025-11-23 17:43:33 +08:00
7ef3971fe1 Update file.py 2025-11-23 17:41:30 +08:00
216a3d5d60 Update file.py 2025-11-23 12:03:38 +08:00
ffb6844a41 Update file.py 2025-11-23 12:02:37 +08:00
575723b860 update 2025-11-23 11:57:54 +08:00
50a000f1c7 Update files.js 2025-11-23 11:48:25 +08:00
476c73fed3 update 2025-11-22 23:56:35 +08:00
471e655eb3 Update install.sh 2025-11-22 18:33:50 +08:00
934a436065 Update install.sh 2025-11-22 18:27:57 +08:00
ba1508a82a Update info.json 2025-11-22 18:27:03 +08:00
0f67d14153 Update install.sh 2025-11-22 18:25:50 +08:00
832d8f44f1 update 2025-11-22 18:20:24 +08:00
33343e1b1c Update index.py 2025-11-22 18:15:34 +08:00
Mr Chen
28694cd2b7 Merge pull request #841 from midoks/dev
PHP8.5正式版
2025-11-22 13:37:01 +08:00
c65f66decc Update install.sh 2025-11-22 13:07:28 +08:00
73a4743e88 update 2025-11-22 13:05:22 +08:00
2bcbf6365e Update info.json 2025-11-13 12:07:28 +08:00
Mr Chen
43301108ba Merge pull request #838 from midoks/dev
ACME强制更新修改
2025-11-13 02:28:04 +08:00
7898d26461 Update init_cron.py 2025-11-13 02:26:40 +08:00
13b3158bd6 Update init_cron.py 2025-11-13 02:18:14 +08:00
f4f327f25d Update index.py 2025-11-13 01:30:04 +08:00
45ff09dadb Update index.py 2025-11-13 01:25:42 +08:00
Mr Chen
bec78bc44c Merge pull request #837 from midoks/dev
ad修改
2025-11-06 16:22:09 +08:00
16e35935f9 update 2025-11-06 16:11:22 +08:00
d6603488b6 Update valkey.conf 2025-11-06 15:56:39 +08:00
717c2d2ece Update redis.conf 2025-11-04 17:42:33 +08:00
Mr Chen
e704af5494 Merge pull request #836 from midoks/dev
暂时关闭面板检查
2025-11-03 18:22:16 +08:00
5399d26c94 Update __init__.py 2025-11-03 18:17:37 +08:00
a32e29a378 Update mw.py 2025-11-03 17:57:15 +08:00
a62c474f99 Create window.tpl 2025-11-01 00:21:15 +08:00
Mr Chen
c507bb0238 Merge pull request #833 from midoks/dev
简单优化
2025-10-23 17:08:45 +08:00
30902eeac8 Update crontab.py 2025-10-23 17:05:34 +08:00
9442d58f4c Update crontab.py 2025-10-23 17:00:08 +08:00
Mr Chen
55a14cfedc Merge pull request #832 from midoks/dev
mariadb 12.0 版本修正
2025-10-18 13:40:35 +08:00
3d0ea980c8 Update install.sh 2025-10-18 11:33:11 +08:00
c9f7696519 Update info.json 2025-10-17 13:01:22 +08:00
Mr Chen
623d435758 Merge pull request #830 from midoks/dev
面板自动更新-加入计划任务(可删除)
2025-10-14 18:37:45 +08:00
05f06f09d4 Update init_cron.py 2025-10-14 18:35:36 +08:00
e19402c80c Update init_cron.py 2025-10-14 18:33:59 +08:00
cb87c5ba71 Update __init__.py 2025-10-14 18:32:41 +08:00
657eca08bf Update init_cron.py 2025-10-14 18:32:17 +08:00
4c58c86f84 Update check.sh 2025-10-02 12:25:14 +08:00
9b73a057fa Update check.sh 2025-10-02 12:14:49 +08:00
3c9bf95728 Update check.sh 2025-10-02 12:14:16 +08:00
2f48af5afe Update check.sh 2025-10-02 12:12:34 +08:00
Mr Chen
f7f5ba15ff Merge pull request #829 from midoks/dev
php85版本配置
2025-10-01 22:47:54 +08:00
5fd014f023 Update index.py 2025-10-01 22:46:50 +08:00
Mr Chen
caf3f4a783 Merge pull request #828 from midoks/dev
修复pgadmin4安装
2025-09-26 17:04:12 +08:00
b264bf6f58 Update install.sh 2025-09-26 17:00:19 +08:00
06b07cf9a0 Update install.sh 2025-09-26 16:27:27 +08:00
e5804b22cd Update requirements.txt 2025-09-26 16:24:55 +08:00
Mr Chen
85f292e1d2 Merge pull request #826 from midoks/dev
mongodb维护功能及DNS配置更改推荐方式
2025-09-17 12:52:58 +08:00
057f05a88a Update check.sh 2025-09-17 12:49:30 +08:00
a700267ee6 Update mongodb.js 2025-09-17 12:47:44 +08:00
331e33ec70 update 2025-09-17 12:46:19 +08:00
c9dc118af6 mongodb维护功能 2025-09-17 12:44:37 +08:00
e1e24a3350 Update index.html 2025-09-17 12:38:14 +08:00
Mr Chen
339dfd1c0b Merge pull request #825 from ramondelee/patch-3
Update site.py
2025-09-17 02:26:22 +08:00
Mr Chen
5bcc81c00a Merge branch 'dev' into patch-3 2025-09-17 02:26:08 +08:00
e7212ed506 Update site.py 2025-09-17 02:22:17 +08:00
ramondelee
c705c282d1 Update site.py
按ACME官方推荐配置更新huaweicloud和cloudflare的DNS-API配置,cloudflare更改为账户ID和可配置权限token。
2025-09-16 22:23:49 +08:00
Mr Chen
20ea1f8209 Merge pull request #821 from midoks/dev
openresty 添加检查任务功能
2025-09-16 01:25:15 +08:00
fa73171d7d openresty 检查重启任务 2025-09-16 01:21:17 +08:00
a27675a783 Update tool_cron.py 2025-09-16 00:26:11 +08:00
2ddae1f0b9 Update tool_task.py 2025-09-16 00:18:07 +08:00
415acc7780 Update site.py 2025-09-14 22:01:30 +08:00
Mr Chen
7590cf824f Merge pull request #819 from midoks/dev
兼容及优化
2025-09-14 16:29:20 +08:00
3ee88ddfb4 Update install.sh 2025-09-14 16:01:47 +08:00
4d5f90e0ec Update install.sh 2025-09-14 15:51:47 +08:00
694a65e9de Update install.sh 2025-09-14 15:51:19 +08:00
7e33103758 update 2025-09-14 15:49:37 +08:00
e04f26223e Update file.py 2025-09-14 15:40:45 +08:00
cd76b72d3c Update file.py 2025-09-14 15:39:05 +08:00
57372fe922 Update file.py 2025-09-14 15:34:09 +08:00
82ca7fdcdc Update file.py 2025-09-14 15:18:21 +08:00
c6d9fb89ba Update file.py 2025-09-14 15:16:05 +08:00
2ecd88586b Update file.py 2025-09-14 15:10:55 +08:00
d8779bed14 Update files.js 2025-09-14 15:06:37 +08:00
7ad988bceb Update file.py 2025-09-14 15:04:26 +08:00
04fc897a60 Update file.py 2025-09-14 15:03:04 +08:00
7922ba15ce Update file.py 2025-09-14 15:02:43 +08:00
fae27f7e19 Update file.py 2025-09-14 15:01:57 +08:00
7ba2f29efc Update file.py 2025-09-14 15:01:13 +08:00
0e8439d52b Update file.py 2025-09-14 15:01:04 +08:00
17c60b6b4e Update file.py 2025-09-14 14:52:09 +08:00
4ec54b2dbc Update file.py 2025-09-14 14:49:52 +08:00
409b1fa00d Update file.py 2025-09-14 14:49:02 +08:00
ad5fc52d66 Update file.py 2025-09-14 14:46:45 +08:00
4b4d21a0de Update files.js 2025-09-14 14:42:07 +08:00
3642a3fec5 Update files.js 2025-09-14 14:37:40 +08:00
cac097ea66 Update www.conf 2025-09-14 14:25:14 +08:00
4a2b0d9d9f Update index.py 2025-09-14 14:24:24 +08:00
Mr Chen
6e53e7a23b Merge pull request #818 from midoks/dev
兼容细节优化
2025-09-12 14:27:52 +08:00
1e1e86dc16 Update rhel.sh 2025-09-12 14:09:13 +08:00
e7777877fa update 2025-09-12 14:00:27 +08:00
3a685eb316 Update install_generic.sh 2025-09-11 20:16:19 +08:00
344509ec28 up 2025-09-11 20:14:01 +08:00
b70a2951bd Update info.json 2025-09-11 20:08:52 +08:00
63282f42b2 Create install.sh 2025-09-11 20:08:30 +08:00
Mr Chen
03786817ed Merge pull request #817 from midoks/dev
兼容debain13
2025-09-11 18:21:24 +08:00
680bffa9e8 Update crontab.py 2025-09-11 18:10:11 +08:00
6f07ec52ad Update crontab.py 2025-09-11 18:09:59 +08:00
daecb76f8e Update crontab.py 2025-09-11 18:00:01 +08:00
7f653d900d Update crontab.py 2025-09-11 17:27:46 +08:00
4cd3e682b9 Update crontab.py 2025-09-11 17:27:37 +08:00
143cceeade Update crontab.py 2025-09-11 17:26:12 +08:00
fb8ca67ac1 Update crontab.py 2025-09-11 17:25:36 +08:00
80fc1c4112 Update tool_cron.py 2025-09-11 17:23:48 +08:00
eecdeb0af4 update 2025-09-11 17:22:58 +08:00
5e9e11694d Update crontab.py 2025-09-11 17:11:14 +08:00
bb41f89d44 update 2025-09-11 17:10:08 +08:00
4158f25b35 Update crontab.py 2025-09-11 17:06:51 +08:00
3694cd0694 Update mw.py 2025-09-11 16:52:47 +08:00
a5a06fbaab Update mw.py 2025-09-11 16:49:01 +08:00
a5ee38d4fd Update mw.py 2025-09-11 16:45:30 +08:00
eca95c36dd Update mw.py 2025-09-11 16:41:09 +08:00
554b4047b9 update 2025-09-11 16:38:30 +08:00
b1e8b4eb11 Update mw.py 2025-09-11 16:36:23 +08:00
b3f693556c Update mw.py 2025-09-11 16:36:05 +08:00
e2fd50d152 Update mw.py 2025-09-11 16:31:43 +08:00
f1cb9a824d Update install.sh 2025-09-11 16:07:00 +08:00
da0e718276 up 2025-09-11 15:07:55 +08:00
4519a4175b Update install.sh 2025-09-11 15:03:17 +08:00
4fa375f4f4 Update install.sh 2025-09-11 15:02:42 +08:00
3ca5fdb082 Update openssl.sh 2025-09-11 15:00:41 +08:00
32ae726050 update 2025-09-11 15:00:28 +08:00
83950cbecb Update install.sh 2025-09-11 14:59:08 +08:00
5b9f63bc91 Update install.sh 2025-09-11 14:57:48 +08:00
7b93072093 Update install.sh 2025-09-11 14:56:08 +08:00
90c312ea5c Update install.sh 2025-09-11 14:54:54 +08:00
2bec38d85f Update install.sh 2025-09-11 14:52:49 +08:00
b8ab1780d3 Update install.sh 2025-09-11 14:51:57 +08:00
997ad34151 Update install.sh 2025-09-11 14:50:06 +08:00
e960d4f00b update 2025-09-11 14:40:36 +08:00
52fe9e2c13 Update openssl_30.sh 2025-09-11 14:35:43 +08:00
e6b386dabf Update mw.py 2025-09-11 12:38:47 +08:00
f558095a0e Update index.py 2025-09-10 23:52:55 +08:00
014a604c86 Update index.py 2025-09-10 23:49:47 +08:00
5e7f2f0d5a Update index.py 2025-09-10 23:49:33 +08:00
11b52cb212 Update install.sh 2025-09-10 23:28:01 +08:00
aa7abab742 Update install.sh 2025-09-10 23:20:08 +08:00
f5ce6e47e2 Update install.sh 2025-09-10 23:06:29 +08:00
05258e6fce Update install.sh 2025-09-10 23:05:02 +08:00
7675ead837 Update install.sh 2025-09-10 23:04:36 +08:00
6e80a19933 Update install.sh 2025-09-10 23:04:15 +08:00
3a6cf05647 Update install.sh 2025-09-10 23:01:21 +08:00
147cd32129 Update crontab.py 2025-09-10 22:54:23 +08:00
9789117759 Update install.sh 2025-09-10 22:31:31 +08:00
aeee5658d3 Update install.sh 2025-09-10 22:29:00 +08:00
949ac2de98 Update install.sh 2025-09-10 22:17:25 +08:00
5b4333dacf Update install.sh 2025-09-10 22:16:46 +08:00
561cd7111e Update install.sh 2025-09-10 22:14:21 +08:00
784ee84fb3 Update install.sh 2025-09-10 22:12:20 +08:00
b0cf548775 Update install.sh 2025-09-10 22:08:35 +08:00
Mr Chen
55c315eb98 Merge pull request #815 from midoks/dev
禁止root登陆 功能添加
2025-09-10 22:05:00 +08:00
9bcb41ab5d Update firewall.py 2025-09-10 22:02:57 +08:00
007b1bd21b Update firewall.py 2025-09-10 22:02:50 +08:00
9dae7988fd Update firewall.py 2025-09-10 22:00:51 +08:00
8877d7ea55 Update firewall.py 2025-09-10 21:58:08 +08:00
f35a23a53d Update firewall.py 2025-09-10 21:56:10 +08:00
64484ef18b Update firewall.py 2025-09-10 21:53:39 +08:00
0d9381b528 Update firewall.py 2025-09-10 21:52:12 +08:00
d57465d067 Update firewall.py 2025-09-10 21:50:33 +08:00
5039dac045 Update firewall.py 2025-09-10 21:45:43 +08:00
6073357bb6 Update firewall.js 2025-09-10 21:44:15 +08:00
a00343d444 Update firewall.py 2025-09-10 21:38:57 +08:00
a0b4681369 Update firewall.py 2025-09-10 21:38:04 +08:00
ea340f3fc2 Update firewall.py 2025-09-10 21:36:52 +08:00
db39483f97 Update firewall.py 2025-09-10 21:36:05 +08:00
e575511849 Update firewall.js 2025-09-10 21:33:36 +08:00
9dc3030c18 Update firewall.js 2025-09-10 21:30:21 +08:00
f990d7584e Update firewall.js 2025-09-10 21:29:39 +08:00
133d560e64 update 2025-09-10 21:29:03 +08:00
b3ba764d89 update 2025-09-10 21:25:41 +08:00
Mr Chen
3ff1124c30 Merge pull request #814 from midoks/dev
回收站-永久删除修复
2025-09-07 12:04:43 +08:00
da927c8f7b Update file.py 2025-09-07 12:04:13 +08:00
cb211d8ba1 回收站-永久删除修复 2025-09-07 12:02:37 +08:00
Mr Chen
9cbebbdd6a Merge pull request #813 from midoks/dev
Update crontab.py
2025-09-03 22:27:33 +08:00
8684e21da3 Update crontab.py 2025-09-03 22:24:46 +08:00
Mr Chen
3f9a90f758 Merge pull request #812 from ramondelee/patch-2
Update crontab.py
2025-09-03 22:22:19 +08:00
ramondelee
661a58b549 Update crontab.py
修复计划任务停止后重新启用不生效问题。
2025-09-03 22:09:31 +08:00
Mr Chen
a47b049dfd Merge pull request #810 from midoks/dev
Update config.json
2025-08-30 14:19:59 +08:00
58b2918ea4 Update config.json 2025-08-30 14:19:18 +08:00
Mr Chen
484b4cb280 Merge pull request #809 from midoks/dev
Update tool_migrate.py
2025-08-30 01:00:24 +08:00
a77d512bac Update tool_migrate.py 2025-08-30 00:58:57 +08:00
Mr Chen
e295354aa1 Merge pull request #808 from midoks/dev
网站统计优化
2025-08-23 01:04:03 +08:00
7aeae1e998 Update webstats_common.lua 2025-08-23 00:53:58 +08:00
9b98afd6cf Update webstats_common.lua 2025-08-23 00:53:47 +08:00
bad97971db Update webstats_common.lua 2025-08-23 00:50:28 +08:00
6f8c122503 Update webstats_common.lua 2025-08-23 00:44:21 +08:00
8b25aecb3a Update webstats_common.lua 2025-08-23 00:40:08 +08:00
400846cab4 Update webstats_common.lua 2025-08-23 00:39:52 +08:00
72708bdef0 Update index.py 2025-08-23 00:36:48 +08:00
Mr Chen
23d817d1f3 Merge pull request #807 from midoks/dev
OP防火墙修复
2025-08-22 21:38:45 +08:00
daf4086bc9 Update tool_task.py 2025-08-22 20:03:36 +08:00
ab2e9ca43e Update tool_task.py 2025-08-22 20:02:06 +08:00
222d69218a Update tool_task.py 2025-08-22 20:00:15 +08:00
ae03da927e Update init.sql 2025-08-22 19:54:49 +08:00
9cb311a6c9 Update install.sh 2025-08-22 19:07:41 +08:00
dfd665088e update 2025-08-22 18:58:01 +08:00
51afd70fff Update install.sh 2025-08-22 18:48:19 +08:00
203abc1ff9 Update files.js 2025-08-22 18:09:19 +08:00
a0487671d2 Update tool_task.py 2025-08-22 17:24:27 +08:00
88e605fc5a Update tool_task.py 2025-08-22 17:24:07 +08:00
130c390916 Update install.sh 2025-08-22 17:19:05 +08:00
93389633ba Update tool_task.py 2025-08-22 17:15:55 +08:00
53897cf779 update 2025-08-22 17:15:32 +08:00
9192ac2c81 Update tool_task.py 2025-08-22 17:14:27 +08:00
d54b8ab756 Update install.sh 2025-08-22 17:06:43 +08:00
67210ce23b Update tool_task.py 2025-08-22 17:05:01 +08:00
a89f27abb9 Update install.sh 2025-08-22 17:02:20 +08:00
37eccd8a58 Update tool_task.py 2025-08-22 17:00:16 +08:00
452fd810ac Update tool_task.py 2025-08-22 16:35:15 +08:00
Mr Chen
cd91a79578 Merge pull request #806 from midoks/dev
修复批量压缩
2025-08-22 14:17:18 +08:00
4c70fb9cfa update 2025-08-22 14:16:09 +08:00
62dcd672fe Update stats.js 2025-08-21 17:03:01 +08:00
fde40577ee Update stats.js 2025-08-21 17:02:44 +08:00
Mr Chen
963633328c Merge pull request #805 from midoks/dev
网站统计/修复下载文件
2025-08-21 16:55:51 +08:00
bddf214f91 Update install.sh 2025-08-21 16:54:51 +08:00
c7ef2eeec7 Update install.sh 2025-08-21 16:10:30 +08:00
Mr Chen
8b988a3f02 Merge pull request #804 from midoks/dev
网站统计/索引优化
2025-08-21 15:41:32 +08:00
792337ed73 update 2025-08-21 15:27:58 +08:00
d1e5f9d0a4 update 2025-08-21 15:04:39 +08:00
d202746829 Update index.py 2025-08-21 14:53:18 +08:00
72724c6014 Update db.py 2025-08-21 14:38:50 +08:00
8cdbe8a491 Update index.py 2025-08-20 12:56:50 +08:00
Mr Chen
4617161f3d Merge pull request #803 from midoks/dev
0.18.4
2025-08-19 19:48:15 +08:00
ffed4f56bf 0.18.4 2025-08-19 19:47:20 +08:00
Mr Chen
19f9390020 Merge pull request #802 from midoks/dev
Update install_dev.sh
2025-08-19 19:17:58 +08:00
10a4401259 Update install_dev.sh 2025-08-19 19:17:21 +08:00
Mr Chen
ed7ab76cd6 Merge pull request #801 from midoks/dev
update
2025-08-19 19:13:59 +08:00
ccfe1bac74 update 2025-08-19 19:13:36 +08:00
Mr Chen
0c2071bc5d Merge pull request #800 from midoks/dev
修正acme安装
2025-08-19 19:11:14 +08:00
2d503ab05a Update install.sh 2025-08-19 19:10:12 +08:00
0f204b48dd Update README.md 2025-08-19 13:59:58 +08:00
ac586267c5 update 2025-08-19 01:03:40 +08:00
897619f126 Update install.sh 2025-08-19 00:57:06 +08:00
5fef08797d Update info.json 2025-08-19 00:56:31 +08:00
b43c3a7294 Update info.json 2025-08-19 00:55:28 +08:00
423b145b7f Update install.sh 2025-08-19 00:54:47 +08:00
Mr Chen
93333a4915 Merge pull request #799 from midoks/dev
Update site.html
2025-08-19 00:28:04 +08:00
b3708abcb6 Update site.html 2025-08-19 00:27:38 +08:00
Mr Chen
f8c2580773 Merge pull request #798 from midoks/dev
站点搜索,排序优化
2025-08-19 00:22:40 +08:00
4609d5588d 站点排序优化 2025-08-19 00:21:52 +08:00
cbeb44779f Update public.js 2025-08-19 00:10:45 +08:00
7c848aa372 Update sites.py 2025-08-19 00:10:40 +08:00
015fca8145 update 2025-08-19 00:02:33 +08:00
54cc5fbad5 Update sites.py 2025-08-18 23:41:06 +08:00
66f66dd408 Update install.sh 2025-08-18 23:34:08 +08:00
Mr Chen
24de9d5988 Merge pull request #797 from midoks/dev
为国内安装优化发一个版本号
2025-08-18 23:26:38 +08:00
7dc5fdc88e 为国内安装优化发一个版本号
可以选择代理
2025-08-18 23:26:07 +08:00
Mr Chen
2f912b4ddd Merge pull request #796 from midoks/dev
update
2025-08-18 22:41:37 +08:00
0931cb9f9c update 2025-08-18 22:41:08 +08:00
bc98a80de6 Update mw.tpl 2025-08-18 22:40:32 +08:00
9e3ad237b5 Update mw.tpl 2025-08-18 22:07:38 +08:00
Mr Chen
40a6ce7aa7 Merge pull request #795 from midoks/dev
国内安装支持多个代理选择
2025-08-18 21:59:21 +08:00
85bedbf56b update 2025-08-18 21:48:27 +08:00
5575710d7e Update update_dev.sh 2025-08-18 21:25:31 +08:00
df442f7fff update 2025-08-18 21:24:45 +08:00
89e665b369 Update mw.tpl 2025-08-18 21:22:43 +08:00
42f845a7e2 Update mw.tpl 2025-08-18 21:21:17 +08:00
a226bc9fbb update 2025-08-18 21:10:20 +08:00
b2f9935abb Update mw.tpl 2025-08-18 20:57:56 +08:00
d8a22ba5ee update 2025-08-18 20:36:17 +08:00
be09821778 Update mw.tpl 2025-08-18 20:35:33 +08:00
4f0f440f2c update 2025-08-18 20:26:06 +08:00
9cd46a7f9f Update update_dev.sh 2025-08-18 20:22:49 +08:00
66c875584f Update update_dev.sh 2025-08-18 20:13:35 +08:00
f14d2fddc7 Update mw.tpl 2025-08-18 20:10:19 +08:00
fa2dda6ee4 Update README.md 2025-08-18 20:08:43 +08:00
73c8117a67 Update README.md 2025-08-18 20:07:31 +08:00
5f42e94da7 Update README.md 2025-08-18 20:05:56 +08:00
c31a95dd4b Update README.md 2025-08-18 20:03:30 +08:00
19ec0ddcb9 Update mw.tpl 2025-08-18 20:00:41 +08:00
5e24086476 Delete t.sh 2025-08-18 19:58:04 +08:00
72934000b0 Update mw.tpl 2025-08-18 19:56:48 +08:00
8a240e2c9c Update mw.tpl 2025-08-18 19:55:45 +08:00
9f081359b0 Update mw.tpl 2025-08-18 19:54:17 +08:00
679a1f0d05 Update mw.tpl 2025-08-18 19:53:43 +08:00
4533e87bef Update mw.tpl 2025-08-18 19:50:29 +08:00
47a60b41a8 up 2025-08-18 19:30:17 +08:00
b06100d0dc Update README.md 2025-08-18 19:07:07 +08:00
e5591cc59e Update install_dev.sh 2025-08-18 18:08:17 +08:00
9831216ca4 Update install_dev.sh 2025-08-18 18:03:43 +08:00
57e36c5fdb Update mw.tpl 2025-08-18 17:45:02 +08:00
35904bd79d Update install_dev.sh 2025-08-18 17:41:12 +08:00
f16a2a7fec update 2025-08-18 17:37:33 +08:00
0b4b8a62aa Update install_dev.sh 2025-08-18 17:16:29 +08:00
ca4fa30cdb Update install_dev.sh 2025-08-18 17:11:40 +08:00
90c024dfe5 Update install_dev.sh 2025-08-18 17:05:35 +08:00
e634c44797 Update install_dev.sh 2025-08-18 17:04:58 +08:00
8eea4072f6 Update install_dev.sh 2025-08-18 17:03:19 +08:00
a0886e1a3d Update install_dev.sh 2025-08-18 17:01:11 +08:00
b93d77c907 Update install_dev.sh 2025-08-18 16:35:00 +08:00
a148e27211 Update install_dev.sh 2025-08-18 16:33:57 +08:00
3cd9b52d2a Update install_dev.sh 2025-08-18 16:30:13 +08:00
37206916e4 Update install_dev.sh 2025-08-18 16:29:49 +08:00
d36d2fa4b4 Update install_dev.sh 2025-08-18 16:29:07 +08:00
4591c9006b Update install_dev.sh 2025-08-18 16:28:23 +08:00
5b4ceb49df Update install_dev.sh 2025-08-18 16:27:54 +08:00
ba937c1e77 update 2025-08-18 16:25:54 +08:00
2b77254322 Update install_dev.sh 2025-08-18 16:22:57 +08:00
b27cb78f62 Update install_dev.sh 2025-08-18 16:21:26 +08:00
106af5b177 Update install_dev.sh 2025-08-18 16:21:14 +08:00
4b31160670 Update install_dev.sh 2025-08-18 16:19:48 +08:00
0593be9928 Update install_dev.sh 2025-08-18 16:18:18 +08:00
6602119ee7 Update install_dev.sh 2025-08-18 16:15:57 +08:00
2943d1f1b7 Update install_dev.sh 2025-08-18 16:14:53 +08:00
485ab6793c Update install_dev.sh 2025-08-18 16:13:35 +08:00
164a450784 update 2025-08-18 16:10:14 +08:00
f12db7e55f Update install_dev.sh 2025-08-18 16:03:31 +08:00
23e000afb3 Update install_dev.sh 2025-08-18 15:57:38 +08:00
5c77dd91e7 Update nosql_mongodb.py 2025-08-17 17:25:34 +08:00
1c4140daec Update nginx.conf 2025-08-11 17:48:18 +08:00
ad1035547d Update nginx.conf 2025-08-11 17:48:01 +08:00
e61be60f71 Update linux.conf 2025-08-11 17:11:38 +08:00
9d6db1e847 Update nginx.conf 2025-08-11 17:06:29 +08:00
Mr Chen
76a417fee7 Merge pull request #794 from midoks/dev
数据展示插件及修复计划任务列表
2025-08-03 11:48:32 +08:00
9e836148bb Update crontab.js 2025-08-03 11:44:35 +08:00
8d32e404e7 Update crontab.js 2025-08-03 11:28:46 +08:00
fb3b0f0ae6 Update crontab.js 2025-08-03 11:21:50 +08:00
6ad415fa5a Update index.py 2025-08-02 19:48:28 +08:00
79d2cc26b0 Update index.py 2025-08-02 19:47:36 +08:00
df0ad48348 Update prometheus.js 2025-08-02 19:45:50 +08:00
b1024d1da1 Update index.html 2025-08-02 19:45:15 +08:00
5db1ad1535 Update index.py 2025-08-02 19:44:26 +08:00
b45fef8b0b Update prometheus.service.tpl 2025-08-02 19:42:44 +08:00
22d4a9a809 update 2025-08-02 19:37:00 +08:00
0478356ea5 pdate 2025-08-02 19:34:25 +08:00
45e35c4396 Update linux.sh 2025-08-02 19:27:59 +08:00
eb5079a5ef Update linux.sh 2025-08-02 19:26:38 +08:00
a62e01e02e Update install.sh 2025-08-02 19:24:35 +08:00
c58db08e5f update 2025-08-02 19:23:00 +08:00
6476fe1d2c Update linux.sh 2025-08-02 19:22:30 +08:00
8ea34d5736 prometheus 2025-08-02 19:22:14 +08:00
4d4f43fa93 Update info.json 2025-08-02 19:07:39 +08:00
3e7b2ee6c1 Update promtail-config.yaml 2025-08-02 17:02:52 +08:00
0d16d3abf1 Update loki-config.yaml 2025-08-02 16:35:42 +08:00
3923ea9dd6 Update promtail-config.yaml 2025-08-02 15:19:37 +08:00
e1292620c7 update 2025-08-02 15:08:50 +08:00
4e2b2e1f54 Update promtail-config.yaml 2025-08-02 15:02:00 +08:00
fcf75b652c update 2025-08-02 14:57:53 +08:00
9765b51969 Update linux.sh 2025-08-02 14:52:48 +08:00
0769183f61 Update linux.sh 2025-08-02 14:52:39 +08:00
845cc1a2ef Update linux.sh 2025-08-02 14:49:03 +08:00
16a95c12b4 Update linux.sh 2025-08-02 14:45:04 +08:00
0516aeb94f Update linux.sh 2025-08-02 14:43:19 +08:00
6b92ecebf9 Update linux.sh 2025-08-02 14:37:48 +08:00
9010c71051 Update linux.sh 2025-08-02 14:35:53 +08:00
fcca331224 Update index.py 2025-08-02 14:32:26 +08:00
e3a2f76f78 Update promtail.service.tpl 2025-08-02 14:25:27 +08:00
7e221454a3 update 2025-08-02 14:24:40 +08:00
ebecffca03 Update linux.sh 2025-08-02 14:14:07 +08:00
42f99fd7a2 update 2025-08-02 14:05:46 +08:00
b31ab0ae16 update 2025-08-02 13:56:29 +08:00
bec041aa01 Update linux.sh 2025-08-02 13:53:37 +08:00
8ded811295 Update linux.sh 2025-08-02 13:51:17 +08:00
f1c0b9f1ed update 2025-08-02 13:49:07 +08:00
d32a371b3a Create loki-config.bak.yaml 2025-08-02 13:45:15 +08:00
c0860cd275 update 2025-08-02 13:34:50 +08:00
bfd125fc4f Update loki.service.tpl 2025-08-02 13:30:02 +08:00
a115ab28ba Update loki-config.yaml 2025-08-02 13:29:42 +08:00
d21b126401 update 2025-08-02 13:24:10 +08:00
410bf03682 Update loki.service.tpl 2025-08-02 13:21:35 +08:00
0a9f3de5c3 Update index.py 2025-08-02 13:18:47 +08:00
0ecadb918b Update index.py 2025-08-02 13:16:43 +08:00
e90b055f12 Update loki.service.tpl 2025-08-02 13:14:13 +08:00
02877dc23c Update index.py 2025-08-02 12:40:08 +08:00
e22439af4c update 2025-08-02 12:33:11 +08:00
298c777971 update 2025-08-02 12:31:35 +08:00
39cf12f51a Update linux.sh 2025-08-02 11:30:40 +08:00
276bc480cf Update install.sh 2025-08-02 11:10:43 +08:00
f0b2820034 Update linux.sh 2025-08-02 11:08:32 +08:00
ba65103df4 Update index.py 2025-08-02 11:07:08 +08:00
ae64b70f10 Update linux.sh 2025-08-02 11:04:01 +08:00
56ea2dd6f4 Update linux.sh 2025-08-02 11:02:31 +08:00
1633b9fca7 Update install.sh 2025-08-02 00:04:26 +08:00
cb7a79953f update 2025-08-01 23:33:43 +08:00
5c12d9d6a6 Update install.sh 2025-08-01 19:30:28 +08:00
244ae40969 update 2025-08-01 19:27:48 +08:00
e2b7fec286 Update install.sh 2025-08-01 19:20:39 +08:00
4cc2bc16c0 Update grafana.js 2025-08-01 19:19:29 +08:00
24a4872058 Update index.py 2025-08-01 19:18:20 +08:00
91a9788706 update 2025-08-01 19:17:14 +08:00
2a6ef8853d update 2025-08-01 19:10:26 +08:00
56358508c8 Update index.py 2025-08-01 18:57:27 +08:00
976b94464e Update index.py 2025-08-01 18:57:05 +08:00
d166a0ccfb Update index.html 2025-08-01 18:55:32 +08:00
7c5c389629 update 2025-08-01 18:54:20 +08:00
f447b527eb update 2025-08-01 18:52:52 +08:00
a251714989 Update install.sh 2025-08-01 18:50:28 +08:00
ea27f817e3 Update grafana.service.tpl 2025-08-01 18:48:58 +08:00
b6fb47fc16 update 2025-08-01 18:44:34 +08:00
fa540d516d Update install.sh 2025-08-01 18:37:17 +08:00
4b068d2a52 Update grafana.service.tpl 2025-08-01 18:34:35 +08:00
50f5289e2e Update grafana.service.tpl 2025-08-01 18:26:02 +08:00
1ba20a4ea7 Update grafana.service.tpl 2025-08-01 18:20:55 +08:00
e18067b2f0 Update index.py 2025-08-01 18:18:04 +08:00
025f19728f up 2025-08-01 18:14:54 +08:00
248496021a up 2025-08-01 18:12:07 +08:00
d56a73f0f7 Update linux.sh 2025-08-01 17:50:09 +08:00
a2b68ebce1 Update grafana.js 2025-08-01 17:27:00 +08:00
93b92f2b17 Update index.py 2025-08-01 17:26:02 +08:00
f5219bf79b Update index.py 2025-08-01 17:21:51 +08:00
cc1d99d9c9 Update index.py 2025-08-01 17:20:33 +08:00
f7101db942 Update linux.sh 2025-08-01 17:10:14 +08:00
97ae9d17bf Update linux.sh 2025-08-01 17:08:06 +08:00
a5624e7e3c Update linux.sh 2025-08-01 17:04:34 +08:00
0be42900c1 Update install.sh 2025-08-01 17:02:51 +08:00
9722e1ca64 update 2025-08-01 17:02:31 +08:00
63a20506a0 Update info.json 2025-08-01 16:58:28 +08:00
9b334e416f update 2025-08-01 16:55:54 +08:00
7805956cdf update 2025-07-30 15:33:03 +08:00
04ffd0ad45 Update install.sh 2025-07-30 15:30:51 +08:00
f6e7055c2b Update info.json 2025-07-30 13:23:05 +08:00
77167655e8 update 2025-07-30 13:22:42 +08:00
Mr Chen
24e2d0a3db Merge pull request #791 from midoks/dev
mysql强制修改密码
2025-07-27 17:20:18 +08:00
29795074fe Update index.py 2025-07-27 17:17:17 +08:00
e017675b4d Update index.py 2025-07-27 17:14:19 +08:00
74a9897deb Update index.py 2025-07-27 17:03:02 +08:00
f593e77d35 Update mysql.js 2025-07-27 17:01:36 +08:00
8b9ab7f0b8 Update mysql.js 2025-07-27 17:00:45 +08:00
02951833cc Update mysql.js 2025-07-27 16:58:53 +08:00
08e300d065 Update index.py 2025-07-27 16:56:56 +08:00
776e4c2418 Update index.py 2025-07-27 16:53:42 +08:00
cbe439815d Update index.py 2025-07-27 16:50:42 +08:00
5c43222e4f Update index.py 2025-07-27 16:49:54 +08:00
a6fe7e2fe3 Update index.py 2025-07-27 16:49:17 +08:00
6f6523836d Update index.py 2025-07-27 16:48:44 +08:00
650a57350c Update index.py 2025-07-27 16:48:25 +08:00
736b34e834 Update index.py 2025-07-27 16:45:55 +08:00
d29682fd19 Update index.py 2025-07-27 16:44:09 +08:00
59c9058426 Update index.py 2025-07-27 16:43:26 +08:00
dbd32201c5 Update index.py 2025-07-27 16:40:56 +08:00
55158a67fc Update index.py 2025-07-27 16:40:27 +08:00
49dfe99a14 Update index.py 2025-07-27 16:23:53 +08:00
165672f9fd Update index.py 2025-07-27 16:22:51 +08:00
3bf03aa0b2 Update index.py 2025-07-27 16:20:49 +08:00
8ccbe8e7a6 Update index.py 2025-07-27 16:17:02 +08:00
1d54f90c95 Update index.py 2025-07-27 16:11:56 +08:00
000de62093 Update index.py 2025-07-27 16:09:05 +08:00
7ed82a796a Update install.sh 2025-07-27 16:07:50 +08:00
4ad7e4c3f3 Update index.py 2025-07-27 16:07:41 +08:00
e1c17d8926 update 2025-07-27 15:58:59 +08:00
47cc40d0dd Update index.py 2025-07-27 15:56:34 +08:00
1a66d91885 Update mysql.js 2025-07-27 15:56:27 +08:00
01fbe11831 Update orm.py 2025-07-27 15:41:28 +08:00
d834965d79 Update orm.py 2025-07-27 15:37:30 +08:00
b6eeb79500 Update README.md 2025-07-25 11:56:51 +08:00
460d6c4e02 Update manticore.conf 2025-07-23 12:47:27 +08:00
c6089bd480 Update sphinx_make.py 2025-07-23 12:44:12 +08:00
3d18d4bc6f Update manticore.conf 2025-07-23 12:41:07 +08:00
61954b820f Update manticore.conf 2025-07-23 12:40:18 +08:00
dee67c6ea2 Update index.py 2025-07-23 12:31:19 +08:00
2fdaf1d482 update 2025-07-23 12:30:24 +08:00
8af986a4c5 Update sphinx_make.py 2025-07-23 12:18:29 +08:00
c3a13b66e6 Update index.py 2025-07-23 12:13:20 +08:00
Mr Chen
78111fd408 Merge pull request #788 from midoks/dev
manticoresearch插件配置优化
2025-07-23 12:05:04 +08:00
efeaa3f0b5 Update sphinx_make.py 2025-07-23 12:04:29 +08:00
aed5e1aa63 Update index.py 2025-07-23 11:58:35 +08:00
44211065a0 Update index.py 2025-07-23 11:55:05 +08:00
364d38cc05 Update install_dev.sh 2025-07-23 11:47:53 +08:00
b38bfd7ada Update index.py 2025-07-23 11:32:48 +08:00
f05efd1693 Update mw.tpl 2025-07-22 18:06:15 +08:00
c64b03135c Update alpine.sh 2025-07-22 17:56:07 +08:00
860a50f025 Update update.sh 2025-07-22 17:54:47 +08:00
5e9706ca23 Update install.sh 2025-07-22 17:54:35 +08:00
d3d23fe7b9 Update alpine.sh 2025-07-22 17:54:10 +08:00
af2aa2e083 Update alpine.sh 2025-07-22 17:44:34 +08:00
bb52b17a12 Update alpine.sh 2025-07-22 17:37:01 +08:00
17c68cb9b7 Update alpine.sh 2025-07-22 17:36:31 +08:00
5c3fe16e9c Update install_dev.sh 2025-07-22 17:30:21 +08:00
81ce4e3445 Update alpine.sh 2025-07-22 17:27:45 +08:00
9aaa5174bb Update update_dev.sh 2025-07-22 17:23:55 +08:00
8d9c89d281 update 2025-07-22 17:20:56 +08:00
Mr Chen
62fa42f1ba Merge pull request #787 from midoks/dev
manticoresearch状态修复
2025-07-22 00:35:59 +08:00
502cb1595f Update index.py 2025-07-22 00:33:13 +08:00
c1e358e9fd Update index.py 2025-07-22 00:33:01 +08:00
7600ef1b30 Update index.html 2025-07-22 00:14:54 +08:00
b9057da526 Update index.py 2025-07-22 00:14:05 +08:00
99e143b686 up 2025-07-22 00:10:10 +08:00
Mr Chen
0414f1f4de Merge pull request #786 from midoks/dev
增加插件manticoresearch
2025-07-21 21:28:24 +08:00
80f651d17a Update index.py 2025-07-21 21:03:19 +08:00
1a373eb876 Update install.sh 2025-07-21 21:01:09 +08:00
5882b6b58e Update index.py 2025-07-21 20:49:12 +08:00
f876e56a2d Update install.sh 2025-07-21 20:34:21 +08:00
ac98ec92e4 Update tool_cron.py 2025-07-21 20:32:25 +08:00
6cf6445c01 Update index.py 2025-07-21 20:31:00 +08:00
062a6def14 Update tool_cron.py 2025-07-21 20:30:42 +08:00
282a5451f8 Update index.py 2025-07-21 20:02:08 +08:00
b410f782e6 Update sphinx_make.py 2025-07-21 19:50:36 +08:00
f4d997957c Update index.py 2025-07-21 19:46:02 +08:00
5551c7d341 Update discuz.conf 2025-07-21 19:43:28 +08:00
642e028fca Update discuz.conf 2025-07-21 19:42:54 +08:00
ffe5cd21e5 Update index.py 2025-07-21 19:41:02 +08:00
93679924f4 up 2025-07-21 19:25:59 +08:00
212e3c1066 Update sphinx_make.py 2025-07-21 19:23:18 +08:00
ebd4baa6ff Update sphinx_make.py 2025-07-21 19:23:05 +08:00
6d846144dc Update sphinx_make.py 2025-07-21 19:20:52 +08:00
e9767ee6c7 Update sphinx_make.py 2025-07-21 19:19:09 +08:00
b4a77f25f9 Update sphinx_make.py 2025-07-21 19:18:03 +08:00
08098f48a0 Update sphinx_make.py 2025-07-21 19:17:11 +08:00
478ebe95f0 Update discuz.conf 2025-07-21 19:14:27 +08:00
bc48b85478 up 2025-07-21 19:09:44 +08:00
a5f7610230 Update index.py 2025-07-21 19:06:31 +08:00
98157bbc8b Update index.py 2025-07-21 19:05:34 +08:00
4e0792b139 Update discuz.conf 2025-07-21 18:51:19 +08:00
a171970c96 Update index.py 2025-07-21 18:46:39 +08:00
38490fd462 Create discuz.conf 2025-07-21 18:45:23 +08:00
b9726cc23f Update install.sh 2025-07-21 18:16:38 +08:00
e047696fba Update info.json 2025-07-21 18:13:24 +08:00
bea5a0896a Update install.sh 2025-07-21 18:12:18 +08:00
c15ddb64e8 Update install.sh 2025-07-21 18:07:18 +08:00
e4e3cbd68e update 2025-07-21 18:04:27 +08:00
fd8b27d3f1 Update install.sh 2025-07-21 17:58:53 +08:00
497a1632c0 Update install.sh 2025-07-21 17:58:43 +08:00
5e991a9708 Update manticore.conf 2025-07-21 17:55:46 +08:00
0e49874d38 update 2025-07-21 17:55:36 +08:00
a93b99bca7 Update install.sh 2025-07-21 17:38:33 +08:00
4d541c175c Update install.sh 2025-07-21 17:37:56 +08:00
588de95004 Update install.sh 2025-07-21 17:34:06 +08:00
8850d73ea3 Update install.sh 2025-07-21 17:33:38 +08:00
feca7c7d7c Update manticore.conf 2025-07-21 17:32:22 +08:00
1507368ea7 Update index.py 2025-07-21 17:20:34 +08:00
ce74ec97fb Update index.py 2025-07-21 17:20:12 +08:00
1fd5e2c3f6 update 2025-07-21 17:19:20 +08:00
79e23fe0c7 Update index.py 2025-07-21 17:12:44 +08:00
ab0c62c73a Update index.py 2025-07-21 17:07:27 +08:00
e72de994ad up 2025-07-21 17:01:16 +08:00
364a84cc6d Update manticoresearch.js 2025-07-21 16:58:56 +08:00
40072c6423 Update index.py 2025-07-21 16:55:51 +08:00
2d56f71588 Update index.py 2025-07-21 16:55:03 +08:00
d7a8b87473 Update index.py 2025-07-21 16:51:53 +08:00
7c8c2c655c Update index.py 2025-07-21 16:50:31 +08:00
8ea870b2a7 Update index.py 2025-07-21 16:49:59 +08:00
7e1317a400 Update index.py 2025-07-21 16:49:26 +08:00
6569a4af3b Update index.py 2025-07-21 16:47:40 +08:00
31ee85a523 Update index.py 2025-07-21 16:44:48 +08:00
acf6384318 Update index.py 2025-07-21 16:44:29 +08:00
539426d585 update 2025-07-21 16:43:51 +08:00
f8401414d3 update 2025-07-21 16:41:00 +08:00
e3cbdb9420 Update index.py 2025-07-21 16:35:23 +08:00
823126dad6 update 2025-07-21 16:34:29 +08:00
6d3c8d6679 Update install.sh 2025-07-21 16:33:13 +08:00
da2ee9c6f4 update 2025-07-21 16:32:02 +08:00
0b4299d6c3 Update install.sh 2025-07-21 16:29:19 +08:00
0830419658 Update install.sh 2025-07-21 16:28:51 +08:00
85bfcd7447 manticoresearch初始化 2025-07-21 16:13:34 +08:00
729b7e0bcc Update index.py 2025-07-21 16:08:23 +08:00
4dbaf5d0f8 Update site.py 2025-07-20 23:19:38 +08:00
Mr Chen
cbad208be6 Merge pull request #785 from midoks/dev
更友好的顶级域名识别
2025-07-20 22:16:11 +08:00
f7992d8eae Update site.py 2025-07-20 22:04:02 +08:00
8c7c344ea9 update 2025-07-20 21:52:24 +08:00
Mr Chen
2a52aa61c1 Merge pull request #783 from midoks/dev
php版本更新
2025-07-20 17:05:30 +08:00
8d06bd94b8 Update xdebug.sh 2025-07-20 17:02:27 +08:00
8f53747515 Update swoole.sh 2025-07-20 17:02:16 +08:00
d7a997052d Update xhprof.sh 2025-07-20 16:30:42 +08:00
324e98b639 Update xdebug.sh 2025-07-20 16:15:20 +08:00
7aebb728f8 Update xdebug.sh 2025-07-20 16:13:04 +08:00
c386a2a57a Update xdebug.sh 2025-07-20 16:12:19 +08:00
6e5c4917d9 Update event.sh 2025-07-20 16:07:37 +08:00
d5d9ae51c5 Update all_test.sh 2025-07-20 16:04:38 +08:00
ca39f0da3a Update all_test.sh 2025-07-20 15:59:53 +08:00
41cdbb43fc Update swoole.sh 2025-07-20 15:53:41 +08:00
6f3897886e Update swoole.sh 2025-07-20 15:50:55 +08:00
6b1bfdfeca Update solr.sh 2025-07-20 15:48:49 +08:00
a07a37f256 Update solr.sh 2025-07-20 15:30:07 +08:00
896512cf3e Update imagemagick.sh 2025-07-20 15:25:30 +08:00
60602e68f5 Update mcrypt.sh 2025-07-20 15:19:47 +08:00
7066eb2632 Update memcached.sh 2025-07-20 14:35:29 +08:00
ddfdebced2 up 2025-07-20 13:52:29 +08:00
4913cc9ed6 update 2025-07-20 13:31:18 +08:00
6427bb794d Update swoole.sh 2025-07-20 12:51:15 +08:00
77bc7c85f8 Update swoole.sh 2025-07-20 12:50:46 +08:00
54a90a2e99 Update swoole.sh 2025-07-20 12:46:17 +08:00
e4a9c32caa Update all_mac.sh 2025-07-20 12:28:37 +08:00
13b9711d4a Update phplib.conf 2025-07-20 12:25:38 +08:00
af15d6a592 Update all_test.sh 2025-07-20 12:23:19 +08:00
132580ea6c Update phplib.conf 2025-07-20 12:18:45 +08:00
262ab0ab73 Update phplib.conf 2025-07-20 12:15:56 +08:00
1e19d70fa1 Update phplib.conf 2025-07-20 12:13:07 +08:00
48b8d530ca Update all_test.sh 2025-07-20 11:35:41 +08:00
1f35c5b8fa Update install.sh 2025-07-20 11:26:12 +08:00
574b87f5b5 update 2025-07-20 11:20:11 +08:00
88be69ffc7 update 2025-07-20 11:19:14 +08:00
Mr Chen
87e49e3244 Merge pull request #782 from midoks/dev
mysql 配置回退
2025-07-20 11:06:02 +08:00
4a392126cd update 2025-07-20 11:05:24 +08:00
c0489ebb44 Update info.json 2025-07-19 19:02:29 +08:00
ed65f63a37 Update index.py 2025-07-17 20:12:16 +08:00
Mr Chen
2b4ff60de0 Merge pull request #781 from midoks/dev
版本更新及细节优化
2025-07-17 18:04:06 +08:00
8069bf51ab update 2025-07-17 17:37:57 +08:00
369b53e2fd update 2025-07-17 11:19:33 +08:00
1cf0c1636b update 2025-07-17 11:15:34 +08:00
060fe39331 update 2025-07-17 11:13:19 +08:00
8bec4058e2 Update info.json 2025-07-17 11:11:13 +08:00
Mr Chen
61d30d6f77 Merge pull request #780 from midoks/dev
Update index.py
2025-07-16 15:48:56 +08:00
7daae8a129 Update index.py 2025-07-16 15:47:01 +08:00
Mr Chen
ab2c9e450e Merge pull request #779 from midoks/dev
Dev
2025-07-16 15:34:06 +08:00
24c269bf4c Update install.sh 2025-07-16 15:29:54 +08:00
8f0c8fd800 Update install.sh 2025-07-16 15:29:21 +08:00
Mr Chen
a0e29a2bc2 Merge pull request #778 from midoks/dev
0.18.2
2025-07-16 15:22:03 +08:00
94cab2e71a update 2025-07-16 15:20:50 +08:00
266b9fa5c2 up 2025-07-16 11:47:23 +08:00
Mr Chen
31de8edc4a Merge pull request #777 from midoks/dev
Update site_reflect.py
2025-07-15 18:30:26 +08:00
1e59eda9a9 Update site_reflect.py 2025-07-15 18:23:40 +08:00
Mr Chen
36c3fcb395 Merge pull request #776 from midoks/dev
计划任务兼容性问题
2025-07-13 22:06:52 +08:00
ea8f0523d5 Update crontab.py 2025-07-13 21:34:46 +08:00
71625b7c0e Update init_cron.py 2025-07-13 21:19:30 +08:00
408a62c755 update 2025-07-13 10:58:05 +08:00
Mr Chen
da4a61b716 Merge pull request #775 from midoks/dev
0.18.1
2025-07-12 20:57:46 +08:00
996c4474ec Update version.py 2025-07-12 20:55:05 +08:00
cdc05d8d98 update 2025-07-12 20:44:37 +08:00
52892ef5df Update crontab.js 2025-07-12 20:34:50 +08:00
ce0340689b Update crontab.py 2025-07-12 20:34:06 +08:00
58cdb0db95 Update crontab.py 2025-07-12 20:28:40 +08:00
c2c49d09e9 Update crontab.py 2025-07-12 20:25:14 +08:00
c9a2997cea Update backup.py 2025-07-12 20:23:43 +08:00
94aba71ae4 Update backup.py 2025-07-12 20:17:16 +08:00
b80c7bdc23 Update backup.py 2025-07-12 20:12:31 +08:00
279231c08c update 2025-07-12 20:12:17 +08:00
ef47b839ad Update crontab.py 2025-07-12 19:54:24 +08:00
ffc8ae7d04 update 2025-07-12 17:43:45 +08:00
7d8269832f up 2025-07-12 16:42:10 +08:00
6ba516f66e Update default.sql 2025-07-12 14:26:09 +08:00
53d4fcbd6d update 2025-07-12 14:21:04 +08:00
237ef10545 update 2025-07-12 14:19:01 +08:00
23650aa800 update 2025-07-12 14:13:47 +08:00
9998691524 update 2025-07-12 13:59:05 +08:00
bd61a953ad Update public.js 2025-07-12 12:45:59 +08:00
f53379829c Update public.js 2025-07-12 01:35:49 +08:00
Mr Chen
04a4faba22 Merge pull request #774 from midoks/dev
编辑细节优化
2025-07-12 01:14:08 +08:00
65d4369306 Update public.js 2025-07-12 01:10:42 +08:00
6ab650d498 Update public.js 2025-07-12 00:20:17 +08:00
Mr Chen
2a06c108ac Merge pull request #773 from midoks/dev
Update public.js
2025-07-12 00:15:29 +08:00
3bd31c55fd Update public.js 2025-07-12 00:14:03 +08:00
Mr Chen
ea2fb6d4cd Merge pull request #772 from midoks/dev
编辑文件优化
2025-07-11 23:57:12 +08:00
d4dccc8016 Update public.js 2025-07-11 23:52:50 +08:00
3cdc78af1f Update push_ad.py 2025-07-11 15:37:26 +08:00
7784f0c929 Update push_notice_msg.py 2025-07-11 15:34:42 +08:00
a399d3d04a Update push_notice_msg.py 2025-07-11 15:33:39 +08:00
d261dd8fb4 Update push_notice_msg.py 2025-07-11 15:28:57 +08:00
273f475732 up 2025-07-04 08:40:56 +08:00
Mr Chen
35cce62b9b Merge pull request #769 from midoks/dev
修复mysql8+正确关闭二进制日志
2025-07-02 23:12:34 +08:00
7b5d2820ca up 2025-07-02 23:05:45 +08:00
46374cfb2d update 2025-07-02 23:00:48 +08:00
020bfb2abc Update index.py 2025-07-02 22:58:07 +08:00
d3ab317b34 Update index.py 2025-07-02 22:57:15 +08:00
da3dd52484 Update index.py 2025-07-02 22:54:38 +08:00
9514cd9cce Update my9.0.cnf 2025-07-02 22:52:34 +08:00
654a66062a Update my9.0.cnf 2025-07-02 22:52:18 +08:00
5ac5b13f9d update 2025-06-30 12:13:21 +08:00
Mr Chen
7f39bf5c6e Merge pull request #767 from midoks/dev
Update crontab.py
2025-06-26 17:30:00 +08:00
0e07a10dcf Update crontab.py 2025-06-26 15:45:03 +08:00
Mr Chen
8cbedd00b8 Merge pull request #766 from midoks/dev
acme.sh 定时每7天强制更新
2025-06-25 23:07:56 +08:00
d9d3d3fdb4 Update init_cron.py 2025-06-25 23:06:09 +08:00
364c142f0a Update init_cron.py 2025-06-25 23:04:07 +08:00
92c0177c44 Update init_cron.py 2025-06-25 22:59:42 +08:00
6bdca8c37e Update init_cron.py 2025-06-25 22:58:43 +08:00
fcb51e727a Update __init__.py 2025-06-25 22:57:34 +08:00
4523a10898 Update __init__.py 2025-06-25 22:56:39 +08:00
4e155c8039 Update init_cron.py 2025-06-25 22:55:40 +08:00
8b9f861f30 Update init_cron.py 2025-06-25 22:54:45 +08:00
Mr Chen
3595ae6066 Merge pull request #765 from midoks/dev
mysql 9.0 兼容优化
2025-06-25 18:55:27 +08:00
351d4a0ad6 Update index.py 2025-06-25 17:26:17 +08:00
c6e6771839 Update index.py 2025-06-25 17:21:18 +08:00
fb51e0fcd1 Update index.py 2025-06-25 17:05:09 +08:00
4fbf9c345d update 2025-06-25 17:03:45 +08:00
f3557e9acf update 2025-06-25 17:01:24 +08:00
cb7367264b Update index.py 2025-06-25 16:53:15 +08:00
2fb722edbf Update index.py 2025-06-25 16:50:22 +08:00
fce1608403 Update index.py 2025-06-25 16:46:38 +08:00
c6117cb599 update 2025-06-25 16:46:21 +08:00
c68e056267 Update index.py 2025-06-25 16:44:55 +08:00
4c9924580a Update index.py 2025-06-25 16:38:37 +08:00
058b3b8d62 Update index.py 2025-06-25 16:36:27 +08:00
1eb29acf7c Update index.py 2025-06-25 16:35:16 +08:00
48ac052de8 Update index.py 2025-06-25 16:35:03 +08:00
4863ff2a19 update 2025-06-25 16:32:59 +08:00
0b0fd8ea67 Update index.py 2025-06-25 16:25:48 +08:00
Mr Chen
b8f4ed2767 Merge pull request #759 from midoks/dev
Update file.py
2025-06-16 18:44:21 +08:00
732eba7d7d Update file.py 2025-06-16 18:43:19 +08:00
Mr Chen
8b676f3c1b Merge pull request #758 from midoks/dev
Update file.py
2025-06-12 15:40:50 +08:00
960ca4deca Update file.py 2025-06-12 15:37:14 +08:00
Mr Chen
63ecec4edb Merge pull request #757 from midoks/dev
bug! 根目录解压引起所有目录权限发生变化-限制
2025-06-12 15:18:40 +08:00
c6f04aa26f Update file.py 2025-06-12 15:18:22 +08:00
8f29df66d5 Update file.py 2025-06-12 15:11:12 +08:00
2d9e62aedb Update file.py 2025-06-12 15:10:25 +08:00
eba511add2 Update file.py 2025-06-12 15:09:42 +08:00
Mr Chen
e9e38d5224 Merge pull request #756 from midoks/dev
Update setting.py
2025-06-12 13:18:59 +08:00
b131ba8b93 Update setting.py 2025-06-12 13:17:44 +08:00
Mr Chen
a12046fe93 Merge pull request #755 from midoks/dev
简单优化
2025-06-12 08:11:46 +08:00
769f065bdf update 2025-06-12 08:10:42 +08:00
81f9ee5eca Update git.tpl 2025-06-09 23:03:14 +08:00
42fb44dd15 Update backup.py 2025-06-09 19:09:50 +08:00
600bb8b516 Update site.py 2025-06-04 15:58:34 +08:00
Mr Chen
8831d91cbe Merge pull request #753 from midoks/dev
PHP GD优化
2025-06-04 15:48:29 +08:00
d7d734565c Update gd_old.sh 2025-06-04 15:45:06 +08:00
791e9bf156 Update gd_old.sh 2025-06-04 15:43:20 +08:00
284812b4e3 Update gd_old.sh 2025-06-04 15:43:05 +08:00
505d59bc77 Update install.sh 2025-06-04 12:47:52 +08:00
Mr Chen
02eda25aaf Merge pull request #751 from midoks/dev
优化
2025-05-29 19:11:46 +08:00
d19521810e Update __init__.py 2025-05-29 19:10:41 +08:00
f8d17724f9 update 2025-05-29 19:07:51 +08:00
Mr Chen
6548125747 Merge pull request #750 from midoks/dev
常规优化
2025-05-29 18:51:51 +08:00
ef375619b6 php 默认的 mysql 连接配置,可支持localhost连接 2025-05-29 18:49:17 +08:00
fe89ae1846 Update index.py 2025-05-29 18:45:55 +08:00
4ccf142917 Update push_ad.py 2025-05-27 16:38:50 +08:00
Mr Chen
89fbeb85a2 Merge pull request #749 from midoks/dev
debian ufw 规则识别有优化
2025-05-27 11:09:07 +08:00
62b3d15991 Update firewall.py 2025-05-27 11:04:38 +08:00
52a305f5cd Update firewall.py 2025-05-27 11:01:21 +08:00
Mr Chen
658305ef28 Merge pull request #748 from midoks/dev
ACME泛域名SSL申请 第二次优化
2025-05-25 20:38:09 +08:00
19295e2832 Update common.js 2025-05-25 20:37:22 +08:00
719e8165f1 Update common.js 2025-05-25 20:20:10 +08:00
Mr Chen
d5ba280654 Merge pull request #747 from midoks/dev
ACME泛域名SSL - 插件优化
2025-05-25 20:14:53 +08:00
00dc48b439 Update index.py 2025-05-25 20:11:06 +08:00
8cc87ba7a0 Update acme.sql 2025-05-25 20:04:59 +08:00
8b2f7ee188 Update common.js 2025-05-25 20:03:18 +08:00
167c551b89 Update common.js 2025-05-25 20:02:42 +08:00
b57968d106 Update common.js 2025-05-25 19:57:26 +08:00
68514b8eae Update index.py 2025-05-25 19:27:54 +08:00
88a8e35793 Update tool_cron.py 2025-05-25 19:21:34 +08:00
ec4dcb2720 Update tool_cron.py 2025-05-25 19:20:15 +08:00
f01b64edd5 Update goedge.py 2025-05-25 19:05:10 +08:00
ef0b2af84b Update tool_cron.py 2025-05-25 19:04:55 +08:00
90af2e0c3c Update install.sh 2025-05-25 01:59:46 +08:00
344393244e Update info.json 2025-05-25 01:54:21 +08:00
96c75eb2d3 php优化 2025-05-25 00:14:07 +08:00
5594cbd1a8 php优化 2025-05-25 00:09:40 +08:00
Mr Chen
cb87abf19a Merge pull request #746 from midoks/dev
Update __init__.py
2025-05-24 23:06:48 +08:00
bf21399113 Update __init__.py 2025-05-24 23:06:24 +08:00
Mr Chen
f0fc8a644b Merge pull request #745 from midoks/dev
放开子目录绑定
2025-05-24 19:32:18 +08:00
a668234f2a Update site.py 2025-05-24 19:31:35 +08:00
6e80450e37 Update __init__.py 2025-05-24 18:54:20 +08:00
5639be6713 Update monitor.py 2025-05-24 18:48:57 +08:00
d36da3dc59 Update init.py 2025-05-24 18:45:59 +08:00
e83c743908 Update __init__.py 2025-05-24 18:45:41 +08:00
3410103859 Update default.sql 2025-05-24 18:45:36 +08:00
2685d9ebec Update .gitignore 2025-05-24 18:40:56 +08:00
c5574b3d93 Update site.js 2025-05-24 15:41:30 +08:00
832d65bac8 Update default.sql 2025-05-24 15:10:00 +08:00
8394f43b3f Update default.sql 2025-05-24 15:09:46 +08:00
Mr Chen
c77ab16f3b Merge pull request #744 from midoks/dev
ssh连接优化
2025-05-24 01:16:31 +08:00
2d10a3a69e Update ssh_local.py 2025-05-24 01:05:41 +08:00
90714961eb Update ssh_local.py 2025-05-24 01:04:26 +08:00
b2586adda0 Update ssh_local.py 2025-05-24 01:03:31 +08:00
d11dbbccb7 Update ssh_local.py 2025-05-24 01:03:08 +08:00
1390afae0e Update ssh_local.py 2025-05-24 01:00:59 +08:00
3ec2d5e757 Update ssh_terminal.py 2025-05-24 00:56:16 +08:00
cc0d0407af Update ssh_terminal.py 2025-05-24 00:56:05 +08:00
1e9e437b1c update 2025-05-24 00:54:02 +08:00
eae75e24f9 Update ssh_terminal.py 2025-05-24 00:53:34 +08:00
045d672d68 Update ssh_local.py 2025-05-24 00:51:38 +08:00
caeff7de55 Update ssh_local.py 2025-05-24 00:51:29 +08:00
b2785070bc Update ssh_terminal.py 2025-05-24 00:46:53 +08:00
545dbeecca 先尝试默认端口 2025-05-24 00:44:49 +08:00
b4fa69642c Update index.py 2025-05-23 23:44:08 +08:00
f84fcc035c Update git.tpl 2025-05-23 23:43:04 +08:00
f556eb9607 Update git.tpl 2025-05-23 23:41:32 +08:00
b8aa2ffc38 Update index.py 2025-05-23 23:36:46 +08:00
2be79ead78 Update index.py 2025-05-23 23:36:12 +08:00
c900048329 update 2025-05-23 23:35:02 +08:00
b7850eaa29 Update index.py 2025-05-23 23:22:27 +08:00
ec5a5c8d15 Update index.py 2025-05-23 23:21:20 +08:00
94c51196cf Update requirements.txt 2025-05-23 23:07:23 +08:00
35c18c807f Update requirements.txt 2025-05-23 23:02:48 +08:00
da3d44fc2a Update requirements.txt 2025-05-23 23:00:34 +08:00
Mr Chen
b9b9ab9006 Merge pull request #743 from midoks/dev
mariadb数据库备份问题
2025-05-23 17:18:16 +08:00
5df23c79e7 Update backup.py 2025-05-23 15:08:00 +08:00
Mr Chen
ee4d49752d Merge pull request #741 from midoks/dev
简单优化
2025-05-19 03:18:05 +08:00
d26bf25359 Update mw.py 2025-05-19 02:40:33 +08:00
b1edc7b2fb Update site.py 2025-05-18 16:14:01 +08:00
459fb086d0 update 2025-05-18 14:12:01 +08:00
Mr Chen
7872391c54 Merge pull request #740 from midoks/dev
webhook优化
2025-05-18 11:09:20 +08:00
c2f4171ee9 update 2025-05-18 11:04:56 +08:00
9fdfa1c22f Update git.tpl 2025-05-18 10:23:23 +08:00
8ad3018fe7 Update git.tpl 2025-05-18 10:22:33 +08:00
64883aa424 update 2025-05-18 10:20:03 +08:00
6a41f68289 update 2025-05-18 09:40:10 +08:00
ffd96b03e5 Update commit.tpl 2025-05-17 21:17:50 +08:00
961dd5a56e Update index.py 2025-05-17 21:07:59 +08:00
Mr Chen
f5cb8ba23d Merge pull request #739 from midoks/dev
简单的优化
2025-05-16 23:57:46 +08:00
6bfe9ea2af Update info.json 2025-05-16 23:48:35 +08:00
134b9ce2f2 php最新版本 2025-05-16 23:44:57 +08:00
54582fb676 mysql配置优化 2025-05-16 23:31:08 +08:00
Mr Chen
2e9864be2a Merge pull request #738 from midoks/dev
面板关联优化
2025-05-16 19:08:50 +08:00
73f01522ed Update public.js 2025-05-16 19:06:48 +08:00
Mr Chen
73a67ebdd6 Merge pull request #736 from midoks/dev
文件管理-右键菜单优化
2025-05-16 04:19:14 +08:00
92c000f63e 右键菜单优化 2025-05-16 04:15:24 +08:00
665d278b52 Update index.py 2025-05-16 02:56:35 +08:00
9393775e90 Update index.py 2025-05-16 02:55:28 +08:00
Mr Chen
fe441c7afe Merge pull request #735 from midoks/dev
mysql9的同步优化
2025-05-16 02:51:06 +08:00
c865ff433b Update index.py 2025-05-16 02:49:16 +08:00
7eb729e809 Update index.py 2025-05-16 02:41:41 +08:00
Mr Chen
f667fbff55 Merge pull request #734 from midoks/dev
细节调优
2025-05-16 02:06:31 +08:00
7c6b5bb200 Update file.py 2025-05-16 02:03:52 +08:00
d00ee1a35a Update file.py 2025-05-16 02:02:20 +08:00
Mr Chen
7364e19051 Merge pull request #733 from midoks/dev
优化
2025-05-16 01:56:29 +08:00
97263ba55d Update files.js 2025-05-16 01:55:42 +08:00
a9cccbb85f Update files.js 2025-05-16 01:55:35 +08:00
Mr Chen
732bdd5a1c Merge pull request #732 from midoks/dev
支持多种压缩和解压
2025-05-16 01:48:53 +08:00
2934d8fd7d 支持多种压缩和解压
7z,tgz,zip,rar
2025-05-16 01:47:31 +08:00
992555e80e Update cmd.md 2025-05-10 14:51:54 +08:00
4a1348403a Update app.sh 2025-05-06 15:42:15 +08:00
Mr Chen
6353a4dc58 Merge pull request #731 from midoks/dev
redis/memcached版本更新
2025-05-03 10:35:45 +08:00
9e45f493c6 update 2025-05-03 10:34:03 +08:00
66fc8c43db Update info.json 2025-05-03 10:31:26 +08:00
e4761d52bc Update info.json 2025-05-03 10:29:30 +08:00
Mr Chen
893eccfa07 Merge pull request #730 from midoks/dev
PHP最新版本
2025-05-01 23:05:58 +08:00
fc3dc8276a update 2025-05-01 21:01:05 +08:00
Mr Chen
9ab5e3354d Merge pull request #729 from midoks/dev
基本优化
2025-05-01 15:32:53 +08:00
ec607798b5 Update index.py 2025-05-01 15:31:13 +08:00
b01a2d15de Update index.py 2025-05-01 15:29:14 +08:00
7e3f40cb20 系统优化加入hosts修改 2025-05-01 15:22:50 +08:00
7a38224198 Update install.sh 2025-05-01 11:56:32 +08:00
5a4f1c3cce update ad 2025-05-01 09:46:23 +08:00
f5287e42ca update 2025-05-01 09:45:57 +08:00
Mr Chen
3ec02b8ead Merge pull request #728 from midoks/dev
0.17.0升级0.18.0升级后,站点修复
2025-04-26 18:15:41 +08:00
d25e4b3093 0.17.0升级0.18.0升级后,站点修复 2025-04-26 18:14:29 +08:00
0b81a1402e Update site_reflect.py 2025-04-26 17:54:05 +08:00
891ba787e1 Update site_reflect.py 2025-04-26 17:53:40 +08:00
85a85a83e4 Update site_reflect.py 2025-04-26 02:51:09 +08:00
449b4e6882 Update site_reflect.py 2025-04-26 01:43:59 +08:00
fba98f5ed6 up 2025-04-26 00:32:43 +08:00
fda19b6103 update 2025-04-18 19:51:49 +08:00
Mr Chen
d6d2325506 Merge pull request #727 from midoks/dev
OP防火墙修复
2025-04-16 00:54:01 +08:00
d4354f1a65 update 2025-04-16 00:49:45 +08:00
7ebe82cf9c Update install.sh 2025-04-16 00:34:08 +08:00
3029f8d263 update 2025-04-15 23:49:42 +08:00
Mr Chen
00d3aaeb22 Merge pull request #726 from midoks/dev
修复mysql问题
2025-04-14 16:59:13 +08:00
a8bd5cbbeb Update index.py 2025-04-14 16:57:05 +08:00
48bcf77deb Create mysql9.2.service.tpl 2025-04-14 16:54:00 +08:00
Mr Chen
a24f3b72bd Merge pull request #725 from midoks/dev
mysql优化
2025-04-14 16:39:53 +08:00
e916e134dc update 2025-04-14 16:22:51 +08:00
b9b18b063c Update index.py 2025-04-14 16:00:22 +08:00
753460c594 Update index.py 2025-04-14 15:59:52 +08:00
e6f8e3e6e3 Update index.py 2025-04-14 15:49:30 +08:00
952c6da41c Update push_notice_msg.py 2025-04-14 15:27:19 +08:00
adb1d0b26d update 2025-04-14 15:24:30 +08:00
Mr Chen
15efadfa9e Merge pull request #723 from midoks/dev
网站统计安装优化
2025-04-13 16:05:48 +08:00
f09cc4996b Update install.sh 2025-04-13 16:04:55 +08:00
01a81156cc Create install.old.sh 2025-04-13 15:58:27 +08:00
89ee88d734 Update logs.py 2025-04-12 14:20:28 +08:00
Mr Chen
23880fdb91 Merge pull request #721 from midoks/dev
简单优化
2025-04-12 14:09:38 +08:00
10628d1c69 Update logs.py 2025-04-12 13:56:38 +08:00
897e54cb86 Update pg.py 2025-04-09 11:41:01 +08:00
85da840688 update 2025-04-08 18:21:53 +08:00
10348168eb Update install_dev.sh 2025-04-08 17:58:35 +08:00
4a2570f96a Update install.sh 2025-04-08 17:57:38 +08:00
Mr Chen
65a4635b09 Merge pull request #720 from midoks/dev
Update files.js
2025-04-05 18:29:31 +08:00
3a5264b783 Update files.js 2025-04-03 00:22:46 +08:00
Mr Chen
b5866f2a90 Merge pull request #719 from midoks/dev
mysql9.0优化
2025-04-02 16:22:02 +08:00
a35913ab78 update 2025-04-02 16:21:16 +08:00
cc27602454 Update index.py 2025-04-02 16:18:44 +08:00
8920a1132c Update index.py 2025-04-02 16:07:40 +08:00
536c76b000 Update index.py 2025-04-02 15:42:06 +08:00
d054f7f9cd Update index.py 2025-04-02 15:39:59 +08:00
Mr Chen
16bab8f0fa Merge pull request #718 from midoks/dev
mysql9.0相关优化
2025-04-02 13:01:39 +08:00
b7aa774eb7 Update index.py 2025-04-02 12:53:11 +08:00
cef521390a Update index.py 2025-04-02 12:50:50 +08:00
f4cda4ec36 Update index.py 2025-04-02 12:48:38 +08:00
628b65a569 update 2025-04-02 12:48:06 +08:00
142f0fc6c9 Update install.sh 2025-04-02 11:06:47 +08:00
fe0f3f63a2 Update index.py 2025-04-01 22:02:42 +08:00
Mr Chen
dd3f5fdb0c Merge pull request #716 from midoks/dev
修复bug(crontab)
2025-03-29 14:09:38 +08:00
Mr Chen
b7dd2fa05d Merge pull request #715 from moonlightwatch/fix/crontab_echo_name_error
fix: rename cron_name to cron_shell
2025-03-29 14:08:16 +08:00
moonlightwatch
1cf471704c fix: rename cron_name to cron_shell 2025-03-29 14:04:21 +08:00
54f8fdeec2 Update my9.2.cnf 2025-03-26 01:20:21 +08:00
7ea45e4c0a Update my9.2.cnf 2025-03-26 01:17:27 +08:00
5b93e616dc Update my9.2.cnf 2025-03-26 01:13:14 +08:00
2c4176de32 Update index.py 2025-03-26 01:07:25 +08:00
114dcea023 update 2025-03-26 00:57:45 +08:00
3c6b5f3573 update 2025-03-25 12:53:08 +08:00
Mr Chen
258b9b610f Merge pull request #713 from midoks/dev
mysql关闭/开启 二进制日志优化
2025-03-25 12:49:22 +08:00
717d2b1ad0 mariadb更新 2025-03-25 12:48:32 +08:00
3cdd7027d6 Update index.py 2025-03-25 12:45:42 +08:00
c5dc755cb6 Update index.py 2025-03-25 12:45:00 +08:00
89d13494c0 Update index.py 2025-03-25 12:43:24 +08:00
6fe6f55df8 Update info.json 2025-03-25 12:26:05 +08:00
2f38ecf505 update 2025-03-25 12:21:18 +08:00
c4ba4b4702 Create my9.2.cnf 2025-03-25 12:19:43 +08:00
eab13531d4 Update index.py 2025-03-25 12:06:48 +08:00
62d78dbed8 update 2025-03-25 11:55:05 +08:00
f5a4f1b275 ad 2025-03-24 23:40:11 +08:00
ebe761b1cf Update linux.conf 2025-03-24 11:18:01 +08:00
6e754f2f7b Update __init__.py 2025-03-24 10:38:37 +08:00
39cd3d1f4d Update init_cron.py 2025-03-24 00:06:42 +08:00
778d595e6e Update crontab.py 2025-03-23 18:24:41 +08:00
5f4622fdcd Update init_cron.py 2025-03-23 17:27:43 +08:00
9664609bbd Update init_cron.py 2025-03-23 17:14:49 +08:00
aa92699562 Update requirements.txt 2025-03-23 17:14:23 +08:00
edc45d5d3b Update mw.tpl 2025-03-23 17:03:31 +08:00
ed732232f2 Update mw.tpl 2025-03-23 16:52:14 +08:00
db04b3f98a update 2025-03-23 16:50:30 +08:00
fb7c5d9d47 update 2025-03-20 11:48:12 +08:00
7d7df74500 Update .gitignore 2025-03-20 00:14:55 +08:00
909ba46f66 Update index.py 2025-03-10 17:55:03 +08:00
df84ad25d6 Update info.json 2025-03-10 17:47:42 +08:00
178cfb17f3 Update index.py 2025-03-10 17:43:02 +08:00
fcef7ec3ca Update index.py 2025-03-08 14:47:35 +08:00
c1e758c9df Revert "Update index.py"
This reverts commit f40cfb7d25.
2025-03-08 14:46:29 +08:00
a06c98d52f Revert "Update index.py"
This reverts commit bf49153973.
2025-03-08 14:46:22 +08:00
bf49153973 Update index.py 2025-03-08 14:43:55 +08:00
dami
f40cfb7d25 Update index.py 2025-03-08 14:37:05 +08:00
dcd4527c75 update 2025-03-06 20:34:57 +08:00
Mr Chen
225ea91f43 Merge pull request #712 from midoks/dev
简单优化
2025-03-01 22:18:31 +08:00
172ca05efa Update install.sh 2025-03-01 22:17:31 +08:00
b3e2c8d9df Update index.py 2025-02-25 20:22:41 +08:00
934327052d up 2025-02-23 22:33:02 +08:00
24a94b4965 Update info.json 2025-02-23 21:59:01 +08:00
c5385541a7 Update tamper_proof_service.py 2025-02-22 10:29:16 +08:00
5be2d5eb22 Update tamper_proof_service.py 2025-02-22 10:27:23 +08:00
3688cf6145 Update tamper_proof_service.py 2025-02-22 10:18:45 +08:00
Mr Chen
1328699da0 Merge pull request #710 from jd82k/master
fix bugs
2025-02-21 17:01:13 +08:00
jd82k
1b0e42c79e Update site.py
fix bugs
2025-02-20 22:40:07 -08:00
jd82k
6ca80e3d8c Update site.js
fix bugs
2025-02-20 22:38:37 -08:00
Mr Chen
d992541a78 Merge pull request #709 from midoks/dev
openresty1.17.1安装时http3参数缺少
2025-02-19 23:43:24 +08:00
d13adc707e Update install.sh 2025-02-19 23:15:18 +08:00
90d00d0d9a Update install.sh 2025-02-19 23:11:07 +08:00
Mr Chen
fbc9685b3c Merge pull request #708 from midoks/dev
php版本升级
2025-02-18 16:13:34 +08:00
5507cfdb7b Update install.sh 2025-02-18 16:12:50 +08:00
2c8de3e7be Create imagemagick.sh 2025-02-16 10:03:47 +08:00
cbba4adb19 Update imagemagick.sh 2025-02-16 09:48:07 +08:00
b1e36d8a71 Update imagemagick.sh 2025-02-16 09:43:42 +08:00
af6403d752 Update imagemagick.sh 2025-02-16 09:42:16 +08:00
232db27a15 update 2025-02-16 09:15:45 +08:00
e04fc75be0 Update index.py 2025-02-15 22:41:49 +08:00
5fd4c84a18 Update ubuntu.sh 2025-02-15 22:26:08 +08:00
ce65fb9234 Update imagemagick.sh 2025-02-15 22:21:34 +08:00
d8d8c630a5 update 2025-02-15 22:13:39 +08:00
08558b1581 Update imagemagick.sh 2025-02-15 21:14:41 +08:00
21637f170f up 2025-02-14 23:23:58 +08:00
Mr Chen
5013ffd38d Merge pull request #707 from midoks/dev
更新说明
2025-02-13 16:40:20 +08:00
f471368d21 Update README.md 2025-02-13 16:39:51 +08:00
Mr Chen
8ddf0168fd Merge pull request #706 from midoks/dev
webhook插件修复
2025-02-12 12:46:30 +08:00
5a4ba1297f Update dashboard.py 2025-02-12 12:44:53 +08:00
0608c531ed Update dashboard.py 2025-02-12 12:41:31 +08:00
5d242de4e2 update 2025-02-12 12:12:33 +08:00
b7efc0394b update 2025-02-11 01:17:13 +08:00
Mr Chen
16681d0193 Merge pull request #704 from midoks/dev
修复插件安装版本判断
2025-02-10 17:26:53 +08:00
31ea0865d1 Update plugin.py 2025-02-10 17:23:52 +08:00
602ad3390c Update README.md 2025-02-06 15:27:41 +08:00
Mr Chen
d8891a1767 Merge pull request #702 from midoks/dev
计划任务修复
2025-02-06 00:36:56 +08:00
2400a0b353 计划任务修复 2025-02-06 00:34:24 +08:00
Mr Chen
de0248d59a Merge pull request #701 from midoks/dev
解决ufw识别问题
2025-02-05 19:31:46 +08:00
3eb72d23f8 Update firewall.py 2025-02-05 19:21:37 +08:00
c0606112b2 update 2025-02-05 19:15:10 +08:00
5decb77f1e Update ubuntu.sh 2025-02-05 18:49:38 +08:00
a04b9487f1 update 2025-02-03 03:55:05 +08:00
8835cd4ab5 Update index.py 2025-02-03 03:31:43 +08:00
b17452a949 Update index.py 2025-02-03 03:30:09 +08:00
2072eee3a4 Update index.py 2025-02-03 03:24:34 +08:00
4321c0e6b3 up 2025-02-03 03:19:31 +08:00
f1f98b2624 Update index.py 2025-02-03 03:15:26 +08:00
ec37cee26c Update index.py 2025-02-03 03:11:00 +08:00
a8adaf7e5a Update index.py 2025-02-03 03:09:21 +08:00
84c763c39e Update phplib.conf 2025-02-03 03:06:43 +08:00
33e86c4f79 Update phplib.conf 2025-02-03 03:03:51 +08:00
c00f93a1d3 Update phplib.conf 2025-02-03 03:03:43 +08:00
81100f21b4 Update index.py 2025-02-03 02:48:30 +08:00
b8a720919f Update index.py 2025-02-03 02:41:32 +08:00
cba37ae2fc Update lam.js 2025-02-03 02:34:52 +08:00
5d15cbd4ea Update index.py 2025-02-03 02:29:45 +08:00
5f87606cf7 Create config.php 2025-02-03 02:29:21 +08:00
9b22efe3d4 Update index.py 2025-02-03 02:28:13 +08:00
675c3b27aa Update info.json 2025-02-03 02:26:40 +08:00
ddd9e70d05 Update install.sh 2025-02-03 02:24:24 +08:00
30ed2049e4 Update info.json 2025-02-03 02:21:19 +08:00
b8092ed6dd Update info.json 2025-02-03 02:19:38 +08:00
c80c0962dd Update info.json 2025-02-03 02:14:16 +08:00
63c223b237 Update install.sh 2025-02-03 02:13:02 +08:00
07aa49accc Update install.sh 2025-02-03 02:12:51 +08:00
c595c541fb lam 2025-02-03 02:09:45 +08:00
e6ec8b65ce Update index.py 2025-02-03 01:41:52 +08:00
bc8c455094 Update index.py 2025-02-03 01:39:51 +08:00
507820d25e Update index.py 2025-02-03 01:31:31 +08:00
35e08295ce Update install.sh 2025-02-03 01:28:16 +08:00
9e581d8608 update 2025-02-03 01:25:59 +08:00
dcb8e69aac Create install_debian.sh 2025-01-29 01:15:38 +08:00
617b354d03 update 2025-01-28 23:41:26 +08:00
76b095b344 Update config.php 2025-01-28 23:25:36 +08:00
Mr Chen
5ff05e8025 Merge pull request #700 from midoks/dev
网站防串改优化
2025-01-28 22:18:07 +08:00
b973a16247 Update tamper_proof_service.py 2025-01-28 22:06:29 +08:00
0cb5d7507f Update tamper_proof_py.service.tpl 2025-01-28 22:03:11 +08:00
2851ebf126 Update tamper_proof_service.py 2025-01-28 22:01:28 +08:00
2f5b1bb205 update 2025-01-28 22:01:05 +08:00
5528336698 Update tamper_proof_service.py 2025-01-28 21:52:13 +08:00
4eda80baa8 Update tamper_proof_service.py 2025-01-28 21:47:48 +08:00
02918d4bcd Update install.sh 2025-01-28 21:39:22 +08:00
8315e3ea96 Update phplib.conf 2025-01-28 17:12:43 +08:00
cae4a2ee13 update 2025-01-28 17:09:49 +08:00
26762eee73 Update phpldapadmin.js 2025-01-28 17:09:03 +08:00
2f05fb12a0 Update ico.png 2025-01-28 17:06:15 +08:00
befdf2e1d3 Update info.json 2025-01-28 16:58:42 +08:00
aac7b98913 Update phplib.conf 2025-01-28 16:55:15 +08:00
baa9b5e6bb Update phplib.conf 2025-01-28 16:52:09 +08:00
99c919811a Update phplib.conf 2025-01-28 16:51:03 +08:00
ac7a4e739e Create ldap.sh 2025-01-28 16:49:26 +08:00
f8936aa7bc Update install.sh 2025-01-28 16:44:36 +08:00
6933c44571 Update index.py 2025-01-28 16:40:20 +08:00
dfb2f4b3af Update index.py 2025-01-28 16:38:19 +08:00
6601aebddf Update index.py 2025-01-28 16:36:04 +08:00
4d2ca9587d update 2025-01-28 16:35:10 +08:00
694a5ceab2 Update index.py 2025-01-28 16:25:53 +08:00
e522093f6c update 2025-01-28 16:25:04 +08:00
feefa2e90a Update install.sh 2025-01-28 16:19:13 +08:00
3709569cd8 Update install.sh 2025-01-28 16:18:51 +08:00
052b4870bf Update install.sh 2025-01-28 16:17:35 +08:00
5cb413a911 Update install.sh 2025-01-28 16:13:36 +08:00
80e77dda3f update 2025-01-28 16:12:32 +08:00
7a3d554d6c Update index.py 2025-01-28 16:09:59 +08:00
ab0fb063cf update 2025-01-28 16:08:01 +08:00
caec558bea Update install.sh 2025-01-28 15:52:04 +08:00
2d44b62fef Update install.sh 2025-01-28 15:50:54 +08:00
f9cc72ba4a update 2025-01-28 15:48:26 +08:00
f8544d0600 update 2025-01-28 15:47:37 +08:00
c96d361b4d Update install.sh 2025-01-28 15:43:27 +08:00
fa5305f332 up 2025-01-28 15:42:56 +08:00
b996bdea93 update 2025-01-28 15:37:08 +08:00
1bae6538f7 Update index.html 2025-01-28 15:36:30 +08:00
5673964de4 Update index.py 2025-01-28 15:33:41 +08:00
25623170bb update 2025-01-28 15:33:14 +08:00
2aa5739cd8 update 2025-01-28 15:31:34 +08:00
bdff56843f Update index.py 2025-01-28 15:23:45 +08:00
6e563e6d74 Update index.py 2025-01-28 15:23:30 +08:00
334a3fb6fe update 2025-01-28 15:20:20 +08:00
a1d130a674 up 2025-01-28 15:02:06 +08:00
e14f2ea247 Update index.py 2025-01-28 14:59:57 +08:00
3f478eef8e Update install.sh 2025-01-28 14:55:42 +08:00
e929274b51 up 2025-01-28 14:47:07 +08:00
526c0301f6 Update tamper_proof_service.py 2025-01-28 12:54:53 +08:00
7e7a19829d Update ubuntu.sh 2025-01-24 17:05:44 +08:00
bc3854b4c4 Update debian.sh 2025-01-24 17:05:31 +08:00
193bf20a3e Update nginx.conf 2025-01-24 16:01:40 +08:00
Mr Chen
4cc5194939 Merge pull request #698 from midoks/dev
openresty配置优化
2025-01-24 15:49:23 +08:00
46a525ae09 Update index.py 2025-01-24 15:42:51 +08:00
6d006a357e Update nginx.conf 2025-01-24 14:28:10 +08:00
fad73b0922 Update push_notice_msg.py 2025-01-17 23:06:40 +08:00
d2d2d4658e update 2025-01-14 18:39:36 +08:00
84e6ce2b48 ad 2025-01-14 18:37:58 +08:00
b91a9963e2 update 2025-01-14 15:49:03 +08:00
Mr Chen
25fcf93185 Merge pull request #697 from midoks/dev
PHP国内安装优化
2025-01-13 00:07:12 +08:00
Mr Chen
26bb2005c1 Merge pull request #696 from jyeric/patch-1
Fix: Unable to move
2025-01-12 23:58:01 +08:00
jyeric
ee58805ae9 Fix: Unable to move 2025-01-12 03:49:32 +08:00
1bfc02a892 Update install.sh 2025-01-10 23:15:01 +08:00
0c7dc4dbee up 2025-01-10 23:14:18 +08:00
42e9859ccb Update install.sh 2025-01-10 23:13:23 +08:00
bf9b6b6046 up 2025-01-10 23:12:56 +08:00
Mr Chen
c10eac5190 Merge pull request #694 from midoks/dev
rsyncd优化
2025-01-10 12:13:07 +08:00
d01ccf1208 Update rsyncd.js 2025-01-10 12:10:06 +08:00
703b9be83e Update rsyncd.js 2025-01-10 12:07:03 +08:00
e0fea93983 update 2025-01-10 12:04:30 +08:00
84ceef47cb Update index.py 2025-01-10 11:48:20 +08:00
255ed5944f Update file.py 2025-01-10 11:36:54 +08:00
Mr Chen
0dc2b635ae Merge pull request #693 from midoks/dev
rsyncd同步-接收优化2
2025-01-08 19:46:41 +08:00
ebd1cfe203 Update index.py 2025-01-08 19:45:32 +08:00
Mr Chen
43b9297476 Merge pull request #692 from midoks/dev
冲突解决
2025-01-08 15:18:39 +08:00
aa2f4a0167 Merge branch 'master' into dev 2025-01-08 15:17:30 +08:00
Mr Chen
ad31d046d4 Merge pull request #691 from midoks/dev
rsyncd同步-接收优化
2025-01-08 15:10:57 +08:00
a67ad5a7db Update rsyncd.js 2025-01-08 15:07:49 +08:00
90d4fb245a Update rsyncd.js 2025-01-08 15:06:16 +08:00
19f55fde6e Update rsyncd.js 2025-01-08 15:03:16 +08:00
227be5258e up 2025-01-08 15:01:48 +08:00
Mr Chen
913190bfeb Merge pull request #690 from midoks/dev
细节优化
2025-01-08 13:05:46 +08:00
0b0097f367 Update mw.py 2025-01-08 13:03:13 +08:00
Mr Chen
97ac8264f2 Merge pull request #689 from midoks/dev
Update monitor.html
2025-01-08 00:31:54 +08:00
d9cca6ccc9 Update monitor.html 2025-01-07 23:53:38 +08:00
Mr Chen
28d0b1fd25 Merge pull request #688 from midoks/dev
修复-错误账户登录不能反应的问题2
2025-01-07 18:52:22 +08:00
cbcfe4cb9d Update login.py 2025-01-07 18:51:03 +08:00
Mr Chen
70c14d3369 Merge pull request #687 from midoks/dev
修复-错误账户登录不能反应的问题
2025-01-07 18:44:22 +08:00
0bcf7edab5 Update login.py 2025-01-07 18:43:39 +08:00
0f410c29f7 Update login.py 2025-01-07 18:37:57 +08:00
b451a6da25 错误登录判断 2025-01-07 18:37:24 +08:00
Mr Chen
e6c7bc1544 Merge pull request #686 from midoks/dev
php openssl编译优化
2025-01-07 17:10:58 +08:00
d1ff8f1cac update 2025-01-07 17:06:45 +08:00
d967100c14 update 2025-01-07 16:25:52 +08:00
8461c20e40 update 2025-01-07 16:24:39 +08:00
Mr Chen
52924f06d2 Merge pull request #684 from midoks/dev
增加命令-修改面板ip
2025-01-07 01:38:47 +08:00
fad4e7bd7d update 2025-01-07 01:36:17 +08:00
Mr Chen
666ee1a083 Merge pull request #683 from midoks/dev
修复计划任务-每星期修改
2025-01-06 22:00:20 +08:00
8f05e47363 修复计划任务-每星期修改 2025-01-06 21:58:31 +08:00
Mr Chen
67d8abf7bf Merge pull request #682 from midoks/dev
反向代理优化
2025-01-06 11:39:43 +08:00
30842a6659 Update site.py 2025-01-06 11:34:56 +08:00
3ee500d339 Update alist.tpl 2025-01-05 21:57:31 +08:00
Mr Chen
c5ade905b0 Merge pull request #681 from midoks/dev
php mysql_xdevapi 在debian下载安装优化
2025-01-04 16:13:45 +08:00
8e6784bf21 update 2025-01-04 16:10:44 +08:00
4eacbca674 update 2025-01-04 16:09:04 +08:00
Mr Chen
149fe72324 Merge pull request #680 from midoks/dev
关于phpmyadmin无法连接高级版本的问题【已解决】
2025-01-04 13:18:37 +08:00
43f752afbc update 2025-01-04 13:01:57 +08:00
19efde1fda update 2025-01-04 13:00:43 +08:00
98f267057b Update app_start.php 2025-01-04 12:59:22 +08:00
4f98894ce4 Update app_start.php 2025-01-04 12:56:24 +08:00
8cb225779e Update app_start.php 2025-01-04 12:55:45 +08:00
57ff303c39 Update phplib.conf 2025-01-04 12:50:55 +08:00
29cae6ae6c Update phplib.conf 2025-01-04 12:50:45 +08:00
e0c761bdf0 Update index.py 2025-01-04 12:46:07 +08:00
6ee1a8dc52 Update mw.py 2025-01-04 12:41:57 +08:00
db69532dde Update openssl.sh 2025-01-04 12:12:23 +08:00
d4c47c16e4 Update all_test.sh 2025-01-04 11:56:03 +08:00
a28733521b update 2025-01-04 11:54:00 +08:00
b957595944 update 2025-01-04 11:53:20 +08:00
b985d42336 update 2025-01-04 11:48:08 +08:00
9d467a13bb Update index_php.py 2025-01-04 05:33:40 +08:00
4629d39980 Update index_php.py 2025-01-04 05:23:14 +08:00
11d245dadf Update index_php.py 2025-01-04 05:22:19 +08:00
bb72b53f19 Update openssl.sh 2025-01-04 04:57:54 +08:00
3bef89d625 update 2025-01-04 04:39:37 +08:00
792b1348c1 Update openssl.sh 2025-01-04 04:06:12 +08:00
7399cd7d45 Update install.sh 2025-01-04 03:39:54 +08:00
d6347f6d4a update 2025-01-04 03:24:04 +08:00
3b5585193f update 2025-01-04 03:22:56 +08:00
5efa218247 Update install.sh 2025-01-04 03:20:18 +08:00
e5d312dbf9 Update install.sh 2025-01-04 03:19:49 +08:00
38e1c07e0b Update install.sh 2025-01-04 02:50:14 +08:00
809c9ea237 update 2025-01-04 02:37:28 +08:00
08a41f039b Update install.sh 2025-01-04 02:27:18 +08:00
3dd14307d0 Update install.sh 2025-01-04 02:25:30 +08:00
4122c11372 Update my8.0.cnf 2025-01-04 02:02:24 +08:00
9360a9cd68 Update my8.0.cnf 2025-01-04 01:48:01 +08:00
24746dab08 update 2025-01-04 01:37:10 +08:00
8879cba15d Update install.sh 2025-01-04 01:17:39 +08:00
Mr Chen
1b38c60f57 Merge pull request #679 from midoks/dev
时区接口与phpmyadmin/mysql[Tar]优化
2025-01-04 00:35:56 +08:00
7c944b27dd update 2025-01-04 00:26:31 +08:00
523e54eeb2 Update index.py 2025-01-03 23:54:04 +08:00
7b08a3f1bc Update mysql-community.js 2025-01-03 23:49:22 +08:00
018826e1a3 Update phpmyadmin.js 2025-01-03 23:47:02 +08:00
Mr Chen
a36b0b78b3 Merge pull request #678 from midoks/dev
修复phpmysqladmin插件
2025-01-03 22:42:44 +08:00
19964d39c1 Update phpmyadmin.js 2025-01-03 22:35:36 +08:00
31fd04456b update 2025-01-03 22:21:02 +08:00
76cf2e8fa5 update 2025-01-03 22:15:01 +08:00
f6b61c935e Update index.py 2025-01-03 22:12:47 +08:00
c736a04b4f Update debian.sh 2024-12-31 00:34:08 +08:00
14432fd6f9 Update install.sh 2024-12-27 17:40:13 +08:00
Mr Chen
047d84acb5 Merge pull request #676 from midoks/dev
面板修改用户名修复
2024-12-26 19:55:51 +08:00
8de4e6a0ee Update user.py 2024-12-26 19:54:37 +08:00
90fbb0e9ac Update requirements.txt 2024-12-26 19:07:19 +08:00
041f36ba00 Update requirements.txt 2024-12-26 19:04:48 +08:00
9e6cc873cb Update update.sh 2024-12-26 18:06:46 +08:00
20a6ced7b5 Update update.sh 2024-12-26 18:04:28 +08:00
34d9682cc1 Update update.sh 2024-12-26 18:02:38 +08:00
4ac797406a Update update.sh 2024-12-26 18:00:42 +08:00
bb3cdb5d85 Update update.sh 2024-12-26 17:56:43 +08:00
Mr Chen
245923d825 Merge pull request #675 from midoks/dev
兼容问题
2024-12-25 21:25:07 +08:00
41c048594e Update files.js 2024-12-25 21:21:54 +08:00
1360d2d066 Update files.js 2024-12-25 21:19:53 +08:00
Mr Chen
6286f03432 Merge pull request #674 from midoks/dev
网站目录 选择优化
2024-12-25 16:50:45 +08:00
c7a99cc61b Update files.py 2024-12-25 16:49:31 +08:00
e4aae5147c Update files.py 2024-12-25 16:35:35 +08:00
2a2e37ca97 Update public.js 2024-12-25 16:32:40 +08:00
a1489959d1 Update site.py 2024-12-25 16:02:41 +08:00
4561e37167 Update site.py 2024-12-25 15:58:52 +08:00
9fa04c9a90 Update site.py 2024-12-25 15:58:07 +08:00
aa4951b7fc Update site.py 2024-12-25 15:53:46 +08:00
53d08c261c Update site.py 2024-12-25 15:53:30 +08:00
74058243c6 Update site.py 2024-12-25 15:40:24 +08:00
62223d53be Update php.py 2024-12-25 15:29:35 +08:00
Mr Chen
06d33758eb Merge pull request #673 from midoks/dev
低版本兼容
2024-12-25 15:04:10 +08:00
af85245b06 Update site.js 2024-12-25 14:56:40 +08:00
01d8ebbd40 update 2024-12-25 14:52:57 +08:00
1c1cd1f434 Update site.js 2024-12-25 14:51:18 +08:00
Mr Chen
aaa801964c Merge pull request #672 from midoks/dev
创建站点兼容问题
2024-12-25 13:00:32 +08:00
01b490dff1 update 2024-12-25 12:52:41 +08:00
Mr Chen
1be1441352 Merge pull request #671 from midoks/dev
防火墙ssh修改端口修复
2024-12-24 23:08:09 +08:00
0b47b56fb5 Update firewall.py 2024-12-24 23:05:46 +08:00
0a1251ad0b Update firewall.py 2024-12-24 23:05:27 +08:00
Mr Chen
a506bebc94 Merge pull request #670 from midoks/dev
防火墙添加优化
2024-12-24 22:31:27 +08:00
26147acfa0 Update firewall.html 2024-12-24 22:27:10 +08:00
Mr Chen
f1d0be9f61 Merge pull request #669 from midoks/dev
兼容问题
2024-12-24 19:54:58 +08:00
45c1e9d28c Update r3.7.txt 2024-12-24 19:52:23 +08:00
Mr Chen
df3db9e632 Merge pull request #667 from midoks/dev
修复反向代理设置问题
2024-12-24 02:45:39 +08:00
8c1e672da7 Update site.py 2024-12-24 02:44:41 +08:00
Mr Chen
4bf5e68a9d Merge pull request #666 from midoks/dev
php版本更新及备份优化
2024-12-24 02:16:49 +08:00
0d4b157b1b Update backup.py 2024-12-24 02:14:20 +08:00
5fd207c84c Update backup.py 2024-12-24 02:14:01 +08:00
6829baba67 Update install.sh 2024-12-23 21:43:22 +08:00
b9983929fc update 2024-12-23 21:42:52 +08:00
Mr Chen
d540e7497b Merge pull request #664 from midoks/dev
站点页面和计划页面登录检查
2024-12-22 18:51:31 +08:00
0e0cc248fa 站点页面和计划页面登录检查 2024-12-22 18:50:58 +08:00
bcf6808e49 Update site.py 2024-12-22 01:33:19 +08:00
e2e27765ee Update site.py 2024-12-22 01:33:08 +08:00
f3b07bda65 Update site.py 2024-12-22 01:03:56 +08:00
Mr Chen
f555f1084f Merge pull request #663 from midoks/dev
@ramondelee 专用功能
2024-12-22 00:37:20 +08:00
212be88efe Update site.js 2024-12-22 00:36:29 +08:00
c131f0ecda Update site.js 2024-12-21 23:12:03 +08:00
Mr Chen
e3afb4b481 Merge pull request #662 from midoks/dev
acme手动验证
2024-12-21 20:32:05 +08:00
ca61f70d37 gorse便捷功能 2024-12-21 20:27:51 +08:00
90850ebfa3 Update site.js 2024-12-21 18:59:46 +08:00
771a6d6e08 Update site.js 2024-12-21 18:59:06 +08:00
55a6d17bc8 Update site.py 2024-12-21 18:35:01 +08:00
649990f2e1 update 2024-12-21 18:19:58 +08:00
48468a1c2d 右键解压方法缺失 2024-12-21 17:06:08 +08:00
dd685b664d acme手动申请ssl 2024-12-21 15:10:39 +08:00
36898e3e11 update 2024-12-21 14:19:53 +08:00
737450ba6e Update ssl_acme.py 2024-12-21 14:15:35 +08:00
0f63145319 Update rhel.sh 2024-12-21 00:50:29 +08:00
6a942db113 Update ubuntu.sh 2024-12-21 00:41:42 +08:00
6119adbe2d Update debian.sh 2024-12-21 00:41:39 +08:00
c31af5cbf4 Update mw.tpl 2024-12-21 00:21:52 +08:00
784629f11b Update cli.sh 2024-12-21 00:17:28 +08:00
Mr Chen
a581b7cdef Merge pull request #659 from midoks/dev
文件大小功能优化
2024-12-20 00:02:37 +08:00
d6918621fa Update files.py 2024-12-19 23:55:16 +08:00
dc54ec241e update 2024-12-19 23:49:57 +08:00
2f94674479 Update index.py 2024-12-19 23:28:22 +08:00
10b94514a7 update 2024-12-19 23:10:55 +08:00
Mr Chen
f5eacd6016 Merge pull request #658 from midoks/dev
插件优化
2024-12-19 17:28:03 +08:00
7383317f0b Merge branch 'master' into dev 2024-12-19 17:27:20 +08:00
26fa9378f5 Update README.md 2024-12-19 17:26:57 +08:00
9f37033e5c Update plugin.py 2024-12-19 17:24:34 +08:00
dc4ff9b694 Update info.json 2024-12-19 17:12:49 +08:00
3c9dc0a127 Update info.json 2024-12-19 17:09:48 +08:00
2afbe1c6fd Merge branch 'master' into dev 2024-12-19 16:38:36 +08:00
Mr Chen
309b5b9563 Merge pull request #657 from midoks/dev
插件位置调整
2024-12-19 16:38:22 +08:00
f64f0ebf4e Update info.json 2024-12-19 16:36:55 +08:00
dd646a155b Update info.json 2024-12-19 16:36:09 +08:00
6db38826d8 update 2024-12-19 16:34:14 +08:00
a18fd9b05c Update info.json 2024-12-19 16:32:27 +08:00
611c7b7b21 update 2024-12-19 16:32:06 +08:00
3961e95a5f update 2024-12-19 16:29:44 +08:00
d6e6a53301 update 2024-12-19 16:26:32 +08:00
e500026017 Update info.json 2024-12-19 16:25:03 +08:00
84632b6296 Update info.json 2024-12-19 16:24:44 +08:00
9b79e93967 Update info.json 2024-12-19 16:22:27 +08:00
Mr Chen
88e7ad0411 Merge pull request #656 from midoks/dev
mysql 快速安装 针对ubuntu24进行优化
2024-12-19 16:15:24 +08:00
d0e96eab91 Update install.sh 2024-12-19 16:13:13 +08:00
6ac78d9eb6 Update install.sh 2024-12-19 16:06:51 +08:00
5d830ae2f8 Update install.sh 2024-12-19 16:01:52 +08:00
178f844420 Update install.sh 2024-12-19 16:01:32 +08:00
adf3df510e Update install.sh 2024-12-19 16:01:12 +08:00
f58c03c429 Update install.sh 2024-12-19 16:00:05 +08:00
15f9edc5c7 Update install.sh 2024-12-19 15:59:22 +08:00
07f77024ab update 2024-12-19 15:57:26 +08:00
5b8ff7e612 Update ubuntu.sh 2024-12-19 15:30:57 +08:00
Mr Chen
1182e7405e Merge pull request #655 from midoks/dev
mw命令添加
2024-12-19 15:25:34 +08:00
9c6d8ef8e6 Update mw.tpl 2024-12-19 15:24:05 +08:00
eb807fb205 Update mw.tpl 2024-12-19 15:22:37 +08:00
Mr Chen
0602fb5569 Merge pull request #654 from midoks/dev
代理优化2
2024-12-19 15:14:41 +08:00
1dd78c3ea1 Update site.py 2024-12-19 15:11:56 +08:00
3175de4576 Update version.py 2024-12-19 15:11:00 +08:00
dfd1f172bb Update site.py 2024-12-19 15:09:42 +08:00
Mr Chen
0f6cf01fd3 Merge pull request #653 from midoks/dev
代理配置优化
2024-12-19 15:05:36 +08:00
3e9e7922b4 Update site.py 2024-12-19 15:01:19 +08:00
eb480c8838 update 2024-12-19 14:43:59 +08:00
a9bc4fe914 Update site.py 2024-12-19 14:21:39 +08:00
3bf1573e36 Update site.py 2024-12-19 14:20:39 +08:00
de6fd60f41 Update site.py 2024-12-19 14:19:17 +08:00
cf72ebdfd8 Update site.py 2024-12-19 14:17:22 +08:00
6e44452807 Update site.py 2024-12-19 14:17:12 +08:00
88c6abb53c Update site.py 2024-12-19 14:14:13 +08:00
27fd93f590 Update site.py 2024-12-19 14:09:25 +08:00
8b391f03c2 Update site.py 2024-12-19 14:08:59 +08:00
ea3033e22a Update site.py 2024-12-19 14:07:29 +08:00
Mr Chen
c88dff350e Merge pull request #652 from midoks/dev
站点代理+跨域设置
2024-12-18 19:36:08 +03:00
73e1a312b5 Update version.py 2024-12-19 00:31:08 +08:00
28c2b6dc77 Update site.py 2024-12-19 00:29:49 +08:00
0348cc55c6 update 2024-12-19 00:13:22 +08:00
e439918e05 Update site.js 2024-12-18 23:18:25 +08:00
Mr Chen
a5a7f405b3 Merge pull request #651 from midoks/dev
代理/重定向功能修复
2024-12-18 18:03:34 +03:00
4cd620fe2b update 2024-12-18 23:01:38 +08:00
b1826a60d2 Update proxy.py 2024-12-18 22:54:46 +08:00
50ec1c59d2 设置手动代理配置 2024-12-18 22:53:02 +08:00
36d604ec49 Update site.py 2024-12-18 22:47:21 +08:00
Mr Chen
7d6407afcf Merge pull request #650 from midoks/dev
Update README.md
2024-12-18 17:43:34 +08:00
92358db548 Update README.md 2024-12-18 17:34:37 +08:00
Mr Chen
161c6a69b1 Merge pull request #649 from midoks/dev
gdrive优化
2024-12-18 16:15:07 +08:00
215e053b6d update 2024-12-18 16:10:08 +08:00
e8a99af37f Update install.sh 2024-12-18 15:50:07 +08:00
de258a2568 Update install.sh 2024-12-18 15:49:40 +08:00
728db39ab7 update 2024-12-18 14:54:35 +08:00
Mr Chen
d885870302 Merge pull request #648 from midoks/dev
监控开启设置修复
2024-12-18 14:35:25 +08:00
2c87079686 Update system.py 2024-12-18 14:34:28 +08:00
e89785c1d2 Update mw.tpl 2024-12-18 14:13:28 +08:00
38f8eff1c5 Update mw.tpl 2024-12-18 14:12:07 +08:00
077394ec99 Update mw.tpl 2024-12-18 14:11:30 +08:00
7c23f85f75 Update mw.tpl 2024-12-18 14:09:24 +08:00
Mr Chen
20c1ceab92 Merge pull request #647 from midoks/dev
valkey命令加入
2024-12-18 12:21:13 +08:00
e5585caa09 Update version.py 2024-12-18 12:20:42 +08:00
a11b49befe update 2024-12-18 12:17:36 +08:00
Mr Chen
58027e4607 Merge pull request #646 from midoks/dev
valkey插件,redis的平替
2024-12-18 02:14:54 +08:00
1285641746 Update index.py 2024-12-18 02:02:51 +08:00
843ac18d2d Update valkey.conf 2024-12-18 01:56:03 +08:00
4383a202f2 update 2024-12-18 01:55:29 +08:00
cda412f6a9 update 2024-12-18 01:39:54 +08:00
f26b84c799 Update index.py 2024-12-18 01:39:07 +08:00
2fc3fd3ef1 update 2024-12-18 01:38:22 +08:00
57d04de8a5 Update redis.js 2024-12-18 01:38:14 +08:00
3e43c22a42 valkey,redis的平替 2024-12-18 01:33:46 +08:00
ea643b58d8 update 2024-12-18 01:21:14 +08:00
d366490fe5 update 2024-12-18 01:18:45 +08:00
83093f4c85 Update plugin.py 2024-12-18 01:15:33 +08:00
Mr Chen
99fcfa5223 Merge pull request #645 from midoks/dev
面板安装脚本优化
2024-12-18 00:30:35 +08:00
f6786b367b Update sql_mysql.py 2024-12-18 00:20:40 +08:00
eb373af6ed update 2024-12-18 00:18:18 +08:00
037e7e907b Update README.md 2024-12-18 00:09:08 +08:00
80844562e9 Update README.md 2024-12-18 00:07:06 +08:00
2a935845bf Update README.md 2024-12-17 23:54:44 +08:00
Mr Chen
3acbad4606 Merge pull request #644 from midoks/dev
更改/合并mysql快速安装方式
2024-12-17 23:35:13 +08:00
1973f6a2b0 删除冗余mysql插件 2024-12-17 23:33:46 +08:00
85e6a678dd Update sql_mysql.py 2024-12-17 23:20:48 +08:00
798c52f23d Update sql_mysql.py 2024-12-17 23:18:56 +08:00
aee405f9e2 update 2024-12-17 22:49:01 +08:00
f82ff2d482 Update rhel.sh 2024-12-17 22:46:00 +08:00
d9d9721249 Update index.py 2024-12-17 22:38:37 +08:00
8ef84763c6 Update index.py 2024-12-17 22:34:35 +08:00
c4f6db4431 update 2024-12-17 22:32:12 +08:00
60a7e7f885 Update mw.tpl 2024-12-17 22:30:50 +08:00
7e3c36cd27 Update version.py 2024-12-17 22:25:48 +08:00
5304abcd00 Update my5.7.cnf 2024-12-17 22:25:00 +08:00
19d94893cb Update index.py 2024-12-17 22:10:45 +08:00
485424b5c9 Update version.py 2024-12-17 21:43:17 +08:00
a8af7bed62 Update public.js 2024-12-17 21:42:55 +08:00
f63e7df28d Update public.js 2024-12-17 21:41:58 +08:00
7e81da6741 Update version.py 2024-12-17 21:37:25 +08:00
0c8e69c252 Update public.js 2024-12-17 21:36:54 +08:00
da8881dd1e Update version.py 2024-12-17 21:25:47 +08:00
d10c0a2fb9 update 2024-12-17 21:22:40 +08:00
34ed4b2f25 Update public.js 2024-12-17 21:20:32 +08:00
a109b148f6 Update install_generic.sh 2024-12-17 21:03:11 +08:00
65c7eeb9c9 update 2024-12-17 20:58:26 +08:00
e45b9b4101 mysql极速办版优化 2024-12-17 20:48:23 +08:00
8c9bfd7e2d update 2024-12-17 18:03:18 +08:00
208e418bba Update index_mysql_apt.py 2024-12-17 17:41:59 +08:00
05278bdacb Update install_generic.sh 2024-12-17 17:38:01 +08:00
5b11b35d5d Update install_generic.sh 2024-12-17 17:31:21 +08:00
9f5844c4de Update install_generic.sh 2024-12-17 17:29:31 +08:00
ae888e6d48 Update install_generic.sh 2024-12-17 17:22:16 +08:00
f5b4af6e38 Update install_generic.sh 2024-12-17 17:20:32 +08:00
84035e0cb1 Update install_generic.sh 2024-12-17 17:18:55 +08:00
6d5c3e81c8 Update install_generic.sh 2024-12-17 17:17:48 +08:00
16db84793d update 2024-12-17 17:15:27 +08:00
8b8a63c352 update 2024-12-17 17:04:50 +08:00
698cf0d263 update 2024-12-17 17:03:45 +08:00
6385d49eeb Update install_generic.sh 2024-12-17 17:00:49 +08:00
43e69909cd update 2024-12-17 16:59:35 +08:00
aeb0f866c8 Update mysql8.4.service.tpl 2024-12-17 16:39:32 +08:00
3e5c005f25 update_dev 2024-12-17 15:50:31 +08:00
bde27382b7 Update install.sh 2024-12-17 15:40:52 +08:00
Mr Chen
c17df789de Merge pull request #643 from midoks/dev
FTP存储空间 插件 修复
2024-12-17 14:12:48 +08:00
ca6a84fec4 Update index.py 2024-12-17 13:54:26 +08:00
1c952ca4cd update 2024-12-15 04:52:14 +08:00
c2c7073cd9 Create install_debian.sh 2024-12-15 04:44:51 +08:00
Mr Chen
6c84be1a82 Merge pull request #642 from midoks/dev
相关更新
2024-12-15 04:27:12 +08:00
16c90290f9 Update index.py 2024-12-15 04:22:07 +08:00
cf707df5e0 Update install.sh 2024-12-15 04:20:40 +08:00
078f1b763b Update install.sh 2024-12-15 04:18:10 +08:00
6060faa3ac Update install.sh 2024-12-15 04:16:36 +08:00
5059157515 update 2024-12-15 04:11:42 +08:00
49924c6b2b update 2024-12-15 04:08:59 +08:00
6ff1781372 update 2024-12-15 04:01:57 +08:00
29fd4d5220 Create my9.1.cnf 2024-12-15 03:42:32 +08:00
484dc13977 Update mw.tpl 2024-12-15 03:40:59 +08:00
59fc82c788 Create mysql9.1.service.tpl 2024-12-15 03:05:47 +08:00
9a4c9154f1 update 2024-12-15 03:01:57 +08:00
9949bb2493 u 2024-12-15 02:22:12 +08:00
07fc6ac8c4 openssl 2024-12-15 02:18:32 +08:00
6a93c3e90f Update openssl_10.sh 2024-12-15 02:16:31 +08:00
7bd88335c4 Update openssl_30.sh 2024-12-15 02:02:14 +08:00
9893e3bac2 Update index.py 2024-12-15 02:00:51 +08:00
946e886799 update 2024-12-15 02:00:38 +08:00
b84301debc Update openssl_30.sh 2024-12-15 01:56:43 +08:00
cb5c95ce03 Update index.py 2024-12-15 01:49:06 +08:00
c0a7e1ddba uppdate 2024-12-15 01:42:30 +08:00
220af054bb Update index.py 2024-12-15 01:33:29 +08:00
a9634f0249 Update index.py 2024-12-15 01:32:43 +08:00
fd77048d4b Update index.py 2024-12-15 01:30:09 +08:00
40cb632c80 Create my9.1.cnf 2024-12-15 01:23:01 +08:00
2313af825e update 2024-12-15 01:21:44 +08:00
762efdaa9a Update install.sh 2024-12-15 01:19:55 +08:00
b58cafb47a Update install.sh 2024-12-15 01:18:22 +08:00
308d909e72 Update install.sh 2024-12-15 01:17:45 +08:00
c88eb37b1a Update install.sh 2024-12-14 22:16:51 +08:00
e3189d39f4 Update install.sh 2024-12-14 21:55:57 +08:00
Mr Chen
de351c7473 Merge pull request #641 from midoks/dev
修复站点备份目录未指定默认值
2024-12-14 18:40:44 +08:00
9d08b7de34 Update mw.py 2024-12-14 18:35:26 +08:00
5cf0745da0 Update file.py 2024-12-14 18:26:55 +08:00
10009b65be Update file.py 2024-12-14 18:19:31 +08:00
Mr Chen
80c1c0b8b4 Merge pull request #640 from midoks/dev
修复站点根目录未指定默认值
2024-12-14 18:08:19 +08:00
9169d8899f Update mw.py 2024-12-14 18:06:18 +08:00
5166e05dbe 修复未指定默认值 2024-12-14 18:04:47 +08:00
e6e9dcb48c update 2024-12-14 17:15:20 +08:00
Mr Chen
712550cec8 Merge pull request #639 from midoks/dev
广告变价
2024-12-14 17:13:30 +08:00
f9061088fe update 2024-12-14 17:11:46 +08:00
Mr Chen
c53390d038 Merge pull request #638 from midoks/dev
常见优化
2024-12-14 17:04:57 +08:00
6fb93b19c9 Update info.json 2024-12-14 16:50:36 +08:00
e07e8391e1 Update gdrive.js 2024-12-14 16:05:49 +08:00
ccd8c056b1 Update install.sh 2024-12-14 15:12:17 +08:00
32ee0cf14c Update install.sh 2024-12-14 15:10:54 +08:00
9a6c02dd9a Update install.sh 2024-12-14 15:10:31 +08:00
3dd77715d8 update 2024-12-14 15:09:51 +08:00
0f99cdb115 Create install.sh 2024-12-14 15:06:45 +08:00
aecd0726e5 Update info.json 2024-12-14 15:05:33 +08:00
258b3495a1 Update install.sh 2024-12-14 14:56:40 +08:00
eb52d1a79a Update install.sh 2024-12-14 14:54:22 +08:00
1ad16b2b94 Create install.sh 2024-12-14 14:51:37 +08:00
fc28136936 Update panel_tools.py 2024-12-14 13:01:31 +08:00
575f3c9ce4 update 2024-12-14 12:47:20 +08:00
7c9ca83b46 Update install.sh 2024-12-14 12:22:50 +08:00
0d6c4010ff update 2024-12-14 05:14:12 +08:00
cb6d9762d5 Update setting.py 2024-12-14 05:01:43 +08:00
a4414d2083 Update sql_mysql.py 2024-12-14 04:52:14 +08:00
5bcae1b00c Update sql_mysql.py 2024-12-14 04:51:09 +08:00
5c01f36fe7 Update sql_mysql.py 2024-12-14 04:49:44 +08:00
84b7d1123e Update sql_mysql.py 2024-12-14 04:49:21 +08:00
Mr Chen
b819f345cf Merge pull request #637 from midoks/dev
xhprof|安全入口|面板端口命令修复
2024-12-14 02:52:48 +08:00
5278116f49 update 2024-12-14 02:47:59 +08:00
af36366a89 Update panel_tools.py 2024-12-14 02:41:39 +08:00
cabba7e2d2 Update panel_tools.py 2024-12-14 02:41:29 +08:00
ef6cc77dc2 update 2024-12-14 02:40:12 +08:00
4b6de5cd9f Update panel_tools.py 2024-12-14 02:34:07 +08:00
403e35c6c5 Update app_start.php 2024-12-14 02:21:31 +08:00
e1dbdc5886 Update index.py 2024-12-14 01:02:47 +08:00
9e0a64a51f Update index.py 2024-12-14 01:01:47 +08:00
971cc3a42a Update index.py 2024-12-14 00:24:59 +08:00
1c109ee86f Update index.py 2024-12-14 00:24:36 +08:00
b84106ae70 Update index.py 2024-12-14 00:24:23 +08:00
05881be9b9 Update index.py 2024-12-14 00:23:54 +08:00
06a7b3da19 Update index.py 2024-12-14 00:20:14 +08:00
9d77f66e47 update 2024-12-14 00:19:32 +08:00
85afff4848 Update app_start.php 2024-12-13 23:36:16 +08:00
8498eaa16d Update app_start.php 2024-12-13 23:28:48 +08:00
1e78341559 Update index.py 2024-12-13 23:21:05 +08:00
e4ed5a1d19 Update app_start.php 2024-12-13 23:19:00 +08:00
7b247d1e6f Update index.py 2024-12-13 23:13:46 +08:00
f98a7298c5 update 2024-12-13 23:10:04 +08:00
8e4e9ddf62 Update index.py 2024-12-13 23:05:31 +08:00
aea7fbe385 Update public.js 2024-12-13 23:05:26 +08:00
Mr Chen
392442b7b7 Merge pull request #636 from midoks/dev
js 兼容mac文件保存命令
2024-12-13 22:29:23 +08:00
cce3102beb Update public.js 2024-12-13 22:25:35 +08:00
fdf2e3854e Update public.js 2024-12-13 22:18:20 +08:00
Mr Chen
95011544c1 Merge pull request #635 from midoks/dev
修复监控设置不生效问题
2024-12-13 21:28:59 +08:00
fc97eb1c14 Update panel_task.py 2024-12-13 20:50:03 +08:00
fc6ec859fe Update panel_task.py 2024-12-13 20:44:50 +08:00
582ea54ed5 Update panel_task.py 2024-12-13 20:34:36 +08:00
Mr Chen
6caedb5b06 Merge pull request #634 from midoks/dev
gorse安装检测
2024-12-13 03:16:47 +08:00
307135d495 Update index.py 2024-12-13 03:14:28 +08:00
f786be41e7 Update index.py 2024-12-13 03:13:13 +08:00
e18ae543ee Update index.py 2024-12-13 03:07:26 +08:00
ab606e0629 Update index.py 2024-12-13 02:32:45 +08:00
b6cda24231 Update install.sh 2024-12-13 02:20:25 +08:00
ad4714418d Update install.sh 2024-12-13 02:19:11 +08:00
Mr Chen
a77e37ac65 Merge pull request #633 from midoks/dev
Update site.py
2024-12-13 01:16:03 +08:00
296b1cfe86 Update site.py 2024-12-13 01:14:25 +08:00
Mr Chen
c225570c00 Merge pull request #632 from midoks/dev
0.18.0
2024-12-12 23:29:56 +08:00
4b1db3d02f 0.18.0
### 版本更新 0.18.0

- 重新架构面板。
- PHP84正式版。
- 加入alist插件。
- 数据管理-常用命令。
- 插件读取优化(加入缓存+定时检查状态)。
- 恢复面板书签。
- 常规更新。
2024-12-12 23:28:49 +08:00
c358954e6d Update version.py 2024-12-12 23:27:19 +08:00
cfea5d498f Update dashboard.py 2024-12-12 23:26:32 +08:00
e69136534b Update install.sh 2024-12-12 23:00:41 +08:00
400ecfe690 Update alist.js 2024-12-12 22:23:45 +08:00
c64287fd51 Update index.py 2024-12-12 22:23:05 +08:00
0edc306aa8 Update index.py 2024-12-12 22:22:47 +08:00
839fec3a79 Update index.py 2024-12-12 22:15:39 +08:00
db2aab88f4 Update site.py 2024-12-12 17:43:26 +08:00
a5195956c2 Update sql_mysql.py 2024-12-12 12:41:55 +08:00
fc0b79f018 Update orm.py 2024-12-12 12:38:30 +08:00
1b42bafc49 Update php.py 2024-12-12 04:19:00 +08:00
83a2ea9b4e Update logs.py 2024-12-12 02:11:12 +08:00
4bf5fd712d Update sql_mysql.py 2024-12-11 20:15:42 +08:00
8a42898afe Update sql_mysql.py 2024-12-11 19:54:31 +08:00
6577b37b76 Update plugin.py 2024-12-11 18:56:53 +08:00
ccb02f14a6 update 2024-12-11 18:56:37 +08:00
0bd476340a Update install.sh 2024-12-11 14:26:01 +08:00
84c9436546 Update plugin.py 2024-12-11 14:03:47 +08:00
e9d220b54d Update plugin.py 2024-12-11 14:03:34 +08:00
adecec811e Update Dockerfile 2024-12-11 13:35:10 +08:00
c3285f8b2e Update panel_tools.py 2024-12-11 12:11:04 +08:00
864b5bb985 Update panel_tools.py 2024-12-11 12:10:42 +08:00
39bf6b811a Update python-app-php.yml 2024-12-11 12:01:43 +08:00
c7d0744fa3 Update python-app-op.yml 2024-12-11 11:43:08 +08:00
726cdd8dc7 Update python-app-op.yml 2024-12-11 00:04:55 +08:00
93f895d4e4 Update python-app-op.yml 2024-12-11 00:04:02 +08:00
00ed75502b Update python-app-php.yml 2024-12-10 23:55:14 +08:00
a4b1ca831e Update python-app-php.yml 2024-12-10 23:37:16 +08:00
18e59c9538 Update panel_tools.py 2024-12-10 23:24:07 +08:00
3fa51efd16 Update panel_tools.py 2024-12-10 23:23:57 +08:00
fcd747c4a5 Update panel_tools.py 2024-12-10 23:22:54 +08:00
4d9dd26337 Update panel_tools.py 2024-12-10 23:22:07 +08:00
7996722f04 Update setting.py 2024-12-10 22:33:27 +08:00
b0aa889a1f Update setting.py 2024-12-10 22:25:59 +08:00
4b1d6acb77 Update panel_tools.py 2024-12-10 22:17:21 +08:00
d00da44fcb update 2024-12-10 22:13:20 +08:00
1da7d08887 update 2024-12-10 21:27:30 +08:00
a04d24d410 update 2024-12-10 21:22:42 +08:00
055422bac9 update 2024-12-10 19:56:26 +08:00
4e09a802b0 update 2024-12-10 19:31:15 +08:00
a66bab02ab update 2024-12-10 19:20:19 +08:00
d217ebfc4f Update php.js 2024-12-10 19:05:09 +08:00
31cafa59ab Update index.py 2024-12-10 18:50:06 +08:00
c66b9794ee Update php.js 2024-12-10 18:40:29 +08:00
ddd3d3a33a Update version.py 2024-12-10 18:36:04 +08:00
7816dbf264 Update public.js 2024-12-10 18:35:57 +08:00
f78279a271 update 2024-12-10 18:34:21 +08:00
411174c07c Update public.js 2024-12-10 18:27:27 +08:00
28988eff93 Update public.js 2024-12-10 18:26:19 +08:00
5ee9a6790e update 2024-12-10 18:25:52 +08:00
6cce658ea3 Update public.js 2024-12-10 18:24:51 +08:00
3c54e7943b Update php.js 2024-12-10 18:21:17 +08:00
c0923f7d4f Update index.py 2024-12-10 18:15:05 +08:00
7973d369cc update 2024-12-10 18:05:43 +08:00
2b70534fb2 update 2024-12-10 18:00:09 +08:00
1d0a4c371c update 2024-12-10 17:42:51 +08:00
18eee3f8e8 Update firewall.py 2024-12-10 16:49:12 +08:00
2ae280e6c9 Update firewall.py 2024-12-10 16:48:42 +08:00
baf56d71e9 Update phplib.conf 2024-12-10 15:54:48 +08:00
fe6649a0a5 update 2024-12-10 15:51:15 +08:00
452623a56e Update README.md 2024-12-10 15:33:44 +08:00
a361c31c11 Update push_notice_msg.py 2024-12-10 15:22:51 +08:00
fb15ca1d76 Update push_ad.py 2024-12-10 15:22:23 +08:00
3d319c7c76 update 2024-12-10 15:17:22 +08:00
069bef1f0d Update igbinary.sh 2024-12-10 14:56:36 +08:00
3b0e624d92 Update README.md 2024-12-10 14:54:14 +08:00
ee13c8f519 Update solr.sh 2024-12-10 14:44:52 +08:00
51eff5f671 Update yaml.sh 2024-12-10 14:43:32 +08:00
e544ba53b5 Update yaf.sh 2024-12-10 14:40:43 +08:00
e28a7124a2 Update yaf.sh 2024-12-10 14:39:03 +08:00
dd0c46286c Update swoole.sh 2024-12-10 14:37:46 +08:00
a1b39dcff5 Update site.py 2024-12-10 14:26:02 +08:00
a3022c7f80 Update site.py 2024-12-10 14:24:40 +08:00
f16dfd6819 update 2024-12-10 14:22:59 +08:00
9f2bc6e0e1 Update phplib.conf 2024-12-10 05:30:44 +08:00
f2c4831786 update 2024-12-10 04:29:32 +08:00
3f5b6a0b00 Update panel_bookmark.py 2024-12-10 04:18:21 +08:00
1bf02abc1d Update __init__.py 2024-12-10 03:23:19 +08:00
5dcf932a81 Update __init__.py 2024-12-10 03:15:26 +08:00
f2f02e4b1b update 2024-12-10 03:14:06 +08:00
47ce5e05bc Update plugin.py 2024-12-10 03:10:48 +08:00
e878f79ffc up 2024-12-10 02:57:58 +08:00
5e6774ee63 Update version.py 2024-12-10 02:52:44 +08:00
ec4c3f3574 Update public.js 2024-12-10 02:52:35 +08:00
e7e9379c09 update 2024-12-10 02:30:07 +08:00
65c303272c update 2024-12-10 02:23:49 +08:00
2be356a875 Update readline.sh 2024-12-10 02:05:33 +08:00
d60e1291c8 Update version.py 2024-12-10 00:35:02 +08:00
ae342c71a7 Update public.js 2024-12-10 00:27:47 +08:00
ec79bfc93b Update openssl.sh 2024-12-10 00:12:26 +08:00
f3006b55b3 Update phplib.conf 2024-12-10 00:02:06 +08:00
08aa864fa0 Update install.sh 2024-12-09 23:29:57 +08:00
93b39f4fb0 Update phplib.conf 2024-12-09 23:28:34 +08:00
b189241745 update 2024-12-09 23:25:45 +08:00
3206e62583 update 2024-12-09 23:19:53 +08:00
299b216c48 Update phplib.conf 2024-12-09 23:15:39 +08:00
fe53068055 Update zip.sh 2024-12-09 23:12:27 +08:00
0a8b921327 Update phplib.conf 2024-12-09 23:10:59 +08:00
1119371bdb Update phplib.conf 2024-12-09 22:58:25 +08:00
980129a8ec Update phplib.conf 2024-12-09 22:58:19 +08:00
5554ff3350 update 2024-12-09 22:49:39 +08:00
3fd55fd5de Update sql_mysql.py 2024-12-09 20:11:02 +08:00
d4f9f5bcfd Update sql_mysql.py 2024-12-09 20:08:18 +08:00
318cba0d43 Update sql_mysql.py 2024-12-09 20:07:41 +08:00
173aae22b4 Update app.js 2024-12-09 19:59:01 +08:00
f86e30634d Update app.js 2024-12-09 19:55:27 +08:00
6f9b9bbbc1 Update sql_mysql.py 2024-12-09 19:48:30 +08:00
fa7ad33474 Update sql_mysql.py 2024-12-09 19:46:13 +08:00
834978adfd Update sql_mysql.py 2024-12-09 19:45:21 +08:00
e70fa6d257 Update app.js 2024-12-09 19:33:07 +08:00
326179479c Update app.js 2024-12-09 19:30:57 +08:00
909b8a3f88 Update sql_mysql.py 2024-12-09 19:25:55 +08:00
973cbf4f9d update 2024-12-09 19:20:06 +08:00
ca52d5bf65 Update app.js 2024-12-09 18:53:47 +08:00
5427a2b1ee Update nosql_redis.py 2024-12-09 18:49:34 +08:00
7b925e5504 Update app.js 2024-12-09 18:46:08 +08:00
6b7752e14a Update sql_mysql.py 2024-12-09 18:45:20 +08:00
f13a0c68dc Update site.py 2024-12-09 18:38:39 +08:00
017d96872a Update site.py 2024-12-09 18:37:25 +08:00
f11b8637bb update 2024-12-09 18:34:30 +08:00
5452ee3229 Update site.py 2024-12-09 18:24:12 +08:00
41a76e1ac6 Update site.py 2024-12-09 18:22:39 +08:00
2e3d5fda44 Update site.py 2024-12-09 18:21:58 +08:00
d26e2fb06f Update site.py 2024-12-09 18:08:15 +08:00
7aa0bf59f2 Update site.py 2024-12-09 18:07:31 +08:00
4cc72c7164 update 2024-12-09 18:01:25 +08:00
10dffd71f7 update 2024-12-09 17:48:13 +08:00
56c4710c55 Update site.py 2024-12-09 17:37:16 +08:00
2bebf3503f Update site.py 2024-12-09 17:32:00 +08:00
8e61c89bd3 Update site.py 2024-12-09 17:31:25 +08:00
2e4fe6e434 Update site.py 2024-12-09 17:28:34 +08:00
Mr Chen
be1e03828c Merge pull request #631 from midoks/revert-630-master
Revert "修复http3在多Worker 下需要reuseport以及不传HOST变量的问题"
2024-12-09 16:48:48 +08:00
Mr Chen
55d9700401 Revert "修复http3在多Worker 下需要reuseport以及不传HOST变量的问题" 2024-12-09 16:48:27 +08:00
e55f79b9b8 Update README.md 2024-12-09 15:57:46 +08:00
5684fc217f Update README.md 2024-12-09 15:57:26 +08:00
f0071b5e82 Update panel_task.py 2024-12-09 15:52:21 +08:00
7bb7ce2ef3 Update panel_task.py 2024-12-09 01:36:51 +08:00
47569c475f Update file.py 2024-12-09 01:07:22 +08:00
eb8886b4eb update 2024-12-09 01:04:30 +08:00
83711db1c8 update 2024-12-09 01:00:01 +08:00
6858a827f9 update 2024-12-09 00:53:02 +08:00
66c8900a30 update 2024-12-09 00:47:05 +08:00
892b1144e1 Update files.py 2024-12-09 00:39:41 +08:00
06d2b381b2 Update files.py 2024-12-09 00:38:19 +08:00
f8e3df36c8 Update file.py 2024-12-09 00:36:09 +08:00
b69c986dcd Update system.py 2024-12-09 00:18:03 +08:00
3501323a12 Update system.py 2024-12-09 00:17:51 +08:00
0671455b59 update 2024-12-09 00:10:10 +08:00
c4727b90da Update system.py 2024-12-09 00:08:37 +08:00
a14c4b566e update 2024-12-09 00:05:34 +08:00
33353dd2a3 Update plugin.py 2024-12-08 23:55:44 +08:00
3b436a15c1 Update plugin.py 2024-12-08 23:04:34 +08:00
49f45314d1 Update plugin.py 2024-12-08 23:04:23 +08:00
679aefba86 Update plugin.py 2024-12-08 23:00:42 +08:00
255d297d61 Update plugin.py 2024-12-08 23:00:03 +08:00
c1a59d63fc 缓存检查插件状态,提高速度 2024-12-08 22:43:55 +08:00
d75c729e29 re 修复 2024-12-08 22:41:10 +08:00
f50be939f5 Update version.py 2024-12-06 04:17:29 +08:00
3394a8892f update 2024-12-06 04:17:11 +08:00
02e5f595fd Update sql_mysql.py 2024-12-06 03:50:14 +08:00
1bee5e7429 Update option.py 2024-12-05 23:48:54 +08:00
a8b6ae4c21 Update option.py 2024-12-05 23:48:35 +08:00
154c482e67 Update compatibility.md 2024-12-05 14:55:50 +08:00
723d5e3959 Update __init__.py 2024-12-05 06:18:12 +08:00
73f8226854 Update init_cmd.py 2024-12-05 06:11:49 +08:00
3826bb53aa Update init_cmd.py 2024-12-05 06:11:23 +08:00
7fbe40e73f Update init_cmd.py 2024-12-05 06:11:03 +08:00
e3606a1ca4 Update __init__.py 2024-12-05 06:07:05 +08:00
bfe0e0a31a Update panel_tools.py 2024-12-05 06:04:05 +08:00
643338eab1 update 2024-12-05 06:02:42 +08:00
0777b65919 up 2024-12-05 05:45:06 +08:00
c9ef1cd141 up 2024-12-05 05:38:11 +08:00
b9a1d142d1 Update crontab.py 2024-12-05 05:36:06 +08:00
7959167554 Update version.py 2024-12-05 05:29:18 +08:00
fcf20958c9 Update crontab.html 2024-12-05 05:29:09 +08:00
92b26bd14f update 2024-12-05 05:22:16 +08:00
d6b414f022 Update version.py 2024-12-05 05:13:45 +08:00
dd3092639e Update crontab.html 2024-12-05 05:13:38 +08:00
0e633491bd Update version.py 2024-12-05 05:08:17 +08:00
2250770f66 Update crontab.js 2024-12-05 05:08:06 +08:00
1d8448d6bb update 2024-12-05 05:05:47 +08:00
6eda36aec2 Update index.py 2024-12-05 04:56:02 +08:00
09d656ef60 update 2024-12-05 04:54:06 +08:00
19aadb581f Update index.py 2024-12-05 04:46:36 +08:00
c27248af98 Update index.py 2024-12-05 04:42:36 +08:00
829a2516ba update 2024-12-05 04:27:37 +08:00
ac0dac2561 Update __init__.py 2024-12-05 04:23:06 +08:00
a308c630fc Update update.py 2024-12-05 03:58:04 +08:00
661a346060 Update config.py 2024-12-05 03:11:29 +08:00
b251de30b1 Update version.py 2024-12-05 03:05:22 +08:00
716c0a6d46 Update crontab.py 2024-12-05 03:04:37 +08:00
ac8c048b28 Update crontab.py 2024-12-05 02:57:33 +08:00
00afaec282 Update index.html 2024-12-05 02:51:38 +08:00
727c36ebc7 update 2024-12-05 02:11:47 +08:00
2f5bd3b5ed Update index.py 2024-12-05 01:57:20 +08:00
49ca076d6c Update index.py 2024-12-05 01:57:03 +08:00
f63e375b13 update 2024-12-05 01:54:12 +08:00
e480582fcf Update readline.sh 2024-12-05 01:11:43 +08:00
f45dd1bbf5 Update readline.sh 2024-12-05 01:10:51 +08:00
d37f651f23 Update readline.sh 2024-12-05 00:37:33 +08:00
4d2793d4dc Update version.py 2024-12-04 18:07:10 +08:00
fb3404e92f Update upgrade.py 2024-12-04 18:06:54 +08:00
2cdb62cbd3 update 2024-12-04 18:03:37 +08:00
a3d231f619 update 2024-12-04 17:58:16 +08:00
34551409d9 Update version.py 2024-12-04 17:44:23 +08:00
be83c2c3bb Update version.py 2024-12-04 16:58:37 +08:00
b963302a96 Update push_ad.py 2024-12-04 15:24:41 +08:00
5238d8f263 Update pathinfo.conf 2024-12-04 15:11:43 +08:00
384419fa30 Update app.js 2024-12-04 04:24:46 +08:00
d18952a72e Update index.py 2024-12-04 03:57:56 +08:00
f1478369b5 Update index.py 2024-12-04 03:28:06 +08:00
face89efc5 Update file.py 2024-12-04 03:15:12 +08:00
44f5f7f270 Update file.py 2024-12-04 03:11:35 +08:00
a30d68a3d9 Update file.py 2024-12-04 03:07:01 +08:00
0e5f3bc23b Update file.py 2024-12-04 02:33:56 +08:00
0f97e0db44 Update install.sh 2024-12-04 02:20:18 +08:00
79ed3f3a4c Update index.py 2024-12-04 01:57:14 +08:00
869a321c14 Update index.py 2024-12-04 01:57:01 +08:00
f338d8bd8e Update index.py 2024-12-04 01:54:30 +08:00
2a60cd981d Update index.py 2024-12-04 01:37:00 +08:00
3504ca24f2 Update mw_api.py 2024-12-04 01:26:36 +08:00
ebcd450f55 Update index.py 2024-12-04 01:26:33 +08:00
db8f74f848 update 2024-12-04 01:26:26 +08:00
b34cf3fc86 Update main.py 2024-12-04 00:38:34 +08:00
a1bb8b9816 update 2024-12-04 00:34:49 +08:00
3db30b1298 Update __init__.py 2024-12-04 00:14:53 +08:00
773bc41a12 Update version.py 2024-12-04 00:05:00 +08:00
c91928c55f update 2024-12-03 23:26:15 +08:00
5588976f95 Update index.py 2024-12-03 21:52:15 +08:00
87d76d7cf7 update 2024-12-03 20:48:01 +08:00
18202b859b Update system.py 2024-12-03 20:19:41 +08:00
8309b8e493 update 2024-12-03 20:16:19 +08:00
50a96b198a update 2024-12-03 20:12:55 +08:00
6ebc7a1514 update 2024-12-03 20:07:50 +08:00
Mr Chen
156f6d1791 Merge pull request #630 from jd82k/master
修复http3在多Worker 下需要reuseport以及不传HOST变量的问题
2024-12-03 18:56:32 +08:00
6a013dd7f6 Update index.py 2024-12-03 18:48:56 +08:00
05d8181202 update 2024-12-03 18:46:45 +08:00
2f8217d5d5 Update index.py 2024-12-03 18:39:51 +08:00
d9234c9b77 Update index.py 2024-12-03 18:38:44 +08:00
16b54569e0 update 2024-12-03 18:36:17 +08:00
23ed3a7e47 update 2024-12-03 18:33:47 +08:00
d2f586dadd Update index.py 2024-12-03 18:25:04 +08:00
c72dcf02d2 Update xui.js 2024-12-03 18:23:22 +08:00
a099a83f9b Update xui.js 2024-12-03 18:18:56 +08:00
a986082f62 Update index.html 2024-12-03 18:18:41 +08:00
5c9cde381c Update xui.js 2024-12-03 18:18:31 +08:00
c23ae77215 Update index.html 2024-12-03 18:05:28 +08:00
33a83a6d8e Update index.html 2024-12-03 18:03:40 +08:00
07d6ce0a34 Update index.html 2024-12-03 18:03:09 +08:00
940006a10a update 2024-12-03 18:02:44 +08:00
c77b8d47fd Update xui.js 2024-12-03 18:02:15 +08:00
58f24f0c75 Update xui.js 2024-12-03 18:01:33 +08:00
41b11669d8 Update index.html 2024-12-03 17:59:11 +08:00
bb04f1666f update 2024-12-03 17:55:14 +08:00
49c22a2d70 Update xui.js 2024-12-03 17:53:18 +08:00
5616b90474 Update index.py 2024-12-03 17:51:26 +08:00
230d3925df Update index.py 2024-12-03 17:49:23 +08:00
5e92740b62 Update index.py 2024-12-03 17:47:22 +08:00
f353fc3e5a Update index.py 2024-12-03 17:42:55 +08:00
8f5936135d Update index.py 2024-12-03 17:42:37 +08:00
2954b92963 Update xui.js 2024-12-03 17:41:27 +08:00
57141b3a90 Update index.py 2024-12-03 17:39:32 +08:00
3b0db0359c update 2024-12-03 17:38:12 +08:00
ad66ecc628 update 2024-12-03 17:30:41 +08:00
766dc32287 update 2024-12-03 17:29:50 +08:00
761ddd72e9 Update index.py 2024-12-03 17:28:12 +08:00
16e312bbe7 update 2024-12-03 17:25:53 +08:00
d36b36e1d3 Update index.py 2024-12-03 17:14:31 +08:00
9eabb10e41 Update index.py 2024-12-03 17:12:37 +08:00
7be3cdd5e8 update 2024-12-03 17:10:56 +08:00
2f5842622c Update install.sh 2024-12-03 17:09:55 +08:00
3f52744747 Update install.sh 2024-12-03 17:05:20 +08:00
91a2558bf4 Update install.sh 2024-12-03 17:04:43 +08:00
aa397eb8e7 Update install.sh 2024-12-03 17:02:46 +08:00
7663bdbc14 Create install_xui.sh 2024-12-03 17:01:12 +08:00
51a9b551fd Update install.sh 2024-12-03 17:01:09 +08:00
725572745b Update install.sh 2024-12-03 16:58:25 +08:00
77e65252fb Update file.py 2024-12-03 16:50:32 +08:00
1fc0a106b6 update 2024-12-03 16:49:04 +08:00
e8d72985e6 Update install.sh 2024-12-03 16:26:24 +08:00
2ecc29269f update 2024-12-03 16:14:47 +08:00
299eaa06b8 Update file.py 2024-12-03 15:35:41 +08:00
154c7cbdbc Update file.py 2024-12-03 15:35:17 +08:00
06bb5b5bb0 Update file.py 2024-12-03 15:34:27 +08:00
a718db5457 Update file.py 2024-12-03 15:34:14 +08:00
2e17870d03 update 2024-12-03 15:32:31 +08:00
e70113c280 Update file.py 2024-12-03 15:29:05 +08:00
4240f49de9 Update file.py 2024-12-03 15:28:33 +08:00
9b0b8015df update 2024-12-03 15:19:58 +08:00
jd82k
998938e7ab fix http3 bugs 2024-12-02 20:06:59 -08:00
jd82k
faffdaf535 Update pathinfo.conf 2024-12-02 20:04:17 -08:00
fce4cc332c Update install.sh 2024-12-03 01:10:02 +08:00
d211aa168c Update info.json 2024-12-03 00:27:34 +08:00
2430cbb11a Update public.js 2024-12-02 23:46:02 +08:00
ddef7b1182 Update public.js 2024-12-02 23:45:31 +08:00
f5af7688a7 Update public.js 2024-12-02 23:43:36 +08:00
1faef6799b update 2024-12-02 23:43:05 +08:00
34e6bb75e0 Update index.py 2024-12-02 22:26:28 +08:00
332aa43419 Update index.py 2024-12-02 22:24:49 +08:00
f96ff13843 Update version.py 2024-12-02 22:16:05 +08:00
f25066e23e Update public.js 2024-12-02 22:10:07 +08:00
35ce2abae6 Update __init__.py 2024-12-02 22:09:34 +08:00
897e236719 Update __init__.py 2024-12-02 22:08:53 +08:00
916b3dff6c Update public.js 2024-12-02 22:03:25 +08:00
846600ef99 Update index.py 2024-12-02 21:48:40 +08:00
8cbae18986 Update README.md 2024-12-02 21:46:30 +08:00
c81616894c Update README.md 2024-12-02 21:13:50 +08:00
408c9c291b Update init_cmd.py 2024-12-02 18:03:11 +08:00
824032b338 Update init_cmd.py 2024-12-02 17:57:19 +08:00
99c2c7ce4c Update init_cmd.py 2024-12-02 17:56:26 +08:00
93d4749d9e Update init_cmd.py 2024-12-02 17:54:29 +08:00
163776c5ff Update init_cmd.py 2024-12-02 17:54:09 +08:00
fd907e1dc9 Update mw.tpl 2024-12-02 17:39:19 +08:00
6c306ad97f Update mw.tpl 2024-12-02 17:39:07 +08:00
0357087b06 Update mw.tpl 2024-12-02 17:27:08 +08:00
85a9ee4b29 Update mw.tpl 2024-12-02 17:22:16 +08:00
5bab1ab4da Update mw.tpl 2024-12-02 17:18:29 +08:00
0312c5ceb0 update 2024-12-02 17:12:29 +08:00
eca12b2cf3 update 2024-12-02 16:49:06 +08:00
3476b4c30a Update init_cmd.py 2024-12-02 16:33:47 +08:00
46d7f83cc4 Update mw.service.tpl 2024-12-02 16:28:42 +08:00
e1ef876db1 Update init_cmd.py 2024-12-02 16:25:55 +08:00
8f1a89f978 Update init_cmd.py 2024-12-02 16:24:29 +08:00
a14301f769 Update tamper_proof_service.py 2024-12-02 14:53:23 +08:00
54bd8f1d5c Update sql_mysql.py 2024-12-02 04:41:35 +08:00
9d05edf09f Update orm.py 2024-12-02 04:33:02 +08:00
a0c228e352 Update sql_mysql.py 2024-12-02 04:13:19 +08:00
dfaf09735e Update sql_mysql.py 2024-12-02 04:08:03 +08:00
6f2cc03044 Update ubuntu.sh 2024-12-02 03:54:47 +08:00
2ff6d17d23 Update debian.sh 2024-12-02 03:54:32 +08:00
af83750220 update 2024-12-02 03:45:16 +08:00
70dbb9eab5 Update sql_mysql.py 2024-12-02 03:18:06 +08:00
a58fd4476e Update app.js 2024-12-02 03:13:43 +08:00
5f7f45c648 Update version.py 2024-12-02 03:09:33 +08:00
ca5b315725 update 2024-12-02 03:08:41 +08:00
6a33354b2b Update index.py 2024-12-02 03:00:22 +08:00
821683d484 Update init_cmd.py 2024-12-02 02:54:17 +08:00
a2e4fc8085 Update info.json 2024-12-02 02:41:49 +08:00
bb37fccee3 Update index.py 2024-12-02 02:40:52 +08:00
e9a01b5056 update 2024-12-02 02:33:32 +08:00
c1dec87784 Update install.sh 2024-12-02 02:31:48 +08:00
74b3118bc3 Update install.sh 2024-12-02 02:31:43 +08:00
853d5045f0 Update install.sh 2024-12-02 02:28:30 +08:00
30db5569ad Update gdriveclient.py 2024-12-02 02:25:52 +08:00
8c841e93a0 update 2024-12-02 02:00:13 +08:00
46a752480c update 2024-12-02 01:54:28 +08:00
1dddc3c5ba Update site.py 2024-12-02 01:47:26 +08:00
61d90ef8e7 Update site.py 2024-12-02 01:44:19 +08:00
c3241a5c17 Update version.py 2024-12-02 01:32:07 +08:00
c6d1a44d43 Update control.js 2024-12-02 01:31:59 +08:00
8ce5d6dfbe Update version.py 2024-12-02 01:30:41 +08:00
a8c8f922eb Update version.py 2024-12-02 01:28:54 +08:00
e7d458b2a9 Update control.js 2024-12-02 01:28:34 +08:00
9cba031049 Update version.py 2024-12-02 01:26:45 +08:00
73e5cc4fbd update 2024-12-02 01:25:06 +08:00
3df5ae86d4 Update version.py 2024-12-02 01:21:06 +08:00
542610f5a7 update 2024-12-02 01:20:37 +08:00
1b1d3aec8c update 2024-12-02 01:16:05 +08:00
829f4def27 update 2024-12-02 01:12:04 +08:00
cc9e628346 update 2024-12-02 01:04:40 +08:00
921af80598 Update version.py 2024-12-02 01:00:42 +08:00
dae5d2d062 update 2024-12-02 01:00:28 +08:00
6ee0496c4c Update requirements.txt 2024-12-02 00:36:48 +08:00
bbcac5f899 Update requirements.txt 2024-12-02 00:35:36 +08:00
7fb006b2ff Update index.py 2024-12-02 00:27:31 +08:00
6bfa72feb6 update 2024-12-01 23:54:04 +08:00
8867799825 Update mt.toml 2024-12-01 23:46:54 +08:00
12c90f5e6e update 2024-12-01 23:42:01 +08:00
8ed608e9cd update 2024-12-01 23:16:27 +08:00
1c0dbe76f9 update 2024-12-01 22:30:36 +08:00
14ad247168 Update index.py 2024-12-01 22:24:41 +08:00
b114c768dc Update index.py 2024-12-01 22:21:36 +08:00
58129d5209 update 2024-12-01 22:19:49 +08:00
54f5b44e04 Update index.py 2024-12-01 22:16:30 +08:00
85f64b72cb Update install.sh 2024-12-01 22:11:25 +08:00
626c64afb2 Update index.py 2024-12-01 22:01:56 +08:00
e639fc5746 Update index.py 2024-12-01 22:01:45 +08:00
d988dce5d8 Update install.sh 2024-12-01 22:00:04 +08:00
34f03d2ccb update 2024-12-01 21:57:23 +08:00
4e66ed3a32 mtproxy 2024-12-01 21:51:31 +08:00
fde9da1af5 Update dashboard.py 2024-12-01 21:45:16 +08:00
bad42e8e48 Update dashboard.py 2024-12-01 21:40:02 +08:00
c562f9481d Update dashboard.py 2024-12-01 21:39:49 +08:00
caa9b598d0 update 2024-12-01 21:26:58 +08:00
ffa16648ae Update mw.tpl 2024-12-01 20:59:59 +08:00
a7a06ea7bf Update mw.tpl 2024-12-01 20:59:45 +08:00
99de06abc0 Update mw.tpl 2024-12-01 20:59:32 +08:00
b538e646bd Update mw.tpl 2024-12-01 20:48:37 +08:00
6088386e51 update 2024-12-01 20:47:39 +08:00
404a38d990 update 2024-12-01 20:42:21 +08:00
91e3900d12 Update panel_tools.py 2024-12-01 20:38:13 +08:00
2b0dfcd460 Update panel_tools.py 2024-12-01 20:33:49 +08:00
f561a1da4f Update mw.tpl 2024-12-01 20:29:41 +08:00
34b435ffca update 2024-12-01 20:24:57 +08:00
5b92f109b9 Update version.py 2024-12-01 20:22:46 +08:00
fe68bf7226 update 2024-12-01 20:22:19 +08:00
1e4989857e Update version.py 2024-12-01 17:42:52 +08:00
56055000d9 Update public.js 2024-12-01 17:22:31 +08:00
9365139430 Update public.js 2024-12-01 17:12:39 +08:00
b22f240719 Update public.js 2024-12-01 16:57:29 +08:00
5b0e8ad2da update 2024-12-01 16:32:05 +08:00
cb794a946a Update sg11.sh 2024-12-01 15:48:17 +08:00
446e39fb68 Update sg11.sh 2024-12-01 15:42:57 +08:00
9276dd1bb8 Update sg11.sh 2024-12-01 15:23:03 +08:00
1972df1f2d update 2024-12-01 15:20:29 +08:00
afb9f430b3 update 2024-12-01 15:04:12 +08:00
52e9ff38fa Update phplib.conf 2024-12-01 14:54:25 +08:00
37f4244484 update 2024-12-01 13:53:32 +08:00
485b0605b4 Update python-app-op.yml 2024-12-01 13:52:36 +08:00
30e2ea56c8 Update init_cmd.py 2024-12-01 13:34:58 +08:00
371b6651f0 Update init_cmd.py 2024-12-01 04:21:09 +08:00
37448dc827 update 2024-12-01 04:19:00 +08:00
6e197f81ef Update app.js 2024-12-01 04:18:14 +08:00
bdd0634f61 update 2024-12-01 04:17:28 +08:00
a8019d1ec4 Update sql_mysql.py 2024-12-01 03:38:09 +08:00
d33ce43ad3 Update sql_mysql.py 2024-12-01 03:26:57 +08:00
cc165c4cde update 2024-12-01 03:23:13 +08:00
1f6e6957ea Update init_cmd.py 2024-12-01 02:15:32 +08:00
7b8bb6380d Update mw.py 2024-12-01 01:49:02 +08:00
b432b1c165 update 2024-12-01 01:40:56 +08:00
ce6f7153b3 Update firewall.py 2024-12-01 01:31:08 +08:00
1cc4aee6f7 Update index.py 2024-12-01 01:23:14 +08:00
eafaf13a3d Update init_cmd.py 2024-12-01 01:14:12 +08:00
7352f30d91 Update ubuntu.sh 2024-12-01 00:38:35 +08:00
31db220719 Update python-app-op.yml 2024-11-30 23:35:48 +08:00
000a4cccf1 Update python-app-op.yml 2024-11-30 23:35:34 +08:00
1cc6953415 Update install.sh 2024-11-30 23:10:58 +08:00
519951ad69 Update setting.py 2024-11-30 23:02:08 +08:00
b97b8c2c9b Update setting.py 2024-11-30 23:01:21 +08:00
27b3bc1150 Update firewall.py 2024-11-30 23:00:46 +08:00
c66ad2b7fb Update firewall.py 2024-11-30 22:58:24 +08:00
f040b590d5 Update firewall.py 2024-11-30 22:53:40 +08:00
a36d2f2665 Update firewall.py 2024-11-30 22:43:17 +08:00
b0c3e5b7e5 update 2024-11-30 22:41:39 +08:00
3d3cde4353 Update update_new.sh 2024-11-30 21:58:06 +08:00
da9c57cf84 update 2024-11-30 21:57:46 +08:00
9915ed35d0 update 2024-11-30 21:44:09 +08:00
97829cd944 Update install.sh 2024-11-30 21:16:59 +08:00
c355a120b4 Update install.sh 2024-11-30 21:16:21 +08:00
1d9bc68e28 update 2024-11-30 18:07:22 +08:00
778e1860df Update python-app-op.yml 2024-11-30 18:01:09 +08:00
76b9298efd update 2024-11-30 17:11:00 +08:00
371cc9c4c8 Update debian.sh 2024-11-30 16:57:58 +08:00
ab7c4792e2 Update sql_mysql.py 2024-11-30 16:51:26 +08:00
7e2c192d40 update 2024-11-30 16:42:42 +08:00
6874de5cda Update app.js 2024-11-30 04:26:28 +08:00
bd2ab7d529 update 2024-11-30 04:21:43 +08:00
152fadfc87 Update app.js 2024-11-30 04:07:29 +08:00
d3b3b526db update 2024-11-30 03:52:58 +08:00
00002a8540 update 2024-11-30 03:32:33 +08:00
a5bc06acf6 Update app.js 2024-11-29 22:08:54 +08:00
2dcb8b257e 添加插件 2024-11-29 21:14:18 +08:00
fd1f64a6e2 Update .gitignore 2024-11-29 21:14:08 +08:00
fbf1a36e00 Update brotli.sh 2024-11-29 19:49:55 +08:00
52d66b33cb update 2024-11-29 19:43:36 +08:00
eb0fe483b1 Update index.py 2024-11-29 19:24:31 +08:00
acc57ee993 Update mw.py 2024-11-29 19:19:21 +08:00
0397090458 Update macos.sh 2024-11-29 19:08:11 +08:00
5f6df46c90 Update mw.py 2024-11-29 18:52:38 +08:00
3030849bd2 Update ftp_client.py 2024-11-29 18:46:15 +08:00
7a1bc2ee39 Update ftp_client.py 2024-11-29 18:45:45 +08:00
efc715678b Update install.sh 2024-11-29 18:43:25 +08:00
65ec08d40f Update install.sh 2024-11-29 18:42:55 +08:00
7855df5aa2 up 2024-11-29 18:41:43 +08:00
abbe16eb87 up 2024-11-29 18:41:02 +08:00
45645a52b5 up 2024-11-29 18:40:11 +08:00
48d193141e Update install.sh 2024-11-29 18:31:04 +08:00
264dd392f6 Update install.sh 2024-11-29 18:28:18 +08:00
3e9b47cbf3 Update index.py 2024-11-29 18:23:25 +08:00
b350747eab update 2024-11-29 18:21:12 +08:00
d078b285a2 Update index.py 2024-11-29 18:14:02 +08:00
7b5d9bb3c1 Update index.py 2024-11-29 18:09:33 +08:00
346f07657d Update index.py 2024-11-29 17:55:37 +08:00
f4859ef7f6 Update index.py 2024-11-29 17:53:25 +08:00
40bc9798a9 Update index.py 2024-11-29 17:44:05 +08:00
98899cd76e Update index.py 2024-11-29 17:41:31 +08:00
6da57d6ccc Update index.py 2024-11-29 17:38:03 +08:00
0cef478d71 Update index.py 2024-11-29 17:36:34 +08:00
30e0db5adb Update debian.sh 2024-11-29 17:25:08 +08:00
bb6a64c0dc Update ubuntu.sh 2024-11-29 17:23:02 +08:00
d940a12ed5 Update ubuntu.sh 2024-11-29 17:22:28 +08:00
fe9cd42210 Update debian.sh 2024-11-29 17:21:15 +08:00
ad503863ad update 2024-11-29 17:16:23 +08:00
a660014740 update 2024-11-29 17:15:07 +08:00
637a4dacb9 update 2024-11-29 17:11:28 +08:00
79c8081c30 Update index.py 2024-11-29 17:04:15 +08:00
0903589e5b Update info.json 2024-11-29 17:04:09 +08:00
777bfa1145 Update index.py 2024-11-29 16:06:02 +08:00
4826dbd8a9 Update index.py 2024-11-29 16:05:27 +08:00
70507e9f65 Update index.py 2024-11-29 16:05:06 +08:00
b8d6d9ed60 update 2024-11-29 15:54:29 +08:00
d62531c700 Update info.json 2024-11-29 15:31:37 +08:00
96d5a817d5 Update install.sh 2024-11-29 15:31:26 +08:00
6436a933c9 Update panel_task.py 2024-11-29 05:19:53 +08:00
db79be96ed Update mcrypt.sh 2024-11-29 05:16:39 +08:00
d2d79092ca up 2024-11-29 05:12:09 +08:00
8f4fca5a6c update 2024-11-29 05:10:44 +08:00
dbe9fd4222 update 2024-11-29 04:49:47 +08:00
d0bc04e53b Update index.py 2024-11-29 04:05:33 +08:00
49858199a5 Update install.sh 2024-11-29 03:55:03 +08:00
7750fb7b38 Update readline.sh 2024-11-29 03:54:18 +08:00
d1d276d026 Update .gitignore 2024-11-29 03:35:01 +08:00
70aca29ce1 Update .gitignore 2024-11-29 03:34:38 +08:00
dc17d67dc9 Update plugin.py 2024-11-29 03:32:10 +08:00
407dc56f40 Update install.sh 2024-11-29 03:13:41 +08:00
bdfc044783 Update tasks.py 2024-11-29 03:13:34 +08:00
325a113ac6 Update mw.py 2024-11-29 03:13:30 +08:00
7e55e1e29a Update plugin.py 2024-11-29 03:13:04 +08:00
d604c966b2 update 2024-11-29 02:47:43 +08:00
573e3192fc Update swoole.sh 2024-11-29 02:36:40 +08:00
8ec3b66f20 Update install.sh 2024-11-29 02:24:37 +08:00
5b9a414688 Update openssl.sh 2024-11-29 02:24:29 +08:00
9553add27a Update readline.sh 2024-11-29 02:07:07 +08:00
fb3cd54ce0 Update install.sh 2024-11-29 01:54:48 +08:00
1ce5cac3ba Update openssl.sh 2024-11-29 01:23:55 +08:00
fa1819feb8 Update readline.sh 2024-11-29 01:21:32 +08:00
bd873b48d0 Update readline.sh 2024-11-29 01:16:13 +08:00
37e3850b43 update 2024-11-29 01:13:22 +08:00
3182bac95e Update install.sh 2024-11-29 01:08:08 +08:00
71dc92f59d Update phplib.conf 2024-11-29 01:08:01 +08:00
dc5a81ea89 Create curl.sh 2024-11-29 01:07:57 +08:00
e04214c14d Update install.sh 2024-11-29 00:23:17 +08:00
1846af7271 update 2024-11-29 00:23:07 +08:00
58cb061ef2 Update index.py 2024-11-28 23:28:58 +08:00
c71a59cce1 Update init.py 2024-11-28 20:48:57 +08:00
c3d6ec90e8 Update panel_tools.py 2024-11-28 20:43:33 +08:00
9569b64d26 Update __init__.py 2024-11-28 20:43:17 +08:00
6f7c26adc4 Update init.py 2024-11-28 20:42:53 +08:00
82e4e5c1d3 Update mw.tpl 2024-11-28 20:39:52 +08:00
d6972bae75 Update init.py 2024-11-28 20:29:48 +08:00
2beae29d25 Update init.py 2024-11-28 20:29:30 +08:00
e2d800a167 Update init.py 2024-11-28 20:29:11 +08:00
630e518ae3 Update mw.tpl 2024-11-28 20:22:01 +08:00
2c8108a0be Update mw.tpl 2024-11-28 20:21:40 +08:00
11ba771db3 Update __init__.py 2024-11-28 20:17:23 +08:00
e20341d3da Update setting.py 2024-11-28 20:16:58 +08:00
179b00e8a1 Update __init__.py 2024-11-28 20:16:02 +08:00
ab287d42ef Update __init__.py 2024-11-28 20:12:41 +08:00
8b439801ab Update .gitignore 2024-11-28 20:05:09 +08:00
8e39af00a3 update 2024-11-28 20:04:35 +08:00
493553ec4b update 2024-11-28 19:48:36 +08:00
0d1d4b66d6 Update panel_task.py 2024-11-28 19:47:24 +08:00
7ba7272a7c Update panel_tools.py 2024-11-28 19:43:44 +08:00
12d5ce5eea update 2024-11-28 19:31:45 +08:00
a059e09244 Update setting.py 2024-11-28 19:28:17 +08:00
2ac28e9d80 Update plugin.py 2024-11-28 19:12:10 +08:00
de3f2ab4d2 Update mw.py 2024-11-28 19:08:22 +08:00
ee206f014d Update mw.py 2024-11-28 19:07:59 +08:00
852fc6e5a7 Update mw.py 2024-11-28 19:04:25 +08:00
17b40e5d1d Update setting.py 2024-11-28 18:58:55 +08:00
769f36c560 Update app.py 2024-11-28 18:47:24 +08:00
7d1c2bac14 Update setting.py 2024-11-28 18:44:17 +08:00
58101f889d Update app.py 2024-11-28 18:43:49 +08:00
009be7e920 Update config.py 2024-11-28 18:20:11 +08:00
74817313f6 Update setting.py 2024-11-28 18:13:31 +08:00
1dc55d5e1a Update setting.py 2024-11-28 18:05:23 +08:00
2a943efcd7 Update setting.py 2024-11-28 18:03:31 +08:00
dfef78fc84 Update mw.py 2024-11-28 18:00:26 +08:00
51d092ca19 Update setting.py 2024-11-28 18:00:04 +08:00
c210429086 update 2024-11-28 16:26:14 +08:00
9cbec5a68f Update setting.py 2024-11-28 01:52:10 +08:00
b02a6a2d19 update 2024-11-28 01:49:17 +08:00
e5ef7d3e4d Update app.py 2024-11-28 01:40:52 +08:00
1d1dbfc54c Update mw.tpl 2024-11-28 01:36:00 +08:00
49867fadf0 Update setting.py 2024-11-28 01:31:27 +08:00
0df069b9a4 update 2024-11-28 01:28:45 +08:00
ef59c3a654 Update app.py 2024-11-28 01:24:24 +08:00
af3ceeefe7 Update version.py 2024-11-28 01:21:14 +08:00
655c2c2268 Update app.py 2024-11-28 01:19:44 +08:00
83f48cb05e update 2024-11-28 01:18:57 +08:00
25527d09f5 Update firewall.py 2024-11-28 01:07:00 +08:00
32718d5450 Update mw.tpl 2024-11-28 00:55:49 +08:00
7ce3160ade Update __init__.py 2024-11-28 00:52:16 +08:00
f4f4e32612 update 2024-11-28 00:45:50 +08:00
1bb99bb90e Update app.py 2024-11-28 00:33:31 +08:00
0ccf70be56 update 2024-11-28 00:33:08 +08:00
d6b68f45e5 Update __init__.py 2024-11-28 00:24:35 +08:00
41978d33bd Update app.py 2024-11-28 00:20:33 +08:00
85c62dd51a update 2024-11-27 23:59:56 +08:00
ccb9d678f6 Update __init__.py 2024-11-27 20:28:23 +08:00
d950501ec6 Create backup.py 2024-11-27 20:28:19 +08:00
4edae5114e Update site.py 2024-11-27 20:28:15 +08:00
eb925d004e Create backup.py 2024-11-27 20:28:10 +08:00
58fafd6233 Update all_test.sh 2024-11-27 18:09:17 +08:00
c4c3c1659c update 2024-11-27 15:59:25 +08:00
5a800ac1b2 Update gd_old.sh 2024-11-27 15:52:17 +08:00
0e6ea7cb7e Update setting.py 2024-11-27 06:05:54 +08:00
4078f4c67b Update setting.py 2024-11-27 05:50:15 +08:00
a44873b142 update 2024-11-27 05:48:44 +08:00
293c902a80 Update init.py 2024-11-27 05:23:05 +08:00
d25993e78b update 2024-11-27 04:48:39 +08:00
c3ef396728 Update panel_tools.py 2024-11-27 04:40:29 +08:00
17d46958f8 Update panel_tools.py 2024-11-27 04:35:55 +08:00
aef3c5d694 Update init.py 2024-11-27 04:15:28 +08:00
50eb0137a4 Update __init__.py 2024-11-27 04:13:19 +08:00
e8d1e6e1eb Update system.sql 2024-11-27 03:45:31 +08:00
e4c7a04701 Update init.py 2024-11-27 03:31:14 +08:00
e145e2c57f Update default.sql 2024-11-27 03:27:04 +08:00
2d892575f3 Update default.sql 2024-11-27 03:17:24 +08:00
0c4460282a Update default.sql 2024-11-27 03:01:15 +08:00
da0e599bad Update mw.py 2024-11-27 02:56:43 +08:00
7d2ca4ea74 Update user.py 2024-11-27 02:53:02 +08:00
7a1b30994b update 2024-11-27 02:47:23 +08:00
3994d8f0ce update 2024-11-27 02:21:45 +08:00
aa5ffdc3c0 Update mw.tpl 2024-11-27 02:17:01 +08:00
db1dfb9aed Update crontab.py 2024-11-27 02:15:08 +08:00
06db6b02d8 Update plugin.py 2024-11-27 02:13:28 +08:00
bf0269a7da Update plugin.py 2024-11-27 02:11:58 +08:00
486361f3b7 Update config.py 2024-11-27 02:08:55 +08:00
ab088d9355 Update config.py 2024-11-27 02:07:30 +08:00
c9c52cf7f5 update 2024-11-27 02:07:08 +08:00
e4ad01dd42 update 2024-11-27 01:55:03 +08:00
86ac000117 Update firewall.py 2024-11-27 01:51:15 +08:00
ae016172ea Update firewall.py 2024-11-27 01:50:47 +08:00
2c5ab01237 Update firewall.py 2024-11-27 01:50:32 +08:00
9b0a41c3d5 update 2024-11-27 01:49:20 +08:00
be55e79dcf Update sites.py 2024-11-27 01:47:53 +08:00
9265bd57e4 update 2024-11-27 01:46:54 +08:00
26bc566aed update 2024-11-27 01:41:17 +08:00
1b007460de update 2024-11-27 01:35:37 +08:00
b007010912 Update mw.py 2024-11-27 01:34:38 +08:00
053cd9bc01 Update mw.py 2024-11-27 01:33:15 +08:00
37c8da89ae Update mw.py 2024-11-27 01:32:57 +08:00
4f1001e487 Update file.py 2024-11-27 01:30:38 +08:00
f9f074ef01 update 2024-11-27 01:27:32 +08:00
8df9799564 Update mw.py 2024-11-27 01:23:59 +08:00
80e49a6ff8 Update setting.py 2024-11-27 01:19:40 +08:00
2a3bad681b Update install_new.sh 2024-11-27 00:56:23 +08:00
f7c9d61e8d Update plugin.py 2024-11-27 00:22:33 +08:00
296f54127d Update panel_task.py 2024-11-27 00:22:01 +08:00
b8161b86d2 update 2024-11-27 00:17:57 +08:00
3305e51fda Update install.sh 2024-11-27 00:13:34 +08:00
4adaa8565c Update setting.py 2024-11-27 00:01:00 +08:00
5564b27ff2 Update mw.py 2024-11-26 23:50:47 +08:00
0f1b98721b up 2024-11-26 23:50:17 +08:00
3894eebfb5 update 2024-11-26 15:47:22 +08:00
e3070b618f Update plugin.py 2024-11-26 05:14:26 +08:00
5f144924e4 update 2024-11-26 05:02:47 +08:00
570f775c66 Update site.py 2024-11-26 04:58:11 +08:00
cbdf826951 Update site.py 2024-11-26 04:56:25 +08:00
9933035cae update 2024-11-26 04:53:43 +08:00
4e3e7b7301 update 2024-11-26 04:53:03 +08:00
4ed5c48650 update 2024-11-26 04:45:38 +08:00
f46c28b39d update 2024-11-26 04:43:57 +08:00
b124aabb7b update 2024-11-26 04:38:55 +08:00
6e48e0c339 Update mongodb.sh 2024-11-26 03:55:43 +08:00
79160854b9 Update index.py 2024-11-26 03:53:33 +08:00
f5089eeb16 update 2024-11-26 03:53:21 +08:00
453639bf92 Update index.py 2024-11-26 03:50:08 +08:00
5ca5265b92 Update index.py 2024-11-26 03:49:36 +08:00
88b86b2b2b Update install.sh 2024-11-26 03:46:00 +08:00
7da0fa4379 Update index.py 2024-11-26 03:41:53 +08:00
add4d4bb5e Update panel_task.py 2024-11-26 02:01:07 +08:00
39a1c1e6e0 update 2024-11-26 01:56:33 +08:00
0b37a34528 up 2024-11-26 00:37:55 +08:00
ffcceb16cf update 2024-11-25 22:38:16 +08:00
4b7296f99e Update panel_task.py 2024-11-25 22:16:19 +08:00
5796e311a9 update 2024-11-25 22:13:45 +08:00
8af22d14c8 update 2024-11-25 16:52:18 +08:00
bd5753eb27 Update panel_task.py 2024-11-25 16:26:18 +08:00
6a6166c8ac update 2024-11-25 03:20:54 +08:00
82a5af071a update 2024-11-25 03:17:52 +08:00
4e6f867ba4 update 2024-11-25 03:16:46 +08:00
8e0a4ec34b Update install.sh 2024-11-25 03:15:08 +08:00
d5678d3f34 Update firewall.py 2024-11-25 03:08:33 +08:00
cfd7030d00 Update firewall.py 2024-11-25 03:08:18 +08:00
360d94d573 Update firewall.py 2024-11-25 03:07:09 +08:00
b3370f2937 Update firewall.py 2024-11-25 03:04:04 +08:00
ce3e37b6f8 Update site.py 2024-11-25 02:54:41 +08:00
43384f8ca4 Update site.py 2024-11-25 02:53:55 +08:00
9ab361604f Update site.py 2024-11-25 02:53:00 +08:00
000b825ef0 Delete app.py 2024-11-25 02:40:26 +08:00
d00101f6eb update 2024-11-25 02:40:09 +08:00
2d8528ca8d Update index.py 2024-11-25 02:32:11 +08:00
c6d900c4e0 Update index.py 2024-11-25 02:31:12 +08:00
15314974f6 Update index.py 2024-11-25 02:27:21 +08:00
60a1bfe679 Update index.py 2024-11-25 02:22:13 +08:00
a3af4ac405 Update index.py 2024-11-25 02:22:03 +08:00
df7a43919f Update index.py 2024-11-25 02:21:07 +08:00
ae4f3851e5 Update index.py 2024-11-25 02:20:47 +08:00
e0384dd6cb Update msodclient.py 2024-11-25 02:10:44 +08:00
d8a34e7a0b Update site.js 2024-11-25 02:04:47 +08:00
e013eb8137 update 2024-11-25 01:59:22 +08:00
72917bdc5b Update site.py 2024-11-25 01:39:17 +08:00
cf74b0a941 Update mw.py 2024-11-25 01:37:38 +08:00
e027700d50 update 2024-11-25 01:33:59 +08:00
d7fe140ff2 update 2024-11-25 01:13:47 +08:00
00c0c592fc Update index.py 2024-11-25 01:04:38 +08:00
6603a49d7b Update index.py 2024-11-25 01:01:55 +08:00
3340112c11 update 2024-11-25 01:01:20 +08:00
741e1aedf6 Update mw.py 2024-11-25 00:56:59 +08:00
a156c14248 Update index.py 2024-11-25 00:52:48 +08:00
d56de6d827 Update site.py 2024-11-25 00:41:58 +08:00
6433d6fc50 Update site.py 2024-11-25 00:40:41 +08:00
58950d581c Update site.py 2024-11-25 00:40:18 +08:00
6cd613a172 Update site.py 2024-11-25 00:38:50 +08:00
1fa57de2c0 Update site.py 2024-11-25 00:35:54 +08:00
5ebdbc74ad Update version.py 2024-11-25 00:30:10 +08:00
9c130746fb update 2024-11-25 00:29:25 +08:00
7d83f29db7 Update mw.tpl 2024-11-24 22:07:47 +08:00
729ea2df8f Update cli.sh 2024-11-24 22:04:31 +08:00
c560d3fced Update mw.tpl 2024-11-24 22:04:07 +08:00
590a246fc0 Update mw.tpl 2024-11-24 22:03:51 +08:00
5ea712b943 Update cli.sh 2024-11-24 21:56:23 +08:00
6329ce3fd6 Update cli.sh 2024-11-24 21:54:28 +08:00
cd069b24c6 Update cli.sh 2024-11-24 21:54:00 +08:00
3da3453503 Update cli.sh 2024-11-24 21:53:38 +08:00
1ab7c21910 update 2024-11-24 21:50:08 +08:00
d074224447 Update site.py 2024-11-24 21:43:03 +08:00
3f0f219896 Update site.py 2024-11-24 21:31:44 +08:00
06bdad4ab0 Update site.py 2024-11-24 21:31:04 +08:00
f2dac6e1e6 Update site.py 2024-11-24 21:28:30 +08:00
116140f5df Update site.py 2024-11-24 21:20:57 +08:00
df46b40c0f Update site.py 2024-11-24 17:53:34 +08:00
196ab188bb Update site.py 2024-11-24 17:53:07 +08:00
dc9d114ca4 Update site.py 2024-11-24 17:46:23 +08:00
d1f8cf9a8e update 2024-11-24 17:42:40 +08:00
7836622cd6 Update site.py 2024-11-24 17:32:09 +08:00
c5500c57f1 Update site.py 2024-11-24 17:30:45 +08:00
7956b6c8f4 update 2024-11-24 17:18:57 +08:00
80dd014be5 update 2024-11-24 16:48:42 +08:00
06f8a3c01a Update site.py 2024-11-24 16:38:08 +08:00
e76a0b1288 Update index.py 2024-11-24 06:25:28 +08:00
e9efc4cc35 Update index.py 2024-11-24 06:18:15 +08:00
8d6e0f049c Update install.sh 2024-11-24 06:16:14 +08:00
b83e632328 Update tool_task.py 2024-11-24 06:12:24 +08:00
315a3759c3 Update tool_cron.py 2024-11-24 06:10:07 +08:00
df0efaa7b1 update 2024-11-24 06:05:18 +08:00
c731077fba Update tool_task.py 2024-11-24 06:04:37 +08:00
c9f03c0f69 修改引入公共方法方式 2024-11-24 06:02:41 +08:00
941285d168 update 2024-11-24 05:48:35 +08:00
141c56fbc2 update 2024-11-24 05:46:05 +08:00
beb6dd874a update 2024-11-24 05:41:55 +08:00
b0392b7cf1 update 2024-11-24 05:40:30 +08:00
d57b0d0922 Update mw.py 2024-11-24 05:36:53 +08:00
add966bc62 Update crontab.py 2024-11-24 05:32:51 +08:00
62a94c5c15 Update tool_task.py 2024-11-24 05:26:35 +08:00
3b857833a7 update 2024-11-24 05:18:34 +08:00
27e1e0c73c Update mw.py 2024-11-24 05:11:35 +08:00
41000f0c5d update 2024-11-24 05:10:19 +08:00
c249da061d Update mw.py 2024-11-24 05:01:42 +08:00
aa2126e7e6 Update crontab.py 2024-11-24 04:57:24 +08:00
2893f02735 update 2024-11-24 04:51:29 +08:00
5a072d7cda Update crontab.py 2024-11-24 04:46:40 +08:00
5218468b96 Update tool_task.py 2024-11-24 04:44:31 +08:00
e4d7ebbe25 Update tool_task.py 2024-11-24 04:44:24 +08:00
d32523c451 up 2024-11-24 04:43:22 +08:00
7eb88d6a92 Update tool_task.py 2024-11-24 04:43:00 +08:00
2d14184c82 Update index.py 2024-11-24 04:40:21 +08:00
080e4ad696 Update tool_task.py 2024-11-24 04:38:28 +08:00
c639d2736e update 2024-11-24 04:24:46 +08:00
339d9e829e Update cli.sh 2024-11-24 04:24:12 +08:00
21af7b2c1c Update setting.py 2024-11-24 04:21:44 +08:00
7ef0b5a9ae Update version.py 2024-11-24 04:19:22 +08:00
ba96b38a82 Update firewall.js 2024-11-24 04:18:02 +08:00
92f9a2b9a2 update 2024-11-24 04:17:05 +08:00
9f6cd75893 update 2024-11-24 04:13:22 +08:00
d8bf989f83 update 2024-11-24 04:06:53 +08:00
2cf2a893e6 Update mw.tpl 2024-11-24 03:53:23 +08:00
08ac6ea08c update 2024-11-24 03:49:53 +08:00
6246cc84d5 Update notify_email.py 2024-11-24 03:20:34 +08:00
b056892676 update 2024-11-24 02:57:18 +08:00
c1607752b2 update 2024-11-24 00:44:39 +08:00
cf7323cf12 Update site.js 2024-11-24 00:19:45 +08:00
9765cb99ea Update site.js 2024-11-24 00:19:18 +08:00
33c67f90db Create cert.py 2024-11-23 23:48:13 +08:00
f510d23c92 Update site.py 2024-11-23 23:18:03 +08:00
5b2e40404d update 2024-11-23 23:15:25 +08:00
ed375271d2 Update site.py 2024-11-23 17:42:03 +08:00
4a16502269 up 2024-11-22 21:47:33 +08:00
0862df3182 Update site.py 2024-11-22 01:39:37 +08:00
4c1e2a206d up 2024-11-22 01:09:42 +08:00
98fbaa099f update 2024-11-21 02:54:46 +08:00
8ae54e30d0 update 2024-11-20 16:40:06 +08:00
0eed51452a Update setting.py 2024-11-14 16:51:43 +08:00
f6ff18dd8d Update crontab.js 2024-11-14 15:14:53 +08:00
4602b9fc07 Update crontab.js 2024-11-14 15:14:10 +08:00
bf6aa15505 Update crontab.js 2024-11-14 15:00:30 +08:00
ee64e55eca update 2024-11-13 19:28:56 +08:00
f685054a9a update 2024-11-13 14:45:53 +08:00
bfc1974043 Update setting.py 2024-11-13 14:27:27 +08:00
c8b9dd2ae9 Update setting.py 2024-11-13 14:25:29 +08:00
289f736160 Update setting.py 2024-11-13 14:25:22 +08:00
28def91c7d Update __init__.py 2024-11-12 22:56:40 +08:00
b9371e9b94 Update firewall.py 2024-11-12 22:40:15 +08:00
29c65c0e7c update 2024-11-12 20:24:57 +08:00
b10e1ba8cc update 2024-11-12 20:24:48 +08:00
31ac0c2542 Update firewall.py 2024-11-12 20:21:12 +08:00
2d32d8dbb2 update 2024-11-12 20:05:34 +08:00
e6f1bbfabe Update __init__.py 2024-11-12 15:40:58 +08:00
98f7c4810e Update __init__.py 2024-11-12 14:33:19 +08:00
c9288e8dbe Update __init__.py 2024-11-12 01:42:53 +08:00
1cc8ac17f3 update 2024-11-12 01:42:02 +08:00
687f16e1ef Update firewall.py 2024-11-12 01:37:59 +08:00
1616d4d191 update 2024-11-12 01:36:30 +08:00
0da42e9ec8 Update __init__.py 2024-11-12 01:21:14 +08:00
49bfb5b3a8 update 2024-11-12 01:12:15 +08:00
17a9f07f04 Update app.py 2024-11-12 01:06:31 +08:00
b03f7abcb8 Update requirements.txt 2024-11-12 01:03:49 +08:00
990199ec89 update 2024-11-12 01:00:06 +08:00
96fcdb8af3 Update README.md 2024-11-12 00:15:37 +08:00
6e88b3b0c5 Create update.sh 2024-11-12 00:15:08 +08:00
c182635fd6 Update README.md 2024-11-12 00:10:16 +08:00
7b37a86acb update 2024-11-12 00:09:20 +08:00
0f5e196e3f update 2024-11-11 23:48:44 +08:00
8f1396bb8b up 2024-11-11 22:18:32 +08:00
89d6bbd317 Update default.sql 2024-11-11 00:56:03 +08:00
111aaa768a update 2024-11-11 00:48:54 +08:00
f511b8e44f Update app.py 2024-11-10 22:48:41 +08:00
af29e865e8 update 2024-11-10 22:43:08 +08:00
97b23b7148 Update files.js 2024-11-10 20:36:48 +08:00
a9f10842e7 Update files.js 2024-11-10 20:35:58 +08:00
8520bfcd27 update 2024-11-10 20:05:21 +08:00
d8a2e91922 update 2024-11-10 19:33:56 +08:00
08336eb2ee Update firewall.html 2024-11-10 19:13:53 +08:00
9945425f99 update 2024-11-10 18:28:34 +08:00
3a1a3f6579 update 2024-11-10 17:32:00 +08:00
23b3f213b6 Update panel_tools.py 2024-11-10 14:15:53 +08:00
c2a8b95231 update 2024-11-10 13:19:03 +08:00
e6af36a34b Update panel_task.py 2024-11-10 02:26:15 +08:00
e5ed04ce31 update 2024-11-10 02:15:35 +08:00
433ad507e7 update 2024-11-09 23:31:56 +08:00
d50d8abab8 update 2024-11-09 23:25:16 +08:00
8233ba99df update 2024-11-09 19:02:08 +08:00
020c8da426 update 2024-11-09 17:18:57 +08:00
f1a74e6275 update 2024-11-09 01:27:32 +08:00
260c37f63b update 2024-11-08 21:29:01 +08:00
03e37a2b88 Update __init__.py 2024-11-08 20:06:42 +08:00
e1e7fd51cd update 2024-11-08 19:56:37 +08:00
5c24373a32 Update __init__.py 2024-11-08 19:35:48 +08:00
8ed2f6848b update 2024-11-08 19:26:16 +08:00
8f1ec01b58 update 2024-11-08 18:26:46 +08:00
d5a8efff0e update 2024-11-08 18:22:01 +08:00
43420b7c38 update 2024-11-08 18:15:31 +08:00
fa614fcf88 Update site.py 2024-11-07 03:55:16 +08:00
1b4785ec52 Update site.py 2024-11-07 03:54:48 +08:00
35c42d94c6 Update site.py 2024-11-07 03:54:37 +08:00
8609033d37 Update binding.py 2024-11-07 03:53:09 +08:00
881facdfa8 update 2024-11-07 03:50:50 +08:00
e994cd80f1 Update panel_tools.py 2024-11-07 03:09:47 +08:00
accdb5834d up 2024-11-06 20:58:22 +08:00
bcfdd22161 update 2024-11-06 02:08:35 +08:00
82ee20b1a9 update 2024-11-05 03:29:36 +08:00
d83e7b6905 Update firewall.py 2024-11-05 03:00:02 +08:00
f9b7526007 Update mw.py 2024-11-05 02:59:41 +08:00
9ce92eb69e update 2024-11-05 02:56:12 +08:00
a4079c09ef Update tasks.py 2024-11-05 02:37:39 +08:00
a09a9d5889 Update tasks.py 2024-11-05 02:35:36 +08:00
1a3972fa21 Update tasks.py 2024-11-05 02:35:16 +08:00
e477a69b98 Update tasks.py 2024-11-05 02:33:23 +08:00
1ec2c33384 Update tasks.py 2024-11-05 02:30:46 +08:00
a0a4292cb8 Update panel_task.py 2024-11-05 02:28:22 +08:00
2fe3ed5407 update 2024-11-05 02:28:06 +08:00
0c9eae860f Update mw.py 2024-11-05 01:45:22 +08:00
f6c4f3b2ee Update mw.py 2024-11-05 01:44:04 +08:00
ec70d3e955 Update firewall.js 2024-11-05 01:42:09 +08:00
534af4f017 Update index_php_yum.py 2024-11-05 01:39:21 +08:00
804f7646d1 update 2024-11-05 01:39:07 +08:00
4d44650609 Update install.sh 2024-11-05 01:35:39 +08:00
91327c50f0 Update install.sh 2024-11-05 01:34:27 +08:00
024dedabaf update 2024-11-05 01:26:45 +08:00
fed4a4ae48 Update tasks.py 2024-11-05 01:20:54 +08:00
f217c07d12 Update tasks.py 2024-11-05 01:19:09 +08:00
8d2e70c31e Update panel_task.py 2024-11-05 01:16:17 +08:00
36bd8d8a1f Update panel_task.py 2024-11-05 01:16:08 +08:00
6bf4371a2b Update panel_task.py 2024-11-05 01:15:40 +08:00
72c6dbabab update 2024-11-05 01:15:17 +08:00
ef7b680e37 update 2024-11-05 01:12:04 +08:00
910defe18b update 2024-11-05 01:03:37 +08:00
6f232aa46e Update panel_task.py 2024-11-05 00:59:38 +08:00
8010ead35a update 2024-11-05 00:58:40 +08:00
39c634ab14 Update panel_tools.py 2024-11-05 00:51:55 +08:00
9cf9b53671 update 2024-11-05 00:46:25 +08:00
fbe2da1cd8 update 2024-11-05 00:38:22 +08:00
b1dd7ea609 update 2024-11-05 00:16:19 +08:00
d4cfd90ccd update 2024-11-04 19:08:39 +08:00
1826adf50e Update install.sh 2024-11-04 01:21:17 +08:00
b58d457742 Update new_cli.sh 2024-11-04 00:33:15 +08:00
f37cd39a65 Update new_cli.sh 2024-11-04 00:32:57 +08:00
98a53b8639 Update mw.py 2024-11-04 00:28:52 +08:00
795bee7de3 update 2024-11-04 00:27:32 +08:00
477b8b1f73 Update mw.py 2024-11-04 00:13:21 +08:00
d795dd7d47 Update logs.py 2024-11-04 00:02:30 +08:00
4a7fea3b4c Update __init__.py 2024-11-03 23:59:22 +08:00
83ae4562fa update 2024-11-03 23:56:25 +08:00
06abfd92f2 update 2024-11-03 23:44:05 +08:00
3ae8f0253e up 2024-11-03 22:21:41 +08:00
c77d409317 up 2024-11-03 21:16:13 +08:00
39603f367f Update panel_tools.py 2024-11-03 20:24:45 +08:00
044eb2b65f up 2024-11-03 20:21:35 +08:00
0b6cdec4ce Update __init__.py 2024-11-03 19:50:58 +08:00
8f0be8a475 Update init_cmd.py 2024-11-03 19:39:49 +08:00
6114bcd9bc Update init_cmd.py 2024-11-03 19:36:17 +08:00
0f89246b17 Update init_cmd.py 2024-11-03 19:36:09 +08:00
63145c736f Update init_cmd.py 2024-11-03 19:33:16 +08:00
52e98f6d41 update 2024-11-03 19:15:37 +08:00
0c6fb48989 update 2024-11-03 18:57:50 +08:00
7c696c24f3 Update panel_tools.py 2024-11-03 18:48:17 +08:00
91612a8465 Update user.py 2024-11-03 18:46:41 +08:00
063263d924 update 2024-11-03 18:45:36 +08:00
514518e278 Update user.py 2024-11-03 18:36:16 +08:00
3ce1289c44 update 2024-11-03 18:14:25 +08:00
ed90f9a087 Update system.sql 2024-11-03 14:57:20 +08:00
9a9faa6a33 Update monitor.py 2024-11-03 03:38:07 +08:00
fa6900a937 Update monitor.py 2024-11-03 03:34:21 +08:00
b020f4c502 Update system.py 2024-11-03 03:31:47 +08:00
122bef53ff Update system.sql 2024-11-03 03:25:21 +08:00
bed1d7ee85 Update system.sql 2024-11-03 03:25:08 +08:00
7f68067f67 update 2024-11-03 03:17:02 +08:00
06d43efd7f update 2024-11-03 03:06:40 +08:00
745d95bbcb Update __init__.py 2024-11-03 02:20:52 +08:00
7f5b45fbdc Update monitor.py 2024-11-03 02:01:20 +08:00
179bc05e09 Update mw.py 2024-11-03 01:34:10 +08:00
5e53c637c3 update 2024-11-03 01:28:19 +08:00
d7b7c572b0 update 2024-11-03 00:59:26 +08:00
18e59ef377 up 2024-11-02 16:16:31 +08:00
fa64dfb89b update 2024-11-02 16:15:21 +08:00
5788693e6c Update install.sh 2024-11-02 16:14:29 +08:00
083f5e2271 update 2024-11-02 16:13:16 +08:00
6b378a9712 update 2024-11-02 16:12:55 +08:00
2a19a8f93d Update install.sh 2024-11-02 16:03:58 +08:00
c6418069fb Update install.sh 2024-11-02 16:01:48 +08:00
b66ab079ed Update install.sh 2024-11-02 15:58:50 +08:00
07bca6cac8 update 2024-11-02 15:54:37 +08:00
01b6ede03e update 2024-11-02 15:41:33 +08:00
472f441c0e update 2024-11-02 02:47:47 +08:00
31571a60e3 update 2024-11-02 02:19:58 +08:00
8803d3ee03 Update new_cli.sh 2024-11-01 21:30:24 +08:00
d81764cc78 Update __init__.py 2024-11-01 21:30:18 +08:00
c56c1c7274 Update __init__.py 2024-11-01 21:28:39 +08:00
580235b105 Update __init__.py 2024-11-01 21:24:14 +08:00
210dbfe164 Update __init__.py 2024-11-01 21:18:49 +08:00
e6598ff57d update 2024-11-01 21:16:25 +08:00
1dc21b3c0b Update __init__.py 2024-11-01 21:14:26 +08:00
1bae404c5e Update adult_log.py 2024-11-01 19:06:54 +08:00
39b3936eca Update adult_log.py 2024-11-01 19:04:14 +08:00
205bb47101 Update user.py 2024-11-01 19:00:21 +08:00
a4cdc1e03b Update user.py 2024-11-01 18:59:08 +08:00
0467d39c90 Update user.py 2024-11-01 18:57:12 +08:00
f8f152affb Update user.py 2024-11-01 18:56:49 +08:00
b2f595dfb2 Update user.py 2024-11-01 18:52:46 +08:00
3f3221a3df Update user.py 2024-11-01 18:48:04 +08:00
0eea41ba85 Update panel_tools.py 2024-11-01 18:45:07 +08:00
90a406e5e9 Update panel_tools.py 2024-11-01 18:43:07 +08:00
671859ad3c Update panel_tools.py 2024-11-01 18:37:00 +08:00
306d69bd39 Update mw.tpl 2024-11-01 18:36:04 +08:00
f3552281c5 Update mw.tpl 2024-11-01 18:35:07 +08:00
669bbfce93 Update mw.tpl 2024-11-01 18:34:35 +08:00
9b1552269b update 2024-11-01 18:30:50 +08:00
559e549590 Update panel_tools.py 2024-11-01 18:18:58 +08:00
fb8b5314e1 Update panel_tools.py 2024-11-01 18:18:12 +08:00
d767a4d4a2 update 2024-11-01 18:14:31 +08:00
759cbd1065 Update mw.tpl 2024-11-01 17:34:48 +08:00
386448d60c Update mw.tpl 2024-11-01 17:34:15 +08:00
3d381b6dfa Update mw.tpl 2024-11-01 17:33:16 +08:00
39c9a260cb Update mw.tpl 2024-11-01 17:32:30 +08:00
b0e9a13984 Update mw.tpl 2024-11-01 17:26:01 +08:00
9ff26caa5f Update mw.tpl 2024-11-01 17:22:32 +08:00
d5e2f554f1 update 2024-11-01 17:21:19 +08:00
14ee45918f Update panel_tools.py 2024-11-01 17:18:19 +08:00
9fd7d20051 Update mw.tpl 2024-11-01 17:16:47 +08:00
328543852c Update mw.tpl 2024-11-01 17:13:06 +08:00
aa23809390 Update mw.tpl 2024-11-01 17:01:52 +08:00
6da09e708a Update mw.tpl 2024-11-01 16:58:51 +08:00
b44fec1859 Update __init__.py 2024-11-01 16:56:45 +08:00
71ab5920c8 Update README.md 2024-11-01 16:55:47 +08:00
4bd04eb71d Update update_new.sh 2024-11-01 16:55:22 +08:00
c08a2965ab Create update_new.sh 2024-11-01 16:54:42 +08:00
87c50e529d Update mw.tpl 2024-11-01 16:51:45 +08:00
1524 changed files with 100843 additions and 87692 deletions

View File

@@ -34,5 +34,5 @@ jobs:
cd /www/server/mdserver-web/plugins/mysql && sudo bash install.sh install 5.5
- name: Start DEBUG
run: |
gunicorn -c setting.py app:app
python3 task.py &
cd web && gunicorn -c setting.py app:app
python3 panel_task.py &

View File

@@ -34,5 +34,5 @@ jobs:
cd /www/server/mdserver-web/plugins/mysql && sudo bash install.sh install 5.6
- name: Start DEBUG
run: |
gunicorn -c setting.py app:app
python3 task.py &
cd web && gunicorn -c setting.py app:app
python3 panel_task.py &

View File

@@ -34,5 +34,5 @@ jobs:
cd /www/server/mdserver-web/plugins/mysql && sudo bash install.sh install 5.7
- name: Start DEBUG
run: |
gunicorn -c setting.py app:app
python3 task.py &
cd web && gunicorn -c setting.py app:app
python3 panel_task.py &

View File

@@ -34,5 +34,5 @@ jobs:
cd /www/server/mdserver-web/plugins/mysql && sudo bash install.sh install 8.0
- name: Start DEBUG
run: |
gunicorn -c setting.py app:app
python3 task.py &
cd web && gunicorn -c setting.py app:app
python3 panel_task.py &

View File

@@ -31,8 +31,8 @@ jobs:
sudo bash scripts/install_dev.sh
- name: Install OpenResty
run: |
cd /www/server/mdserver-web/plugins/openresty && sudo bash install.sh install 1.21.4.1
cd /www/server/mdserver-web/plugins/openresty && sudo bash install.sh install 1.27.1
- name: Start DEBUG
run: |
gunicorn -c setting.py app:app
python3 task.py &
source /www/server/mdserver-web/bin/activate && cd web && gunicorn -c setting.py app:app
cd /www/server/mdserver-web && python3 panel_task.py &

View File

@@ -64,5 +64,5 @@ jobs:
cd /www/server/mdserver-web/plugins/php && sudo bash install.sh install 81
- name: Start DEBUG
run: |
gunicorn -c setting.py app:app
python3 task.py &
source /www/server/mdserver-web/bin/activate && cd web && gunicorn -c setting.py app:app
cd /www/server/mdserver-web && python3 panel_task.py &

21
.gitignore vendored
View File

@@ -119,7 +119,13 @@ debug.out
mdioks.session-journal
*.session
logs/*
temp
logs/panel.pid
logs/panel.log
logs/panel_task.log
logs/panel_exec.log
logs/panel_task.lock
ssl/local
ssl/nginx
@@ -161,6 +167,7 @@ data/api.json
data/bind_domain.pl
data/unauthorized_status.pl
data/auth_secret.pl
data/panelSpeed.pl
plugins/vip_*
plugins/own_*
@@ -169,8 +176,6 @@ plugins/op_auth
plugins/l2tp
plugins/openlitespeed
plugins/tamper_proof
plugins/cryptocurrency_trade
plugins/mtproxy
plugins/zimg
plugins/bk_demo
plugins/mail
@@ -183,6 +188,12 @@ plugins/tidb
plugins/goedge-admin
plugins/goedge-node
plugins/goedge-happy
plugins/dztasks
data/default_new.pl
/logs
/data
/plugins/flexcdn
/plugins/tools
/plugins/choose-linux-python
*.md5
/bak
*.tmp

View File

@@ -22,7 +22,6 @@
* SSH终端工具
* 面板收藏功能
* 网站子目录绑定
* 网站备份功能
* 插件方式管理
@@ -37,16 +36,21 @@ Talk is cheap, show me the code. -- linus
```
- [兼容性测试报告](/compatibility.md)
- [常用命令说明](/cmd.md) [ mw default ] [ mw update_dev ]
- [常用命令说明](/cmd.md) [ mw default ] [ mw dev ]
### 特别赞助
- [虚位以待](https://bbs.midoks.icu)
### 主要插件介绍
* OpenResty - 轻量级,占有内存少,并发能力强。
* PHP[53-84] - PHP是世界上最好的编程语言。
* PHP[53-85] - PHP是世界上最好的编程语言。
* MySQL - 一种关系数据库管理系统。
* MariaDB - 是MySQL的一个重要分支。
* MySQL[APT/YUM] - 一种关系数据库管理系统。
* MySQL[community] - 一种关系数据库管理系统。
* MongoDB - 一种非关系NOSQL数据库管理系统。
* PostgreSQL - 功能强大的开源数据库。
* phpMyAdmin - 著名Web端MySQL管理工具。
* Memcached - 一个高性能的分布式内存对象缓存系统。
* Redis - 一个高性能的KV数据库。
@@ -88,14 +92,8 @@ PHP[72-84]支持phpMyAdmin[5.2.1]
- https://www.youtube.com/watch?v=2taa5K-Jmmw
# 特别赞助
- [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan1.cc)
# AD - VPS推荐 - 🙏
- [ZZZ评测](https://www.zzzvps.com/)
| 服务商 | LOGO | 推广地址 | 优惠码 |
| ------------- |----------|-----------|-------|
| digitalvirt |[![digitalvirt](https://digitalvirt.com/templates/BlueWhite/img/logo-dark.svg)](https://digitalvirt.com/aff.php?aff=154) | https://digitalvirt.com/aff.php?aff=154 | mdserver-web |
@@ -110,25 +108,22 @@ docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443:
```
### 版本更新 0.17.3
### 版本更新 0.19.0
- 新增pgadmin插件。
- 新增acme_pandominassl_apply插件。
- 新增快捷指令:mw pgdb。
- 常规更新。
- 常规优化。
### JSDelivr安装地址
### 增加在线更新支持。
- 初始安装
```
curl --insecure -fsSL https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/install.sh | bash
bash <(curl --insecure -fsSL https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/install.sh)
```
- 直接更新
```
curl --insecure -fsSL https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/update.sh | bash
bash <(curl --insecure -fsSL https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/update.sh)
```
- 卸载脚本
@@ -142,14 +137,15 @@ wget --no-check-certificate -O uninstall.sh https://cdn.jsdelivr.net/gh/midoks/m
- 初始安装
```
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/master/scripts/install.sh | bash
curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/master/scripts/install.sh | bash
bash <(curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install.sh)
bash <(curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/master/scripts/install.sh)
```
- 直接更新
```
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/master/scripts/update.sh | bash
bash <(curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/master/scripts/update.sh)
```
- 卸载脚本
@@ -164,29 +160,47 @@ wget --no-check-certificate -O uninstall.sh https://raw.githubusercontent.com/mi
- 需已经安装mdserver-web
```
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/app.sh | bash
bash <(curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/app.sh)
```
### 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/update_dev.sh | bash
bash <(curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install.sh)
bash <(curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/update.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)
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
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/debug.sh | bash
bash <(curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/debug.sh)
curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/install_dev.sh | bash
curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/update_dev.sh | bash
bash <(curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/install.sh)
bash <(curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/update.sh)
bash <(curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/install_dev.sh)
bash <(curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/update_dev.sh)
```
### 旧版安装/更新
```
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/old/install.sh | bash
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/old/update.sh | bash
```
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install_new.sh | bash
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/install_new.sh | bash
### 偶然问题
- 在安装/更新时,突然出现python插件pip,psutil,可尝试如下解决方案
```
cd /www/server/mdserver-web rm -rf lib
cd /www/server/mdserver-web && rm -rf lib64
cd /www/server/mdserver-web && rm -rf bin
cd /www/server/mdserver-web && rm -rf include
mw update/mw update_dev/mw dev
```
### 捐赠地址 USDT(TRC20)

52
app.py
View File

@@ -1,52 +0,0 @@
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# 入口文件
# ---------------------------------------------------------------------------------
# pip install profiler_online
# 性能测试
# from profiler_online import run_profiler
# run_profiler()
import sys
import io
import os
sys.dont_write_bytecode = True
from route import app, socketio
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from gevent import monkey
monkey.patch_all()
try:
if __name__ == "__main__":
PORT = 7200
if os.path.exists('data/port.pl'):
f = open('data/port.pl')
PORT = int(f.read())
f.close()
# HOST = '0.0.0.0'
# app.run(host=HOST, port=PORT)
http_server = WSGIServer(
(HOST, PORT), app, handler_class=WebSocketHandler)
http_server.serve_forever()
socketio.run(app, host=HOST, port=PORT)
except Exception as ex:
print(ex)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,146 +0,0 @@
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# 公共操作
# ---------------------------------------------------------------------------------
import os
import sys
import time
import string
import json
import hashlib
import shlex
import datetime
import subprocess
import re
import hashlib
from random import Random
import mw
import db
from flask import redirect
def init():
initDB()
initUserInfo()
initInitD()
initInitTask()
return True
def local():
result = checkClose()
if result:
return result
# 检查面板是否关闭
def checkClose():
if os.path.exists('data/close.pl'):
return redirect('/close')
def initDB():
try:
sql = db.Sql().dbfile('default')
csql = mw.readFile('data/sql/default.sql')
csql_list = csql.split(';')
for index in range(len(csql_list)):
sql.execute(csql_list[index], ())
except Exception as ex:
print(str(ex))
def doContentReplace(src, dst):
content = mw.readFile(src)
content = content.replace("{$SERVER_PATH}", mw.getRunDir())
mw.writeFile(dst, content)
def initInitD():
# systemctl
# sysCfgDir = mw.systemdCfgDir()
# if os.path.exists(sysCfgDir) and mw.getOsName() == 'centos' and mw.getOsID() == '9':
# systemd_mw = sysCfgDir + '/mw.service'
# systemd_mw_task = sysCfgDir + '/mw-task.service'
# systemd_mw_tpl = mw.getRunDir() + '/scripts/init.d/mw.service.tpl'
# systemd_mw_task_tpl = mw.getRunDir() + '/scripts/init.d/mw-task.service.tpl'
# if os.path.exists(systemd_mw):
# os.remove(systemd_mw)
# if os.path.exists(systemd_mw_task):
# os.remove(systemd_mw_task)
# doContentReplace(systemd_mw_tpl, systemd_mw)
# doContentReplace(systemd_mw_task_tpl, systemd_mw_task)
# mw.execShell('systemctl enable mw')
# mw.execShell('systemctl enable mw-task')
# mw.execShell('systemctl daemon-reload')
script = mw.getRunDir() + '/scripts/init.d/mw.tpl'
script_bin = mw.getRunDir() + '/scripts/init.d/mw'
doContentReplace(script, script_bin)
mw.execShell('chmod +x ' + script_bin)
# 在linux系统中,确保/etc/init.d存在
if not mw.isAppleSystem() and not os.path.exists("/etc/rc.d/init.d"):
mw.execShell('mkdir -p /etc/rc.d/init.d')
if not mw.isAppleSystem() and not os.path.exists("/etc/init.d"):
mw.execShell('mkdir -p /etc/init.d')
# initd
if os.path.exists('/etc/rc.d/init.d'):
initd_bin = '/etc/rc.d/init.d/mw'
if not os.path.exists(initd_bin):
import shutil
shutil.copyfile(script_bin, initd_bin)
mw.execShell('chmod +x ' + initd_bin)
# 加入自启动
mw.execShell('which chkconfig && chkconfig --add mw')
if os.path.exists('/etc/init.d'):
initd_bin = '/etc/init.d/mw'
if not os.path.exists(initd_bin):
import shutil
shutil.copyfile(script_bin, initd_bin)
mw.execShell('chmod +x ' + initd_bin)
# 加入自启动
mw.execShell('which update-rc.d && update-rc.d -f mw defaults')
# 获取系统IPV4
mw.setHostAddr(mw.getLocalIp())
def initInitTask():
# 创建证书同步命令
import cert_api
api = cert_api.cert_api()
api.createCertCron()
def initUserInfo():
data = mw.M('users').where('id=?', (1,)).getField('password')
if data == '21232f297a57a5a743894a0e4a801fc3':
pwd = mw.getRandomString(8).lower()
file_pw = mw.getRunDir() + '/data/default.pl'
mw.writeFile(file_pw, pwd)
mw.M('users').where('id=?', (1,)).setField(
'password', mw.md5(pwd))

File diff suppressed because it is too large Load Diff

View File

@@ -1,694 +0,0 @@
# 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 flask import request
class crontab_api:
field = 'id,name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress'
def __init__(self):
pass
##### ----- start ----- ###
def listApi(self):
p = request.args.get('p', 1)
psize = 10
startPage = (int(p) - 1) * psize
pageInfo = str(startPage) + ',' + str(psize)
_list = mw.M('crontab').where('', ()).field(
self.field).limit(pageInfo).order('id desc').select()
data = []
for i in range(len(_list)):
tmp = _list[i]
if _list[i]['type'] == "day":
tmp['type'] = '每天'
tmp['cycle'] = mw.getInfo('每天, {1}点{2}分 执行', (str(
_list[i]['where_hour']), str(_list[i]['where_minute'])))
elif _list[i]['type'] == "day-n":
tmp['type'] = mw.getInfo(
'每{1}天', (str(_list[i]['where1']),))
tmp['cycle'] = mw.getInfo('每隔{1}天, {2}点{3}分 执行', (str(
_list[i]['where1']), str(_list[i]['where_hour']), str(_list[i]['where_minute'])))
elif _list[i]['type'] == "hour":
tmp['type'] = '每小时'
tmp['cycle'] = mw.getInfo(
'每小时, 第{1}分钟 执行', (str(_list[i]['where_minute']),))
elif _list[i]['type'] == "hour-n":
tmp['type'] = mw.getInfo(
'每{1}小时', (str(_list[i]['where1']),))
tmp['cycle'] = mw.getInfo('每{1}小时, 第{2}分钟 执行', (str(
_list[i]['where1']), str(_list[i]['where_minute'])))
elif _list[i]['type'] == "minute-n":
tmp['type'] = mw.getInfo(
'每{1}分钟', (str(_list[i]['where1']),))
tmp['cycle'] = mw.getInfo(
'每隔{1}分钟执行', (str(_list[i]['where1']),))
elif _list[i]['type'] == "week":
tmp['type'] = '每周'
if not _list[i]['where1']:
_list[i]['where1'] = '0'
tmp['cycle'] = mw.getInfo('每周{1}, {2}点{3}分执行', (self.toWeek(int(
_list[i]['where1'])), str(_list[i]['where_hour']), str(_list[i]['where_minute'])))
elif _list[i]['type'] == "month":
tmp['type'] = '每月'
tmp['cycle'] = mw.getInfo('每月, {1}日 {2}点{3}分执行', (str(_list[i]['where1']), str(
_list[i]['where_hour']), str(_list[i]['where_minute'])))
data.append(tmp)
rdata = {}
rdata['data'] = data
count = mw.M('crontab').where('', ()).count()
_page = {}
_page['count'] = count
_page['p'] = p
_page['row'] = psize
_page['tojs'] = "getCronData"
rdata['list'] = mw.getPage(_page)
rdata['p'] = p
# backup hook
bh_file = mw.getPanelDataDir() + "/hook_backup.json"
if os.path.exists(bh_file):
hb_data = mw.readFile(bh_file)
hb_data = json.loads(hb_data)
rdata['backup_hook'] = hb_data
return mw.getJson(rdata)
# 设置计划任务状态
def setCronStatusApi(self):
mid = request.form.get('id', '')
cronInfo = mw.M('crontab').where(
'id=?', (mid,)).field(self.field).find()
status = 1
if cronInfo['status'] == status:
status = 0
self.removeForCrond(cronInfo['echo'])
else:
cronInfo['status'] = 1
self.syncToCrond(cronInfo)
mw.M('crontab').where('id=?', (mid,)).setField('status', status)
mw.writeLog(
'计划任务', '修改计划任务[' + cronInfo['name'] + ']状态为[' + str(status) + ']')
return mw.returnJson(True, '设置成功')
# 获取指定任务数据
def getCrondFindApi(self):
sid = request.form.get('id', '')
data = mw.M('crontab').where(
'id=?', (sid,)).field(self.field).find()
return mw.getJson(data)
# 参数校验
def cronCheck(self, params):
if params['stype'] == 'site' or params['stype'] == 'database' or params['stype'].find('database_') > -1 or params['stype'] == 'logs' or params['stype'] == 'path':
if params['save'] == '':
return False, '保留份数不能为空!'
if params['type'] == 'day':
if params['hour'] == '':
return False, '小时不能为空!'
if params['minute'] == '':
return False, '分钟不能为空!'
if params['type'] == 'day-n':
if params['where1'] == '':
return False, '天不能为空!'
if params['hour'] == '':
return False, '小时不能为空!'
if params['minute'] == '':
return False, '分钟不能为空!'
if params['type'] == 'hour':
if params['minute'] == '':
return False, '分钟不能为空!'
if params['type'] == 'hour-n':
if params['where1'] == '':
return False, '小时不能为空!'
if params['minute'] == '':
return False, '分钟不能为空!'
if params['type'] == 'minute-n':
if params['where1'] == '':
return False, '分钟不能为空!'
if params['type'] == 'week':
if params['hour'] == '':
return False, '小时不能为空!'
if params['minute'] == '':
return False, '分钟不能为空!'
if params['type'] == 'month':
if params['where1'] == '':
return False, '日不能为空!'
if params['hour'] == '':
return False, '小时不能为空!'
if params['minute'] == '':
return False, '分钟不能为空!'
return True, 'OK'
def modifyCrondApi(self):
sid = request.form.get('id', '')
iname = request.form.get('name', '')
field_type = request.form.get('type', '')
week = request.form.get('week', '')
where1 = request.form.get('where1', '')
hour = request.form.get('hour', '')
minute = request.form.get('minute', '')
save = request.form.get('save', '')
backup_to = request.form.get('backup_to', '')
stype = request.form.get('stype', '')
sname = request.form.get('sname', '')
sbody = request.form.get('sbody', '')
urladdress = request.form.get('urladdress', '')
if len(iname) < 1:
return mw.returnJson(False, '任务名称不能为空!')
params = {
'name': iname,
'type': field_type,
'week': week,
'where1': where1,
'hour': hour,
'minute': minute,
'save': save,
'backup_to': backup_to,
'stype': stype,
'sname': sname,
'sbody': sbody,
'urladdress': urladdress,
}
is_check_pass, msg = self.cronCheck(params)
if not is_check_pass:
return mw.returnJson(is_check_pass, msg)
cuonConfig, get, name = self.getCrondCycle(params)
cronInfo = mw.M('crontab').where(
'id=?', (sid,)).field(self.field).find()
del(cronInfo['id'])
del(cronInfo['addtime'])
cronInfo['name'] = get['name']
cronInfo['type'] = get['type']
cronInfo['where1'] = get['where1']
cronInfo['where_hour'] = get['hour']
cronInfo['where_minute'] = get['minute']
cronInfo['save'] = get['save']
cronInfo['backup_to'] = get['backup_to']
cronInfo['sbody'] = get['sbody']
cronInfo['urladdress'] = get['urladdress']
addData = mw.M('crontab').where('id=?', (sid,)).save('name,type,where1,where_hour,where_minute,save,backup_to, sname, sbody,urladdress',
(iname, field_type, get['where1'], get['hour'], get['minute'], get['save'], get['backup_to'], sname, get['sbody'], get['urladdress']))
self.removeForCrond(cronInfo['echo'])
self.syncToCrond(cronInfo)
mw.writeLog('计划任务', '修改计划任务[' + cronInfo['name'] + ']成功')
return mw.returnJson(True, '修改成功')
def logsApi(self):
sid = request.form.get('id', '')
echo = mw.M('crontab').where("id=?", (sid,)).field('echo').find()
logFile = mw.getServerDir() + '/cron/' + echo['echo'] + '.log'
if not os.path.exists(logFile):
return mw.returnJson(False, '当前日志为空!')
log = mw.getLastLine(logFile, 500)
return mw.returnJson(True, log)
def addApi(self):
iname = request.form.get('name', '')
field_type = request.form.get('type', '')
week = request.form.get('week', '')
where1 = request.form.get('where1', '')
hour = request.form.get('hour', '')
minute = request.form.get('minute', '')
save = request.form.get('save', '')
backup_to = request.form.get('backupTo', '')
stype = request.form.get('sType', '')
sname = request.form.get('sName', '')
sbody = request.form.get('sBody', '')
urladdress = request.form.get('urladdress', '')
if len(iname) < 1:
return mw.returnJson(False, '任务名称不能为空!')
params = {
'name': iname,
'type': field_type,
'week': week,
'where1': where1,
'hour': hour,
'minute': minute,
'save': save,
'backup_to': backup_to,
'stype': stype,
'sname': sname,
'sbody': sbody,
'urladdress': urladdress,
}
is_check_pass, msg = self.cronCheck(params)
if not is_check_pass:
return mw.returnJson(is_check_pass, msg)
addData = self.add(params)
if type(addData) == str:
return addData
if addData > 0:
return mw.returnJson(True, '添加成功')
return mw.returnJson(False, '添加失败')
def add(self, params):
iname = params["name"]
field_type = params["type"]
week = params["week"]
where1 = params["where1"]
hour = params["hour"]
minute = params["minute"]
save = params["save"]
backup_to = params["backup_to"]
stype = params["stype"]
sname = params["sname"]
sbody = params["sbody"]
urladdress = params["urladdress"]
# print params
cronConfig, get, name = self.getCrondCycle(params)
cronPath = mw.getServerDir() + '/cron'
cronName = self.getShell(params)
if type(cronName) == dict:
return cronName
cronConfig += ' ' + cronPath + '/' + cronName + \
' >> ' + cronPath + '/' + cronName + '.log 2>&1'
# print(cronConfig)
if not mw.isAppleSystem():
wRes = self.writeShell(cronConfig)
if type(wRes) != bool:
return wRes
self.crondReload()
add_time = time.strftime('%Y-%m-%d %X', time.localtime())
task_id = mw.M('crontab').add('name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress',
(iname, field_type, where1, hour, minute, cronName, add_time, 1, save, backup_to, stype, sname, sbody, urladdress,))
return task_id
def startTaskApi(self):
sid = request.form.get('id', '')
echo = mw.M('crontab').where('id=?', (sid,)).getField('echo')
execstr = mw.getServerDir() + '/cron/' + echo
os.system('chmod +x ' + execstr)
os.system('nohup ' + execstr + ' >> ' + execstr + '.log 2>&1 &')
return mw.returnJson(True, '任务已执行!')
def delApi(self):
task_id = request.form.get('id', '')
try:
data = self.delete(task_id)
if not data[0]:
return mw.returnJson(False, data[1])
return mw.returnJson(True, '删除成功')
except Exception as e:
return mw.returnJson(False, '删除失败:' + str(e))
def delete(self, tid):
find = mw.M('crontab').where("id=?", (tid,)).field('name,echo').find()
if not self.removeForCrond(find['echo']):
return (False, '无法写入文件,请检查是否开启了系统加固功能!')
cronPath = mw.getServerDir() + '/cron'
sfile = cronPath + '/' + find['echo']
if os.path.exists(sfile):
os.remove(sfile)
sfile = cronPath + '/' + find['echo'] + '.log'
if os.path.exists(sfile):
os.remove(sfile)
mw.M('crontab').where("id=?", (tid,)).delete()
mw.writeLog('计划任务', mw.getInfo('删除计划任务[{1}]成功!', (find['name'],)))
return (True, "OK")
def delLogsApi(self):
sid = request.form.get('id', '')
try:
echo = mw.M('crontab').where("id=?", (sid,)).getField('echo')
logFile = mw.getServerDir() + '/cron/' + echo + '.log'
os.remove(logFile)
return mw.returnJson(True, '任务日志已清空!')
except:
return mw.returnJson(False, '任务日志清空失败!')
# 取数据列表
def getDataListApi(self):
stype = request.form.get('type', '')
bak_data = []
if stype == 'site' or stype == 'sites' or stype == 'database' or stype.find('database_') > -1 or stype == 'path':
hookPath = mw.getPanelDataDir() + "/hook_backup.json"
if os.path.exists(hookPath):
t = mw.readFile(hookPath)
bak_data = json.loads(t)
if stype == 'database' or stype.find('database_') > -1:
sqlite3_name = 'mysql'
path = mw.getServerDir() + '/mysql'
if stype != 'database':
soft_name = stype.replace('database_', '')
path = mw.getServerDir() + '/' + soft_name
if soft_name == 'postgresql':
sqlite3_name = 'pgsql'
if soft_name == 'mongodb':
sqlite3_name = 'mongodb'
db_list = {}
db_list['orderOpt'] = bak_data
if not os.path.exists(path + '/' + sqlite3_name + '.db'):
db_list['data'] = []
else:
db_list['data'] = mw.M('databases').dbPos(path, sqlite3_name).field('name,ps').select()
return mw.getJson(db_list)
if stype == 'path':
db_list = {}
db_list['data'] = [{"name": mw.getWwwDir(), "ps": "www"}]
db_list['orderOpt'] = bak_data
return mw.getJson(db_list)
data = {}
data['orderOpt'] = bak_data
default_db = 'sites'
# if stype == 'site' or stype == 'logs':
# stype == 'sites'
data['data'] = mw.M(default_db).field('name,ps').select()
return mw.getJson(data)
##### ----- start ----- ###
# 转换大写星期
def toWeek(self, num):
wheres = {
0: '日',
1: '一',
2: '二',
3: '三',
4: '四',
5: '五',
6: '六'
}
try:
return wheres[num]
except:
return ''
def getCrondCycle(self, params):
cuonConfig = ''
name = ''
if params['type'] == "day":
cuonConfig = self.getDay(params)
name = '每天'
elif params['type'] == "day-n":
cuonConfig = self.getDay_N(params)
name = mw.getInfo('每{1}天', (params['where1'],))
elif params['type'] == "hour":
cuonConfig = self.getHour(params)
name = '每小时'
elif params['type'] == "hour-n":
cuonConfig = self.getHour_N(params)
name = '每小时'
elif params['type'] == "minute-n":
cuonConfig = self.minute_N(params)
elif params['type'] == "week":
params['where1'] = params['week']
cuonConfig = self.week(params)
elif params['type'] == "month":
cuonConfig = self.month(params)
return cuonConfig, params, name
# 取任务构造Day
def getDay(self, param):
cuonConfig = "{0} {1} * * * ".format(param['minute'], param['hour'])
return cuonConfig
# 取任务构造Day_n
def getDay_N(self, param):
cuonConfig = "{0} {1} */{2} * * ".format(
param['minute'], param['hour'], param['where1'])
return cuonConfig
# 取任务构造Hour
def getHour(self, param):
cuonConfig = "{0} * * * * ".format(param['minute'])
return cuonConfig
# 取任务构造Hour-N
def getHour_N(self, param):
cuonConfig = "{0} */{1} * * * ".format(
param['minute'], param['where1'])
return cuonConfig
# 取任务构造Minute-N
def minute_N(self, param):
cuonConfig = "*/{0} * * * * ".format(param['where1'])
return cuonConfig
# 取任务构造week
def week(self, param):
cuonConfig = "{0} {1} * * {2}".format(
param['minute'], param['hour'], param['week'])
return cuonConfig
# 取任务构造Month
def month(self, param):
cuonConfig = "{0} {1} {2} * * ".format(
param['minute'], param['hour'], param['where1'])
return cuonConfig
# 取执行脚本
def getShell(self, param):
# try:
stype = param['stype']
if stype == 'toFile':
shell = param.sFile
else:
head = "#!/bin/bash\nPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin\nexport PATH\n"
start_head = '''
SCRIPT_RUN_TIME="0s"
MW_ToSeconds()
{
SEC=$1
if [ $SEC -lt 60 ]; then
SCRIPT_RUN_TIME="${SEC}s"
elif [ $SEC -ge 60 ] && [ $SEC -lt 3600 ];then
SCRIPT_RUN_TIME="$(( SEC / 60 ))m$(( SEC % 60 ))s"
elif [ $SEC -ge 3600 ]; then
SCRIPT_RUN_TIME="$(( SEC / 3600 ))h$(( (SEC % 3600) / 60 ))m$(( (SEC % 3600) % 60 ))s"
fi
}
START_MW_SHELL_TIME=`date +%s`
'''
source_bin_activate = '''
export LANG=en_US.UTF-8
MW_PATH=%s/bin/activate
if [ -f $MW_PATH ];then
source $MW_PATH
fi''' % (mw.getRunDir(),)
head = head + start_head + source_bin_activate + "\n"
log = '.log'
#所有
if param['sname'] == 'ALL':
log = ''
script_dir = mw.getRunDir() + "/scripts"
source_stype = 'database'
if stype.find('database_') > -1:
plugin_name = stype.replace('database_', '')
script_dir = mw.getRunDir() + "/plugins/" + plugin_name + "/scripts"
source_stype = stype
stype = 'database'
wheres = {
'path': head + "python3 " + script_dir + "/backup.py path " + param['sname'] + " " + str(param['save']),
'site': head + "python3 " + script_dir + "/backup.py site " + param['sname'] + " " + str(param['save']),
'database': head + "python3 " + script_dir + "/backup.py database " + param['sname'] + " " + str(param['save']),
'logs': head + "python3 " + script_dir + "/logs_backup.py " + param['sname'] + log + " " + str(param['save']),
'rememory': head + "/bin/bash " + script_dir + '/rememory.sh'
}
if param['backup_to'] != 'localhost':
cfile = mw.getPluginDir() + "/" + \
param['backup_to'] + "/index.py"
wheres['path'] = head + "python3 " + cfile + \
" path " + param['sname'] + " " + str(param['save'])
wheres['site'] = head + "python3 " + cfile + \
" site " + param['sname'] + " " + str(param['save'])
wheres['database'] = head + "python3 " + cfile + " " + \
source_stype + " " + \
param['sname'] + " " + str(param['save'])
try:
shell = wheres[stype]
except:
if stype == 'toUrl':
shell = head + "curl -sS --connect-timeout 10 -m 60 '" + \
param['urladdress'] + "'"
else:
shell = head + param['sbody'].replace("\r\n", "\n")
shell += '''
echo "----------------------------------------------------------------------------"
endDate=`date +"%Y-%m-%d %H:%M:%S"`
END_MW_SHELL_TIME=`date +"%s"`
((SHELL_COS_TIME=($END_MW_SHELL_TIME-$START_MW_SHELL_TIME)))
MW_ToSeconds $SHELL_COS_TIME
echo "★[$endDate] Successful | Script Run [$SCRIPT_RUN_TIME] "
echo "----------------------------------------------------------------------------"
'''
cronPath = mw.getServerDir() + '/cron'
if not os.path.exists(cronPath):
mw.execShell('mkdir -p ' + cronPath)
if not 'echo' in param:
cronName = mw.md5(mw.md5(str(time.time()) + '_mw'))
else:
cronName = param['echo']
file = cronPath + '/' + cronName
mw.writeFile(file, self.checkScript(shell))
mw.execShell('chmod 750 ' + file)
return cronName
# 检查脚本
def checkScript(self, shell):
keys = ['shutdown', 'init 0', 'mkfs', 'passwd',
'chpasswd', '--stdin', 'mkfs.ext', 'mke2fs']
for key in keys:
shell = shell.replace(key, '[***]')
return shell
# 将Shell脚本写到文件
def writeShell(self, config):
file = '/var/spool/cron/crontabs/root'
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'
if not os.path.exists(file):
mw.writeFile(file, '')
conf = mw.readFile(file)
conf += str(config) + "\n"
if mw.writeFile(file, conf):
if not os.path.exists(file):
mw.execShell("chmod 600 '" + file +
"' && chown root.root " + file)
else:
mw.execShell("chmod 600 '" + file +
"' && chown root.crontab " + file)
return True
return mw.returnJson(False, '文件写入失败,请检查是否开启系统加固功能!')
# 重载配置
def crondReload(self):
if mw.isAppleSystem():
# mw.execShell('/usr/sbin/cron restart')
if os.path.exists('/etc/crontab'):
pass
else:
if os.path.exists('/etc/init.d/crond'):
mw.execShell('/etc/init.d/crond reload')
elif os.path.exists('/etc/init.d/cron'):
mw.execShell('service cron restart')
else:
mw.execShell("systemctl reload crond")
# 从crond删除
def removeForCrond(self, echo):
u_file = '/var/spool/cron/crontabs/root'
if not os.path.exists(u_file):
file = '/var/spool/cron/root'
if mw.isAppleSystem():
file = '/etc/crontab'
if not os.path.exists(file):
return False
else:
file = u_file
if mw.isAppleSystem():
return True
conf = mw.readFile(file)
rep = ".+" + str(echo) + ".+\n"
conf = re.sub(rep, "", conf)
if not mw.writeFile(file, conf):
return False
self.crondReload()
return True
def syncToCrond(self, cronInfo):
if 'status' in cronInfo:
if cronInfo['status'] == 0:
return False
if 'where_hour' in cronInfo:
cronInfo['hour'] = cronInfo['where_hour']
cronInfo['minute'] = cronInfo['where_minute']
cronInfo['week'] = cronInfo['where1']
cuonConfig, cronInfo, name = self.getCrondCycle(cronInfo)
cronPath = mw.getServerDir() + '/cron'
cronName = self.getShell(cronInfo)
if type(cronName) == dict:
return cronName
cuonConfig += ' ' + cronPath + '/' + cronName + \
' >> ' + cronPath + '/' + cronName + '.log 2>&1'
wRes = self.writeShell(cuonConfig)
if type(wRes) != bool:
return False
self.crondReload()

View File

@@ -1,401 +0,0 @@
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# sqlite3操作
# ---------------------------------------------------------------------------------
import sqlite3
import os
import sys
class Sql():
#------------------------------
# 数据库操作类 For sqlite3
#------------------------------
__DB_FILE = None # 数据库文件
__DB_CONN = None # 数据库连接对象
__DB_TABLE = "" # 被操作的表名称
__OPT_WHERE = "" # where条件
__OPT_LIMIT = "" # limit条件
__OPT_GROUP = "" # group条件
__OPT_ORDER = "" # order条件
__OPT_FIELD = "*" # field条件
__OPT_PARAM = () # where值
def __init__(self):
self.__DB_FILE = 'data/default.db'
def __getConn(self):
# 取数据库对象
try:
if self.__DB_CONN == None:
self.__DB_CONN = sqlite3.connect(self.__DB_FILE)
self.__DB_CONN.text_factory = str
except Exception as ex:
# print(mw.getTracebackInfo())
return "error: " + str(ex)
def changeTextFactoryToBytes(self):
self.__DB_CONN.text_factory = bytes
return True
def autoTextFactory(self):
if sys.version_info[0] == 3:
self.__DB_CONN.text_factory = lambda x: str(
x, encoding="utf-8", errors='ignore')
else:
self.__DB_CONN.text_factory = lambda x: unicode(
x, "utf-8", "ignore")
def dbfile(self, name):
self.__DB_FILE = 'data/' + name + '.db'
return self
def dbPos(self, path, name, suffix_name = 'db'):
self.__DB_FILE = path + '/' + name + '.' + suffix_name
return self
def table(self, table):
# 设置表名
self.__DB_TABLE = table
return self
def where(self, where, param=()):
# WHERE条件
if where:
self.__OPT_WHERE = " WHERE " + where
self.__OPT_PARAM = param
return self
def andWhere(self, where, param):
# WHERE条件
if where:
self.__OPT_WHERE = self.__OPT_WHERE + " and " + where
# print(param)
# print(self.__OPT_PARAM)
self.__OPT_PARAM = self.__OPT_PARAM + param
return self
def order(self, order):
# ORDER条件
if len(order):
self.__OPT_ORDER = " ORDER BY " + order
else:
self.__OPT_ORDER = ""
return self
def group(self, group):
if len(group):
self.__OPT_GROUP = " GROUP BY " + group
else:
self.__OPT_GROUP = ""
return self
def limit(self, limit):
# LIMIT条件
if len(limit):
self.__OPT_LIMIT = " LIMIT " + limit
else:
self.__OPT_LIMIT = ""
return self
def field(self, field):
# FIELD条件
if len(field):
self.__OPT_FIELD = field
return self
def select(self):
# 查询数据集
self.__getConn()
try:
sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \
self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT
# print(sql)
# print(self.__OPT_PARAM)
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM)
data = result.fetchall()
# 构造字曲系列
if self.__OPT_FIELD != "*":
field = self.__OPT_FIELD.split(',')
tmp = []
for row in data:
i = 0
tmp1 = {}
for key in field:
tmp1[key] = row[i]
i += 1
tmp.append(tmp1)
del(tmp1)
data = tmp
del(tmp)
else:
# 将元组转换成列表
tmp = map(list, data)
data = tmp
del(tmp)
self.__close()
return data
except Exception as ex:
return "error: " + str(ex)
def inquiry(self, input_field=''):
# 查询数据集
# 不清空查询参数
self.__getConn()
try:
sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \
self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT
if os.path.exists('data/debug.pl'):
print(sql, self.__OPT_PARAM)
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM)
data = result.fetchall()
# 构造字曲系列
if self.__OPT_FIELD != "*":
if input_field != "":
field = input_field.split(',')
else:
field = self.__OPT_FIELD.split(',')
tmp = []
for row in data:
i = 0
tmp1 = {}
for key in field:
tmp1[key] = row[i]
i += 1
tmp.append(tmp1)
del(tmp1)
data = tmp
del(tmp)
else:
# 将元组转换成列表
tmp = map(list, data)
data = tmp
del(tmp)
return data
except Exception as ex:
return "error: " + str(ex)
def getField(self, keyName):
# 取回指定字段
result = self.field(keyName).select()
# print(result)
if len(result) == 1:
return result[0][keyName]
return result
def setField(self, keyName, keyValue):
# 更新指定字段
return self.save(keyName, (keyValue,))
def find(self):
# 取一行数据
result = self.limit("1").select()
if len(result) == 1:
return result[0]
return result
def count(self):
# 取行数
key = "COUNT(*)"
data = self.field(key).select()
try:
return int(data[0][key])
except:
return 0
def add(self, keys, param):
# 插入数据
self.__getConn()
try:
values = ""
for key in keys.split(','):
values += "?,"
values = self.checkInput(values[0:len(values) - 1])
sql = "INSERT INTO " + self.__DB_TABLE + \
"(" + keys + ") " + "VALUES(" + values + ")"
result = self.__DB_CONN.execute(sql, param)
last_id = result.lastrowid
self.__close()
self.__DB_CONN.commit()
return last_id
except Exception as ex:
return "error: " + str(ex)
# 插入数据
def insert(self, pdata):
if not pdata:
return False
keys, param = self.__format_pdata(pdata)
return self.add(keys, param)
# 更新数据
def update(self, pdata):
if not pdata:
return False
keys, param = self.__format_pdata(pdata)
return self.save(keys, param)
# 构造数据
def __format_pdata(self, pdata):
keys = pdata.keys()
keys_str = ','.join(keys)
param = []
for k in keys:
param.append(pdata[k])
return keys_str, tuple(param)
def checkInput(self, data):
if not data:
return data
if type(data) != str:
return data
checkList = [
{'d': '<', 'r': '<'},
{'d': '>', 'r': '>'},
{'d': '\'', 'r': '‘'},
{'d': '"', 'r': '“'},
{'d': '&', 'r': '&'},
{'d': '#', 'r': '#'},
{'d': '<', 'r': '<'}
]
for v in checkList:
data = data.replace(v['d'], v['r'])
return data
def addAll(self, keys, param):
# 插入数据
self.__getConn()
try:
values = ""
for key in keys.split(','):
values += "?,"
values = values[0:len(values) - 1]
sql = "INSERT INTO " + self.__DB_TABLE + \
"(" + keys + ") " + "VALUES(" + values + ")"
result = self.__DB_CONN.execute(sql, param)
return True
except Exception as ex:
return "error: " + str(ex)
def commit(self):
self.__close()
self.__DB_CONN.commit()
def save(self, keys, param):
# 更新数据
self.__getConn()
try:
opt = ""
for key in keys.split(','):
opt += key + "=?,"
opt = opt[0:len(opt) - 1]
sql = "UPDATE " + self.__DB_TABLE + " SET " + opt + self.__OPT_WHERE
# import mw
# mw.writeFile('/tmp/test.pl', sql)
# 处理拼接WHERE与UPDATE参数
tmp = list(param)
for arg in self.__OPT_PARAM:
tmp.append(arg)
self.__OPT_PARAM = tuple(tmp)
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM)
self.__close()
self.__DB_CONN.commit()
return result.rowcount
except Exception as ex:
return "error: " + str(ex)
def delete(self, id=None):
# 删除数据
self.__getConn()
try:
if id:
self.__OPT_WHERE = " WHERE id=?"
self.__OPT_PARAM = (id,)
sql = "DELETE FROM " + self.__DB_TABLE + self.__OPT_WHERE
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM)
self.__close()
self.__DB_CONN.commit()
return result.rowcount
except Exception as ex:
return "error: " + str(ex)
def originExecute(self, sql, param=()):
self.__getConn()
try:
result = self.__DB_CONN.execute(sql, param)
self.__DB_CONN.commit()
return result
except Exception as ex:
return "error: " + str(ex)
def execute(self, sql, param=()):
# 执行SQL语句返回受影响行
self.__getConn()
# print sql, param
try:
result = self.__DB_CONN.execute(sql, param)
self.__DB_CONN.commit()
return result.rowcount
except Exception as ex:
return "error: " + str(ex)
def query(self, sql, param=()):
# 执行SQL语句返回数据集
self.__getConn()
try:
result = self.__DB_CONN.execute(sql, param)
# 将元组转换成列表
# data = map(list, result)
return result
except Exception as ex:
return "error: " + str(ex)
def create(self, name):
# 创建数据表
self.__getConn()
import mw
script = mw.readFile('data/' + name + '.sql')
result = self.__DB_CONN.executescript(script)
self.__DB_CONN.commit()
return result.rowcount
def fofile(self, filename):
# 执行脚本
self.__getConn()
import mw
script = mw.readFile(filename)
result = self.__DB_CONN.executescript(script)
self.__DB_CONN.commit()
return result.rowcount
def __close(self):
# 清理条件属性
self.__OPT_WHERE = ""
self.__OPT_FIELD = "*"
self.__OPT_ORDER = ""
self.__OPT_LIMIT = ""
self.__OPT_PARAM = ()
def close(self):
# 释放资源
try:
self.__DB_CONN.close()
self.__DB_CONN = None
except:
pass

File diff suppressed because it is too large Load Diff

View File

@@ -1,513 +0,0 @@
# 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 flask import request
class firewall_api:
__isFirewalld = False
__isIptables = False
__isUfw = False
__isMac = False
def __init__(self):
iptables_file = mw.systemdCfgDir() + '/iptables.service'
if os.path.exists('/usr/sbin/firewalld'):
self.__isFirewalld = True
elif os.path.exists('/usr/sbin/ufw'):
self.__isUfw = True
elif os.path.exists(iptables_file):
self.__isIptables = True
elif mw.isAppleSystem():
self.__isMac = True
##### ----- start ----- ###
# 添加屏蔽IP
def addDropAddressApi(self):
import re
port = request.form.get('port', '').strip()
ps = request.form.get('ps', '').strip()
rep = r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\/\d{1,2})?$"
if not re.search(rep, port):
return mw.returnJson(False, '您输入的IP地址不合法!')
address = port
if mw.M('firewall').where("port=?", (address,)).count() > 0:
return mw.returnJson(False, '您要放屏蔽的IP已存在屏蔽列表,无需重复处理!')
if self.__isUfw:
mw.execShell('ufw deny from ' + address + ' to any')
else:
if self.__isIptables:
cmd = 'iptables -I INPUT -s ' + address + ' -j DROP'
mw.execShell(cmd)
elif self.__isFirewalld:
cmd = 'firewall-cmd --permanent --add-rich-rule=\'rule family=ipv4 source address="' + \
address + '" drop\''
mw.execShell(cmd)
else:
pass
msg = mw.getInfo('屏蔽IP[{1}]成功!', (address,))
mw.writeLog("防火墙管理", msg)
addtime = time.strftime('%Y-%m-%d %X', time.localtime())
mw.M('firewall').add('port,ps,addtime', (address, ps, addtime))
self.firewallReload()
return mw.returnJson(True, '添加成功!')
# 添加放行端口
def addAcceptPortApi(self):
if not self.getFwStatus():
return mw.returnJson(False, '防火墙启动时,才能添加规则!')
port = request.form.get('port', '').strip()
ps = request.form.get('ps', '').strip()
stype = request.form.get('type', '').strip()
protocol = request.form.get('protocol', '').strip()
data = self.addAcceptPortArgs(port, ps, stype, protocol)
return mw.getJson(data)
# 添加放行端口
def addAcceptPortArgs(self, port, ps, stype, protocol='tcp'):
import re
import time
if not self.getFwStatus():
self.setFw(0)
rep = r"^\d{1,5}(:\d{1,5})?$"
if not re.search(rep, port):
return mw.returnData(False, '端口范围不正确!')
if mw.M('firewall').where("port=?", (port,)).count() > 0:
return mw.returnData(False, '您要放行的端口已存在,无需重复放行!')
msg = mw.getInfo('放行端口[{1}][{2}]成功', (port, protocol,))
mw.writeLog("防火墙管理", msg)
addtime = time.strftime('%Y-%m-%d %X', time.localtime())
mw.M('firewall').add('port,protocol,ps,addtime',
(port, protocol, ps, addtime))
self.addAcceptPort(port, protocol)
self.firewallReload()
return mw.returnData(True, '添加放行(' + port + ')端口成功!')
# 删除IP屏蔽
def delDropAddressApi(self):
if not self.getFwStatus():
return mw.returnJson(False, '防火墙启动时,才能删除规则!')
port = request.form.get('port', '').strip()
ps = request.form.get('ps', '').strip()
sid = request.form.get('id', '').strip()
address = port
if self.__isUfw:
mw.execShell('ufw delete deny from ' + address + ' to any')
elif self.__isFirewalld:
mw.execShell(
'firewall-cmd --permanent --remove-rich-rule=\'rule family=ipv4 source address="' + address + '" drop\'')
elif self.__isIptables:
cmd = 'iptables -D INPUT -s ' + address + ' -j DROP'
mw.execShell(cmd)
else:
pass
msg = mw.getInfo('解除IP[{1}]的屏蔽!', (address,))
mw.writeLog("防火墙管理", msg)
mw.M('firewall').where("id=?", (sid,)).delete()
self.firewallReload()
return mw.returnJson(True, '删除成功!')
def delAcceptPortArgs(self, port, protocol='tcp'):
if self.__isUfw:
if protocol == 'tcp':
mw.execShell('ufw delete allow ' + port + '/tcp')
if protocol == 'udp':
mw.execShell('ufw delete allow ' + port + '/udp')
if protocol == 'tcp/udp':
mw.execShell('ufw delete allow ' + port + '/tcp')
mw.execShell('ufw delete allow ' + port + '/udp')
elif self.__isFirewalld:
port = port.replace(':', '-')
if protocol == 'tcp':
mw.execShell(
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/tcp')
if protocol == 'udp':
mw.execShell(
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/udp')
if protocol == 'tcp/udp':
mw.execShell(
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/tcp')
mw.execShell(
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/udp')
elif self.__isIptables:
if protocol == 'tcp':
mw.execShell(
'iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT')
if protocol == 'udp':
mw.execShell(
'iptables -D INPUT -p udp -m state --state NEW -m udp --dport ' + port + ' -j ACCEPT')
if protocol == 'tcp/udp':
mw.execShell(
'iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT')
mw.execShell(
'iptables -D INPUT -p udp -m state --state NEW -m udp --dport ' + port + ' -j ACCEPT')
else:
pass
mw.M('firewall').where("port=?", (port,)).delete()
msg = mw.getInfo('删除防火墙放行端口[{1}][{2}]成功!', (port, protocol,))
mw.writeLog("防火墙管理", msg)
self.firewallReload()
return True
# 删除放行端口
def delAcceptPortApi(self):
port = request.form.get('port', '').strip()
protocol = request.form.get('protocol', 'tcp').strip()
sid = request.form.get('id', '').strip()
mw_port = mw.readFile('data/port.pl')
if(port == mw_port):
return mw.returnJson(False, '失败,不能删除当前面板端口!')
try:
self.delAcceptPortArgs(port, protocol)
mw.M('firewall').where("id=?", (sid,)).delete()
return mw.returnJson(True, '删除成功!')
except Exception as e:
return mw.returnJson(False, '删除失败!:' + str(e))
def getWwwPathApi(self):
path = mw.getLogsDir()
return mw.getJson({'path': path})
def getListApi(self):
p = request.form.get('p', '1').strip()
limit = request.form.get('limit', '10').strip()
return self.getList(int(p), int(limit))
def getSshInfoApi(self):
data = {}
file = '/etc/ssh/sshd_config'
conf = mw.readFile(file)
rep = r"#*Port\s+([0-9]+)\s*\n"
port = re.search(rep, conf).groups(0)[0]
isPing = True
try:
if mw.isAppleSystem():
isPing = True
else:
file = '/etc/sysctl.conf'
sys_conf = mw.readFile(file)
rep = r"#*net\.ipv4\.icmp_echo_ignore_all\s*=\s*([0-9]+)"
tmp = re.search(rep, sys_conf).groups(0)[0]
if tmp == '1':
isPing = False
except:
isPing = True
# sshd 检测
status = True
cmd = "service sshd status | grep -P '(dead|stop)'|grep -v grep"
ssh_status = mw.execShell(cmd)
if ssh_status[0] != '':
status = False
cmd = "systemctl status sshd.service | grep 'dead'|grep -v grep"
ssh_status = mw.execShell(cmd)
if ssh_status[0] != '':
status = False
data['pass_prohibit_status'] = False
# 密码登陆配置检查
pass_rep = r"PasswordAuthentication\s+(\w*)\s*\n"
pass_status = re.search(pass_rep, conf)
if pass_status:
if pass_status and pass_status.groups(0)[0].strip() == 'no':
data['pass_prohibit_status'] = True
else:
data['pass_prohibit_status'] = True
data['port'] = port
data['status'] = status
data['ping'] = isPing
if mw.isAppleSystem():
data['firewall_status'] = False
else:
data['firewall_status'] = self.getFwStatus()
return mw.getJson(data)
def setSshPortApi(self):
port = request.form.get('port', '1').strip()
if int(port) < 22 or int(port) > 65535:
return mw.returnJson(False, '端口范围必需在22-65535之间!')
ports = ['21', '25', '80', '443', '888']
if port in ports:
return mw.returnJson(False, '(' + port + ')' + '特殊端口不可设置!')
file = '/etc/ssh/sshd_config'
conf = mw.readFile(file)
rep = r"#*Port\s+([0-9]+)\s*\n"
conf = re.sub(rep, "Port " + port + "\n", conf)
mw.writeFile(file, conf)
self.addAcceptPortArgs(port, 'SSH端口修改', 'port')
if self.__isUfw:
mw.execShell("service ssh restart")
elif self.__isIptables:
mw.execShell("/etc/init.d/sshd restart")
elif self.__isFirewalld:
mw.execShell("systemctl restart sshd.service")
else:
return mw.returnJson(False, '修改失败!')
return mw.returnJson(True, '修改成功!')
def setSshStatusApi(self):
if mw.isAppleSystem():
return mw.returnJson(True, '开发机不能操作!')
status = request.form.get('status', '1').strip()
msg = 'SSH服务已启用'
act = 'start'
if status == "1":
msg = 'SSH服务已停用'
act = 'stop'
ssh_service = mw.systemdCfgDir() + '/sshd.service'
if os.path.exists(ssh_service):
mw.execShell("systemctl " + act + " sshd.service")
else:
mw.execShell('service sshd ' + act)
if os.path.exists('/etc/init.d/sshd'):
mw.execShell('/etc/init.d/sshd ' + act)
mw.writeLog("防火墙管理", msg)
return mw.returnJson(True, '操作成功!')
def setSshPassStatusApi(self):
if mw.isAppleSystem():
return mw.returnJson(True, '开发机不能操作!')
status = request.form.get('status', '1').strip()
msg = '禁止密码登陆成功'
if status == "1":
msg = '开启密码登陆成功'
file = '/etc/ssh/sshd_config'
if not os.path.exists(file):
return mw.returnJson(False, '无法设置!')
conf = mw.readFile(file)
pass_rep = r"PasswordAuthentication\s+(\w*)\s*\n"
pass_status = re.search(pass_rep, conf)
if not pass_status:
rep = r"(#)?PasswordAuthentication\s+(\w*)\s*\n"
conf = re.sub(rep, "PasswordAuthentication yes\n", conf)
if status == '1':
rep = r"PasswordAuthentication\s+(\w*)\s*\n"
conf = re.sub(rep, "PasswordAuthentication yes\n", conf)
else:
rep = r"PasswordAuthentication\s+(\w*)\s*\n"
conf = re.sub(rep, "PasswordAuthentication no\n", conf)
mw.writeFile(file, conf)
mw.execShell("systemctl restart sshd.service")
mw.writeLog("SSH管理", msg)
return mw.returnJson(True, msg)
def setPingApi(self):
if mw.isAppleSystem():
return mw.returnJson(True, '开发机不能操作!')
status = request.form.get('status')
filename = '/etc/sysctl.conf'
conf = mw.readFile(filename)
if conf.find('net.ipv4.icmp_echo') != -1:
rep = r"net\.ipv4\.icmp_echo.*"
conf = re.sub(rep, 'net.ipv4.icmp_echo_ignore_all=' + status, conf)
else:
conf += "\nnet.ipv4.icmp_echo_ignore_all=" + status
mw.writeFile(filename, conf)
mw.execShell('sysctl -p')
return mw.returnJson(True, '设置成功!')
def setFwApi(self):
if mw.isAppleSystem():
return mw.returnJson(True, '开发机不能设置!')
status = request.form.get('status', '1')
return mw.getJson(self.setFw(status))
def setFwIptables(self, status):
# iptables特殊处理
if status == '1':
mw.execShell('service iptables save')
mw.execShell('service iptables stop')
else:
# 重新导入数据
_list = mw.M('firewall').field('id,port,ps,addtime').limit(
'0,1000').order('id desc').select()
mw.execShell('iptables -P INPUT DROP')
mw.execShell('iptables -P OUTPUT ACCEPT')
for x in _list:
port = x['port']
if mw.isIpAddr(port):
cmd = 'iptables -I INPUT -s ' + port + ' -j DROP'
mw.execShell(cmd)
else:
self.addAcceptPort(port)
mw.execShell('service iptables save')
mw.execShell('service iptables start')
def setFw(self, status):
if self.__isIptables:
self.setFwIptables(status)
return mw.returnData(True, '设置成功!')
if status == '1':
if self.__isUfw:
mw.execShell('/usr/sbin/ufw disable')
elif self.__isFirewalld:
mw.execShell('systemctl stop firewalld.service')
mw.execShell('systemctl disable firewalld.service')
else:
pass
else:
if self.__isUfw:
mw.execShell("echo 'y'| ufw enable")
elif self.__isFirewalld:
mw.execShell('systemctl start firewalld.service')
mw.execShell('systemctl enable firewalld.service')
else:
pass
return mw.returnData(True, '设置成功!')
##### ----- start ----- ###
def getList(self, page, limit):
start = (page - 1) * limit
_list = mw.M('firewall').field('id,port,protocol,ps,addtime').limit(
str(start) + ',' + str(limit)).order('id desc').select()
data = {}
data['data'] = _list
count = mw.M('firewall').count()
_page = {}
_page['count'] = count
_page['tojs'] = 'showAccept'
_page['p'] = page
data['page'] = mw.getPage(_page)
return mw.getJson(data)
def addAcceptPort(self, port, protocol='tcp'):
if self.__isUfw:
if protocol == 'tcp':
mw.execShell('ufw allow ' + port + '/tcp')
if protocol == 'udp':
mw.execShell('ufw allow ' + port + '/udp')
if protocol == 'tcp/udp':
mw.execShell('ufw allow ' + port + '/tcp')
mw.execShell('ufw allow ' + port + '/udp')
elif self.__isFirewalld:
port = port.replace(':', '-')
if protocol == 'tcp':
cmd = 'firewall-cmd --permanent --zone=public --add-port=' + port + '/tcp'
mw.execShell(cmd)
if protocol == 'udp':
cmd = 'firewall-cmd --permanent --zone=public --add-port=' + port + '/udp'
mw.execShell(cmd)
if protocol == 'tcp/udp':
cmd = 'firewall-cmd --permanent --zone=public --add-port=' + port + '/tcp'
mw.execShell(cmd)
cmd = 'firewall-cmd --permanent --zone=public --add-port=' + port + '/udp'
mw.execShell(cmd)
elif self.__isIptables:
if protocol == 'tcp':
cmd = 'iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT'
mw.execShell(cmd)
if protocol == 'udp':
cmd = 'iptables -I INPUT -p udp -m state --state NEW -m udp --dport ' + port + ' -j ACCEPT'
mw.execShell(cmd)
if protocol == 'tcp/udp':
cmd = 'iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT'
mw.execShell(cmd)
cmd = 'iptables -I INPUT -p udp -m state --state NEW -m udp --dport ' + port + ' -j ACCEPT'
mw.execShell(cmd)
else:
pass
return True
def firewallReload(self):
if self.__isUfw:
mw.execShell('/usr/sbin/ufw reload')
return
elif self.__isIptables:
mw.execShell('service iptables save')
mw.execShell('service iptables restart')
elif self.__isFirewalld:
mw.execShell('firewall-cmd --reload')
else:
pass
def getFwStatus(self):
if self.__isUfw:
cmd = "/usr/sbin/ufw status| grep Status | awk -F ':' '{print $2}'"
data = mw.execShell(cmd)
if data[0].strip() == 'inactive':
return False
return True
elif self.__isIptables:
cmd = "systemctl status iptables | grep 'inactive'"
data = mw.execShell(cmd)
if data[0] != '':
return False
return True
elif self.__isFirewalld:
cmd = "ps -ef|grep firewalld |grep -v grep | awk '{print $2}'"
data = mw.execShell(cmd)
if data[0] == '':
return False
return True
else:
return False

View File

@@ -1,355 +0,0 @@
# 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 ['rsyncd.log']:
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 ['.', '..']:
continue
filename = os.path.join(log_dir, log_file)
if not os.path.exists(filename):
continue
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)

File diff suppressed because it is too large Load Diff

View File

@@ -1,245 +0,0 @@
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# 分页库操作
# ---------------------------------------------------------------------------------
import math
import string
class Page():
#--------------------------
# 分页类 - JS回调版
#--------------------------
__PREV = '上一页'
__NEXT = '下一页'
__START = '首页'
__END = '尾页'
__COUNT_START = '共'
__COUNT_END = '条数据'
__FO = '从'
__LINE = '条'
__LIST_NUM = 4
SHIFT = None # 偏移量
ROW = None # 每页行数
__C_PAGE = None # 当前页
__COUNT_PAGE = None # 总页数
__COUNT_ROW = None # 总行数
__URI = None # URI
__RTURN_JS = False # 是否返回JS回调
__START_NUM = None # 起始行
__END_NUM = None # 结束行
__ARGS_TPL = ''
def __init__(self):
if False:
self.__PREV = tmp['PREV']
self.__NEXT = tmp['NEXT']
self.__START = tmp['START']
self.__END = tmp['END']
self.__COUNT_START = tmp['COUNT_START']
self.__COUNT_END = tmp['COUNT_END']
self.__FO = tmp['FO']
self.__LINE = tmp['LINE']
def getPageNum(self, num):
return str(num) + self.__ARGS_TPL
def GetPage(self, pageInfo, limit='1,2,3,4,5,6,7,8'):
# 取分页信息
# @param pageInfo 传入分页参数字典
# @param limit 返回系列
self.__RTURN_JS = pageInfo['return_js']
self.__COUNT_ROW = pageInfo['count']
if 'args_tpl' in pageInfo:
self.__ARGS_TPL = pageInfo['args_tpl']
self.ROW = pageInfo['row']
self.__C_PAGE = self.__GetCpage(pageInfo['p'])
self.__START_NUM = self.__StartRow()
self.__END_NUM = self.__EndRow()
self.__COUNT_PAGE = self.__GetCountPage()
self.__URI = self.__SetUri(pageInfo['uri'])
self.SHIFT = self.__START_NUM - 1
keys = limit.split(',')
pages = {}
# 起始页
pages['1'] = self.__GetStart()
# 上一页
pages['2'] = self.__GetPrev()
# 分页
pages['3'] = self.__GetPages()
# 下一页
pages['4'] = self.__GetNext()
# 尾页
pages['5'] = self.__GetEnd()
# 当前显示页与总页数
pages['6'] = "<span class='Pnumber'>" + \
str(self.__C_PAGE) + "/" + \
str(self.__COUNT_PAGE) + "</span>"
# 本页显示开始与结束行
pages['7'] = "<span class='Pline'>" + str(self.__FO) + \
str(self.__START_NUM) + "-" + \
str(self.__END_NUM) + str(self.__LINE) + "</span>"
# 行数
pages['8'] = "<span class='Pcount'>" + str(self.__COUNT_START) + \
str(self.__COUNT_ROW) + str(self.__COUNT_END) + "</span>"
# 构造返回数据
retuls = '<div>'
for value in keys:
retuls += pages[value]
retuls += '</div>'
# 返回分页数据
return retuls
def __GetEnd(self):
# 构造尾页
endStr = ""
if self.__C_PAGE >= self.__COUNT_PAGE:
endStr = ''
else:
if self.__RTURN_JS == "":
endStr = "<a class='Pend' href='" + self.__URI + "p=" + \
str(self.__COUNT_PAGE) + "'>" + str(self.__END) + "</a>"
else:
endStr = "<a class='Pend' onclick='" + self.__RTURN_JS + \
"(" + self.getPageNum(self.__COUNT_PAGE) + ")'>" + \
str(self.__END) + "</a>"
return endStr
def __GetNext(self):
# 构造下一页
nextStr = ""
if self.__C_PAGE >= self.__COUNT_PAGE:
nextStr = ''
else:
if self.__RTURN_JS == "":
nextStr = "<a class='Pnext' href='" + self.__URI + "p=" + \
str(self.__C_PAGE + 1) + "'>" + str(self.__NEXT) + "</a>"
else:
nextStr = "<a class='Pnext' onclick='" + self.__RTURN_JS + \
"(" + self.getPageNum(self.__C_PAGE + 1) + ")'>" + \
str(self.__NEXT) + "</a>"
return nextStr
def __GetPages(self):
# 构造分页
pages = ''
num = 0
# 当前页之前
if (self.__COUNT_PAGE - self.__C_PAGE) < self.__LIST_NUM:
num = self.__LIST_NUM + \
(self.__LIST_NUM - (self.__COUNT_PAGE - self.__C_PAGE))
else:
num = self.__LIST_NUM
n = 0
for i in range(num):
n = num - i
page = self.__C_PAGE - n
if page > 0:
if self.__RTURN_JS == "":
pages += "<a class='Pnum' href='" + self.__URI + \
"p=" + str(page) + "'>" + str(page) + "</a>"
else:
pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
"(" + self.getPageNum(page) + ")'>" + str(page) + "</a>"
# 当前页
if self.__C_PAGE > 0:
pages += "<span class='Pcurrent'>" + \
str(self.__C_PAGE) + "</span>"
# 当前页之后
if self.__C_PAGE <= self.__LIST_NUM:
num = self.__LIST_NUM + (self.__LIST_NUM - self.__C_PAGE) + 1
else:
num = self.__LIST_NUM
for i in range(num):
if i == 0:
continue
page = self.__C_PAGE + i
if page > self.__COUNT_PAGE:
break
if self.__RTURN_JS == "":
pages += "<a class='Pnum' href='" + self.__URI + \
"p=" + str(page) + "'>" + str(page) + "</a>"
else:
pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
"(" + self.getPageNum(page) + ")'>" + str(page) + "</a>"
return pages
def __GetPrev(self):
# 构造上一页
startStr = ''
if self.__C_PAGE == 1:
startStr = ''
else:
if self.__RTURN_JS == "":
startStr = "<a class='Ppren' href='" + self.__URI + "p=" + \
str(self.__C_PAGE - 1) + "'>" + str(self.__PREV) + "</a>"
else:
startStr = "<a class='Ppren' onclick='" + self.__RTURN_JS + \
"(" + self.getPageNum(self.__C_PAGE - 1) + ")'>" + \
str(self.__PREV) + "</a>"
return startStr
def __GetStart(self):
# 构造起始分页
startStr = ''
if self.__C_PAGE == 1:
startStr = ''
else:
if self.__RTURN_JS == "":
startStr = "<a class='Pstart' href='" + \
self.__URI + "p=1'>" + str(self.__START) + "</a>"
else:
startStr = "<a class='Pstart' onclick='" + \
self.__RTURN_JS + "("+self.getPageNum(1)+")'>" + str(self.__START) + "</a>"
return startStr
def __GetCpage(self, p):
# 取当前页
if p:
return p
return 1
def __StartRow(self):
# 从多少行开始
return (self.__C_PAGE - 1) * self.ROW + 1
def __EndRow(self):
# 从多少行结束
if self.ROW > self.__COUNT_ROW:
return self.__COUNT_ROW
return self.__C_PAGE * self.ROW
def __GetCountPage(self):
# 取总页数
return int(math.ceil(self.__COUNT_ROW / float(self.ROW)))
def __SetUri(self, sinput):
# 构造URI
uri = '?'
for key in sinput:
if key == 'p':
continue
uri += key + '=' + sinput[key] + '&'
return str(uri)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,120 +0,0 @@
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# SSH终端操作
# ---------------------------------------------------------------------------------
import json
import time
import os
import sys
import socket
import threading
import re
from io import BytesIO, StringIO
import mw
import paramiko
from flask_socketio import SocketIO, emit, send
class ssh_local(object):
__debug_file = 'logs/ssh_local.log'
__log_type = 'SSH终端'
__ssh = None
# lock
_instance_lock = threading.Lock()
def __init__(self):
pass
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(ssh_local, "_instance"):
with ssh_local._instance_lock:
if not hasattr(ssh_local, "_instance"):
ssh_local._instance = ssh_local(*args, **kwargs)
return ssh_local._instance
def debug(self, msg):
msg = "{} - {}:{} => {} \n".format(mw.formatDate(),
self.__host, self.__port, msg)
if not mw.isDebugMode():
return
mw.writeFile(self.__debug_file, msg, 'a+')
def returnMsg(self, status, msg):
return {'status': status, 'msg': msg}
def connectSsh(self):
import paramiko
ssh = paramiko.SSHClient()
mw.createSshInfo()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
port = mw.getSSHPort()
try:
ssh.connect('127.0.0.1', port, timeout=5)
except Exception as e:
ssh.connect('localhost', port, timeout=5)
except Exception as e:
ssh.connect(mw.getHostAddr(), port, timeout=30)
except Exception as e:
return False
shell = ssh.invoke_shell(term='xterm', width=83, height=21)
shell.setblocking(0)
return shell
def send(self):
pass
def close(self):
try:
if self.__ssh:
self.__ssh.close()
except:
pass
def wsSend(self, recv):
try:
t = recv.decode("utf-8")
return emit('server_response', {'data': t})
except Exception as e:
return emit('server_response', {'data': recv})
def wsSendConnect(self):
return emit('connect', {'data': 'ok'})
def wsSendReConnect(self):
return emit('reconnect', {'data': 'ok'})
def run(self, info):
if not self.__ssh:
self.__ssh = self.connectSsh()
if self.__ssh.exit_status_ready():
self.__ssh = self.connectSsh()
self.__ssh.send(info)
try:
time.sleep(0.005)
recv = self.__ssh.recv(8192)
return self.wsSend(recv)
except Exception as ex:
return self.wsSend('')

View File

@@ -1,467 +0,0 @@
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# SSH终端操作
# ---------------------------------------------------------------------------------
import json
import time
import os
import sys
import socket
import threading
import re
from io import BytesIO, StringIO
import mw
import paramiko
from flask_socketio import SocketIO, emit, send
class ssh_terminal(object):
__debug_file = 'logs/ssh_terminal.log'
__log_type = 'SSH终端'
# websocketio 唯一标识
__sid = ''
__host = None
__type = '0'
__port = 22
__user = None
__pass = None
__pkey = None
__key_passwd = None
__rep_ssh_config = False
__rep_ssh_service = False
__sshd_config_backup = None
__ssh = None
__tp = None
__ps = None
__ssh_list = {}
__ssh_last_request_time = {}
# lock
_instance_lock = threading.Lock()
def __init__(self):
ht = threading.Thread(target=self.heartbeat)
ht.start()
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(ssh_terminal, "_instance"):
with ssh_terminal._instance_lock:
if not hasattr(ssh_terminal, "_instance"):
ssh_terminal._instance = ssh_terminal(*args, **kwargs)
return ssh_terminal._instance
def debug(self, msg):
msg = "{} - {}:{} => {} \n".format(mw.formatDate(),
self.__host, self.__port, msg)
if not mw.isDebugMode():
return
mw.writeFile(self.__debug_file, msg, 'a+')
def returnMsg(self, status, msg):
return {'status': status, 'msg': msg}
def restartSsh(self, act='reload'):
'''
重启ssh 无参数传递
'''
version = mw.readFile('/etc/redhat-release')
if not os.path.exists('/etc/redhat-release'):
mw.execShell('service ssh ' + act)
elif version.find(' 7.') != -1 or version.find(' 8.') != -1:
mw.execShell("systemctl " + act + " sshd.service")
else:
mw.execShell("/etc/init.d/sshd " + act)
def isRunning(self, rep=False):
try:
if rep and self.__rep_ssh_service:
self.restartSsh('stop')
return True
status = self.getSshStatus()
if not status:
self.restartSsh('start')
self.__rep_ssh_service = True
return True
return False
except:
return False
def setSshdConfig(self, rep=False):
self.isRunning(rep)
if rep and not self.__rep_ssh_config:
return False
try:
sshd_config_file = '/etc/ssh/sshd_config'
if not os.path.exists(sshd_config_file):
return False
sshd_config = mw.readFile(sshd_config_file)
if not sshd_config:
return False
if rep:
if self.__sshd_config_backup:
mw.writeFile(sshd_config_file, self.__sshd_config_backup)
self.restartSsh()
return True
pin = r'^\s*PubkeyAuthentication\s+(yes|no)'
pubkey_status = re.findall(pin, sshd_config, re.I)
if pubkey_status:
if pubkey_status[0] == 'yes':
pubkey_status = True
else:
pubkey_status = False
pin = r'^\s*RSAAuthentication\s+(yes|no)'
rsa_status = re.findall(pin, sshd_config, re.I)
if rsa_status:
if rsa_status[0] == 'yes':
rsa_status = True
else:
rsa_status = False
self._sshd_config_backup = sshd_config
is_write = False
if not pubkey_status:
sshd_config = re.sub(
r'\n#?PubkeyAuthentication\s\w+', '\nPubkeyAuthentication yes', sshd_config)
is_write = True
if not rsa_status:
sshd_config = re.sub(
r'\n#?RSAAuthentication\s\w+', '\nRSAAuthentication yes', sshd_config)
is_write = True
if is_write:
mw.writeFile(sshd_config_file, sshd_config)
self.__rep_ssh_config = True
self.restartSsh()
else:
self.__sshd_config_backup = None
return True
except:
return False
def setSid(self, sid):
self.__sid = sid
def connect(self, sid):
# self.connectBySocket()
if self.__host in ['127.0.0.1', 'localhost']:
return self.connectLocalSsh(sid)
else:
return self.connectBySocket(sid)
def connectLocalSsh(self, sid):
mw.createSshInfo()
self.__ps = paramiko.SSHClient()
self.__ps.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.__port = mw.getSSHPort()
try:
self.__ps.connect(self.__host, self.__port, timeout=60)
except Exception as e:
self.__ps.connect('127.0.0.1', self.__port)
except Exception as e:
self.__ps.connect('localhost', self.__port)
except Exception as e:
self.setSshdConfig(True)
self.__ps.close()
e = str(e)
if e.find('websocket error!') != -1:
return self.returnMsg(True, '连接成功')
if e.find('Authentication timeout') != -1:
self.debug("认证超时{}".format(e))
return self.returnMsg(False, '认证超时,请按回车重试!{}'.format(e))
if e.find('Connection reset by peer') != -1:
self.debug('目标服务器主动拒绝连接')
return self.returnMsg(False, '目标服务器主动拒绝连接')
if e.find('Error reading SSH protocol banner') != -1:
self.debug('协议头响应超时')
return self.returnMsg(False, '协议头响应超时,与目标服务器之间的网络质量太糟糕:' + e)
if not e:
self.debug('SSH协议握手超时')
return self.returnMsg(False, "SSH协议握手超时,与目标服务器之间的网络质量太糟糕")
err = mw.getTracebackInfo()
self.debug(err)
return self.returnMsg(False, "未知错误: {}".format(err))
self.debug('local-ssh:认证成功,正在构建会话通道')
ssh = self.__ps.invoke_shell(
term='xterm', width=83, height=21)
ssh.setblocking(0)
self.__ssh_list[sid] = ssh
mw.writeLog(self.__log_type, '成功登录到SSH服务器 [{}:{}]'.format(
self.__host, self.__port))
self.debug('local-ssh:通道已构建')
return self.returnMsg(True, '连接成功!')
def connectBySocket(self, sid):
if not self.__host:
return self.returnMsg(False, '错误的连接地址')
if not self.__user:
self.__user = 'root'
if not self.__port:
self.__port = 22
self.setSshdConfig(True)
num = 0
while num < 5:
num += 1
try:
self.debug('正在尝试第{}次连接'.format(num))
if self.__rep_ssh_config:
time.sleep(0.1)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2 + num)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 8192)
sock.connect((self.__host, self.__port))
break
except Exception as e:
if num == 5:
self.setSshdConfig(True)
self.debug('重试连接失败,{}'.format(e))
return self.returnMsg(False, '连接目标服务器失败, {}:{}'.format(self.__host, self.__port))
else:
time.sleep(0.2)
# print(self.__host, sock)
self.__tp = paramiko.Transport(sock)
try:
self.__tp.start_client()
self.__tp.banner_timeout = 60
if not self.__pass and not self.__pkey:
return self.returnMsg(False, '密码或私钥不能都为空: {}:{}'.format(self.__host, self.__port))
if self.__pkey != '' and self.__type != '0':
self.debug('正在认证私钥')
p_file = StringIO(str(self.__pkey.replace('\\n', '\n')))
# p_file = "/tmp/t_ssh_pkey.txt"
# mw.writeFile(p_file, self.__pkey.replace('\\n', '\n'))
# mw.execShell('chmod 600 ' + p_file)
try:
p_file.seek(0)
pkey = paramiko.RSAKey.from_private_key(p_file)
except:
try:
p_file.seek(0) # 重置游标
pkey = paramiko.Ed25519Key.from_private_key(
p_file)
except:
try:
p_file.seek(0)
pkey = paramiko.ECDSAKey.from_private_key(p_file)
except:
p_file.seek(0)
pkey = paramiko.DSSKey.from_private_key(p_file)
self.__tp.auth_publickey(username=self.__user, key=pkey)
else:
try:
self.__tp.auth_none(self.__user)
except Exception as e:
e = str(e)
if e.find('keyboard-interactive') >= 0:
self._auth_interactive()
else:
self.debug('正在认证密码')
self.__tp.auth_password(
username=self.__user, password=self.__pass)
except Exception as e:
self.setSshdConfig(True)
self.__tp.close()
e = str(e)
# print(e)
if e.find('Authentication timeout') != -1:
self.debug("认证超时{}".format(e))
return self.returnMsg(False, '认证超时,请按回车重试!{}'.format(e))
if e.find('Authentication failed') != -1:
self.debug('认证失败{}'.format(e))
return self.returnMsg(False, '帐号或密码错误: {}'.format(e + "," + self.__user + "@" + self.__host + ":" + str(self.__port)))
if e.find('Bad authentication type; allowed types') != -1:
self.debug('认证失败{}'.format(e))
if self.__host in ['127.0.0.1', 'localhost'] and self.__pass == 'none':
return self.returnMsg(False, '帐号或密码错误: {}'.format("Authentication failed ," + self.__user + "@" + self.__host + ":" + str(self.__port)))
return self.returnMsg(False, '不支持的身份验证类型: {}'.format(e))
if e.find('Connection reset by peer') != -1:
self.debug('目标服务器主动拒绝连接')
return self.returnMsg(False, '目标服务器主动拒绝连接')
if e.find('Error reading SSH protocol banner') != -1:
self.debug('协议头响应超时')
return self.returnMsg(False, '协议头响应超时,与目标服务器之间的网络质量太糟糕:' + e)
if not e:
self.debug('SSH协议握手超时')
return self.returnMsg(False, "SSH协议握手超时,与目标服务器之间的网络质量太糟糕")
err = mw.getTracebackInfo()
self.debug(err)
return self.returnMsg(False, "未知错误: {}".format(err))
self.debug('认证成功,正在构建会话通道')
ssh = self.__tp.open_session()
ssh.get_pty(term='xterm', width=100, height=34)
ssh.invoke_shell()
self.__ssh_list[sid] = ssh
mw.writeLog(self.__log_type, '成功登录到SSH服务器 [{}:{}]'.format(
self.__host, self.__port))
self.debug('通道已构建')
return self.returnMsg(True, '连接成功.')
def getSshInfo(self, file):
rdata = mw.readFile(file)
destr = mw.deDoubleCrypt('mdserver-web', rdata)
return json.loads(destr)
def setAttr(self, sid, info):
self.__host = info['host'].strip()
# 外部连接获取
if not self.__host in ['127.0.0.1', 'localhost']:
dst_info = mw.getServerDir() + '/webssh/host/' + self.__host + '/info.json'
if os.path.exists(dst_info):
info = self.getSshInfo(dst_info)
if 'type' in info:
self.__type = info['type']
if 'port' in info:
self.__port = int(info['port'])
if 'username' in info:
self.__user = info['username']
if 'pkey' in info:
self.__pkey = info['pkey']
if 'password' in info:
self.__pass = info['password']
if 'pkey_passwd' in info:
self.__key_passwd = info['pkey_passwd']
# print(self.__host, self.__pass, self.__key_passwd)
try:
result = self.connect(sid)
# print(result)
except Exception as ex:
if str(ex).find("NoneType") == -1:
raise ex
return result
def send(self):
pass
def close(self):
try:
if self.__ssh:
self.__ssh.close()
if self.__tp: # 关闭宿主服务
self.__tp.close()
if self.__ps:
self.__ps.close()
except:
pass
def resize(self, sid, data):
try:
self.__ssh_list[sid].resize_pty(
width=data['cols'], height=data['rows'])
return True
except:
return False
def wsSend(self, recv):
try:
t = recv.decode("utf-8")
return emit('server_response', {'data': t})
except Exception as e:
return emit('server_response', {'data': recv})
def wsSendConnect(self):
return emit('connect', {'data': 'ok'})
def wsSendReConnect(self):
return emit('reconnect', {'data': 'ok'})
def heartbeat(self):
# limit_cos = 10
while True:
time.sleep(3)
cur_time = time.time()
for x in list(self.__ssh_list.keys()):
ssh_last_time = self.__ssh_last_request_time[x]
sid_off_cos = cur_time - ssh_last_time
# print("heartbeat off cos :", x, sid_off_cos)
if sid_off_cos > 3:
cur_ssh = self.__ssh_list[x]
if not cur_ssh:
del(self.__ssh_list[x])
del(self.__ssh_last_request_time[x])
continue
if cur_ssh.exit_status_ready():
del(self.__ssh_list[x])
del(self.__ssh_last_request_time[x])
continue
cur_ssh.send("exit\r\n")
del(self.__ssh_list[x])
del(self.__ssh_last_request_time[x])
def run(self, sid, info):
self.__sid = sid
if not self.__sid:
return self.wsSend('WebSocketIO无效')
self.__ssh_last_request_time[sid] = time.time()
if not sid in self.__ssh_list:
if type(info) == dict and 'host' in info:
result = self.setAttr(sid, info)
if result['status']:
return self.wsSendConnect()
else:
return self.wsSend(result['msg'])
else:
return self.wsSendReConnect()
result = self.returnMsg(False, '')
if sid in self.__ssh_list:
if 'resize' in info:
self.resize(sid, info)
result = self.returnMsg(True, '已连接')
if result['status']:
if type(info) == str:
time.sleep(0.1)
cur_ssh = self.__ssh_list[sid]
if cur_ssh.exit_status_ready():
self.wsSend("logout\r\n")
del(self.__ssh_list[sid])
return
cur_ssh.send(info)
try:
time.sleep(0.005)
recv = cur_ssh.recv(8192)
return self.wsSend(recv)
except Exception as ex:
return self.wsSend('')
else:
return self.wsSend(result['msg'])

View File

@@ -1,978 +0,0 @@
# 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 re
import math
import sys
import json
from flask import Flask, session
from flask import request
import db
import mw
import config_api
import requests
from threading import Thread
from time import sleep
def mw_async(f):
def wrapper(*args, **kwargs):
thr = Thread(target=f, args=args, kwargs=kwargs)
thr.start()
return wrapper
class system_api:
setupPath = None
pids = None
cache = {}
def __init__(self):
self.setupPath = mw.getServerDir()
##### ----- start ----- ###
def networkApi(self):
data = self.getNetWork()
return mw.getJson(data)
def updateServerApi(self):
stype = request.args.get('type', 'check')
version = request.args.get('version', '')
return self.updateServer(stype, version)
def systemTotalApi(self):
data = self.getSystemTotal()
return mw.getJson(data)
def diskInfoApi(self):
diskInfo = self.getDiskInfo()
return mw.getJson(diskInfo)
def setControlApi(self):
stype = request.form.get('type', '')
day = request.form.get('day', '')
data = self.setControl(stype, day)
return data
def getLoadAverageApi(self):
start = request.args.get('start', '')
end = request.args.get('end', '')
data = self.getLoadAverageData(start, end)
return mw.getJson(data)
def getCpuIoApi(self):
start = request.args.get('start', '')
end = request.args.get('end', '')
data = self.getCpuIoData(start, end)
return mw.getJson(data)
def getDiskIoApi(self):
start = request.args.get('start', '')
end = request.args.get('end', '')
data = self.getDiskIoData(start, end)
return mw.getJson(data)
def getNetworkIoApi(self):
start = request.args.get('start', '')
end = request.args.get('end', '')
data = self.getNetWorkIoData(start, end)
return mw.getJson(data)
def rememoryApi(self):
os.system('sync')
scriptFile = mw.getRunDir() + '/script/rememory.sh'
mw.execShell("/bin/bash " + scriptFile)
data = self.getMemInfo()
return mw.getJson(data)
# 重启面板
def restartApi(self):
self.restartMw()
return mw.returnJson(True, '面板已重启!')
def restartServerApi(self):
if mw.isAppleSystem():
return mw.returnJson(False, "开发环境不可重起")
self.restartServer()
return mw.returnJson(True, '正在重启服务器!')
##### ----- end ----- ###
def restartTask(self):
initd = mw.getRunDir() + '/scripts/init.d/mw'
if os.path.exists(initd):
os.system(initd + ' ' + 'restart_task')
return True
def restartMw(self):
mw.writeFile('data/restart.pl', 'True')
return True
@mw_async
def restartServer(self):
if not mw.isRestart():
return mw.returnJson(False, '请等待所有安装任务完成再执行!')
mw.execShell("sync && init 6 &")
return mw.returnJson(True, '命令发送成功!')
# 名取PID
def getPid(self, pname):
try:
if not self.pids:
self.pids = psutil.pids()
for pid in self.pids:
if psutil.Process(pid).name() == pname:
return True
return False
except:
return False
# 检查端口是否占用
def isOpen(self, port):
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(('127.0.0.1', int(port)))
s.shutdown(2)
return True
except:
return False
# 检测指定进程是否存活
def checkProcess(self, pid):
try:
if not self.pids:
self.pids = psutil.pids()
if int(pid) in self.pids:
return True
return False
except:
return False
def getEnvInfoApi(self, get=None):
serverInfo = {}
serverInfo['status'] = True
sdir = mw.getServerDir()
serverInfo['webserver'] = '未安装'
if os.path.exists(sdir + '/openresty/nginx/sbin/nginx'):
serverInfo['webserver'] = 'OpenResty'
serverInfo['php'] = []
phpversions = ['52', '53', '54', '55', '56', '70', '71',
'72', '73', '74', '80', '81', '82', '83', '84']
phpPath = sdir + '/php/'
for pv in phpversions:
if not os.path.exists(phpPath + pv + '/bin/php'):
continue
serverInfo['php'].append(pv)
serverInfo['mysql'] = False
if os.path.exists(sdir + '/mysql/bin/mysql'):
serverInfo['mysql'] = True
import psutil
try:
diskInfo = psutil.disk_usage('/www')
except:
diskInfo = psutil.disk_usage('/')
serverInfo['disk'] = diskInfo[2]
return mw.returnJson(True, 'ok', serverInfo)
def getPanelInfo(self, get=None):
# 取面板配置
address = mw.GetLocalIp()
try:
try:
port = web.ctx.host.split(':')[1]
except:
port = mw.readFile('data/port.pl')
except:
port = '7200'
domain = ''
if os.path.exists('data/domain.conf'):
domain = mw.readFile('data/domain.conf')
autoUpdate = ''
if os.path.exists('data/autoUpdate.pl'):
autoUpdate = 'checked'
limitip = ''
if os.path.exists('data/limitip.conf'):
limitip = mw.readFile('data/limitip.conf')
templates = []
for template in os.listdir('templates/'):
if os.path.isdir('templates/' + template):
templates.append(template)
template = mw.readFile('data/templates.pl')
check502 = ''
if os.path.exists('data/502Task.pl'):
check502 = 'checked'
return {'port': port, 'address': address, 'domain': domain, 'auto': autoUpdate, '502': check502, 'limitip': limitip, 'templates': templates, 'template': template}
def getSystemTotal(self, interval=1):
# 取系统统计信息
data = self.getMemInfo()
cpu = self.getCpuInfo(interval)
data['cpuNum'] = cpu[1]
data['cpuRealUsed'] = cpu[0]
data['time'] = self.getBootTime()
data['system'] = self.getSystemVersion()
data['isuser'] = mw.M('users').where(
'username=?', ('admin',)).count()
data['version'] = '0.0.1'
return data
def getLoadAverage(self):
c = os.getloadavg()
data = {}
data['one'] = round(float(c[0]), 2)
data['five'] = round(float(c[1]), 2)
data['fifteen'] = round(float(c[2]), 2)
data['max'] = psutil.cpu_count() * 2
data['limit'] = data['max']
data['safe'] = data['max'] * 0.75
return data
def getAllInfo(self, get):
data = {}
data['load_average'] = self.GetLoadAverage(get)
data['title'] = self.GetTitle()
data['network'] = self.GetNetWorkApi(get)
data['panel_status'] = not os.path.exists('/www/server/mdserver-web/data/close.pl')
import firewalls
ssh_info = firewalls.firewalls().GetSshInfo(None)
data['enable_ssh_status'] = ssh_info['status']
data['disable_ping_status'] = not ssh_info['ping']
data['time'] = self.GetBootTime()
# data['system'] = self.GetSystemVersion();
# data['mem'] = self.GetMemInfo();
data['version'] = web.ctx.session.version
return data
def getTitle(self):
titlePl = 'data/title.pl'
title = 'Linux面板'
if os.path.exists(titlePl):
title = mw.readFile(titlePl).strip()
return title
def getSystemDeviceTemperature(self):
if not hasattr(psutil, "sensors_temperatures"):
return False, "platform not supported"
temps = psutil.sensors_temperatures()
if not temps:
return False, "can't read any temperature"
for name, entries in temps.items():
for entry in entries:
return True, entry.label
# print("%-20s %s °C (high = %s °C, critical = %s °C)" % (
# entry.label or name, entry.current, entry.high,
# entry.critical))
return False, ""
def getSystemVersion(self):
#
# 取操作系统版本
current_os = mw.getOs()
# sys_temper = self.getSystemDeviceTemperature()
# print(sys_temper)
# mac
if current_os == 'darwin':
data = mw.execShell('sw_vers')[0]
data_list = data.strip().split("\n")
mac_version = ''
for x in data_list:
xlist = x.split("\t")
mac_version += xlist[len(xlist)-1] + ' '
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'
if os.path.exists(redhat_series):
version = mw.readFile('/etc/redhat-release')
version = version.replace('release ', '').strip()
arch_ver = mw.execShell("arch")
return version + " (" + arch_ver[0].strip() + ")"
os_series = '/etc/os-release'
if os.path.exists(os_series):
version = mw.execShell(
"cat /etc/*-release | grep PRETTY_NAME | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
arch_ver = mw.execShell("arch")
return version[0].strip() + " (" + arch_ver[0].strip() + ")"
return '未识别系统信息'
def getBootTime(self):
# 取系统启动时间
uptime = mw.readFile('/proc/uptime')
if uptime == False:
start_time = psutil.boot_time()
run_time = time.time() - start_time
else:
run_time = uptime.split()[0]
tStr = float(run_time)
min = tStr / 60
hours = min / 60
days = math.floor(hours / 24)
hours = math.floor(hours - (days * 24))
min = math.floor(min - (days * 60 * 24) - (hours * 60))
return mw.getInfo('已不间断运行: {1}天{2}小时{3}分钟', (str(int(days)), str(int(hours)), str(int(min))))
def getCpuInfo(self, interval=1):
# 取CPU信息
cpuCount = psutil.cpu_count()
cpuLogicalNum = psutil.cpu_count(logical=False)
used = psutil.cpu_percent(interval=interval)
cpuLogicalNum = 0
if os.path.exists('/proc/cpuinfo'):
c_tmp = mw.readFile('/proc/cpuinfo')
d_tmp = re.findall("physical id.+", c_tmp)
cpuLogicalNum = len(set(d_tmp))
used_all = psutil.cpu_percent(percpu=True)
cpu_name = mw.getCpuType() + " * {}".format(cpuLogicalNum)
return used, cpuCount, used_all, cpu_name, cpuCount, cpuLogicalNum
def getMemInfo(self):
# 取内存信息
mem = psutil.virtual_memory()
if mw.getOs() == 'darwin':
memInfo = {
'memTotal': mem.total,
}
memInfo['memRealUsed'] = memInfo['memTotal'] * (mem.percent / 100)
else:
memInfo = {
'memTotal': mem.total,
'memFree': mem.free,
'memBuffers': mem.buffers,
'memCached': mem.cached
}
memInfo['memRealUsed'] = memInfo['memTotal'] - \
memInfo['memFree'] - memInfo['memBuffers'] - \
memInfo['memCached']
return memInfo
def getMemUsed(self):
# 取内存使用率
try:
import psutil
mem = psutil.virtual_memory()
if mw.getOs() == 'darwin':
return mem.percent
memInfo = {'memTotal': mem.total / 1024 / 1024, 'memFree': mem.free / 1024 / 1024,
'memBuffers': mem.buffers / 1024 / 1024, 'memCached': mem.cached / 1024 / 1024}
tmp = memInfo['memTotal'] - memInfo['memFree'] - \
memInfo['memBuffers'] - memInfo['memCached']
tmp1 = memInfo['memTotal'] / 100
return (tmp / tmp1)
except Exception as ex:
return 1
def getDiskInfo(self):
info = self.getDiskInfo2()
if len(info) != 0:
return info
# 取磁盘分区信息
diskIo = psutil.disk_partitions()
diskInfo = []
for disk in diskIo:
if disk[1] == '/mnt/cdrom':
continue
if disk[1] == '/boot':
continue
tmp = {}
tmp['path'] = disk[1]
size_tmp = psutil.disk_usage(disk[1])
tmp['size'] = [mw.toSize(size_tmp[0]), mw.toSize(
size_tmp[1]), mw.toSize(size_tmp[2]), str(size_tmp[3]) + '%']
diskInfo.append(tmp)
return diskInfo
def getDiskInfo2(self):
# 取磁盘分区信息
temp = mw.execShell(
"df -h -P|grep '/'|grep -v tmpfs | grep -v devfs")[0]
tempInodes = mw.execShell(
"df -i -P|grep '/'|grep -v tmpfs | grep -v devfs")[0]
temp1 = temp.split('\n')
tempInodes1 = tempInodes.split('\n')
diskInfo = []
n = 0
cuts = ['/mnt/cdrom', '/boot', '/boot/efi', '/dev',
'/dev/shm', '/zroot', '/run/lock', '/run', '/run/shm', '/run/user']
for tmp in temp1:
n += 1
inodes = tempInodes1[n - 1].split()
disk = tmp.split()
if len(disk) < 5:
continue
if disk[1].find('M') != -1:
continue
if disk[1].find('K') != -1:
continue
if len(disk[5].split('/')) > 4:
continue
if disk[5] in cuts:
continue
arr = {}
arr['path'] = disk[5]
tmp1 = [disk[1], disk[2], disk[3], disk[4]]
arr['size'] = tmp1
arr['inodes'] = [inodes[1], inodes[2], inodes[3], inodes[4]]
diskInfo.append(arr)
return diskInfo
# 清理系统垃圾
def clearSystem(self, get):
count = total = 0
tmp_total, tmp_count = self.ClearMail()
count += tmp_count
total += tmp_total
tmp_total, tmp_count = self.ClearOther()
count += tmp_count
total += tmp_total
return count, total
# 清理邮件日志
def clearMail(self):
rpath = '/var/spool'
total = count = 0
import shutil
con = ['cron', 'anacron', 'mail']
for d in os.listdir(rpath):
if d in con:
continue
dpath = rpath + '/' + d
time.sleep(0.2)
num = size = 0
for n in os.listdir(dpath):
filename = dpath + '/' + n
fsize = os.path.getsize(filename)
size += fsize
if os.path.isdir(filename):
shutil.rmtree(filename)
else:
os.remove(filename)
# print('mail clear ok')
num += 1
total += size
count += num
return total, count
# 清理其它
def clearOther(self):
clearPath = [
{'path': '/www/server/mdserver-web', 'find': 'testDisk_'},
{'path': '/www/wwwlogs', 'find': 'log'},
{'path': '/tmp', 'find': 'panelBoot.pl'},
{'path': '/www/server/mdserver-web/install', 'find': '.rpm'}
]
total = count = 0
for c in clearPath:
for d in os.listdir(c['path']):
if d.find(c['find']) == -1:
continue
filename = c['path'] + '/' + d
fsize = os.path.getsize(filename)
total += fsize
if os.path.isdir(filename):
shutil.rmtree(filename)
else:
os.remove(filename)
count += 1
mw.restartWeb()
os.system('echo > /tmp/panelBoot.pl')
return total, count
def psutilNetIoCounters(self):
'''
统计网卡流量
'''
stat_pl = 'data/only_netio_counters.pl'
if os.path.exists(stat_pl):
local_lo = (0, 0, 0, 0)
ioName = psutil.net_io_counters(pernic=True).keys()
for x in ioName:
if x.find("lo") > -1:
local_lo = psutil.net_io_counters(
pernic=True).get(x)[:4]
all_io = psutil.net_io_counters()[:4]
result_io = tuple([all_io[i] - local_lo[i]
for i in range(0, len(all_io))])
# print(local_lo)
# print(all_io)
# print(result_io)
return result_io
return psutil.net_io_counters()[:4]
def getNetWork(self):
# 取网络流量信息
try:
networkInfo = {}
# 取网络流量信息
# networkIo = self.psutilNetIoCounters()
# if not "otime" in session:
# session['up'] = networkIo[0]
# session['down'] = networkIo[1]
# session['otime'] = time.time()
# ntime = time.time()
# print("source",ntime - session['otime'])
# networkInfo['upTotal'] = networkIo[0]
# networkInfo['downTotal'] = networkIo[1]
# networkInfo['up'] = round(float(
# networkIo[0] - session['up']) / (ntime - session['otime']), 2)
# networkInfo['down'] = round(
# float(networkIo[1] - session['down']) / (ntime - session['otime']), 2)
# networkInfo['downPackets'] = networkIo[3]
# networkInfo['upPackets'] = networkIo[2]
# # print networkIo[1], session['down'], ntime, session['otime']
# session['up'] = networkIo[0]
# session['down'] = networkIo[1]
# session['otime'] = time.time()
networkInfo['cpu'] = self.getCpuInfo()
networkInfo['load'] = self.getLoadAverage()
networkInfo['mem'] = self.getMemInfo()
networkInfo['iostat'] = self.getDiskIostat()
networkInfo['network'] = self.getNetWorkIostat()
return networkInfo
except Exception as e:
print(mw.getTracebackInfo())
return None
def getNetWorkIostat(self):
netInfo = {}
netInfo['ALL'] = {}
netInfo['ALL']['up'] = 0
netInfo['ALL']['down'] = 0
netInfo['ALL']['upTotal'] = 0
netInfo['ALL']['downTotal'] = 0
netInfo['ALL']['upPackets'] = 0
netInfo['ALL']['downPackets'] = 0
mtime = time.time()
iokey = 'netstat'
netio = None
if iokey in self.cache:
netio = self.cache[iokey]
if not netio:
netio = {}
netio['info'] = None
netio['all_io'] = None
netio['time'] = mtime
stime = mtime - netio['time']
if not stime: stime = 1
# print("new:",stime)
netio_group = psutil.net_io_counters(pernic=True).keys()
netio_cache = netio['info']
allio_cache = netio['all_io']
if not netio_cache:
netio_cache = {}
netio_group_t = {}
for name in netio_group:
netInfo[name] = {}
io_data = psutil.net_io_counters(pernic=True).get(name)
if not name in netio_cache:
netio_cache[name] = io_data
netio_group_t[name] = io_data
netInfo[name]['up'] = round(float((io_data[0] - netio_cache[name][0]) / stime), 2)
netInfo[name]['down'] = round(float((io_data[1] - netio_cache[name][1])/ stime), 2)
netInfo[name]['upTotal'] = io_data[0]
netInfo[name]['downTotal'] = io_data[1]
netInfo[name]['upPackets'] = io_data[2]
netInfo[name]['downPackets'] = io_data[3]
all_io = psutil.net_io_counters()[:4]
if not allio_cache:
allio_cache = all_io
netInfo['ALL']['up'] = round(float((all_io[0] - allio_cache[0]) /stime), 2)
netInfo['ALL']['down'] = round(float((all_io[1] - allio_cache[1]) /stime), 2)
netInfo['ALL']['upTotal'] = all_io[0]
netInfo['ALL']['downTotal'] = all_io[1]
netInfo['ALL']['upPackets'] = all_io[2]
netInfo['ALL']['downPackets'] = all_io[3]
self.cache[iokey] = {'info':netio_group_t,'all_io':all_io,'time':mtime}
return netInfo
def getDiskIostat(self):
iokey = 'iostat'
diskInfo = {}
diskInfo['ALL'] = {}
diskInfo['ALL']['read_count'] = 0
diskInfo['ALL']['write_count'] = 0
diskInfo['ALL']['read_bytes'] = 0
diskInfo['ALL']['write_bytes'] = 0
diskInfo['ALL']['read_time'] = 0
diskInfo['ALL']['write_time'] = 0
diskInfo['ALL']['read_merged_count'] = 0
diskInfo['ALL']['write_merged_count'] = 0
try:
diskio = None
if iokey in self.cache:
diskio = self.cache[iokey]
mtime = int(time.time())
if not diskio:
diskio = {}
diskio['info'] = None
diskio['time'] = mtime
diskio_cache = diskio['info']
stime = mtime - diskio['time']
if not stime: stime = 1
diskio_group = psutil.disk_io_counters(perdisk=True)
if not diskio_cache:
diskio_cache = diskio_group
for disk_name in diskio_group.keys():
diskInfo[disk_name] = {}
# print('disk_name',disk_name)
# print(diskio_group[disk_name].write_time , diskio_cache[disk_name].write_time)
# print(diskio_group[disk_name].write_count , diskio_cache[disk_name].write_count)
diskInfo[disk_name]['read_count'] = int((diskio_group[disk_name].read_count - diskio_cache[disk_name].read_count) / stime)
diskInfo[disk_name]['write_count'] = int((diskio_group[disk_name].write_count - diskio_cache[disk_name].write_count) / stime)
diskInfo[disk_name]['read_bytes'] = int((diskio_group[disk_name].read_bytes - diskio_cache[disk_name].read_bytes) / stime)
diskInfo[disk_name]['write_bytes'] = int((diskio_group[disk_name].write_bytes - diskio_cache[disk_name].write_bytes) / stime)
diskInfo[disk_name]['read_time'] = int((diskio_group[disk_name].read_time - diskio_cache[disk_name].read_time) / stime)
diskInfo[disk_name]['write_time'] = int((diskio_group[disk_name].write_time - diskio_cache[disk_name].write_time) / stime)
if 'read_merged_count' in diskio_group[disk_name] and 'read_merged_count' in diskio_cache[disk_name]:
diskInfo[disk_name]['read_merged_count'] = int((diskio_group[disk_name].read_merged_count - diskio_cache[disk_name].read_merged_count) / stime)
if 'write_merged_count' in diskio_group[disk_name] and 'write_merged_count' in diskio_cache[disk_name]:
diskInfo[disk_name]['write_merged_count'] = int((diskio_group[disk_name].write_merged_count - diskio_cache[disk_name].write_merged_count) / stime)
diskInfo['ALL']['read_count'] += diskInfo[disk_name]['read_count']
diskInfo['ALL']['write_count'] += diskInfo[disk_name]['write_count']
diskInfo['ALL']['read_bytes'] += diskInfo[disk_name]['read_bytes']
diskInfo['ALL']['write_bytes'] += diskInfo[disk_name]['write_bytes']
if diskInfo['ALL']['read_time'] < diskInfo[disk_name]['read_time']:
diskInfo['ALL']['read_time'] = diskInfo[disk_name]['read_time']
if diskInfo['ALL']['write_time'] < diskInfo[disk_name]['write_time']:
diskInfo['ALL']['write_time'] = diskInfo[disk_name]['write_time']
if 'read_merged_count' in diskInfo[disk_name] and 'read_merged_count' in diskInfo[disk_name]:
diskInfo['ALL']['read_merged_count'] += diskInfo[disk_name]['read_merged_count']
if 'write_merged_count' in diskInfo[disk_name] and 'write_merged_count' in diskInfo[disk_name]:
diskInfo['ALL']['write_merged_count'] += diskInfo[disk_name]['write_merged_count']
self.cache[iokey] = {'info':diskio_group,'time':mtime}
except Exception as e:
pass
return diskInfo
def getNetWorkIoData(self, start, end):
# 取指定时间段的网络Io
data = mw.M('network').dbfile('system').where("addtime>=? AND addtime<=?", (start, end)).field(
'id,up,down,total_up,total_down,down_packets,up_packets,addtime').order('id asc').select()
return self.toAddtime(data)
def getDiskIoData(self, start, end):
# 取指定时间段的磁盘Io
data = mw.M('diskio').dbfile('system').where("addtime>=? AND addtime<=?", (start, end)).field(
'id,read_count,write_count,read_bytes,write_bytes,read_time,write_time,addtime').order('id asc').select()
return self.toAddtime(data)
def getCpuIoData(self, start, end):
# 取指定时间段的CpuIo
data = mw.M('cpuio').dbfile('system').where("addtime>=? AND addtime<=?",
(start, end)).field('id,pro,mem,addtime').order('id asc').select()
return self.toAddtime(data, True)
def getLoadAverageData(self, start, end):
data = mw.M('load_average').dbfile('system').where("addtime>=? AND addtime<=?", (
start, end)).field('id,pro,one,five,fifteen,addtime').order('id asc').select()
return self.toAddtime(data)
# 格式化addtime列
def toAddtime(self, data, tomem=False):
import time
if tomem:
import psutil
mPre = (psutil.virtual_memory().total / 1024 / 1024) / 100
length = len(data)
he = 1
if length > 100:
he = 1
if length > 1000:
he = 3
if length > 10000:
he = 15
if he == 1:
for i in range(length):
data[i]['addtime'] = time.strftime(
'%m/%d %H:%M', time.localtime(float(data[i]['addtime'])))
if tomem and data[i]['mem'] > 100:
data[i]['mem'] = data[i]['mem'] / mPre
return data
else:
count = 0
tmp = []
for value in data:
if count < he:
count += 1
continue
value['addtime'] = time.strftime(
'%m/%d %H:%M', time.localtime(float(value['addtime'])))
if tomem and value['mem'] > 100:
value['mem'] = value['mem'] / mPre
tmp.append(value)
count = 0
return tmp
def setControl(self, stype, day):
filename = 'data/control.conf'
stat_pl = 'data/only_netio_counters.pl'
if stype == '0':
mw.execShell("rm -rf " + filename)
elif stype == '1':
_day = int(day)
if _day < 1:
return mw.returnJson(False, "设置失败!")
mw.writeFile(filename, day)
elif stype == '2':
mw.execShell("rm -rf " + stat_pl)
elif stype == '3':
mw.execShell("echo 'True' > " + stat_pl)
elif stype == 'del':
if not mw.isRestart():
return mw.returnJson(False, '请等待所有安装任务完成再执行')
os.remove("data/system.db")
sql = db.Sql().dbfile('system')
csql = mw.readFile('data/sql/system.sql')
csql_list = csql.split(';')
for index in range(len(csql_list)):
sql.execute(csql_list[index], ())
return mw.returnJson(True, "监控服务已关闭")
else:
data = {}
if os.path.exists(filename):
try:
data['day'] = int(mw.readFile(filename))
except:
data['day'] = 30
data['status'] = True
else:
data['day'] = 30
data['status'] = False
if os.path.exists(stat_pl):
data['stat_all_status'] = True
else:
data['stat_all_status'] = False
return mw.getJson(data)
return mw.returnJson(True, "设置成功!")
def versionDiff(self, old, new):
'''
test 测试
new 有新版本
none 没有新版本
'''
new_list = new.split('.')
if len(new_list) > 3:
return 'test'
old_list = old.split('.')
ret = 'none'
isHasNew = True
if int(new_list[0]) == int(old_list[0]) and int(new_list[1]) == int(old_list[1]) and int(new_list[2]) == int(old_list[2]):
isHasNew = False
if isHasNew:
return 'new'
return ret
def getServerInfo(self):
import urllib.request
import ssl
upAddr = 'https://api.github.com/repos/midoks/mdserver-web/releases/latest'
try:
context = ssl._create_unverified_context()
req = urllib.request.urlopen(upAddr, context=context, timeout=3)
result = req.read().decode('utf-8')
version = json.loads(result)
return version
except Exception as e:
print('getServerInfo', e)
return {}
def updateServer(self, stype, version=''):
return mw.returnJson(False, '与后续版本差异太大,不再提供更新')
# 更新服务
try:
if not mw.isRestart():
return mw.returnJson(False, '请等待所有安装任务完成再执行!')
version_new_info = self.getServerInfo()
version_now = config_api.config_api().getVersion()
new_ver = version_new_info['name']
if stype == 'check':
if not 'name' in version_new_info:
return mw.returnJson(False, '服务器数据或网络有问题!')
diff = self.versionDiff(version_now, new_ver)
if diff == 'new':
return mw.returnJson(True, '有新版本!', new_ver)
elif diff == 'test':
return mw.returnJson(True, '有测试版本!', new_ver)
else:
return mw.returnJson(False, '已经是最新,无需更新!')
if stype == 'info':
if not 'name' in version_new_info:
return mw.returnJson(False, '服务器数据有问题!')
diff = self.versionDiff(version_now, new_ver)
data = {}
data['version'] = new_ver
data['content'] = version_new_info[
'body'].replace("\n", "<br/>")
return mw.returnJson(True, '更新信息!', data)
if stype == 'update':
if version == '':
return mw.returnJson(False, '缺少版本信息!')
if new_ver != version:
return mw.returnJson(False, '更新失败,请重试!')
toPath = mw.getRootDir() + '/temp'
if not os.path.exists(toPath):
mw.execShell('mkdir -p ' + toPath)
newUrl = "https://github.com/midoks/mdserver-web/archive/refs/tags/" + version + ".zip"
dist_mw = toPath + '/mw.zip'
if not os.path.exists(dist_mw):
mw.execShell(
'wget --no-check-certificate -O ' + dist_mw + ' ' + newUrl)
dist_to = toPath + "/mdserver-web-" + version
if not os.path.exists(dist_to):
os.system('unzip -o ' + toPath +
'/mw.zip' + ' -d ' + toPath)
cmd_cp = 'cp -rf ' + toPath + '/mdserver-web-' + \
version + '/* ' + mw.getServerDir() + '/mdserver-web'
mw.execShell(cmd_cp)
mw.execShell('rm -rf ' + toPath + '/mdserver-web-' + version)
mw.execShell('rm -rf ' + toPath + '/mw.zip')
update_env = '''
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
P_VER=`python3 -V | awk '{print $2}'`
if [ ! -f /www/server/mdserver-web/bin/activate ];then
cd /www/server/mdserver-web && python3 -m venv .
cd /www/server/mdserver-web && source /www/server/mdserver-web/bin/activate
else
cd /www/server/mdserver-web && source /www/server/mdserver-web/bin/activate
fi
cn=$(curl -fsSL -m 10 http://ipinfo.io/json | grep "\"country\": \"CN\"")
PIPSRC="https://pypi.python.org/simple"
if [ ! -z "$cn" ];then
PIPSRC="https://pypi.tuna.tsinghua.edu.cn/simple"
fi
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/requirements.txt -i $PIPSRC
P_VER_D=`echo "$P_VER"|awk -F '.' '{print $1}'`
P_VER_M=`echo "$P_VER"|awk -F '.' '{print $2}'`
NEW_P_VER=${P_VER_D}.${P_VER_M}
if [ -f /www/server/mdserver-web/version/r${NEW_P_VER}.txt ];then
cd /www/server/mdserver-web && pip3 install -r /www/server/mdserver-web/version/r${NEW_P_VER}.txt -i $PIPSRC
fi
'''
os.system(update_env)
self.restartMw()
return mw.returnJson(True, '安装更新成功!')
return mw.returnJson(False, '已经是最新,无需更新!')
except Exception as ex:
# print('updateServer', ex)
return mw.returnJson(False, "连接服务器失败!" + str(ex))
# 修复面板
def repPanel(self, get):
vp = ''
if mw.readFile('/www/server/mdserver-web/class/common.py').find('checkSafe') != -1:
vp = '_pro'
mw.ExecShell("wget -O update.sh " + mw.get_url() +
"/install/update" + vp + ".sh && bash update.sh")
if hasattr(web.ctx.session, 'getCloudPlugin'):
del(web.ctx.session['getCloudPlugin'])
return True

View File

@@ -1,103 +0,0 @@
# 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 flask import request
class task_api:
def __init__(self):
pass
def countApi(self):
c = mw.M('tasks').where("status!=?", ('1',)).count()
return str(c)
def listApi(self):
p = request.form.get('p', '1')
limit = request.form.get('limit', '10').strip()
search = request.form.get('search', '').strip()
start = (int(p) - 1) * int(limit)
limit_str = str(start) + ',' + str(limit)
_list = mw.M('tasks').where('', ()).field(
'id,name,type,status,addtime,start,end').limit(limit_str).order('id desc').select()
_ret = {}
_ret['data'] = _list
count = mw.M('tasks').where('', ()).count()
_page = {}
_page['count'] = count
_page['tojs'] = 'remind'
_page['p'] = p
# return data
_ret['count'] = count
_ret['page'] = mw.getPage(_page)
return mw.getJson(_ret)
def getExecLogApi(self):
file = os.getcwd() + "/tmp/panelExec.log"
v = mw.getLastLine(file, 100)
return v
def getTaskSpeedApi(self):
tempFile = mw.getRunDir() + '/tmp/panelExec.log'
freshFile = mw.getRunDir() + '/tmp/panelFresh'
find = mw.M('tasks').where('status=? OR status=?',
('-1', '0')).field('id,type,name,execstr').find()
if not len(find):
return mw.returnJson(False, '当前没有任务队列在执行-2!')
mw.triggerTask()
data = {}
data['name'] = find['name']
data['execstr'] = find['execstr']
if find['type'] == 'download':
readLine = ""
for i in range(3):
try:
readLine = mw.readFile(tempFile)
if len(readLine) > 10:
data['msg'] = json.loads(readLine)
data['isDownload'] = True
break
except Exception as e:
if i == 2:
mw.M('tasks').where("id=?", (find['id'],)).save(
'status', ('0',))
return mw.returnJson(False, '当前没有任务队列在执行-4:' + str(e))
time.sleep(0.5)
else:
data['msg'] = mw.getLastLine(tempFile, 10)
data['isDownload'] = False
data['task'] = mw.M('tasks').where("status!=?", ('1',)).field(
'id,status,name,type').order("id asc").select()
return mw.getJson(data)

View File

@@ -1,143 +0,0 @@
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# 验证码操作
# ---------------------------------------------------------------------------------
import random
import math
from PIL import Image, ImageDraw, ImageFont, ImageFilter
class vieCode:
__fontSize = 20 # 字体大小
__width = 120 # 画布宽度
__heigth = 45 # 画布高度
__length = 4 # 验证码长度
__draw = None # 画布
__img = None # 图片资源
__code = None # 验证码字符
__str = None # 自定义验证码字符集
__inCurve = True # 是否画干扰线
__inNoise = True # 是否画干扰点
__type = 2 # 验证码类型 1、纯字母 2、数字字母混合
__fontPatn = 'class/fonts/2.ttf' # 字体
def GetCodeImage(self, size=80, length=4):
'''获取验证码图片
@param int size 验证码大小
@param int length 验证码长度
'''
# 准备基础数据
self.__length = length
self.__fontSize = size
self.__width = self.__fontSize * self.__length
self.__heigth = int(self.__fontSize * 1.5)
# 生成验证码图片
self.__createCode()
self.__createImage()
self.__createNoise()
self.__printString()
self.__cerateFilter()
return self.__img, self.__code
def __cerateFilter(self):
'''模糊处理'''
self.__img = self.__img.filter(ImageFilter.BLUR)
filter = ImageFilter.ModeFilter(8)
self.__img = self.__img.filter(filter)
def __createCode(self):
'''创建验证码字符'''
# 是否自定义字符集合
if not self.__str:
# 源文本
number = "3456789"
srcLetter = "qwertyuipasdfghjkzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
srcUpper = srcLetter.upper()
if self.__type == 1:
self.__str = number
else:
self.__str = srcLetter + srcUpper + number
# 构造验证码
self.__code = random.sample(self.__str, self.__length)
def __createImage(self):
'''创建画布'''
bgColor = (random.randint(200, 255), random.randint(
200, 255), random.randint(200, 255))
self.__img = Image.new('RGB', (self.__width, self.__heigth), bgColor)
self.__draw = ImageDraw.Draw(self.__img)
def __createNoise(self):
'''画干扰点'''
if not self.__inNoise:
return
font = ImageFont.truetype(self.__fontPatn, int(self.__fontSize / 1.5))
for i in range(5):
# 杂点颜色
noiseColor = (random.randint(150, 200), random.randint(
150, 200), random.randint(150, 200))
putStr = random.sample(self.__str, 2)
for j in range(2):
# 绘杂点
size = (random.randint(-10, self.__width),
random.randint(-10, self.__heigth))
self.__draw.text(size, putStr[j], font=font, fill=noiseColor)
pass
def __createCurve(self):
'''画干扰线'''
if not self.__inCurve:
return
x = y = 0
# 计算曲线系数
a = random.uniform(1, self.__heigth / 2)
b = random.uniform(-self.__width / 4, self.__heigth / 4)
f = random.uniform(-self.__heigth / 4, self.__heigth / 4)
t = random.uniform(self.__heigth, self.__width * 2)
xend = random.randint(self.__width / 2, self.__width * 2)
w = (2 * math.pi) / t
# 画曲线
color = (random.randint(30, 150), random.randint(
30, 150), random.randint(30, 150))
for x in range(xend):
if w != 0:
for k in range(int(self.__heigth / 10)):
y = a * math.sin(w * x + f) + b + self.__heigth / 2
i = int(self.__fontSize / 5)
while i > 0:
px = x + i
py = y + i + k
self.__draw.point((px, py), color)
i -= i
def __printString(self):
'''打印验证码字符串'''
font = ImageFont.truetype(self.__fontPatn, self.__fontSize)
x = 0
# 打印字符到画板
for i in range(self.__length):
# 设置字体随机颜色
color = (random.randint(30, 150), random.randint(
30, 150), random.randint(30, 150))
# 计算座标
x = random.uniform(self.__fontSize * i * 0.95,
self.__fontSize * i * 1.1)
y = self.__fontSize * random.uniform(0.3, 0.5)
# 打印字符
self.__draw.text((x, y), self.__code[i], font=font, fill=color)

View File

@@ -1,48 +0,0 @@
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# VIP用户管理
# ---------------------------------------------------------------------------------
import mw
from flask import request
import requests
class vip_api:
api_url = 'https://wo.midoks.icu/api/wp-json/vip'
def __init__(self):
pass
def loginApi(self):
username = request.form.get('username', '')
password = request.form.get('password', '')
password = mw.aesEncrypt(password)
headers = {
"Content-Type": "application/x-www-form-urlencoded",
}
print("name:", str(username))
print("pwd:", str(password))
args = {
'name': username,
'pass': password
}
data = requests.post(self.api_url + '/v1/login',
data=args, headers=headers)
print(data.text)
return mw.returnJson(False, "测试中!")

Binary file not shown.

View File

@@ -1,5 +0,0 @@
- fcgi-client.py
```
https://pypi.org/project/flup6/1.1.1/#files
```

View File

@@ -1,408 +0,0 @@
# Copyright (c) 2006 Allan Saddi <allan@saddi.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $Id$
#
# Copyright (c) 2011 Vladimir Rusinov <vladimir@greenmice.info>
__author__ = 'Allan Saddi <allan@saddi.com>'
__version__ = '$Revision$'
import sys
import select
import struct
import socket
import errno
import types
__all__ = ['FCGIApp']
# Constants from the spec.
FCGI_LISTENSOCK_FILENO = 0
FCGI_HEADER_LEN = 8
FCGI_VERSION_1 = 1
FCGI_BEGIN_REQUEST = 1
FCGI_ABORT_REQUEST = 2
FCGI_END_REQUEST = 3
FCGI_PARAMS = 4
FCGI_STDIN = 5
FCGI_STDOUT = 6
FCGI_STDERR = 7
FCGI_DATA = 8
FCGI_GET_VALUES = 9
FCGI_GET_VALUES_RESULT = 10
FCGI_UNKNOWN_TYPE = 11
FCGI_MAXTYPE = FCGI_UNKNOWN_TYPE
FCGI_NULL_REQUEST_ID = 0
FCGI_KEEP_CONN = 1
FCGI_RESPONDER = 1
FCGI_AUTHORIZER = 2
FCGI_FILTER = 3
FCGI_REQUEST_COMPLETE = 0
FCGI_CANT_MPX_CONN = 1
FCGI_OVERLOADED = 2
FCGI_UNKNOWN_ROLE = 3
FCGI_MAX_CONNS = 'FCGI_MAX_CONNS'
FCGI_MAX_REQS = 'FCGI_MAX_REQS'
FCGI_MPXS_CONNS = 'FCGI_MPXS_CONNS'
FCGI_Header = '!BBHHBx'
FCGI_BeginRequestBody = '!HB5x'
FCGI_EndRequestBody = '!LB3x'
FCGI_UnknownTypeBody = '!B7x'
FCGI_BeginRequestBody_LEN = struct.calcsize(FCGI_BeginRequestBody)
FCGI_EndRequestBody_LEN = struct.calcsize(FCGI_EndRequestBody)
FCGI_UnknownTypeBody_LEN = struct.calcsize(FCGI_UnknownTypeBody)
if __debug__:
import time
# Set non-zero to write debug output to a file.
DEBUG = 0
DEBUGLOG = '/www/server/mdserver-web/logs/fastcgi.log'
def _debug(level, msg):
if DEBUG < level:
return
try:
f = open(DEBUGLOG, 'a')
f.write('%sfcgi: %s\n' % (time.ctime()[4:-4], msg))
f.close()
except:
pass
def decode_pair(s, pos=0):
"""
Decodes a name/value pair.
The number of bytes decoded as well as the name/value pair
are returned.
"""
nameLength = ord(s[pos])
if nameLength & 128:
nameLength = struct.unpack('!L', s[pos:pos + 4])[0] & 0x7fffffff
pos += 4
else:
pos += 1
valueLength = ord(s[pos])
if valueLength & 128:
valueLength = struct.unpack('!L', s[pos:pos + 4])[0] & 0x7fffffff
pos += 4
else:
pos += 1
name = s[pos:pos + nameLength]
pos += nameLength
value = s[pos:pos + valueLength]
pos += valueLength
return (pos, (name, value))
def encode_pair(name, value):
"""
Encodes a name/value pair.
The encoded string is returned.
"""
nameLength = len(name)
if nameLength < 128:
s = chr(nameLength).encode()
else:
s = struct.pack('!L', nameLength | 0x80000000)
valueLength = len(value)
if valueLength < 128:
s += chr(valueLength).encode()
else:
s += struct.pack('!L', valueLength | 0x80000000)
return s + name + value
class Record(object):
"""
A FastCGI Record.
Used for encoding/decoding records.
"""
def __init__(self, type=FCGI_UNKNOWN_TYPE, requestId=FCGI_NULL_REQUEST_ID):
self.version = FCGI_VERSION_1
self.type = type
self.requestId = requestId
self.contentLength = 0
self.paddingLength = 0
self.contentData = ''
def _recvall(sock, length):
"""
Attempts to receive length bytes from a socket, blocking if necessary.
(Socket may be blocking or non-blocking.)
"""
dataList = []
recvLen = 0
while length:
try:
data = sock.recv(length)
except socket.error as e:
if e[0] == errno.EAGAIN:
select.select([sock], [], [])
continue
else:
raise
if not data: # EOF
break
dataList.append(data)
dataLen = len(data)
recvLen += dataLen
length -= dataLen
return b''.join(dataList), recvLen
_recvall = staticmethod(_recvall)
def read(self, sock):
"""Read and decode a Record from a socket."""
try:
header, length = self._recvall(sock, FCGI_HEADER_LEN)
except:
raise EOFError
if length < FCGI_HEADER_LEN:
raise EOFError
self.version, self.type, self.requestId, self.contentLength, \
self.paddingLength = struct.unpack(FCGI_Header, header)
if __debug__:
_debug(9, 'read: fd = %d, type = %d, requestId = %d, '
'contentLength = %d' %
(sock.fileno(), self.type, self.requestId,
self.contentLength))
if self.contentLength:
try:
self.contentData, length = self._recvall(sock,
self.contentLength)
except:
raise EOFError
if length < self.contentLength:
raise EOFError
if self.paddingLength:
try:
self._recvall(sock, self.paddingLength)
except:
raise EOFError
def _sendall(sock, data):
"""
Writes data to a socket and does not return until all the data is sent.
"""
length = len(data)
while length:
try:
sent = sock.send(data)
except socket.error as e:
if e[0] == errno.EAGAIN:
select.select([], [sock], [])
continue
else:
raise
data = data[sent:]
length -= sent
_sendall = staticmethod(_sendall)
def write(self, sock):
"""Encode and write a Record to a socket."""
self.paddingLength = -self.contentLength & 7
if __debug__:
_debug(9, 'write: fd = %d, type = %d, requestId = %d, '
'contentLength = %d' %
(sock.fileno(), self.type, self.requestId,
self.contentLength))
header = struct.pack(FCGI_Header, self.version, self.type,
self.requestId, self.contentLength,
self.paddingLength)
self._sendall(sock, header)
if self.contentLength:
self._sendall(sock, self.contentData)
if self.paddingLength:
self._sendall(sock, b'\x00' * self.paddingLength)
class FCGIApp(object):
def __init__(self, connect=None, host=None, port=None, filterEnviron=True):
if host is not None:
assert port is not None
connect = (host, port)
self._connect = connect
self._filterEnviron = filterEnviron
def __call__(self, environ, io, start_response=None):
# For sanity's sake, we don't care about FCGI_MPXS_CONN
# (connection multiplexing). For every request, we obtain a new
# transport socket, perform the request, then discard the socket.
# This is, I believe, how mod_fastcgi does things...
sock = self._getConnection()
# Since this is going to be the only request on this connection,
# set the request ID to 1.
requestId = 1
# Begin the request
rec = Record(FCGI_BEGIN_REQUEST, requestId)
rec.contentData = struct.pack(FCGI_BeginRequestBody, FCGI_RESPONDER, 0)
rec.contentLength = FCGI_BeginRequestBody_LEN
rec.write(sock)
# Filter WSGI environ and send it as FCGI_PARAMS
if self._filterEnviron:
params = self._defaultFilterEnviron(environ)
else:
params = self._lightFilterEnviron(environ)
# TODO: Anything not from environ that needs to be sent also?
# return '200 OK',[],str(params),''
self._fcgiParams(sock, requestId, params)
self._fcgiParams(sock, requestId, {})
# Transfer wsgi.input to FCGI_STDIN
content_length = int(environ.get('CONTENT_LENGTH') or 0)
s = ''
#io = StringIO(stdin)
while True:
if not io:
break
chunk_size = min(content_length, 4096)
s = io.read(chunk_size)
content_length -= len(s)
rec = Record(FCGI_STDIN, requestId)
rec.contentData = s
rec.contentLength = len(s)
rec.write(sock)
if not s:
break
# Empty FCGI_DATA stream
rec = Record(FCGI_DATA, requestId)
rec.write(sock)
return sock
def _getConnection(self):
if self._connect is not None:
# The simple case. Create a socket and connect to the
# application.
if isinstance(self._connect, str):
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(self._connect)
elif hasattr(socket, 'create_connection'):
sock = socket.create_connection(self._connect)
else:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(self._connect)
return sock
# To be done when I have more time...
# , 'Launching and managing FastCGI programs not yet implemented'
raise NotImplementedError
def _fcgiGetValues(self, sock, vars):
# Construct FCGI_GET_VALUES record
outrec = Record(FCGI_GET_VALUES)
data = []
for name in vars:
data.append(encode_pair(name, ''))
data = ''.join(data)
outrec.contentData = data
outrec.contentLength = len(data)
outrec.write(sock)
# Await response
inrec = Record()
inrec.read(sock)
result = {}
if inrec.type == FCGI_GET_VALUES_RESULT:
pos = 0
while pos < inrec.contentLength:
pos, (name, value) = decode_pair(inrec.contentData, pos)
result[name] = value
return result
def _fcgiParams(self, sock, requestId, params):
rec = Record(FCGI_PARAMS, requestId)
data = []
for name, value in params.items():
data.append(encode_pair(name.encode(
'latin-1'), value.encode('latin-1')))
data = b''.join(data)
rec.contentData = data
rec.contentLength = len(data)
rec.write(sock)
_environPrefixes = ['SERVER_', 'HTTP_', 'REQUEST_', 'REMOTE_', 'PATH_',
'CONTENT_', 'DOCUMENT_', 'SCRIPT_']
_environCopies = ['SCRIPT_NAME', 'QUERY_STRING', 'AUTH_TYPE']
_environRenames = []
def _defaultFilterEnviron(self, environ):
result = {}
for n in environ.keys():
iv = False
for p in self._environPrefixes:
if n.startswith(p):
result[n] = environ[n]
iv = True
if n in self._environCopies:
result[n] = environ[n]
iv = True
if n in self._environRenames:
result[self._environRenames[n]] = environ[n]
iv = True
if not iv:
result[n] = environ[n]
return result
def _lightFilterEnviron(self, environ):
result = {}
for n in environ.keys():
if n.upper() == n:
result[n] = environ[n]
return result

View File

@@ -1,208 +0,0 @@
# coding:utf-8
import json
import os
import time
import re
import sys
import time
import struct
import fcgi_client
FCGI_Header = '!BBHHBx'
if sys.version_info[0] == 2:
try:
from cStringIO import StringIO
except:
from StringIO import StringIO
else:
from io import BytesIO as StringIO
def get_header_data(sock):
'''
@name 获取头部32KB数据
@param sock socketobject(fastcgi套接字对象)
@return bytes
'''
headers_data = b''
total_len = 0
header_len = 1024 * 128
while True:
fastcgi_header = sock.recv(8)
if not fastcgi_header:
break
if len(fastcgi_header) != 8:
headers_data += fastcgi_header
break
fast_pack = struct.unpack(FCGI_Header, fastcgi_header)
if fast_pack[1] == 3:
break
tlen = fast_pack[3]
while tlen > 0:
sd = sock.recv(tlen)
if not sd:
break
headers_data += sd
tlen -= len(sd)
total_len += fast_pack[3]
if fast_pack[4]:
sock.recv(fast_pack[4])
if total_len > header_len:
break
return headers_data
def format_header_data(headers_data):
'''
@name 格式化响应头
@param headers_data bytes(fastcgi头部32KB数据)
@return status int(响应状态), headers dict(响应头), bdata bytes(格式化响应头后的多余数据)
'''
status = '200 OK'
headers = {}
pos = 0
while True:
eolpos = headers_data.find(b'\n', pos)
if eolpos < 0:
break
line = headers_data[pos:eolpos - 1]
pos = eolpos + 1
line = line.strip()
if len(line) < 2:
break
if line.find(b':') == -1:
continue
header, value = line.split(b':', 1)
header = header.strip()
value = value.strip()
if isinstance(header, bytes):
header = header.decode()
value = value.decode()
if header == 'Status':
status = value
if status.find(' ') < 0:
status += ' BTPanel'
else:
headers[header] = value
bdata = headers_data[pos:]
status = int(status.split(' ')[0])
return status, headers, bdata
def resp_sock(sock, bdata):
'''
@name 以流的方式发送剩余数据
@param sock socketobject(fastcgi套接字对象)
@param bdata bytes(格式化响应头后的多余数据)
@return yield bytes
'''
# 发送除响应头以外的多余头部数据
yield bdata
while True:
fastcgi_header = sock.recv(8)
if not fastcgi_header:
break
if len(fastcgi_header) != 8:
yield fastcgi_header
break
fast_pack = struct.unpack(FCGI_Header, fastcgi_header)
if fast_pack[1] == 3:
break
tlen = fast_pack[3]
while tlen > 0:
sd = sock.recv(tlen)
if not sd:
break
tlen -= len(sd)
if sd:
yield sd
if fast_pack[4]:
sock.recv(fast_pack[4])
sock.close()
class fpm(object):
def __init__(self, sock=None, document_root='', last_path=''):
'''
@name 实例化FPM对象
@param sock string(unixsocket路径)
@param document_root string(PHP文档根目录)
@return FPM
'''
if sock:
self.fcgi_sock = sock
if document_root[-1:] != '/':
document_root += '/'
self.document_root = document_root
self.last_path = last_path
def load_url_public(self, url, content=b'', method='GET', content_type='application/x-www-form-urlencoded'):
'''
@name 转发URL到PHP-FPM 公共
@param url string(URI地址)
@param content stream(POST数据io对象)
@return fastcgi-socket
'''
fcgi = fcgi_client.FCGIApp(connect=self.fcgi_sock)
try:
script_name, query_string = url.split('?')
except ValueError:
script_name = url
query_string = ''
content_length = len(content)
if content:
content = StringIO(content)
env = {
'SCRIPT_FILENAME': '%s%s' % (self.document_root, script_name),
'QUERY_STRING': query_string,
'REQUEST_METHOD': method,
'SCRIPT_NAME': self.last_path + script_name,
'REQUEST_URI': url,
'GATEWAY_INTERFACE': 'CGI/1.1',
'SERVER_SOFTWARE': 'MW-Panel',
'REDIRECT_STATUS': '200',
'CONTENT_TYPE': content_type,
'CONTENT_LENGTH': str(content_length),
'DOCUMENT_URI': script_name,
'DOCUMENT_ROOT': self.document_root,
'SERVER_PROTOCOL': 'HTTP/1.1',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '7200',
'SERVER_ADDR': '127.0.0.1',
'SERVER_PORT': '80',
'SERVER_NAME': 'MW-Panel'
}
fpm_sock = fcgi(env, content)
_data = b''
while True:
fastcgi_header = fpm_sock.recv(8)
if not fastcgi_header:
break
if len(fastcgi_header) != 8:
_data += fastcgi_header
break
fast_pack = struct.unpack(FCGI_Header, fastcgi_header)
if fast_pack[1] == 3:
break
tlen = fast_pack[3]
while tlen > 0:
sd = fpm_sock.recv(tlen)
if not sd:
break
tlen -= len(sd)
_data += sd
if fast_pack[4]:
fpm_sock.recv(fast_pack[4])
status, headers, data = format_header_data(_data)
return data

View File

@@ -1,43 +0,0 @@
# coding: utf-8
import smtplib
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send(smtp_host, smtp_port, username, password, to_mail, subject, content):
smtp = smtplib.SMTP()
smtp.connect(smtp_host, port=smtp_port)
smtp.login(user=username, password=password)
msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = _format_addr(username)
msg['To'] = _format_addr(to_mail)
msg['Subject'] = Header(subject, 'utf-8').encode()
smtp.sendmail(from_addr=username, to_addrs=to_mail, msg=msg.as_string())
return True
def sendSSL(smtp_host, smtp_port, username, password, to_mail, subject, content):
smtp = smtplib.SMTP_SSL(smtp_host, port=smtp_port)
smtp.login(user=username, password=password)
msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = _format_addr(username)
msg['To'] = _format_addr(to_mail)
msg['Subject'] = Header(subject, 'utf-8').encode()
smtp.sendmail(from_addr=username, to_addrs=to_mail, msg=msg.as_string())
smtp.quit()
return True

View File

@@ -1,140 +0,0 @@
# coding: utf-8
import re
import os
import sys
import pymysql.cursors
class ORM:
__DB_PASS = None
__DB_USER = 'root'
__DB_PORT = 3306
__DB_NAME = ''
__DB_HOST = 'localhost'
__DB_CONN = None
__DB_CUR = None
__DB_ERR = None
__DB_CNF = '/etc/my.cnf'
__DB_TIMEOUT=1
__DB_SOCKET = '/www/server/mysql/mysql.sock'
__DB_CHARSET = "utf8"
def __Conn(self):
# print(self.__DB_HOST, self.__DB_USER, self.__DB_PASS, self.__DB_SOCKET)
'''连接数据库'''
try:
if self.__DB_HOST != 'localhost':
try:
self.__DB_CONN = pymysql.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
database=self.__DB_NAME,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=self.__DB_TIMEOUT,
cursorclass=pymysql.cursors.DictCursor)
except Exception as e:
self.__DB_CONN = pymysql.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
database=self.__DB_NAME,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=self.__DB_TIMEOUT,
cursorclass=pymysql.cursors.DictCursor)
elif os.path.exists(self.__DB_SOCKET):
try:
self.__DB_CONN = pymysql.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
database=self.__DB_NAME,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=self.__DB_TIMEOUT,
unix_socket=self.__DB_SOCKET, cursorclass=pymysql.cursors.DictCursor)
except Exception as e:
self.__DB_HOST = '127.0.0.1'
self.__DB_CONN = pymysql.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
database=self.__DB_NAME,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=self.__DB_TIMEOUT,
unix_socket=self.__DB_SOCKET, cursorclass=pymysql.cursors.DictCursor)
else:
try:
self.__DB_CONN = pymysql.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
database=self.__DB_NAME,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=self.__DB_TIMEOUT,
cursorclass=pymysql.cursors.DictCursor)
except Exception as e:
self.__DB_HOST = '127.0.0.1'
self.__DB_CONN = pymysql.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
database=self.__DB_NAME,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=self.__DB_TIMEOUT,
cursorclass=pymysql.cursors.DictCursor)
self.__DB_CUR = self.__DB_CONN.cursor()
return True
except Exception as e:
self.__DB_ERR = e
return False
def setDbConf(self, conf):
self.__DB_CNF = conf
def setSocket(self, sock):
self.__DB_SOCKET = sock
def setCharset(self, charset):
self.__DB_CHARSET = charset
def setHost(self, host):
self.__DB_HOST = host
def setPort(self, port):
self.__DB_PORT = port
def setUser(self, user):
self.__DB_USER = user
def setPwd(self, pwd):
self.__DB_PASS = pwd
def getPwd(self):
return self.__DB_PASS
def setTimeout(self, timeout = 1):
self.__DB_TIMEOUT = timeout
return True
def setDbName(self, name):
self.__DB_NAME = name
def execute(self, sql):
# 执行SQL语句返回受影响行
if not self.__Conn():
return self.__DB_ERR
try:
result = self.__DB_CUR.execute(sql)
self.__DB_CONN.commit()
self.__Close()
return result
except Exception as ex:
return ex
def ping(self):
try:
self.__DB_CONN.ping()
except Exception as e:
print(e)
return True
def query(self, sql):
# 执行SQL语句返回数据集
if not self.__Conn():
return self.__DB_ERR
try:
self.__DB_CUR.execute(sql)
result = self.__DB_CUR.fetchall()
# print(result)
# 将元组转换成列表
# data = map(list, result)
self.__Close()
return result
except Exception as ex:
return ex
def __Close(self):
# 关闭连接
self.__DB_CUR.close()
self.__DB_CONN.close()

View File

@@ -1,115 +0,0 @@
# coding: utf-8
import re
import os
import sys
class ORM:
__DB_PASS = None
__DB_USER = 'root'
__DB_PORT = 3306
__DB_HOST = 'localhost'
__DB_CONN = None
__DB_CUR = None
__DB_ERR = None
__DB_CNF = '/etc/my.cnf'
__DB_SOCKET = '/www/server/mysql/mysql.sock'
__DB_CHARSET = 'utf8'
def __Conn(self):
'''连接MYSQL数据库'''
try:
try:
import MySQLdb
except Exception as ex:
self.__DB_ERR = ex
return False
# print(self.__DB_HOST)
# print(self.__DB_USER)
# print(self.__DB_PASS)
# print(self.__DB_PORT)
# print(self.__DB_CHARSET)
# print(self.__DB_SOCKET)
if os.path.exists(self.__DB_SOCKET):
try:
self.__DB_CONN = MySQLdb.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=1, unix_socket=self.__DB_SOCKET)
except Exception as e:
print(e)
self.__DB_HOST = '127.0.0.1'
self.__DB_CONN = MySQLdb.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=1, unix_socket=self.__DB_SOCKET)
else:
try:
self.__DB_CONN = MySQLdb.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=1)
except Exception as e:
self.__DB_HOST = '127.0.0.1'
self.__DB_CONN = MySQLdb.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
port=int(self.__DB_PORT), charset=self.__DB_CHARSET, connect_timeout=1)
self.__DB_CUR = self.__DB_CONN.cursor()
return True
except MySQLdb.Error as e:
self.__DB_ERR = e
return False
def setDbConf(self, conf):
self.__DB_CNF = conf
def setSocket(self, sock):
self.__DB_SOCKET = sock
def setCharset(self, charset):
self.__DB_CHARSET = charset
def setPort(self, port):
self.__DB_PORT = port
def setPwd(self, pwd):
self.__DB_PASS = pwd
def getPwd(self):
return self.__DB_PASS
def setDbName(self, name):
self.__DB_NAME = name
def setUser(self, user):
self.__DB_USER = user
def execute(self, sql):
# 执行SQL语句返回受影响行
if not self.__Conn():
return self.__DB_ERR
try:
result = self.__DB_CUR.execute(sql)
self.__DB_CONN.commit()
self.__Close()
return result
except Exception as ex:
return ex
def query(self, sql):
# 执行SQL语句返回数据集
if not self.__Conn():
return self.__DB_ERR
try:
self.__DB_CUR.execute(sql)
result = self.__DB_CUR.fetchall()
# 将元组转换成列表
data = map(list, result)
self.__Close()
return data
except Exception as ex:
return ex
# 关闭连接
def __Close(self):
self.__DB_CUR.close()
self.__DB_CONN.close()

90
cli.sh
View File

@@ -3,31 +3,31 @@ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/hom
DIR=$(cd "$(dirname "$0")"; pwd)
MDIR=$(dirname "$DIR")
export LC_ALL="en_US.UTF-8"
# echo $DIR
PATH=$PATH:$DIR/bin
if [ -f bin/activate ];then
source bin/activate
if [ -f ${DIR}/bin/activate ];then
source ${DIR}/bin/activate
if [ "$?" != "0" ];then
echo "load local python env fail!"
fi
fi
export LC_ALL="en_US.UTF-8"
mw_start_task()
{
isStart=$(ps aux |grep 'task.py'|grep -v grep|awk '{print $2}')
if [ "$isStart" == '' ];then
isStart=$(ps aux |grep 'panel_task.py'|grep -v grep|awk '{print $2}')
if [ "$isStart" = '' ];then
echo -e "starting mw-tasks... \c"
cd $DIR && python3 task.py >> ${DIR}/logs/task.log 2>&1 &
cd $DIR && python3 panel_task.py >> ${DIR}/logs/panel_task.log 2>&1 &
sleep 0.3
isStart=$(ps aux |grep 'task.py'|grep -v grep|awk '{print $2}')
if [ "$isStart" == '' ];then
isStart=$(ps aux |grep 'panel_task.py'|grep -v grep|awk '{print $2}')
if [ "$isStart" = '' ];then
echo -e "\033[31mfailed\033[0m"
echo '------------------------------------------------------'
tail -n 20 $DIR/logs/task.log
tail -n 20 $DIR/logs/panel_task.log
echo '------------------------------------------------------'
echo -e "\033[31mError: mw-tasks service startup failed.\033[0m"
return;
@@ -39,51 +39,69 @@ mw_start_task()
}
mw_start(){
gunicorn -c setting.py app:app
#安全启动
# 后台任务
mw_start_task
cd ${DIR}/web && gunicorn -c setting.py app:app
}
mw_start_debug(){
if [ ! -f $DIR/logs/task.log ];then
echo '' > $DIR/logs/task.log
if [ ! -f $DIR/logs/panel_task.log ];then
echo '' > $DIR/logs/panel_task.log
fi
python3 task.py >> $DIR/logs/task.log 2>&1 &
port=7200
python3 panel_task.py >> $DIR/logs/panel_task.log 2>&1 &
port=7200
if [ -f /www/server/mdserver-web/data/port.pl ];then
port=$(cat /www/server/mdserver-web/data/port.pl)
fi
# gunicorn -b :${port} -k gevent -w 1 app:app
gunicorn -b :${port} -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app
if [ -f ${DIR}/data/port.pl ];then
port=$(cat ${DIR}/data/port.pl)
fi
cd ${DIR}/web && gunicorn -b :${port} -k gthread -w 1 app:app
# cd ${DIR}/web && gunicorn -b :${port} -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app
}
mw_start_debug2(){
python3 task.py >> $DIR/logs/task.log 2>&1 &
gunicorn -b :7200 -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app
mw_start_panel(){
port=7200
if [ -f ${DIR}/data/port.pl ];then
port=$(cat ${DIR}/data/port.pl)
fi
cd ${DIR}/web && gunicorn -b :${port} -k gthread -w 1 app:app
# cd ${DIR}/web && gunicorn -b :${port} -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app
}
mw_start_debug3(){
gunicorn -c setting.py app:app
python3 task.py
mw_start_bgtask(){
cd ${DIR}/web && gunicorn -c setting.py app:app
cd ${DIR} && python3 panel_task.py
}
mw_stop()
{
PLIST=`ps -ef|grep app:app |grep -v grep|awk '{print $2}'`
for i in $PLIST
APP_LIST=`ps -ef|grep app:app |grep -v grep|awk '{print $2}'`
APP_LIST=($APP_LIST)
for p in ${APP_LIST[@]}
do
kill -9 $i > /dev/null 2>&1
kill -9 $p > /dev/null 2>&1
done
pids=`ps -ef|grep task.py | grep -v grep |awk '{print $2}'`
arr=($pids)
for p in ${arr[@]}
TASK_LIST=`ps -ef|grep panel_task.py | grep -v grep |awk '{print $2}'`
TASK_LIST=($TASK_LIST)
for p in ${TASK_LIST[@]}
do
kill -9 $p > /dev/null 2>&1
done
zzpids=`ps -A -o stat,ppid,pid | grep -e '^[Zz]' | awk '{print $2}'`
zzpids=($zzpids)
for p in ${zzpids[@]}
do
kill -9 ${p} > /dev/null 2>&1
done
}
case "$1" in
@@ -97,12 +115,12 @@ case "$1" in
mw_stop
mw_start_debug
;;
'debug2')
'panel')
mw_stop
mw_start_debug2
mw_start_panel
;;
'debug3')
mw_stop
mw_start_debug3
'task')
# mw_stop
mw_start_bgtask
;;
esac

5
cmd.md
View File

@@ -4,11 +4,16 @@
- 面板相关命令
```
mw start | 启动面板服务器
mw stop | 停止面板服务器
mw restart | 重启面板服务器
mw default | 显示登录信息
mw db | 快捷连接MySQL
mw redis | 快捷连接Redis
mw valkey | 快捷连接valkey
mw mongodb | 快捷连接MongoDB
mw pgdb | 快捷连接PostgreSQL
mw ssh | 快捷连接ssh
----------------------------------------
mw open | 开启面板
mw close | 关闭面板

View File

@@ -29,24 +29,24 @@ cd /www/server/mdserver-web/plugins/php/versions && bash all_test.sh
| 系统名称 |PHP53 |PHP54 |PHP55 |PHP56 |PHP70 |PHP71 |PHP72 |PHP73 |PHP74 |PHP80 |PHP81 |PHP82 |PHP83 |
| ----------------- |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
| CentOS 7.9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 8.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 8 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 9 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 10.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 11.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 12 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 18.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 20.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 22.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Fedora 31 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Fedora 32 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| AlmaLinux 9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| RockyLinux 8.6 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Arch Linux |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| openSUSE 15.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| 系统名称 |PHP53 |PHP54 |PHP55 |PHP56 |PHP70 |PHP71 |PHP72 |PHP73 |PHP74 |PHP80 |PHP81 |PHP82 |PHP83 |PHP84 |
| ----------------- |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
| CentOS 7.9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 8.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 8 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 9 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 10.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 11.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 12 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 18.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 20.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 22.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Fedora 31 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Fedora 32 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| AlmaLinux 9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| RockyLinux 8.6 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Arch Linux |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| openSUSE 15.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |

4
data/README.md Normal file
View File

@@ -0,0 +1,4 @@
# 自动生成
certificate.pem - 证书信息
privateKey.pem - 私钥

View File

@@ -1 +0,0 @@
30

View File

@@ -1,42 +0,0 @@
[
{
"title":"全部",
"type":0,
"ps":""
},
{
"title":"已安装",
"type":-1,
"ps":""
},
{
"title":"运行环境",
"type":1,
"ps":""
},
{
"title":"数据软件",
"type":2,
"ps":""
},
{
"title":"代码管理",
"type":3,
"ps":""
},
{
"title":"系统工具",
"type":4,
"ps":""
},
{
"title":"其他插件",
"type":5,
"ps":""
},
{
"title":"辅助插件",
"type":6,
"ps":""
}
]

View File

@@ -1 +0,0 @@
True

View File

@@ -1,140 +0,0 @@
CREATE TABLE IF NOT EXISTS `backup` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`type` INTEGER,
`name` TEXT,
`pid` INTEGER,
`filename` TEXT,
`size` INTEGER,
`addtime` TEXT
);
CREATE TABLE IF NOT EXISTS `binding` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pid` INTEGER,
`domain` TEXT,
`path` TEXT,
`port` INTEGER,
`addtime` TEXT
);
CREATE TABLE IF NOT EXISTS `crontab` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`type` TEXT,
`where1` TEXT,
`where_hour` INTEGER,
`where_minute` INTEGER,
`echo` TEXT,
`addtime` TEXT,
`status` INTEGER DEFAULT '1',
`save` INTEGER DEFAULT '3',
`backup_to` TEXT DEFAULT 'off',
`sname` TEXT,
`sbody` TEXT,
'stype' TEXT,
`urladdress` TEXT
);
CREATE TABLE IF NOT EXISTS `firewall` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`port` TEXT,
`protocol` TEXT DEFAULT 'tcp',
`ps` TEXT,
`addtime` TEXT
);
ALTER TABLE `firewall` ADD COLUMN `protocol` TEXT DEFAULT 'tcp';
INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `addtime`) VALUES
(1, '80', 'tcp','网站默认端口', '0000-00-00 00:00:00'),
(2, '443', 'tcp/udp', 'HTTPS', '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS `logs` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`type` TEXT,
`log` TEXT,
`uid` INTEGER DEFAULT '1',
`addtime` TEXT
);
ALTER TABLE `logs` ADD COLUMN `uid` INTEGER DEFAULT '1';
CREATE TABLE IF NOT EXISTS `sites` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`path` TEXT,
`status` TEXT,
`index` TEXT,
`type_id` INTEGER,
`ps` TEXT,
`edate` TEXT,
`ssl_effective_date` TEXT,
`ssl_expiration_date` TEXT,
`addtime` TEXT
);
ALTER TABLE `sites` ADD COLUMN `ssl_effective_date` TEXT DEFAULT '';
ALTER TABLE `sites` ADD COLUMN `ssl_expiration_date` TEXT DEFAULT '';
CREATE TABLE IF NOT EXISTS `site_types` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT
);
CREATE TABLE IF NOT EXISTS `domain` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pid` INTEGER,
`name` TEXT,
`port` INTEGER,
`addtime` TEXT
);
CREATE TABLE IF NOT EXISTS `users` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`username` TEXT,
`password` TEXT,
`login_ip` TEXT,
`login_time` TEXT,
`phone` TEXT,
`email` TEXT
);
INSERT INTO `users` (`id`, `username`, `password`, `login_ip`, `login_time`, `phone`, `email`) VALUES
(1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '192.168.0.10', '2022-02-02 00:00:00', 0, 'midoks@163.com');
CREATE TABLE IF NOT EXISTS `tasks` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`type` TEXT,
`status` TEXT,
`addtime` TEXT,
`start` INTEGER,
`end` INTEGER,
`execstr` TEXT
);
CREATE TABLE IF NOT EXISTS `temp_login` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`token` REAL,
`salt` REAL,
`state` INTEGER,
`login_time` INTEGER,
`login_addr` REAL,
`logout_time` INTEGER,
`expire` INTEGER,
`addtime` INTEGER
);
CREATE TABLE IF NOT EXISTS `panel` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`title` TEXT,
`url` TEXT,
`username` TEXT,
`password` TEXT,
`click` INTEGER,
`addtime` INTEGER
);

View File

@@ -1,37 +0,0 @@
CREATE TABLE IF NOT EXISTS `network` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`up` INTEGER,
`down` INTEGER,
`total_up` INTEGER,
`total_down` INTEGER,
`down_packets` INTEGER,
`up_packets` INTEGER,
`addtime` INTEGER
);
CREATE TABLE IF NOT EXISTS `cpuio` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pro` INTEGER,
`mem` INTEGER,
`addtime` INTEGER
);
CREATE TABLE IF NOT EXISTS `diskio` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`read_count` INTEGER,
`write_count` INTEGER,
`read_bytes` INTEGER,
`write_bytes` INTEGER,
`read_time` INTEGER,
`write_time` INTEGER,
`addtime` INTEGER
);
CREATE TABLE IF NOT EXISTS `load_average` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pro` REAL,
`one` REAL,
`five` REAL,
`fifteen` REAL,
`addtime` INTEGER
);

View File

@@ -1,52 +0,0 @@
server
{
# reuseport 只能在一个server出现一次
listen {$PORT};
listen [::]:{$PORT};
server_name {$SERVER_NAME};
index index.php index.html index.htm default.php default.htm default.html;
root {$ROOT_DIR};
#SSL-START
#error_page 404/404.html;
#SSL-END
#301-START
#PROXY-START
#ERROR-PAGE-START
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START
include {$PHP_DIR}/conf/enable-php-{$PHPVER}.conf;
#PHP-INFO-END
#REWRITE-START
include {$OR_REWRITE}/{$SERVER_NAME}.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf|js|css|ttf|woff2)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
access_log {$LOGPATH}/{$SERVER_NAME}.log main;
error_log {$LOGPATH}/{$SERVER_NAME}.error.log;
}

View File

@@ -1 +0,0 @@
存放VIP关键数据

View File

@@ -40,7 +40,7 @@ RUN apt update -y && \
RUN cd /www/server/mdserver-web/plugins/php && \
bash install.sh install 74 && \
cd /www/server/mdserver-web/plugins/openresty && \
bash install.sh install 1.21.4.1 && \
bash install.sh install 1.21.4 && \
cd /www/server/mdserver-web/plugins/mysql && \
bash install.sh install 5.6 && \
cd /www/server/mdserver-web/plugins/phpmyadmin && \

1
logs/README.md Normal file
View File

@@ -0,0 +1 @@
logs

View File

@@ -1,113 +0,0 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
DIR=$(cd "$(dirname "$0")"; pwd)
MDIR=$(dirname "$DIR")
# echo $DIR
PATH=$PATH:$DIR/bin
if [ -f ${DIR}/bin/activate ];then
source ${DIR}/bin/activate
if [ "$?" != "0" ];then
echo "load local python env fail!"
fi
fi
export LC_ALL="en_US.UTF-8"
mw_start_task()
{
isStart=$(ps aux |grep 'panel_task.py'|grep -v grep|awk '{print $2}')
if [ "$isStart" == '' ];then
echo -e "starting mw-tasks... \c"
cd $DIR && python3 panel_task.py >> ${DIR}/logs/panel_task.log 2>&1 &
sleep 0.3
isStart=$(ps aux |grep 'panel_task.py'|grep -v grep|awk '{print $2}')
if [ "$isStart" == '' ];then
echo -e "\033[31mfailed\033[0m"
echo '------------------------------------------------------'
tail -n 20 $DIR/logs/panel_task.log
echo '------------------------------------------------------'
echo -e "\033[31mError: mw-tasks service startup failed.\033[0m"
return;
fi
echo -e "\033[32mdone\033[0m"
else
echo "starting mw-tasks... mw-tasks (pid $(echo $isStart)) already running"
fi
}
mw_start(){
cd web && gunicorn -c setting.py app:app
#安全启动
mw_start_task
}
mw_start_debug(){
if [ ! -f $DIR/logs/panel_task.log ];then
echo '' > $DIR/logs/panel_task.log
fi
python3 panel_task.py >> $DIR/logs/panel_task.log 2>&1 &
port=7200
if [ -f /www/server/mdserver-web/data/port.pl ];then
port=$(cat /www/server/mdserver-web/data/port.pl)
fi
if [ -f ${DIR}/data/port.pl ];then
port=$(cat ${DIR}/data/port.pl)
fi
# gunicorn -b :${port} -k gevent -w 1 app:app
cd web && gunicorn -b :${port} -w 1 app:app
}
mw_start_debug2(){
python3 panel_task.py >> $DIR/logs/panel_task.log 2>&1 &
gunicorn -b :7200 -w 1 app:app
}
mw_start_debug3(){
gunicorn -c setting.py app:app
python3 panel_task.py
}
mw_stop()
{
PLIST=`ps -ef|grep app:app |grep -v grep|awk '{print $2}'`
for i in $PLIST
do
kill -9 $i > /dev/null 2>&1
done
pids=`ps -ef|grep panel_task.py | grep -v grep |awk '{print $2}'`
arr=($pids)
for p in ${arr[@]}
do
kill -9 $p > /dev/null 2>&1
done
}
case "$1" in
'start') mw_start;;
'stop') mw_stop;;
'restart')
mw_stop
mw_start
;;
'debug')
mw_stop
mw_start_debug
;;
'debug2')
mw_stop
mw_start_debug2
;;
'debug3')
mw_stop
mw_start_debug3
;;
esac

View File

@@ -24,110 +24,28 @@ web_dir = os.getcwd() + "/web"
os.chdir(web_dir)
sys.path.append(web_dir)
from admin import app
from admin import model
import core.mw as mw
import core.db as db
import thisdb
from admin import setup
setup.init()
# print(mw.getPanelDir())
# print sys.path
# cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\''
# info = mw.execShell(cmd)
# p = "/usr/local/lib/" + info[0].strip() + "/site-packages"
# sys.path.append(p)
global pre, timeoutCount, logPath, isTask, oldEdate, isCheck
pre = 0
timeoutCount = 0
isCheck = 0
oldEdate = None
g_log_file = mw.getPanelTaskLog()
isTask = mw.getMWLogs() + '/panelTask.pl'
g_log_file = mw.getPanelTaskExecLog()
if not os.path.exists(g_log_file):
os.system("touch " + g_log_file)
def execShell(cmdstring, cwd=None, timeout=None, shell=True):
cmd = cmdstring + ' > ' + g_log_file + ' 2>&1'
return mw.execShell(cmd)
def writeLogs(data):
# 写输出日志
try:
global g_log_file
import shlex
import datetime
import subprocess
if timeout:
end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
cmd = cmdstring + ' > ' + g_log_file + ' 2>&1'
sub = subprocess.Popen(cmd, cwd=cwd, stdin=subprocess.PIPE, shell=shell, bufsize=4096)
while sub.poll() is None:
time.sleep(0.1)
data = sub.communicate()
# python3 fix 返回byte数据
if isinstance(data[0], bytes):
t1 = str(data[0], encoding='utf-8')
if isinstance(data[1], bytes):
t2 = str(data[1], encoding='utf-8')
return (t1, t2)
except Exception as e:
return (None, None)
def service_cmd(method):
cmd = '/etc/init.d/mw'
if os.path.exists(cmd):
execShell(cmd + ' ' + method)
return
cmd = mw.getRunDir() + '/scripts/init.d/mw'
if os.path.exists(cmd):
execShell(cmd + ' ' + method)
return
def openresty_cmd(method = 'reload'):
# 检查是否安装
odir = mw.getServerDir() + '/openresty'
if not os.path.exists(odir):
return False
# systemd
systemd = mw.systemdCfgDir()+'/openresty.service'
if os.path.exists(systemd):
execShell('systemctl ' + method + ' openresty')
return True
sys_initd = '/etc/init.d/openresty'
if os.path.exists(sys_initd):
os.system(sys_initd + ' ' + method)
return True
install_initd = mw.getServerDir()+'/openresty/init.d/openresty'
if os.path.exists(install_initd):
os.system(install_initd + ' ' + method)
return True
return False
def mw_async(f):
def wrapper(*args, **kwargs):
thr = threading.Thread(target=f, args=args, kwargs=kwargs)
thr.start()
return wrapper
@mw_async
def restartMw():
time.sleep(1)
cmd = mw.getRunDir() + '/scripts/init.d/mw reload &'
mw.execShell(cmd)
fp = open(g_log_file, 'w+')
fp.write(data)
fp.close()
except:
pass
def downloadFile(url, filename):
# 下载文件
@@ -146,257 +64,116 @@ def downloadFile(url, filename):
if not mw.isAppleSystem():
os.system('chown www.www ' + filename)
writeLogs('done')
writeLogs(filename + ' download success!')
except Exception as e:
writeLogs(str(e))
return True
def downloadHook(count, blockSize, totalSize):
# 下载文件进度回调
global pre
used = count * blockSize
pre1 = int((100.0 * used / totalSize))
if pre == (100 - pre1):
return
speed = {'total': totalSize, 'used': used, 'pre': pre1}
pre = int((100.0 * used / totalSize))
speed = {'total': totalSize, 'used': used, 'pre': pre}
writeLogs(json.dumps(speed))
def writeLogs(data):
# 写输出日志
try:
fp = open(g_log_file, 'w+')
fp.write(data)
fp.close()
except:
pass
def runPanelTask():
try:
bash_list = model.getTaskList(status=-1)
for task in bash_list:
model.setTaskStatus(task['id'], 0)
run_list = model.getTaskList(status=0)
for run_task in run_list:
start = int(time.time())
model.setTaskData(run_task['id'], start=start)
model.setTaskStatus(run_task['id'], -1)
if run_task['type'] == 'download':
argv = run_task['cmd'].split('|mw|')
downloadFile(argv[0], argv[1])
elif run_task['type'] == 'execshell':
execShell(run_task['cmd'])
end = int(time.time())
model.setTaskData(run_task['id'], end=end)
model.setTaskStatus(run_task['id'], 1)
except Exception as e:
print(str(e))
# 站点过期检查
# siteEdate()
siteEdateCheck()
# echo "True" > /www/server/mdserver-web/logs/panel_task.lock
lock_file = mw.getTriggerTaskLockFile()
try:
if os.path.exists(lock_file):
bash_list = thisdb.getTaskList(status=-1)
for task in bash_list:
thisdb.setTaskStatus(task['id'], 0)
run_list = thisdb.getTaskList(status=0)
for run_task in run_list:
start = int(time.time())
thisdb.setTaskData(run_task['id'], start=start)
thisdb.setTaskStatus(run_task['id'], -1)
if run_task['type'] == 'download':
argv = run_task['cmd'].split('|mw|')
downloadFile(argv[0], argv[1])
elif run_task['type'] == 'execshell':
execShell(run_task['cmd'])
end = int(time.time())
thisdb.setTaskData(run_task['id'], end=end)
thisdb.setTaskStatus(run_task['id'], 1)
if thisdb.getTaskUnexecutedCount() < 1:
os.remove(lock_file)
except Exception as e:
print('runPanelTask:',mw.getTracebackInfo())
# 网站到期处理
def siteEdateCheck():
try:
from utils.site import sites as MwSites
website_edate = thisdb.getOption('website_edate', default='0000-00-00')
now_time_ymd = time.strftime('%Y-%m-%d', time.localtime())
if website_edate == now_time_ymd:
return False
site_list = thisdb.getSitesEdateList(now_time_ymd)
for site in site_list:
MwSites.instance().stop(site['id'])
thisdb.setOption('website_edate', now_time_ymd)
except Exception as e:
print('siteEdateCheck:',mw.getTracebackInfo())
# 任务队列
def startPanelTask():
try:
while True:
runPanelTask()
time.sleep(1)
time.sleep(5)
except Exception as e:
print(str(e))
time.sleep(10)
print('startPanelTask:',mw.getTracebackInfo())
time.sleep(30)
startPanelTask()
# 网站到期处理
def siteEdate():
global oldEdate
try:
if not oldEdate:
oldEdate = mw.readFile('data/edate.pl')
if not oldEdate:
oldEdate = '0000-00-00'
mEdate = time.strftime('%Y-%m-%d', time.localtime())
if oldEdate == mEdate:
return False
edateSites = mw.M('sites').where('edate>? AND edate<? AND (status=? OR status=?)',
('0000-00-00', mEdate, 1, '正在运行')).field('id,name').select()
import site_api
for site in edateSites:
site_api.site_api().stop(site['id'], site['name'])
oldEdate = mEdate
mw.writeFile('data/edate.pl', mEdate)
except Exception as e:
print(str(e))
def systemTask():
# 系统监控任务
from utils.system import monitor
try:
import system_api
import psutil
sm = system_api.system_api()
filename = 'data/control.conf'
sql = db.Sql().dbfile('system')
csql = mw.readFile('data/sql/system.sql')
csql_list = csql.split(';')
for index in range(len(csql_list)):
sql.execute(csql_list[index], ())
cpuIo = cpu = {}
cpuCount = psutil.cpu_count()
used = count = 0
reloadNum = 0
network_up = network_down = diskio_1 = diskio_2 = networkInfo = cpuInfo = diskInfo = None
while True:
if not os.path.exists(filename):
time.sleep(10)
continue
day = 30
try:
day = int(mw.readFile(filename))
if day < 1:
time.sleep(10)
continue
except:
day = 30
tmp = {}
# 取当前CPU Io
tmp['used'] = psutil.cpu_percent(interval=1)
if tmp['used'] > 80:
panel_title = mw.getConfig('title')
ip = mw.getHostAddr()
now_time = mw.getDateFromNow()
msg = now_time + '|节点[' + panel_title + ':' + ip + \
']处于高负载[' + str(tmp['used']) + '],请排查原因!'
mw.notifyMessage(msg, '面板监控', 600)
if not cpuInfo:
tmp['mem'] = sm.getMemUsed()
cpuInfo = tmp
if cpuInfo['used'] < tmp['used']:
tmp['mem'] = sm.getMemUsed()
cpuInfo = tmp
# 取当前网络Io
networkIo = sm.psutilNetIoCounters()
if not network_up:
network_up = networkIo[0]
network_down = networkIo[1]
tmp = {}
tmp['upTotal'] = networkIo[0]
tmp['downTotal'] = networkIo[1]
tmp['up'] = round(float((networkIo[0] - network_up) / 1024), 2)
tmp['down'] = round(float((networkIo[1] - network_down) / 1024), 2)
tmp['downPackets'] = networkIo[3]
tmp['upPackets'] = networkIo[2]
network_up = networkIo[0]
network_down = networkIo[1]
if not networkInfo:
networkInfo = tmp
if (tmp['up'] + tmp['down']) > (networkInfo['up'] + networkInfo['down']):
networkInfo = tmp
# 取磁盘Io
# if os.path.exists('/proc/diskstats'):
diskio_2 = psutil.disk_io_counters()
if not diskio_1:
diskio_1 = diskio_2
tmp = {}
tmp['read_count'] = diskio_2.read_count - diskio_1.read_count
tmp['write_count'] = diskio_2.write_count - diskio_1.write_count
tmp['read_bytes'] = diskio_2.read_bytes - diskio_1.read_bytes
tmp['write_bytes'] = diskio_2.write_bytes - diskio_1.write_bytes
tmp['read_time'] = diskio_2.read_time - diskio_1.read_time
tmp['write_time'] = diskio_2.write_time - diskio_1.write_time
if not diskInfo:
diskInfo = tmp
else:
diskInfo['read_count'] += tmp['read_count']
diskInfo['write_count'] += tmp['write_count']
diskInfo['read_bytes'] += tmp['read_bytes']
diskInfo['write_bytes'] += tmp['write_bytes']
diskInfo['read_time'] += tmp['read_time']
diskInfo['write_time'] += tmp['write_time']
diskio_1 = diskio_2
# print diskInfo
if count >= 12:
try:
addtime = int(time.time())
deltime = addtime - (day * 86400)
data = (cpuInfo['used'], cpuInfo['mem'], addtime)
sql.table('cpuio').add('pro,mem,addtime', data)
sql.table('cpuio').where("addtime<?", (deltime,)).delete()
data = (networkInfo['up'] / 5, networkInfo['down'] / 5, networkInfo['upTotal'], networkInfo[
'downTotal'], networkInfo['downPackets'], networkInfo['upPackets'], addtime)
sql.table('network').add(
'up,down,total_up,total_down,down_packets,up_packets,addtime', data)
sql.table('network').where(
"addtime<?", (deltime,)).delete()
# if os.path.exists('/proc/diskstats'):
data = (diskInfo['read_count'], diskInfo['write_count'], diskInfo['read_bytes'], diskInfo[
'write_bytes'], diskInfo['read_time'], diskInfo['write_time'], addtime)
sql.table('diskio').add(
'read_count,write_count,read_bytes,write_bytes,read_time,write_time,addtime', data)
sql.table('diskio').where(
"addtime<?", (deltime,)).delete()
# LoadAverage
load_average = sm.getLoadAverage()
lpro = round(
(load_average['one'] / load_average['max']) * 100, 2)
if lpro > 100:
lpro = 100
sql.table('load_average').add('pro,one,five,fifteen,addtime', (lpro, load_average[
'one'], load_average['five'], load_average['fifteen'], addtime))
lpro = None
load_average = None
cpuInfo = None
networkInfo = None
diskInfo = None
count = 0
reloadNum += 1
if reloadNum > 1440:
reloadNum = 0
mw.writeFile('logs/sys_interrupt.pl',
"reload num:" + str(reloadNum))
restartMw()
except Exception as ex:
print(str(ex))
mw.writeFile('logs/sys_interrupt.pl', str(ex))
del(tmp)
monitor_status = thisdb.getOption('monitor_status',type='monitor',default='open')
if monitor_status == 'open':
monitor.instance().run()
time.sleep(5)
count += 1
except Exception as ex:
print(str(ex))
mw.writeFile('logs/sys_interrupt.pl', str(ex))
restartMw()
print('systemTask:',mw.getTracebackInfo())
time.sleep(30)
systemTask()
def panelPluginStatusCheck():
# 系统监控任务
from utils.plugin import plugin
try:
while True:
# start_t = time.time()
plugin.instance().autoCachePluginStatus()
# end_t = time.time()
time.sleep(60)
except Exception as ex:
print('panelPluginStatusCheck:',mw.getTracebackInfo())
time.sleep(120)
panelPluginStatusCheck()
# -------------------------------------- PHP监控 start --------------------------------------------- #
# 502错误检查线程
def check502Task():
try:
check_file = mw.getPanelDir() + '/data/502Task.pl'
while True:
if os.path.exists(mw.getPanelDir() + '/data/502Task.pl'):
if os.path.exists(check_file):
check502()
time.sleep(30)
time.sleep(10)
except:
time.sleep(30)
check502Task()
@@ -407,11 +184,11 @@ def check502():
verlist = [
'52', '53', '54', '55', '56', '70',
'71', '72', '73', '74', '80', '81',
'82', '83', '84'
'82', '83', '84', '85'
]
for ver in verlist:
sdir = mw.getServerDir()
php_path = sdir + '/php/' + ver + '/sbin/php-fpm'
server_dir = mw.getServerDir()
php_path = server_dir + '/php/' + ver + '/sbin/php-fpm'
if not os.path.exists(php_path):
continue
if checkPHPVersion(ver):
@@ -419,13 +196,14 @@ def check502():
if startPHPVersion(ver):
print('检测到PHP-' + ver + '处理异常,已自动修复!')
mw.writeLog('PHP守护程序', '检测到PHP-' + ver + '处理异常,已自动修复!')
except Exception as e:
print(str(e))
mw.writeLog('PHP守护程序', '自动修复异常:'+str(e))
# 处理指定PHP版本
def startPHPVersion(version):
sdir = mw.getServerDir()
server_dir = mw.getServerDir()
try:
# system
phpService = mw.systemdCfgDir() + '/php' + version + '.service'
@@ -435,8 +213,8 @@ def startPHPVersion(version):
return True
# initd
fpm = sdir + '/php/init.d/php' + version
php_path = sdir + '/php/' + version + '/sbin/php-fpm'
fpm = server_dir + '/php/init.d/php' + version
php_path = server_dir + '/php/' + version + '/sbin/php-fpm'
if not os.path.exists(php_path):
if os.path.exists(fpm):
os.remove(fpm)
@@ -449,10 +227,9 @@ def startPHPVersion(version):
os.system(fpm + ' reload')
if checkPHPVersion(version):
return True
# 尝试重启服务
cgi = '/tmp/php-cgi-' + version + '.sock'
pid = sdir + '/php/' + version + '/var/run/php-fpm.pid'
pid = server_dir + '/php/' + version + '/var/run/php-fpm.pid'
data = mw.execShell("ps -ef | grep php/" + version +" | grep -v grep|grep -v python |awk '{print $2}'")
if data[0] != '':
os.system("ps -ef | grep php/" + version + " | grep -v grep|grep -v python |awk '{print $2}' | xargs kill ")
@@ -469,47 +246,19 @@ def startPHPVersion(version):
if os.path.exists(cgi):
return True
except Exception as e:
print(str(e))
print('startPHPVersion:',mw.getTracebackInfo())
mw.writeLog('PHP守护程序', '自动修复异常:'+str(e))
return True
def getFpmConfFile(version):
return mw.getServerDir() + '/php/' + version + '/etc/php-fpm.d/www.conf'
def getFpmAddress(version):
fpm_address = '/tmp/php-cgi-{}.sock'.format(version)
php_fpm_file = getFpmConfFile(version)
try:
content = readFile(php_fpm_file)
tmp = re.findall(r"listen\s*=\s*(.+)", content)
if not tmp:
return fpm_address
if tmp[0].find('sock') != -1:
return fpm_address
if tmp[0].find(':') != -1:
listen_tmp = tmp[0].split(':')
if bind:
fpm_address = (listen_tmp[0], int(listen_tmp[1]))
else:
fpm_address = ('127.0.0.1', int(listen_tmp[1]))
else:
fpm_address = ('127.0.0.1', int(tmp[0]))
return fpm_address
except:
return fpm_address
def checkPHPVersion(version):
# 检查指定PHP版本
try:
sock = getFpmAddress(version)
sock = mw.getFpmAddress(version)
data = mw.requestFcgiPHP(sock, '/phpfpm_status_' + version + '?json')
result = str(data, encoding='utf-8')
except Exception as e:
result = 'Bad Gateway'
# print(version,result)
# 检查openresty
if result.find('Bad Gateway') != -1:
return False
@@ -519,24 +268,9 @@ def checkPHPVersion(version):
# 检查Web服务是否启动
if result.find('Connection refused') != -1:
return False
# global isTask
# if os.path.exists(isTask):
# isStatus = mw.readFile(isTask)
# if isStatus == 'True':
# return True
# # systemd
# systemd = mw.systemdCfgDir() + '/openresty.service'
# if os.path.exists(systemd):
# execShell('systemctl reload openresty')
# return True
# # initd
# initd = '/etc/init.d/openresty'
# if os.path.exists(initd):
# os.system(initd + ' reload')
return True
# --------------------------------------PHP监控 end--------------------------------------------- #
# -------------------------------------- PHP监控 end --------------------------------------------- #
# --------------------------------------OpenResty Auto Restart Start --------------------------------------------- #
@@ -549,11 +283,10 @@ def openrestyAutoRestart():
if not os.path.exists(odir):
time.sleep(86400)
continue
openresty_cmd('reload')
mw.opWeb('reload')
time.sleep(86400)
except Exception as e:
print(str(e))
mw.writeLog('OpenResty检测', '自动修复异常:'+str(e))
time.sleep(86400)
# --------------------------------------OpenResty Auto Restart End --------------------------------------------- #
@@ -562,22 +295,23 @@ def openrestyAutoRestart():
def openrestyRestartAtOnce():
restart_nginx_tip = 'data/restart_nginx.pl'
restart_nginx_tip = mw.getPanelDir()+'/data/restart_nginx.pl'
while True:
if os.path.exists(restart_nginx_tip):
os.remove(restart_nginx_tip)
openresty_cmd('reload')
mw.opWeb('reload')
time.sleep(1)
# ----------------------------------- OpenResty Restart At Once End ------------------------------------------ #
# --------------------------------------Panel Restart Start --------------------------------------------- #
def restartPanelService():
restartTip = 'data/restart.pl'
restart_tip = mw.getPanelDir()+'/data/restart.pl'
while True:
if os.path.exists(restartTip):
os.remove(restartTip)
service_cmd('restart_panel')
if os.path.exists(restart_tip):
print("restart panel")
os.remove(restart_tip)
mw.panelCmd('restart_panel')
time.sleep(1)
# --------------------------------------Panel Restart End --------------------------------------------- #
@@ -590,37 +324,39 @@ def setDaemon(t):
return t
def run():
# # 系统监控
# sysTask = threading.Thread(target=systemTask)
# sysTask = setDaemon(sysTask)
# sysTask.start()
# 系统监控
sysTask = threading.Thread(target=systemTask)
sysTask = setDaemon(sysTask)
sysTask.start()
# # PHP 502错误检查线程
# php502 = threading.Thread(target=check502Task)
# php502 = setDaemon(php502)
# php502.start()
# PHP 502错误检查线程
php502 = threading.Thread(target=check502Task)
php502 = setDaemon(php502)
php502.start()
# # OpenResty Restart At Once Start
# oraos = threading.Thread(target=openrestyRestartAtOnce)
# oraos = setDaemon(oraos)
# oraos.start()
# OpenResty Restart At Once Start
oraos = threading.Thread(target=openrestyRestartAtOnce)
oraos = setDaemon(oraos)
oraos.start()
# OpenResty Auto Restart Start
oar = threading.Thread(target=openrestyAutoRestart)
oar = setDaemon(oar)
oar.start()
# # OpenResty Auto Restart Start
# oar = threading.Thread(target=openrestyAutoRestart)
# oar = setDaemon(oar)
# oar.start()
# Panel Plugin Status Check
pps = threading.Thread(target=panelPluginStatusCheck)
pps = setDaemon(pps)
pps.start()
# # Panel Restart Start
# rps = threading.Thread(target=restartPanelService)
# rps = setDaemon(rps)
# rps.start()
# Panel Restart Start
rps = threading.Thread(target=restartPanelService)
rps = setDaemon(rps)
rps.start()
# 面板后台任务
startPanelTask()
if __name__ == "__main__":
with app.app_context():
run()
run()

View File

@@ -23,13 +23,9 @@ web_dir = os.getcwd() + "/web"
os.chdir(web_dir)
sys.path.append(web_dir)
from utils.firewall import Firewall as MwFirewall
import core.mw as mw
import core.db as db
# cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\''
# info = mw.execShell(cmd)
# p = "/usr/local/lib/" + info[0].strip() + "/site-packages"
# sys.path.append(p)
import thisdb
INIT_DIR = "/etc/rc.d/init.d"
if mw.isAppleSystem():
@@ -45,33 +41,58 @@ def mw_input_cmd(msg):
in_val = input(msg)
return in_val
def getRemainLen(cmd, max_length=100):
cmd_len = len(cmd)
cmd_u8_len = len(cmd.encode('utf-8'))
return max_length-int((cmd_u8_len - cmd_len)/2+cmd_len)
def mwcli(mw_input=0):
raw_tip = "======================================================"
panel_dir = mw.getPanelDir()
raw_tip = "========================================================================"
if not mw_input:
print("===============mdserver-web cli tools=================")
print("(1) 重启面板服务")
print("(2) 停止面板服务")
print("(3) 启动面板服务")
print("(4) 重载面板服务")
print("(5) 修改面板端口")
print("(10) 查看面板默认信息")
print("(11) 修改面板密码")
print("(12) 修改面板用户名")
print("(13) 显示面板错误日志")
print("(20) 关闭BasicAuth认证")
print("(21) 解除域名绑定")
print("(22) 解除面板SSL绑定")
print("(23) 开启IPV6支持")
print("(24) 关闭IPV6支持")
print("(25) 开启防火墙SSH端口")
print("(26) 关闭二次验证")
print("(27) 查看防火墙信息")
print("(100) 开启PHP52显示")
print("(101) 关闭PHP52显示")
print("(200) 切换Linux系统软件源")
print("(201) 简单速度测试")
print("(0) 取消")
print("========================mdserver-web cli tools==========================")
cmd_list = [
'(1) 重启面板服务',
'(2) 停止面板服务',
'(3) 启动面板服务',
'(4) 重载面板服务',
'(5) 修改面板IP',
'(6) 修改面板端口',
'(7) 关闭安全入口',
'(10) 查看面板默认信息',
'(11) 修改面板密码',
'(12) 修改面板用户名',
'(13) 显示面板错误日志',
'(14) 关闭面板访问',
'(15) 开启面板访问',
'(20) 关闭BasicAuth认证',
'(21) 解除域名绑定',
'(22) 解除面板SSL绑定',
'(23) 开启IPV6支持',
'(24) 关闭IPV6支持',
'(25) 开启防火墙SSH端口',
'(26) 关闭二次验证',
'(27) 查看防火墙信息',
'(28) 自动识别防火墙端口到面板',
'(29) 自动识别配置站点信息',
'(100) 开启PHP52显示',
'(101) 关闭PHP52显示',
'(200) 切换Linux系统软件源',
'(201) 简单速度测试',
'(202) SSH终端管理',
'(0) 取消'
]
cmd_list_num = len(cmd_list)
for index in range(cmd_list_num):
cmd = cmd_list[index]
if index % 2 == 0:
if index == (cmd_list_num-1):
print(cmd)
else:
print(cmd + " " * getRemainLen(cmd, 40), end="")
if index % 2 == 1:
print(cmd)
print(raw_tip)
try:
mw_input = input("请输入命令编号:")
@@ -81,10 +102,11 @@ def mwcli(mw_input=0):
mw_input = 0
nums = [
1, 2, 3, 4, 5, 10, 11, 12, 13,
20, 21, 22, 23, 24, 25, 26, 27,
1, 2, 3, 4, 5, 6, 7,
10, 11, 12, 13, 14, 15,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
100, 101,
200, 201
200, 201, 202
]
if not mw_input in nums:
print(raw_tip)
@@ -100,176 +122,255 @@ def mwcli(mw_input=0):
elif mw_input == 4:
os.system(INIT_CMD + " reload")
elif mw_input == 5:
in_ip = mw_input_cmd("请输入设置的面板IP:")
in_ip = in_ip.strip()
ip_text = panel_dir + '/data/iplist.txt'
if not mw.isVaildIp(in_ip):
mw.echoInfo("【"+in_ip+"】: IP不合法")
return
mw.writeFile(ip_text, in_ip)
thisdb.setOption('server_ip', in_ip)
mw.echoInfo("设置面板IP: " + in_ip)
elif mw_input == 6:
in_port = mw_input_cmd("请输入新的面板端口:")
in_port_int = int(in_port.strip())
if in_port_int < 65536 and in_port_int > 0:
import firewall_api
firewall_api.firewall_api().addAcceptPortArgs(
in_port, 'WEB面板[TOOLS修改]', 'port')
mw.writeFile('data/port.pl', in_port)
MwFirewall.instance().addAcceptPort(in_port, 'WEB面板[TOOLS修改]', 'port')
panel_port = panel_dir + '/data/port.pl'
mw.writeFile(panel_port, in_port)
os.system(INIT_CMD + " restart_panel")
os.system(INIT_CMD + " default")
else:
print("|-端口范围在0-65536之间")
mw.echoInfo("端口范围在0-65536之间")
return
elif mw_input == 7:
thisdb.setOption('admin_path', '')
mw.echoInfo("关闭安全入口成功!")
elif mw_input == 10:
os.system(INIT_CMD + " default")
elif mw_input == 11:
input_pwd = mw_input_cmd("请输入新的面板密码:")
if len(input_pwd.strip()) < 5:
print("|-错误,密码长度不能小于5位")
mw.echoInfo("错误,密码长度不能小于5位")
return
set_panel_pwd(input_pwd.strip(), True)
elif mw_input == 12:
input_user = mw_input_cmd("请输入新的面板用户名(>=5位):")
set_panel_username(input_user.strip())
elif mw_input == 13:
os.system('tail -100 ' + mw.getPanelDir() + '/logs/error.log')
elif mw_input == 20:
basic_auth = 'data/basic_auth.json'
if os.path.exists(basic_auth):
os.remove(basic_auth)
os.system(INIT_CMD + " restart")
print("|-关闭basic_auth成功")
elif mw_input == 21:
bind_domain = 'data/bind_domain.pl'
if os.path.exists(bind_domain):
os.remove(bind_domain)
os.system(INIT_CMD + " unbind_domain")
print("|-解除域名绑定成功")
elif mw_input == 22:
ssl_choose = 'ssl/choose.pl'
if os.path.exists(ssl_choose):
os.remove(ssl_choose)
os.system(INIT_CMD + " unbind_ssl")
print("|-解除面板SSL绑定成功")
elif mw_input == 23:
listen_ipv6 = 'data/ipv6.pl'
if not os.path.exists(listen_ipv6):
mw.writeFile(listen_ipv6,'True')
os.system(INIT_CMD + " restart")
print("|-开启IPv6支持了")
os.system('tail -100 ' + panel_dir + '/logs/panel_error.log')
elif mw_input == 14:
admin_close = thisdb.getOption('admin_close')
if admin_close == 'no':
thisdb.setOption('admin_close', 'yes')
mw.echoInfo("关闭面板访问成功!")
else:
print("|-已开启IPv6支持!")
elif mw_input == 24:
listen_ipv6 = 'data/ipv6.pl'
mw.echoInfo("已关闭面板访问!")
elif mw_input == 15:
admin_close = thisdb.getOption('admin_close')
if admin_close == 'yes':
thisdb.setOption('admin_close', 'no')
mw.echoInfo("开启面板访问成功!")
else:
mw.echoInfo("已开启面板访问!")
elif mw_input == 20:
basic_auth = thisdb.getOptionByJson('basic_auth', default={'open':False})
if basic_auth['open']:
basic_auth['open'] = False
thisdb.setOption('basic_auth', json.dumps(basic_auth))
os.system(INIT_CMD + " restart")
mw.echoInfo("关闭basic_auth成功")
elif mw_input == 21:
panel_domain = thisdb.getOption('panel_domain', default='')
if panel_domain != '':
thisdb.setOption('panel_domain', '')
os.system(INIT_CMD + " unbind_domain")
mw.echoInfo("解除域名绑定成功")
else:
mw.echoInfo("面板未绑定域名!")
elif mw_input == 22:
panel_ssl = thisdb.getOptionByJson('panel_ssl', default={'open':False})
if panel_ssl['open']:
panel_ssl['open'] = False
thisdb.setOption('panel_ssl', json.dumps(panel_ssl))
os.system(INIT_CMD + " unbind_ssl")
mw.echoInfo("解除面板SSL绑定成功")
elif mw_input == 23:
listen_ipv6 = panel_dir + '/data/ipv6.pl'
if not os.path.exists(listen_ipv6):
print("|-已关闭IPv6支持!")
mw.writeFile(listen_ipv6, 'True')
os.system(INIT_CMD + " restart")
mw.echoInfo("开启IPv6支持了")
else:
mw.echoInfo("已开启IPv6支持!")
elif mw_input == 24:
listen_ipv6 = panel_dir + '/data/ipv6.pl'
if not os.path.exists(listen_ipv6):
mw.echoInfo("已关闭IPv6支持!")
else:
os.remove(listen_ipv6)
os.system(INIT_CMD + " restart")
print("|-关闭IPv6支持了")
mw.echoInfo("关闭IPv6支持了")
elif mw_input == 25:
open_ssh_port()
print("|-已开启!")
mw.echoInfo("已开启!")
elif mw_input == 26:
auth_secret = 'data/auth_secret.pl'
if os.path.exists(auth_secret):
os.remove(auth_secret)
print("|-关闭二次验证成功!")
two_step_verification = thisdb.getOptionByJson('two_step_verification', default={'open':False})
if two_step_verification['open']:
two_step_verification['open'] = False
thisdb.setOption('two_step_verification', json.dumps(two_step_verification))
mw.echoInfo("关闭二次验证成功!")
else:
print("|-二次验证已关闭!")
mw.echoInfo("二次验证已关闭!")
elif mw_input == 27:
cmd = 'which ufw'
cmd = 'command -v ufw'
run_cmd = False
find_cmd = mw.execShell(cmd)
if find_cmd[0].strip() != '':
run_cmd = True
os.system('ufw status')
cmd = 'which firewall-cmd'
cmd = 'command -v firewall-cmd'
find_cmd = mw.execShell(cmd)
if find_cmd[0].strip() != '':
run_cmd = True
os.system('firewall-cmd --list-all')
if not run_cmd:
mw.echoInfo("未检测到防火墙!")
elif mw_input == 28:
MwFirewall.instance().aIF()
mw.echoInfo("执行自动识别防火墙端口到面板成功!")
elif mw_input == 29:
from utils.site_reflect import parse as MwParse
MwParse()
mw.echoInfo("自动识别配置站点信息成功!")
elif mw_input == 100:
php_conf = 'plugins/php/info.json'
php_conf = panel_dir + '/plugins/php/info.json'
if os.path.exists(php_conf):
cont = mw.readFile(php_conf)
cont = re.sub("\"53\"", "\"52\",\"53\"", cont)
cont = re.sub("\"5.3.29\"", "\"5.2.17\",\"5.3.29\"", cont)
mw.writeFile(php_conf, cont)
print("|-执行PHP52显示成功!")
mw.echoInfo("执行PHP52显示成功!")
elif mw_input == 101:
php_conf = 'plugins/php/info.json'
php_conf = panel_dir + '/plugins/php/info.json'
if os.path.exists(php_conf):
cont = mw.readFile(php_conf)
cont = re.sub("\"52\",", "", cont)
cont = re.sub("\"5.2.17\",", cont)
mw.writeFile(php_conf, cont)
print("|-执行PHP52隐藏成功!")
mw.echoInfo("执行PHP52隐藏成功!")
elif mw_input == 200:
os.system(INIT_CMD + " mirror")
os.system("bash <(curl -sSL https://linuxmirrors.cn/main.sh)")
# os.system(INIT_CMD + " mirror")
elif mw_input == 201:
os.system('curl -Lso- bench.sh | bash')
elif mw_input == 202:
package = mw.getPanelDir()+'/plugins'
dst_plugin = mw.getServerDir() + "/webssh"
if not os.path.exists(dst_plugin):
mw.echoInfo("未安装!")
exit(1)
if not package in sys.path:
sys.path.append(package)
from webssh.index import App
obj = App()
data = obj.get_server_list()
data = json.loads(data)
if data['status']:
wlist = data['data']
wlist_len = len(wlist)
if wlist_len == 0:
mw.echoInfo("SSH终端管理,数据为空!")
exit(1)
if len(sys.argv) == 4:
pos = int(sys.argv[3])
if pos >= wlist_len:
mw.echoInfo("SSH终端管理,超过限制!")
exit(1)
dst_data = wlist[pos]
tmp_host = dst_data["host"]
info = obj.get_server_by_host_data(tmp_host)
pp_info = tmp_host+"|"+info["port"]+"|"+info['username']+"|"+info['password']+""
print(pp_info)
exit(0)
mw.echoInfo("请选择:")
for x in range(wlist_len):
dst_data = wlist[x]
tag = dst_data['host']
if dst_data['ps'] != "":
tag = dst_data['ps']
print(str(x) +") " + tag)
def open_ssh_port():
import firewall_api
find_ssh_port_cmd = "cat /etc/ssh/sshd_config | grep '^Port \\d*' | tail -1"
cmd_data = mw.execShell(find_ssh_port_cmd)
ssh_port = cmd_data[0].replace("Port ", '').strip()
if ssh_port == '':
ssh_port = '22'
print("|-SSH端口: "+ str(ssh_port))
firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port')
mw.echoInfo("SSH端口: "+ str(ssh_port))
MwFirewall.instance().addAcceptPort(ssh_port, 'SSH远程管理服务', 'port')
return True
def set_panel_pwd(password, ncli=False):
# 设置面板密码
import db
sql = db.Sql()
result = sql.table('users').where('id=?', (1,)).setField(
'password', mw.md5(password))
username = sql.table('users').where('id=?', (1,)).getField('username')
info = thisdb.getUserByRoot()
thisdb.setUserByRoot(password=password)
if ncli:
print("|-用户名: " + username)
print("|-新密码: " + password)
mw.echoInfo("username: " + info['name'])
mw.echoInfo("password: " + password)
else:
print(username)
def show_panel_pwd():
# 设置面板密码
import db
sql = db.Sql()
password = sql.table('users').where('id=?', (1,)).getField('password')
# 面板密码展示
info = thisdb.getUserByRoot()
defailt_pwd_file = mw.getPanelDir()+'/data/default.pl'
pwd = ''
if os.path.exists(defailt_pwd_file):
pwd = mw.readFile(defailt_pwd_file).strip()
file_pwd = ''
if os.path.exists('data/default.pl'):
file_pwd = mw.readFile('data/default.pl').strip()
if mw.md5(file_pwd) == password:
print('password: ' + file_pwd)
if mw.md5(pwd) == info['password']:
mw.echoInfo('password: ' + pwd)
return
print("password has been changed!")
print("*-password has been changed!")
def show_panel_adminpath():
admin_path = thisdb.getOption('admin_path')
if admin_path == '':
print('/login')
else:
print('/'+admin_path)
def set_panel_username(username=None):
# 随机面板用户名
import db
sql = db.Sql()
if username:
if len(username) < 5:
print("|-错误,用户名长度不能少于5位")
mw.echoInfo("错误,用户名长度不能少于5位")
return
if username in ['admin', 'root']:
print("|-错误,不能使用过于简单的用户名")
mw.echoInfo("错误,不能使用过于简单的用户名")
return
sql.table('users').where('id=?', (1,)).setField('username', username)
print("|-新用户名: %s" % username)
thisdb.setUserByRoot(name=username)
mw.echoInfo("username: %s" % username)
return
username = sql.table('users').where('id=?', (1,)).getField('username')
if username == 'admin':
info = thisdb.getUserByRoot()
if info['name'] == 'admin':
username = mw.getRandomString(8).lower()
sql.table('users').where('id=?', (1,)).setField('username', username)
print('username: ' + username)
thisdb.setUserByRoot(name=username)
mw.echoInfo('username: ' + info['name'])
def getServerIp():
@@ -278,10 +379,25 @@ def getServerIp():
# "curl --insecure -{} -sS --connect-timeout 5 -m 60 https://v6r.ipip.net/?format=text".format(version))
ip = mw.execShell(
"curl --insecure -{} -sS --connect-timeout 5 -m 60 https://ip.cachecha.com/?format=text".format(version))
print(ip[0])
# print(ip[0])
return ip[0]
if __name__ == "__main__":
def getPanelSslType():
scheme = 'http'
panel_ssl = thisdb.getOptionByJson('panel_ssl', default={'open':False})
if panel_ssl['open']:
scheme = 'https'
return scheme
def getPanelBindDomain():
return thisdb.getOption('panel_domain', default='')
def main():
if len(sys.argv) == 1:
print('ERROR: Parameter error!')
exit(-2)
method = sys.argv[1]
if method == 'panel':
set_panel_pwd(sys.argv[2])
@@ -292,8 +408,16 @@ if __name__ == "__main__":
set_panel_username()
elif method == 'password':
show_panel_pwd()
elif method == 'test':
thisdb.getOption('admin_path')
elif method == 'admin_path':
show_panel_adminpath()
elif method == 'getServerIp':
getServerIp()
print(getServerIp())
elif method == 'panel_ssl_type':
print(getPanelSslType())
elif method == 'panel_bind_domain':
print(getPanelBindDomain())
elif method == "cli":
clinum = 0
try:
@@ -304,3 +428,6 @@ if __name__ == "__main__":
mwcli(clinum)
else:
print('ERROR: Parameter error')
if __name__ == "__main__":
main()

View File

@@ -21,8 +21,8 @@ CREATE TABLE IF NOT EXISTS `domain` (
`dnsapi_id` TEXT,
`email` TEXT,
`remark` TEXT,
`effective_date` TEXT,
`expiration_date` TEXT,
`effective_date` TEXT default '',
`expiration_date` TEXT default '',
`error` TEXT,
`status` INTEGER default '0',
`addtime` TEXT

View File

@@ -17,8 +17,16 @@ access_key = "xxx"
# 指定用户
userId = 1
sys.path.append(os.getcwd() + "/class/core")
import mw
if sys.platform != "darwin":
os.chdir("/www/server/mdserver-web")
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
domain = sys.argv[1]
ssl_path = sys.argv[2]

View File

@@ -8,8 +8,12 @@ import re
import requests
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
app_debug = False
if mw.isAppleSystem():
@@ -127,7 +131,7 @@ def status():
def contentReplace(content):
service_path = mw.getServerDir()
content = content.replace('{$ROOT_PATH}', mw.getRootDir())
content = content.replace('{$ROOT_PATH}', mw.getFatherDir())
content = content.replace('{$SERVER_PATH}', service_path)
content = content.replace('{$SERVER_APP}', service_path + '/redis')
content = content.replace('{$REDIS_PASS}', mw.getRandomString(10))
@@ -163,7 +167,6 @@ def pSqliteDb(dbname='dnsapi'):
def initDreplace():
file_tpl = getInitDTpl()
service_path = os.path.dirname(os.getcwd())
initD_path = getServerDir() + '/init.d'
if not os.path.exists(initD_path):
@@ -183,24 +186,25 @@ def initDreplace():
def apaOp(method):
file = initDreplace()
return 'ok'
current_os = mw.getOs()
if current_os == "darwin":
data = mw.execShell(file + ' ' + method)
if data[1] == '':
return 'ok'
return data[1]
# current_os = mw.getOs()
# if current_os == "darwin":
# data = mw.execShell(file + ' ' + method)
# if data[1] == '':
# return 'ok'
# return data[1]
if current_os.startswith("freebsd"):
data = mw.execShell('service ' + getPluginName() + ' ' + method)
if data[1] == '':
return 'ok'
return data[1]
# 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] == '':
return 'ok'
return data[1]
# data = mw.execShell('systemctl ' + method + ' ' + getPluginName())
# if data[1] == '':
# return 'ok'
# return data[1]
def start():
@@ -560,7 +564,7 @@ def runHookPy(domain,path):
# print(domain,path)
run_log = runLog()
hook_file = getConf()
cmd = 'cd '+mw.getRunDir()
cmd = 'cd '+mw.getPanelDir()
cmd += ' && python3 '+hook_file + ' ' + domain + ' ' + path
cmd += ' >> '+ run_log
print(cmd)
@@ -597,10 +601,12 @@ def runHookDstDomain(row):
hookWriteLog('开始申请【'+domain+'】SSL证书')
cmd = "#!/bin/bash\n"
cmd += "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin:/root/.acme.sh\n"
cmd += "export PATH\n"
if mw.isAppleSystem():
user = getRunUser()
cmd += "source /Users/"+user+"/.zshrc\n"
cmd += ". /Users/"+user+"/.zshrc\n"
cmd_data = getDnsapiData(row['dnsapi_id'])
# print(cmd_data)
@@ -641,7 +647,7 @@ def getHookIdCmd():
if not data[0]:
return data[1]
cmd = "cd "+mw.getRunDir()+" "
cmd = "cd "+mw.getPanelDir()+" "
cmd += '&& python3 plugins/acme_pandominassl_apply/index.py run_hook_id 1.0 {"id":"'+args['id']+'"}'
return mw.returnJson(True, 'ok',cmd)
@@ -658,7 +664,7 @@ def runHookId():
return 'run hook '+args['id']+' end'
def runHookCmd():
cmd = "cd "+mw.getRunDir()+" "
cmd = "cd "+mw.getPanelDir()+" "
cmd += '&& python3 plugins/acme_pandominassl_apply/index.py run_hook'
return mw.returnJson(True, 'ok',cmd)
@@ -735,7 +741,7 @@ def runSyncCfData():
return ''
def runSyncCfCmd():
cmd = "cd "+mw.getRunDir()+" "
cmd = "cd "+mw.getPanelDir()+" "
cmd += '&& python3 plugins/acme_pandominassl_apply/index.py run_sync_cf_data'
return mw.returnJson(True, 'ok',cmd)
@@ -788,7 +794,7 @@ def runSyncDnsPodData():
return ''
def runSyncDnsPodCmd():
cmd = "cd "+mw.getRunDir()+" "
cmd = "cd "+mw.getPanelDir()+" "
cmd += '&& python3 plugins/acme_pandominassl_apply/index.py run_sync_dnspod_data'
return mw.returnJson(True, 'ok',cmd)

View File

@@ -7,14 +7,13 @@ rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=$2
# curl https://get.acme.sh | sh
# acme.sh --uninstall
# source /Users/xxx/.zshrc
# . /Users/xxx/.zshrc
# https://github.com/acmesh-official/acme.sh/wiki/dnsapi
# https://docs.dnspod.com/api-legacy/domains.html#get-the-domain-list
@@ -25,13 +24,13 @@ VERSION=$2
if [ -f ${rootPath}/bin/activate ];then
source ${rootPath}/bin/activate
. ${rootPath}/bin/activate
fi
# pip install cloudflare
Install_App()
{
echo '正在安装脚本文件...' > $install_tmp
echo '正在安装脚本文件...'
mkdir -p $serverPath/source
mkdir -p $serverPath/acme_pandominassl_apply
echo "${VERSION}" > $serverPath/acme_pandominassl_apply/version.pl
@@ -48,7 +47,7 @@ Uninstall_App()
}
action=$1
if [ "${1}" == 'install' ];then
if [ "${1}" = 'install' ];then
Install_App
else
Uninstall_App

View File

@@ -274,7 +274,7 @@ function dnsapiAdd(row){
// console.log(row);
var option_name = '';
var option_remark = '';
var option_type = 'cf';
var option_type = 'dns_cf';
var option_val = '';
var option_id = 0;
if (typeof(row) != 'undefined'){
@@ -286,7 +286,6 @@ function dnsapiAdd(row){
}
// console.log(option_name);
function renderDnsapiOption(name, val){
var vlist = {};
if (val != ''){
@@ -303,18 +302,16 @@ function dnsapiAdd(row){
}
var key = getDnsapiKey(name);
var klist = key.split(':');
// console.log(klist);
var option_html = '';
for (var i = 0; i < klist.length; i++) {
var klist_val = '';
if (klist[i] in vlist){
klist_val = vlist[klist[i]];
}
option_html += "\
<span class='tname'>"+klist[i]+"</span>\
option_html += "<span class='tname'>"+klist[i]+"</span>\
<div class='info-r'>\
<input name='"+klist[i]+"' class='bt-input-text mr5' style='width:100%;' value='"+klist_val+"' placeholder='请输入对应值' type='text'>\
</div>";
@@ -379,7 +376,6 @@ function dnsapiAdd(row){
$('select[name="type"]').html(option);
$('select[name="type"]').change(function(){
var name = $(this).val();
if (option_type == name){
renderDnsapiOption(name, option_val);
} else {
@@ -667,11 +663,24 @@ function domainAdd(row){
var rdata = $.parseJSON(data.data);
for (var i = 0; i < rdata.length; i++) {
if (option_dnsapi_id == rdata[i]['id']){
dnsapi_id_html += "<option value='"+rdata[i]['id']+"' selected>"+rdata[i]['name']+"</option>";
dnsapi_id_html += "<option value='"+rdata[i]['id']+"' val='"+rdata[i]['val']+"' selected>"+rdata[i]['name']+"</option>";
} else {
dnsapi_id_html += "<option value='"+rdata[i]['id']+"'>"+rdata[i]['name']+"</option>";
dnsapi_id_html += "<option value='"+rdata[i]['id']+"' val='"+rdata[i]['val']+"'>"+rdata[i]['name']+"</option>";
}
}
$('select[name="dnsapi_id"]').change(function(){
var val = $('select[name="dnsapi_id"]').find("option:selected").attr('val');
var val_arr = val.split("|");
for (var i = 0; i < val_arr.length; i++) {
var param = val_arr[i];
var strictEmailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if(strictEmailRegex.test(param)){
$('input[name="email"]').val(param);
}
}
});
$('select[name="dnsapi_id"]').html(dnsapi_id_html);
});
},

View File

@@ -6,8 +6,18 @@ import os
import time
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
# print(sys.platform)
if sys.platform != "darwin":
os.chdir("/www/server/mdserver-web")
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
from utils.crontab import crontab as MwCrontab
app_debug = False
@@ -69,10 +79,8 @@ def createBgTaskByName(name):
if res and res["id"] == args["task_id"]:
print("计划任务已经存在!")
return True
import crontab_api
api = crontab_api.crontab_api()
mw_dir = mw.getRunDir()
mw_dir = mw.getPanelDir()
cmd = '''
mw_dir=%s
rname=%s
@@ -99,10 +107,10 @@ logs_file=$plugin_path/${rname}.log
'stype': "toShell",
'sname': '',
'sbody': cmd,
'urladdress': '',
'url_address': '',
}
task_id = api.add(params)
task_id = MwCrontab.instance().add(params)
if task_id > 0:
args["task_id"] = task_id
args["name"] = name

View File

@@ -5,9 +5,14 @@ import io
import os
import time
import re
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
app_debug = False
if mw.isAppleSystem():
@@ -92,18 +97,40 @@ def readConfigTpl():
content = contentReplace(content)
return mw.returnJson(True, 'ok', content)
def __release_port(port, ps = '开启端口'):
try:
from utils.firewall import Firewall as MwFirewall
MwFirewall.instance().addAcceptPort(port, ps, 'port')
return port
except Exception as e:
return "Release failed {}".format(e)
def __delete_port(port):
try:
from utils.firewall import Firewall as MwFirewall
MwFirewall.instance().delAcceptPortCmd(port, 'tcp')
return port
except Exception as e:
return "Delete failed {}".format(e)
def openPort():
content = mw.readFile(getConf())
data = json.loads(content)
http_port = data['scheme']['http_port']
__release_port(http_port, 'alist')
return True
def status():
data = mw.execShell(
"ps aux|grep alist |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
cmd = "ps -ef|grep alist |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'"
data = mw.execShell(cmd)
if data[0] == '':
return 'stop'
return 'start'
def contentReplace(content):
service_path = mw.getServerDir()
content = content.replace('{$ROOT_PATH}', mw.getRootDir())
content = content.replace('{$ROOT_PATH}', mw.getFatherDir())
content = content.replace('{$SERVER_PATH}', service_path)
content = content.replace('{$SERVER_APP}', service_path + '/'+getPluginName())
return content
@@ -111,7 +138,7 @@ def contentReplace(content):
def initDreplace():
file_tpl = getInitDTpl()
service_path = os.path.dirname(os.getcwd())
service_path = mw.getServerDir()
initD_path = getServerDir() + '/init.d'
if not os.path.exists(initD_path):
@@ -124,6 +151,7 @@ def initDreplace():
content = content.replace('{$SERVER_PATH}', service_path)
mw.writeFile(file_bin, content)
mw.execShell('chmod +x ' + file_bin)
# systemd
systemDir = mw.systemdCfgDir()
@@ -135,7 +163,7 @@ def initDreplace():
se_content = se_content.replace('{$SERVER_PATH}', service_path)
mw.writeFile(systemService, se_content)
mw.execShell('systemctl daemon-reload')
time.sleep(1)
return file_bin
@@ -247,7 +275,6 @@ def clearCopyTask():
return mw.returnJson(True, '清空成功并重启服务!')
def homePage():
import json
content = mw.readFile(getConf())
data = json.loads(content)
http_port = data['scheme']['http_port']

View File

@@ -4,7 +4,7 @@
"name": "alist",
"title": "Alist",
"shell": "install.sh",
"versions":["3.37.4","3.38.0"],
"versions":["3.37.4","3.38.0","3.45.0"],
"tip": "soft",
"checks": "server/alist",
"path": "server/alist",

View File

@@ -23,7 +23,7 @@ app_start(){
app_stop(){
echo "dztasks stopped"
ps -ef| grep alist | grep -v grep | grep -v python | grep -v sh | awk '{print $2}'| xargs kill
ps -ef| grep alist | grep -v grep | grep -v python | grep -v sh | awk '{print $2}'| xargs kill -9
}

View File

@@ -8,25 +8,24 @@ rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/alist && bash install.sh install 3.37.4
# cd /www/server/mdserver-web/plugins/alist && bash install.sh install 3.37.4
# cd /www/server/mdserver-web/plugins/alist && bash install.sh install 3.45.0
install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=$2
sysArch=`arch`
sysName=`uname`
ALIST_ARCH_NAME=amd64
if [ "$sysArch" == "arm64" ];then
if [ "$sysArch" = "arm64" ];then
ALIST_ARCH_NAME=arm64
elif [ "$sysArch" == "x86_64" ]; then
elif [ "$sysArch" = "x86_64" ]; then
ALIST_ARCH_NAME=amd64
elif [ "$sysArch" == "aarch64" ]; then
elif [ "$sysArch" = "aarch64" ]; then
ALIST_ARCH_NAME=arm64
fi
ALIST_NAME=linux
if [ "$sysName" == "Darwin" ];then
if [ "$sysName" = "Darwin" ];then
ALIST_NAME=darwin
fi
@@ -42,7 +41,7 @@ Install_App()
ALIST_DIR=$serverPath/source/alist
if [ ! -f $ALIST_DIR/${FILE_TGZ} ];then
wget -O $ALIST_DIR/${FILE_TGZ} https://github.com/alist-org/alist/releases/download/v${VERSION}/${FILE_TGZ}
wget --no-check-certificate -O $ALIST_DIR/${FILE_TGZ} https://github.com/alist-org/alist/releases/download/v${VERSION}/${FILE_TGZ}
fi
mkdir -p $serverPath/alist
@@ -87,7 +86,7 @@ Uninstall_App()
}
action=$1
if [ "${1}" == 'install' ];then
if [ "${1}" = 'install' ];then
Install_App
else
Uninstall_App

View File

@@ -83,6 +83,7 @@ function alistReadme(){
var readme = '<ul class="help-info-text c7">';
readme += '<li>手动开启默认端口:5244</li>';
readme += '<li>默认admin:admin</li>';
readme += '<li>手动改密码: cd /www/server/alist && ./alist admin set NEW_PASSWORD</li>';
readme += '</ul>';

35
plugins/apache/check.sh Executable file
View File

@@ -0,0 +1,35 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
# OpenResty服务名称
service_name="openresty"
# 检查OpenResty是否正在运行
if systemctl is-active --quiet "$service_name"; then
# 检查是否存在僵尸进程
zombie_processes=$(ps -ef | grep -i openresty | grep -v grep | awk '{print $2}' | xargs ps -o state= -p 2>/dev/null | grep -c Z)
if [ "$zombie_processes" -gt 0 ]; then
echo "kill nginx 僵尸进程"
ps -ef|grep nginx| grep -v grep| awk '{print $2}' | xargs kill -9
echo "检测到OpenResty僵尸进程,正在重启服务..."
systemctl restart "$service_name"
echo "服务已重启"
else
echo "OpenResty运行正常"
fi
else
echo "kill nginx"
ps -ef|grep nginx| grep -v grep| awk '{print $2}' | xargs kill -9
echo "OpenResty未运行,正在启动服务..."
systemctl start "$service_name"
echo "服务已启动"
fi
NGINX_IDS=`ps -ef|grep nginx | grep -v grep| awk '{print $2}'`
if [ "$NGINX_IDS" = "" ];then
ps -ef|grep nginx| grep -v grep| awk '{print $2}' | xargs kill -9
systemctl start "$service_name"
echo "OpenResty未运行,正在启动服务..."
fi

View File

@@ -0,0 +1,57 @@
<IfModule !mpm_netware_module>
PidFile "logs/httpd.pid"
</IfModule>
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_netware_module>
ThreadStackSize 65536
StartThreads 250
MinSpareThreads 25
MaxSpareThreads 250
MaxThreads 1000
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_mpmt_os2_module>
StartServers 2
MinSpareThreads 5
MaxSpareThreads 10
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_winnt_module>
ThreadsPerChild 150
MaxConnectionsPerChild 0
</IfModule>
<IfModule !mpm_netware_module>
MaxMemFree 2048
</IfModule>
<IfModule mpm_netware_module>
MaxMemFree 100
</IfModule>

View File

@@ -0,0 +1,105 @@
ServerRoot "{$SERVER_PATH}/apache/httpd"
Listen 8280
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule brotli_module modules/mod_brotli.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin you@example.com
ServerName localhost:8280
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "{$SERVER_PATH}/apache/httpd/htdocs"
<Directory "{$SERVER_PATH}/apache/httpd/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error.log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access.log" common
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "{$SERVER_PATH}/apache/httpd/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "{$SERVER_PATH}/apache/httpd/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
EnableSendfile on
Include conf/extra/httpd-info.conf
Include conf/extra/httpd-mpm.conf
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

View File

@@ -0,0 +1,506 @@
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
# will be interpreted as '/logs/access_log'.
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
#
ServerRoot "/Users/midoks/Desktop/mwdev/server/apache/httpd"
#
# Mutex: Allows you to set the mutex mechanism and mutex file directory
# for individual mutexes, or change the global defaults
#
# Uncomment and change the directory if mutexes are file-based and the default
# mutex file directory is not on a local disk or is not appropriate for some
# other reason.
#
# Mutex default:logs
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule cache_socache_module modules/mod_cache_socache.so
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
#LoadModule socache_redis_module modules/mod_socache_redis.so
#LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule request_module modules/mod_request.so
#LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule brotli_module modules/mod_brotli.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
#LoadModule remoteip_module modules/mod_remoteip.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule session_module modules/mod_session.so
#LoadModule session_cookie_module modules/mod_session_cookie.so
#LoadModule session_dbd_module modules/mod_session_dbd.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule http2_module modules/mod_http2.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule info_module modules/mod_info.so
#LoadModule cgid_module modules/mod_cgid.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User daemon
Group daemon
</IfModule>
# 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin you@example.com
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:80
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all denied
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/Users/midoks/Desktop/mwdev/server/apache/httpd/htdocs"
<Directory "/Users/midoks/Desktop/mwdev/server/apache/httpd/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ".ht*">
Require all denied
</Files>
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog "logs/error_log"
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog "logs/access_log" common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
#
# Redirect: Allows you to tell clients about documents that used to
# exist in your server's namespace, but do not anymore. The client
# will make a new request for the document at its new location.
# Example:
# Redirect permanent /foo http://www.example.com/bar
#
# Alias: Maps web paths into filesystem paths and is used to
# access content that does not live under the DocumentRoot.
# Example:
# Alias /webpath /full/filesystem/path
#
# If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a <Directory> section to allow access to
# the filesystem path.
#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "/Users/midoks/Desktop/mwdev/server/apache/httpd/cgi-bin/"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock cgisock
</IfModule>
#
# "/Users/midoks/Desktop/mwdev/server/apache/httpd/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/Users/midoks/Desktop/mwdev/server/apache/httpd/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
#
# Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
# backend servers which have lingering "httpoxy" defects.
# 'Proxy' request header is undefined by the IETF, not listed by IANA
#
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig conf/mime.types
#
# AddType allows you to add to or override the MIME configuration
# file specified in TypesConfig for specific file types.
#
#AddType application/x-gzip .tgz
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
# For type maps (negotiated resources):
#AddHandler type-map var
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
#
# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.
#
#MIMEMagicFile conf/magic
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# MaxRanges: Maximum number of Ranges in a request before
# returning the entire resource, or one of the special
# values 'default', 'none' or 'unlimited'.
# Default setting is to accept 200 Ranges.
#MaxRanges unlimited
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files. This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
#EnableSendfile on
# Supplemental configuration
#
# The configuration files in the conf/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
# Language settings
#Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
# Various default settings
#Include conf/extra/httpd-default.conf
# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

BIN
plugins/apache/ico.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

25
plugins/apache/index.html Executable file
View File

@@ -0,0 +1,25 @@
<div class="bt-form">
<!-- <div class='plugin_version'></div> -->
<div class="bt-w-main">
<div class="bt-w-menu">
<p class="bgw" onclick="httpPluginService('apache',$('.plugin_version').attr('version'));">服务</p>
<p onclick="pluginInitD('apache', $('.plugin_version').attr('version'));">自启动</p>
<p onclick="pluginConfig('apache');">配置修改</p>
<p onclick="getHttpdStatus();">负载状态</p>
<p onclick="setOpCfg();">MPM性能调整</p>
<p onclick="pluginLogs('apache');">错误日志</p>
<p onclick="otherFunc();">维护功能</p>
</div>
<div class="bt-w-con pd15">
<div class="soft-man-con" style="height: 500px; overflow-y: auto;"></div>
</div>
</div>
</div>
<script type="text/javascript">
// resetPluginWinHeight(600);
$.getScript( "/plugins/file?name=apache&f=js/httpd.js", function(){
httpPluginService('apache');
});
</script>

593
plugins/apache/index.py Executable file
View File

@@ -0,0 +1,593 @@
# coding:utf-8
import sys
import io
import os
import time
import threading
import subprocess
import re
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'apache'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getInitDFile():
current_os = mw.getOs()
if current_os == 'darwin':
return '/tmp/' + getPluginName()
if current_os.startswith('freebsd'):
return '/etc/rc.d/' + getPluginName()
return '/etc/init.d/' + getPluginName()
def getArgs():
args = sys.argv[2:]
# print(args)
tmp = {}
args_len = len(args)
if args_len == 1:
t = args[0].strip('{').strip('}')
t = t.split(':',2)
tmp[t[0]] = t[1]
elif args_len > 1:
for i in range(len(args)):
t = args[i].split(':',2)
tmp[t[0]] = t[1]
# print(tmp)
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 clearTemp():
path_bin = getServerDir() + "/httpd"
def getConf():
path = getServerDir() + "/httpd/conf/httpd.conf"
return path
def getConfMpm():
path = getServerDir() + "/httpd/conf/extra/httpd-mpm.conf"
return path
def getConfTpl():
path = getPluginDir() + '/conf/httpd.conf'
return path
def getOs():
data = {}
data['os'] = mw.getOs()
data['auth'] = True
return mw.getJson(data)
def getInitDTpl():
path = getPluginDir() + "/init.d/httpd.tpl"
return path
def getPidFile():
file = getConf()
content = mw.readFile(file)
rep = r'pid\s*(.*);'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getFileOwner(filename):
import pwd
stat = os.lstat(filename)
uid = stat.st_uid
pw = pwd.getpwuid(uid)
return pw.pw_name
def checkAuthEq(file, owner='root'):
fowner = getFileOwner(file)
if (fowner == owner):
return True
return False
def confReplace():
service_path = mw.getServerDir()
content = mw.readFile(getConfTpl())
content = content.replace('{$SERVER_PATH}', service_path)
# 主配置文件
nconf = getServerDir() + '/httpd/conf/httpd.conf'
mw.writeFile(nconf, content)
def initDreplace():
file_tpl = getInitDTpl()
service_path = mw.getServerDir()
initD_path = getServerDir() + '/init.d'
# OpenResty is not installed
if not os.path.exists(getServerDir()):
print("ok")
exit(0)
# init.d
file_bin = initD_path + '/' + getPluginName()
if not os.path.exists(initD_path):
os.mkdir(initD_path)
# initd replace
content = mw.readFile(file_tpl)
content = content.replace('{$SERVER_PATH}', service_path)
mw.writeFile(file_bin, content)
mw.execShell('chmod +x ' + file_bin)
# config replace
confReplace()
# systemd
# /usr/lib/systemd/system
systemDir = mw.systemdCfgDir()
systemService = systemDir + '/httpd.service'
if os.path.exists(systemDir) and not os.path.exists(systemService):
systemServiceTpl = getPluginDir() + '/init.d/httpd.service.tpl'
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
def status():
cmd = "ps -ef|grep 'httpd' |grep -v grep | grep -v python | awk '{print $2}'"
data = mw.execShell(cmd)
if data[0] == '':
return 'stop'
return 'start'
def restyOp(method):
file = initDreplace()
# 启动时,先检查一下配置文件
check = getServerDir() + "/httpd/bin/httpd -t"
check_data = mw.execShell(check)
if not check_data[1].find('Syntax OK') > -1:
return check_data[1]
current_os = mw.getOs()
if current_os == "darwin":
data = mw.execShell(file + ' ' + method)
if data[1] == '':
return 'ok'
return data[1]
if current_os.startswith("freebsd"):
mw.execShell('service httpd '+method)
if data[1] == '':
return 'ok'
return data[1]
data = mw.execShell('systemctl ' + method + ' httpd')
if data[1] == '':
return 'ok'
return data[1]
def op_submit_systemctl_restart():
current_os = mw.getOs()
if current_os.startswith("freebsd"):
mw.execShell('service httpd restart')
return True
mw.execShell('systemctl restart httpd')
return True
def op_submit_init_restart(file):
mw.execShell(file + ' restart')
def restyOp_restart():
file = initDreplace()
# 启动时,先检查一下配置文件
check = getServerDir() + "/httpd/bin/httpd -t"
check_data = mw.execShell(check)
if not check_data[1].find('Syntax OK') > -1:
return 'ERROR: 配置出错<br><a style="color:red;">' + check_data[1].replace("\n", '<br>') + '</a>'
if not mw.isAppleSystem():
threading.Timer(2, op_submit_systemctl_restart).start()
return 'ok'
threading.Timer(2, op_submit_init_restart, args=(file,)).start()
return 'ok'
def start():
return restyOp('start')
def stop():
r = restyOp('stop')
mw.execShell("ps -ef|grep httpd | grep -v grep | awk '{print $2}'|xargs -r kill")
return r
def restart():
return restyOp_restart()
def reload():
confReplace()
return restyOp('reload')
def initdStatus():
current_os = mw.getOs()
if current_os == 'darwin':
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 httpd | grep loaded | grep "enabled;"'
data = mw.execShell(shell_cmd)
if data[0] == '':
return 'fail'
return 'ok'
def initdInstall():
current_os = mw.getOs()
if current_os == 'darwin':
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 httpd_enable="YES"')
return 'ok'
mw.execShell('systemctl enable httpd')
return 'ok'
def initdUinstall():
current_os = mw.getOs()
if current_os == 'darwin':
return "Apple Computer does not support"
if current_os.startswith('freebsd'):
initd_bin = getInitDFile()
os.remove(initd_bin)
mw.execShell('sysrc httpd_enable="NO"')
return 'ok'
mw.execShell('systemctl disable httpd')
return 'ok'
def getHttpdStatusPort():
conf = mw.getServerDir() + '/apache/httpd/conf/httpd.conf'
content = mw.readFile(conf)
if not content:
return None
rep = r'^\s*Listen\s*(?:\d+\.\d+\.\d+\.\d+:)?(\d+)' # 匹配非注释行的 Listen 指令,忽略大小写
tmp = re.search(rep, content, re.IGNORECASE | re.MULTILINE)
if tmp:
port = tmp.groups()[0].strip()
return port
return None
def runInfoDone(data):
result = {}
if not data:
return result
# 解析服务器状态数据
lines = data.strip().split('\n')
for line in lines:
if ':' in line:
key, value = line.split(':', 1)
key = key.strip()
value = value.strip()
result[key] = value
return result
def runInfo():
op_status = status()
if op_status == 'stop':
return mw.returnJson(False, "未启动!")
port = getHttpdStatusPort()
if not port:
return mw.returnJson(False, "无法获取端口信息!")
# 取Openresty负载状态
try:
url = 'http://127.0.0.1:%s/server-status?auto' % port
result = mw.httpGet(url, timeout=3)
data = runInfoDone(result)
return mw.getJson(data)
except Exception as e:
try:
url = 'http://' + mw.getHostAddr() + ':%s/server-status?auto' % port
result = mw.httpGet(url)
data = runInfoDone(result)
return mw.getJson(data)
except Exception as e:
return mw.returnJson(False, "apache异常!")
except Exception as e:
return mw.returnJson(False, "apache not started!")
def errorLogPath():
return getServerDir() + '/httpd/logs/error.log'
def getCfg():
cfg = getConfMpm()
content = mw.readFile(cfg)
unitrep = "[kmgKMG]"
# 获取当前 MPM 模块
mpm_module = ""
mpm_match = re.search(r"mpm_(\w+)_module", content)
if mpm_match:
mpm_module = mpm_match.group(1)
# MPM 配置参数
mpm_cfg_args = {
"prefork": [
{"name": "StartServers", "ps": "服务器进程启动数量", 'type': 2},
{"name": "MinSpareServers", "ps": "保持空闲的最小服务器进程数", 'type': 2},
{"name": "MaxSpareServers", "ps": "保持空闲的最大服务器进程数", 'type': 2},
{"name": "MaxRequestWorkers", "ps": "允许启动的最大服务器进程数", 'type': 2},
{"name": "MaxConnectionsPerChild", "ps": "服务器进程服务的最大连接数", 'type': 2},
],
"worker": [
{"name": "StartServers", "ps": "初始服务器进程数", 'type': 2},
{"name": "MinSpareThreads", "ps": "保持空闲的最小工作线程数", 'type': 2},
{"name": "MaxSpareThreads", "ps": "保持空闲的最大工作线程数", 'type': 2},
{"name": "ThreadsPerChild", "ps": "每个服务器进程的工作线程数", 'type': 2},
{"name": "MaxRequestWorkers", "ps": "最大工作线程数", 'type': 2},
{"name": "MaxConnectionsPerChild", "ps": "服务器进程服务的最大连接数", 'type': 2},
],
"event": [
{"name": "StartServers", "ps": "初始服务器进程数", 'type': 2},
{"name": "MinSpareThreads", "ps": "保持空闲的最小工作线程数", 'type': 2},
{"name": "MaxSpareThreads", "ps": "保持空闲的最大工作线程数", 'type': 2},
{"name": "ThreadsPerChild", "ps": "每个服务器进程的工作线程数", 'type': 2},
{"name": "MaxRequestWorkers", "ps": "最大工作线程数", 'type': 2},
{"name": "MaxConnectionsPerChild", "ps": "服务器进程服务的最大连接数", 'type': 2},
],
"netware": [
{"name": "ThreadStackSize", "ps": "每个工作线程分配的堆栈大小", 'type': 2},
{"name": "StartThreads", "ps": "服务器启动时启动的工作线程数", 'type': 2},
{"name": "MinSpareThreads", "ps": "保持空闲的最小线程数", 'type': 2},
{"name": "MaxSpareThreads", "ps": "保持空闲的最大线程数", 'type': 2},
{"name": "MaxThreads", "ps": "同时活跃的最大工作线程数", 'type': 2},
{"name": "MaxConnectionsPerChild", "ps": "线程服务的最大连接数", 'type': 2},
],
"mpmt_os2": [
{"name": "StartServers", "ps": "维护的服务器进程数", 'type': 2},
{"name": "MinSpareThreads", "ps": "每个进程的最小空闲线程数", 'type': 2},
{"name": "MaxSpareThreads", "ps": "每个进程的最大空闲线程数", 'type': 2},
{"name": "MaxConnectionsPerChild", "ps": "每个服务器进程的最大连接数", 'type': 2},
],
"winnt": [
{"name": "ThreadsPerChild", "ps": "服务器进程中的工作线程数", 'type': 2},
{"name": "MaxConnectionsPerChild", "ps": "服务器进程服务的最大连接数", 'type': 2},
]
}
# 通用配置参数
common_cfg_args = [
{"name": "MaxMemFree", "ps": "每个分配器允许持有的最大空闲KB数", 'type': 2},
]
# 合并配置参数
cfg_args = []
if mpm_module in mpm_cfg_args:
cfg_args.extend(mpm_cfg_args[mpm_module])
cfg_args.extend(common_cfg_args)
rdata = []
for i in cfg_args:
# 匹配 MPM 特定配置
rep = r"<IfModule mpm_%s_module>.*?(%s)\s+(\w+).*?</IfModule>" % (mpm_module, i["name"])
k = re.search(rep, content, re.DOTALL)
# 如果没有找到 MPM 特定配置,尝试匹配通用配置
if not k:
rep = r"(%s)\s+(\w+)" % i["name"]
k = re.search(rep, content)
if not k:
continue
key = k.group(1)
v = k.group(2) if len(k.groups()) > 1 else ""
if re.search(unitrep, v):
u = str.upper(v[-1])
v = v[:-1]
if len(u) == 1:
psstr = u + "B," + i["ps"]
else:
psstr = u + "," + i["ps"]
else:
u = ""
kv = {"name": key, "value": v, "unit": u,
"ps": i["ps"], "type": i["type"]}
rdata.append(kv)
return mw.returnJson(True, "ok", rdata)
def replaceChar(value, index, new_char):
return value[:index] + new_char + value[index+1:]
def setCfg():
args = getArgs()
# 检查参数,允许动态参数
cfg = getConfMpm()
mw.backFile(cfg)
content = mw.readFile(cfg)
# 获取当前 MPM 模块
mpm_module = ""
mpm_match = re.search(r"mpm_(\w+)_module", content)
if mpm_match:
mpm_module = mpm_match.group(1)
# 验证参数值
for k, v in args.items():
# 检查是否为数字参数
if not re.search(r"\d+", v):
return mw.returnJson(False, '参数值错误,请输入数字整数')
# 替换 MPM 特定配置
if mpm_module:
def replace_mpm_config(match):
return match.group(1) + k + match.group(2) + v + match.group(3)
rep = r"(<IfModule mpm_%s_module>.*?)%s(\s+)\d+(.*?</IfModule>)" % (mpm_module, k)
if re.search(rep, content, re.DOTALL):
content = re.sub(rep, replace_mpm_config, content, flags=re.DOTALL)
# 替换通用配置
def replace_common_config(match):
return k + match.group(1) + v
rep = r"%s(\s+)\d+" % k
if re.search(rep, content):
content = re.sub(rep, replace_common_config, content)
mw.writeFile(cfg, content)
isError = mw.checkHttpdConfig()
if (isError != True):
mw.restoreFile(cfg)
return mw.returnJson(False, 'ERROR: 配置出错<br><a style="color:red;">' + isError.replace("\n", '<br>') + '</a>')
mw.restartWeb()
return mw.returnJson(True, '设置成功')
def cronAddCheck():
try:
import tool_task
tool_task.createBgTask()
return mw.returnJson(True, '添加检查任务成功')
except Exception as e:
return mw.returnJson(False, '添加检查任务失败:'+str(e))
def cronDelCheck():
try:
import tool_task
tool_task.removeBgTask()
return mw.returnJson(True, '删除检查任务成功')
except Exception as e:
return mw.returnJson(False, '删除检查任务失败:'+str(e))
def cronCheck():
return 'ok'
def installPreInspection():
return 'ok'
if __name__ == "__main__":
version = '2.4'
version_pl = getServerDir() + "/version.pl"
if os.path.exists(version_pl):
version = mw.readFile(version_pl)
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 == 'install_pre_inspection':
print(installPreInspection())
elif func == 'conf':
print(getConf())
elif func == 'get_os':
print(getOs())
elif func == 'run_info':
print(runInfo())
elif func == 'error_log':
print(errorLogPath())
elif func == 'get_cfg':
print(getCfg())
elif func == 'set_cfg':
print(setCfg())
elif func == 'check':
print(cronCheck())
elif func == 'cron_add_check':
print(cronAddCheck())
elif func == 'cron_del_check':
print(cronDelCheck())
else:
print('error')

18
plugins/apache/info.json Executable file
View File

@@ -0,0 +1,18 @@
{
"sort": 0,
"title":"apache",
"tip":"soft",
"name":"apache",
"type":"其他插件",
"ps":"世界排名第一,快速、可靠并且可通过简单的API扩充",
"shell":"install.sh",
"install_pre_inspection":true,
"checks":"server/apache",
"path":"server/apache",
"author":"apache",
"home":"https://downloads.apache.org/httpd/",
"date":"2026-04-11",
"pid": "1",
"versions": ["2.4"],
"updates": ["2.4:66"]
}

View File

@@ -0,0 +1,16 @@
[Unit]
Description=Apache Web Server
After=network.target
[Service]
Type=simple
Environment=LANG=C
ExecStart={$SERVER_PATH}/apache/httpd/bin/httpd $OPTIONS -DFOREGROUND
ExecReload={$SERVER_PATH}/apache/httpd/bin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,17 @@
[Unit]
Description=Apache Web Server
After=network.target
[Service]
Type=forking
PIDFile={$SERVER_PATH}/apache/httpd/logs/httpd.pid
ExecStart={$SERVER_PATH}/apache/httpd/bin/apachectl start
ExecReload={$SERVER_PATH}/apache/httpd/bin/apachectl graceful
ExecStop={$SERVER_PATH}/apache/httpd/bin/apachectl stop
PrivateTmp=true
User=www
Group=www
Restart=on-failure
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,47 @@
#!/bin/bash
# chkconfig: 345 85 15
# description: Apache Server
### BEGIN INIT INFO
# Provides: apache
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Apache Server
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/homebrew/bin
# Apache 可执行文件的路径
DAEMON={$SERVER_PATH}/apache/httpd/bin/httpd
# 进程的 PID 文件路径
PIDFILE={$SERVER_PATH}/apache/httpd/logs/httpd.pid
# 根据传入的参数执行不同操作
case "$1" in
start)
echo "Starting Apache..."
$DAEMON -k start
;;
stop)
echo "Stopping Apache..."
$DAEMON -k stop
;;
restart)
echo "Restarting Apache..."
$DAEMON -k restart
;;
status)
if [ -f $PIDFILE ]; then
echo "Apache is running."
else
echo "Apache is not running."
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0

87
plugins/apache/install.sh Executable file
View File

@@ -0,0 +1,87 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/apache && bash install.sh install 2.4
# cd /www/server/mdserver-web/plugins/apache && bash install.sh install 2.4
# cd /www/server/mdserver-web/plugins/apache && bash install.sh upgrade 2.4
# curl -I -H "Accept-Encoding: br" http://localhost
# curl -I -H "Accept-Encoding: zstd" http://localhost
# curl --http3 -v https://www.xxx.com
# apt install ncat -y
# nc -u -v www.xx.com 443
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/apache && python3 plugins/apache/index.py start
# cd /www/server/mdserver-web && python3 plugins/apache/index.py start
# cd /www/server/mdserver-web && python3 plugins/apache/index.py run_info
# ps -ef|grep httpd | grep -v grep | awk '{print $2}'|xargs kill
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
sysName=`uname`
action=$1
type=$2
VERSION=$2
openrestyDir=${serverPath}/source/apache
if id www &> /dev/null ;then
echo "www uid is `id -u www`"
echo "www shell is `grep "^www:" /etc/passwd |cut -d':' -f7 `"
else
groupadd www
useradd -g www -s /bin/bash www
fi
if [ "${action}" = "upgrade" ];then
sh -x $curPath/versions/$2/install.sh $1
echo "${VERSION}" > $serverPath/apache/version.pl
mkdir -p $serverPath/web_conf/php/conf
echo 'set $PHP_ENV 0;' > $serverPath/web_conf/php/conf/enable-php-00.conf
#初始化
cd ${rootPath} && python3 ${rootPath}/plugins/apache/index.py start
cd ${rootPath} && python3 ${rootPath}/plugins/apache/index.py initd_install
exit 0
fi
if [ "${2}" = "" ];then
echo '缺少安装脚本版本...'
exit 0
fi
if [ "${action}" = "uninstall" ];then
if [ -f /usr/lib/systemd/system/httpd.service ] || [ -f /lib/systemd/system/httpd.service ];then
systemctl stop httpd
rm -rf /usr/systemd/system/httpd.service
rm -rf /lib/systemd/system/httpd.service
systemctl daemon-reload
fi
if [ -f $serverPath/apache/init.d/httpd ];then
$serverPath/apache/init.d/httpd stop
fi
rm -rf $serverPath/apache
fi
sh -x $curPath/versions/$2/install.sh $1
if [ "${action}" = "install" ] && [ -d $serverPath/apache ];then
echo "${VERSION}" > $serverPath/apache/version.pl
mkdir -p $serverPath/web_conf/php/conf
echo 'set $PHP_ENV 0;' > $serverPath/web_conf/php/conf/enable-php-00.conf
#初始化
cd ${rootPath} && python3 ${rootPath}/plugins/apache/index.py start
cd ${rootPath} && python3 ${rootPath}/plugins/apache/index.py initd_install
fi

278
plugins/apache/js/httpd.js Executable file
View File

@@ -0,0 +1,278 @@
function httpPost(method, args, callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'apache', func:method, args:JSON.stringify(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 httpPluginService(_name, version){
var data = {name:_name, func:'status'}
if ( typeof(version) != 'undefined' ){
data['version'] = version;
} else {
version = '';
}
httpPost('status', data, function(data){
if (data.data == 'start'){
orPluginSetService(_name, true, version);
} else {
orPluginSetService(_name, false, version);
}
});
}
function orPluginSetService(_name ,status, version){
var serviceCon ='<p class="status">当前状态:<span>'+(status ? '开启' : '关闭' )+
'</span><span style="color: '+
(status?'#20a53a;':'red;')+
' margin-left: 3px;" class="glyphicon ' + (status?'glyphicon glyphicon-play':'glyphicon-pause')+'"></span></p><div class="sfm-opt">\
<button class="btn btn-default btn-sm" onclick="orPluginOpService(\''+_name+'\',\''+(status?'stop':'start')+'\',\''+version+'\')">'+(status?'停止':'启动')+'</button>\
<button class="btn btn-default btn-sm" onclick="orPluginOpService(\''+_name+'\',\'restart\',\''+version+'\',\'yes\')">重启</button>\
<button class="btn btn-default btn-sm" onclick="orPluginOpService(\''+_name+'\',\'reload\',\''+version+'\')">重载配置</button>\
</div>';
$(".soft-man-con").html(serviceCon);
}
function orPluginOpService(a, b, v,request_callback) {
var c = "name=" + a + "&func=" + b;
if(v != ''){
c = c + '&version='+v;
}
var d = "";
switch(b) {
case "stop":d = '停止';break;
case "start":d = '启动';break;
case "restart":d = '重启';break;
case "reload":d = '重载';break;
}
layer.confirm( msgTpl('您真的要{1}{2}{3}服务吗?', [d,a,v]), {icon:3,closeBtn: 2}, function() {
httpPost('get_os',{},function(data){
var rdata = $.parseJSON(data.data);
if (!rdata['auth']){
layer.prompt({title: '检查到权限不足,需要输入密码!', formType: 1},function(pwd, index){
layer.close(index);
var data = {'pwd':pwd};
c += '&args='+JSON.stringify(data);
orPluginOpServiceOp(a,b,c,d,a,v,request_callback);
});
} else {
orPluginOpServiceOp(a,b,c,d,a,v,request_callback);
}
});
})
}
function orPluginOpServiceOp(a,b,c,d,a,v,request_callback){
var request_path = "/plugins/run";
if (request_callback == 'yes'){
request_path = "/plugins/callback";
}
var e = layer.msg(msgTpl('正在{1}{2}{3}服务,请稍候...',[d,a,v]), {icon: 16,time: 0});
$.post(request_path, c, function(g) {
layer.close(e);
var f = g.data == 'ok' ? msgTpl('{1}{2}服务已{3}',[a,v,d]) : msgTpl('{1}{2}服务{3}失败!',[a,v,d]);
layer.msg(f, {icon: g.data == 'ok' ? 1 : 2});
if( b != "reload" && g.data == 'ok' ) {
if ( b == 'start' ) {
orPluginSetService(a, true, v);
} else if ( b == 'stop' ){
orPluginSetService(a, false, v);
}
}
if( g.status && g.data != 'ok' ) {
layer.msg(g.data, {icon: 2,time: 10000,shade: 0.3});
}
},'json').error(function() {
layer.close(e);
layer.msg('操作异常!', {icon: 2});
});
}
// 定时器变量
var httpdStatusTimer = null;
//查看Apache负载状态
function getHttpdStatus() {
$.post('/plugins/run', {name:'apache', func:'run_info'}, function(data) {
try {
var rdata = $.parseJSON(data.data);
console.log(rdata);
if ('status' in rdata && !rdata.status){
showMsg(rdata.msg, function(){}, null,3000);
return;
}
var con = "<div><table class='table table-hover table-bordered'>\
<tr><th>服务器版本(ServerVersion)</th><td>" + (rdata.ServerVersion || '-') + "</td></tr>\
<tr><th>服务器MPM(ServerMPM)</th><td>" + (rdata.ServerMPM || '-') + "</td></tr>\
<tr><th>服务器构建时间(Server Built)</th><td>" + (rdata['Server Built'] || '-') + "</td></tr>\
<tr><th>当前时间(CurrentTime)</th><td>" + (rdata.CurrentTime || '-') + "</td></tr>\
<tr><th>重启时间(RestartTime)</th><td>" + (rdata.RestartTime || '-') + "</td></tr>\
<tr><th>服务器运行时间(ServerUptime)</th><td>" + (rdata.ServerUptime || '-') + "</td></tr>\
<tr><th>服务器运行秒数(ServerUptimeSeconds)</th><td>" + (rdata.ServerUptimeSeconds || '-') + "</td></tr>\
<tr><th>1分钟负载(Load1)</th><td>" + (rdata.Load1 || '-') + "</td></tr>\
<tr><th>5分钟负载(Load5)</th><td>" + (rdata.Load5 || '-') + "</td></tr>\
<tr><th>15分钟负载(Load15)</th><td>" + (rdata.Load15 || '-') + "</td></tr>\
<tr><th>总访问次数(Total Accesses)</th><td>" + (rdata['Total Accesses'] || '-') + "</td></tr>\
<tr><th>总流量(Total kBytes)</th><td>" + (rdata['Total kBytes'] || '-') + " KB</td></tr>\
<tr><th>总请求时间(Total Duration)</th><td>" + (rdata['Total Duration'] || '-') + "</td></tr>\
<tr><th>CPU用户时间(CPUUser)</th><td>" + (rdata.CPUUser || '-') + "</td></tr>\
<tr><th>CPU系统时间(CPUSystem)</th><td>" + (rdata.CPUSystem || '-') + "</td></tr>\
<tr><th>CPU负载(CPULoad)</th><td>" + (rdata.CPULoad || '-') + "</td></tr>\
<tr><th>每秒请求数(ReqPerSec)</th><td>" + (rdata.ReqPerSec || '-') + "</td></tr>\
<tr><th>每秒流量(BytesPerSec)</th><td>" + (rdata.BytesPerSec || '-') + "</td></tr>\
<tr><th>每请求流量(BytesPerReq)</th><td>" + (rdata.BytesPerReq || '-') + "</td></tr>\
<tr><th>每请求时间(DurationPerReq)</th><td>" + (rdata.DurationPerReq || '-') + "</td></tr>\
<tr><th>活动工作进程(BusyWorkers)</th><td>" + (rdata.BusyWorkers || '-') + "</td></tr>\
<tr><th>优雅关闭进程(GracefulWorkers)</th><td>" + (rdata.GracefulWorkers || '-') + "</td></tr>\
<tr><th>空闲工作进程(IdleWorkers)</th><td>" + (rdata.IdleWorkers || '-') + "</td></tr>\
<tr><th>进程数(Processes)</th><td>" + (rdata.Processes || '-') + "</td></tr>\
<tr><th>总连接数(ConnsTotal)</th><td>" + (rdata.ConnsTotal || '-') + "</td></tr>\
</table></div>";
$(".soft-man-con").html(con);
}catch(err){
showMsg(data.data, function(){}, null,3000);
}
},'json');
}
// 启动自动刷新
function startHttpdStatusAutoRefresh() {
// 先清除现有的定时器
if (httpdStatusTimer) {
clearInterval(httpdStatusTimer);
}
// 立即执行一次
getHttpdStatus();
// 设置定时器,每5秒刷新一次
httpdStatusTimer = setInterval(getHttpdStatus, 5000);
}
// 停止自动刷新
function stopHttpdStatusAutoRefresh() {
if (httpdStatusTimer) {
clearInterval(httpdStatusTimer);
httpdStatusTimer = null;
}
}
function setOpCfg(){
httpPost('get_cfg', {}, function(data){
var rdata = $.parseJSON(data.data);
var rdata = rdata.data;
// console.log(rdata);
var mlist = '';
for (var i = 0; i < rdata.length; i++) {
var w = '70'
var ibody = '<input style="width: ' + w + 'px;" class="bt-input-text mr5" name="' + rdata[i].name + '" value="' + rdata[i].value + '" type="text" >';
switch (rdata[i].type) {
case 0:
var selected_1 = (rdata[i].value == 1) ? 'selected' : '';
var selected_0 = (rdata[i].value == 0) ? 'selected' : '';
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
<option value="1" ' + selected_1 + '>开启</option>\
<option value="0" ' + selected_0 + '>关闭</option>\
</select>';
break;
case 1:
var selected_1 = (rdata[i].value == 'on') ? 'selected' : '';
var selected_0 = (rdata[i].value == 'off') ? 'selected' : '';
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
<option value="on" ' + selected_1 + '>开启</option>\
<option value="off" ' + selected_0 + '>关闭</option>\
</select>';
break;
}
mlist += '<p style="margin-top:15px;"><span>' + rdata[i].name + '</span>' + ibody + "<b class='unit c9'>"+rdata[i].unit+"</b>" +', <font class="c9">' + rdata[i].ps + '</font></p>';
}
var con = '<style>.conf_p p{margin-bottom: 2px}</style><div class="conf_p" style="margin-bottom:0">\
' + mlist + '\
<div style="margin-top:10px; padding-right:15px" class="text-right">\
<button class="btn btn-success btn-sm mr5" onclick="setOpCfg()">刷新</button>\
<button class="btn btn-success btn-sm" onclick="submitConf()">保存</button>\
</div>\
</div>'
$(".soft-man-con").html(con);
});
}
function submitConf() {
var data = {};
// 收集所有配置参数
$("input[name]").each(function() {
data[$(this).attr('name')] = $(this).val();
});
$("select[name]").each(function() {
data[$(this).attr('name')] = $(this).val() || 'on';
});
// console.log(data);
httpPost('set_cfg', data, function(rdata){
var rdata = $.parseJSON(rdata.data);
// console.log(rdata);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function otherFunc(){
var con = '<p class="conf_p" style="text-align:center;">\
<button class="btn btn-default btn-sm" onclick="cronAddCheck()">添加检查任务</button> \
<button class="btn btn-default btn-sm" onclick="cronDelCheck()">删除检查任务</button>\
</p>';
$(".soft-man-con").html(con);
}
function cronAddCheck(){
httpPost('cron_add_check', {}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function cronDelCheck(){
httpPost('cron_del_check', {}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}

124
plugins/apache/tool_task.py Normal file
View File

@@ -0,0 +1,124 @@
# coding:utf-8
import sys
import io
import os
import time
import json
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
from utils.crontab import crontab as MwCrontab
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'apache'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getTaskConf():
conf = getServerDir() + "/task_config.json"
return conf
def getConfigData():
conf = getTaskConf()
if os.path.exists(conf):
return json.loads(mw.readFile(getTaskConf()))
return {
"task_id": -1,
"period": "minute-n",
"where1": "3",
"hour": "0",
"minute": "0",
}
def createBgTask():
removeBgTask()
createBgTaskByName(getPluginName())
def createBgTaskByName(name):
args = getConfigData()
_name = "[apache]检查任务"
res = mw.M("crontab").field("id, name").where("name=?", (_name,)).find()
if res:
return True
if "task_id" in args and args["task_id"] > 0:
res = mw.M("crontab").field("id, name").where(
"id=?", (args["task_id"],)).find()
if res and res["id"] == args["task_id"]:
print("计划任务已经存在!")
return True
mw_dir = mw.getPanelDir()
cmd = '''
mw_dir=%s
rname=%s
plugin_path=%s
script_path=%s
''' % (mw_dir, name, getServerDir(), getPluginDir())
cmd += 'echo "bash $script_path/check.sh"' + "\n"
cmd += 'cd $mw_dir && bash $script_path/check.sh' + "\n"
params = {
'name': _name,
'type': args['period'],
'week': "",
'where1': args['where1'],
'hour': args['hour'],
'minute': args['minute'],
'save': "",
'backup_to': "",
'stype': "toShell",
'sname': '',
'sbody': cmd,
'url_address': '',
}
task_id = MwCrontab.instance().add(params)
if task_id > 0:
args["task_id"] = task_id
args["name"] = name
mw.writeFile(getTaskConf(), json.dumps(args))
def removeBgTask():
cfg = getConfigData()
if "task_id" in cfg and cfg["task_id"] > 0:
res = mw.M("crontab").field("id, name").where(
"id=?", (cfg["task_id"],)).find()
if res and res["id"] == cfg["task_id"]:
data = MwCrontab.instance().delete(cfg["task_id"])
if data["status"]:
cfg["task_id"] = -1
mw.writeFile(getTaskConf(), json.dumps(cfg))
return True
return False
if __name__ == "__main__":
if len(sys.argv) > 1:
action = sys.argv[1]
if action == "remove":
removeBgTask()
elif action == "add":
createBgTask()

View File

@@ -0,0 +1,172 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/apache && bash install.sh install 2.4
# cd /www/server/mdserver-web/plugins/apache && bash install.sh install 2.4
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
sysName=`uname`
action=$1
type=$2
VERSION=2.4.68
apacheDir=${serverPath}/source/apache
Install_App()
{
if [ "${action}" = "install" ];then
if [ -d $serverPath/apache ];then
exit 0
fi
fi
# ----- 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 ------
mkdir -p ${apacheDir}
echo 'install script ...'
OPTIONS=''
# 安装 APR 和 APR-util
APR_VERSION=1.7.6
APR_UTIL_VERSION=1.6.3
if [ ! -f ${apacheDir}/apr-${APR_VERSION}.tar.bz2 ];then
wget --no-check-certificate -O ${apacheDir}/apr-${APR_VERSION}.tar.bz2 https://downloads.apache.org/apr/apr-${APR_VERSION}.tar.bz2 -T 3
fi
if [ ! -f ${apacheDir}/apr-util-${APR_UTIL_VERSION}.tar.bz2 ];then
wget --no-check-certificate -O ${apacheDir}/apr-util-${APR_UTIL_VERSION}.tar.bz2 https://downloads.apache.org/apr/apr-util-${APR_UTIL_VERSION}.tar.bz2 -T 3
fi
# 安装 APR
if [ ! -d ${serverPath}/apache/apr ];then
cd ${apacheDir} && tar -jxf apr-${APR_VERSION}.tar.bz2
cd ${apacheDir}/apr-${APR_VERSION} && ./configure --prefix=${serverPath}/apache/apr
make -j${cpuCore} && make install
if [ "$?" = "0" ];then
# 检查 APR 配置文件
APR_CONFIG=$(find ${serverPath}/apache/apr -name "apr-*config" | head -1)
if [ -z "$APR_CONFIG" ];then
echo "APR installation failed: apr-config not found"
exit 1
fi
echo "APR installed successfully: $APR_CONFIG"
else
echo "APR configure failed"
exit 1
fi
fi
# 安装 APR-util
if [ ! -d ${serverPath}/apache/apr-util ];then
cd ${apacheDir} && tar -jxf apr-util-${APR_UTIL_VERSION}.tar.bz2
cd ${apacheDir}/apr-util-${APR_UTIL_VERSION} && ./configure --prefix=${serverPath}/apache/apr-util --with-apr=${serverPath}/apache/apr
make -j${cpuCore} && make install
if [ "$?" = "0" ];then
# 检查 APR-util 配置文件
APU_CONFIG=$(find ${serverPath}/apache/apr-util -name "apu-*config" | head -1)
if [ -z "$APU_CONFIG" ];then
echo "APR-util installation failed: apu-config not found"
find ${serverPath}/apache/apr-util -name "apu-*config"
exit 1
fi
echo "APR-util installed successfully: $APU_CONFIG"
else
echo "APR-util configure failed"
exit 1
fi
fi
if [ ! -f ${apacheDir}/httpd-${VERSION}.tar.bz2 ];then
wget --no-check-certificate -O ${apacheDir}/httpd-${VERSION}.tar.bz2 https://downloads.apache.org/httpd/httpd-${VERSION}.tar.bz2 -T 3
fi
if [ ! -d ${apacheDir}/httpd-${VERSION} ];then
cd ${apacheDir} && tar -jxf ${apacheDir}/httpd-${VERSION}.tar.bz2
fi
# 检查 APR 和 APR-util 可执行文件
APR_CONFIG=$(find ${serverPath}/apache/apr -name "apr-*config" | head -1)
APU_CONFIG=$(find ${serverPath}/apache/apr-util -name "apu-*config" | head -1)
if [ -z "$APR_CONFIG" ];then
echo "APR config not found"
exit 1
fi
if [ -z "$APU_CONFIG" ];then
echo "APR-util config not found"
exit 1
fi
OPTIONS="${OPTIONS} --with-apr=$APR_CONFIG"
OPTIONS="${OPTIONS} --with-apr-util=$APU_CONFIG"
# if [ "$sysName" != "Darwin" ];then
# OPTIONS="${OPTIONS} --enable-systemd"
# fi
# echo "cd ${apacheDir}/httpd-${VERSION} && ./configure --prefix=$serverPath/apache $OPTIONS"
cd ${apacheDir}/httpd-${VERSION} && ./configure \
--prefix=$serverPath/apache/httpd \
$OPTIONS
make -j${cpuCore} && make install && make clean
if [ -d ${apacheDir}/apr-${APR_VERSION} ];then
rm -rf ${apacheDir}/apr-${APR_VERSION}
fi
if [ -d ${apacheDir}/apr-util-${APR_UTIL_VERSION} ];then
rm -rf ${apacheDir}/apr-util-${APR_UTIL_VERSION}
fi
if [ -d ${apacheDir}/httpd-${APR_UTIL_VERSION} ];then
rm -rf ${apacheDir}/httpd-${APR_UTIL_VERSION}
fi
echo 'installation of apache completed'
}
Uninstall_App()
{
echo 'uninstalling apache completed'
}
action=$1
if [ "${1}" = "install" ];then
Install_App
elif [ "${1}" = "upgrade" ];then
Install_App
else
Uninstall_App
fi

View File

@@ -14,8 +14,12 @@ import json
import paramiko
import ftplib
sys.path.append(os.getcwd() + "/class/core")
import mw
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
DEBUG = True
BLOCK_SIZE = 1024 * 1024 * 2
@@ -136,7 +140,7 @@ class FtpPSClient:
"database": "db",
"path": "path",
}
file_regx = prefix_dict.get(data_type) + "_(.+)_20\d+_\d+\."
file_regx = prefix_dict.get(data_type) + r"_(.+)_20\d+_\d+\."
sub_search = re.search(file_regx, file_name)
sub_path_name = ""
if sub_search:

View File

@@ -12,19 +12,13 @@ if sys.platform != "darwin":
os.chdir("/www/server/mdserver-web")
sys.path.append(os.getcwd() + "/class/core")
import mw
import db
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
_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')
import core.mw as mw
import core.db as db
app_debug = False
if mw.isAppleSystem():
@@ -77,7 +71,10 @@ def status():
def getConf():
cfg = getServerDir() + "/cfg.json"
if not os.path.exists(cfg):
return mw.returnJson(False, "未配置", [])
rdata = {
'use_sftp':False,
}
return mw.returnJson(False, "未配置", rdata)
data = mw.readFile(cfg)
data = json.loads(data)
return mw.returnJson(True, "OK", data)
@@ -184,7 +181,6 @@ def findPathName(path, filename):
return l
def backupAllFunc(stype):
os.chdir(mw.getRunDir())
name = sys.argv[2]
num = sys.argv[3]
@@ -196,20 +192,15 @@ def backupAllFunc(stype):
}
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()
pid = mw.M('sites').where('name=?', (name,)).getField('id')
backups = mw.M('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()
pid = mw.M('databases').dbPos(db_path, 'mysql').where('name=?', (name,)).getField('id')
backups = mw.M('backup').where('type=? and pid=?', ('1', pid)).field('id,filename').select()
if stype == 'path':
backup_dir = mw.getBackupDir()
backup_path = backup_dir + '/path'
@@ -220,18 +211,15 @@ def backupAllFunc(stype):
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()
pid = mw.M('databases').dbPos(db_path, 'mysql').where('name=?', (name,)).getField('id')
backups = mw.M('backup').where('type=? and pid=?', ('1', pid)).field('id,filename').select()
args = stype + " " + name + " " + num
cmd = 'python3 ' + mw.getRunDir() + '/scripts/backup.py ' + args
cmd = 'python3 ' + mw.getPanelDir() + '/scripts/backup.py ' + args
if stype.find('database_') > -1:
plugin_name = stype.replace('database_', '')
args = "database " + name + " " + num
cmd = 'python3 ' + mw.getRunDir() + '/plugins/' + plugin_name + \
'/scripts/backup.py ' + args
cmd = 'python3 ' + mw.getPanelDir() + '/plugins/' + plugin_name + '/scripts/backup.py ' + args
os.system(cmd)
@@ -251,8 +239,7 @@ def backupAllFunc(stype):
_name = 'path_{}'.format(os.path.basename(name))
find_path = mw.getBackupDir() + '/path/'+_name
find_new_file = "ls " + find_path + \
"_* | grep '.gz' | cut -d \ -f 1 | awk 'END {print}'"
find_new_file = "ls " + find_path + "_* | grep '.gz' | cut -d \\ -f 1 | awk 'END {print}'"
filename = mw.execShell(find_new_file)[0].strip()
if filename == "":

View File

@@ -1,4 +1,5 @@
{
"sort":6,
"title":"FTP存储空间",
"hook":["backup"],
"tip":"soft",
@@ -13,5 +14,5 @@
"author":"midoks",
"home":"https://github.com/midoks/mdserver-web",
"date":"2022-10-23",
"pid": "4"
"pid": "5"
}

View File

@@ -7,7 +7,6 @@ rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl
sys_os=`uname`
@@ -15,7 +14,7 @@ Install_App()
{
mkdir -p ${serverPath}/backup_ftp
echo "${1}" > ${serverPath}/backup_ftp/version.pl
echo '安装完成' > $install_tmp
echo '安装完成'
}
@@ -25,7 +24,7 @@ Uninstall_App()
}
action=$1
if [ "${1}" == 'install' ];then
if [ "${1}" = 'install' ];then
Install_App $2
else
Uninstall_App $2

35
plugins/caddy/check.sh Executable file
View File

@@ -0,0 +1,35 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
# OpenResty服务名称
service_name="caddy"
# 检查OpenResty是否正在运行
if systemctl is-active --quiet "$service_name"; then
# 检查是否存在僵尸进程
zombie_processes=$(ps -ef | grep -i caddy | grep -v grep | awk '{print $2}' | xargs ps -o state= -p 2>/dev/null | grep -c Z)
if [ "$zombie_processes" -gt 0 ]; then
echo "kill caddy 僵尸进程"
ps -ef|grep caddy| grep -v grep| awk '{print $2}' | xargs kill -9
echo "检测到OpenResty僵尸进程,正在重启服务..."
systemctl restart "$service_name"
echo "服务已重启"
else
echo "OpenResty运行正常"
fi
else
echo "kill caddy"
ps -ef|grep caddy| grep -v grep| awk '{print $2}' | xargs kill -9
echo "caddy未运行,正在启动服务..."
systemctl start "$service_name"
echo "服务已启动"
fi
NGINX_IDS=`ps -ef|grep caddy | grep -v grep| awk '{print $2}'`
if [ "$NGINX_IDS" = "" ];then
ps -ef|grep caddy| grep -v grep| awk '{print $2}' | xargs kill -9
systemctl start "$service_name"
echo "caddy未运行,正在启动服务..."
fi

View File

@@ -0,0 +1,13 @@
:8080 {
# Set this path to your site's directory.
root * /tmp
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
}

BIN
plugins/caddy/ico.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

24
plugins/caddy/index.html Executable file
View File

@@ -0,0 +1,24 @@
<div class="bt-form">
<!-- <div class='plugin_version'></div> -->
<div class="bt-w-main">
<div class="bt-w-menu">
<p class="bgw" onclick="orPluginService('caddy',$('.plugin_version').attr('version'));">服务</p>
<p onclick="pluginInitD('caddy', $('.plugin_version').attr('version'));">自启动</p>
<p onclick="pluginConfig('caddy');">配置修改</p>
<p onclick="getOpStatus();">负载状态</p>
<p onclick="setOpCfg();">性能调整</p>
<p onclick="pluginLogs('caddy');">错误日志</p>
<p onclick="otherFunc();">维护功能</p>
</div>
<div class="bt-w-con pd15">
<div class="soft-man-con"></div>
</div>
</div>
</div>
<script type="text/javascript">
$.getScript( "/plugins/file?name=caddy&f=js/caddy.js", function(){
orPluginService('caddy');
});
</script>

445
plugins/caddy/index.py Executable file
View File

@@ -0,0 +1,445 @@
# coding:utf-8
import sys
import io
import os
import time
import threading
import subprocess
import re
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'caddy'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getInitDFile():
current_os = mw.getOs()
if current_os == 'darwin':
return '/tmp/' + getPluginName()
if current_os.startswith('freebsd'):
return '/etc/rc.d/' + getPluginName()
return '/etc/init.d/' + getPluginName()
def getArgs():
args = sys.argv[2:]
# print(args)
tmp = {}
args_len = len(args)
if args_len == 1:
t = args[0].strip('{').strip('}')
t = t.split(':',2)
tmp[t[0]] = t[1]
elif args_len > 1:
for i in range(len(args)):
t = args[i].split(':',2)
tmp[t[0]] = t[1]
# print(tmp)
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 getOs():
data = {}
data['os'] = mw.getOs()
data['auth'] = True
return mw.getJson(data)
def getConf():
path = getServerDir() + "/Caddyfile"
return path
def getConfTpl():
path = getPluginDir() + '/conf/Caddyfile'
return path
def getInitDTpl():
path = getPluginDir() + "/init.d/caddy.tpl"
return path
def initDreplace():
file_tpl = getInitDTpl()
service_path = mw.getServerDir()
initD_path = getServerDir() + '/init.d'
# init.d
file_bin = initD_path + '/' + getPluginName()
if not os.path.exists(initD_path):
os.mkdir(initD_path)
# initd replace
content = mw.readFile(file_tpl)
content = content.replace('{$SERVER_PATH}', service_path)
mw.writeFile(file_bin, content)
mw.execShell('chmod +x ' + file_bin)
caddy_file = getConf()
if not os.path.exists(caddy_file):
caddy_file_tpl = getConfTpl()
content = mw.readFile(caddy_file_tpl)
content = content.replace('{$SERVER_PATH}', service_path)
mw.writeFile(caddy_file, content)
# systemd
# /usr/lib/systemd/system
systemDir = mw.systemdCfgDir()
systemService = systemDir + '/caddy.service'
if os.path.exists(systemDir) and not os.path.exists(systemService):
systemServiceTpl = getPluginDir() + '/init.d/caddy.service.tpl'
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
def status():
cmd = "ps -ef|grep 'caddy run' |grep -v grep | grep -v python | awk '{print $2}'"
data = mw.execShell(cmd)
if data[0] == '':
return 'stop'
return 'start'
def caddyOp(method):
file = initDreplace()
current_os = mw.getOs()
if current_os == "darwin":
data = mw.execShell(file + ' ' + method)
if data[1] == '':
return 'ok'
return data[1]
if current_os.startswith("freebsd"):
data = mw.execShell('service caddy ' + method)
if data[1] == '':
return 'ok'
return data[1]
data = mw.execShell('systemctl ' + method + ' caddy')
if data[1] == '':
return 'ok'
return data[1]
def start():
return caddyOp('start')
def stop():
r = caddyOp('stop')
return r
def restart():
return restyOp_restart()
def reload():
confReplace()
return caddyOp('reload')
def initdStatus():
current_os = mw.getOs()
if current_os == 'darwin':
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 caddy | grep loaded | grep "enabled;"'
data = mw.execShell(shell_cmd)
if data[0] == '':
return 'fail'
return 'ok'
def initdInstall():
current_os = mw.getOs()
if current_os == 'darwin':
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 caddy')
return 'ok'
def initdUinstall():
current_os = mw.getOs()
if current_os == 'darwin':
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 caddy')
return 'ok'
def runInfo():
op_status = status()
if op_status == 'stop':
return mw.returnJson(False, "未启动!")
def errorLogPath():
return getServerDir() + '/nginx/logs/error.log'
def getCfg():
cfg = getConf()
content = mw.readFile(cfg)
unitrep = "[kmgKMG]"
cfg_args = [
{"name": "worker_processes", "ps": "处理进程,auto表示自动,数字表示进程数", 'type': 2},
{"name": "worker_connections", "ps": "最大并发链接数", 'type': 2},
{"name": "keepalive_timeout", "ps": "连接超时时间", 'type': 2},
{"name": "zstd", "ps": "是否开启zstd压缩传输", 'type': 1},
{"name": "brotli", "ps": "是否开启brotli压缩传输", 'type': 1},
{"name": "gzip", "ps": "是否开启gzip压缩传输", 'type': 1},
{"name": "gzip_min_length", "ps": "最小压缩文件", 'type': 2},
{"name": "gzip_comp_level", "ps": "压缩率", 'type': 2},
{"name": "client_max_body_size", "ps": "最大上传文件", 'type': 2},
{"name": "server_names_hash_bucket_size",
"ps": "服务器名字的hash表大小", 'type': 2},
{"name": "client_header_buffer_size", "ps": "客户端请求头buffer大小", 'type': 2},
]
# {"name": "client_body_buffer_size", "ps": "请求主体缓冲区"}
rdata = []
for i in cfg_args:
rep = r"(%s)\s+(\w+)" % i["name"]
k = re.search(rep, content)
if not k:
return mw.returnJson(False, "获取 key {} 失败".format(k))
k = k.group(1)
v = re.search(rep, content)
if not v:
return mw.returnJson(False, "获取 value {} 失败".format(v))
v = v.group(2)
if re.search(unitrep, v):
u = str.upper(v[-1])
v = v[:-1]
if len(u) == 1:
psstr = u + "B," + i["ps"]
else:
psstr = u + "," + i["ps"]
else:
u = ""
kv = {"name": k, "value": v, "unit": u,
"ps": i["ps"], "type": i["type"]}
rdata.append(kv)
return mw.returnJson(True, "ok", rdata)
def replaceChar(value, index, new_char):
return value[:index] + new_char + value[index+1:]
def makeWorkerCpuAffinity(val):
if val == "auto":
return "auto"
if mw.isNumber(val):
core_num = int(val)
default_core_str = "0"*core_num
core_num_arr = []
for x in range(core_num):
t = replaceChar(default_core_str, x , "1")
core_num_arr.append(t)
return " ".join(core_num_arr)
return 'auto'
def setCfg():
args = getArgs()
data = checkArgs(args, [
'worker_processes', 'worker_connections', 'keepalive_timeout','zstd','brotli',
'gzip', 'gzip_min_length', 'gzip_comp_level', 'client_max_body_size',
'server_names_hash_bucket_size', 'client_header_buffer_size'
])
if not data[0]:
return data[1]
cfg = getConf()
mw.backFile(cfg)
content = mw.readFile(cfg)
unitrep = "[kmgKMG]"
cfg_args = [
{"name": "worker_processes", "ps": "处理进程,auto表示自动,数字表示进程数", 'type': 2},
{"name": "worker_connections", "ps": "最大并发链接数", 'type': 2},
{"name": "keepalive_timeout", "ps": "连接超时时间", 'type': 2},
{"name": "zstd", "ps": "是否开启zstd压缩传输", 'type': 1},
{"name": "brotli", "ps": "是否开启brotli压缩传输", 'type': 1},
{"name": "gzip", "ps": "是否开启压缩传输", 'type': 1},
{"name": "gzip_min_length", "ps": "最小压缩文件", 'type': 2},
{"name": "gzip_comp_level", "ps": "压缩率", 'type': 2},
{"name": "client_max_body_size", "ps": "最大上传文件", 'type': 2},
{"name": "server_names_hash_bucket_size",
"ps": "服务器名字的hash表大小", 'type': 2},
{"name": "client_header_buffer_size", "ps": "客户端请求头buffer大小", 'type': 2},
]
# print(args)
for k, v in args.items():
# print(k, v)
rep = r"%s\s+[^kKmMgG\;\n]+" % k
if k == "worker_processes" or k == "gzip":
if not re.search(r"auto|on|off|\d+", v):
return mw.returnJson(False, '参数值错误')
elif k == "zstd" or k == "brotli":
if not re.search(r"auto|on|off|\d+", v):
return mw.returnJson(False, '参数值错误')
else:
if not re.search(r"\d+", v):
return mw.returnJson(False, '参数值错误,请输入数字整数')
if k == "worker_processes" :
k_wca = "worker_cpu_affinity"
rep_wca = r"%s\s+[^\;\n]+" % k_wca
v_wca = makeWorkerCpuAffinity(v)
newconf = "%s %s" % (k_wca, v_wca)
content = re.sub(rep_wca, newconf, content)
if re.search(rep, content):
newconf = "%s %s" % (k, v)
content = re.sub(rep, newconf, content)
elif re.search(rep, content):
newconf = "%s %s" % (k, v)
content = re.sub(rep, newconf, content)
mw.writeFile(cfg, content)
isError = mw.checkWebConfig()
if (isError != True):
mw.restoreFile(cfg)
return mw.returnJson(False, 'ERROR: 配置出错<br><a style="color:red;">' + isError.replace("\n", '<br>') + '</a>')
mw.restartWeb()
return mw.returnJson(True, '设置成功')
def cronAddCheck():
try:
import tool_task
tool_task.createBgTask()
return mw.returnJson(True, '添加检查任务成功')
except Exception as e:
return mw.returnJson(False, '添加检查任务失败:'+str(e))
def cronDelCheck():
try:
import tool_task
tool_task.removeBgTask()
return mw.returnJson(True, '删除检查任务成功')
except Exception as e:
return mw.returnJson(False, '删除检查任务失败:'+str(e))
def cronCheck():
return 'ok'
def installPreInspection():
return 'ok'
if __name__ == "__main__":
version = '1.27.1'
version_pl = getServerDir() + "/version.pl"
if os.path.exists(version_pl):
version = mw.readFile(version_pl)
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 == 'install_pre_inspection':
print(installPreInspection())
elif func == 'conf':
print(getConf())
elif func == 'get_os':
print(getOs())
elif func == 'run_info':
print(runInfo())
elif func == 'error_log':
print(errorLogPath())
elif func == 'get_cfg':
print(getCfg())
elif func == 'set_cfg':
print(setCfg())
elif func == 'check':
print(cronCheck())
elif func == 'cron_add_check':
print(cronAddCheck())
elif func == 'cron_del_check':
print(cronDelCheck())
else:
print('error')

18
plugins/caddy/info.json Executable file
View File

@@ -0,0 +1,18 @@
{
"sort": 0,
"title":"caddy",
"tip":"soft",
"name":"caddy",
"type":"其他插件",
"ps":"一款功能强大、企业级、开源 Web 服务器,具有用 Go 编写的自动 HTTPS",
"shell":"install.sh",
"install_pre_inspection":true,
"checks":"server/caddy",
"path":"server/caddy",
"author":"caddyserver",
"home":"https://caddyserver.com/",
"date":"2026-04-11",
"pid": "1",
"versions": ["2.11"],
"updates": ["2.11.2"]
}

View File

@@ -0,0 +1,36 @@
# caddy.service
#
# For using Caddy with a config file.
#
# Make sure the ExecStart and ExecReload commands are correct
# for your installation.
#
# See https://caddyserver.com/docs/install for instructions.
#
# WARNING: This service does not use the --resume flag, so if you
# use the API to make changes, they will be overwritten by the
# Caddyfile next time the service is restarted. If you intend to
# use Caddy's API to configure it, add the --resume flag to the
# `caddy run` command or use the caddy-api.service file instead.
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=simple
User=www
Group=www
ExecStart={$SERVER_PATH}/caddy/bin/caddy run --environ --config {$SERVER_PATH}/caddy/Caddyfile
ExecReload={$SERVER_PATH}/caddy/bin/caddy reload --config {$SERVER_PATH}/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,111 @@
#!/bin/sh
#
# /etc/rc.d/init.d/caddy
#
# Runs the caddy
#
#
# chkconfig: - 85 15
#
### BEGIN INIT INFO
# Provides: caddy
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: caddy
# Should-Stop: caddy
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start caddy at boot time.
# Description: Control caddy.
### END INIT INFO
# Source function library.
if [ -f /etc/init.d/functions ];then
. /etc/init.d/functions
fi
if [ -f /etc/rc.d/init.d/functions ];then
. /etc/rc.d/init.d/functions
fi
# Default values
export HOME={$HOME_DIR}
export USER={$RUN_USER}
NAME=caddy
CADDY_HOME={$SERVER_PATH}/caddy
CADDY_PATH=${CADDY_HOME}/bin/$NAME
CADDY_USER={$RUN_USER}
SERVICENAME="caddy"
LOCKFILE=/tmp/caddy.lock
LOGPATH=${CADDY_HOME}/log
LOGFILE=${LOGPATH}/caddy.log
RETVAL=0
if [ -d $LOGPATH ];then
mkdir -p $LOGPATH
fi
[ -r /etc/sysconfig/$NAME ] && . /etc/sysconfig/$NAME
DAEMON_OPTS="--check $NAME"
[ ! -z "$CADDY_USER" ] && DAEMON_OPTS="$DAEMON_OPTS --user=${CADDY_USER}"
status(){
isStart=`ps -ef|grep 'caddy run' |grep -v grep|awk '{print $2}'`
if [ "$isStart" == '' ];then
echo -e "${SERVICENAME} not running"
else
echo -e "${SERVICENAME}(pid $(echo $isStart)) already running"
fi
}
start() {
isStart=`ps -ef | grep 'caddy run' | grep -v grep | awk '{print $2}'`
if [ "$isStart" != '' ];then
echo "${SERVICENAME}(pid $(echo $isStart)) already running"
return $RETVAL
fi
cd ${CADDY_HOME}
echo -e "starting ${SERVICENAME}: \c"
${CADDY_PATH} run --environ --config ${CADDY_HOME}/Caddyfile > ${LOGFILE} 2>&1 &
RETVAL=$?
[ $RETVAL = 0 ] && touch ${LOCKFILE} && echo -e "\033[32mdone\033[0m"
return $RETVAL
}
stop() {
pids=`ps -ef | grep 'caddy run' | grep -v grep | awk '{print $2}'`
arr=($pids)
echo -e "stopping caddy... \c"
for p in ${arr[@]}
do
kill -9 $p
done
echo -e "\033[32mdone\033[0m"
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
reload)
stop
start
;;
*)
echo "Usage: ${NAME} {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL

76
plugins/caddy/install.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/caddy && bash install.sh install 1.21.4
# cd /www/server/mdserver-web/plugins/caddy && bash install.sh install 2.11
# cd /www/server/mdserver-web/plugins/caddy && bash install.sh install 1.29.2
# cd /www/server/mdserver-web/plugins/caddy && bash install.sh upgrade 1.29.2
# curl -I -H "Accept-Encoding: br" http://localhost
# curl -I -H "Accept-Encoding: zstd" http://localhost
# curl --http3 -v https://www.xxx.com
# cd /www/server/mdserver-web && python3 plugins/caddy/index.py run_info
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
sysName=`uname`
action=$1
type=$2
VERSION=$2
openrestyDir=${serverPath}/source/caddy
if id www &> /dev/null ;then
echo "www uid is `id -u www`"
echo "www shell is `grep "^www:" /etc/passwd |cut -d':' -f7 `"
else
groupadd www
useradd -g www -s /bin/bash www
fi
if [ "${action}" = "upgrade" ];then
sh -x $curPath/versions/$2/install.sh $1
echo "${VERSION}" > $serverPath/caddy/version.pl
#初始化
cd ${rootPath} && python3 ${rootPath}/plugins/caddy/index.py start
cd ${rootPath} && python3 ${rootPath}/plugins/caddy/index.py initd_install
exit 0
fi
if [ "${2}" = "" ];then
echo '缺少安装脚本版本...'
exit 0
fi
if [ "${action}" = "uninstall" ];then
if [ -f /usr/lib/systemd/system/caddy.service ] || [ -f /lib/systemd/system/caddy.service ];then
systemctl stop caddy
rm -rf /usr/systemd/system/caddy.service
rm -rf /lib/systemd/system/caddy.service
systemctl daemon-reload
fi
if [ -f $serverPath/caddy/init.d/caddy ];then
$serverPath/caddy/init.d/caddy stop
fi
rm -rf $serverPath/caddy
fi
sh -x $curPath/versions/$2/install.sh $1
if [ "${action}" = "install" ] && [ -d $serverPath/caddy ];then
echo "${VERSION}" > $serverPath/caddy/version.pl
#初始化
cd ${rootPath} && python3 ${rootPath}/plugins/caddy/index.py start
cd ${rootPath} && python3 ${rootPath}/plugins/caddy/index.py initd_install
fi

238
plugins/caddy/js/caddy.js Executable file
View File

@@ -0,0 +1,238 @@
function caddyPost(method, args, callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'caddy', func:method, args:JSON.stringify(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 orPluginService(_name, version){
var data = {name:_name, func:'status'}
if ( typeof(version) != 'undefined' ){
data['version'] = version;
} else {
version = '';
}
caddyPost('status', data, function(data){
if (data.data == 'start'){
orPluginSetService(_name, true, version);
} else {
orPluginSetService(_name, false, version);
}
});
}
function orPluginSetService(_name ,status, version){
var serviceCon ='<p class="status">当前状态:<span>'+(status ? '开启' : '关闭' )+
'</span><span style="color: '+
(status?'#20a53a;':'red;')+
' margin-left: 3px;" class="glyphicon ' + (status?'glyphicon glyphicon-play':'glyphicon-pause')+'"></span></p><div class="sfm-opt">\
<button class="btn btn-default btn-sm" onclick="orPluginOpService(\''+_name+'\',\''+(status?'stop':'start')+'\',\''+version+'\')">'+(status?'停止':'启动')+'</button>\
<button class="btn btn-default btn-sm" onclick="orPluginOpService(\''+_name+'\',\'restart\',\''+version+'\',\'yes\')">重启</button>\
<button class="btn btn-default btn-sm" onclick="orPluginOpService(\''+_name+'\',\'reload\',\''+version+'\')">重载配置</button>\
</div>';
$(".soft-man-con").html(serviceCon);
}
function orPluginOpService(a, b, v,request_callback) {
var c = "name=" + a + "&func=" + b;
if(v != ''){
c = c + '&version='+v;
}
var d = "";
switch(b) {
case "stop":d = '停止';break;
case "start":d = '启动';break;
case "restart":d = '重启';break;
case "reload":d = '重载';break;
}
layer.confirm( msgTpl('您真的要{1}{2}{3}服务吗?', [d,a,v]), {icon:3,closeBtn: 2}, function() {
caddyPost('get_os',{},function(data){
var rdata = $.parseJSON(data.data);
if (!rdata['auth']){
layer.prompt({title: '检查到权限不足,需要输入密码!', formType: 1},function(pwd, index){
layer.close(index);
var data = {'pwd':pwd};
c += '&args='+JSON.stringify(data);
orPluginOpServiceOp(a,b,c,d,a,v,request_callback);
});
} else {
orPluginOpServiceOp(a,b,c,d,a,v,request_callback);
}
});
})
}
function orPluginOpServiceOp(a,b,c,d,a,v,request_callback){
var request_path = "/plugins/run";
if (request_callback == 'yes'){
request_path = "/plugins/callback";
}
var e = layer.msg(msgTpl('正在{1}{2}{3}服务,请稍候...',[d,a,v]), {icon: 16,time: 0});
$.post(request_path, c, function(g) {
layer.close(e);
var f = g.data == 'ok' ? msgTpl('{1}{2}服务已{3}',[a,v,d]) : msgTpl('{1}{2}服务{3}失败!',[a,v,d]);
layer.msg(f, {icon: g.data == 'ok' ? 1 : 2});
if( b != "reload" && g.data == 'ok' ) {
if ( b == 'start' ) {
orPluginSetService(a, true, v);
} else if ( b == 'stop' ){
orPluginSetService(a, false, v);
}
}
if( g.status && g.data != 'ok' ) {
layer.msg(g.data, {icon: 2,time: 10000,shade: 0.3});
}
},'json').error(function() {
layer.close(e);
layer.msg('操作异常!', {icon: 2});
});
}
//查看Nginx负载状态
function getOpStatus() {
var loadT = layer.msg('正在处理,请稍后...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'openresty', func:'run_info'}, function(data) {
layer.close(loadT);
try {
var rdata = $.parseJSON(data.data);
if ('status' in rdata && !rdata.status){
showMsg(rdata.msg, function(){}, null,3000);
return;
}
var con = "<div><table class='table table-hover table-bordered'>\
<tr><th>活动连接(Active connections)</th><td>" + rdata.active + "</td></tr>\
<tr><th>总连接次数(accepts)</th><td>" + rdata.accepts + "</td></tr>\
<tr><th>总握手次数(handled)</th><td>" + rdata.handled + "</td></tr>\
<tr><th>总请求数(requests)</th><td>" + rdata.requests + "</td></tr>\
<tr><th>请求数(Reading)</th><td>" + rdata.Reading + "</td></tr>\
<tr><th>响应数(Writing)</th><td>" + rdata.Writing + "</td></tr>\
<tr><th>驻留进程(Waiting)</th><td>" + rdata.Waiting + "</td></tr>\
</table></div>";
$(".soft-man-con").html(con);
}catch(err){
showMsg(data.data, function(){}, null,3000);
}
},'json');
}
function setOpCfg(){
caddyPost('get_cfg', {}, function(data){
var rdata = $.parseJSON(data.data);
var rdata = rdata.data;
// console.log(rdata);
var mlist = '';
for (var i = 0; i < rdata.length; i++) {
var w = '70'
var ibody = '<input style="width: ' + w + 'px;" class="bt-input-text mr5" name="' + rdata[i].name + '" value="' + rdata[i].value + '" type="text" >';
switch (rdata[i].type) {
case 0:
var selected_1 = (rdata[i].value == 1) ? 'selected' : '';
var selected_0 = (rdata[i].value == 0) ? 'selected' : '';
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
<option value="1" ' + selected_1 + '>开启</option>\
<option value="0" ' + selected_0 + '>关闭</option>\
</select>';
break;
case 1:
var selected_1 = (rdata[i].value == 'on') ? 'selected' : '';
var selected_0 = (rdata[i].value == 'off') ? 'selected' : '';
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
<option value="on" ' + selected_1 + '>开启</option>\
<option value="off" ' + selected_0 + '>关闭</option>\
</select>';
break;
}
mlist += '<p style="margin-top:15px;"><span>' + rdata[i].name + '</span>' + ibody + "<b class='unit c9'>"+rdata[i].unit+"</b>" +', <font class="c9">' + rdata[i].ps + '</font></p>';
}
var con = '<style>.conf_p p{margin-bottom: 2px}</style><div class="conf_p" style="margin-bottom:0">\
' + mlist + '\
<div style="margin-top:10px; padding-right:15px" class="text-right">\
<button class="btn btn-success btn-sm mr5" onclick="setOpCfg()">刷新</button>\
<button class="btn btn-success btn-sm" onclick="submitConf()">保存</button>\
</div>\
</div>'
$(".soft-man-con").html(con);
});
}
function submitConf() {
var data = {
worker_processes: $("input[name='worker_processes']").val(),
worker_connections: $("input[name='worker_connections']").val(),
keepalive_timeout: $("input[name='keepalive_timeout']").val(),
zstd: $("select[name='zstd']").val() || 'on',
brotli: $("select[name='brotli']").val() || 'on',
gzip: $("select[name='gzip']").val() || 'on',
gzip_min_length: $("input[name='gzip_min_length']").val(),
gzip_comp_level: $("input[name='gzip_comp_level']").val(),
client_max_body_size: $("input[name='client_max_body_size']").val(),
server_names_hash_bucket_size: $("input[name='server_names_hash_bucket_size']").val(),
client_header_buffer_size: $("input[name='client_header_buffer_size']").val(),
};
// console.log(data);
caddyPost('set_cfg', data, function(rdata){
var rdata = $.parseJSON(rdata.data);
// console.log(rdata);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function otherFunc(){
var con = '<p class="conf_p" style="text-align:center;">\
<button class="btn btn-default btn-sm" onclick="cronAddCheck()">添加检查任务</button> \
<button class="btn btn-default btn-sm" onclick="cronDelCheck()">删除检查任务</button>\
</p>';
$(".soft-man-con").html(con);
}
function cronAddCheck(){
caddyPost('cron_add_check', {}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function cronDelCheck(){
caddyPost('cron_del_check', {}, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}

124
plugins/caddy/tool_task.py Normal file
View File

@@ -0,0 +1,124 @@
# coding:utf-8
import sys
import io
import os
import time
import json
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
from utils.crontab import crontab as MwCrontab
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'caddy'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getTaskConf():
conf = getServerDir() + "/task_config.json"
return conf
def getConfigData():
conf = getTaskConf()
if os.path.exists(conf):
return json.loads(mw.readFile(getTaskConf()))
return {
"task_id": -1,
"period": "minute-n",
"where1": "3",
"hour": "0",
"minute": "0",
}
def createBgTask():
removeBgTask()
createBgTaskByName(getPluginName())
def createBgTaskByName(name):
args = getConfigData()
_name = "[caddy]检查任务"
res = mw.M("crontab").field("id, name").where("name=?", (_name,)).find()
if res:
return True
if "task_id" in args and args["task_id"] > 0:
res = mw.M("crontab").field("id, name").where(
"id=?", (args["task_id"],)).find()
if res and res["id"] == args["task_id"]:
print("计划任务已经存在!")
return True
mw_dir = mw.getPanelDir()
cmd = '''
mw_dir=%s
rname=%s
plugin_path=%s
script_path=%s
''' % (mw_dir, name, getServerDir(), getPluginDir())
cmd += 'echo "bash $script_path/check.sh"' + "\n"
cmd += 'cd $mw_dir && bash $script_path/check.sh' + "\n"
params = {
'name': _name,
'type': args['period'],
'week': "",
'where1': args['where1'],
'hour': args['hour'],
'minute': args['minute'],
'save': "",
'backup_to': "",
'stype': "toShell",
'sname': '',
'sbody': cmd,
'url_address': '',
}
task_id = MwCrontab.instance().add(params)
if task_id > 0:
args["task_id"] = task_id
args["name"] = name
mw.writeFile(getTaskConf(), json.dumps(args))
def removeBgTask():
cfg = getConfigData()
if "task_id" in cfg and cfg["task_id"] > 0:
res = mw.M("crontab").field("id, name").where(
"id=?", (cfg["task_id"],)).find()
if res and res["id"] == cfg["task_id"]:
data = MwCrontab.instance().delete(cfg["task_id"])
if data["status"]:
cfg["task_id"] = -1
mw.writeFile(getTaskConf(), json.dumps(cfg))
return True
return False
if __name__ == "__main__":
if len(sys.argv) > 1:
action = sys.argv[1]
if action == "remove":
removeBgTask()
elif action == "add":
createBgTask()

View File

@@ -0,0 +1,88 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/caddy && bash install.sh install 2.11
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/caddy && bash install.sh upgrade 2.11
# cd /www/server/mdserver-web/plugins/caddy && bash install.sh install 2.11
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
sysName=`uname`
action=$1
type=$2
OS=`uname`
OSNAME=''
case $(uname) in
Darwin) OSNAME="mac" ;;
Linux) OSNAME="linux" ;;
esac
ARCH=`uname -m`
ARCH_NAME=''
case $(uname -m) in
i386) ARCH_NAME="386" ;;
i686) ARCH_NAME="386" ;;
x86_64) ARCH_NAME="amd64" ;;
arm) ARCH_NAME="arm64" ;;
arm64) ARCH_NAME="arm64" ;;
aarch64) ARCH_NAME="arm64" ;;
esac
VERSION=2.11.2
caddyDir=${serverPath}/source/caddy
Install_App()
{
if [ "${action}" = "install" ];then
if [ -d $serverPath/caddy ];then
exit 0
fi
fi
mkdir -p ${caddyDir}
# mkdir -p ${serverPath}/caddy
echo 'install scripts ...'
FILE_NAME="caddy_${VERSION}_${OSNAME}_${ARCH_NAME}.tar.gz"
if [ ! -f ${caddyDir}/${FILE_NAME} ];then
wget --no-check-certificate -O ${caddyDir}/${FILE_NAME} "https://github.com/caddyserver/caddy/releases/download/v${VERSION}/${FILE_NAME}"
fi
echo "cd $serverPath/source/caddy/caddy && tar -zxvf ${caddyDir}/$FILE_NAME"
mkdir -p cd $serverPath/source/caddy/caddy
cd $serverPath/source/caddy/caddy && tar -zxvf ${caddyDir}/$FILE_NAME
if [ "$OSNAME" = "mac" ];then
xattr -cr caddy
fi
if [ ! -f $serverPath/caddy/bin ];then
mkdir -p $serverPath/caddy/bin
mv $serverPath/source/caddy/caddy/* $serverPath/caddy/bin
chmod +x $serverPath/caddy/bin/caddy
fi
echo 'Installation of caddy completed'
}
Uninstall_App()
{
echo 'Uninstalling caddy completed'
}
action=$1
if [ "${1}" = "install" ];then
Install_App
elif [ "${1}" = "upgrade" ];then
Install_App
else
Uninstall_App
fi

View File

@@ -5,8 +5,12 @@ import io
import os
import time
sys.path.append(os.getcwd() + "/class/core")
import mw
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
app_debug = False
if mw.isAppleSystem():
@@ -85,6 +89,11 @@ def initConf():
"/var/log/messages.*",
"/var/log/debug.*",
"/var/log/syslog.*",
"/var/log/syslog",
"/var/log/mail.*",
"/var/log/mail.err.*",
"/var/log/mail.info.*",
"/var/log/mail.warn.*",
"/var/log/btmp.*",
"/var/log/sa/sa*",
"/var/log/sysstat/sa*",
@@ -127,11 +136,13 @@ def initConf():
"/var/log/wtmp",
"/var/log/secure",
"/var/log/lastlog",
"/var/log/syslog",
"/var/log/cron",
"/www/wwwlogs",
"/www/server/rsyncd",
"/www/server/acme_pandominassl_apply",
"/www/server/sphinx/index",
"/www/server/manticoresearch",
"/www/server/mongodb/logs",
"/www/server/php/53/var/log",
"/www/server/php/54/var/log",
@@ -147,17 +158,21 @@ def initConf():
"/www/server/php/82/var/log",
"/www/server/php/83/var/log",
"/www/server/php/84/var/log",
"/www/server/php/85/var/log",
"/www/server/openresty/nginx/logs",
"/www/server/phpmyadmin",
"/www/server/apache/httpd/logs",
"/www/server/redis/data",
"/www/server/alist/data/log",
"/www/server/dztasks/logs",
"/www/server/cron",
"/www/server/rsyncd/lsyncd.log",
"/www/server/mdserver-web/logs",
]
for i in clogcom:
if os.path.exists(i):
content += i + "\n"
content += "/www/server/cron\n"
# 清理日志
rootDir = "/var/log"
@@ -237,7 +252,7 @@ def cleanDirLog(path):
def cleanRun():
plugin_dir = getPluginDir()
log_file = getServerDir()+'/clean.log'
cmd = 'python3 '+plugin_dir+'/index.py clean > '+log_file
cmd = 'cd '+mw.getPanelDir()+' && python3 '+plugin_dir+'/index.py clean > '+log_file
os.system(cmd)
return mw.returnJson(True, '执行成功!')

View File

@@ -1,4 +1,5 @@
{
"sort":2,
"title":"日志清理",
"tip":"soft",
"name":"clean",

View File

@@ -10,33 +10,32 @@ 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
. ${rootPath}/bin/activate
fi
Install_app()
{
echo '正在安装脚本文件...' > $install_tmp
echo '正在安装脚本文件...'
mkdir -p $serverPath/clean
cd ${rootPath} && python3 ${rootPath}/plugins/clean/index.py start
echo "${VERSION}" > $serverPath/clean/version.pl
echo '安装完成' > $install_tmp
echo '安装完成'
}
Uninstall_app()
{
cd ${rootPath} && python3 ${rootPath}/plugins/clean/index.py stop
rm -rf $serverPath/clean
echo "Uninstall_clean" > $install_tmp
echo "Uninstall_clean"
}
action=$1
if [ "${1}" == 'install' ];then
if [ "${1}" = 'install' ];then
Install_app
else
Uninstall_app

View File

@@ -6,8 +6,13 @@ import os
import time
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
from utils.crontab import crontab as MwCrontab
app_debug = False
@@ -33,10 +38,9 @@ def getTaskConf():
def getConfigData():
try:
conf = getTaskConf()
if os.path.exists(conf):
return json.loads(mw.readFile(getTaskConf()))
except:
pass
return {
"task_id": -1,
"period": "day-n",
@@ -64,10 +68,8 @@ def createBgTaskByName(name):
if res and res["id"] == args["task_id"]:
print("计划任务已经存在!")
return True
import crontab_api
api = crontab_api.crontab_api()
mw_dir = mw.getRunDir()
mw_dir = mw.getPanelDir()
cmd = '''
mw_dir=%s
rname=%s
@@ -94,10 +96,10 @@ logs_file=$plugin_path/${rname}.log
'stype': "toShell",
'sname': '',
'sbody': cmd,
'urladdress': '',
'url_address': '',
}
task_id = api.add(params)
task_id = MwCrontab.instance().add(params)
if task_id > 0:
args["task_id"] = task_id
args["name"] = name
@@ -110,10 +112,8 @@ def removeBgTask():
res = mw.M("crontab").field("id, name").where(
"id=?", (cfg["task_id"],)).find()
if res and res["id"] == cfg["task_id"]:
import crontab_api
api = crontab_api.crontab_api()
data = api.delete(cfg["task_id"])
if data[0]:
data = MwCrontab.instance().delete(cfg["task_id"])
if data["status"]:
cfg["task_id"] = -1
mw.writeFile(getTaskConf(), json.dumps(cfg))
return True

View File

@@ -6,8 +6,12 @@ import os
import time
import re
sys.path.append(os.getcwd() + "/class/core")
import mw
web_dir = os.getcwd() + "/web"
if os.path.exists(web_dir):
sys.path.append(web_dir)
os.chdir(web_dir)
import core.mw as mw
app_debug = False
if mw.isAppleSystem():
@@ -95,7 +99,7 @@ def readConfigTpl():
def status():
data = mw.execShell(
"ps aux|grep cloudreve |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
"ps -ef|grep cloudreve |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
if data[0] == '':
return 'stop'
@@ -103,7 +107,7 @@ def status():
def contentReplace(content):
service_path = mw.getServerDir()
content = content.replace('{$ROOT_PATH}', mw.getRootDir())
content = content.replace('{$ROOT_PATH}', mw.getFatherDir())
content = content.replace('{$SERVER_PATH}', service_path)
content = content.replace('{$SERVER_APP}', service_path + '/'+getPluginName())
return content
@@ -111,7 +115,7 @@ def contentReplace(content):
def initDreplace():
file_tpl = getInitDTpl()
service_path = os.path.dirname(os.getcwd())
service_path = mw.getServerDir()
initD_path = getServerDir() + '/init.d'
if not os.path.exists(initD_path):

View File

@@ -10,23 +10,22 @@ serverPath=$(dirname "$rootPath")
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/cloudreve && bash install.sh install 3.8.3
# cd /www/server/mdserver-web/plugins/cloudreve && bash install.sh install 3.8.3
install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=$2
sysArch=`arch`
sysName=`uname`
ALIST_ARCH_NAME=amd64
if [ "$sysArch" == "arm64" ];then
if [ "$sysArch" = "arm64" ];then
ALIST_ARCH_NAME=arm64
elif [ "$sysArch" == "x86_64" ]; then
elif [ "$sysArch" = "x86_64" ]; then
ALIST_ARCH_NAME=amd64
elif [ "$sysArch" == "aarch64" ]; then
elif [ "$sysArch" = "aarch64" ]; then
ALIST_ARCH_NAME=aarch64
fi
ALIST_NAME=linux
if [ "$sysName" == "Darwin" ];then
if [ "$sysName" = "Darwin" ];then
ALIST_NAME=darwin
fi
@@ -84,7 +83,7 @@ Uninstall_App()
}
action=$1
if [ "${1}" == 'install' ];then
if [ "${1}" = 'install' ];then
Install_App
else
Uninstall_App

View File

@@ -0,0 +1,78 @@
# plugins_cryptocurrency_trade
- https://docs.ccxt.com/en/latest/install.html#python-proxies
数字货币量化交易插件
```
cd /www/server/mdserver-web && python3 plugins/cryptocurrency_trade/ccxt/okex/strategy/st_demo.py
python3 plugins/cryptocurrency_trade/ccxt/okex/strategy/st_demo.py
miniconda3
```
# 免费TV策略
https://cn.tradingview.com/scripts/?script_type=strategies
### tradingview pine 指标
```
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TenCloud
//@version=5
indicator("第一个指标",shorttitle = "开心吧")
ema10 = ta.ema(close, 25)
ema100 = ta.ema(close, 100)
l1=plot(ema10, color=color.red,title = "ema10")
l2=plot(ema100,color = color.green, title = "ema100")
buy = ta.crossover(ema10,ema100)
sell = ta.crossunder(ema10,ema100)
plotchar(buy, text = "buy", color=color.green)
plotchar(sell, text="sell", color=color.red)
l_color = ema10>ema100 ? color.green:color.red
fill(l1,l2,color=color.new(l_color,70))
```
### tradingview pine 策略
```
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TenCloud
//@version=5
strategy("第一个指标",shorttitle = "开心吧", overlay = true, initial_capital = 1000)
ema10 = ta.ema(close, 25)
ema100 = ta.ema(close, 100)
l1=plot(ema10, color=color.red,title = "ema10")
l2=plot(ema100,color = color.green, title = "ema100")
buy = ta.crossover(ema10,ema100)
sell = ta.crossunder(ema10,ema100)
if buy
strategy.entry("long1", strategy.long,1)
if sell
strategy.close("long1", qty_percent = 100,comment = "平仓多单")
// plotchar(buy, text = "buy", color=color.green)
// plotchar(sell, text="sell", color=color.red)
// l_color = ema10>ema100 ? color.green:color.red
// fill(l1,l2,color=color.new(l_color,70))
```

Some files were not shown because too many files have changed in this diff Show More