Compare commits

...
676 Commits
Author SHA1 Message Date
Mr Chen ad63a22a7e Merge pull request #561 from midoks/dev
0.16.7
2024-05-07 20:08:54 +08:00
Mr Chen 5b1e4d3e0a 0.16.7
- mongodb副本设置/备份/认证。
2024-05-07 20:08:11 +08:00
Mr Chen 110e9b501e 优化 2024-05-07 01:27:09 +08:00
Mr Chen 26de973b82 Update mongodb.js 2024-05-07 01:02:15 +08:00
Mr Chen 9adc0a8c38 Update index.py 2024-05-06 17:51:26 +08:00
Mr Chen 08f75685fb Update index.py 2024-05-06 17:17:58 +08:00
Mr Chen dc59f24ce2 Update index.py 2024-05-06 17:17:36 +08:00
Mr Chen 869843da82 Update index.py 2024-05-06 17:17:08 +08:00
Mr Chen 01055e3403 Update mongodb.sql 2024-05-06 17:07:08 +08:00
Mr Chen 43cfbc90a2 Update index.py 2024-05-06 17:02:37 +08:00
Mr Chen 270fb15ebf Update index.py 2024-05-06 17:01:05 +08:00
Mr Chen 4e7e4f5fb4 Update index.py 2024-05-06 16:57:47 +08:00
Mr Chen 67530acf1d Update index.py 2024-05-06 16:42:10 +08:00
Mr Chen 7a86ba4444 Update index.py 2024-05-06 15:20:56 +08:00
Mr Chen f4f29784d7 Update index.py 2024-05-06 15:20:34 +08:00
Mr Chen fafa64f2c7 Update index.py 2024-05-06 02:28:01 +08:00
Mr Chen 41c7b0fb70 Update index.py 2024-05-06 02:13:59 +08:00
Mr Chen a779caea41 Update index.py 2024-05-06 02:11:37 +08:00
Mr Chen a8b97bf6d7 Update index.py 2024-05-06 01:33:14 +08:00
Mr Chen b31bfcb88a Update index.py 2024-05-06 01:24:55 +08:00
Mr Chen dbb95228b1 Update backup.py 2024-05-06 01:24:16 +08:00
Mr Chen 5ad4772c33 Update index.py 2024-05-06 01:14:07 +08:00
Mr Chen b270c1bfdc Update mongodb.js 2024-05-06 01:10:39 +08:00
Mr Chen c8ccf4b1c8 Update backup.py 2024-05-06 00:51:28 +08:00
Mr Chen 6eb21ffbf9 Update backup.py 2024-05-06 00:51:17 +08:00
Mr Chen 58ce8db1d0 update 2024-05-06 00:49:48 +08:00
Mr Chen 8b1bf28cf7 Update backup.py 2024-05-06 00:44:20 +08:00
Mr Chen 0e98e114fa Update index.py 2024-05-06 00:16:51 +08:00
Mr Chen 4c93cd77e0 Update index.py 2024-05-06 00:13:10 +08:00
Mr Chen 7044d27ca9 Update info.json 2024-05-05 23:46:52 +08:00
Mr Chen 9168af0a9c Update index.py 2024-05-05 23:36:34 +08:00
Mr Chen f893eec0e4 Update index.py 2024-05-05 20:27:58 +08:00
Mr Chen 574c7558b4 Update mongodb.js 2024-05-05 20:08:37 +08:00
Mr Chen 4901910a71 update 2024-05-05 20:07:36 +08:00
Mr Chen 286be2a9f6 Update index.py 2024-05-05 20:03:18 +08:00
Mr Chen fed18880be Update index.py 2024-05-05 19:54:18 +08:00
Mr Chen b862cd2413 Update index.py 2024-05-05 19:53:34 +08:00
Mr Chen 8c652c99da Update index.py 2024-05-05 19:50:42 +08:00
Mr Chen 728677c702 update 2024-05-05 19:46:45 +08:00
Mr Chen 4a023531e4 Update index.py 2024-05-05 18:21:50 +08:00
Mr Chen 8d27ffbe91 update 2024-05-05 18:03:40 +08:00
Mr Chen afa32231ad mongodb备份 2024-05-05 17:49:29 +08:00
Mr Chen e693d15a04 Update mongodb.js 2024-05-05 14:50:21 +08:00
Mr Chen 814d0cb925 update 2024-05-05 14:44:37 +08:00
Mr Chen 6d95f7fd82 update 2024-05-05 14:43:41 +08:00
Mr Chen 979c1fc530 Update index.py 2024-05-05 14:40:50 +08:00
Mr Chen c147ccd079 update 2024-05-05 14:25:47 +08:00
Mr Chen 71b64b19a1 Update index.py 2024-05-05 13:51:59 +08:00
Mr Chen fdac352244 update 2024-05-05 13:45:50 +08:00
Mr Chen da5de004c4 Update backup.py 2024-05-05 12:34:29 +08:00
Mr Chen 8108ca7ee6 Update backup.py 2024-05-05 12:12:23 +08:00
Mr Chen ba2fbbeb41 Update mongodb.conf 2024-05-05 11:01:50 +08:00
Mr Chen 614e7af3c4 Update debian.sh 2024-05-04 22:26:14 +08:00
Mr Chen ec67913cda update 2024-05-04 22:26:09 +08:00
Mr Chen 847353374f update 2024-05-04 21:44:32 +08:00
Mr Chen 239d1de0ec Create backup.py 2024-05-04 18:05:55 +08:00
Mr Chen 5fefbb46a7 Update index.py 2024-05-04 18:00:10 +08:00
Mr Chen 4288ccfc0c Update index.py 2024-05-04 17:28:18 +08:00
Mr Chen 367aeddd2d Update index.py 2024-05-04 16:24:57 +08:00
Mr Chen 76ec5b58cd up 2024-05-04 16:14:27 +08:00
Mr Chen f0cc9e2d54 update 2024-05-04 16:02:44 +08:00
Mr Chen b3630699ce Update mongodb.js 2024-05-04 15:49:33 +08:00
Mr Chen dfe9a10a47 Update mongodb.js 2024-05-04 15:45:46 +08:00
Mr Chen c34405a4d6 Update index.py 2024-05-04 15:37:18 +08:00
Mr Chen 3068e3b033 Update index.py 2024-05-04 15:28:09 +08:00
Mr Chen 10db173b31 Update index.py 2024-05-04 15:26:18 +08:00
Mr Chen 3db40877cd Update index.py 2024-05-04 15:24:44 +08:00
Mr Chen adc7f2fe98 Update index.py 2024-05-04 15:24:27 +08:00
Mr Chen 6dc81175ea Update mongodb.js 2024-05-04 15:22:13 +08:00
Mr Chen c64183abe9 Update index.py 2024-05-04 14:44:27 +08:00
Mr Chen 8eb2403e4b update 2024-05-04 14:34:38 +08:00
Mr Chen 4c2178ea9c Update index.py 2024-05-03 19:26:25 +08:00
Mr Chen 6702fb94a0 update 2024-05-03 19:01:34 +08:00
Mr Chen c4bc66e410 update 2024-05-03 18:30:50 +08:00
Mr Chen 54a6a121ac Update index.py 2024-05-03 16:25:47 +08:00
Mr Chen 1bb92d7f38 Update install.sh 2024-05-03 16:19:30 +08:00
Mr Chen 9a99a5e1c6 Update index.py 2024-05-03 16:16:16 +08:00
Mr Chen eeeff6e825 update 2024-05-03 16:07:55 +08:00
Mr Chen 8ee5b0a4aa update 2024-05-03 16:00:09 +08:00
Mr Chen 4ee5e41882 update 2024-05-03 12:05:02 +08:00
Mr Chen 8c4820046a Update index.py 2024-05-03 00:48:08 +08:00
Mr Chen 1b6f54e6a5 update 2024-05-03 00:45:28 +08:00
Mr Chen 9ae7644710 updatte 2024-05-02 19:58:58 +08:00
Mr Chen 0ab87b1da5 update 2024-05-02 19:15:13 +08:00
Mr Chen 6b7457e660 Update mongodb.js 2024-05-02 15:53:28 +08:00
Mr Chen b81deee461 up 2024-05-02 15:52:10 +08:00
Mr Chen 59211703f8 Update index.py 2024-05-01 23:55:28 +08:00
Mr Chen 3271e76d34 Update index.py 2024-05-01 23:50:45 +08:00
Mr Chen dca0955bb6 update 2024-05-01 23:48:40 +08:00
Mr Chen 7af78883cc Update index.html 2024-05-01 20:35:23 +08:00
Mr Chen 0f2db3f144 Update mongodb.js 2024-05-01 20:34:09 +08:00
Mr Chen eb2c476b28 update 2024-05-01 20:33:36 +08:00
Mr Chen 99a57d29af Update php.js 2024-05-01 17:54:17 +08:00
Mr Chen ed0afb6b86 Update requirements.txt 2024-05-01 11:22:59 +08:00
Mr Chen 2f005cbadd update 2024-05-01 03:36:34 +08:00
Mr Chen 7bac4e0a6b Update setting.py 2024-05-01 03:13:28 +08:00
Mr Chen 2dad4189c8 up 2024-04-30 17:18:30 +08:00
Mr Chen 5c1fe49e1b update 2024-04-30 17:18:17 +08:00
Mr Chen 9a5cd7e834 Update mongodb.conf 2024-04-30 14:49:37 +08:00
Mr Chen 78a032a18b upda 2024-04-30 11:15:00 +08:00
Mr Chen b99a9d7d2f Update nosql_mongodb.py 2024-04-29 23:40:01 +08:00
Mr Chen 36c9628695 Update nosql_mongodb.py 2024-04-29 23:38:59 +08:00
Mr Chen ccd7468ffe Update nosql_mongodb.py 2024-04-29 23:37:41 +08:00
Mr Chen 129b244ea9 Update nosql_mongodb.py 2024-04-29 23:36:17 +08:00
Mr Chen 716e39f947 Update index.py 2024-04-29 23:32:41 +08:00
Mr Chen a0167e7cf2 Update nosql_mongodb.py 2024-04-29 23:26:55 +08:00
Mr Chen 2c6dea64ab Update index.py 2024-04-29 22:49:07 +08:00
Mr Chen 9605676dbe update 2024-04-29 22:40:15 +08:00
Mr Chen a4e7be46fb Update debian.sh 2024-04-29 22:38:06 +08:00
Mr Chen e2ce520041 Update debian.sh 2024-04-29 22:34:34 +08:00
Mr Chen d1fc41682e Update debian.sh 2024-04-29 22:33:11 +08:00
Mr Chen 56918a1ba2 Update debian.sh 2024-04-29 22:32:42 +08:00
Mr Chen 869788028c Update debian.sh 2024-04-29 22:32:01 +08:00
Mr Chen a262c6c0b7 update 2024-04-29 22:24:59 +08:00
Mr Chen 54682ef02c Update index.py 2024-04-29 21:47:53 +08:00
Mr Chen 093bf3910b Update index.py 2024-04-29 21:22:31 +08:00
Mr Chen 0b65f50b4b Update index.py 2024-04-29 21:21:35 +08:00
Mr Chen a1995772ef Update index.py 2024-04-29 21:20:34 +08:00
Mr Chen fcef433ba3 Update index.py 2024-04-29 21:20:14 +08:00
Mr Chen 6950f0c7c9 Update index.py 2024-04-29 21:18:04 +08:00
Mr Chen e987c4d27e up 2024-04-29 19:45:58 +08:00
Mr Chen 25c72b299e update 2024-04-29 18:35:19 +08:00
Mr Chen 8f4f182064 Merge pull request #559 from midoks/dev
文件名排序
2024-04-29 16:05:44 +08:00
Mr Chen 2cd37b988f update 2024-04-29 16:04:49 +08:00
Mr Chen 040ef6e22b Update index.py 2024-04-29 15:22:12 +08:00
Mr Chen 5dfd0508da Update index.py 2024-04-29 15:19:37 +08:00
Mr Chen b0b043f432 Update index.py 2024-04-29 14:59:37 +08:00
Mr Chen cfe063a6e7 Update index.py 2024-04-29 14:59:00 +08:00
Mr Chen 22a5e147d2 Merge pull request #558 from midoks/dev
mysql8.3配置
2024-04-28 13:37:06 +08:00
Mr Chen 648e4b3866 Update index.py 2024-04-28 13:34:26 +08:00
Mr Chen ffb5a66042 Create my8.3.cnf 2024-04-28 12:37:43 +08:00
Mr Chen e1593b67fc Update install.sh 2024-04-27 13:18:52 +08:00
Mr Chen 871d7ef535 Update info.json 2024-04-27 13:17:59 +08:00
Mr Chen ac32c639fa update 2024-04-27 13:16:46 +08:00
Mr Chen 997c8194b6 Merge pull request #557 from midoks/dev
网站统计优化
2024-04-26 20:17:18 +08:00
Mr Chen 7334ec38fb update 2024-04-26 20:00:54 +08:00
Mr Chen cafc7989e9 Update requirements.txt 2024-04-26 15:26:50 +08:00
Mr Chen 2354d484ee Update __init__.py 2024-04-26 15:23:49 +08:00
Mr Chen f7ebdcb182 Update __init__.py 2024-04-26 15:09:53 +08:00
Mr Chen 8305dc0ebe update 2024-04-26 15:09:37 +08:00
Mr Chen 5923042bf1 update 2024-04-26 15:07:50 +08:00
Mr Chen 00b162771f Update webstats_index.py 2024-04-26 15:03:43 +08:00
Mr Chen 4b9ab17fcb Update webstats_index.py 2024-04-26 15:01:03 +08:00
Mr Chen 946bd36e66 Update webstats_index.py 2024-04-26 14:50:10 +08:00
Mr Chen 42f4e419cd Merge pull request #556 from midoks/dev
网站统计优化
2024-04-26 13:48:48 +08:00
Mr Chen f7c8b8cdb5 Update swoole.sh 2024-04-26 13:43:12 +08:00
Mr Chen fdf8f30d90 Update stats.js 2024-04-26 13:34:37 +08:00
Mr Chen 0f1127e502 Update stats.js 2024-04-26 13:29:34 +08:00
Mr Chen 12c59f6ac6 统计查询优化 2024-04-26 13:15:08 +08:00
Mr Chen 1f3414f5bc Update phplib.conf 2024-04-25 21:48:47 +08:00
Mr Chen 94a6a3f64d Merge pull request #555 from midoks/dev
切换获取ip的地址
2024-04-25 19:32:18 +08:00
Mr Chen 812a520c43 Merge branch 'master' into dev 2024-04-25 19:27:38 +08:00
Mr Chen a48429f9f8 Update tools.py 2024-04-25 19:19:57 +08:00
Mr Chen 9aa4bdfd19 Merge pull request #554 from midoks/dev
debian/ubuntu 443/udp ufw防火墙默认开启。
2024-04-24 22:55:48 +08:00
Mr Chen 7c3cde83df Merge branch 'master' into dev 2024-04-24 22:53:51 +08:00
Mr Chen af00b1b127 Merge pull request #553 from jd82k/master
修复提交正则过滤时,因为正则中存在冒号,错误的将所有的冒号用于分割,应该只使用第一个冒号分割
2024-04-24 22:52:52 +08:00
jd82k 8a0e8e9c17 增加了一些非法扫描器及脚本
通过1年的日志分析,收集了一些非法扫描器、脚本、爬虫的UA
2024-04-24 22:42:05 +08:00
Mr Chen 982ee4f60f Merge branch 'master' into dev 2024-04-24 22:40:48 +08:00
jd82k c735dab40d 修复提交正则过滤时,因为正则中存在冒号,错误的将所有的冒号用于分割,应该只使用第一个冒号分割 2024-04-24 22:23:37 +08:00
Mr Chen 32b8cdf9bc Merge pull request #552 from jd82k/master
修复笔误
2024-04-24 16:56:19 +08:00
jd82k fd7fa885ca 修复笔误 2024-04-24 16:50:05 +08:00
Mr Chen f4642d3b69 Merge branch 'master' into dev 2024-04-24 16:07:38 +08:00
Mr Chen f54be91744 Merge pull request #551 from jd82k/master
修复数据类型错误导致的openresty lua error 从而使得useragent匹配失效的bug
2024-04-24 16:06:40 +08:00
jd82k 4ecbfb3e58 修复数据类型错误导致的openresty lua error 从而使得useragent匹配失效的bug 2024-04-24 14:52:07 +08:00
Mr Chen 309cf2825e update 2024-04-24 11:32:41 +08:00
Mr Chen ecbc0f6afe Update plugins_api.py 2024-04-21 17:49:38 +08:00
Mr Chen c402a1dc79 update 2024-04-20 13:25:02 +08:00
Mr Chen c949e8d0f2 Merge pull request #549 from midoks/dev
centos7的python库安装优化
2024-04-18 11:08:50 +08:00
Mr Chen 195446ef86 update 2024-04-18 11:05:40 +08:00
Mr Chen e6a1fe58bc Update requirements.txt 2024-04-18 11:03:32 +08:00
Mr Chen 3a9b1b374d Update site_api.py 2024-04-18 00:04:14 +08:00
Mr Chen 8bb0e744bb Merge pull request #548 from midoks/dev
常规更新
2024-04-17 23:44:25 +08:00
Mr Chen 1182894326 Update nginx.conf 2024-04-17 23:43:46 +08:00
Mr Chen 77b03f4a21 Update site_api.py 2024-04-17 23:41:38 +08:00
Mr Chen 72bc30e188 Update install.sh 2024-04-17 23:25:32 +08:00
Mr Chen 35c789fc00 Merge pull request #547 from midoks/dev
部分php扩展更新
2024-04-17 18:58:35 +08:00
Mr Chen 738bf5d441 Update gd_old.sh 2024-04-17 18:55:26 +08:00
Mr Chen 22a62e6cb8 Update gd_old.sh 2024-04-17 18:53:57 +08:00
Mr Chen a63a1b8b51 Update xdebug.sh 2024-04-17 18:47:30 +08:00
Mr Chen c51f885653 Update gd_old.sh 2024-04-17 18:44:46 +08:00
Mr Chen 266a23b7eb Update swoole.sh 2024-04-17 18:39:38 +08:00
Mr Chen 48603b14da Update phplib.conf 2024-04-17 18:37:19 +08:00
Mr Chen 7e7e19455e Update event.sh 2024-04-17 18:37:09 +08:00
Mr Chen 7657ccb94e Update event.sh 2024-04-17 18:31:40 +08:00
Mr Chen 80ade55b69 Merge pull request #546 from midoks/dev
reuseport
2024-04-17 18:28:00 +08:00
Mr Chen a643c9b5f4 Update site_api.py 2024-04-17 18:25:53 +08:00
Mr Chen 15dc4ae7cf Update site_api.py 2024-04-17 17:56:43 +08:00
Mr Chen 030734cc93 Merge pull request #545 from midoks/dev
http/3调整
2024-04-17 17:54:09 +08:00
Mr Chen 1439d4edf6 Update site_api.py 2024-04-17 17:52:22 +08:00
Mr Chen d6a816b06e Update site_api.py 2024-04-17 17:40:00 +08:00
Mr Chen b6e1f46379 Update site_api.py 2024-04-17 17:38:08 +08:00
Mr Chen d926a69b59 Update site_api.py 2024-04-17 17:35:48 +08:00
Mr Chen 0504ca3887 Update site_api.py 2024-04-17 16:58:08 +08:00
Mr Chen 3f36019c2e Create altsvc.cache 2024-04-17 16:44:51 +08:00
Mr Chen b64e3b772f Update all_test.sh 2024-04-17 13:07:21 +08:00
Mr Chen ff29679b42 update 2024-04-17 12:34:07 +08:00
Mr Chen 5aca1ef708 Update r3.6.txt 2024-04-17 11:29:03 +08:00
Mr Chen 95a84c7ac5 Update r3.7.txt 2024-04-17 11:27:22 +08:00
Mr Chen 28c2335223 Update r3.7.txt 2024-04-17 11:25:18 +08:00
Mr Chen 8ea87a47ea Update r3.6.txt 2024-04-17 11:25:05 +08:00
Mr Chen 57058f5ab0 Update requirements.txt 2024-04-17 11:18:10 +08:00
Mr Chen b31d30bb31 Merge pull request #542 from midoks/dev
0.16.6
2024-04-17 01:52:02 +08:00
Mr Chen 0670b7f338 Update README.md 2024-04-17 01:49:06 +08:00
Mr Chen c25ecc9db2 Update config_api.py 2024-04-17 01:41:21 +08:00
Mr Chen d0d75f4526 Update site_api.py 2024-04-17 01:37:50 +08:00
Mr Chen 539857919a Update site_api.py 2024-04-17 01:20:34 +08:00
Mr Chen 5139cacce8 Update install.sh 2024-04-17 00:59:06 +08:00
Mr Chen 222c4c6d58 Update site_api.py 2024-04-17 00:53:33 +08:00
Mr Chen c2d6f5408d Update site_api.py 2024-04-17 00:50:06 +08:00
Mr Chen d3a5b9874b Update site_api.py 2024-04-17 00:43:23 +08:00
Mr Chen 87da2b9fc5 443同时开启tcp/udp 2024-04-16 23:41:06 +08:00
Mr Chen a3a40c830b Update install.sh 2024-04-16 23:11:17 +08:00
Mr Chen d30ff5b882 Update install.sh 2024-04-16 23:10:30 +08:00
Mr Chen 8a0e4122f3 Update install.sh 2024-04-16 23:00:42 +08:00
Mr Chen 0766ad0063 update 2024-04-16 22:58:18 +08:00
Mr Chen 04823f656a Update site_api.py 2024-04-16 22:19:05 +08:00
Mr Chen 5d50b3664d Update install.sh 2024-04-16 21:43:16 +08:00
Mr Chen 889c5d96e5 Update bcmath.sh 2024-04-16 21:25:29 +08:00
Mr Chen c6ac7e90df Revert "Update requirements.txt"
This reverts commit 28fe1950c4.
2024-04-16 19:38:51 +08:00
Mr Chen 28fe1950c4 Update requirements.txt 2024-04-16 19:38:25 +08:00
Mr Chen 4a9baeb924 Merge pull request #541 from midoks/dev
修复
2024-04-16 15:59:38 +08:00
Mr Chen 3e6a2e148c Update files.js 2024-04-16 15:58:46 +08:00
Mr Chen 79ec3b2ec0 Update push_notice_msg.py 2024-04-16 14:47:57 +08:00
Mr Chen 4b7b8aa801 Update args.json 2024-04-15 22:38:53 +08:00
Mr Chen 66ea1b7f5b Update cookie.json 2024-04-15 22:37:53 +08:00
Mr Chen a9b703c6ee Update post.json 2024-04-15 22:36:45 +08:00
Mr Chen 00b57bc1c0 Update user_agent.json 2024-04-15 22:34:50 +08:00
Mr Chen 47cfe6ee04 Update user_agent.json 2024-04-15 22:34:10 +08:00
Mr Chen 2b9c47b79c Update user_agent.json 2024-04-15 22:33:52 +08:00
Mr Chen 540fb5a11f Merge pull request #539 from midoks/dev
0.16.5
2024-04-15 17:02:43 +08:00
Mr Chen 5dca6bfb80 update 2024-04-15 17:01:23 +08:00
Mr Chen 8439fcbe98 Update config_api.py 2024-04-15 16:58:13 +08:00
Mr Chen 6cee6f4785 Update info.json 2024-04-15 16:48:20 +08:00
Mr Chen 6a067ad457 Update README.md 2024-04-15 14:23:42 +08:00
Mr Chen 691aba1f2a Update config_api.py 2024-04-15 14:12:45 +08:00
Mr Chen 6446a7053e https://github.com/midoks/mdserver-web/discussions/536 2024-04-15 14:11:45 +08:00
Mr Chen 040c66cdc3 Update site.css 2024-04-15 02:01:57 +08:00
Mr Chen c8d02eaa85 Update files.html 2024-04-15 02:01:52 +08:00
Mr Chen 59bbd99ba4 Update cert_api.py 2024-04-15 00:42:38 +08:00
Mr Chen c8d86fa835 Update cert_api.py 2024-04-15 00:27:46 +08:00
Mr Chen e629a82ed9 Update cert_api.py 2024-04-15 00:21:58 +08:00
Mr Chen fb0a771c81 Update cert_request.py 2024-04-15 00:11:02 +08:00
Mr Chen 891cd56163 Update config.json 2024-04-13 11:56:49 +08:00
Mr Chen 0714780938 Update zip.sh 2024-04-12 21:36:52 +08:00
Mr Chen 0a11f17d90 Update phplib.conf 2024-04-12 21:34:44 +08:00
Mr Chen e22722f40e Update cert_api.py 2024-04-10 22:07:09 +08:00
Mr Chen 519544715f Update README.md 2024-04-09 16:00:09 +08:00
Mr Chen 6d34061402 Merge pull request #535 from midoks/dev
优化
2024-04-05 02:31:50 +08:00
Mr Chen 119928d9df 优化
* 任务日志查看优化。
* 优化MySQL打开phpMyAdmin速度。
2024-04-05 02:31:05 +08:00
Mr Chen 022dfe31d4 update 2024-04-05 02:28:03 +08:00
Mr Chen c2011eedf9 Update mysql.js 2024-04-05 02:23:01 +08:00
Mr Chen b77d549b34 Update mysql.js 2024-04-05 02:19:24 +08:00
Mr Chen 0b3bcafec7 update 2024-04-05 02:18:02 +08:00
Mr Chen 4e12548978 Update mysql.js 2024-04-05 02:08:00 +08:00
Mr Chen bf7de761c8 update 2024-04-05 02:06:19 +08:00
Mr Chen bfc96e925f Update mysql.js 2024-04-05 01:57:06 +08:00
Mr Chen de1da98e92 Update index.py 2024-04-05 01:55:35 +08:00
Mr Chen d4edc449a2 Update index.py 2024-04-05 01:53:41 +08:00
Mr Chen a03d4e7dda Update index.py 2024-04-05 01:50:27 +08:00
Mr Chen 4351367e32 update 2024-04-05 01:49:34 +08:00
Mr Chen 0ec628f5e2 update 2024-04-05 01:28:47 +08:00
Mr Chen a94ef37b49 Update config_api.py 2024-04-05 01:17:19 +08:00
Mr Chen cf8729a6ac Update crontab.js 2024-04-05 01:16:49 +08:00
Mr Chen 3688456ea0 Update install.sh 2024-04-04 18:14:42 +08:00
Mr Chen 47c64e7212 Update site_api.py 2024-04-04 17:59:35 +08:00
Mr Chen e653f76608 Update info.json 2024-04-04 17:48:41 +08:00
Mr Chen d40d0001bf Update install.sh 2024-04-04 12:45:27 +08:00
Mr Chen 793a236641 Update install.sh 2024-04-04 12:42:11 +08:00
Mr Chen 07996a3fe5 Merge pull request #533 from midoks/dev
Update README.md
2024-04-04 12:35:37 +08:00
Mr Chen a826f784fc Update README.md 2024-04-04 12:35:16 +08:00
Mr Chen 1561768524 Merge pull request #532 from midoks/dev
Update README.md
2024-04-04 12:34:32 +08:00
Mr Chen 1d899fe330 Update README.md 2024-04-04 12:34:09 +08:00
Mr Chen a1b3e70816 Merge pull request #531 from midoks/dev
0.16.4
2024-04-04 12:32:06 +08:00
Mr Chen 6f4479558f Update README.md 2024-04-04 12:31:17 +08:00
Mr Chen f817792aeb Update config_api.py 2024-04-04 12:29:34 +08:00
Mr Chen c8c0e44143 Update op_waf.js 2024-04-04 12:26:29 +08:00
Mr Chen 6668c2e14b update 2024-04-04 11:42:19 +08:00
Mr Chen 721f041c65 Update README.md 2024-04-04 00:20:05 +08:00
Mr Chen 87239f5361 Merge pull request #530 from midoks/dev
更新为支付宝
2024-04-04 00:18:55 +08:00
Mr Chen b48e3cbfcc update 2024-04-04 00:17:58 +08:00
Mr Chen 4b41c6df57 update 2024-04-02 00:17:20 +08:00
Mr Chen b491a6e913 Update README.md 2024-03-29 15:38:01 +08:00
Mr Chen 42271c5562 Merge pull request #529 from midoks/dev
discord
2024-03-29 15:30:24 +08:00
Mr Chen ef63465aea Update README.md 2024-03-29 15:28:40 +08:00
Mr Chen 98745e8134 Merge pull request #528 from midoks/dev
简单优化+ whatapp
2024-03-29 11:21:41 +08:00
Mr Chen 2fb293c89c Update README.md 2024-03-29 11:20:59 +08:00
Mr Chen 4e0db8d0a1 Update commit.tpl.ssh 2024-03-27 21:11:53 +08:00
Mr Chen 4b1e40b42d Update index.html 2024-03-26 17:47:26 +08:00
Mr Chen 935bee90f7 Update index.html 2024-03-26 17:42:25 +08:00
Mr Chen 0489a9df2c Update config_api.py 2024-03-19 23:29:27 +08:00
Mr Chen 20a4154240 update 2024-03-19 23:27:17 +08:00
Mr Chen a8ced31d32 Update mw.py 2024-03-19 23:24:40 +08:00
Mr Chen ac97b8f7ec Update tools.py 2024-03-19 23:21:19 +08:00
Mr Chen a797cd3741 Update push_notice_msg.py 2024-03-18 15:42:27 +08:00
Mr Chen a616736bf1 Merge pull request #526 from midoks/dev
AD及 二次验证
2024-03-18 15:26:22 +08:00
Mr Chen 8a90f5cb90 ad 2024-03-18 15:25:30 +08:00
Mr Chen 419d4abe8e Update login.html 2024-03-10 19:21:18 +08:00
Mr Chen ba555fba63 Update __init__.py 2024-03-10 19:16:05 +08:00
Mr Chen 7ead8708bc Update __init__.py 2024-03-10 19:15:42 +08:00
Mr Chen bd5b066afe Update __init__.py 2024-03-10 19:10:57 +08:00
Mr Chen 6d08c160e0 Update __init__.py 2024-03-10 19:10:27 +08:00
Mr Chen f24f8a3a16 Update config_api.py 2024-03-10 18:35:05 +08:00
Mr Chen 707b0d4b53 Update tools.py 2024-03-10 18:34:26 +08:00
Mr Chen d19e9cd8f4 二次验证,加强安全登录 2024-03-10 18:27:39 +08:00
Mr Chen a2d0cc6cfe Update requirements.txt 2024-03-10 14:43:53 +08:00
Mr Chen 356fd831fb Update requirements.txt 2024-03-10 14:33:09 +08:00
Mr Chen ec4988e732 update 2024-02-19 18:41:32 +08:00
Mr Chen 3a694b8d7d ad
# 海外服务器 高防CDN 解决移动屏蔽 | 19/m | next,2/19 | @YYCDNFW
2024-02-19 18:35:37 +08:00
Mr Chen d5945fd449 Merge pull request #524 from midoks/dev
更换GitHub Proxy
2024-02-08 16:47:46 +08:00
Mr Chen 10186786d9 更换GitHub Proxy
更换GitHub Proxy
2024-02-08 16:46:43 +08:00
Mr Chen 0eb8791e84 Merge pull request #523 from midoks/dev
Update sql_mysql.py
2024-02-07 01:57:51 +08:00
Mr Chen 5234b55798 Update sql_mysql.py 2024-02-07 01:54:30 +08:00
Mr Chen 4efe740504 Merge pull request #522 from midoks/dev
0.16.3
2024-02-06 22:53:11 +08:00
Mr Chen bde0ed59ad Update README.md 2024-02-06 22:52:15 +08:00
Mr Chen 19c855790f Update config_api.py 2024-02-06 22:51:47 +08:00
Mr Chen 4a90f1b8b0 Update app.js 2024-02-06 22:45:25 +08:00
Mr Chen f83bdffed8 update 2024-02-06 22:44:52 +08:00
Mr Chen 087cb4fc37 Update app.js 2024-02-06 22:16:09 +08:00
Mr Chen 66bcd15502 update 2024-02-06 22:14:17 +08:00
Mr Chen 29e3dedbe9 update 2024-02-06 22:11:02 +08:00
Mr Chen f10160c239 update 2024-02-06 22:06:26 +08:00
Mr Chen 376d09a955 up 2024-02-06 21:31:20 +08:00
Mr Chen 9076a3a11a Update app.js 2024-02-06 21:27:05 +08:00
Mr Chen 57719990d5 Update app.js 2024-02-06 21:20:07 +08:00
Mr Chen 7073d66662 Update app.js 2024-02-06 21:18:33 +08:00
Mr Chen 1983d02107 up 2024-02-06 21:17:24 +08:00
Mr Chen b4acb2942f update 2024-02-06 19:49:15 +08:00
Mr Chen c94a662235 Update index.html 2024-02-06 18:25:47 +08:00
Mr Chen 1d61026dd3 Update index.html 2024-02-06 18:25:28 +08:00
Mr Chen 48a55e279e Update nosql_mongodb.py 2024-02-06 18:06:45 +08:00
Mr Chen 55e9313711 update 2024-02-06 18:00:20 +08:00
Mr Chen 5ab59c3b75 update 2024-02-06 04:34:41 +08:00
Mr Chen 9c045b8e85 update 2024-02-06 04:10:13 +08:00
Mr Chen 65e87fec1a up 2024-02-06 03:52:36 +08:00
Mr Chen dc8f508ac5 update 2024-02-06 03:14:20 +08:00
Mr Chen ce0c2fb9ea Update index.py 2024-02-05 00:22:00 +08:00
Mr Chen d7e70aa701 Update index.py 2024-02-05 00:17:44 +08:00
Mr Chen ceacaaf7ae Update index.py 2024-02-04 18:12:33 +08:00
Mr Chen 36ad902250 Update tool_migrate.py 2024-02-04 15:30:05 +08:00
Mr Chen 7a871d3e16 Update tool_migrate.py 2024-02-04 15:29:31 +08:00
Mr Chen f36ba4a351 Update tool_migrate.py 2024-02-04 15:27:50 +08:00
Mr Chen 5093265a24 Update index.html 2024-02-04 02:38:03 +08:00
Mr Chen 9c4347f692 del rockmongo 2024-02-03 23:30:52 +08:00
Mr Chen cb882ab7a1 Update requirements.txt 2024-02-03 20:36:40 +08:00
Mr Chen 0d5fd1b423 Update README.md 2024-02-03 18:46:13 +08:00
Mr Chen e694635088 Update README.md 2024-02-03 18:45:59 +08:00
Mr Chen 3386ae2064 Update app.js 2024-02-03 16:11:00 +08:00
Mr Chen bbaced5976 Update app.js 2024-02-03 15:51:33 +08:00
Mr Chen c0d5c5c0e6 Update app.js 2024-02-03 15:50:38 +08:00
Mr Chen f9f7de48ef Update app.js 2024-02-03 15:43:26 +08:00
Mr Chen 5555eab5c0 Update stats.js 2024-02-03 15:40:35 +08:00
Mr Chen 654737cbd2 Update setting.js 2024-02-03 15:34:38 +08:00
Mr Chen 04568df3df update 2024-02-03 04:44:06 +08:00
Mr Chen b1e8839ace update_dev 2024-02-03 04:09:00 +08:00
Mr Chen 80c6f91206 update 2024-02-02 06:16:28 +08:00
Mr Chen 315b8e0e48 Update index.html 2024-02-01 22:18:18 +08:00
Mr Chen ed295d5456 up 2024-02-01 22:08:45 +08:00
Mr Chen eb38d81674 Update config_api.py 2024-02-01 15:06:39 +08:00
Mr Chen 0bc3b42819 del phpredisadmin 2024-02-01 05:19:10 +08:00
Mr Chen 8a640981d2 数据管理插件 2024-02-01 05:09:56 +08:00
Mr Chen 7b94a61b65 update 2024-01-29 19:25:05 +08:00
Mr Chen e24151f332 Update public.js 2024-01-27 15:45:05 +08:00
Mr Chen dc43953c05 Update public.js 2024-01-27 15:44:52 +08:00
Mr Chen 160ff6a4a7 update 2024-01-26 03:03:07 +08:00
Mr Chen a218ba05d2 Update app_start.php 2024-01-25 15:38:32 +08:00
Mr Chen 65cb4941af Update index.py 2024-01-25 15:11:18 +08:00
Mr Chen 53a12e7c4b Update site.js 2024-01-24 19:25:29 +08:00
Mr Chen 6db8a906ff Update task.py 2024-01-23 23:41:06 +08:00
Mr Chen fc6c86e3ce Update info.json 2024-01-23 03:02:04 +08:00
Mr Chen f5989c881d Update info.json 2024-01-23 03:00:50 +08:00
Mr Chen b4946a87ee Update index.py 2024-01-23 02:43:58 +08:00
Mr Chen 562e153371 Update site.css 2024-01-23 02:01:13 +08:00
Mr Chen 63ea0cc129 Update requirements.txt 2024-01-23 00:16:03 +08:00
Mr Chen 8eacae7c6a Update .gitignore 2024-01-22 23:46:30 +08:00
Mr Chen 3e48c3871a Update task.py 2024-01-22 23:46:15 +08:00
Mr Chen 22df4cb5b1 Update task.py 2024-01-22 23:41:02 +08:00
Mr Chen 2d5d954586 Create ico.png 2024-01-22 16:48:14 +08:00
Mr Chen 63ce3805ee Update index.py 2024-01-22 00:23:55 +08:00
Mr Chen 3fe4918b55 update 2024-01-22 00:16:25 +08:00
Mr Chen 24cc733e45 Update mongodb.conf 2024-01-21 23:30:52 +08:00
Mr Chen 1ebb9e1ff3 Update mongodb.conf 2024-01-21 22:15:08 +08:00
Mr Chen 9769f2c190 Update config_api.py 2024-01-21 16:34:28 +08:00
Mr Chen de91e4545b update 2024-01-21 16:01:10 +08:00
Mr Chen 8d3c87a25e Update opcache.sh 2024-01-21 15:54:00 +08:00
Mr Chen 660e393cf1 Update install.sh 2024-01-21 13:47:35 +08:00
Mr Chen fa5f2d6de5 Update config.js 2024-01-21 02:35:15 +08:00
Mr Chen f27406d343 Update config.js 2024-01-21 02:32:37 +08:00
Mr Chen 488577af68 update 2024-01-21 02:23:18 +08:00
Mr Chen 0f7b462b43 Update task.py 2024-01-21 01:47:41 +08:00
Mr Chen 998f1ceae5 Update task.py 2024-01-21 01:44:17 +08:00
Mr Chen 2a9bec3fb8 Update README.md 2024-01-21 01:29:08 +08:00
Mr Chen 5c301296df 站点页优化 2024-01-21 01:27:09 +08:00
Mr Chen 45b0e94132 update 2024-01-20 18:32:35 +08:00
Mr Chen 06be751d1a update 2024-01-20 18:25:31 +08:00
Mr Chen f939b03a0b Update update_dev.sh 2024-01-20 18:22:35 +08:00
Mr Chen 3339406f37 Update compatibility.md 2024-01-20 13:57:24 +08:00
Mr Chen f32d07ccc9 Update nginx.conf 2024-01-20 13:09:40 +08:00
Mr Chen ab8f1623bf update 2024-01-20 02:31:29 +08:00
Mr Chen d467d73230 Update backup.conf 2024-01-20 02:30:52 +08:00
Mr Chen 4b0dd7d3fb Update php.js 2024-01-20 01:49:35 +08:00
Mr Chen 91d243f8b1 Update install.sh 2024-01-20 01:37:57 +08:00
Mr Chen d682882d25 Update install.sh 2024-01-20 01:37:07 +08:00
Mr Chen 0b3745c933 Update README.md 2024-01-20 01:29:45 +08:00
Mr Chen 935c3012f9 Update README.md 2024-01-20 01:08:45 +08:00
Mr Chen a191548a83 Update enable-php-upstream.conf 2024-01-19 22:06:48 +08:00
Mr Chen 9a01d61e1e Update enable-php.conf 2024-01-19 22:06:35 +08:00
Mr Chen 7524798385 php配置改造 2024-01-19 21:21:36 +08:00
Mr Chen 86e3796524 Update logs_api.py 2024-01-18 13:23:22 +08:00
Mr Chen 37d68f5ff8 Update logs_api.py 2024-01-17 21:19:48 +08:00
Mr Chen 647e3904d2 Create enable-php-upstream.conf 2024-01-17 04:22:34 +08:00
Mr Chen c5abb3eea1 Update index.html 2024-01-17 03:20:48 +08:00
Mr Chen 65c94c64ae Update README.md 2024-01-17 02:47:12 +08:00
Mr Chen dbc132951b PHP-FPM设置多个应用池 2024-01-17 02:44:17 +08:00
Mr Chen 440ba49e7b Create backup.conf 2024-01-17 00:07:45 +08:00
Mr Chen 6a0f78b1a0 Update index.html 2024-01-17 00:07:30 +08:00
Mr Chen a69ff3e373 php更新加密校验 2024-01-16 01:18:27 +08:00
Mr Chen 770d37e575 Update config_api.py 2024-01-15 19:58:33 +08:00
Mr Chen e725ad90ca Update config.js 2024-01-15 19:56:57 +08:00
Mr Chen bf5d8f7f27 Update commit.tpl 2024-01-15 17:14:46 +08:00
Mr Chen 9bc72b23d6 Update commit.tpl 2024-01-15 17:13:52 +08:00
Mr Chen 3ac3350240 Update install.sh 2024-01-14 22:38:40 +08:00
Mr Chen c1d04b0a16 Update index.py 2024-01-14 22:35:48 +08:00
Mr Chen 1962cece21 Update index.py 2024-01-14 22:33:00 +08:00
Mr Chen 0d24b8aebd update 2024-01-14 22:29:28 +08:00
Mr Chen de50de0a75 Update index.py 2024-01-14 22:16:35 +08:00
Mr Chen 190fc88d4f Update index.py 2024-01-10 22:23:44 +08:00
Mr Chen 727a7872a7 Update index.py 2024-01-10 14:52:19 +08:00
Mr Chen d408d56826 Update README.md 2024-01-10 14:14:17 +08:00
Mr Chen 1cccd63edc update 2024-01-10 12:57:43 +08:00
Mr Chen cc50816286 Update config.html 2024-01-10 00:55:53 +08:00
Mr Chen 04426c7a67 Update README.md 2024-01-10 00:40:27 +08:00
Mr Chen 3979820eae 时区 2024-01-10 00:19:09 +08:00
Mr Chen 3a850a31a1 Update config_api.py 2024-01-10 00:05:52 +08:00
Mr Chen 6f5487b487 Update requirements.txt 2024-01-10 00:03:59 +08:00
Mr Chen d09a96ec84 时区设置 2024-01-10 00:02:04 +08:00
Mr Chen dcc4e14e7b Update gd.sh 2024-01-09 19:48:29 +08:00
Mr Chen e947b8db4e Update gd_old.sh 2024-01-09 19:47:51 +08:00
Mr Chen 158a66ab62 update 2024-01-09 19:06:34 +08:00
Mr Chen df596fc673 Update tools.py 2024-01-09 01:57:28 +08:00
Mr Chen 707fd668d5 update 2024-01-09 01:56:25 +08:00
Mr Chen b96c4c00e3 Update common.py 2024-01-09 01:12:13 +08:00
Mr Chen bc6cf72cfe up 2024-01-07 19:16:24 +08:00
Mr Chen 48dacb4c27 Update php.js 2024-01-07 04:14:03 +08:00
Mr Chen 78c9abbde2 update 2024-01-07 04:12:33 +08:00
Mr Chen d8d772c6dc Create trace.sh 2024-01-07 03:16:18 +08:00
Mr Chen 33e114ffdd Update php.js 2024-01-07 03:11:18 +08:00
Mr Chen 552b63d329 update 2024-01-07 03:08:41 +08:00
Mr Chen 36637260a7 Update index_php_apt.py 2024-01-07 03:06:45 +08:00
Mr Chen 53fbb5039b Update index_php_apt.py 2024-01-07 02:58:50 +08:00
Mr Chen 74152af289 Update index_php_apt.py 2024-01-07 02:56:30 +08:00
Mr Chen 5bf4401fb0 Update index_php_apt.py 2024-01-07 02:51:56 +08:00
Mr Chen 12117a3b27 Update index_php_apt.py 2024-01-07 02:47:58 +08:00
Mr Chen d726f1bb15 Update php.js 2024-01-07 02:43:33 +08:00
Mr Chen a2b316b4d2 update 2024-01-07 02:40:56 +08:00
Mr Chen 0d48e5250a Update php.js 2024-01-07 02:35:21 +08:00
Mr Chen d3cd606432 Update php.js 2024-01-07 02:35:14 +08:00
Mr Chen 600435f23c update 2024-01-07 02:34:33 +08:00
Mr Chen b4831d64b9 php界面优化 2024-01-07 02:32:04 +08:00
Mr Chen 6638967636 Create script.sh 2024-01-07 02:05:19 +08:00
Mr Chen ead409a58c Update linux.conf 2024-01-07 01:32:15 +08:00
Mr Chen 971da145cb Update linux.conf 2024-01-07 01:21:59 +08:00
Mr Chen 055d440484 up 2024-01-04 19:54:50 +08:00
Mr Chen 97e2d131b4 update 2024-01-01 19:26:19 +08:00
Mr Chen e2784d2d55 Update .gitignore 2024-01-01 02:18:10 +08:00
Mr Chen 6b697ae3be Update opcache.sh 2023-12-31 02:15:07 +08:00
Mr Chen 207fa1d15e Update index.py 2023-12-30 19:58:54 +08:00
Mr Chen 454e399d3d Update phpmongoadmin.conf 2023-12-30 19:32:39 +08:00
Mr Chen 6ea8f20a9d php mongo admin 2023-12-30 19:32:17 +08:00
Mr Chen 9dc3496c27 update 2023-12-30 04:30:21 +08:00
Mr Chen b523b84609 Update info.json 2023-12-30 04:19:03 +08:00
Mr Chen e443b88ad9 phpredisadmin 2023-12-30 04:12:15 +08:00
Mr Chen 480ae78579 Update redis.conf 2023-12-30 03:32:23 +08:00
Mr Chen fb31e3ca15 Update index.py 2023-12-30 03:31:39 +08:00
Mr Chen 53fdaed5c3 Update install.sh 2023-12-30 03:21:20 +08:00
Mr Chen 37f6f2b6bc update 2023-12-30 03:21:13 +08:00
Mr Chen d1028bcc41 Update install.sh 2023-12-30 02:43:43 +08:00
Mr Chen 72e7800b50 AD调整 2023-12-30 00:04:39 +08:00
Mr Chen bb717d2963 update 2023-12-28 19:07:05 +08:00
Mr Chen 16787aebd0 Update stats.js 2023-12-28 03:34:53 +08:00
Mr Chen d769822731 Update stats.js 2023-12-28 03:32:48 +08:00
Mr Chen b6073ba8d3 Update maccms.conf 2023-12-28 00:47:18 +08:00
Mr Chen 8d50f75f18 php 升级 2023-12-27 20:46:10 +08:00
Mr Chen 8077b4cb13 Update gtid.cnf 2023-12-25 19:58:20 +08:00
Mr Chen 7a9f1ebf5e Create orm.py 2023-12-25 19:56:48 +08:00
Mr Chen 21f5670a85 Update index.py 2023-12-23 00:41:00 +08:00
Mr Chen dbd0664c72 Merge pull request #519 from midoks/dev
mysql-apt/mysql-yum 功能增强
2023-12-22 23:25:00 +08:00
Mr Chen f9e53164d9 Update README.md 2023-12-22 23:23:24 +08:00
Mr Chen 62e0321126 Update index.py 2023-12-22 23:10:47 +08:00
Mr Chen 51b82ecbbb Update index.py 2023-12-22 23:09:32 +08:00
Mr Chen 0229f50fef Update install.sh 2023-12-22 23:04:53 +08:00
Mr Chen be176001ea Update index.py 2023-12-22 22:50:33 +08:00
Mr Chen 3bea21bb94 update 2023-12-22 22:48:14 +08:00
Mr Chen 4b3104c849 Update index.py 2023-12-22 22:32:59 +08:00
Mr Chen 0cbb1ad02e Update index.py 2023-12-22 22:28:50 +08:00
Mr Chen 221f114dd4 Update index.py 2023-12-22 22:28:17 +08:00
Mr Chen 5a5c2f3e33 update 2023-12-22 22:20:03 +08:00
Mr Chen 69de62f8c3 Update index.py 2023-12-22 22:12:41 +08:00
Mr Chen af7698e157 update 2023-12-22 22:02:46 +08:00
Mr Chen f0af84f940 Update index.py 2023-12-22 21:54:05 +08:00
Mr Chen 4802dde50a update 2023-12-22 21:52:31 +08:00
Mr Chen fcbf7be2b6 update 2023-12-22 21:45:06 +08:00
Mr Chen f77484df84 update 2023-12-22 21:42:06 +08:00
Mr Chen 64ccba7595 Update index.py 2023-12-22 21:37:57 +08:00
Mr Chen b1935372a1 Update index.py 2023-12-22 21:37:37 +08:00
Mr Chen 03c9afed4a Create index_mysql_apt.py 2023-12-22 21:35:09 +08:00
Mr Chen 4e63c82e93 update 2023-12-22 21:32:20 +08:00
Mr Chen 6fa2fde791 Update index_mysql_apt.py 2023-12-22 21:23:28 +08:00
Mr Chen 98353df1ee Update index.py 2023-12-22 21:20:26 +08:00
Mr Chen 50978741aa Update index.py 2023-12-22 21:14:59 +08:00
Mr Chen d4431f11be Update index.py 2023-12-22 21:09:08 +08:00
Mr Chen 3faad62dd8 update 2023-12-22 20:58:23 +08:00
Mr Chen 6d2550e607 update 2023-12-22 20:31:23 +08:00
Mr Chen f835e4d6a1 Merge branch 'master' into dev 2023-12-22 15:53:37 +08:00
Mr Chen e33bdc5b7d Merge pull request #518 from midoks/dev
mariadb功能增强
2023-12-22 15:33:30 +08:00
Mr Chen 1e6fe01819 Update index.py 2023-12-22 15:21:12 +08:00
Mr Chen c522738df5 Update mysql.js 2023-12-22 15:20:37 +08:00
Mr Chen 5a8be9de7c Update mariadb.js 2023-12-22 15:19:44 +08:00
Mr Chen fd9c860d9b Update index.py 2023-12-22 15:11:12 +08:00
Mr Chen 306a6d450f Update index.py 2023-12-22 15:04:56 +08:00
Mr Chen 79fd1d7157 Update install.sh 2023-12-22 14:55:58 +08:00
Mr Chen 9276e811c2 update 2023-12-22 14:50:50 +08:00
Mr Chen d1493ca13f Update index.py 2023-12-22 05:27:01 +08:00
Mr Chen 13c605d58a Update index.py 2023-12-22 05:26:16 +08:00
Mr Chen 36d19f2250 up 2023-12-22 05:21:59 +08:00
Mr Chen 8f229c99be Update index.py 2023-12-22 05:05:48 +08:00
Mr Chen 72b16e9540 update 2023-12-22 04:59:19 +08:00
Mr Chen dbe2a1f0df Update index.py 2023-12-22 04:56:05 +08:00
Mr Chen 4c3f8c095f Update index.py 2023-12-22 04:55:30 +08:00
Mr Chen 589933dc33 Update index.py 2023-12-22 04:53:05 +08:00
Mr Chen de36f41182 Update index.py 2023-12-22 04:51:07 +08:00
Mr Chen 8e1b4881c4 Update index.py 2023-12-22 04:22:10 +08:00
Mr Chen 692872ecd6 Update index.py 2023-12-22 04:14:58 +08:00
Mr Chen d422a640d5 Update index.py 2023-12-22 03:48:35 +08:00
Mr Chen 46d293613e Update index.py 2023-12-22 03:46:26 +08:00
Mr Chen b775625890 Update index.py 2023-12-22 03:25:54 +08:00
Mr Chen eb2bb595de Update index.py 2023-12-22 03:10:31 +08:00
Mr Chen 0ddc3bf762 Update index.py 2023-12-22 03:05:50 +08:00
Mr Chen e45604f211 update 2023-12-22 02:49:13 +08:00
Mr Chen 4f22d9ae70 update 2023-12-22 02:39:43 +08:00
Mr Chen 732363ec41 Update index.py 2023-12-22 01:26:16 +08:00
Mr Chen bc688aa93f update 2023-12-22 01:23:47 +08:00
Mr Chen 56ed68b888 mariadb 二进制查看 2023-12-22 01:17:45 +08:00
Mr Chen 90539a5049 Update index.py 2023-12-22 01:08:36 +08:00
Mr Chen df15100272 Update mariadb.js 2023-12-22 01:04:20 +08:00
Mr Chen 4bfec3ac06 Update index.py 2023-12-22 01:01:46 +08:00
Mr Chen 3a80a27970 Update mysql.js 2023-12-22 00:56:02 +08:00
Mr Chen 09e79aff63 Update index.py 2023-12-22 00:55:18 +08:00
Mr Chen 41a36a6fd3 Update index.py 2023-12-22 00:52:15 +08:00
Mr Chen fc0974dc91 mysql修复功能-敏感功能优化 2023-12-22 00:34:23 +08:00
Mr Chen 4942c92b33 Update index.py 2023-12-22 00:24:08 +08:00
Mr Chen e173c2e51a mysql修复功能-敏感功能优化 2023-12-22 00:18:41 +08:00
Mr Chen daddf317e2 Update info.json 2023-12-21 19:07:32 +08:00
Mr Chen 7e919050b2 Create my8.2.cnf 2023-12-21 19:01:03 +08:00
Mr Chen af9d050536 update 2023-12-21 18:59:32 +08:00
Mr Chen a9e6acd407 Update phplib.conf 2023-12-21 18:57:03 +08:00
Mr Chen 180e67dde9 Update info.json 2023-12-21 18:11:37 +08:00
Mr Chen f8451fadba Create install.sh 2023-12-21 18:10:49 +08:00
Mr Chen 558bfcb1ee 调整 2023-12-20 01:15:06 +08:00
Mr Chen 6a27e69ee7 Update config_api.py 2023-12-19 23:34:11 +08:00
Mr Chen b5d28b4ef2 流量显示优化 2023-12-19 23:31:18 +08:00
Mr Chen 8f80336901 Update index.py 2023-12-18 22:18:54 +08:00
Mr Chen 0a78dda06c update 2023-12-18 22:13:03 +08:00
Mr Chen b6c3020705 Update index.py 2023-12-18 21:42:56 +08:00
Mr Chen ed70d4faa3 Update index.py 2023-12-18 21:41:26 +08:00
Mr Chen 46e4f55105 Merge pull request #517 from midoks/dev
mongodb优化
2023-12-17 13:52:23 +08:00
Mr Chen 235f0b6d66 Update mongodb.conf 2023-12-17 13:47:30 +08:00
Mr Chen 633066088d Update index.py 2023-12-17 13:32:39 +08:00
Mr Chen 48f223f4f9 Update index.html 2023-12-16 20:59:29 +08:00
Mr Chen 709a91dcec Update mongodb.js 2023-12-16 17:06:22 +08:00
Mr Chen 2592291b49 update 2023-12-16 17:01:49 +08:00
Mr Chen 502893194e mongo状态 2023-12-16 16:30:34 +08:00
Mr Chen 8976e97ea5 Update mongodb.conf 2023-12-16 15:25:18 +08:00
Mr Chen 22cb5f3bc2 Update config.js 2023-12-15 18:36:20 +08:00
Mr Chen 0888b89ea7 Update config.js 2023-12-15 18:36:14 +08:00
Mr Chen 738e69562e Update config.js 2023-12-15 18:35:54 +08:00
Mr Chen 511b62d911 Merge pull request #516 from midoks/dev
mysql8.2及密码生成加强
2023-12-15 14:49:43 +08:00
Mr Chen d748674b49 Update public.js 2023-12-15 14:48:54 +08:00
Mr Chen 828372f16f Update public.js 2023-12-15 14:47:52 +08:00
Mr Chen a349b2bc81 Update install.sh 2023-12-14 14:00:31 +08:00
Mr Chen 4f3fe2af54 Update index.py 2023-12-14 13:59:08 +08:00
Mr Chen 4670811fd6 Create my8.2.cnf 2023-12-14 13:33:04 +08:00
Mr Chen e1fb85859a Update install.sh 2023-12-14 01:01:21 +08:00
Mr Chen c0fc1148eb Update install.sh 2023-12-14 01:01:01 +08:00
Mr Chen 50052e7650 Update install.sh 2023-12-14 00:58:02 +08:00
Mr Chen 8053f9b593 Update install.sh 2023-12-14 00:30:58 +08:00
Mr Chen 1a5cdca70d Update mysql.js 2023-12-14 00:22:27 +08:00
Mr Chen 341690d234 Update mysql.js 2023-12-14 00:20:24 +08:00
Mr Chen d76654b853 Update mysql.js 2023-12-14 00:17:37 +08:00
Mr Chen 0ef35e1474 Update mysql.js 2023-12-14 00:12:56 +08:00
Mr Chen 9ea52e452a mysql识别登录加密规则 2023-12-14 00:04:48 +08:00
Mr Chen 5e39e1a463 Update my8.0.cnf 2023-12-13 23:54:39 +08:00
Mr Chen 36421ae254 update 2023-12-13 23:51:18 +08:00
Mr Chen a34f025a36 Update index.py 2023-12-13 23:33:25 +08:00
Mr Chen 7be4f9ea98 Update index.py 2023-12-13 23:32:59 +08:00
Mr Chen 2dc93bf490 Update my8.0.cnf 2023-12-13 23:27:18 +08:00
Mr Chen 73fb46fcc0 Merge pull request #515 from midoks/dev
mongodb配置优化
2023-12-12 14:54:49 +08:00
Mr Chen f4ea1dc544 Update index.py 2023-12-12 14:51:47 +08:00
Mr Chen d17cc990fe Update index.py 2023-12-12 14:44:39 +08:00
Mr Chen 8edd40393b Update index.py 2023-12-12 14:44:23 +08:00
Mr Chen 98e653710c Update index.py 2023-12-12 14:43:49 +08:00
Mr Chen 3eb6937778 Update layout.html 2023-12-12 13:22:31 +08:00
Mr Chen 974eaf3583 Merge branch 'master' into dev 2023-12-11 23:32:27 +08:00
Mr Chen dadcc2df6d Merge pull request #514 from midoks/dev
部分更新
2023-12-11 23:32:14 +08:00
Mr Chen 639d5413e5 up 2023-12-11 23:20:34 +08:00
Mr Chen 1d114d9db7 Update cmd.md 2023-12-09 15:59:36 +08:00
Mr Chen dfa669a032 Update cmd.md 2023-12-09 15:58:57 +08:00
Mr Chen bf370685b3 Update install.sh 2023-12-07 13:27:46 +08:00
Mr Chen 8f9bdde0a1 Update info.json 2023-12-06 21:10:32 +08:00
Mr Chen dbbc32258a Create install.sh 2023-12-06 21:09:56 +08:00
Mr Chen bf79e3028a Merge pull request #513 from midoks/dev
地址更新
2023-12-05 13:08:47 +08:00
Mr Chen 0650858824 update 2023-12-05 13:07:56 +08:00
Mr Chen 83f736d5b2 Update install.sh 2023-12-05 13:06:59 +08:00
Mr Chen bafee3782a Merge pull request #512 from midoks/dev
地址更新
2023-12-04 16:24:36 +08:00
Mr Chen 1aff003ba3 Update mw.tpl 2023-12-04 16:23:54 +08:00
Mr Chen 30e779686a Merge pull request #511 from midoks/dev
域名更改
2023-12-04 13:19:24 +08:00
Mr Chen 15eccc72f3 Update README.md 2023-12-04 13:18:46 +08:00
Mr Chen f69691fac7 Update plugins_api.py 2023-12-04 00:13:41 +08:00
Mr Chen 1ffcb9ca7d 站点-优化提示 2023-12-04 00:10:03 +08:00
Mr Chen 75514f8e5c update 2023-12-03 03:15:13 +08:00
Mr Chen 098be84816 Update push_bbs_ntid.py 2023-12-03 03:14:19 +08:00
Mr Chen 8752e394a3 Update mw.py 2023-12-03 01:23:18 +08:00
Mr Chen 0350f3ecbb Update mw.py 2023-12-03 01:17:50 +08:00
Mr Chen 3c855afc43 Merge pull request #510 from midoks/dev
简单更新
2023-12-03 00:31:34 +08:00
Mr Chen 0c8ec2132f Update README.md 2023-12-03 00:30:43 +08:00
Mr Chen e3deac06b4 Update README.md 2023-12-03 00:30:09 +08:00
Mr Chen b92dbea2c8 update 2023-12-01 12:09:20 +08:00
Mr Chen 4da6738909 Merge pull request #509 from midoks/dev
换自建域名
2023-12-01 11:44:12 +08:00
Mr Chen 1665256627 换自建域名 2023-12-01 11:43:31 +08:00
Mr Chen d49ebe9fa8 Update index.py 2023-11-29 00:35:51 +08:00
Mr Chen 6dbdf26d80 Update index.py 2023-11-28 17:33:02 +08:00
Mr Chen 114ed15c02 Update supervisor.service 2023-11-28 12:49:56 +08:00
Mr Chen 315eb82a89 Update index.py 2023-11-28 12:46:23 +08:00
Mr Chen f4ef03304d Update install.sh 2023-11-28 12:28:04 +08:00
Mr Chen 9877d04979 查看日志优化 2023-11-25 22:09:17 +08:00
Mr Chen e6f379db9d Merge pull request #507 from midoks/dev
php83正式版发布
2023-11-24 17:01:00 +08:00
Mr Chen ecad324fc6 Update install.sh 2023-11-24 16:27:45 +08:00
Mr Chen ed13ee1645 Update install.sh 2023-11-24 16:26:33 +08:00
Mr Chen 603c436f4e Update commit.tpl 2023-11-23 19:33:01 +08:00
Mr Chen d917c23fda Update webstats_common.lua 2023-11-21 22:17:01 +08:00
Mr Chen a0c4273280 Update webstats_common.lua 2023-11-21 21:59:24 +08:00
Mr Chen 8e71d0a306 Update webstats_common.lua 2023-11-21 19:08:39 +08:00
Mr Chen 01dfb6f248 Merge pull request #506 from midoks/dev
命令行开启ipv6支持
2023-11-21 00:44:34 +08:00
Mr Chen 4ab1d14ffe update 2023-11-21 00:43:38 +08:00
Mr Chen 665fe41014 Update tool_migrate.py 2023-11-20 23:51:12 +08:00
Mr Chen ddba4f3abe Update tool_migrate.py 2023-11-20 23:43:18 +08:00
Mr Chen 1f65f80bef Update webstats_common.lua 2023-11-20 23:40:07 +08:00
Mr Chen 8dd9f707a6 命令行开启ip支持 2023-11-20 20:57:53 +08:00
Mr Chen 14437611c8 Merge pull request #505 from midoks/dev
增加php扩展
2023-11-20 01:01:13 +08:00
Mr Chen bfe857ee59 Update install.sh 2023-11-19 22:00:53 +08:00
Mr Chen 01efa67bf1 Merge branch 'master' of https://github.com/midoks/mdserver-web 2023-11-19 21:38:07 +08:00
Mr Chen 3b3356d5c6 update 2023-11-19 21:37:41 +08:00
Mr Chen 6dbfd385fb Update readline.sh 2023-11-19 21:34:35 +08:00
Mr Chen 1e9fa587f5 Update all_test.sh 2023-11-19 21:34:30 +08:00
Mr Chen fd673b76e8 Update phplib.conf 2023-11-19 21:34:07 +08:00
Mr Chen d2340872c0 Update libedit.sh 2023-11-19 21:05:46 +08:00
Mr Chen 1c14566b6c Update readline.sh 2023-11-19 21:03:49 +08:00
Mr Chen adde0086aa Create libedit.sh 2023-11-19 21:02:31 +08:00
Mr Chen b6ca99f1ef Update libiconv.sh 2023-11-19 20:50:16 +08:00
Mr Chen c920b46a13 Update readline.sh 2023-11-19 20:37:30 +08:00
Mr Chen 338e64d295 Update event.sh 2023-11-19 20:34:08 +08:00
Mr Chen f030f7a97d event 2023-11-19 20:33:19 +08:00
Mr Chen ef7da2ec96 update 2023-11-19 20:30:47 +08:00
Mr Chen 6dec09741f Update maccms.conf 2023-11-19 19:26:03 +08:00
Mr Chen 6d75a65a09 Update maccms.conf 2023-11-19 17:38:23 +08:00
Mr Chen 8eeb55d555 Update maccms.conf 2023-11-19 17:32:53 +08:00
Mr Chen f54feaa87b Update maccms.conf 2023-11-19 17:29:50 +08:00
Mr Chen b828fc2188 Update maccms.conf 2023-11-19 17:23:22 +08:00
Mr Chen e645be4285 Update maccms.conf 2023-11-19 17:18:01 +08:00
Mr Chen 05a7b8818e Update maccms.conf 2023-11-19 17:10:53 +08:00
Mr Chen 391b313a65 Update maccms.conf 2023-11-19 17:06:13 +08:00
Mr Chen df7bff4a72 Update maccms.conf 2023-11-19 17:04:10 +08:00
Mr Chen 2eefd7d3fa Update maccms.conf 2023-11-19 16:58:15 +08:00
Mr Chen 130e4cf546 Update maccms.conf 2023-11-19 16:55:05 +08:00
Mr Chen 096dfa6b96 Create maccms.conf 2023-11-19 16:54:36 +08:00
Mr Chen 77361259c3 Update install.sh 2023-11-19 16:10:22 +08:00
Mr Chen 4aad9f90db mac 不判断root 2023-11-08 11:58:50 +08:00
241 changed files with 15017 additions and 1453 deletions
+2 -2
View File
@@ -154,6 +154,7 @@ data/notify.json
data/api.json data/api.json
data/bind_domain.pl data/bind_domain.pl
data/unauthorized_status.pl data/unauthorized_status.pl
data/auth_secret.pl
plugins/vip_* plugins/vip_*
plugins/own_* plugins/own_*
@@ -171,10 +172,9 @@ plugins/fastdfs
plugins/v2ray plugins/v2ray
plugins/frp plugins/frp
plugins/file_search plugins/file_search
plugins/proxysql
debug.out debug.out
mdioks.session-journal mdioks.session-journal
*.session *.session
+15 -24
View File
@@ -29,20 +29,20 @@
基本上可以使用,后续会继续优化!欢迎提供意见! 基本上可以使用,后续会继续优化!欢迎提供意见!
- 吹水组 - https://t.me/mdserver_web - 吹水组 - https://t.me/mdserver_web
- 交流论坛 - https://bbs.midoks.me - 交流论坛 - https://bbs.midoks.icu
- discord - https://discord.gg/3zXk4mES
``` ```
如果出现问题,最好私给我面板信息。不要让我猜。如果不提供,不要提出问题,自行解决。 — 座右铭 如果出现问题,最好私给我面板信息。不要让我猜。如果不提供,不要提出问题,自行解决。 — 座右铭
Talk is cheap, show me the code. -- linus Talk is cheap, show me the code. -- linus
``` ```
- [兼容性测试报告](/compatibility.md) - [兼容性测试报告](/compatibility.md)
- [常用命令说明](/cmd.md) - [常用命令说明](/cmd.md) [ mw default ] [ mw update_dev ]
### 主要插件介绍 ### 主要插件介绍
* OpenResty - 轻量级,占有内存少,并发能力强。 * OpenResty - 轻量级,占有内存少,并发能力强。
* PHP[53-82] - PHP是世界上最好的编程语言。 * PHP[53-83] - PHP是世界上最好的编程语言。
* MySQL - 一种关系数据库管理系统。 * MySQL - 一种关系数据库管理系统。
* MariaDB - 是MySQL的一个重要分支。 * MariaDB - 是MySQL的一个重要分支。
* MySQL[APT/YUM] - 一种关系数据库管理系统。 * MySQL[APT/YUM] - 一种关系数据库管理系统。
@@ -78,7 +78,7 @@ phpMyAdmin[4.4.15]支持MySQL[5.5-5.7]
phpMyAdmin[5.2.0]支持MySQL[8.0] phpMyAdmin[5.2.0]支持MySQL[8.0]
PHP[53-72]支持phpMyAdmin[4.4.15] PHP[53-72]支持phpMyAdmin[4.4.15]
PHP[72-82]支持phpMyAdmin[5.2.0] PHP[72-83]支持phpMyAdmin[5.2.0]
``` ```
# 郑重声明 # 郑重声明
@@ -90,7 +90,7 @@ PHP[72-82]支持phpMyAdmin[5.2.0]
# 特别赞助 # 特别赞助
- [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan.pw/) - [找资源 - 阿里云盘资源搜索引擎](https://zhaoziyuan1.cc)
# AD - VPS推荐 - 🙏 # AD - VPS推荐 - 🙏
@@ -102,26 +102,17 @@ PHP[72-82]支持phpMyAdmin[5.2.0]
# Docker # Docker
- 由[DDSRem](https://github.com/DDSRem)开发维护。 - 由[DDS-Derek](https://github.com/DDS-Derek)开发维护。
- https://hub.docker.com/r/ddsderek/mw - https://github.com/DDS-Derek/mdserver-web-Docker
``` ```
docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443:443 -p 888:888 ddsderek/mw-server:latest docker run -itd --name mw-server --privileged=true -p 7200:7200 -p 80:80 -p 443:443 -p 888:888 ddsderek/mw-server:latest
``` ```
### 版本更新 0.16.2 ### 版本更新 0.16.7
* keepalived插件改造,集成mysql高可用配置。 - mongodb副本设置/备份/认证。
* redis(主从/集群)配置识别。
* MySQL主从同步1236错误,添加修复功能。
* MySQL二进制日志查看。
* 源码安装成功后删除解压包,节省体积。
* 网站统计-增加查询条件。
* php增加yaml扩展。
* php扩展ioncube修复。
* php-fpm增加【按需】配置。
* gitea/gogs同步功能改造。
### JSDelivr安装地址 ### JSDelivr安装地址
@@ -149,7 +140,7 @@ 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://raw.githubusercontent.com/midoks/mdserver-web/master/scripts/install.sh | bash
curl --insecure -fsSL https://code.midoks.me/midoks/mdserver-web/raw/branch/master/scripts/install.sh | bash curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/master/scripts/install.sh | bash
``` ```
- 直接更新 - 直接更新
@@ -186,8 +177,8 @@ wget --no-check-certificate -O uninstall.sh https://raw.githubusercontent.com/mi
curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/debug.sh | bash curl --insecure -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/dev/scripts/quick/debug.sh | bash
curl --insecure -fsSL https://code.midoks.me/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/install_dev.sh | bash
curl --insecure -fsSL https://code.midoks.me/midoks/mdserver-web/raw/branch/dev/scripts/update_dev.sh | bash curl --insecure -fsSL https://code.midoks.icu/midoks/mdserver-web/raw/branch/dev/scripts/update_dev.sh | bash
``` ```
### 捐赠地址 USDT(TRC20) ### 捐赠地址 USDT(TRC20)
@@ -197,9 +188,9 @@ TVbNgrpeGBGZVm5gTLa21ADP7RpnPFhjya
日行一善,以后必定大富大贵 日行一善,以后必定大富大贵
### 微信赞助 ### 支付宝赞助
[![截图](https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/route/static/img/weixin_zz.jpg)](https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/route/static/img/weixin_zz.jpg) [![截图](https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/route/static/img/alipay_zz.png)](https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/route/static/img/alipay_zz.png)
### 无图不真相 ### 无图不真相
+2 -97
View File
@@ -441,19 +441,7 @@ fi
return None return None
if not os.path.exists(site_path): if not os.path.exists(site_path):
return None return None
args = mw.dict_obj() return site_path
args.id = site_id
import panelSite
run_path = panelSite.panelSite().GetRunPath(args)
if run_path in ['/']:
run_path = ''
if run_path:
if run_path[0] == '/':
run_path = run_path[1:]
site_run_path = os.path.join(site_path, run_path)
if not os.path.exists(site_run_path):
return site_path
return site_run_path
else: else:
return False return False
@@ -1283,85 +1271,6 @@ fullchain.pem 粘贴到证书输入框
root = old_domain_name root = old_domain_name
return root, zone return root, zone
# 获取当前正在使用此证书的网站目录
def getSslUsedSite(self, save_path):
pkey_file = '{}/privkey.pem'.format(save_path)
pkey = mw.readFile(pkey_file)
if not pkey:
return False
cert_paths = 'vhost/cert'
import panelSite
args = mw.dict_obj()
args.siteName = ''
for c_name in os.listdir(cert_paths):
skey_file = '{}/{}/privkey.pem'.format(cert_paths, c_name)
skey = mw.readFile(skey_file)
if not skey:
continue
if skey == pkey:
args.siteName = c_name
run_path = panelSite.panelSite().GetRunPath(args)
if not run_path:
continue
sitePath = mw.M('sites').where(
'name=?', c_name).getField('path')
if not sitePath:
continue
to_path = "{}/{}".format(sitePath, run_path)
return to_path
return False
def renewCertOther(self):
cert_path = "{}/vhost/cert".format(mw.getRunDir())
if not os.path.exists(cert_path):
return
new_time = time.time() + (86400 * 30)
n = 0
if not 'orders' in self.__config:
self.__config['orders'] = {}
import panelSite
siteObj = panelSite.panelSite()
args = mw.dict_obj()
for siteName in os.listdir(cert_path):
try:
cert_file = '{}/{}/fullchain.pem'.format(cert_path, siteName)
if not os.path.exists(cert_file):
continue # 无证书文件
siteInfo = mw.M('sites').where('name=?', siteName).find()
if not siteInfo:
continue # 无网站信息
cert_init = self.getCertInit(cert_file)
if not cert_init:
continue # 无法获取证书
end_time = time.mktime(time.strptime(
cert_init['notAfter'], '%Y-%m-%d'))
if end_time > new_time:
continue # 未到期
try:
if not cert_init['issuer'] in ['R3', "Let's Encrypt"] and cert_init['issuer'].find("Let's Encrypt") == -1:
continue # 非同品牌证书
except:
continue
if isinstance(cert_init['dns'], str):
cert_init['dns'] = [cert_init['dns']]
index = self.getIndex(cert_init['dns'])
if index in self.__config['orders'].keys():
continue # 已在订单列表
n += 1
writeLog(
"|-正在续签第 {} 张其它证书,域名: {}..".format(n, cert_init['subject']))
writeLog("|-正在创建订单..")
args.id = siteInfo['id']
runPath = siteObj.GetRunPath(args)
if runPath and not runPath in ['/']:
path = siteInfo['path'] + '/' + runPath
else:
path = siteInfo['path']
except:
writeLog("|-[{}]续签失败".format(siteName))
# 外部API - START ---------------------------------------------------------- # 外部API - START ----------------------------------------------------------
def getHostConf(self, siteName): def getHostConf(self, siteName):
return mw.getServerDir() + '/web_conf/nginx/vhost/' + siteName + '.conf' return mw.getServerDir() + '/web_conf/nginx/vhost/' + siteName + '.conf'
@@ -1509,8 +1418,7 @@ fullchain.pem 粘贴到证书输入框
# 已删除的网站直接跳过续签 # 已删除的网站直接跳过续签
if self.__config['orders'][i]['auth_to'].find('|') == -1 and self.__config['orders'][i]['auth_to'].find('/') != -1: if self.__config['orders'][i]['auth_to'].find('|') == -1 and self.__config['orders'][i]['auth_to'].find('/') != -1:
if not os.path.exists(self.__config['orders'][i]['auth_to']): if not os.path.exists(self.__config['orders'][i]['auth_to']):
auth_to = self.getSslUsedSite( auth_to = self.__config['orders'][i]['auth_to']
self.__config['orders'][i]['save_path'])
if not auth_to: if not auth_to:
continue continue
@@ -1549,9 +1457,6 @@ fullchain.pem 粘贴到证书输入框
# 加入到续签订单 # 加入到续签订单
order_index.append(i) order_index.append(i)
if not order_index: if not order_index:
writeLog("|-没有找到30天内到期的SSL证书,正在尝试去寻找其它可续签证书!")
# self.getApis()
# self.renewCertOther()
writeLog("|-所有任务已处理完成!") writeLog("|-所有任务已处理完成!")
return return
writeLog("|-共需要续签 {} 张证书".format(len(order_index))) writeLog("|-共需要续签 {} 张证书".format(len(order_index)))
+1 -1
View File
@@ -242,7 +242,7 @@ class cert_request:
# 注册acme帐户 # 注册acme帐户
def register(self, existing=False): def register(self, existing=False):
if not 'email' in self.__config: if not 'email' in self.__config:
self.__config['email'] = 'mdioks@163.com' self.__config['email'] = 'xxxx.xxxx@gmail.com'
if existing: if existing:
payload = {"onlyReturnExisting": True} payload = {"onlyReturnExisting": True}
elif self.__config['email']: elif self.__config['email']:
+1 -12
View File
@@ -33,10 +33,10 @@ from flask import redirect
def init(): def init():
initDB() initDB()
initDBSshPort()
initUserInfo() initUserInfo()
initInitD() initInitD()
initInitTask() initInitTask()
return True
def local(): def local():
@@ -63,17 +63,6 @@ def initDB():
print(str(ex)) print(str(ex))
def initDBSshPort():
# SSH端口必须放开
import firewall_api
cmd_data = mw.execShell(
"cat /etc/ssh/sshd_config | grep '^Port \d*' | tail -1")
ssh_port = cmd_data[0].replace("Port ", '').strip()
if ssh_port == '':
ssh_port = '22'
firewall_api.firewall_api().addAcceptPortArgs(ssh_port, 'SSH远程管理服务', 'port')
def doContentReplace(src, dst): def doContentReplace(src, dst):
content = mw.readFile(src) content = mw.readFile(src)
content = content.replace("{$SERVER_PATH}", mw.getRunDir()) content = content.replace("{$SERVER_PATH}", mw.getRunDir())
+121 -47
View File
@@ -20,6 +20,7 @@ import mw
import re import re
import json import json
import pwd import pwd
import pytz
from flask import session from flask import session
from flask import request from flask import request
@@ -27,9 +28,26 @@ from flask import request
class config_api: class config_api:
__version = '0.16.2' __version = '0.16.7'
__api_addr = 'data/api.json' __api_addr = 'data/api.json'
# 统一默认配置文件
__file = {
'api' : 'data/api.json', # API文件
'debug' : 'data/debug.pl', # DEBUG文件
'close' : 'data/close.pl', # 识别关闭面板文件
'basic_auth' : 'data/basic_auth.json', # 面板Basic验证
'admin_path' : 'data/admin_path.pl', # 面板后缀路径设置
'ipv6' : 'data/ipv6.pl', # ipv6识别文件
'bind_domain' : 'data/bind_domain.pl', # 面板域名绑定
'unauth_status' : 'data/unauthorized_status.pl', # URL路径未成功显示状态
'auth_secret': 'data/auth_secret.pl', # 二次验证密钥
'ssl':'data/ssl.pl', # ssl设置
'hook_database' : 'data/hook_database.json', # 数据库钩子
'hook_menu' : 'data/hook_menu.json', # 菜单钩子
'hook_global_static' : 'data/hook_global_static.json', # 静态文件钩子
}
def __init__(self): def __init__(self):
pass pass
@@ -178,7 +196,7 @@ class config_api:
basic_open = request.form.get('is_open', '').strip() basic_open = request.form.get('is_open', '').strip()
salt = '_md_salt' salt = '_md_salt'
path = 'data/basic_auth.json' path = self.__file['basic_auth']
is_open = True is_open = True
if basic_open == 'false': if basic_open == 'false':
@@ -223,7 +241,7 @@ class config_api:
backup_path = request.form.get('backup_path', '') backup_path = request.form.get('backup_path', '')
if domain != '': if domain != '':
reg = "^([\w\-\*]{1,100}\.){1,4}(\w{1,10}|\w{1,10}\.\w{1,10})$" reg = "^([\\w\\-\\*]{1,100}\\.){1,4}(\\w{1,10}|\\w{1,10}\\.\\w{1,10})$"
if not re.match(reg, domain): if not re.match(reg, domain):
return mw.returnJson(False, '主域名格式不正确') return mw.returnJson(False, '主域名格式不正确')
@@ -285,7 +303,7 @@ class config_api:
return mw.returnJson(False, '安全入口地址长度不能小于6位!') return mw.returnJson(False, '安全入口地址长度不能小于6位!')
if admin_path in admin_path_checks: if admin_path in admin_path_checks:
return mw.returnJson(False, '该入口已被面板占用,请使用其它入口!') return mw.returnJson(False, '该入口已被面板占用,请使用其它入口!')
if not re.match("^/[\w\./-_]+$", admin_path): if not re.match("^/[\\w\\./-_]+$", admin_path):
return mw.returnJson(False, '入口地址格式不正确,示例: /mw_rand') return mw.returnJson(False, '入口地址格式不正确,示例: /mw_rand')
# else: # else:
# domain = mw.readFile('data/bind_domain.pl') # domain = mw.readFile('data/bind_domain.pl')
@@ -299,7 +317,7 @@ class config_api:
# '警告,关闭安全入口等于直接暴露你的后台地址在外网,十分危险,至少开启以下一种安全方式才能关闭:<a # '警告,关闭安全入口等于直接暴露你的后台地址在外网,十分危险,至少开启以下一种安全方式才能关闭:<a
# style="color:red;"><br>1、绑定访问域名<br>2、绑定授权IP</a>') # style="color:red;"><br>1、绑定访问域名<br>2、绑定授权IP</a>')
admin_path_file = 'data/admin_path.pl' admin_path_file = self.__file['admin_path']
admin_path_old = '/' admin_path_old = '/'
if os.path.exists(admin_path_file): if os.path.exists(admin_path_file):
admin_path_old = mw.readFile(admin_path_file).strip() admin_path_old = mw.readFile(admin_path_file).strip()
@@ -310,7 +328,7 @@ class config_api:
return mw.returnJson(True, '修改成功!') return mw.returnJson(True, '修改成功!')
def closePanelApi(self): def closePanelApi(self):
filename = 'data/close.pl' filename = self.__file['close']
if os.path.exists(filename): if os.path.exists(filename):
os.remove(filename) os.remove(filename)
return mw.returnJson(True, '开启成功') return mw.returnJson(True, '开启成功')
@@ -328,8 +346,8 @@ class config_api:
return mw.returnJson(True, '开发模式开启!') return mw.returnJson(True, '开发模式开启!')
def setIpv6StatusApi(self): def setIpv6StatusApi(self):
ipv6_file = 'data/ipv6.pl' ipv6_file = self.__file['ipv6']
if os.path.exists('data/ipv6.pl'): if os.path.exists(ipv6_file):
os.remove(ipv6_file) os.remove(ipv6_file)
mw.writeLog('面板设置', '关闭面板IPv6兼容!') mw.writeLog('面板设置', '关闭面板IPv6兼容!')
else: else:
@@ -399,7 +417,7 @@ class config_api:
# 设置面板SSL证书设置 # 设置面板SSL证书设置
def setPanelHttpToHttpsApi(self): def setPanelHttpToHttpsApi(self):
bind_domain = 'data/bind_domain.pl' bind_domain = self.__file['bind_domain']
if not os.path.exists(bind_domain): if not os.path.exists(bind_domain):
return mw.returnJson(False, '先要绑定域名!') return mw.returnJson(False, '先要绑定域名!')
@@ -429,9 +447,9 @@ class config_api:
else: else:
conf = mw.readFile(panel_ssl) conf = mw.readFile(panel_ssl)
if conf: if conf:
rep = "\n\s*#HTTP_TO_HTTPS_START(.|\n){1,300}#HTTP_TO_HTTPS_END" rep = "\n\\s*#HTTP_TO_HTTPS_START(.|\n){1,300}#HTTP_TO_HTTPS_END"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+if.+server_port.+\n.+\n\s+\s*}" rep = "\\s+if.+server_port.+\n.+\n\\s+\\s*}"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
mw.writeFile(panel_ssl, conf) mw.writeFile(panel_ssl, conf)
@@ -444,7 +462,7 @@ class config_api:
# 删除面板证书 # 删除面板证书
def delPanelSslApi(self): def delPanelSslApi(self):
bind_domain = 'data/bind_domain.pl' bind_domain = self.__file['bind_domain']
if not os.path.exists(bind_domain): if not os.path.exists(bind_domain):
return mw.returnJson(False, '未绑定域名!') return mw.returnJson(False, '未绑定域名!')
@@ -473,7 +491,7 @@ class config_api:
def applyPanelLetSslApi(self): def applyPanelLetSslApi(self):
# check domain is bind? # check domain is bind?
bind_domain = 'data/bind_domain.pl' bind_domain = self.__file['bind_domain']
if not os.path.exists(bind_domain): if not os.path.exists(bind_domain):
return mw.returnJson(False, '先要绑定域名!') return mw.returnJson(False, '先要绑定域名!')
@@ -530,7 +548,7 @@ class config_api:
panel_tpl = mw.getRunDir() + "/data/tpl/nginx_panel.conf" panel_tpl = mw.getRunDir() + "/data/tpl/nginx_panel.conf"
dst_panel_path = mw.getServerDir() + "/web_conf/nginx/vhost/panel.conf" dst_panel_path = mw.getServerDir() + "/web_conf/nginx/vhost/panel.conf"
cfg_domain = 'data/bind_domain.pl' cfg_domain = self.__file['bind_domain']
if domain == '': if domain == '':
os.remove(cfg_domain) os.remove(cfg_domain)
os.remove(dst_panel_path) os.remove(dst_panel_path)
@@ -559,7 +577,7 @@ class config_api:
# 设置面板SSL # 设置面板SSL
def setPanelSslApi(self): def setPanelSslApi(self):
sslConf = mw.getRunDir() + '/data/ssl.pl' sslConf = mw.getRunDir() + '/' + self.__file['ssl']
panel_tpl = mw.getRunDir() + "/data/tpl/nginx_panel.conf" panel_tpl = mw.getRunDir() + "/data/tpl/nginx_panel.conf"
dst_panel_path = mw.getServerDir() + "/web_conf/nginx/vhost/panel.conf" dst_panel_path = mw.getServerDir() + "/web_conf/nginx/vhost/panel.conf"
@@ -568,35 +586,35 @@ class config_api:
conf = mw.readFile(dst_panel_path) conf = mw.readFile(dst_panel_path)
if conf: if conf:
rep = "\s+ssl_certificate\s+.+;\s+ssl_certificate_key\s+.+;" rep = "\\s+ssl_certificate\\s+.+;\\s+ssl_certificate_key\\s+.+;"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_protocols\s+.+;\n" rep = "\\s+ssl_protocols\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_ciphers\s+.+;\n" rep = "\\s+ssl_ciphers\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_prefer_server_ciphers\s+.+;\n" rep = "\\s+ssl_prefer_server_ciphers\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_session_cache\s+.+;\n" rep = "\\s+ssl_session_cache\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_session_timeout\s+.+;\n" rep = "\\s+ssl_session_timeout\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_ecdh_curve\s+.+;\n" rep = "\\s+ssl_ecdh_curve\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_session_tickets\s+.+;\n" rep = "\\s+ssl_session_tickets\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_stapling\s+.+;\n" rep = "\\s+ssl_stapling\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl_stapling_verify\s+.+;\n" rep = "\\s+ssl_stapling_verify\\s+.+;\n"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+ssl\s+on;" rep = "\\s+ssl\\s+on;"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+error_page\s497.+;" rep = "\\s+error_page\\s497.+;"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+if.+server_port.+\n.+\n\s+\s*}" rep = "\\s+if.+server_port.+\n.+\n\\s+\\s*}"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+listen\s+443.*;" rep = "\\s+listen\\s+443.*;"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+listen\s+\[\:\:\]\:443.*;" rep = "\\s+listen\\s+\\[\\:\\:\\]\\:443.*;"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
mw.writeFile(dst_panel_path, conf) mw.writeFile(dst_panel_path, conf)
@@ -627,7 +645,7 @@ class config_api:
conf = conf.replace('#error_page 404/404.html;', sslStr) conf = conf.replace('#error_page 404/404.html;', sslStr)
rep = "listen\s+([0-9]+)\s*[default_server]*;" rep = "listen\\s+([0-9]+)\\s*[default_server]*;"
tmp = re.findall(rep, conf) tmp = re.findall(rep, conf)
if not mw.inArray(tmp, '443'): if not mw.inArray(tmp, '443'):
listen = re.search(rep, conf).group() listen = re.search(rep, conf).group()
@@ -743,15 +761,15 @@ class config_api:
def setStatusCodeApi(self): def setStatusCodeApi(self):
status_code = request.form.get('status_code', '').strip() status_code = request.form.get('status_code', '').strip()
if re.match("^\d+$", status_code): if re.match("^\\d+$", status_code):
status_code = int(status_code) status_code = int(status_code)
if status_code != 0: if status_code != 0:
if status_code < 100 or status_code > 999: if status_code < 100 or status_code > 999:
return mw.returnJson(False, '状态码范围错误!') return mw.returnJson(False, '状态码范围错误!')
else: else:
return mw.returnJson(False, '状态码范围错误!') return mw.returnJson(False, '状态码范围错误!')
unauthorized_status = self.__file['unauth_status']
mw.writeFile('data/unauthorized_status.pl', str(status_code)) mw.writeFile(unauthorized_status, str(status_code))
mw.writeLog('面板设置', '将未授权响应状态码设置为:{}'.format(status_code)) mw.writeLog('面板设置', '将未授权响应状态码设置为:{}'.format(status_code))
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
@@ -870,8 +888,7 @@ class config_api:
if not 'token_crypt' in data: if not 'token_crypt' in data:
token = mw.getRandomString(32) token = mw.getRandomString(32)
data['token'] = mw.md5(token) data['token'] = mw.md5(token)
data['token_crypt'] = mw.enCrypt( data['token_crypt'] = mw.enCrypt(data['token'], token).decode('utf-8')
data['token'], token).decode('utf-8')
token = stats[data['open']] + '成功!' token = stats[data['open']] + '成功!'
mw.writeLog('API配置', '%sAPI接口' % stats[data['open']]) mw.writeLog('API配置', '%sAPI接口' % stats[data['open']])
@@ -887,7 +904,7 @@ class config_api:
return mw.returnJson(True, '保存成功!') return mw.returnJson(True, '保存成功!')
def renderUnauthorizedStatus(self, data): def renderUnauthorizedStatus(self, data):
cfg_unauth_status = 'data/unauthorized_status.pl' cfg_unauth_status = self.__file['unauth_status']
if os.path.exists(cfg_unauth_status): if os.path.exists(cfg_unauth_status):
status_code = mw.readFile(cfg_unauth_status) status_code = mw.readFile(cfg_unauth_status)
data['status_code'] = status_code data['status_code'] = status_code
@@ -911,6 +928,52 @@ class config_api:
data['status_code_msg'] = "默认-安全入口错误提示" data['status_code_msg'] = "默认-安全入口错误提示"
return data return data
def getTimezoneListApi(self):
# 获取时区列表
# pytz.all_timezones | 所有
# pytz.common_timezones
return pytz.all_timezones
def setTimezoneApi(self):
# 设置时区列表
timezone = request.form.get('timezone', '').strip()
cmd = 'timedatectl set-timezone "'+timezone+'"'
mw.execShell(cmd)
return mw.returnJson(True, '设置成功!')
def getAuthSecretApi(self):
reset = request.form.get('reset', '')
import pyotp
auth = self.__file['auth_secret']
tag = 'mdserver-web'
if os.path.exists(auth) and reset != '1':
content = mw.readFile(auth)
sec = mw.deDoubleCrypt(tag,content)
else:
sec = pyotp.random_base32()
crypt_data = mw.enDoubleCrypt(tag, sec)
mw.writeFile(auth, crypt_data)
ip = mw.getHostAddr()
url = pyotp.totp.TOTP(sec).provisioning_uri(name=ip, issuer_name='mdserver-web')
rdata = {}
rdata['secret'] = sec
rdata['url'] = url
return mw.returnJson(True, '设置成功!', rdata)
def setAuthSecretApi(self):
auth = self.__file['auth_secret']
if os.path.exists(auth):
os.remove(auth)
return mw.returnJson(True, '关闭成功!', 0)
else:
return mw.returnJson(True, '开启成功!', 1)
def get(self): def get(self):
data = {} data = {}
@@ -923,31 +986,38 @@ class config_api:
data['port'] = mw.getHostPort() data['port'] = mw.getHostPort()
data['ip'] = mw.getHostAddr() data['ip'] = mw.getHostAddr()
admin_path_file = 'data/admin_path.pl' admin_path_file = self.__file['admin_path']
if not os.path.exists(admin_path_file): if not os.path.exists(admin_path_file):
data['admin_path'] = '/' data['admin_path'] = '/'
else: else:
data['admin_path'] = mw.readFile(admin_path_file) data['admin_path'] = mw.readFile(admin_path_file)
ipv6_file = 'data/ipv6.pl' ipv6_file = self.__file['ipv6']
if os.path.exists(ipv6_file): if os.path.exists(ipv6_file):
data['ipv6'] = 'checked' data['ipv6'] = 'checked'
else: else:
data['ipv6'] = '' data['ipv6'] = ''
debug_file = 'data/debug.pl' debug_file = self.__file['debug']
if os.path.exists(debug_file): if os.path.exists(debug_file):
data['debug'] = 'checked' data['debug'] = 'checked'
else: else:
data['debug'] = '' data['debug'] = ''
ssl_file = 'data/ssl.pl' ssl_file = self.__file['ssl']
if os.path.exists('data/ssl.pl'): if os.path.exists(ssl_file):
data['ssl'] = 'checked' data['ssl'] = 'checked'
else: else:
data['ssl'] = '' data['ssl'] = ''
basic_auth = 'data/basic_auth.json'
auth_secret = self.__file['auth_secret']
if os.path.exists(auth_secret):
data['auth_secret'] = 'checked'
else:
data['auth_secret'] = ''
basic_auth = self.__file['basic_auth']
if os.path.exists(basic_auth): if os.path.exists(basic_auth):
bac = mw.readFile(basic_auth) bac = mw.readFile(basic_auth)
bac = json.loads(bac) bac = json.loads(bac)
@@ -956,7 +1026,7 @@ class config_api:
else: else:
data['basic_auth'] = '' data['basic_auth'] = ''
cfg_domain = 'data/bind_domain.pl' cfg_domain = self.__file['bind_domain']
if os.path.exists(cfg_domain): if os.path.exists(cfg_domain):
domain = mw.readFile(cfg_domain) domain = mw.readFile(cfg_domain)
data['bind_domain'] = domain.strip() data['bind_domain'] = domain.strip()
@@ -965,6 +1035,7 @@ class config_api:
data = self.renderUnauthorizedStatus(data) data = self.renderUnauthorizedStatus(data)
#api
api_token = self.__api_addr api_token = self.__api_addr
if os.path.exists(api_token): if os.path.exists(api_token):
bac = mw.readFile(api_token) bac = mw.readFile(api_token)
@@ -974,6 +1045,9 @@ class config_api:
else: else:
data['api_token'] = '' data['api_token'] = ''
#auth
data['site_count'] = mw.M('sites').count() data['site_count'] = mw.M('sites').count()
data['username'] = mw.M('users').where( data['username'] = mw.M('users').where(
@@ -982,7 +1056,7 @@ class config_api:
data['hook_tag'] = request.args.get('tag', '') data['hook_tag'] = request.args.get('tag', '')
# databases hook # databases hook
database_hook_file = 'data/hook_database.json' database_hook_file = self.__file['hook_database']
if os.path.exists(database_hook_file): if os.path.exists(database_hook_file):
df = mw.readFile(database_hook_file) df = mw.readFile(database_hook_file)
df = json.loads(df) df = json.loads(df)
@@ -991,7 +1065,7 @@ class config_api:
data['hook_database'] = [] data['hook_database'] = []
# menu hook # menu hook
menu_hook_file = 'data/hook_menu.json' menu_hook_file = self.__file['hook_menu']
if os.path.exists(menu_hook_file): if os.path.exists(menu_hook_file):
df = mw.readFile(menu_hook_file) df = mw.readFile(menu_hook_file)
df = json.loads(df) df = json.loads(df)
@@ -1000,7 +1074,7 @@ class config_api:
data['hook_menu'] = [] data['hook_menu'] = []
# global_static hook # global_static hook
global_static_hook_file = 'data/hook_global_static.json' global_static_hook_file = self.__file['hook_global_static']
if os.path.exists(global_static_hook_file): if os.path.exists(global_static_hook_file):
df = mw.readFile(global_static_hook_file) df = mw.readFile(global_static_hook_file)
df = json.loads(df) df = json.loads(df)
+4 -2
View File
@@ -396,14 +396,16 @@ class crontab_api:
if soft_name == 'postgresql': if soft_name == 'postgresql':
sqlite3_name = 'pgsql' sqlite3_name = 'pgsql'
if soft_name == 'mongodb':
sqlite3_name = 'mongodb'
db_list = {} db_list = {}
db_list['orderOpt'] = bak_data db_list['orderOpt'] = bak_data
if not os.path.exists(path + '/' + sqlite3_name + '.db'): if not os.path.exists(path + '/' + sqlite3_name + '.db'):
db_list['data'] = [] db_list['data'] = []
else: else:
db_list['data'] = mw.M('databases').dbPos( db_list['data'] = mw.M('databases').dbPos(path, sqlite3_name).field('name,ps').select()
path, sqlite3_name).field('name,ps').select()
return mw.getJson(db_list) return mw.getJson(db_list)
if stype == 'path': if stype == 'path':
+3 -1
View File
@@ -151,7 +151,9 @@ class Sql():
try: try:
sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \ sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \
self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT
# print(sql, self.__OPT_PARAM)
if os.path.exists('data/debug.pl'):
print(sql, self.__OPT_PARAM)
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) result = self.__DB_CONN.execute(sql, self.__OPT_PARAM)
data = result.fetchall() data = result.fetchall()
# 构造字曲系列 # 构造字曲系列
+66 -13
View File
@@ -161,15 +161,12 @@ class files_api:
search = request.args.get('search', '').strip().lower() search = request.args.get('search', '').strip().lower()
search_all = request.args.get('all', '').strip().lower() search_all = request.args.get('all', '').strip().lower()
page = request.args.get('p', '1').strip().lower() page = request.args.get('p', '1').strip().lower()
row = request.args.get('showRow', '10') row = request.args.get('row', '10')
disk = request.form.get('disk', '') order = request.form.get('order', '')
if disk == 'True':
row = 1000
# return self.getAllDir(path, int(page), int(row), "wp-inlcude")
if search_all == 'yes' and search != '': if search_all == 'yes' and search != '':
return self.getAllDir(path, int(page), int(row), search) return self.getAllDir(path, int(page), int(row), order, search)
return self.getDir(path, int(page), int(row), search) return self.getDir(path, int(page), int(row), order, search)
def createFileApi(self): def createFileApi(self):
file = request.form.get('path', '') file = request.form.get('path', '')
@@ -948,16 +945,64 @@ class files_api:
i += 1 i += 1
return i return i
def getAllDir(self, path, page=1, page_size=10, search=None): def getAllDir(self, path, page=1, page_size=10, order='', search=None):
# print("search:", search) # print("search:", search)
data = {} data = {}
dirnames = [] dirnames = []
filenames = [] filenames = []
info = {}
i = 0
n = 0
count = 0
max_limit = 3000
order_arr = order.split(' ')
if len(order_arr) < 2:
plist = mw.sortAllFileList(path, order_arr[0],'',search, max_limit)
else:
plist = mw.sortAllFileList(path, order_arr[0], order_arr[1], search,max_limit)
info['count'] = len(plist)
info['row'] = page_size
info['p'] = page
info['tojs'] = 'getFiles'
pageObj = mw.getPageObject(info, '1,2,3,4,5,6,7,8')
data['PAGE'] = pageObj[0]
for dst_file in plist:
if not os.path.exists(dst_file):
continue
i += 1
if n >= pageObj[1].ROW:
break
if i < pageObj[1].SHIFT:
continue
if os.path.isdir(dst_file):
dirnames.append(self.__get_stats(dst_file, path))
else:
filenames.append(self.__get_stats(dst_file, path))
n += 1
data['DIR'] = dirnames
data['FILES'] = filenames
data['PATH'] = path.replace('//', '/')
return mw.getJson(data)
#备份
def getAllDirBk(self, path, page=1, page_size=10, order='', search=None):
data = {}
dirnames = []
filenames = []
count = 0 count = 0
max_limit = 3000 max_limit = 3000
for d_list in os.walk(path): for d_list in os.walk(path):
if count >= max_limit: if count >= max_limit:
break break
@@ -996,7 +1041,7 @@ class files_api:
return mw.getJson(data) return mw.getJson(data)
def getDir(self, path, page=1, page_size=10, search=None): def getDir(self, path, page=1, page_size=10, order = '', search=None):
data = {} data = {}
dirnames = [] dirnames = []
filenames = [] filenames = []
@@ -1011,7 +1056,14 @@ class files_api:
i = 0 i = 0
n = 0 n = 0
for filename in os.listdir(path):
order_arr = order.split(' ')
if len(order_arr) < 2:
plist = mw.sortFileList(path, order_arr[0],'')
else:
plist = mw.sortFileList(path, order_arr[0],order_arr[1])
for filename in plist:
if search: if search:
if filename.lower().find(search) == -1: if filename.lower().find(search) == -1:
continue continue
@@ -1033,8 +1085,8 @@ class files_api:
n += 1 n += 1
except Exception as e: except Exception as e:
continue continue
data['DIR'] = sorted(dirnames) data['DIR'] = dirnames
data['FILES'] = sorted(filenames) data['FILES'] = filenames
data['PATH'] = path.replace('//', '/') data['PATH'] = path.replace('//', '/')
return mw.getJson(data) return mw.getJson(data)
@@ -1067,6 +1119,7 @@ cd %s
return mw.returnJson(status, mw.getNumLines(fileName, 200)) return mw.returnJson(status, mw.getNumLines(fileName, 200))
def __get_stats(self, filename, path=None): def __get_stats(self, filename, path=None):
# print(filename,path)
filename = filename.replace('//', '/') filename = filename.replace('//', '/')
try: try:
stat = os.stat(filename) stat = os.stat(filename)
+3 -1
View File
@@ -77,7 +77,9 @@ class logs_api:
if log_name in ['dmesg'] or log_name.find('dmesg') == 0: if log_name in ['dmesg'] or log_name.find('dmesg') == 0:
return '内核缓冲区日志' return '内核缓冲区日志'
if log_name in ['syslog'] or log_name.find('syslog') == 0: if log_name in ['syslog'] or log_name.find('syslog') == 0:
return '系统警告/错误日志' return '系统日志'
if log_name in ['rsyncd.log']:
return '远程同步日志'
if log_name in ['btmp']: if log_name in ['btmp']:
return '失败的登录记录' return '失败的登录记录'
if log_name in ['utmp', 'wtmp']: if log_name in ['utmp', 'wtmp']:
+93 -7
View File
@@ -246,7 +246,7 @@ def isInstalledWeb():
def isIpAddr(ip): def isIpAddr(ip):
check_ip = re.compile( check_ip = re.compile(
'^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$') '^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$')
if check_ip.match(ip): if check_ip.match(ip):
return True return True
else: else:
@@ -394,6 +394,9 @@ def getPageObject(args, result='1,2,3,4,5,8'):
if 'tojs' in args: if 'tojs' in args:
info['return_js'] = args['tojs'] info['return_js'] = args['tojs']
if 'args_tpl' in args:
info['args_tpl'] = args['args_tpl']
return (page.GetPage(info, result), page) return (page.GetPage(info, result), page)
@@ -905,6 +908,26 @@ def aesDecrypt_Crypto(data, key, vi):
text_decrypted = text_decrypted.decode('utf8').rstrip() # 去掉补位的右侧空格 text_decrypted = text_decrypted.decode('utf8').rstrip() # 去掉补位的右侧空格
return text_decrypted return text_decrypted
def getDefault(data,val,def_val=''):
if val in data:
return data[val]
return def_val
def encodeImage(imgsrc, newsrc):
# 图片加密
import struct
old_fp = open(imgsrc, 'rb')
imgFile = old_fp.read()
old_fp.close()
new_fp = open(newsrc,"wb")
for x in imgFile:
value = x ^ 86
value = hex(value)
s = struct.pack('B',int(value,16))
new_fp.write(s)
new_fp.close()
return True
def buildSoftLink(src, dst, force=False): def buildSoftLink(src, dst, force=False):
''' '''
@@ -1158,10 +1181,10 @@ def getLocalIpBack():
url = 'http://pv.sohu.com/cityjson?ie=utf-8' url = 'http://pv.sohu.com/cityjson?ie=utf-8'
req = urllib.request.urlopen(url, timeout=10) req = urllib.request.urlopen(url, timeout=10)
content = req.read().decode('utf-8') content = req.read().decode('utf-8')
ipaddress = re.search('\d+.\d+.\d+.\d+', content).group(0) ipaddress = re.search('\\d+.\\d+.\\d+.\\d+', content).group(0)
writeFile(filename, ipaddress) writeFile(filename, ipaddress)
ipaddress = re.search('\d+.\d+.\d+.\d+', ipaddress).group(0) ipaddress = re.search('\\d+.\\d+.\\d+.\\d+', ipaddress).group(0)
return ipaddress return ipaddress
except Exception as ex: except Exception as ex:
# print(ex) # print(ex)
@@ -1226,7 +1249,7 @@ def checkIp(ip):
# 检查是否为IPv4地址 # 检查是否为IPv4地址
import re import re
p = re.compile( p = re.compile(
'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$') '^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$')
if p.match(ip): if p.match(ip):
return True return True
else: else:
@@ -1364,13 +1387,13 @@ def getCpuType():
# 取CPU类型 # 取CPU类型
cpuinfo = open('/proc/cpuinfo', 'r').read() cpuinfo = open('/proc/cpuinfo', 'r').read()
rep = "model\s+name\s+:\s+(.+)" rep = "model\\s+name\\s+:\\s+(.+)"
tmp = re.search(rep, cpuinfo, re.I) tmp = re.search(rep, cpuinfo, re.I)
if tmp: if tmp:
cpuType = tmp.groups()[0] cpuType = tmp.groups()[0]
else: else:
cpuinfo = execShell('LANG="en_US.UTF-8" && lscpu')[0] cpuinfo = execShell('LANG="en_US.UTF-8" && lscpu')[0]
rep = "Model\s+name:\s+(.+)" rep = "Model\\s+name:\\s+(.+)"
tmp = re.search(rep, cpuinfo, re.I) tmp = re.search(rep, cpuinfo, re.I)
if tmp: if tmp:
cpuType = tmp.groups()[0] cpuType = tmp.groups()[0]
@@ -1580,6 +1603,69 @@ def checkCert(certPath='ssl/certificate.pem'):
return True return True
def sortFileList(path, ftype = 'mtime', sort = 'desc'):
flist = os.listdir(path)
if ftype == 'mtime':
if sort == 'desc':
flist = sorted(flist, key=lambda f: os.path.getmtime(os.path.join(path,f)), reverse=True)
if sort == 'asc':
flist = sorted(flist, key=lambda f: os.path.getmtime(os.path.join(path,f)), reverse=False)
if ftype == 'size':
if sort == 'desc':
flist = sorted(flist, key=lambda f: os.path.getsize(os.path.join(path,f)), reverse=True)
if sort == 'asc':
flist = sorted(flist, key=lambda f: os.path.getsize(os.path.join(path,f)), reverse=False)
if ftype == 'fname':
if sort == 'desc':
flist = sorted(flist, key=lambda f: os.path.join(path,f), reverse=True)
if sort == 'asc':
flist = sorted(flist, key=lambda f: os.path.join(path,f), reverse=False)
return flist
def sortAllFileList(path, ftype = 'mtime', sort = 'desc', search = '',limit = 3000):
count = 0
flist = []
for d_list in os.walk(path):
if count >= limit:
break
for d in d_list[1]:
if count >= limit:
break
if d.lower().find(search) != -1:
filename = d_list[0] + '/' + d
if not os.path.exists(filename):
continue
count += 1
flist.append(filename)
for f in d_list[2]:
if count >= limit:
break
if f.lower().find(search) != -1:
filename = d_list[0] + '/' + f
if not os.path.exists(filename):
continue
count += 1
flist.append(filename)
if ftype == 'mtime':
if sort == 'desc':
flist = sorted(flist, key=lambda f: os.path.getmtime(f), reverse=True)
if sort == 'asc':
flist = sorted(flist, key=lambda f: os.path.getmtime(f), reverse=False)
if ftype == 'size':
if sort == 'desc':
flist = sorted(flist, key=lambda f: os.path.getsize(f), reverse=True)
if sort == 'asc':
flist = sorted(flist, key=lambda f: os.path.getsize(f), reverse=False)
return flist
def getPathSize(path): def getPathSize(path):
# 取文件或目录大小 # 取文件或目录大小
if not os.path.exists(path): if not os.path.exists(path):
@@ -1754,7 +1840,7 @@ def getSSHPort():
try: try:
file = '/etc/ssh/sshd_config' file = '/etc/ssh/sshd_config'
conf = readFile(file) conf = readFile(file)
rep = "(#*)?Port\s+([0-9]+)\s*\n" rep = "(#*)?Port\\s+([0-9]+)\\s*\n"
port = re.search(rep, conf).groups(0)[1] port = re.search(rep, conf).groups(0)[1]
return int(port) return int(port)
except: except:
+14 -6
View File
@@ -39,6 +39,7 @@ class Page():
__RTURN_JS = False # 是否返回JS回调 __RTURN_JS = False # 是否返回JS回调
__START_NUM = None # 起始行 __START_NUM = None # 起始行
__END_NUM = None # 结束行 __END_NUM = None # 结束行
__ARGS_TPL = ''
def __init__(self): def __init__(self):
if False: if False:
@@ -51,12 +52,19 @@ class Page():
self.__FO = tmp['FO'] self.__FO = tmp['FO']
self.__LINE = tmp['LINE'] 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'): def GetPage(self, pageInfo, limit='1,2,3,4,5,6,7,8'):
# 取分页信息 # 取分页信息
# @param pageInfo 传入分页参数字典 # @param pageInfo 传入分页参数字典
# @param limit 返回系列 # @param limit 返回系列
self.__RTURN_JS = pageInfo['return_js'] self.__RTURN_JS = pageInfo['return_js']
self.__COUNT_ROW = pageInfo['count'] self.__COUNT_ROW = pageInfo['count']
if 'args_tpl' in pageInfo:
self.__ARGS_TPL = pageInfo['args_tpl']
self.ROW = pageInfo['row'] self.ROW = pageInfo['row']
self.__C_PAGE = self.__GetCpage(pageInfo['p']) self.__C_PAGE = self.__GetCpage(pageInfo['p'])
self.__START_NUM = self.__StartRow() self.__START_NUM = self.__StartRow()
@@ -111,7 +119,7 @@ class Page():
str(self.__COUNT_PAGE) + "'>" + str(self.__END) + "</a>" str(self.__COUNT_PAGE) + "'>" + str(self.__END) + "</a>"
else: else:
endStr = "<a class='Pend' onclick='" + self.__RTURN_JS + \ endStr = "<a class='Pend' onclick='" + self.__RTURN_JS + \
"(" + str(self.__COUNT_PAGE) + ")'>" + \ "(" + self.getPageNum(self.__COUNT_PAGE) + ")'>" + \
str(self.__END) + "</a>" str(self.__END) + "</a>"
return endStr return endStr
@@ -126,7 +134,7 @@ class Page():
str(self.__C_PAGE + 1) + "'>" + str(self.__NEXT) + "</a>" str(self.__C_PAGE + 1) + "'>" + str(self.__NEXT) + "</a>"
else: else:
nextStr = "<a class='Pnext' onclick='" + self.__RTURN_JS + \ nextStr = "<a class='Pnext' onclick='" + self.__RTURN_JS + \
"(" + str(self.__C_PAGE + 1) + ")'>" + \ "(" + self.getPageNum(self.__C_PAGE + 1) + ")'>" + \
str(self.__NEXT) + "</a>" str(self.__NEXT) + "</a>"
return nextStr return nextStr
@@ -151,7 +159,7 @@ class Page():
"p=" + str(page) + "'>" + str(page) + "</a>" "p=" + str(page) + "'>" + str(page) + "</a>"
else: else:
pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \ pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
"(" + str(page) + ")'>" + str(page) + "</a>" "(" + self.getPageNum(page) + ")'>" + str(page) + "</a>"
# 当前页 # 当前页
if self.__C_PAGE > 0: if self.__C_PAGE > 0:
@@ -174,7 +182,7 @@ class Page():
"p=" + str(page) + "'>" + str(page) + "</a>" "p=" + str(page) + "'>" + str(page) + "</a>"
else: else:
pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \ pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
"(" + str(page) + ")'>" + str(page) + "</a>" "(" + self.getPageNum(page) + ")'>" + str(page) + "</a>"
return pages return pages
@@ -189,7 +197,7 @@ class Page():
str(self.__C_PAGE - 1) + "'>" + str(self.__PREV) + "</a>" str(self.__C_PAGE - 1) + "'>" + str(self.__PREV) + "</a>"
else: else:
startStr = "<a class='Ppren' onclick='" + self.__RTURN_JS + \ startStr = "<a class='Ppren' onclick='" + self.__RTURN_JS + \
"(" + str(self.__C_PAGE - 1) + ")'>" + \ "(" + self.getPageNum(self.__C_PAGE - 1) + ")'>" + \
str(self.__PREV) + "</a>" str(self.__PREV) + "</a>"
return startStr return startStr
@@ -204,7 +212,7 @@ class Page():
self.__URI + "p=1'>" + str(self.__START) + "</a>" self.__URI + "p=1'>" + str(self.__START) + "</a>"
else: else:
startStr = "<a class='Pstart' onclick='" + \ startStr = "<a class='Pstart' onclick='" + \
self.__RTURN_JS + "(1)'>" + str(self.__START) + "</a>" self.__RTURN_JS + "("+self.getPageNum(1)+")'>" + str(self.__START) + "</a>"
return startStr return startStr
def __GetCpage(self, p): def __GetCpage(self, p):
+1 -1
View File
@@ -148,7 +148,7 @@ class plugins_api:
def initApi(self): def initApi(self):
plugin_names = { plugin_names = {
'openresty': '1.21.4.2', 'openresty': '1.25.3.1',
'php': '56', 'php': '56',
'swap': '1.1', 'swap': '1.1',
'mysql': '5.7', 'mysql': '5.7',
+65 -17
View File
@@ -105,7 +105,7 @@ class site_api:
start = (int(p) - 1) * (int(limit)) start = (int(p) - 1) * (int(limit))
siteM = mw.M('sites').field('id,name,path,status,ps,addtime,edate') siteM = siteC = mw.M('sites').field('id,name,path,status,ps,addtime,edate,type_id')
sql_where = '' sql_where = ''
if search != '': if search != '':
@@ -113,30 +113,37 @@ class site_api:
if type_id != '' and int(type_id) >= 0 and search != '': if type_id != '' and int(type_id) >= 0 and search != '':
sql_where = sql_where + " and type_id=" + type_id + "" sql_where = sql_where + " and type_id=" + type_id + ""
elif type_id != '' and int(type_id) >= 0: if type_id != '' and int(type_id) >= 0:
sql_where = " type_id=" + type_id sql_where = " type_id=" + type_id
if sql_where != '': if sql_where != '':
siteM.where(sql_where) siteM.where(sql_where)
_list = siteM.limit((str(start)) + ',' + _list = siteM.limit((str(start)) + ',' +limit).order('id desc').select()
limit).order('id desc').select()
if _list != None: if _list != None:
for i in range(len(_list)): for i in range(len(_list)):
_list[i]['backup_count'] = mw.M('backup').where( _list[i]['backup_count'] = mw.M('backup').where("pid=? AND type=?", (_list[i]['id'], 0)).count()
"pid=? AND type=?", (_list[i]['id'], 0)).count()
_ret = {} _ret = {}
_ret['data'] = _list _ret['data'] = _list
count = siteM.count() if sql_where != '':
count = siteC.where(sql_where).count()
else:
count = siteC.count()
_page = {} _page = {}
_page['count'] = count _page['count'] = count
_page['tojs'] = 'getWeb' _page['tojs'] = 'getWeb'
_page['p'] = p _page['p'] = p
_page['row'] = limit _page['row'] = limit
page_args_tpl = ''
page_args_tpl += ','+type_id+''
if search != '':
page_args_tpl += ',"'+search+'"'
_page['args_tpl'] = page_args_tpl
_ret['page'] = mw.getPage(_page) _ret['page'] = mw.getPage(_page)
return mw.getJson(_ret) return mw.getJson(_ret)
@@ -756,6 +763,8 @@ class site_api:
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+listen\s+\[\:\:\]\:443.*;" rep = "\s+listen\s+\[\:\:\]\:443.*;"
conf = re.sub(rep, '', conf) conf = re.sub(rep, '', conf)
rep = "\s+http2\s+on;"
conf = re.sub(rep, '', conf)
mw.writeFile(file, conf) mw.writeFile(file, conf)
msg = mw.getInfo('网站[{1}]关闭SSL成功!', (siteName,)) msg = mw.getInfo('网站[{1}]关闭SSL成功!', (siteName,))
@@ -973,6 +982,9 @@ class site_api:
siteInfo = mw.M('sites').where( siteInfo = mw.M('sites').where(
'name=?', (siteName,)).field('id,name,path').find() 'name=?', (siteName,)).field('id,name,path').find()
path = self.getSitePath(siteName) path = self.getSitePath(siteName)
if path == '':
return mw.returnJson(False, '【'+siteName+'】配置文件,异常!')
srcPath = siteInfo['path'] srcPath = siteInfo['path']
# 检测acme是否安装 # 检测acme是否安装
@@ -2201,7 +2213,10 @@ location ^~ {from} {\n\
if os.path.exists(file): if os.path.exists(file):
conf = mw.readFile(file) conf = mw.readFile(file)
rep = '\s*root\s*(.+);' rep = '\s*root\s*(.+);'
path = re.search(rep, conf).groups()[0] find_cnf = re.search(rep, conf)
if not find_cnf:
return ''
path = find_cnf.groups()[0]
return path return path
return '' return ''
@@ -2300,9 +2315,15 @@ location ^~ {from} {\n\
def getSitePhpVersion(self, siteName): def getSitePhpVersion(self, siteName):
conf = mw.readFile(self.getHostConf(siteName)) conf = mw.readFile(self.getHostConf(siteName))
rep = "enable-php-(.*)\.conf" rep = "enable-php-(.*)\.conf"
tmp = re.search(rep, conf).groups() find_php_cnf = re.search(rep, conf)
def_pver = '00'
if find_php_cnf:
tmp = find_php_cnf.groups()
def_pver = tmp[0]
data = {} data = {}
data['phpversion'] = tmp[0] data['phpversion'] = def_pver
return mw.getJson(data) return mw.getJson(data)
def getIndex(self, sid): def getIndex(self, sid):
@@ -2748,24 +2769,41 @@ location ^~ {from} {\n\
mw.writeLog('TYPE_SITE', '设置成功,站点到期后将自动停止!', (siteName, edate)) mw.writeLog('TYPE_SITE', '设置成功,站点到期后将自动停止!', (siteName, edate))
return mw.returnJson(True, '设置成功,站点到期后将自动停止!') return mw.returnJson(True, '设置成功,站点到期后将自动停止!')
# ssl相关方法 start # ssl相关方法 start
def setSslConf(self, siteName): def setSslConf(self, siteName):
file = self.getHostConf(siteName) file = self.getHostConf(siteName)
conf = mw.readFile(file) conf = mw.readFile(file)
version = ''
version_file_pl = mw.getServerDir() + '/openresty/version.pl'
if os.path.exists(version_file_pl):
version = mw.readFile(version_file_pl)
version = version.strip()
keyPath = self.sslDir + '/' + siteName + '/privkey.pem' keyPath = self.sslDir + '/' + siteName + '/privkey.pem'
certPath = self.sslDir + '/' + siteName + '/fullchain.pem' certPath = self.sslDir + '/' + siteName + '/fullchain.pem'
if conf: if conf:
if conf.find('ssl_certificate') == -1: if conf.find('ssl_certificate') == -1:
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# add_header Alt-Svc 'h3=":443";ma=86400,h3-29=":443";ma=86400';
http3Header = """
add_header Strict-Transport-Security "max-age=63072000";
add_header Alt-Svc 'h3=":443";ma=86400';
"""
if version != '1.25.3.1':
http3Header = '';
sslStr = """#error_page 404/404.html; sslStr = """#error_page 404/404.html;
ssl_certificate %s; ssl_certificate %s;
ssl_certificate_key %s; ssl_certificate_key %s;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on; ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m; ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m; ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;""" % (certPath, keyPath) %s
error_page 497 https://$host$request_uri;""" % (certPath, keyPath, http3Header)
if(conf.find('ssl_certificate') != -1): if(conf.find('ssl_certificate') != -1):
return mw.returnData(True, 'SSL开启成功!') return mw.returnData(True, 'SSL开启成功!')
@@ -2775,8 +2813,18 @@ location ^~ {from} {\n\
tmp = re.findall(rep, conf) tmp = re.findall(rep, conf)
if not mw.inArray(tmp, '443'): if not mw.inArray(tmp, '443'):
listen = re.search(rep, conf).group() listen = re.search(rep, conf).group()
http_ssl = "\n\tlisten 443 ssl http2;"
http_ssl = http_ssl + "\n\tlisten [::]:443 ssl http2;" if version == '1.25.3.1':
http_ssl = "\n\tlisten 443 ssl;"
http_ssl = http_ssl + "\n\tlisten [::]:443 ssl;"
http_ssl = http_ssl + "\n\tlisten 443 quic;"
http_ssl = http_ssl + "\n\tlisten [::]:443 quic;"
http_ssl = http_ssl + "\n\thttp2 on;"
else:
http_ssl = "\n\tlisten 443 ssl http2;"
http_ssl = http_ssl + "\n\tlisten [::]:443 ssl http2;"
conf = conf.replace(listen, listen + http_ssl) conf = conf.replace(listen, listen + http_ssl)
mw.backFile(file) mw.backFile(file)
+9 -8
View File
@@ -299,7 +299,8 @@ class system_api:
data_list = data.strip().split("\n") data_list = data.strip().split("\n")
mac_version = '' mac_version = ''
for x in data_list: for x in data_list:
mac_version += x.split("\t")[1] + ' ' xlist = x.split("\t")
mac_version += xlist[len(xlist)-1] + ' '
arch_ver = mw.execShell("arch") arch_ver = mw.execShell("arch")
return mac_version + " (" + arch_ver[0].strip() + ")" return mac_version + " (" + arch_ver[0].strip() + ")"
@@ -366,15 +367,15 @@ class system_api:
mem = psutil.virtual_memory() mem = psutil.virtual_memory()
if mw.getOs() == 'darwin': if mw.getOs() == 'darwin':
memInfo = { memInfo = {
'memTotal': mem.total / 1024 / 1024 'memTotal': mem.total,
} }
memInfo['memRealUsed'] = memInfo['memTotal'] * (mem.percent / 100) memInfo['memRealUsed'] = memInfo['memTotal'] * (mem.percent / 100)
else: else:
memInfo = { memInfo = {
'memTotal': mem.total / 1024 / 1024, 'memTotal': mem.total,
'memFree': mem.free / 1024 / 1024, 'memFree': mem.free,
'memBuffers': mem.buffers / 1024 / 1024, 'memBuffers': mem.buffers,
'memCached': mem.cached / 1024 / 1024 'memCached': mem.cached
} }
memInfo['memRealUsed'] = memInfo['memTotal'] - \ memInfo['memRealUsed'] = memInfo['memTotal'] - \
@@ -558,9 +559,9 @@ class system_api:
networkInfo['upTotal'] = networkIo[0] networkInfo['upTotal'] = networkIo[0]
networkInfo['downTotal'] = networkIo[1] networkInfo['downTotal'] = networkIo[1]
networkInfo['up'] = round(float( networkInfo['up'] = round(float(
networkIo[0] - session['up']) / 1024 / (ntime - session['otime']), 2) networkIo[0] - session['up']) / (ntime - session['otime']), 2)
networkInfo['down'] = round( networkInfo['down'] = round(
float(networkIo[1] - session['down']) / 1024 / (ntime - session['otime']), 2) float(networkIo[1] - session['down']) / (ntime - session['otime']), 2)
networkInfo['downPackets'] = networkIo[3] networkInfo['downPackets'] = networkIo[3]
networkInfo['upPackets'] = networkIo[2] networkInfo['upPackets'] = networkIo[2]
+1 -1
View File
@@ -20,7 +20,7 @@ import requests
class vip_api: class vip_api:
api_url = 'https://wo.midoks.me/api/wp-json/vip' api_url = 'https://wo.midoks.icu/api/wp-json/vip'
def __init__(self): def __init__(self):
pass pass
+3 -1
View File
@@ -7,9 +7,11 @@
/etc/init.d/mw default | 显示登录信息 /etc/init.d/mw default | 显示登录信息
/etc/init.d/mw db | 快捷连接数据库 /etc/init.d/mw db | 快捷连接数据库
---------------------------------------- ----------------------------------------
mw open | 开启面板
mw close | 关闭面板
mw debug | 开发测试 mw debug | 开发测试
mw venv | 进入虚拟环境 mw venv | 进入虚拟环境
mw mirror | 切换镜像 mw mirror | 切换镜像
mw install_app | 快捷安装常用软件 mw install_app | 快捷安装常用软件
mw update | 更新到正式 mw update | 更新到正式
+18 -18
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 | | 系统名称 |PHP53 |PHP54 |PHP55 |PHP56 |PHP70 |PHP71 |PHP72 |PHP73 |PHP74 |PHP80 |PHP81 |PHP82 |PHP83 |
| ----------------- |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| | ----------------- |-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
| CentOS 7.9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | CentOS 7.9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 8.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | CentOS 8.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 8 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | CentOS 8 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| CentOS 9 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | CentOS 9 Stream |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 10.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Debian 10.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 11.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Debian 11.3 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Debian 12 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Debian 12 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 18.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Ubuntu 18.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 20.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Ubuntu 20.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Ubuntu 22.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Ubuntu 22.04 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Fedora 31 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Fedora 31 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Fedora 32 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Fedora 32 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| AlmaLinux 9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | AlmaLinux 9 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| RockyLinux 8.6 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | RockyLinux 8.6 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| Arch Linux |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | Arch Linux |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
| openSUSE 15.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ | | openSUSE 15.4 |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |✅ |
+1 -1
View File
@@ -49,7 +49,7 @@ ALTER TABLE `firewall` ADD COLUMN `protocol` TEXT DEFAULT 'tcp';
INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `addtime`) VALUES INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `addtime`) VALUES
(1, '80', 'tcp','网站默认端口', '0000-00-00 00:00:00'), (1, '80', 'tcp','网站默认端口', '0000-00-00 00:00:00'),
(2, '443', 'tcp', 'HTTPS', '0000-00-00 00:00:00'); (2, '443', 'tcp/udp', 'HTTPS', '0000-00-00 00:00:00');
+1
View File
@@ -1,5 +1,6 @@
server server
{ {
# reuseport 只能在一个server出现一次
listen {$PORT}; listen {$PORT};
listen [::]:{$PORT}; listen [::]:{$PORT};
server_name {$SERVER_NAME}; server_name {$SERVER_NAME};
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+25
View File
@@ -0,0 +1,25 @@
<style>
.overflow_hide {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: middle;
}
</style>
<div class="bt-form">
<div class='plugin_version'></div>
<div class="bt-w-main">
<div class="bt-w-menu">
<p class="bgw" onclick="pluginService('data_query');">服务</p>
</div>
<div class="bt-w-con pd15">
<div class="soft-man-con"></div>
</div>
</div>
</div>
<script type="text/javascript">
resetPluginWinHeight(300);
resetPluginWinWidth(380);
pluginService('data_query', $('.plugin_version').attr('version'));
</script>
+97
View File
@@ -0,0 +1,97 @@
# coding:utf-8
import sys
import io
import os
import time
import re
sys.path.append(os.getcwd() + "/class/core")
import mw
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'data_query'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getInitDTpl():
path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
return path
def getArgs():
args = sys.argv[3:]
tmp = {}
args_len = len(args)
if args_len == 1:
t = args[0].strip('{').strip('}')
if t.strip() == '':
tmp = []
else:
t = t.split(':')
tmp[t[0]] = t[1]
tmp[t[0]] = t[1]
elif args_len > 1:
for i in range(len(args)):
t = args[i].split(':')
tmp[t[0]] = t[1]
return tmp
def checkArgs(data, ck=[]):
for i in range(len(ck)):
if not ck[i] in data:
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
return (True, mw.returnJson(True, 'ok'))
def status():
return 'start'
def appOp(method):
return 'ok'
def start():
return appOp('start')
def stop():
return appOp('stop')
def restart():
status = appOp('restart')
return status
def reload():
return appOp('reload')
if __name__ == "__main__":
func = sys.argv[1]
if func == 'status':
print(status())
elif func == 'start':
print(start())
elif func == 'stop':
print(stop())
elif func == 'restart':
print(restart())
elif func == 'reload':
print(reload())
else:
print('error')
+36
View File
@@ -0,0 +1,36 @@
{
"hook":[
{
"tag":"menu",
"menu": {
"title":"数据管理",
"name":"data_query",
"path":"static/html/index.html",
"css_path":"static/css/data.css",
"js_path":"static/js/app.js"
}
},
{
"tag":"global_static",
"global_static": {
"title":"数据管理",
"name":"data_query",
"css_path":"static/css/ico.css"
}
}
],
"sort": 7,
"ps": "数据简单管理(memcached,redis,mongodb)",
"name": "data_query",
"title": "数据管理",
"shell": "install.sh",
"versions":"1.0",
"tip": "soft",
"checks": "server/data_query",
"path": "server/data_query",
"display": 1,
"author": "midoks",
"date": "2024-01-22",
"type": 0,
"pid": "2"
}
+34
View File
@@ -0,0 +1,34 @@
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=$2
Install_App()
{
echo '正在安装脚本文件...' > $install_tmp
mkdir -p $serverPath/source
mkdir -p $serverPath/data_query
echo "${VERSION}" > $serverPath/data_query/version.pl
echo '安装完成'
}
Uninstall_App()
{
rm -rf $serverPath/data_query
echo "卸载成功"
}
action=$1
if [ "${1}" == 'install' ];then
Install_App
else
Uninstall_App
fi
+253
View File
@@ -0,0 +1,253 @@
# coding:utf-8
# https://pypi.org/project/pymemcache/
# https://pymemcache.readthedocs.io/en/latest/getting_started.html#using-a-client-pool
import sys
import io
import os
import time
import re
import json
import pymemcache
sys.path.append(os.getcwd() + "/class/core")
import mw
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class nosqlMemcached():
__DB_PASS = None
__DB_USER = None
__DB_PORT = 11211
__DB_HOST = '127.0.0.1'
__DB_CONN = None
__DB_ERR = None
__DB_LOCAL = None
def __init__(self):
self.__config = self.get_options(None)
def conn(self):
if self.__DB_HOST in ['127.0.0.1', 'localhost']:
mem_path = "{}/memcached".format(mw.getServerDir())
if not os.path.exists(mem_path): return False
if not self.__DB_LOCAL:
self.__DB_PORT = int(self.__config['port'])
try:
self.__DB_CONN = pymemcache.client.base.PooledClient((self.__DB_HOST,self.__DB_PORT), max_pool_size=4)
return self.__DB_CONN
except pymemcache.exceptions.MemcacheError:
return False
except Exception:
self.__DB_ERR = mw.getTracebackInfo()
return False
# 获取配置项
def get_options(self, get=None):
result = {}
mem_content = mw.readFile("{}/memcached/memcached.env".format(mw.getServerDir()))
if not mem_content: return False
keys = ["bind", "PORT"]
rep = 'PORT\s*=\s*(.*)'
port_re = re.search(rep, mem_content)
if port_re:
result['port'] = int(port_re.groups()[0].strip())
else:
result['port'] = 11211
return result
def set_host(self, host, port, prefix=''):
self.__DB_HOST = host
self.__DB_PORT = int(port)
self.__DB_PREFIX = prefix
self.__DB_LOCAL = 1
return self
@singleton
class nosqlMemcachedCtr():
def __init__(self):
pass
def getInstanceBySid(self, sid = 0):
instance = nosqlMemcached()
return instance
def getItems(self, args):
sid = args['sid']
mem_instance = self.getInstanceBySid(sid).conn()
if mem_instance is False:
return mw.returnData(False,'无法链接')
result = {}
m_items = mem_instance.stats('items')
item_no = []
for i in m_items:
item_match = b'items:(\d*?):number'
item_match_re = re.search(item_match, i)
if item_match_re:
v = item_match_re.groups()[0].strip()
v_str = v.decode()
if not v_str in item_no:
item_no.append(v_str)
if len(item_no) == 0:
item_no = [0]
result['items'] = item_no
return mw.returnData(True,'ok', result)
def getKeyList(self, args):
sid = args['sid']
mem_instance = self.getInstanceBySid(sid).conn()
if mem_instance is False:
return mw.returnData(False,'无法链接')
p = 1
size = 10
if 'p' in args:
p = args['p']
if 'size' in args:
size = args['size']
item_id = args['item_id']
if item_id == '0':
return mw.returnData(False,'ok')
m_items = mem_instance.stats('items')
item_key = 'items:%s:number' % item_id
item_key_b = item_key.encode("utf-8")
m_items_v = m_items[item_key_b]
start = (p-1)*size
end = start+size
if end > m_items_v:
end = m_items_v
all_key = mem_instance.stats('cachedump', str(item_id) , str(0))
# print(all_key)
all_key_list = []
cur_time_t = time.time()
for k in all_key:
t = {}
t['k'] = k.decode("utf-8")
v = all_key[k].decode("utf-8")
v = v.strip('[').strip(']').split(';')
t['s'] = v[0]
cur_time = v[1].strip().split(' ')[0]
if int(cur_time) != 0 :
t['t'] = int(cur_time) - int(cur_time_t)
else:
t['t'] = 0
all_key_list.append(t)
# print(len(all_key_list))
# print(start,end)
return_all_key = all_key_list[start:end]
for x in range(len(return_all_key)):
v = mem_instance.get(return_all_key[x]['k'])
return_all_key[x]['v'] = v.decode('utf-8')
result = {}
result['list'] = return_all_key
result['p'] = p
page_args = {}
page_args['count'] = len(all_key_list)
page_args['tojs'] = 'memcachedGetKeyList'
page_args['p'] = p
page_args['row'] = size
result['page'] = mw.getPage(page_args)
return mw.returnData(True,'ok', result)
def delVal(self, args):
sid = args['sid']
mem_instance = self.getInstanceBySid(sid).conn()
if mem_instance is False:
return mw.returnData(False,'无法链接')
key = args['key']
mem_instance.delete(key)
return mw.returnData(True,'删除成功!')
def setKv(self, args):
sid = args['sid']
mem_instance = self.getInstanceBySid(sid).conn()
if mem_instance is False:
return mw.returnData(False,'无法链接')
key = args['key']
val = args['val']
endtime = args['endtime']
mem_instance.set(key, val, int(endtime))
return mw.returnData(True,'设置成功!')
def clear(self, args):
sid = args['sid']
mem_instance = self.getInstanceBySid(sid).conn()
if mem_instance is False:
return mw.returnData(False,'无法链接')
mem_instance.flush_all()
return mw.returnData(True,'清空成功!')
# ---------------------------------- run ----------------------------------
# 获取 memcached 列表
def get_items(args):
t = nosqlMemcachedCtr()
return t.getItems(args)
def get_key_list(args):
t = nosqlMemcachedCtr()
return t.getKeyList(args)
def del_val(args):
t = nosqlMemcachedCtr()
return t.delVal(args)
def set_kv(args):
t = nosqlMemcachedCtr()
return t.setKv(args)
def clear(args):
t = nosqlMemcachedCtr()
return t.clear(args)
# 测试
def test(args):
sid = args['sid']
t = nosqlMemcachedCtr()
print(t.get_options())
print("test")
return 'ok'
# ---------------------------------- run ----------------------------------
+351
View File
@@ -0,0 +1,351 @@
# coding:utf-8
import sys
import io
import os
import time
import re
import pymongo
import json
import yaml
from bson.objectid import ObjectId
from bson.json_util import dumps
sys.path.append(os.getcwd() + "/class/core")
import mw
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
def getPluginName():
return 'mongodb'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getConf():
path = getServerDir() + "/mongodb.conf"
return path
def getConfTpl():
path = getPluginDir() + "/config/mongodb.conf"
return path
def pSqliteDb(dbname='users'):
file = getServerDir() + '/mongodb.db'
name = 'mongodb'
sql_file = getPluginDir() + '/config/mongodb.sql'
import_sql = mw.readFile(sql_file)
# print(sql_file,import_sql)
md5_sql = mw.md5(import_sql)
import_sign = False
save_md5_file = getServerDir() + '/import_mongodb.md5'
if os.path.exists(save_md5_file):
save_md5_sql = mw.readFile(save_md5_file)
if save_md5_sql != md5_sql:
import_sign = True
mw.writeFile(save_md5_file, md5_sql)
else:
mw.writeFile(save_md5_file, md5_sql)
if not os.path.exists(file) or import_sql:
conn = mw.M(dbname).dbPos(getServerDir(), name)
csql_list = import_sql.split(';')
for index in range(len(csql_list)):
conn.execute(csql_list[index], ())
conn = mw.M(dbname).dbPos(getServerDir(), name)
return conn
def getConfigData():
cfg = getConf()
# print(cfg)
config_data = mw.readFile(cfg)
try:
config = yaml.safe_load(config_data)
except:
config = {
"systemLog": {
"destination": "file",
"logAppend": True,
"path": mw.getServerDir()+"/mongodb/log/mongodb.log"
},
"storage": {
"dbPath": mw.getServerDir()+"/mongodb/data",
"directoryPerDB": True,
"journal": {
"enabled": True
}
},
"processManagement": {
"fork": True,
"pidFilePath": mw.getServerDir()+"/mongodb/log/mongodb.pid"
},
"net": {
"port": 27017,
"bindIp": "0.0.0.0"
},
"security": {
"authorization": "disabled",
"javascriptEnabled": False
}
}
return config
def getConfPort():
data = getConfigData()
return data['net']['port']
def getConfAuth():
data = getConfigData()
return data['security']['authorization']
@singleton
class nosqlMongodb():
__DB_PASS = None
__DB_USER = None
__DB_PORT = 6379
__DB_HOST = '127.0.0.1'
__DB_CONN = None
__DB_ERR = None
__DB_LOCAL = None
def __init__(self):
self.__config = self.get_options(None)
def mgdb_conn(self):
if self.__DB_HOST in ['127.0.0.1', 'localhost']:
mgdb_path = "{}/mongodb".format(mw.getServerDir())
if not os.path.exists(mgdb_path): return False
if not self.__DB_LOCAL:
self.__DB_PORT = int(self.__config['port'])
auth = getConfAuth()
port = getConfPort()
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
# print(auth,self.__DB_HOST,port, self.__DB_PASS)
try:
if auth == 'disabled':
self.__DB_CONN = pymongo.MongoClient(host=self.__DB_HOST, port=port, directConnection=True)
else:
self.__DB_CONN = pymongo.MongoClient(host=self.__DB_HOST, port=port, directConnection=True, username='root',password=mg_root)
self.__DB_CONN.admin.command('ping')
return self.__DB_CONN
except pymongo.errors.ConnectionFailure:
return False
except Exception as e:
# print(e)
self.__DB_ERR = mw.getTracebackInfo()
return False
# 获取配置项
def get_options(self, get=None):
result = {}
mgdb_content = mw.readFile("{}/mongodb/mongodb.conf".format(mw.getServerDir()))
if not mgdb_content: return False
keys = ["bind_ip", "port"]
result['host'] = '127.0.0.1'
rep = 'port\s*=\s*(.*)'
ip_re = re.search(rep, mgdb_content)
if ip_re:
result['port'] = int(ip_re.groups()[0].strip())
else:
result['port'] = 27017
return result
def set_host(self, host, port, name, username, password, prefix=''):
self.__DB_HOST = host
self.__DB_PORT = int(port)
self.__DB_NAME = name
if self.__DB_NAME: self.__DB_NAME = str(self.__DB_NAME)
self.__DB_USER = str(username)
self._USER = str(username)
self.__DB_PASS = str(password)
self.__DB_PREFIX = prefix
self.__DB_LOCAL = 1
return self
@singleton
class nosqlMongodbCtr():
def __init__(self):
pass
def getInstanceBySid(self, sid = 0):
instance = nosqlMongodb()
return instance
def getDbList(self, args):
sid = args['sid']
mgdb_instance = self.getInstanceBySid(sid).mgdb_conn()
if mgdb_instance is False:
return mw.returnData(False,'无法链接')
result = {}
doc_list = mgdb_instance.list_database_names()
rlist = []
for x in doc_list:
if not x in ['admin', 'config', 'local']:
rlist.append(x)
result['list'] = rlist
return mw.returnData(True,'ok', result)
def getCollectionsList(self, args):
sid = args['sid']
name = args['name']
mgdb_instance = self.getInstanceBySid(sid).mgdb_conn()
if mgdb_instance is False:
return mw.returnData(False,'无法链接.')
result = {}
collections = mgdb_instance[name].list_collection_names()
result['collections'] = collections
return mw.returnData(True,'ok', result)
def getDataList(self, args):
sid = args['sid']
db = args['db']
collection = args['collection']
p = 1
size = 10
if 'p' in args:
p = args['p']
if 'size' in args:
size = args['size']
mgdb_instance = self.getInstanceBySid(sid).mgdb_conn()
if mgdb_instance is False:
return mw.returnData(False,'无法链接')
db_instance = mgdb_instance[db]
collection_instance = db_instance[collection]
start_index = (p - 1) * size
end_index = p * size
args_where = args['where']
where = {}
if 'field' in args_where:
mg_field = args_where['field']
if mg_field == '_id':
mg_value = ObjectId(args_where['value'])
where[mg_field] = mg_value
else:
mg_value = args_where['value']
where[mg_field] = re.compile(mg_value)
# print(where)
result = collection_instance.find(where).skip(start_index).limit(size).sort('_id',-1)
count = collection_instance.count_documents(where)
d = []
for document in result:
d.append(document)
doc_str_json = dumps(d)
result = json.loads(doc_str_json)
page_args = {}
page_args['count'] = count
page_args['tojs'] = 'mongodbDataList'
page_args['p'] = p
page_args['row'] = size
rdata = {}
rdata['page'] = mw.getPage(page_args)
rdata['list'] = result
rdata['count'] = count
rdata['soso_field'] = ''
if 'field' in args_where:
rdata['soso_field'] = args_where['field']
return mw.returnData(True,'ok', rdata)
def delById(self,args):
sid = args['sid']
db = args['db']
collection = args['collection']
mgdb_instance = self.getInstanceBySid(sid).mgdb_conn()
if mgdb_instance is False:
return mw.returnData(False,'无法链接')
db_instance = mgdb_instance[db]
collection_instance = db_instance[collection]
_id = args['_id']
result = collection_instance.delete_one({"_id": ObjectId(_id)})
return mw.returnData(True,'文档删除【%d】个成功!' % result.deleted_count)
# ---------------------------------- run ----------------------------------
# 获取 mongodb databases 列表
def get_db_list(args):
t = nosqlMongodbCtr()
return t.getDbList(args)
# 获取 mongodb collections 列表
def get_collections_list(args):
t = nosqlMongodbCtr()
return t.getCollectionsList(args)
def get_data_list(args):
t = nosqlMongodbCtr()
return t.getDataList(args)
def set_kv(args):
t = nosqlMongodbCtr()
return t.setKv(args)
def del_val(args):
t = nosqlMongodbCtr()
return t.delVal(args)
def batch_del_val(args):
t = nosqlMongodbCtr()
return t.batchDelVal(args)
def clear_flushdb(args):
t = nosqlMongodbCtr()
return t.clearFlushDB(args)
def del_by_id(args):
t = nosqlMongodbCtr()
return t.delById(args)
# 测试
def test(args):
sid = args['sid']
t = nosqlMongodbCtr()
print(t.get_options())
print("test")
return 'ok'
+347
View File
@@ -0,0 +1,347 @@
# coding:utf-8
import sys
import io
import os
import time
import re
import redis
sys.path.append(os.getcwd() + "/class/core")
import mw
# def getPluginName():
# return 'data_query'
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class nosqlRedis():
__DB_PASS = None
__DB_USER = None
__DB_PORT = 6379
__DB_HOST = '127.0.0.1'
__DB_CONN = None
__DB_ERR = None
__DB_LOCAL = None
def __init__(self):
self.__config = self.get_options(None)
def redis_conn(self, db_idx=0):
if self.__DB_HOST in ['127.0.0.1', 'localhost']:
redis_path = "{}/redis".format(mw.getServerDir())
if not os.path.exists(redis_path): return False
if not self.__DB_LOCAL:
self.__DB_PASS = self.__config['requirepass']
self.__DB_PORT = int(self.__config['port'])
# print(self.__DB_HOST,self.__DB_PORT, self.__DB_PASS)
try:
redis_pool = redis.ConnectionPool(host=self.__DB_HOST, port=self.__DB_PORT, password=self.__DB_PASS, db=db_idx, socket_timeout=3)
self.__DB_CONN = redis.Redis(connection_pool=redis_pool)
self.__DB_CONN.ping()
return self.__DB_CONN
except redis.exceptions.ConnectionError:
return False
except Exception:
self.__DB_ERR = mw.getTracebackInfo()
return False
# 获取配置项
def get_options(self, get=None):
result = {}
redis_conf = mw.readFile("{}/redis/redis.conf".format(mw.getServerDir()))
if not redis_conf: return False
keys = ["bind", "port", "timeout", "maxclients", "databases", "requirepass", "maxmemory"]
for k in keys:
v = ""
rep = "\n%s\s+(.+)" % k
group = re.search(rep, redis_conf)
if not group:
if k == "maxmemory":
v = "0"
if k == "maxclients":
v = "10000"
if k == "requirepass":
v = ""
else:
if k == "maxmemory":
v = int(group.group(1).strip("mb"))
else:
v = group.group(1)
result[k] = v
return result
def set_host(self, host, port, name, username, password, prefix=''):
self.__DB_HOST = host
self.__DB_PORT = int(port)
self.__DB_NAME = name
if self.__DB_NAME: self.__DB_NAME = str(self.__DB_NAME)
self.__DB_USER = str(username)
self._USER = str(username)
self.__DB_PASS = str(password)
self.__DB_PREFIX = prefix
self.__DB_LOCAL = 1
return self
@singleton
class nosqlRedisCtr():
def __init__(self):
pass
def getInstanceBySid(self, sid = 0):
instance = nosqlRedis()
return instance
def getList(self, args):
sid = args['sid']
redis_instance = self.getInstanceBySid(sid).redis_conn(0)
if redis_instance is False:
return mw.returnData(False,'无法链接')
redis_info = redis_instance.info()
is_cluster = redis_info.get("cluster_enabled", 0)
if is_cluster != 0:
return mw.returnData(False, "当前不支持连接redis集群!")
db_num = 16
if sid != 0:
db_num = 1000
result = []
for x in range(0, db_num):
data = {}
data['id'] = x
data['name'] = 'DB{}'.format(x)
try:
redis_instance = self.getInstanceBySid(sid).redis_conn(x)
data['keynum'] = redis_instance.dbsize()
result.append(data)
except:
break
return mw.returnData(True,'ok', result)
def getDbKeyList(self, args):
p = 1
size = 10
if not 'sid' in args:
return mw.returnData(False, "缺少参数!sid")
if 'p' in args:
p = args['p']
if p < 1:
p = 1
if p > 10:
p = 10
if 'size' in args:
size = args['size']
sid = args['sid']
idx = args['idx']
search = '*'
if 'search' in args and args['search'] != '':
search = args['search']
redis_instance = self.getInstanceBySid(sid).redis_conn(idx)
total = redis_instance.dbsize()
if search != '*':
keylist = redis_instance.keys(search)
total = len(keylist)
else:
keys = redis_instance.scan(cursor=0, match="{}".format(search), count=p*size)
keylist = keys[1]
slist = keylist[(p - 1) * size:p*size]
items = []
for key in slist:
item = {}
try:
item['name'] = key.decode()
except Exception as e:
item['name'] = str(key)
item['endtime'] = redis_instance.ttl(key)
item['type'] = redis_instance.type(key).decode()
if item['type'] == 'string':
try:
item['val'] = redis_instance.get(key).decode()
except Exception as e:
item['val'] = str(redis_instance.get(key))
elif item['type'] == 'hash':
if redis_instance.hlen(key) > 500:
item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.hlen(key))
else:
item['val'] = str(redis_instance.hgetall(key))
elif item['type'] == 'list':
if redis_instance.llen(key) > 500:
item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.llen(key))
else:
item['val'] = str(redis_instance.lrange(key, 0, -1))
elif item['type'] == 'set':
if redis_instance.scard(key) > 500:
item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.scard(key))
else:
item['val'] = str(redis_instance.smembers(key))
elif item['type'] == 'zset':
if redis_instance.zcard(key) > 500:
item['val'] = "数据量过大无法显示!共 {} 条".format(redis_instance.zcard(key))
else:
item['val'] = str(redis_instance.zrange(key, 0, -1, withscores=True))
else:
item['val'] = ''
try:
item['len'] = redis_instance.strlen(key)
except:
item['len'] = len(item['val'])
items.append(item)
page_args = {}
page_args['count'] = total
page_args['tojs'] = 'redisGetKeyList'
page_args['p'] = p
page_args['row'] = size
rdata = {}
rdata['page'] = mw.getPage(page_args)
rdata['data'] = items
return mw.returnData(True,'ok',rdata)
def setKv(self,args):
if not 'name' in args:
return mw.returnData(False, "缺少参数!name")
if not 'val' in args:
return mw.returnData(False, "缺少参数!val")
if not 'idx' in args:
return mw.returnData(False, "缺少参数!idx")
sid = args['sid']
idx = args['idx']
name = args["name"]
val = args["val"]
endtime = args["endtime"]
redis_instance = self.getInstanceBySid(sid).redis_conn(idx)
redis_info = redis_instance.info()
if redis_info['role'] == 'slave':
return mw.returnData(False,'从库不能写操作!')
if endtime != '0':
redis_instance.set(name, val, int(endtime))
else:
redis_instance.set(name, val)
return mw.returnData(True,'操作成功')
def delVal(self, args):
sid = args['sid']
idx = args['idx']
name = args["name"]
redis_instance = self.getInstanceBySid(sid).redis_conn(idx)
redis_info = redis_instance.info()
if redis_info['role'] == 'slave':
return mw.returnData(False,'从库不能删除操作!')
redis_instance.delete(name)
return mw.returnData(True,'操作成功')
def batchDelVal(self, args):
sid = args['sid']
idx = args['idx']
keys = args["keys"]
redis_instance = self.getInstanceBySid(sid).redis_conn(idx)
redis_info = redis_instance.info()
if redis_info['role'] == 'slave':
return mw.returnData(False,'从库不能删除操作!')
for k in keys:
redis_instance.delete(k)
return mw.returnData(True,'操作成功')
def clearFlushDB(self, args):
sid = args['sid']
idxs = args['idxs']
for idx in idxs:
redis_instance = self.getInstanceBySid(sid).redis_conn(idx)
redis_info = redis_instance.info()
if redis_info['role'] == 'slave':
return mw.returnData(False,'从库不能清空操作!')
redis_instance.flushdb()
return mw.returnData(True,'操作成功')
# ---------------------------------- run ----------------------------------
# 获取 redis databases 列表
def get_list(args):
t = nosqlRedisCtr()
return t.getList(args)
# 获取 redis key 列表
def get_dbkey_list(args):
t = nosqlRedisCtr()
return t.getDbKeyList(args)
def set_kv(args):
t = nosqlRedisCtr()
return t.setKv(args)
def del_val(args):
t = nosqlRedisCtr()
return t.delVal(args)
def batch_del_val(args):
t = nosqlRedisCtr()
return t.batchDelVal(args)
def clear_flushdb(args):
t = nosqlRedisCtr()
return t.clearFlushDB(args)
# 测试
def test(args):
sid = args['sid']
t = nosqlRedis()
print(t.get_options())
print("test")
return 'ok'
# ---------------------------------- run ----------------------------------
+301
View File
@@ -0,0 +1,301 @@
# coding:utf-8
import sys
import io
import os
import time
import re
import pymongo
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class nosqlMySQL():
__DB_PASS = None
__DB_USER = None
__DB_PORT = 3306
__DB_HOST = '127.0.0.1'
__DB_CONN = None
__DB_ERR = None
__DB_SOCKET = None
__DB_LOCAL = None
def __init__(self):
self.__config = self.get_options(None)
def conn(self):
if self.__DB_HOST in ['127.0.0.1', 'localhost']:
my_path = "{}/mysql".format(mw.getServerDir())
if not os.path.exists(my_path): return False
if not self.__DB_LOCAL:
# print(self.__config)
self.__DB_PORT = int(self.__config['port'])
self.__DB_USER = self.__config['username']
self.__DB_PASS = self.__config['password']
self.__DB_SOCKET = self.__config['socket']
try:
db = mw.getMyORM()
db.setPort(self.__DB_PORT)
db.setPwd(self.__DB_PASS)
db.setUser(self.__DB_USER)
if self.__DB_SOCKET != '':
db.setSocket(self.__DB_SOCKET)
return db
except Exception:
self.__DB_ERR = mw.get_error_info()
return False
def sqliteDb(self,dbname='databases'):
my_root_path = mw.getServerDir() +'/mysql'
name = 'mysql'
conn = mw.M(dbname).dbPos(my_root_path, name)
return conn
# 获取配置项
def get_options(self, get=None):
result = {}
my_cnf_path = "{}/mysql/etc/my.cnf".format(mw.getServerDir())
my_content = mw.readFile(my_cnf_path)
if not my_content: return False
mysql_pass = self.sqliteDb('config').where('id=?', (1,)).getField('mysql_root')
result['password'] = mysql_pass
result['username'] = 'root'
keys = ["bind_ip", "port"]
result['host'] = '127.0.0.1'
rep = 'port\s*=\s*(.*)'
port_re = re.search(rep, my_content)
if port_re:
result['port'] = int(port_re.groups()[0].strip())
else:
result['port'] = 3306
socket_rep = 'socket\s*=\s*(.*)'
socket_re = re.search(socket_rep, my_content)
if socket_re:
result['socket'] = socket_re.groups()[0].strip()
else:
result['socket'] = ''
return result
def set_host(self, host, port, name, username, password, prefix=''):
self.__DB_HOST = host
self.__DB_PORT = int(port)
self.__DB_NAME = name
if self.__DB_NAME: self.__DB_NAME = str(self.__DB_NAME)
self.__DB_USER = str(username)
self._USER = str(username)
self.__DB_PASS = str(password)
self.__DB_PREFIX = prefix
self.__DB_LOCAL = 1
return self
@singleton
class nosqlMySQLCtr():
def __init__(self):
pass
def getInstanceBySid(self, sid = 0):
instance = nosqlMySQL()
return instance
def getDbList(self, args):
sid = args['sid']
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
result = {}
db_list = my_instance.query('show databases')
rlist = []
for x in db_list:
if not x['Database'] in ['information_schema', 'mysql', 'performance_schema','sys']:
rlist.append(x['Database'])
result['list'] = rlist
return mw.returnData(True,'ok', result)
def getTableList(self, args):
sid = args['sid']
db = args['db']
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
sql = "select * from information_schema.tables where table_schema = '"+db+"'"
table_list = my_instance.query(sql)
# print(table_list)
rlist = []
for x in table_list:
# print(x['TABLE_NAME'])
rlist.append(x['TABLE_NAME'])
result = {}
result['list'] = rlist
return mw.returnData(True,'ok', result)
def getDataList(self, args):
sid = args['sid']
db = args['db']
table = args['table']
p = 1
size = 10
if 'p' in args:
p = args['p']
if 'size' in args:
size = args['size']
start_index = (p - 1) * size
args_where = {}
where_sql = ''
if 'where' in args:
args_where = args['where']
if 'field' in args_where:
if args_where['field'] == 'id' or args_where['field'].find('id')>-1:
where_sql = ' where '+args_where['field'] + " = '"+args_where['value']+"' "
else:
where_sql = ' where '+args_where['field'] + " like '%"+args_where['value']+"%' "
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
my_instance.setDbName(db)
sql = 'select count(*) as num from ' + table + where_sql
# print(sql)
count_result = my_instance.query(sql)
count = count_result[0]['num']
sql = 'select * from ' + table + where_sql + ' limit '+str(start_index)+',10';
# print(sql)
result = my_instance.query(sql)
for i in range(len(result)):
for f in result[i]:
result[i][f] = str(result[i][f])
# print(result)
page_args = {}
page_args['count'] = count
page_args['tojs'] = 'mysqlGetDataList'
page_args['p'] = p
page_args['row'] = size
rdata = {}
rdata['page'] = mw.getPage(page_args)
rdata['list'] = result
rdata['count'] = count
rdata['soso_field'] = ''
if 'field' in args_where:
rdata['soso_field'] = args_where['field']
return mw.returnData(True,'ok', rdata)
def showProcessList(self,args):
sql = 'show processlist';
sid = args['sid']
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
result = my_instance.query(sql)
rdata = {}
rdata['list'] = result
return mw.returnData(True,'ok', rdata)
def showStatusList(self,args):
sql = 'show status';
sid = args['sid']
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
result = my_instance.query(sql)
rdata = {}
rdata['list'] = result
return mw.returnData(True,'ok', rdata)
def showStatsList(self, args):
sql = "show status like 'Com_%'";
sid = args['sid']
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
result = my_instance.query(sql)
rdata = {}
rdata['list'] = result
return mw.returnData(True,'ok', rdata)
# ---------------------------------- run ----------------------------------
# 获取 mysql 列表
def get_db_list(args):
t = nosqlMySQLCtr()
return t.getDbList(args)
# 获取 mysql 列表
def get_table_list(args):
t = nosqlMySQLCtr()
return t.getTableList(args)
def get_data_list(args):
t = nosqlMySQLCtr()
return t.getDataList(args)
def get_proccess_list(args):
t = nosqlMySQLCtr()
return t.showProcessList(args)
def get_status_list(args):
t = nosqlMySQLCtr()
return t.showStatusList(args)
def get_stats_list(args):
t = nosqlMySQLCtr()
return t.showStatsList(args)
# 测试
def test(args):
sid = args['sid']
t = nosqlMySQLCtr()
print(t.get_options())
print("test")
return 'ok'
+48
View File
@@ -0,0 +1,48 @@
.main-content .safe {
position: relative;
}
.mask_layer {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgb(255 255 255 / 60%);
z-index: 9998;
}
.mask_layer .prompt_description {
width: 350px;
height: 60px;
line-height: 60px;
text-align: center;
position: absolute;
left: 50%;
top: 50%;
margin-top: -25px;
margin-left: -175px;
background: #fff;
box-shadow: 1px 1px 50px rgb(0 0 0 / 30%);
border: 1px solid #eee;
border-radius: 2px;
font-size: 13px;
}
#mongodb_search xm-select {
min-height: 30px;
line-height: 30px;
}
#mongodb_search xm-select .xm-label .xm-label-block{
height: 20px;
line-height: 20px;
}
#mongodb td:last-child, th:last-child {
width: 44px;
position:sticky;
right:0; /* 首行永远固定在左侧 */
z-index:1;
background-color:white;
}
+11
View File
@@ -0,0 +1,11 @@
/* menu start */
.menu .current .menu_plugin_data_query:hover {
background-image: url("/plugins/file?name=data_query&f=ico.png");
}
.menu .menu_plugin_data_query {
background-image: url("/plugins/file?name=data_query&f=ico.png");
}
/* menu end */
+294
View File
@@ -0,0 +1,294 @@
<div class="main-content" style="min-height: 389px;">
<div class="container-fluid" style="padding-bottom: 50px;">
<div id="cutTab" class="pos-box bgw mtb15" style="height:45px">
<div class="tab-list">
<div class="tabs-item active" data-name="redis">Redis</div>
<div class="tabs-item" data-name="mongodb">Mongodb</div>
<div class="tabs-item" data-name="memcached">Memcached</div>
<div class="tabs-item" data-name="mysql">MySQL</div>
</div>
</div>
<div class="bgw mtb15 pd15 tab-view-box firewall-tab-view safe" style="overflow: hidden;">
<div class="mask_layer" style="display:none;">
<div class="prompt_description">当前未安装本地服务器,<a class="btlink install_server" href="/soft">点击安装</a></div>
</div>
<!-- mysql start -->
<!-- show w-full -->
<div class="tab-con hide" id="mysql" style="padding: 0px;">
<div class="col-md-12" style="padding: 0px;overflow: hidden;">
<div class="tootls_group tootls_top">
<div class="pull-left">
<div class="server_list" style="float:left;">
<select name="sid" class="bt-input-text c5 mr5">
<option value="0">本地服务器</option>
</select>
</div>
<div class="mysql_db_list" style="float:left;">
<select name="mysql_db" class="bt-input-text c5 mr5">
<option value="0">数据库空</option>
</select>
</div>
<div class="mysql_table_list" style="float:left;">
<select name="mysql_table" class="bt-input-text c5 mr5">
<option value="0">数据表空</option>
</select>
</div>
<div class="field" style="float:left;">
<select name="mysql_field_key" class="bt-input-text c5 mr5" style="width:80px;">
<option value="0">无字段</option>
</select>
</div>
<div class="value" style="float:left;">
<input name="mysql_field_value" type="text" class="bt-input-text" placeholder="请输入查找内容">
</div>
<button type="button" class="mysql_find btn btn-success btn-sm mr5 ml5" style="float:right;">
<span>查找</span>
</button>
</div>
</div>
<div style="position: relative;">
<div id="mysql_table" class="mysql_table divtable mtb10">
<table class="table table-hover">
<thead style="position: relative;z-index: 1;">
<tr>
<th><span>编号</span></th>
<th><span>操作类型</span></th>
<th><span>详情</span></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="mysql_list_page page">
<div><span class="Pcurrent">0</span><span class="Pcount">共0条</span></div>
</div>
</div>
<div class="col-md-12" style="padding-left: 3px;">
<div id="mysql_list_tab" style="padding-top:0px;">
<div class="tab-nav">
<span data-name="proccess" class="on">进程</span>
<span data-name="status" class="">状态</span>
<span data-name="stats" class="">统计</span>
</div>
</div>
<div style="position: relative;">
<div id="mysql_ot_table" class="divtable">
<table class="table table-hover">
<thead style="position: relative;z-index: 1;">
<tr>
<th><span>编号</span></th>
<th><span>操作类型</span></th>
<th><span>详情</span></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<!-- mysql end -->
<!-- mongodb start -->
<!-- show w-full -->
<div class="tab-con hide" id="mongodb" style="padding: 0px;">
<div class="tootls_group tootls_top">
<div class="pull-left">
<div class="field" style="float:left;">
<select name="mongodb_field_key" class="bt-input-text c5 mr5" style="width:80px;">
<option value="0">无字段</option>
</select>
</div>
<div class="value" style="float:left;">
<input name="mongodb_field_value" type="text" class="bt-input-text" placeholder="请输入查找内容">
</div>
<button type="button" class="mongodb_find btn btn-success btn-sm mr5 ml5" style="float:right;">
<span>查找</span>
</button>
</div>
<div class="pull-right" style="padding-top: 5px;">
<div class="server_list" style="float:left;">
<select name="sid" class="bt-input-text c5 mr5">
<option value="0">本地服务器</option>
</select>
</div>
<div class="db_list" style="float:left;">
<select name="db" class="bt-input-text c5 mr5">
<option value="0">空</option>
</select>
</div>
<div class="search" id="mongodb_search"></div>
</div>
</div>
<div style="position: relative;">
<div id="mongodb_table" class="mongodb_table divtable mtb10">
<table class="table table-hover">
<thead style="position: relative;z-index: 1;">
<tr>
<th><span>编号</span></th>
<th><span>操作类型</span></th>
<th><span>详情</span></th>
<th style="text-align:right;"><span>操作</span></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="mongodb_list_page page">
<div><span class="Pcurrent">0</span><span class="Pcount">共0条</span></div>
</div>
</div>
<!-- mongodb end -->
<!-- redis start -->
<div class="tab-con show w-full" id="redis" style="padding: 0px;">
<div id="redis_ctr" style="position: relative;">
<div class="tootls_group tootls_top">
<div class="pull-left">
<button id="redis_add_key" type="button" class="refresh btn btn-success btn-sm mr5">
<span>添加key</span>
</button>
<button id="redis_clear_all" type="button" class="clear btn btn-default btn-sm mr5" style="border-right: 1px solid #ccc;padding-right: 20px;">
<span>清空数据库</span>
</button>
</div>
</div>
<div id="redis_list_tab" style="padding-top:10px;">
<div class="tab-nav">
<!-- <span data-id="0" class="on">DB0(0)</span> -->
</div>
</div>
<div class="tootls_group tootls_top">
<div class="pull-left"></div>
<div class="pull-right" style="padding-top: 5px;">
<div class="search">
<input id="redis_ksearch" type="text" class="search_input" placeholder="请输入键名称">
<span id="redis_ksearch_span" class="glyphicon glyphicon-search" aria-hidden="true"></span>
</div>
</div>
</div>
<div class="divtable mtb10 redis_table_content">
<table class="table table-hover">
<thead style="position: relative;z-index: 1;">
<tr>
<th width="30"><input type="checkbox" onclick="checkSelect();"></th>
<th><span>键</span></th>
<th><span>值</span></th>
<th><span>数据类型</span></th>
<th><span>数据长度</span></th>
<th><span>有效期</span></th>
<th style="text-align:right;"><span>操作</span></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="tootls_group tootls_bottom">
<div class="pull-left">
<button id="redis_batch_del" type="button" class="btn btn-sm set_batch_option bt-disabled btn-default">批量删除</button>
</div>
<div class="pull-right">
<div class="page redis_list_page">
<div><span class="Pcurrent">0</span><span class="Pcount">共0条</span></div>
</div>
</div>
</div>
</div>
<!-- redis end -->
<!-- memcached start -->
<div class="tab-con hide" id="memcached" style="padding: 0px;">
<div id="memcached_ctr" style="position: relative;">
<div class="tootls_group tootls_top">
<div class="pull-left">
<button id="memcached_add_key" type="button" class="refresh btn btn-success btn-sm mr5">
<span>添加key</span>
</button>
<button id="memcached_clear_all" type="button" class="clear btn btn-default btn-sm mr5" style="border-right: 1px solid #ccc;padding-right: 20px;">
<span>清空</span>
</button>
</div>
<div class="pull-right" style="padding-top: 5px;">
<div class="item_list" style="float:left;">
<select name="item" class="bt-input-text c5 mr5">
<option value="0">空</option>
</select>
</div>
<div class="search">
<input id="memcached_ksearch" type="text" class="search_input" placeholder="请输入键名称">
<span id="memcached_ksearch_span" class="glyphicon glyphicon-search" aria-hidden="true"></span>
</div>
</div>
</div>
<div class="divtable mtb10 memcached_table_content">
<table class="table table-hover">
<thead style="position: relative;z-index: 1;">
<tr>
<th width="30"><input type="checkbox" onclick="checkSelect();"></th>
<th><span>键</span></th>
<th><span>值</span></th>
<th><span>数据长度</span></th>
<th><span>有效期</span></th>
<th style="text-align:right;"><span>操作</span></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="tootls_group tootls_bottom">
<div class="pull-left">
<button id="memcached_batch_del" type="button" class="btn btn-sm set_batch_option bt-disabled btn-default">批量删除</button>
</div>
<div class="pull-right">
<div class="page memcached_list_page">
<div><span class="Pcurrent">0</span><span class="Pcount">共0条</span></div>
</div>
</div>
</div>
</div>
<!-- memcached end -->
</div>
</div>
</div>
+1281
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -15,5 +15,5 @@
"home": "https://docker.io", "home": "https://docker.io",
"doc1":"https://docker-py.readthedocs.io/", "doc1":"https://docker-py.readthedocs.io/",
"type": 0, "type": 0,
"pid": "2" "pid": "4"
} }
+1 -1
View File
@@ -38,7 +38,7 @@ Install_App()
cn=$(curl -fsSL -m 10 http://ipinfo.io/json | grep "\"country\": \"CN\"") cn=$(curl -fsSL -m 10 http://ipinfo.io/json | grep "\"country\": \"CN\"")
HTTP_PREFIX="https://" HTTP_PREFIX="https://"
if [ ! -z "$cn" ];then if [ ! -z "$cn" ];then
HTTP_PREFIX="https://ghproxy.com/" HTTP_PREFIX="https://mirror.ghproxy.com/"
fi fi
# FlameGraph start # FlameGraph start
+1 -1
View File
@@ -20,7 +20,7 @@
# http://localhost/?code=M.C106_BAY.2.3e12c859-6107-0c5b-9ef4-14b3fb8269ba&state=JzHdzHXmA7x6zl7Be6cJ6uOlf9Bg69 # http://localhost/?code=M.C106_BAY.2.3e12c859-6107-0c5b-9ef4-14b3fb8269ba&state=JzHdzHXmA7x6zl7Be6cJ6uOlf9Bg69
# python3 /www/mdserver-web/plugins/gdrive/index.py site bbs.midoks.me 3 # python3 /www/mdserver-web/plugins/gdrive/index.py site bbs.midoks.icu 3
# python3 /www/mdserver-web/plugins/gdrive/index.py database t1 3 # python3 /www/mdserver-web/plugins/gdrive/index.py database t1 3
# python3 /www/server/mdserver-web/plugins/msonedrive/index.py path # python3 /www/server/mdserver-web/plugins/msonedrive/index.py path
# /Users/midoks/Desktop/dev/python 3 # /Users/midoks/Desktop/dev/python 3
+5 -1
View File
@@ -8,6 +8,10 @@ GIT_SDIR="{$CODE_DIR}"
GIT_USER_DIR="${GIT_SDIR}/{$USERNAME}" GIT_USER_DIR="${GIT_SDIR}/{$USERNAME}"
GIT_PROJECT_DIR="${GIT_USER_DIR}/{$PROJECT}" GIT_PROJECT_DIR="${GIT_USER_DIR}/{$PROJECT}"
if [ ! -d $GIT_USER_DIR ];then
mkdir -p $GIT_USER_DIR
chown -R www:www $GIT_USER_DIR
fi
git config --global credential.helper store git config --global credential.helper store
git config --global pull.rebase false git config --global pull.rebase false
@@ -34,7 +38,7 @@ if [ ! -d $WEB_PATH ];then
rsync -vauP --delete --exclude=".*" $GIT_PROJECT_DIR/ $WEB_PATH rsync -vauP --delete --exclude=".*" $GIT_PROJECT_DIR/ $WEB_PATH
else else
if [ -f $GIT_PROJECT_DIR/exclude.list ];then if [ -f $GIT_PROJECT_DIR/exclude.list ];then
rsync -vauP --delete --exclude-from="$GIT_PROJECT_DIR/exclude.list" $GIT_PROJECT_DIR/ $WEB_PATH rsync -vauP --exclude-from="$GIT_PROJECT_DIR/exclude.list" $GIT_PROJECT_DIR/ $WEB_PATH
else else
rsync -vauP --exclude=".*" $GIT_PROJECT_DIR/ $WEB_PATH rsync -vauP --exclude=".*" $GIT_PROJECT_DIR/ $WEB_PATH
fi fi
+3 -1
View File
@@ -15,7 +15,9 @@ if [ ! -d $GIT_PROJECT_DIR ];then
fi fi
unset GIT_DIR unset GIT_DIR
git config pull.rebase false
git config pull.rebase true
git config credential.helper store
cd $GIT_PROJECT_DIR && git pull cd $GIT_PROJECT_DIR && git pull
+1 -1
View File
@@ -36,7 +36,7 @@ Install_App()
if [ "${LOCAL_ADDR}" == "cn" ];then if [ "${LOCAL_ADDR}" == "cn" ];then
if [ ! -f ${APP_DIR}/haproxy-${VERSION}.tar.gz ];then if [ ! -f ${APP_DIR}/haproxy-${VERSION}.tar.gz ];then
wget -O ${APP_DIR}/haproxy-${VERSION}.tar.gz https://dl.midoks.me/soft/haproxy/haproxy-${VERSION}.tar.gz wget -O ${APP_DIR}/haproxy-${VERSION}.tar.gz https://dl.midoks.icu/soft/haproxy/haproxy-${VERSION}.tar.gz
fi fi
fi fi
+1
View File
@@ -12,6 +12,7 @@
<p onclick="myPerfOpt();">性能优化</p> <p onclick="myPerfOpt();">性能优化</p>
<p onclick="myLogs();">日志</p> <p onclick="myLogs();">日志</p>
<p onclick="pluginLogs('mariadb',$('.plugin_version').attr('version'),'show_log');">慢日志</p> <p onclick="pluginLogs('mariadb',$('.plugin_version').attr('version'),'show_log');">慢日志</p>
<p onclick="myBinLogs();">BINLOG</p>
<p onclick="dbList()">管理列表</p> <p onclick="dbList()">管理列表</p>
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p> <p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p>
</div> </div>
+202 -33
View File
@@ -90,6 +90,12 @@ def getDataDir():
tmp = re.search(rep, content) tmp = re.search(rep, content)
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def getLogBinName():
file = getConf()
content = mw.readFile(file)
rep = 'log-bin\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getPidFile(): def getPidFile():
file = getConf() file = getConf()
@@ -294,6 +300,53 @@ def binLog():
mw.writeFile(conf, con) mw.writeFile(conf, con)
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def binLogList():
args = getArgs()
data = checkArgs(args, ['page', 'page_size', 'tojs'])
if not data[0]:
return data[1]
page = int(args['page'])
page_size = int(args['page_size'])
data_dir = getDataDir()
log_bin_name = getLogBinName()
alist = os.listdir(data_dir)
log_bin_l = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(log_bin_name) and not f.endswith('.index'):
abspath = data_dir + '/' + f
t['name'] = f
t['size'] = os.path.getsize(abspath)
t['time'] = mw.getDataFromInt(os.path.getctime(abspath))
log_bin_l.append(t)
log_bin_l = sorted(log_bin_l, key=lambda x: x['time'], reverse=True)
# print(log_bin_l)
# print(data_dir, log_bin_name)
count = len(log_bin_l)
page_start = (page - 1) * page_size
page_end = page_start + page_size
if page_end > count:
page_end = count
data = {}
page_args = {}
page_args['count'] = count
page_args['p'] = page
page_args['row'] = page_size
page_args['tojs'] = args['tojs']
data['page'] = mw.getPage(page_args)
data['data'] = log_bin_l[page_start:page_end]
return mw.getJson(data)
def cleanBinLog(): def cleanBinLog():
db = pMysqlDb() db = pMysqlDb()
@@ -302,21 +355,6 @@ def cleanBinLog():
return mw.returnJson(True, '清理BINLOG成功!') return mw.returnJson(True, '清理BINLOG成功!')
def setSkipGrantTables(v):
'''
设置是否密码验证
'''
conf = getConf()
con = mw.readFile(conf)
if v:
if con.find('#skip-grant-tables') != -1:
con = con.replace('#skip-grant-tables', 'skip-grant-tables')
else:
con = con.replace('skip-grant-tables', '#skip-grant-tables')
mw.writeFile(conf, con)
return True
def getErrorLog(): def getErrorLog():
args = getArgs() args = getArgs()
path = getDataDir() path = getDataDir()
@@ -579,7 +617,7 @@ def setMyPort():
restart() restart()
return mw.returnJson(True, '编辑成功!') return mw.returnJson(True, '编辑成功!')
# python3 plugins/mariadb/index.py run_info {}
def runInfo(version): def runInfo(version):
if status(version) == 'stop': if status(version) == 'stop':
@@ -760,6 +798,8 @@ def rootPwd():
'id=?', (1,)).getField('mysql_root') 'id=?', (1,)).getField('mysql_root')
# python3 plugins/mariadb/index.py import_db_external {"file":"xx.sql","name":"demo1"}
# python3 plugins/mariadb/index.py import_db_external {"file":"db_demo1_20231221_203614 2.sql","name":"demo1"}
def importDbExternal(): def importDbExternal():
args = getArgs() args = getArgs()
data = checkArgs(args, ['file', 'name']) data = checkArgs(args, ['file', 'name'])
@@ -806,6 +846,9 @@ def importDbExternal():
mw.execShell(cmd) mw.execShell(cmd)
import_sql = import_dir + tmpFile import_sql = import_dir + tmpFile
if file.find(".sql") > -1 and file.find(".sql.gz") == -1:
import_sql = import_dir + file
if import_sql == "": if import_sql == "":
return mw.returnJson(False, '未找SQL文件') return mw.returnJson(False, '未找SQL文件')
@@ -813,12 +856,14 @@ def importDbExternal():
sock = getSocketFile() sock = getSocketFile()
os.environ["MYSQL_PWD"] = pwd os.environ["MYSQL_PWD"] = pwd
mysql_cmd = getServerDir() + '/bin/mariadb -S ' + sock + ' -uroot -p' + \ mysql_cmd = getServerDir() + '/bin/mariadb -S ' + sock + ' -uroot -p"' + \
pwd + ' ' + name + ' < ' + import_sql pwd + '" ' + name + ' < "' + import_sql+'"'
# print(mysql_cmd) # print(mysql_cmd)
os.system(mysql_cmd) os.system(mysql_cmd)
os.remove(import_sql)
if ext != 'sql':
os.remove(import_sql)
return mw.returnJson(True, 'ok') return mw.returnJson(True, 'ok')
@@ -982,7 +1027,7 @@ def syncGetDatabases():
host = user["Host"] host = user["Host"]
break break
ps = mw.getMsg('INPUT_PS') ps = vdb_name
if vdb_name == 'test': if vdb_name == 'test':
ps = mw.getMsg('DATABASE_TEST') ps = mw.getMsg('DATABASE_TEST')
addTime = time.strftime('%Y-%m-%d %X', time.localtime()) addTime = time.strftime('%Y-%m-%d %X', time.localtime())
@@ -1054,12 +1099,21 @@ def setRootPwd(version=''):
if not data[0]: if not data[0]:
return data[1] return data[1]
#强制修改
force = 0
if 'force' in args and args['force'] == '1':
force = 1
password = args['password'] password = args['password']
try: try:
pdb = pMysqlDb('mysql') pdb = pMysqlDb('mysql')
result = pdb.query("show databases") result = pdb.query("show databases")
isError = isSqlError(result) isError = isSqlError(result)
if isError != None: if isError != None:
if force == 1:
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '【强制修改】数据库root密码修改成功(不意为成功连接数据)!')
return isError return isError
cmd = "ALTER USER 'root'@'localhost' IDENTIFIED BY '" + password + "';" cmd = "ALTER USER 'root'@'localhost' IDENTIFIED BY '" + password + "';"
@@ -1069,7 +1123,12 @@ def setRootPwd(version=''):
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
orm = pMysqlDb() orm = pMysqlDb()
orm.execute("flush privileges") orm.execute("flush privileges")
return mw.returnJson(True, '数据库root密码修改成功!')
msg = ''
if force == 1:
msg = ',无须强制!'
return mw.returnJson(True, '数据库root密码修改成功!' + msg)
except Exception as ex: except Exception as ex:
return mw.returnJson(False, '修改错误:' + str(ex)) return mw.returnJson(False, '修改错误:' + str(ex))
@@ -1276,16 +1335,58 @@ def setDbAccess():
psdb.where('username=?', (name,)).save('accept,rw', (access, 'rw',)) psdb.where('username=?', (name,)).save('accept,rw', (access, 'rw',))
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def openSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('#skip-grant-tables','skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def closeSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('skip-grant-tables','#skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def resetDbRootPwd(version):
serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf"
pwd = mw.getRandomString(16)
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
db_option = "-S " + serverdir + "/mysql.sock"
cmd_pass = serverdir + '/bin/mariadb ' + db_option + ' -uroot -e'
cmd_pass = cmd_pass + \
"\"flush privileges;use mysql;grant all privileges on *.* to 'root'@'localhost' identified by '" + pwd + "';"
cmd_pass = cmd_pass + "flush privileges;\""
data = mw.execShell(cmd_pass)
# print(data)
return True
def fixDbAccess(version): def fixDbAccess(version):
pdb = pMysqlDb()
mdb_ddir = getDataDir()
if not os.path.exists(mdb_ddir):
return mw.returnJson(False, '数据目录不存在,尝试重启重建!')
try: try:
pdb = pMysqlDb()
psdb = pSqliteDb('databases') psdb = pSqliteDb('databases')
data = pdb.query('show databases') data = pdb.query('show databases')
isError = isSqlError(data) isError = isSqlError(data)
if isError != None: if isError != None:
# 重置密码
appCMD(version, 'stop') appCMD(version, 'stop')
mw.execShell("rm -rf " + getServerDir() + "/data") openSkipGrantTables()
appCMD(version, 'start')
time.sleep(3)
resetDbRootPwd(version)
appCMD(version, 'stop')
closeSkipGrantTables()
appCMD(version, 'start') appCMD(version, 'start')
return mw.returnJson(True, '修复成功!') return mw.returnJson(True, '修复成功!')
return mw.returnJson(True, '正常无需修复!') return mw.returnJson(True, '正常无需修复!')
@@ -1588,6 +1689,13 @@ def setDbMasterAccess():
psdb.where('username=?', (username,)).save('accept', (access,)) psdb.where('username=?', (username,)).save('accept', (access,))
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def resetMaster(version=''):
pdb = pMysqlDb()
r = pdb.execute('reset master')
isError = isSqlError(r)
if isError != None:
return isError
return mw.returnJson(True, '重置成功!')
def getMasterDbList(version=''): def getMasterDbList(version=''):
args = getArgs() args = getArgs()
@@ -1899,8 +2007,7 @@ def getMasterRepSlaveUserCmd(version):
if mode == "gtid": if mode == "gtid":
sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \
clist[0]['username'] + "', MASTER_PASSWORD='" + \ clist[0]['username'] + "', MASTER_PASSWORD='" + \
clist[0]['password'] + "', " + "MASTER_LOG_FILE='" + mstatus[0]["File"] + \ clist[0]['password'] + "',MASTER_USE_GTID=no,MASTER_CONNECT_RETRY=10;"
"',MASTER_USE_GTID=no,MASTER_CONNECT_RETRY=10;"
else: else:
sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \ sql = "CHANGE MASTER " + connection_name + "TO MASTER_HOST='" + ip + "', MASTER_PORT=" + port + ", MASTER_USER='" + \
clist[0]['username'] + "', MASTER_PASSWORD='" + \ clist[0]['username'] + "', MASTER_PASSWORD='" + \
@@ -2186,6 +2293,58 @@ def getSlaveList(version=''):
data['data'] = dlist data['data'] = dlist
return mw.getJson(data) return mw.getJson(data)
def trySlaveSyncBugfix(version=''):
if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', [])
mode_file = getSyncModeFile()
if not os.path.exists(mode_file):
return mw.returnJson(False, '需要先设置同步配置')
mode = mw.readFile(mode_file)
if mode != 'sync-user':
return mw.returnJson(False, '仅支持【同步账户】模式')
conn = pSqliteDb('slave_sync_user')
slave_sync_data = conn.field('ip,port,user,pass,mode,cmd').select()
if len(slave_sync_data) < 1:
return mw.returnJson(False, '需要先添加【同步用户】配置!')
# print(slave_sync_data)
# 本地从库
sdb = pMysqlDb()
gtid_purged = ''
for i in range(len(slave_sync_data)):
port = slave_sync_data[i]['port']
password = slave_sync_data[i]['pass']
host = slave_sync_data[i]['ip']
user = slave_sync_data[i]['user']
# print(port, password, host)
mdb = mw.getMyORM()
mdb.setHost(host)
mdb.setPort(port)
mdb.setUser(user)
mdb.setPwd(password)
mdb.setSocket('')
# var_gtid = mdb.query('show VARIABLES like "%gtid_purged%"')
var_gtid = mdb.query('select @@global.gtid_current_pos as Value')
#print(var_gtid)
if len(var_gtid) > 0:
gtid_purged += var_gtid[0]['Value'] + ','
gtid_purged = gtid_purged.strip(',')
sql = "set @@global.gtid_slave_pos='" + gtid_purged + "'"
sdb.query('stop all slaves')
# print(sql)
sdb.query(sql)
sdb.query('start all slaves')
return mw.returnJson(True, '修复成功!')
def getSlaveSyncCmd(version=''): def getSlaveSyncCmd(version=''):
root = mw.getRunDir() root = mw.getRunDir()
@@ -2226,7 +2385,7 @@ def parseSlaveSyncCmd(cmd):
a[kv[0]] = kv[1].replace("'", '').replace("'", '').replace(";", '') a[kv[0]] = kv[1].replace("'", '').replace("'", '').replace(";", '')
return a return a
# python3 plugins/mariadb/index.py init_slave_status {}
def initSlaveStatusSyncUser(version=''): def initSlaveStatusSyncUser(version=''):
conn = pSqliteDb('slave_sync_user') conn = pSqliteDb('slave_sync_user')
@@ -2267,7 +2426,7 @@ def initSlaveStatusSyncUser(version=''):
try: try:
pinfo = parseSlaveSyncCmd(cmd_sql) pinfo = parseSlaveSyncCmd(cmd_sql)
except Exception as e: except Exception as e:
return mw.returnJson(False, base_t + '->CMD同步命令不合规范!') return mw.returnJson(False, base_t + '->CMD同步命令不合规范:'+str(e))
pdb.query(cmd_sql) pdb.query(cmd_sql)
@@ -2452,8 +2611,7 @@ def fullSync(version=''):
if args['begin'] == '1': if args['begin'] == '1':
cmd = 'cd ' + mw.getRunDir() + ' && python3 ' + \ cmd = 'cd ' + mw.getRunDir() + ' && python3 ' + \
getPluginDir() + \ getPluginDir() + \
'/index.py do_full_sync {"db":"' + \ '/index.py do_full_sync {"db":"' + args['db'] + '","sign":"' + sign + '"} &'
args['db'] + '","sign":"' + sign + '"} &'
# print(cmd) # print(cmd)
mw.execShell(cmd) mw.execShell(cmd)
return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0}) return json.dumps({'code': 0, 'msg': '同步数据中!', 'progress': 0})
@@ -2475,6 +2633,7 @@ def fullSync(version=''):
return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0}) return json.dumps({'code': 0, 'msg': '点击开始,开始同步!', 'progress': 0})
# python3 plugins/mariadb/index.py do_full_sync {"db":"demo1","sign":"","beigin":"1"}
def doFullSync(version=''): def doFullSync(version=''):
mode_file = getSyncModeFile() mode_file = getSyncModeFile()
if not os.path.exists(mode_file): if not os.path.exists(mode_file):
@@ -2512,13 +2671,16 @@ def doFullSyncUser(version=''):
ip = data['ip'] ip = data['ip']
bak_file = '/tmp/tmp.sql' bak_file = '/tmp/tmp.sql'
if os.path.exists(bak_file):
os.system("rm -rf " + bak_file)
writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0}) writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0})
writeDbSyncStatus({'code': 1, 'msg': '远程导出数据...', 'progress': 10}) writeDbSyncStatus({'code': 1, 'msg': '远程导出数据...', 'progress': 10})
if not os.path.exists(bak_file): if not os.path.exists(bak_file):
dump_sql_data = getServerDir() + "/bin/mysqldump --force --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \ # https://mariadb.com/kb/zh-cn/mariadb-dump/
port + " -u" + user + " -p" + apass + " " + sync_db + " > " + bak_file dump_sql_data = getServerDir() + "/bin/mariadb-dump -f --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \
port + " -u" + user + " -p'" + apass + "' " + sync_db + ">" + bak_file
print(dump_sql_data) print(dump_sql_data)
mw.execShell(dump_sql_data) mw.execShell(dump_sql_data)
@@ -2526,8 +2688,9 @@ def doFullSyncUser(version=''):
if os.path.exists(bak_file): if os.path.exists(bak_file):
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
sock = getSocketFile() sock = getSocketFile()
my_import_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \ my_import_cmd = getServerDir() + '/bin/mariadb -S ' + sock + " -uroot -p'" + pwd + \
' ' + sync_db + ' < ' + bak_file "' " + sync_db + '<' + bak_file
print(my_import_cmd)
mw.execShell(my_import_cmd) mw.execShell(my_import_cmd)
pinfo = parseSlaveSyncCmd(data['cmd']) pinfo = parseSlaveSyncCmd(data['cmd'])
@@ -2729,6 +2892,8 @@ if __name__ == "__main__":
print(getConf()) print(getConf())
elif func == 'bin_log': elif func == 'bin_log':
print(binLog()) print(binLog())
elif func == 'binlog_list':
print(binLogList())
elif func == 'clean_bin_log': elif func == 'clean_bin_log':
print(cleanBinLog()) print(cleanBinLog())
elif func == 'error_log': elif func == 'error_log':
@@ -2797,6 +2962,8 @@ if __name__ == "__main__":
print(getDbrunMode(version)) print(getDbrunMode(version))
elif func == 'set_dbrun_mode': elif func == 'set_dbrun_mode':
print(setDbrunMode(version)) print(setDbrunMode(version))
elif func == 'reset_master':
print(resetMaster(version))
elif func == 'get_masterdb_list': elif func == 'get_masterdb_list':
print(getMasterDbList(version)) print(getMasterDbList(version))
elif func == 'get_master_status': elif func == 'get_master_status':
@@ -2821,6 +2988,8 @@ if __name__ == "__main__":
print(getMasterRepSlaveUserCmd(version)) print(getMasterRepSlaveUserCmd(version))
elif func == 'get_slave_list': elif func == 'get_slave_list':
print(getSlaveList(version)) print(getSlaveList(version))
elif func == 'try_slave_sync_bugfix':
print(trySlaveSyncBugfix(version))
elif func == 'get_slave_sync_cmd': elif func == 'get_slave_sync_cmd':
print(getSlaveSyncCmd(version)) print(getSlaveSyncCmd(version))
elif func == 'get_slave_ssh_list': elif func == 'get_slave_ssh_list':
+186
View File
@@ -0,0 +1,186 @@
# coding:utf-8
import sys
import io
import os
import time
import subprocess
import re
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
if mw.isAppleSystem():
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)
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'mariadb'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getSPluginDir():
return '/www/server/mdserver-web/plugins/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getConf():
path = getServerDir() + '/etc/my.cnf'
return path
def getDataDir():
file = getConf()
content = mw.readFile(file)
rep = 'datadir\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getRelayLogName():
file = getConf()
content = mw.readFile(file)
rep = 'relay-log\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getLogBinName():
file = getConf()
content = mw.readFile(file)
rep = 'log-bin\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def binLogListLook(args):
file = args['file']
line = args['line']
data_dir = getDataDir()
my_bin = getServerDir() + '/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata = {}
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListLookDecode(args):
file = args['file']
line = args['line']
data_dir = getDataDir()
my_bin = getServerDir() + '/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata = {}
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListTraceRelay(args):
rdata = {}
file = args['file']
line = args['line']
relay_name = getRelayLogName()
data_dir = getDataDir()
alist = os.listdir(data_dir)
relay_list = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(relay_name) and not f.endswith('.index'):
relay_list.append(f)
relay_list = sorted(relay_list, reverse=True)
if len(relay_list) == 0:
rdata['cmd'] = ''
rdata['data'] = '无Relay日志'
return rdata
file = relay_list[0]
my_bin = getServerDir() + '/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListTraceBinLog(args):
rdata = {}
file = args['file']
line = args['line']
data_dir = getDataDir()
log_bin_name = getLogBinName()
alist = os.listdir(data_dir)
log_bin_l = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(log_bin_name) and not f.endswith('.index'):
log_bin_l.append(f)
if len(log_bin_l) == 0:
rdata['cmd'] = ''
rdata['data'] = '无BINLOG'
return rdata
log_bin_l = sorted(log_bin_l, reverse=True)
file = log_bin_l[0]
my_bin = getServerDir() + '/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
+309 -65
View File
@@ -58,6 +58,62 @@ function myAsyncPost(method,args){
return syncPost('/plugins/run', {name:'mysql', func:method, args:_args}); return syncPost('/plugins/run', {name:'mysql', func:method, args:_args});
} }
function myPostCallbak(method, version, args,callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
var req_data = {};
req_data['name'] = 'mariadb';
req_data['func'] = method;
req_data['script']='index_mariadb';
args['version'] = version;
if (typeof(args) == 'string' && args == ''){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/callback', req_data, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function myPostCallbakN(method, version, args,callback){
var req_data = {};
req_data['name'] = 'mariadb';
req_data['func'] = method;
req_data['script']='index_mariadb';
args['version'] = version;
if (typeof(args) == 'string' && args == ''){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/callback', req_data, function(data) {
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function runInfo(){ function runInfo(){
myPost('run_info','',function(data){ myPost('run_info','',function(data){
@@ -83,7 +139,7 @@ function runInfo(){
<tr><th>活动/峰值连接数</th><td>' + rdata.Threads_running + '/' + rdata.Max_used_connections + '</td><td colspan="2">若值过大,增加max_connections</td></tr>\ <tr><th>活动/峰值连接数</th><td>' + rdata.Threads_running + '/' + rdata.Max_used_connections + '</td><td colspan="2">若值过大,增加max_connections</td></tr>\
<tr><th>线程缓存命中率</th><td>' + ((1 - rdata.Threads_created / rdata.Connections) * 100).toFixed(2) + '%</td><td colspan="2">若过低,增加thread_cache_size</td></tr>\ <tr><th>线程缓存命中率</th><td>' + ((1 - rdata.Threads_created / rdata.Connections) * 100).toFixed(2) + '%</td><td colspan="2">若过低,增加thread_cache_size</td></tr>\
<tr><th>索引命中率</th><td>' + ((1 - rdata.Key_reads / rdata.Key_read_requests) * 100).toFixed(2) + '%</td><td colspan="2">若过低,增加key_buffer_size</td></tr>\ <tr><th>索引命中率</th><td>' + ((1 - rdata.Key_reads / rdata.Key_read_requests) * 100).toFixed(2) + '%</td><td colspan="2">若过低,增加key_buffer_size</td></tr>\
<tr><th>Innodb索引命中率</th><td>' + ((1 - rdata.Innodb_buffer_pool_reads / rdata.Innodb_buffer_pool_read_requests) * 100).toFixed(2) + '%</td><td colspan="2">若过低,增加innodb_buffer_pool_size</td></tr>\ <tr><th>Innodb索引命中率</th><td>' + (rdata.Innodb_buffer_pool_read_requests / (rdata.Innodb_buffer_pool_read_requests+rdata.Innodb_buffer_pool_reads)).toFixed(2) + '%</td><td colspan="2">若过低,增加innodb_buffer_pool_size</td></tr>\
<tr><th>查询缓存命中率</th><td>' + cache_size + '</td><td colspan="2">' + lan.soft.mysql_status_ps5 + '</td></tr>\ <tr><th>查询缓存命中率</th><td>' + cache_size + '</td><td colspan="2">' + lan.soft.mysql_status_ps5 + '</td></tr>\
<tr><th>创建临时表到磁盘</th><td>' + ((rdata.Created_tmp_disk_tables / rdata.Created_tmp_tables) * 100).toFixed(2) + '%</td><td colspan="2">若过大,尝试增加tmp_table_size</td></tr>\ <tr><th>创建临时表到磁盘</th><td>' + ((rdata.Created_tmp_disk_tables / rdata.Created_tmp_tables) * 100).toFixed(2) + '%</td><td colspan="2">若过大,尝试增加tmp_table_size</td></tr>\
<tr><th>已打开的表</th><td>' + rdata.Open_tables + '</td><td colspan="2">若过大,增加table_cache_size</td></tr>\ <tr><th>已打开的表</th><td>' + rdata.Open_tables + '</td><td colspan="2">若过大,增加table_cache_size</td></tr>\
@@ -438,13 +494,24 @@ function syncToDatabase(type){
} }
function setRootPwd(type, pwd){ function setRootPwd(type, pwd){
if (type==1){
var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
dbList();
},{icon: rdata.status ? 1 : 2});
});
return;
}
var index = layer.open({ var index = layer.open({
type: 1, type: 1,
area: '500px', area: '500px',
title: '修改数据库密码', title: '修改数据库密码',
closeBtn: 1, closeBtn: 1,
shift: 5, shift: 5,
btn:["提交","关闭"], btn:["提交", "关闭", "复制ROOT密码", "强制修改"],
shadeClose: true, shadeClose: true,
content: "<form class='bt-form pd20' id='mod_pwd'>\ content: "<form class='bt-form pd20' id='mod_pwd'>\
<div class='line'>\ <div class='line'>\
@@ -454,16 +521,36 @@ function setRootPwd(type, pwd){
</div>\ </div>\
</div>\ </div>\
</form>", </form>",
yes:function(index,layero){ yes:function(layerIndex){
var password = $("#MyPassword").val(); var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password}, function(data){ myPost('set_root_pwd', {password:password}, function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){ showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList(); dbList();
layer.close(index);
},{icon: rdata.status ? 1 : 2}); },{icon: rdata.status ? 1 : 2});
}); });
return; },
btn3:function(){
var password = $("#MyPassword").val();
copyText(password);
return false;
},
btn4:function(layerIndex){
layer.confirm('强制修改,是为了在重建时使用,确定强制?', {
btn: ['确定', '取消']
}, function(index, layero){
layer.close(index);
var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password,force:'1'}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
});
return false;
} }
}); });
} }
@@ -773,68 +860,53 @@ function setDbPs(id, name, obj) {
} }
function openPhpmyadmin(name,username,password){ function openPhpmyadmin(name,username,password){
$.post('/plugins/run', {'name':'phpmyadmin','func':'plugins_db_support'}, function(data){
var rdata = $.parseJSON(data.data);
data = syncPost('/plugins/check',{'name':'phpmyadmin'}); if (rdata.data['installed'] != 'ok'){
layer.msg('phpMyAdmin未安装!',{icon:2,shade: [0.3, '#000']});
return;
}
if (rdata.data['status'] != 'start'){
layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']});
return;
}
if (!data.status){ if (rdata.data['cfg']['choose'] != 'mariadb'){
layer.msg(data.msg,{icon:2,shade: [0.3, '#000']}); layer.msg('当前为['+rdata.choose+']模式,若要使用请修改phpMyAdmin访问切换.',{icon:2,shade: [0.3, '#000']});
return; return;
} }
var home_page = rdata.data['home_page'];
$("#toPHPMyAdmin").attr('action',home_page);
if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){
layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']});
setTimeout(function(){ window.location.href = '/soft'; },3000);
return;
}
//检查版本
bigVer = rdata.data['version'];
if (bigVer>=4.5){
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'status'}); setTimeout(function(){
if (data.data != 'start'){ $("#toPHPMyAdmin").submit();
layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']}); },2000);
return; layer.msg('phpMyAdmin['+data.data+']需要手动登录😭',{icon:16,shade: [0.3, '#000'],time:4000});
}
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_cfg'}); } else{
var rdata = $.parseJSON(data.data); var murl = $("#toPHPMyAdmin").attr('action');
if (rdata.choose != 'mariadb'){ $("#pma_username").val(username);
layer.msg('当前为['+rdata.choose+']模式,若要使用请修改phpMyAdmin访问切换.',{icon:2,shade: [0.3, '#000']}); $("#pma_password").val(password);
return; $("#db").val(name);
}
var phpmyadmin_cfg = rdata;
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_home_page'}); layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:2000});
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']});
return;
}
var home_page = rdata.data; setTimeout(function(){
home_page = home_page.replace("http://","http://"+phpmyadmin_cfg['username']+":"+phpmyadmin_cfg['password']+"@"); $("#toPHPMyAdmin").submit();
$("#toPHPMyAdmin").attr('action',home_page); },2000);
}
if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){ },'json');
layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']});
setTimeout(function(){ window.location.href = '/soft'; },3000);
return;
}
//检查版本
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'version'});
bigVer = data.data.split('.')[0]
if (bigVer>=4.5){
setTimeout(function(){
$("#toPHPMyAdmin").submit();
},3000);
layer.msg('phpMyAdmin['+data.data+']需要手动登录😭',{icon:16,shade: [0.3, '#000'],time:4000});
} else{
var murl = $("#toPHPMyAdmin").attr('action');
$("#pma_username").val(username);
$("#pma_password").val(password);
$("#db").val(name);
layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:2000});
setTimeout(function(){
$("#toPHPMyAdmin").submit();
},3000);
}
} }
function delBackup(filename, name, path){ function delBackup(filename, name, path){
@@ -1081,7 +1153,7 @@ function dbList(page, search){
list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>'; list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>';
list += '<td style="text-align:right">'; list += '<td style="text-align:right">';
list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\')" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | '; list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\')" title="数据库备份">'+(rdata.data[i]['is_backup']?'已备份':'未备份') +'</a> | ';
var rw = ''; var rw = '';
var rw_change = 'all'; var rw_change = 'all';
@@ -1160,6 +1232,146 @@ function dbList(page, search){
}); });
} }
function myBinRollingLogs(_name, func, _args, line){
var file_line = 100;
if ( typeof(line) != 'undefined' ){
file_line = line;
}
var reqTimer = null;
function requestLogs(func,file,line){
myPostCallbakN(func,'',{'file':file,"line":line}, function(rdata){
var data = rdata.data.data;
var cmd = rdata.data.cmd;
if(data == '') {
data = '当前没有日志!';
}
$('#my_rolling_cmd').html(cmd);
$('#my_rolling_copy').click(function(){
copyText(cmd);
});
var ebody = '<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log">'+data+'</textarea>';
$("#my_rolling_logs").html(ebody);
var ob = document.getElementById('roll_info_log');
ob.scrollTop = ob.scrollHeight;
});
}
layer.open({
type: 1,
title: _name + '日志',
area: ['800px','700px'],
end: function(){
if (reqTimer){
clearInterval(reqTimer);
}
},
content:'<div class="change-default" style="padding:0px 20px 0px;">\
<div class="divtable mtb10">\
<table class="table table-hover"><tr>\
<td id="my_rolling_cmd">cmd</td>\
<td id="my_rolling_copy" style="width:35px;"><span class="ico-copy cursor btcopy" title="复制密码"></span></td>\
<tr>\
</table>\
</div>\
</div>\
<div class="change-default" style="padding:0px 20px 0px;" id="my_rolling_logs">\
<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log"></textarea>\
</div>',
success:function(){
var fileName = _args['file'];
requestLogs(func,fileName,file_line);
reqTimer = setInterval(function(){
requestLogs(func,fileName,file_line);
},1000);
}
});
}
function myBinLogsRender(page){
var _data = {};
if (typeof(page) =='undefined'){
var page = 1;
}
_data['page'] = page;
_data['page_size'] = 10;
_data['tojs'] = 'myBinLogsRender';
myPost('binlog_list', _data, function(data){
var rdata = $.parseJSON(data.data);
// console.log(rdata);
var list = '';
for(i in rdata.data){
list += '<tr>';
list += '<td>' + rdata.data[i]['name'] +'</td>';
list += '<td>' + toSize(rdata.data[i]['size'])+'</td>';
list += '<td>' + rdata.data[i]['time'] +'</td>';
list += '<td style="text-align:right">';
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look" class="btlink">查看</a> | ';
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look_decode" class="btlink">解码查看</a>';
list += '</td></tr>';
}
if (rdata.data.length ==0){
list = '<tr><td colspan="4">无数据</td</tr>';
}
$("#binlog_list tbody").html(list);
$('#binlog_page').html(rdata.page);
$('#binlog_list .look').click(function(){
var i = $(this).data('index');
var file = rdata.data[i]['name'];
myBinRollingLogs('查看BINLOG','binLogListLook',{'file':file },100);
});
$('#binlog_list .look_decode').click(function(){
var i = $(this).data('index');
var file = rdata.data[i]['name'];
myBinRollingLogs('查看解码BINLOG','binLogListLookDecode',{'file':file },100);
});
});
}
function myBinLogs(){
var con = '<div class="safe bgw">\
<button class="btn btn-success btn-sm relay_trace" type="button" style="margin-right: 5px;">中继日志跟踪</button>\
<button class="btn btn-default btn-sm binlog_trace" type="button" style="margin-right: 5px;">最新BINLOG日志跟踪</button>\
<div id="binlog_list" class="divtable mtb10">\
<div class="tablescroll">\
<table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>文件名称</th>\
<th>大小</th>\
<th>时间</th>\
<th style="text-align:right;">操作</th>\
</tr></thead>\
<tbody></tbody></table>\
</div>\
<div id="binlog_page" class="dataTables_paginate paging_bootstrap page"></div>\
</div>\
</div>';
$(".soft-man-con").html(con);
myBinLogsRender(1);
$('.soft-man-con .relay_trace').click(function(){
myBinRollingLogs('中继日志跟踪','binLogListTraceRelay',{'file':''},100);
});
$('.soft-man-con .binlog_trace').click(function(){
myBinRollingLogs('最新BINLOG日志跟踪','binLogListTraceBinLog',{'file':''},100);
});
}
function myLogs(){ function myLogs(){
@@ -1603,6 +1815,14 @@ function setDbMasterAccess(username){
}); });
} }
function resetMaster(){
myPost('reset_master', '', function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
},{icon: rdata.status ? 1 : 2});
},'正在执行重置master命令[reset master]');
}
function getMasterRepSlaveList(){ function getMasterRepSlaveList(){
var _data = {}; var _data = {};
if (typeof(page) =='undefined'){ if (typeof(page) =='undefined'){
@@ -2329,11 +2549,16 @@ function masterOrSlaveConf(version=''){
<td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\ <td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\
</tr>"; </tr>";
var btn_list = ['复制错误',"取消"];
if (info['Last_IO_Error'].search(/1236/i)>0){
btn_list = ['复制错误',"取消","尝试修复"];
}
layer.open({ layer.open({
type: 1, type: 1,
title: '同步异常信息', title: '同步异常信息',
area: ['600px','300px'], area: ['600px','300px'],
btn:['复制错误',"取消"], btn:btn_list,
content:"<form class='bt-form pd15'>\ content:"<form class='bt-form pd15'>\
<div class='divtable mtb10'>\ <div class='divtable mtb10'>\
<div class='tablescroll'>\ <div class='tablescroll'>\
@@ -2348,10 +2573,20 @@ function masterOrSlaveConf(version=''){
</div>\ </div>\
</form>", </form>",
success:function(){ success:function(){
// copyText(v['Error']); if (info['Last_IO_Error'] != ''){
// $('.class-copy-db-err').click(function(){ copyText(info['Last_IO_Error']);
// copyText(v['Error']); return;
// }); }
if (info['Last_SQL_Error'] != ''){
copyText(info['Last_SQL_Error']);
return;
}
if (info['Slave_SQL_Running_State'] != ''){
copyText(info['Slave_SQL_Running_State']);
return;
}
}, },
yes:function(){ yes:function(){
if (info['Last_IO_Error'] != ''){ if (info['Last_IO_Error'] != ''){
@@ -2368,6 +2603,14 @@ function masterOrSlaveConf(version=''){
copyText(info['Slave_SQL_Running_State']); copyText(info['Slave_SQL_Running_State']);
return; return;
} }
},
btn3:function(){
myPost('try_slave_sync_bugfix', {}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg, function(){
masterOrSlaveConf();
},{ icon: rdata.status ? 1 : 5 },2000);
});
} }
}); });
}); });
@@ -2437,6 +2680,7 @@ function masterOrSlaveConf(version=''){
<p class="conf_p">\ <p class="conf_p">\
<span class="f14 c6 mr20">Master[主]配置</span><span class="f14 c6 mr20"></span>\ <span class="f14 c6 mr20">Master[主]配置</span><span class="f14 c6 mr20"></span>\
<button class="btn '+(!rdata.status ? 'btn-danger' : 'btn-success')+' btn-xs btn-master">'+(!rdata.status ? '未开启' : '已开启') +'</button>\ <button class="btn '+(!rdata.status ? 'btn-danger' : 'btn-success')+' btn-xs btn-master">'+(!rdata.status ? '未开启' : '已开启') +'</button>\
<button class="btn btn-success btn-xs" onclick="resetMaster()">重置</button>\
</p>\ </p>\
<hr/>\ <hr/>\
<!-- master list -->\ <!-- master list -->\
+1 -1
View File
@@ -14,7 +14,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=10.11.2 MY_VER=10.11.7
Install_app() Install_app()
{ {
+1 -1
View File
@@ -13,7 +13,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=10.6.12 MY_VER=10.6.17
Install_app() Install_app()
{ {
+1 -1
View File
@@ -14,7 +14,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=10.9.5 MY_VER=10.9.8
Install_app() Install_app()
{ {
+2 -2
View File
@@ -14,7 +14,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=11.0.3 MY_VER=11.0.5
Install_app() Install_app()
{ {
@@ -100,7 +100,7 @@ Install_app()
make -j${cpuCore} && make install && make clean make -j${cpuCore} && make install && make clean
if [ -d $serverPath/mariadb ];then if [ -d $serverPath/mariadb ];then
echo '10.11' > $serverPath/mariadb/version.pl echo '11.0' > $serverPath/mariadb/version.pl
echo '安装完成' echo '安装完成'
else else
echo '安装失败' echo '安装失败'
+2 -2
View File
@@ -14,7 +14,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=11.1.2 MY_VER=11.1.4
Install_app() Install_app()
{ {
@@ -100,7 +100,7 @@ Install_app()
make -j${cpuCore} && make install && make clean make -j${cpuCore} && make install && make clean
if [ -d $serverPath/mariadb ];then if [ -d $serverPath/mariadb ];then
echo '10.11' > $serverPath/mariadb/version.pl echo '11.1' > $serverPath/mariadb/version.pl
echo '安装完成' echo '安装完成'
else else
echo '安装失败' echo '安装失败'
+2 -2
View File
@@ -14,7 +14,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=11.2.1 MY_VER=11.2.3
Install_app() Install_app()
{ {
@@ -100,7 +100,7 @@ Install_app()
make -j${cpuCore} && make install && make clean make -j${cpuCore} && make install && make clean
if [ -d $serverPath/mariadb ];then if [ -d $serverPath/mariadb ];then
echo '10.11' > $serverPath/mariadb/version.pl echo '11.2' > $serverPath/mariadb/version.pl
echo '安装完成' echo '安装完成'
else else
echo '安装失败' echo '安装失败'
+2 -2
View File
@@ -14,7 +14,7 @@ sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
mariadbDir=${serverPath}/source/mariadb mariadbDir=${serverPath}/source/mariadb
MY_VER=11.3.0 MY_VER=11.3.2
Install_app() Install_app()
{ {
@@ -100,7 +100,7 @@ Install_app()
make -j${cpuCore} && make install && make clean make -j${cpuCore} && make install && make clean
if [ -d $serverPath/mariadb ];then if [ -d $serverPath/mariadb ];then
echo '10.11' > $serverPath/mariadb/version.pl echo '11.3' > $serverPath/mariadb/version.pl
echo '安装完成' echo '安装完成'
else else
echo '安装失败' echo '安装失败'
+18
View File
@@ -0,0 +1,18 @@
directoryperdb = true
dbpath = {$SERVER_PATH}/mongodb/data
logpath = {$SERVER_PATH}/mongodb/logs/mongodb.log
logappend = true
bind_ip = 127.0.0.1
port = 27017
fork = true
auth = false
#smallfiles = true
oplogSize=100
# Master/slave replication is no longer supported
#master = true
#replSet = test
pidfilepath = {$SERVER_PATH}/mongodb/mongodb.pid
+19 -12
View File
@@ -1,12 +1,19 @@
dbpath = {$SERVER_PATH}/mongodb/data net:
logpath = {$SERVER_PATH}/mongodb/logs/mongodb.log bindIp: 127.0.0.1
logappend = true port: 27017
bind_ip = 127.0.0.1 processManagement:
port = 27017 fork: true
fork = true pidFilePath: {$SERVER_PATH}/mongodb/mongodb.pid
auth = false security:
authorization: disabled
# Master/slave replication is no longer supported javascriptEnabled: false
#master = true storage:
dbPath: {$SERVER_PATH}/mongodb/data
pidfilepath = {$SERVER_PATH}/mongodb/mongodb.pid directoryPerDB: true
systemLog:
destination: file
logAppend: true
logRotate: reopen
path: {$SERVER_PATH}/mongodb/logs/mongodb.log
replication:
oplogSizeMB: 2048
+19
View File
@@ -0,0 +1,19 @@
CREATE TABLE IF NOT EXISTS `config` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`mg_root` TEXT
);
INSERT INTO `config` (`id`, `mg_root`) VALUES (1, 'mg_root');
CREATE TABLE IF NOT EXISTS `databases` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`username` TEXT,
`password` TEXT,
`accept` TEXT,
`rw` TEXT DEFAULT 'rw',
`ps` TEXT,
`addtime` TEXT
);
+65 -6
View File
@@ -1,23 +1,82 @@
<style>
.overflow_hide {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: inline-block;
vertical-align: middle;
}
.bingfa .bt-input-text {
width: 200px;
}
.inlineBlock {
display: inline-block;
}
.db_list{
padding: 0px 0 10px 0;
font-size: 13px;
line-height: 35px;
height: 45px;
}
.db_list a{
margin-right: 15px;
color: #555;
font-weight: 600;
}
.db_list span:nth-child(1){
display: block;
float: left;
padding-left: 15px;
background: #ececec;
border-radius: 3px;
}
#db_tools button {
margin-right: 10px;
}
#db_tools button:last-child{
margin-right: 0;
}
.conf_p span {
display: inline-block;
margin-right: 10px;
width: 115px;
text-align: right;
}
</style>
<div class="bt-form"> <div class="bt-form">
<div class="bt-w-main"> <div class="bt-w-main">
<div class="bt-w-menu"> <div class="bt-w-menu">
<p class="bgw" onclick="pluginService('mongodb');">服务</p> <p class="bgw" onclick="pluginService('mongodb');">服务</p>
<p onclick="pluginInitD('mongodb');">自启动</p> <p onclick="pluginInitD('mongodb');">自启动</p>
<p onclick="pluginConfig('mongodb');">配置修改</p> <p onclick="mongoSetConfig();">配置修改</p>
<p onclick="pluginConfig('mongodb');">配置文件</p>
<p onclick="pluginConfig('mongodb','','config_key');">配置[KEY]</p>
<p onclick="dbList();">数据列表</p>
<p onclick="mongoDocStatus();">文档状态</p>
<p onclick="mongoStatus();">负载状态</p> <p onclick="mongoStatus();">负载状态</p>
<p onclick="mongoReplStatus();">复制状态</p>
<p onclick="pluginLogs('mongodb','','run_log');">日志</p> <p onclick="pluginLogs('mongodb','','run_log');">日志</p>
</div> </div>
<div class="bt-w-con pd15"> <div class="bt-w-con pd15">
<div class="soft-man-con"></div> <div class="soft-man-con" style="height:455px;overflow: auto;"></div>
</div> </div>
</div> </div>
</div> </div>
<!-- <script type="text/javascript" src="/plugins/file?name=mongodb&f=js/mongodb.js"></script> -->
<script type="text/javascript"> <script type="text/javascript">
//mongodb start //mongodb start
var loading = layer.msg("资源加载中...", { icon: 16, time: 0, shade: 0.3 }); resetPluginWinHeight(530);
$.getScript( "/plugins/file?name=mongodb&f=js/mongodb.js", function(){ resetPluginWinWidth(800);
layer.close(loading); $.getScript('/plugins/file?name=mongodb&f=js/mongodb.js', function(){
pluginService('mongodb') pluginService('mongodb');
}); });
//mongodb end //mongodb end
</script> </script>
+1351 -21
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -1,8 +1,9 @@
{ {
"sort": 7, "sort": 7,
"ps": "一个高性能的NOSQL数据库", "hook":["database"],
"ps": "一个高性能的NOSQL数据库【社区版】",
"name": "mongodb", "name": "mongodb",
"title": "Mongodb", "title": "MongoDB",
"shell": "install.sh", "shell": "install.sh",
"install_pre_inspection":true, "install_pre_inspection":true,
"versions":["4.4","5.0","6.0","7.0"], "versions":["4.4","5.0","6.0","7.0"],
+4 -1
View File
@@ -4,7 +4,7 @@ export PATH
# https://www.mongodb.com/try/download/community # https://www.mongodb.com/try/download/community
# cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 5.0.4 # cd /Users/midoks/Desktop/mwdev/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 7.0
# cd /www/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 7.0 # cd /www/server/mdserver-web/plugins/mongodb && /bin/bash install.sh install 7.0
# cd /www/server/mdserver-web && python3 /www/server/mdserver-web/plugins/mongodb/index.py start # cd /www/server/mdserver-web && python3 /www/server/mdserver-web/plugins/mongodb/index.py start
@@ -31,6 +31,9 @@ if [ "macos" != "$OSNAME" ];then
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
fi fi
if [ -f ${rootPath}/bin/activate ];then
source ${rootPath}/bin/activate
fi
Install_app() Install_app()
{ {
echo '正在安装脚本文件...' > $install_tmp echo '正在安装脚本文件...' > $install_tmp
File diff suppressed because it is too large Load Diff
+234
View File
@@ -0,0 +1,234 @@
# coding: utf-8
#-----------------------------
# 网站备份工具
#-----------------------------
import sys
import os
import re
if sys.platform != 'darwin':
os.chdir('/www/server/mdserver-web')
chdir = os.getcwd()
sys.path.append(chdir + '/class/core')
# reload(sys)
# sys.setdefaultencoding('utf-8')
import mw
import db
import time
import yaml
def getPluginName():
return 'mongodb'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getConf():
path = getServerDir() + "/mongodb.conf"
return path
def getConfigData():
cfg = getConf()
config_data = mw.readFile(cfg)
try:
config = yaml.safe_load(config_data)
except:
config = {
"systemLog": {
"destination": "file",
"logAppend": True,
"path": mw.getServerDir()+"/mongodb/log/mongodb.log"
},
"storage": {
"dbPath": mw.getServerDir()+"/mongodb/data",
"directoryPerDB": True,
"journal": {
"enabled": True
}
},
"processManagement": {
"fork": True,
"pidFilePath": mw.getServerDir()+"/mongodb/log/mongodb.pid"
},
"net": {
"port": 27017,
"bindIp": "0.0.0.0"
},
"security": {
"authorization": "enabled",
"javascriptEnabled": False
}
}
return config
def getConfIp():
data = getConfigData()
return data['net']['bindIp']
def getConfPort():
data = getConfigData()
return data['net']['port']
def getConfAuth():
data = getConfigData()
return data['security']['authorization']
def pSqliteDb(dbname='users'):
file = getServerDir() + '/mongodb.db'
name = 'mongodb'
sql_file = getPluginDir() + '/config/mongodb.sql'
import_sql = mw.readFile(sql_file)
# print(sql_file,import_sql)
md5_sql = mw.md5(import_sql)
import_sign = False
save_md5_file = getServerDir() + '/import_mongodb.md5'
if os.path.exists(save_md5_file):
save_md5_sql = mw.readFile(save_md5_file)
if save_md5_sql != md5_sql:
import_sign = True
mw.writeFile(save_md5_file, md5_sql)
else:
mw.writeFile(save_md5_file, md5_sql)
if not os.path.exists(file) or import_sql:
conn = mw.M(dbname).dbPos(getServerDir(), name)
csql_list = import_sql.split(';')
for index in range(len(csql_list)):
conn.execute(csql_list[index], ())
conn = mw.M(dbname).dbPos(getServerDir(), name)
return conn
def mongdbClient():
import pymongo
port = getConfPort()
auth = getConfAuth()
ip = getConfIp()
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
# print(ip,port,auth,mg_root)
if auth == 'disabled':
client = pymongo.MongoClient(host=ip, port=int(port), directConnection=True)
else:
# uri = "mongodb://root:"+mg_root+"@127.0.0.1:"+str(port)
# client = pymongo.MongoClient(uri)
client = pymongo.MongoClient(host=ip, port=int(port), directConnection=True, username='root',password=mg_root)
return client
class backupTools:
def getDbBackupList(self,dbname=''):
bkDir = mw.getRootDir() + '/backup/database'
blist = os.listdir(bkDir)
r = []
bname = 'mongodb_' + dbname
blen = len(bname)
for x in blist:
fbstr = x[0:blen]
if fbstr == bname:
r.append(x)
return r
def backupDatabase(self, name, count):
db_path = mw.getServerDir() + '/mongodb'
db_name = 'mongodb'
name = mw.M('databases').dbPos(db_path, db_name).where('name=?', (name,)).getField('name')
startTime = time.time()
if not name:
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
log = "数据库[" + name + "]不存在!"
print("★[" + endDate + "] " + log)
print(
"----------------------------------------------------------------------------")
return
backup_path = mw.getBackupDir() + '/database'
if not os.path.exists(backup_path):
mw.execShell("mkdir -p " + backup_path)
time_now = time.strftime('%Y%m%d_%H%M%S', time.localtime())
backup_name = "mongodb_" + name + "_" + time_now + ".tar.gz"
filename = backup_path + "/"+backup_name
port = getConfPort()
auth = getConfAuth()
mg_root = pSqliteDb('config').where('id=?', (1,)).getField('mg_root')
uoption = ''
if auth != 'disabled':
uoption =' --authenticationDatabase admin -u root -p '+mg_root
cmd = db_path + "/bin/mongodump "+uoption+" --port "+str(port)+" -d test -o "+backup_path
# print(cmd)
mw.execShell(cmd)
cmd_gz = "cd "+backup_path+"/"+name+" && tar -zcvf "+filename + " ./"
mw.execShell(cmd_gz)
mw.execShell("rm -rf "+ backup_path+"/"+name)
if not os.path.exists(filename):
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
log = "数据库[" + name + "]备份失败!"
print("★[" + endDate + "] " + log)
print("----------------------------------------------------------------------------")
return
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
outTime = time.time() - startTime
# print(outTime)
log = "数据库MongoDB[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒"
mw.writeLog('计划任务', log)
print("★[" + endDate + "] " + log)
print("|---保留最新的[" + count + "]份备份")
print("|---文件名:" + filename)
backups = self.getDbBackupList(name)
# 清理多余备份
num = len(backups) - int(count)
if num > 0:
for backup in backups:
mw.execShell("rm -f " + backup_path + "/"+backup)
num -= 1
print("|---已清理过期备份文件:" + backup)
if num < 1:
break
def backupDatabaseAll(self, save):
db_path = mw.getServerDir() + '/mongodb'
db_name = 'mongodb'
databases = mw.M('databases').dbPos(
db_path, db_name).field('name').select()
for db in databases:
self.backupDatabase(db['name'], save)
def findPathName(self, path, filename):
f = os.scandir(path)
l = []
for ff in f:
if ff.name.find(filename) > -1:
l.append(ff.name)
return l
if __name__ == "__main__":
backup = backupTools()
stype = sys.argv[1]
if stype == 'all':
backup.backupDatabaseAll(sys.argv[2])
if stype == 'database':
backup.backupDatabase(sys.argv[2], sys.argv[3])
+42
View File
@@ -67,3 +67,45 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-aarch64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -44,3 +44,46 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+48
View File
@@ -27,3 +27,51 @@ if [ ! -d $serverPath/mongodb/bin ];then
mkdir -p $serverPath/mongodb mkdir -p $serverPath/mongodb
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
fi fi
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb-database-tools ------------------ #
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-arm64-100.9.4.zip
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-macos-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+44
View File
@@ -47,3 +47,47 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-suse12-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+19
View File
@@ -43,3 +43,22 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -45,3 +45,46 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+42
View File
@@ -54,3 +54,45 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-aarch64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+42
View File
@@ -44,3 +44,45 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+48
View File
@@ -27,3 +27,51 @@ if [ ! -d $serverPath/mongodb/bin ];then
mkdir -p $serverPath/mongodb mkdir -p $serverPath/mongodb
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
fi fi
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb-database-tools ------------------ #
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-arm64-100.9.4.zip
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-macos-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -47,3 +47,46 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-suse12-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -46,3 +46,46 @@ fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+44
View File
@@ -60,3 +60,47 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
rm -rf ${MG_DIR}/${FILE_NAME} rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-aarch64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -45,3 +45,46 @@ fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+48
View File
@@ -27,3 +27,51 @@ if [ ! -d $serverPath/mongodb/bin ];then
mkdir -p $serverPath/mongodb mkdir -p $serverPath/mongodb
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
fi fi
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb-database-tools ------------------ #
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-arm64-100.9.4.zip
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-macos-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -48,3 +48,46 @@ fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-suse12-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+43
View File
@@ -45,3 +45,46 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+46 -1
View File
@@ -9,7 +9,7 @@ rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath") serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=7.0.0 VERSION=7.0.9
SYS_ARCH=`arch` SYS_ARCH=`arch`
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
@@ -61,3 +61,48 @@ fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel90-aarch64-100.9.4.tgz
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel90-x86_64-100.9.4.tgz
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel83-s390x-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-aarch64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-rhel${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+45 -1
View File
@@ -9,7 +9,7 @@ rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath") serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=7.0.0 VERSION=7.0.9
SYS_ARCH=`arch` SYS_ARCH=`arch`
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
SYS_NAME=${SYS_VERSION_ID/./} SYS_NAME=${SYS_VERSION_ID/./}
@@ -45,3 +45,47 @@ fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-debian${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+53 -1
View File
@@ -7,9 +7,10 @@ rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath") rootPath=$(dirname "$rootPath")
rootPath=$(dirname "$rootPath") rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath") serverPath=$(dirname "$rootPath")
SYS_ARCH=`arch`
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=7.0.0 VERSION=7.0.9
MG_DIR=$serverPath/source/mongodb MG_DIR=$serverPath/source/mongodb
mkdir -p $MG_DIR mkdir -p $MG_DIR
@@ -27,3 +28,54 @@ if [ ! -d $serverPath/mongodb/bin ];then
mkdir -p $serverPath/mongodb mkdir -p $serverPath/mongodb
cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb cd $MG_DIR/mongodb-macos-x86_64-${VERSION} && cp -rf ./bin $serverPath/mongodb
fi fi
# https://downloads.mongodb.com/compass/mongosh-2.2.5-darwin-x64.zip
# https://downloads.mongodb.com/compass/mongosh-2.2.5-darwin-arm64.zip
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-darwin-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-arm64-100.9.4.zip
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-macos-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-macos-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.zip
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && unzip ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+47 -1
View File
@@ -9,7 +9,7 @@ rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath") serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=7.0.0 VERSION=7.0.9
SYS_ARCH=`arch` SYS_ARCH=`arch`
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}' | awk -F . '{print $1}'` SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}' | awk -F . '{print $1}'`
@@ -47,3 +47,49 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-suse12-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-suse${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+45 -1
View File
@@ -9,7 +9,7 @@ rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath") serverPath=$(dirname "$rootPath")
install_tmp=${rootPath}/tmp/mw_install.pl install_tmp=${rootPath}/tmp/mw_install.pl
VERSION=7.0.0 VERSION=7.0.9
SYS_ARCH=`arch` SYS_ARCH=`arch`
SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` SYS_VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
@@ -45,3 +45,47 @@ if [ ! -d $serverPath/mongodb/bin ];then
fi fi
cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME} cd ${MG_DIR} && rm -rf ${MG_DIR}/${FILE_NAME}
#--------------- mongosh tool install ------------------ #
TOOL_VERSION=2.2.5
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-x64
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongosh-${TOOL_VERSION}-linux-arm64
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}
echo "wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://downloads.mongodb.com/compass/${TOOL_FILE_NAME_TGZ}"
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
# https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-x86_64-100.9.4.tgz
#--------------- mongodb database install ------------------ #
TOOL_VERSION=100.9.4
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-x86_64-${TOOL_VERSION}
if [ "aarch64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
if [ "arm64" == ${SYS_ARCH} ];then
TOOL_FILE_NAME=mongodb-database-tools-ubuntu${SYS_NAME}-arm64-${TOOL_VERSION}
fi
TOOL_FILE_NAME_TGZ=${TOOL_FILE_NAME}.tgz
if [ ! -f $MG_DIR/${TOOL_FILE_NAME_TGZ} ]; then
wget --no-check-certificate -O $MG_DIR/${TOOL_FILE_NAME_TGZ} https://fastdl.mongodb.org/tools/db/${TOOL_FILE_NAME_TGZ}
fi
if [ ! -d $MG_DIR/${TOOL_FILE_NAME_TGZ} ];then
cd $MG_DIR && tar -zxvf ${TOOL_FILE_NAME_TGZ}
fi
cd ${MG_DIR}/${TOOL_FILE_NAME} && cp -rf ./bin $serverPath/mongodb
cd ${MG_DIR} && rm -rf ${MG_DIR}/${TOOL_FILE_NAME}
+108
View File
@@ -0,0 +1,108 @@
[client]
user = root
#password = your_password
port = 33206
socket = {$SERVER_APP_PATH}/mysql.sock
default-character-set = UTF8MB4
[mysqld]
!include {$SERVER_APP_PATH}/etc/mode/classic.cnf
authentication_policy=mysql_native_password
pid-file = {$SERVER_APP_PATH}/data/mysql.pid
user = mysql
port = 33206
mysqlx_port = 33260
socket = {$SERVER_APP_PATH}/mysql.sock
datadir = {$SERVER_APP_PATH}/data
log-error = {$SERVER_APP_PATH}/data/error.log
server-id = {$SERVER_ID}
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default_storage_engine = InnoDB
key_buffer_size = 8M
table_open_cache = 32
sort_buffer_size = 256K
net_buffer_length = 4K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 4M
thread_cache_size = 4
lower_case_table_names=1
tmp_table_size = 8M
character-set-server = UTF8MB4
max_connections = 500
max_connect_errors = 100
open_files_limit = 2560
max_allowed_packet = 128M
#skip-external-locking
#skip-grant-tables
#loose-skip-innodb
#skip-networking
#skip-name-resolve
log-bin=mysql-bin
binlog_format=mixed
slow_query_log=1
slow-query-log-file={$SERVER_APP_PATH}/data/mysql-slow.log
long_query_time=3
#log_queries_not_using_indexes=on
relay-log=mdserver
relay-log-index=mdserver
#master
#sync_binlog=1
#binlog-do-db
binlog-ignore-db = test
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
#slave
log_replica_updates
#replicate-do-db
slave_skip_errors=1062,1396
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = mysql
replicate-ignore-db = test
master_info_repository = table
relay_log_info_repository = table
default_storage_engine = InnoDB
innodb_data_home_dir = {$SERVER_APP_PATH}/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = {$SERVER_APP_PATH}/data
innodb_buffer_pool_size = 16M
innodb_redo_log_capacity=10485760
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 120
innodb_max_dirty_pages_pct = 90
innodb_read_io_threads = 1
innodb_write_io_threads = 1
innodb_file_per_table=1
binlog_expire_logs_seconds=2592000
secure-file-priv={$SERVER_APP_PATH}/tmp
[mysqldump]
quick
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
+1
View File
@@ -12,6 +12,7 @@
<p onclick="myPerfOpt();">性能优化</p> <p onclick="myPerfOpt();">性能优化</p>
<p onclick="myLogs();">日志</p> <p onclick="myLogs();">日志</p>
<p onclick="pluginLogs('mysql-apt',$('.plugin_version').attr('version'),'show_log');">慢日志</p> <p onclick="pluginLogs('mysql-apt',$('.plugin_version').attr('version'),'show_log');">慢日志</p>
<p onclick="myBinLogs();">BINLOG</p>
<p onclick="dbList()">管理列表</p> <p onclick="dbList()">管理列表</p>
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p> <p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p>
</div> </div>
+217 -3
View File
@@ -114,6 +114,15 @@ def getErrorLogsFile():
tmp = re.search(rep, content) tmp = re.search(rep, content)
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def getAuthPolicy():
file = getConf()
content = mw.readFile(file)
rep = 'authentication_policy\s*=\s*(.*)'
tmp = re.search(rep, content)
if tmp:
return tmp.groups()[0].strip()
# caching_sha2_password
return 'mysql_native_password'
def contentReplace(content): def contentReplace(content):
service_path = mw.getServerDir() service_path = mw.getServerDir()
@@ -242,6 +251,12 @@ def getDataDir():
tmp = re.search(rep, content) tmp = re.search(rep, content)
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def getLogBinName():
file = getConf()
content = mw.readFile(file)
rep = 'log-bin\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getPidFile(): def getPidFile():
file = getConf() file = getConf()
@@ -297,6 +312,58 @@ def setSkipGrantTables(v):
mw.writeFile(conf, con) mw.writeFile(conf, con)
return True return True
def binLogList():
args = getArgs()
data = checkArgs(args, ['page', 'page_size', 'tojs'])
if not data[0]:
return data[1]
page = int(args['page'])
page_size = int(args['page_size'])
data_dir = getDataDir()
log_bin_name = getLogBinName()
alist = os.listdir(data_dir)
log_bin_l = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(log_bin_name) and not f.endswith('.index'):
abspath = data_dir + '/' + f
t['name'] = f
t['size'] = os.path.getsize(abspath)
t['time'] = mw.getDataFromInt(os.path.getctime(abspath))
log_bin_l.append(t)
log_bin_l = sorted(log_bin_l, key=lambda x: x['time'], reverse=True)
# print(log_bin_l)
# print(data_dir, log_bin_name)
count = len(log_bin_l)
page_start = (page - 1) * page_size
page_end = page_start + page_size
if page_end > count:
page_end = count
data = {}
page_args = {}
page_args['count'] = count
page_args['p'] = page
page_args['row'] = page_size
page_args['tojs'] = args['tojs']
data['page'] = mw.getPage(page_args)
data['data'] = log_bin_l[page_start:page_end]
return mw.getJson(data)
def cleanBinLog():
db = pMysqlDb()
cleanTime = time.strftime('%Y-%m-%d %H:%i:%s', time.localtime())
db.execute("PURGE MASTER LOGS BEFORE '" + cleanTime + "';")
return mw.returnJson(True, '清理BINLOG成功!')
def getErrorLog(): def getErrorLog():
args = getArgs() args = getArgs()
@@ -1061,12 +1128,20 @@ def setRootPwd(version=''):
if not data[0]: if not data[0]:
return data[1] return data[1]
#强制修改
force = 0
if 'force' in args and args['force'] == '1':
force = 1
password = args['password'] password = args['password']
try: try:
pdb = pMysqlDb() pdb = pMysqlDb()
result = pdb.query("show databases") result = pdb.query("show databases")
isError = isSqlError(result) isError = isSqlError(result)
if isError != None: if isError != None:
if force == 1:
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '【强制修改】数据库root密码修改成功(不意为成功连接数据)!')
return isError return isError
if version.find('5.7') > -1 or version.find('8.0') > -1: if version.find('5.7') > -1 or version.find('8.0') > -1:
@@ -1081,11 +1156,14 @@ def setRootPwd(version=''):
"update mysql.user set Password=password('" + password + "') where User='root'") "update mysql.user set Password=password('" + password + "') where User='root'")
pdb.execute("flush privileges") pdb.execute("flush privileges")
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '数据库root密码修改成功!')
msg = ''
if force == 1:
msg = ',无须强制!'
return mw.returnJson(True, '数据库root密码修改成功!'+msg)
except Exception as ex: except Exception as ex:
return mw.returnJson(False, '修改错误:' + str(ex)) return mw.returnJson(False, '修改错误:' + str(ex))
def setUserPwd(version=''): def setUserPwd(version=''):
args = getArgs() args = getArgs()
data = checkArgs(args, ['password', 'name']) data = checkArgs(args, ['password', 'name'])
@@ -1291,7 +1369,58 @@ def setDbAccess():
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def fixDbAccess(version):
def openSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('#skip-grant-tables','skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def closeSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('skip-grant-tables','#skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def resetDbRootPwd(version):
serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf"
pwd = mw.getRandomString(16)
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
if float(version) < 5.7:
cmd_pass = serverdir + '/bin/usr/bin/mysql --defaults-file=' + myconf + ' -uroot -e'
cmd_pass = cmd_pass + '"UPDATE mysql.user SET password=PASSWORD(\'' + pwd + "') WHERE user='root';"
cmd_pass = cmd_pass + 'flush privileges;"'
data = mw.execShell(cmd_pass)
# print(data)
else:
auth_policy = getAuthPolicy()
reset_pwd = 'flush privileges;'
reset_pwd = reset_pwd + \
"UPDATE mysql.user SET authentication_string='' WHERE user='root';"
reset_pwd = reset_pwd + "flush privileges;"
reset_pwd = reset_pwd + \
"alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
reset_pwd = reset_pwd + \
"alter user 'root'@'localhost' IDENTIFIED WITH "+auth_policy+" by '" + pwd + "';"
reset_pwd = reset_pwd + "flush privileges;"
tmp_file = "/tmp/mysql_init_tmp.log"
mw.writeFile(tmp_file, reset_pwd)
cmd_pass = serverdir + '/bin/usr/bin/mysql --defaults-file=' + myconf + ' -uroot -proot < ' + tmp_file
data = mw.execShell(cmd_pass)
# print(data)
os.remove(tmp_file)
return True
def fixDbAccess2(version):
try: try:
pdb = pMysqlDb() pdb = pMysqlDb()
data = pdb.query('show databases') data = pdb.query('show databases')
@@ -1305,6 +1434,35 @@ def fixDbAccess(version):
except Exception as e: except Exception as e:
return mw.returnJson(False, '修复失败请重试!') return mw.returnJson(False, '修复失败请重试!')
def fixDbAccess(version):
pdb = pMysqlDb()
mdb_ddir = getDataDir()
if not os.path.exists(mdb_ddir):
return mw.returnJson(False, '数据目录不存在,尝试重启重建!')
try:
data = pdb.query('show databases')
isError = isSqlError(data)
if isError != None:
# 重置密码
appCMD(version, 'stop')
openSkipGrantTables()
appCMD(version, 'start')
time.sleep(3)
resetDbRootPwd(version)
appCMD(version, 'stop')
closeSkipGrantTables()
appCMD(version, 'start')
return mw.returnJson(True, '修复成功!')
return mw.returnJson(True, '正常无需修复!')
except Exception as e:
return mw.returnJson(False, '修复失败请重试!')
def setDbRw(version=''): def setDbRw(version=''):
args = getArgs() args = getArgs()
@@ -2217,6 +2375,56 @@ def getSlaveList(version=''):
data['data'] = dlist data['data'] = dlist
return mw.getJson(data) return mw.getJson(data)
def trySlaveSyncBugfix(version=''):
if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', [])
mode_file = getSyncModeFile()
if not os.path.exists(mode_file):
return mw.returnJson(False, '需要先设置同步配置')
mode = mw.readFile(mode_file)
if mode != 'sync-user':
return mw.returnJson(False, '仅支持【同步账户】模式')
conn = pSqliteDb('slave_sync_user')
slave_sync_data = conn.field('ip,port,user,pass,mode,cmd').select()
if len(slave_sync_data) < 1:
return mw.returnJson(False, '需要先添加【同步用户】配置!')
# print(slave_sync_data)
# 本地从库
sdb = pMysqlDb()
gtid_purged = ''
for i in range(len(slave_sync_data)):
port = slave_sync_data[i]['port']
password = slave_sync_data[i]['pass']
host = slave_sync_data[i]['ip']
user = slave_sync_data[i]['user']
# print(port, password, host)
mdb = mw.getMyORM()
mdb.setHost(host)
mdb.setPort(port)
mdb.setUser(user)
mdb.setPwd(password)
mdb.setSocket('')
var_gtid = mdb.query('show VARIABLES like "%gtid_purged%"')
if len(var_gtid) > 0:
gtid_purged += var_gtid[0]['Value'] + ','
gtid_purged = gtid_purged.strip(',')
sql = "set @@global.gtid_purged='" + gtid_purged + "'"
sdb.query('stop slave')
# print(sql)
sdb.query(sql)
sdb.query('start slave')
return mw.returnJson(True, '修复成功!')
def getSlaveSyncCmd(version=''): def getSlaveSyncCmd(version=''):
@@ -2802,6 +3010,8 @@ if __name__ == "__main__":
print(getConf()) print(getConf())
elif func == 'bin_log': elif func == 'bin_log':
print(binLog()) print(binLog())
elif func == 'binlog_list':
print(binLogList())
elif func == 'clean_bin_log': elif func == 'clean_bin_log':
print(cleanBinLog()) print(cleanBinLog())
elif func == 'error_log': elif func == 'error_log':
@@ -2852,6 +3062,8 @@ if __name__ == "__main__":
print(setDbAccess()) print(setDbAccess())
elif func == 'fix_db_access': elif func == 'fix_db_access':
print(fixDbAccess(version)) print(fixDbAccess(version))
elif func == 'fix_db_access2':
print(fixDbAccess2(version))
elif func == 'set_db_rw': elif func == 'set_db_rw':
print(setDbRw(version)) print(setDbRw(version))
elif func == 'set_db_ps': elif func == 'set_db_ps':
@@ -2896,6 +3108,8 @@ if __name__ == "__main__":
print(getMasterRepSlaveUserCmd(version)) print(getMasterRepSlaveUserCmd(version))
elif func == 'get_slave_list': elif func == 'get_slave_list':
print(getSlaveList(version)) print(getSlaveList(version))
elif func == 'try_slave_sync_bugfix':
print(trySlaveSyncBugfix(version))
elif func == 'get_slave_sync_cmd': elif func == 'get_slave_sync_cmd':
print(getSlaveSyncCmd(version)) print(getSlaveSyncCmd(version))
elif func == 'get_slave_ssh_list': elif func == 'get_slave_ssh_list':
+186
View File
@@ -0,0 +1,186 @@
# coding:utf-8
import sys
import io
import os
import time
import subprocess
import re
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
if mw.isAppleSystem():
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)
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'mysql-apt'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getSPluginDir():
return '/www/server/mdserver-web/plugins/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getConf():
path = getServerDir() + '/etc/my.cnf'
return path
def getDataDir():
file = getConf()
content = mw.readFile(file)
rep = 'datadir\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getRelayLogName():
file = getConf()
content = mw.readFile(file)
rep = 'relay-log\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getLogBinName():
file = getConf()
content = mw.readFile(file)
rep = 'log-bin\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def binLogListLook(args):
file = args['file']
line = args['line']
data_dir = getDataDir()
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata = {}
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListLookDecode(args):
file = args['file']
line = args['line']
data_dir = getDataDir()
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata = {}
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListTraceRelay(args):
rdata = {}
file = args['file']
line = args['line']
relay_name = getRelayLogName()
data_dir = getDataDir()
alist = os.listdir(data_dir)
relay_list = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(relay_name) and not f.endswith('.index'):
relay_list.append(f)
relay_list = sorted(relay_list, reverse=True)
if len(relay_list) == 0:
rdata['cmd'] = ''
rdata['data'] = '无Relay日志'
return rdata
file = relay_list[0]
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListTraceBinLog(args):
rdata = {}
file = args['file']
line = args['line']
data_dir = getDataDir()
log_bin_name = getLogBinName()
alist = os.listdir(data_dir)
log_bin_l = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(log_bin_name) and not f.endswith('.index'):
log_bin_l.append(f)
if len(log_bin_l) == 0:
rdata['cmd'] = ''
rdata['data'] = '无BINLOG'
return rdata
log_bin_l = sorted(log_bin_l, reverse=True)
file = log_bin_l[0]
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
+1 -1
View File
@@ -6,7 +6,7 @@
"type":"运行环境", "type":"运行环境",
"ps":"一种关系数据库管理系统[debian,ubuntu](极速安装)", "ps":"一种关系数据库管理系统[debian,ubuntu](极速安装)",
"todo_versions":["5.7","8.0"], "todo_versions":["5.7","8.0"],
"versions":["5.7","8.0"], "versions":["5.7","8.0","8.2"],
"shell":"install.sh", "shell":"install.sh",
"install_pre_inspection":true, "install_pre_inspection":true,
"checks":"server/mysql-apt", "checks":"server/mysql-apt",
+294 -64
View File
@@ -59,6 +59,62 @@ function myAsyncPost(method,args){
return syncPost('/plugins/run', {name:'mysql-apt', func:method, args:_args}); return syncPost('/plugins/run', {name:'mysql-apt', func:method, args:_args});
} }
function myPostCallbak(method, version, args,callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
var req_data = {};
req_data['name'] = 'mysql';
req_data['func'] = method;
req_data['script']='index_mysql_apt';
args['version'] = version;
if (typeof(args) == 'string' && args == ''){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/callback', req_data, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function myPostCallbakN(method, version, args,callback){
var req_data = {};
req_data['name'] = 'mysql';
req_data['func'] = method;
req_data['script']='index_mysql_apt';
args['version'] = version;
if (typeof(args) == 'string' && args == ''){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/callback', req_data, function(data) {
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function vaildPhpmyadmin(url,username,password){ function vaildPhpmyadmin(url,username,password){
// console.log("Authorization: Basic " + btoa(username + ":" + password)); // console.log("Authorization: Basic " + btoa(username + ":" + password));
$.ajax({ $.ajax({
@@ -439,7 +495,6 @@ function setRootPwd(type, pwd){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){ showMsg(rdata.msg,function(){
dbList(); dbList();
$('.layui-layer-close1').click();
},{icon: rdata.status ? 1 : 2}); },{icon: rdata.status ? 1 : 2});
}); });
return; return;
@@ -451,7 +506,7 @@ function setRootPwd(type, pwd){
title: '修改数据库密码', title: '修改数据库密码',
closeBtn: 1, closeBtn: 1,
shift: 5, shift: 5,
btn:["提交","关闭"], btn:["提交", "关闭", "复制ROOT密码", "强制修改"],
shadeClose: true, shadeClose: true,
content: "<form class='bt-form pd20' id='mod_pwd'>\ content: "<form class='bt-form pd20' id='mod_pwd'>\
<div class='line'>\ <div class='line'>\
@@ -461,8 +516,36 @@ function setRootPwd(type, pwd){
</div>\ </div>\
</div>\ </div>\
</form>", </form>",
yes:function(){ yes:function(layerIndex){
setRootPwd(1); var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
},
btn3:function(){
var password = $("#MyPassword").val();
copyText(password);
return false;
},
btn4:function(layerIndex){
layer.confirm('强制修改,是为了在重建时使用,确定强制?', {
btn: ['确定', '取消']
}, function(index, layero){
layer.close(index);
var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password,force:'1'}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
});
return false;
} }
}); });
} }
@@ -773,68 +856,53 @@ function setDbPs(id, name, obj) {
} }
function openPhpmyadmin(name,username,password){ function openPhpmyadmin(name,username,password){
$.post('/plugins/run', {'name':'phpmyadmin','func':'plugins_db_support'}, function(data){
var rdata = $.parseJSON(data.data);
data = syncPost('/plugins/check',{'name':'phpmyadmin'}); if (rdata.data['installed'] != 'ok'){
layer.msg('phpMyAdmin未安装!',{icon:2,shade: [0.3, '#000']});
return;
}
if (rdata.data['status'] != 'start'){
layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']});
return;
}
if (!data.status){ if (rdata.data['cfg']['choose'] != 'mysql-apt'){
layer.msg(data.msg,{icon:2,shade: [0.3, '#000']}); layer.msg('当前为['+rdata.choose+']模式,若要使用请修改phpMyAdmin访问切换.',{icon:2,shade: [0.3, '#000']});
return; return;
} }
var home_page = rdata.data['home_page'];
$("#toPHPMyAdmin").attr('action',home_page);
if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){
layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']});
setTimeout(function(){ window.location.href = '/soft'; },3000);
return;
}
//检查版本
bigVer = rdata.data['version'];
if (bigVer>=4.5){
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'status'}); setTimeout(function(){
if (data.data != 'start'){ $("#toPHPMyAdmin").submit();
layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']}); },2000);
return; layer.msg('phpMyAdmin['+data.data+']需要手动登录😭',{icon:16,shade: [0.3, '#000'],time:4000});
}
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_cfg'}); } else{
var rdata = $.parseJSON(data.data); var murl = $("#toPHPMyAdmin").attr('action');
if (rdata.choose != 'mysql-apt'){ $("#pma_username").val(username);
layer.msg('当前为['+rdata.choose+']模式,若要使用请修改phpMyAdmin访问切换.',{icon:2,shade: [0.3, '#000']}); $("#pma_password").val(password);
return; $("#db").val(name);
}
var phpmyadmin_cfg = rdata; layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:2000});
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_home_page'});
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']});
return;
}
var home_page = rdata.data;
home_page = home_page.replace("http://","http://"+phpmyadmin_cfg['username']+":"+phpmyadmin_cfg['password']+"@") setTimeout(function(){
$("#toPHPMyAdmin").submit();
},2000);
}
$("#toPHPMyAdmin").attr('action',home_page); },'json');
if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){
layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']});
setTimeout(function(){ window.location.href = '/soft'; },3000);
return;
}
//检查版本
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'version'});
bigVer = data.data.split('.')[0];
if (bigVer>=4.5){
setTimeout(function(){
$("#toPHPMyAdmin").submit();
},3000);
layer.msg('phpMyAdmin['+data.data+']需要手动登录😭',{icon:16,shade: [0.3, '#000'],time:4000});
} else{
var murl = $("#toPHPMyAdmin").attr('action');
$("#pma_username").val(username);
$("#pma_password").val(password);
$("#db").val(name);
layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:2000});
setTimeout(function(){
$("#toPHPMyAdmin").submit();
},3000);
}
} }
function delBackup(filename, name, path){ function delBackup(filename, name, path){
@@ -1083,7 +1151,7 @@ function dbList(page, search){
list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>'; list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>';
list += '<td style="text-align:right">'; list += '<td style="text-align:right">';
list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | '; list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'已备份':'未备份') +'</a> | ';
var rw = ''; var rw = '';
var rw_change = 'all'; var rw_change = 'all';
@@ -1162,6 +1230,146 @@ function dbList(page, search){
}); });
} }
function myBinRollingLogs(_name, func, _args, line){
var file_line = 100;
if ( typeof(line) != 'undefined' ){
file_line = line;
}
var reqTimer = null;
function requestLogs(func,file,line){
myPostCallbakN(func,'',{'file':file,"line":line}, function(rdata){
var data = rdata.data.data;
var cmd = rdata.data.cmd;
if(data == '') {
data = '当前没有日志!';
}
$('#my_rolling_cmd').html(cmd);
$('#my_rolling_copy').click(function(){
copyText(cmd);
});
var ebody = '<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log">'+data+'</textarea>';
$("#my_rolling_logs").html(ebody);
var ob = document.getElementById('roll_info_log');
ob.scrollTop = ob.scrollHeight;
});
}
layer.open({
type: 1,
title: _name + '日志',
area: ['800px','700px'],
end: function(){
if (reqTimer){
clearInterval(reqTimer);
}
},
content:'<div class="change-default" style="padding:0px 20px 0px;">\
<div class="divtable mtb10">\
<table class="table table-hover"><tr>\
<td id="my_rolling_cmd">cmd</td>\
<td id="my_rolling_copy" style="width:35px;"><span class="ico-copy cursor btcopy" title="复制密码"></span></td>\
<tr>\
</table>\
</div>\
</div>\
<div class="change-default" style="padding:0px 20px 0px;" id="my_rolling_logs">\
<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log"></textarea>\
</div>',
success:function(){
var fileName = _args['file'];
requestLogs(func,fileName,file_line);
reqTimer = setInterval(function(){
requestLogs(func,fileName,file_line);
},1000);
}
});
}
function myBinLogsRender(page){
var _data = {};
if (typeof(page) =='undefined'){
var page = 1;
}
_data['page'] = page;
_data['page_size'] = 10;
_data['tojs'] = 'myBinLogsRender';
myPost('binlog_list', _data, function(data){
var rdata = $.parseJSON(data.data);
// console.log(rdata);
var list = '';
for(i in rdata.data){
list += '<tr>';
list += '<td>' + rdata.data[i]['name'] +'</td>';
list += '<td>' + toSize(rdata.data[i]['size'])+'</td>';
list += '<td>' + rdata.data[i]['time'] +'</td>';
list += '<td style="text-align:right">';
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look" class="btlink">查看</a> | ';
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look_decode" class="btlink">解码查看</a>';
list += '</td></tr>';
}
if (rdata.data.length ==0){
list = '<tr><td colspan="4">无数据</td</tr>';
}
$("#binlog_list tbody").html(list);
$('#binlog_page').html(rdata.page);
$('#binlog_list .look').click(function(){
var i = $(this).data('index');
var file = rdata.data[i]['name'];
myBinRollingLogs('查看BINLOG','binLogListLook',{'file':file },100);
});
$('#binlog_list .look_decode').click(function(){
var i = $(this).data('index');
var file = rdata.data[i]['name'];
myBinRollingLogs('查看解码BINLOG','binLogListLookDecode',{'file':file },100);
});
});
}
function myBinLogs(){
var con = '<div class="safe bgw">\
<button class="btn btn-success btn-sm relay_trace" type="button" style="margin-right: 5px;">中继日志跟踪</button>\
<button class="btn btn-default btn-sm binlog_trace" type="button" style="margin-right: 5px;">最新BINLOG日志跟踪</button>\
<div id="binlog_list" class="divtable mtb10">\
<div class="tablescroll">\
<table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>文件名称</th>\
<th>大小</th>\
<th>时间</th>\
<th style="text-align:right;">操作</th>\
</tr></thead>\
<tbody></tbody></table>\
</div>\
<div id="binlog_page" class="dataTables_paginate paging_bootstrap page"></div>\
</div>\
</div>';
$(".soft-man-con").html(con);
myBinLogsRender(1);
$('.soft-man-con .relay_trace').click(function(){
myBinRollingLogs('中继日志跟踪','binLogListTraceRelay',{'file':''},100);
});
$('.soft-man-con .binlog_trace').click(function(){
myBinRollingLogs('最新BINLOG日志跟踪','binLogListTraceBinLog',{'file':''},100);
});
}
function myLogs(){ function myLogs(){
@@ -2345,11 +2553,15 @@ function masterOrSlaveConf(version=''){
<td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\ <td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\
</tr>"; </tr>";
var btn_list = ['复制错误',"取消"];
if (info['Last_IO_Error'].search(/1236/i)>0){
btn_list = ['复制错误',"取消","尝试修复"];
}
layer.open({ layer.open({
type: 1, type: 1,
title: '同步异常信息', title: '同步异常信息',
area: ['600px','300px'], area: ['600px','300px'],
btn:['复制错误',"取消"], btn:btn_list,
content:"<form class='bt-form pd15'>\ content:"<form class='bt-form pd15'>\
<div class='divtable mtb10'>\ <div class='divtable mtb10'>\
<div class='tablescroll'>\ <div class='tablescroll'>\
@@ -2364,10 +2576,20 @@ function masterOrSlaveConf(version=''){
</div>\ </div>\
</form>", </form>",
success:function(){ success:function(){
// copyText(v['Error']); if (info['Last_IO_Error'] != ''){
// $('.class-copy-db-err').click(function(){ copyText(info['Last_IO_Error']);
// copyText(v['Error']); return;
// }); }
if (info['Last_SQL_Error'] != ''){
copyText(info['Last_SQL_Error']);
return;
}
if (info['Slave_SQL_Running_State'] != ''){
copyText(info['Slave_SQL_Running_State']);
return;
}
}, },
yes:function(){ yes:function(){
if (info['Last_IO_Error'] != ''){ if (info['Last_IO_Error'] != ''){
@@ -2384,6 +2606,14 @@ function masterOrSlaveConf(version=''){
copyText(info['Slave_SQL_Running_State']); copyText(info['Slave_SQL_Running_State']);
return; return;
} }
},
btn3:function(){
myPost('try_slave_sync_bugfix', {}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg, function(){
masterOrSlaveConf();
},{ icon: rdata.status ? 1 : 5 },2000);
});
} }
}); });
}); });
+140
View File
@@ -0,0 +1,140 @@
# -*- coding: utf-8 -*-
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export DEBIAN_FRONTEND=noninteractive
# https://downloads.mysql.com/archives/community/
curPath=`pwd`
rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath")
serverPath=$(dirname "$rootPath")
sysName=`uname`
install_tmp=${rootPath}/tmp/mw_install.pl
myDir=${serverPath}/source/mysql-apt
bash ${rootPath}/scripts/getos.sh
OSNAME=`cat ${rootPath}/data/osname.pl`
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
# cd /www/server/mdserver-web/plugins/mysql-apt && bash install.sh install 8.0
# 暂时debian12没有标准版,先用11使用
if [ "$OSNAME" == 'debian' ] && [ "$VERSION_ID" == '12' ] ;then
echo "暂时不支持该${OSNAME}${VERSION_ID}" > $install_tmp
exit 1
fi
ARCH="amd64"
TMP_ARCH=`arch`
if [ "$TMP_ARCH" == "x86_64" ];then
ARCH="amd64"
elif [ "$TMP_ARCH" == "aarch64" ];then
ARCH="arm64"
else
ARCH="amd64"
fi
if [ "$ARCH" != "amd64" ];then
echo "暂时不支持该${ARCH}" > $install_tmp
exit 1
fi
MYSQL_VER=8.2.0
SUFFIX_NAME=${MYSQL_VER}-1${OSNAME}${VERSION_ID}_${ARCH}
# /lib/systemd/system/mysql.service
# /etc/mysql/my.cnf
APT_INSTALL()
{
########
mkdir -p $myDir
mkdir -p $serverPath/mysql-apt/bin
wget --no-check-certificate -O ${myDir}/mysql-server_${SUFFIX_NAME}.deb-bundle.tar https://cdn.mysql.com/archives/mysql-8.2/mysql-server_${SUFFIX_NAME}.deb-bundle.tar
chmod +x ${myDir}/mysql-server_${SUFFIX_NAME}.deb-bundle.tar
cd ${myDir} && tar vxf ${myDir}/mysql-server_${SUFFIX_NAME}.deb-bundle.tar
apt update -y
apt install -y libnuma1 libaio1 libmecab2
# 安装
dpkg -X mysql-common_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-community-client-plugins_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-community-client-core_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-community-client_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-client_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-community-server-core_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-community-server_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
dpkg -X mysql-server_${SUFFIX_NAME}.deb $serverPath/mysql-apt/bin
# 测试时可关闭
rm -rf $myDir
#######
}
APT_UNINSTALL()
{
###
rm -rf $myDir
# apt remove -y mysql-server
###
}
Install_mysql()
{
echo '正在安装脚本文件...' > $install_tmp
if id mysql &> /dev/null ;then
echo "mysql uid is `id -u mysql`"
echo "mysql shell is `grep "^mysql:" /etc/passwd |cut -d':' -f7 `"
else
groupadd mysql
useradd -g mysql mysql
fi
isApt=`which apt`
if [ "$isApt" != "" ];then
APT_INSTALL
fi
if [ "$?" == "0" ];then
mkdir -p $serverPath/mysql-apt
echo '8.2' > $serverPath/mysql-apt/version.pl
echo '安装完成' > $install_tmp
else
echo '8.2' > $serverPath/mysql-apt/version.pl
echo "暂时不支持该系统" > $install_tmp
fi
}
Uninstall_mysql()
{
isApt=`which apt`
if [ "$isApt" != "" ];then
APT_UNINSTALL
fi
rm -rf $serverPath/mysql-apt
echo '卸载完成' > $install_tmp
}
action=$1
if [ "${1}" == 'install' ];then
Install_mysql
else
Uninstall_mysql
fi
+1
View File
@@ -12,6 +12,7 @@
<p onclick="myPerfOpt();">性能优化</p> <p onclick="myPerfOpt();">性能优化</p>
<p onclick="myLogs();">日志</p> <p onclick="myLogs();">日志</p>
<p onclick="pluginLogs('mysql-yum',$('.plugin_version').attr('version'),'show_log');">慢日志</p> <p onclick="pluginLogs('mysql-yum',$('.plugin_version').attr('version'),'show_log');">慢日志</p>
<p onclick="myBinLogs();">BINLOG</p>
<p onclick="dbList()">管理列表</p> <p onclick="dbList()">管理列表</p>
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p> <p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p>
</div> </div>
+247 -16
View File
@@ -89,6 +89,12 @@ def getDataDir():
tmp = re.search(rep, content) tmp = re.search(rep, content)
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def getLogBinName():
file = getConf()
content = mw.readFile(file)
rep = 'log-bin\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getPidFile(): def getPidFile():
file = getConf() file = getConf()
@@ -129,6 +135,15 @@ def getErrorLogsFile():
tmp = re.search(rep, content) tmp = re.search(rep, content)
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def getAuthPolicy():
file = getConf()
content = mw.readFile(file)
rep = 'authentication_policy\s*=\s*(.*)'
tmp = re.search(rep, content)
if tmp:
return tmp.groups()[0].strip()
# caching_sha2_password
return 'mysql_native_password'
def contentReplace(content): def contentReplace(content):
service_path = mw.getServerDir() service_path = mw.getServerDir()
@@ -276,6 +291,52 @@ def binLog():
mw.writeFile(conf, con) mw.writeFile(conf, con)
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def binLogList():
args = getArgs()
data = checkArgs(args, ['page', 'page_size', 'tojs'])
if not data[0]:
return data[1]
page = int(args['page'])
page_size = int(args['page_size'])
data_dir = getDataDir()
log_bin_name = getLogBinName()
alist = os.listdir(data_dir)
log_bin_l = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(log_bin_name) and not f.endswith('.index'):
abspath = data_dir + '/' + f
t['name'] = f
t['size'] = os.path.getsize(abspath)
t['time'] = mw.getDataFromInt(os.path.getctime(abspath))
log_bin_l.append(t)
log_bin_l = sorted(log_bin_l, key=lambda x: x['time'], reverse=True)
# print(log_bin_l)
# print(data_dir, log_bin_name)
count = len(log_bin_l)
page_start = (page - 1) * page_size
page_end = page_start + page_size
if page_end > count:
page_end = count
data = {}
page_args = {}
page_args['count'] = count
page_args['p'] = page
page_args['row'] = page_size
page_args['tojs'] = args['tojs']
data['page'] = mw.getPage(page_args)
data['data'] = log_bin_l[page_start:page_end]
return mw.getJson(data)
def cleanBinLog(): def cleanBinLog():
db = pMysqlDb() db = pMysqlDb()
@@ -360,8 +421,28 @@ def initMysql8Data():
return False return False
return True return True
def getLib64Pos(name=''):
cmd = "ls /usr/lib64 | grep "+name+".so | cut -d \ -f 1 | awk 'END {print}'"
d = mw.execShell(cmd)
return '/usr/lib64/'+d[0]
def makeLib64SoftLink(name=''):
pos = getLib64Pos(name)
dst_file = '/usr/lib64/'+name+'.so.5'
if os.path.exists(dst_file):
return True
if os.path.exists(pos):
cmd = 'ln -s '+pos+' '+dst_file
mw.execShell(cmd)
return True
def yumLibFix():
makeLib64SoftLink('libncurses')
makeLib64SoftLink('libtinfo')
def initMysql8Pwd(): def initMysql8Pwd():
yumLibFix()
''' '''
/usr/bin/mysql --defaults-file=/www/server/mysql-apt/etc/my.cnf -uroot -e"UPDATE mysql.user SET password=PASSWORD('BhIroUczczNVaKvw') WHERE user='root';flush privileges;" /usr/bin/mysql --defaults-file=/www/server/mysql-apt/etc/my.cnf -uroot -e"UPDATE mysql.user SET password=PASSWORD('BhIroUczczNVaKvw') WHERE user='root';flush privileges;"
/usr/bin/mysql --defaults-file=/www/server/mysql-apt/etc/my.cnf -uroot -e"alter user 'root'@'localhost' identified by '123456';" /usr/bin/mysql --defaults-file=/www/server/mysql-apt/etc/my.cnf -uroot -e"alter user 'root'@'localhost' identified by '123456';"
@@ -371,6 +452,7 @@ def initMysql8Pwd():
serverdir = getServerDir() serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf" myconf = serverdir + "/etc/my.cnf"
pwd = mw.getRandomString(16) pwd = mw.getRandomString(16)
auth_policy = getAuthPolicy()
cmd_my = serverdir + '/bin/usr/bin/mysql' cmd_my = serverdir + '/bin/usr/bin/mysql'
@@ -378,16 +460,18 @@ def initMysql8Pwd():
cmd_pass = cmd_pass + \ cmd_pass = cmd_pass + \
'"alter user \'root\'@\'localhost\' identified by \'' + pwd + '\';' '"alter user \'root\'@\'localhost\' identified by \'' + pwd + '\';'
cmd_pass = cmd_pass + \ cmd_pass = cmd_pass + \
"alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '" + pwd + "';" "alter user 'root'@'localhost' IDENTIFIED WITH "+auth_policy+" by '" + pwd + "';"
cmd_pass = cmd_pass + 'flush privileges;"' cmd_pass = cmd_pass + 'flush privileges;"'
# print(cmd_pass) # print(cmd_pass)
data = mw.execShell(cmd_pass) data = mw.execShell(cmd_pass)
# print(data) if data[1] != '':
print(data[1])
exit(-1)
# 删除空账户 # 删除空账户
drop_empty_user = cmd_my + ' --defaults-file=' + myconf + ' -uroot -p' + \ # drop_empty_user = cmd_my + ' --defaults-file=' + myconf + ' -uroot -p' + \
pwd + ' -e "use mysql;delete from user where USER=\'\'"' # pwd + ' -e "use mysql;delete from user where USER=\'\'"'
mw.execShell(drop_empty_user) # mw.execShell(drop_empty_user)
# 删除测试数据库 # 删除测试数据库
drop_test_db = cmd_my + ' --defaults-file=' + myconf + ' -uroot -p' + \ drop_test_db = cmd_my + ' --defaults-file=' + myconf + ' -uroot -p' + \
@@ -397,15 +481,15 @@ def initMysql8Pwd():
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
# 删除冗余账户 # 删除冗余账户
hostname = mw.execShell('hostname')[0].strip() # hostname = mw.execShell('hostname')[0].strip()
if hostname != 'localhost': # if hostname != 'localhost':
drop_hostname = cmd_my + ' --defaults-file=' + \ # drop_hostname = cmd_my + ' --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop user \'\'@\'' + hostname + '\'";' # myconf + ' -uroot -p' + pwd + ' -e "drop user \'\'@\'' + hostname + '\'";'
mw.execShell(drop_hostname) # mw.execShell(drop_hostname)
drop_root_hostname = cmd_my + ' --defaults-file=' + \ # drop_root_hostname = cmd_my + ' --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop user \'root\'@\'' + hostname + '\'";' # myconf + ' -uroot -p' + pwd + ' -e "drop user \'root\'@\'' + hostname + '\'";'
mw.execShell(drop_root_hostname) # mw.execShell(drop_root_hostname)
return True return True
@@ -1041,12 +1125,20 @@ def setRootPwd(version=''):
if not data[0]: if not data[0]:
return data[1] return data[1]
#强制修改
force = 0
if 'force' in args and args['force'] == '1':
force = 1
password = args['password'] password = args['password']
try: try:
pdb = pMysqlDb() pdb = pMysqlDb()
result = pdb.query("show databases") result = pdb.query("show databases")
isError = isSqlError(result) isError = isSqlError(result)
if isError != None: if isError != None:
if force == 1:
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '【强制修改】数据库root密码修改成功(不意为成功连接数据)!')
return isError return isError
if version.find('5.7') > -1 or version.find('8.0') > -1: if version.find('5.7') > -1 or version.find('8.0') > -1:
@@ -1061,7 +1153,11 @@ def setRootPwd(version=''):
"update mysql.user set Password=password('" + password + "') where User='root'") "update mysql.user set Password=password('" + password + "') where User='root'")
pdb.execute("flush privileges") pdb.execute("flush privileges")
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '数据库root密码修改成功!')
msg = ''
if force == 1:
msg = ',无须强制!'
return mw.returnJson(True, '数据库root密码修改成功!'+msg)
except Exception as ex: except Exception as ex:
return mw.returnJson(False, '修改错误:' + str(ex)) return mw.returnJson(False, '修改错误:' + str(ex))
@@ -1270,8 +1366,57 @@ def setDbAccess():
psdb.where('username=?', (name,)).save('accept,rw', (access, 'rw',)) psdb.where('username=?', (name,)).save('accept,rw', (access, 'rw',))
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def openSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('#skip-grant-tables','skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def fixDbAccess(version): def closeSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('skip-grant-tables','#skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def resetDbRootPwd(version):
serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf"
pwd = mw.getRandomString(16)
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
if float(version) < 5.7:
cmd_pass = serverdir + '/bin/usr/bin/mysql --defaults-file=' + myconf + ' -uroot -e'
cmd_pass = cmd_pass + '"UPDATE mysql.user SET password=PASSWORD(\'' + pwd + "') WHERE user='root';"
cmd_pass = cmd_pass + 'flush privileges;"'
data = mw.execShell(cmd_pass)
# print(data)
else:
auth_policy = getAuthPolicy()
reset_pwd = 'flush privileges;'
reset_pwd = reset_pwd + \
"UPDATE mysql.user SET authentication_string='' WHERE user='root';"
reset_pwd = reset_pwd + "flush privileges;"
reset_pwd = reset_pwd + \
"alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
reset_pwd = reset_pwd + \
"alter user 'root'@'localhost' IDENTIFIED WITH "+auth_policy+" by '" + pwd + "';"
reset_pwd = reset_pwd + "flush privileges;"
tmp_file = "/tmp/mysql_init_tmp.log"
mw.writeFile(tmp_file, reset_pwd)
cmd_pass = serverdir + '/bin/usr/bin/mysql --defaults-file=' + myconf + ' -uroot -proot < ' + tmp_file
data = mw.execShell(cmd_pass)
# print(data)
os.remove(tmp_file)
return True
def fixDbAccess2(version):
try: try:
pdb = pMysqlDb() pdb = pMysqlDb()
data = pdb.query('show databases') data = pdb.query('show databases')
@@ -1285,6 +1430,34 @@ def fixDbAccess(version):
except Exception as e: except Exception as e:
return mw.returnJson(False, '修复失败请重试!') return mw.returnJson(False, '修复失败请重试!')
def fixDbAccess(version):
pdb = pMysqlDb()
mdb_ddir = getDataDir()
if not os.path.exists(mdb_ddir):
return mw.returnJson(False, '数据目录不存在,尝试重启重建!')
try:
data = pdb.query('show databases')
isError = isSqlError(data)
if isError != None:
# 重置密码
appCMD(version, 'stop')
openSkipGrantTables()
appCMD(version, 'start')
time.sleep(3)
resetDbRootPwd(version)
appCMD(version, 'stop')
closeSkipGrantTables()
appCMD(version, 'start')
return mw.returnJson(True, '修复成功!')
return mw.returnJson(True, '正常无需修复!')
except Exception as e:
return mw.returnJson(False, '修复失败请重试!')
def setDbRw(version=''): def setDbRw(version=''):
args = getArgs() args = getArgs()
@@ -1832,12 +2005,14 @@ def addMasterRepSlaveUser(version=''):
pdb = pMysqlDb() pdb = pMysqlDb()
psdb = pSqliteDb('master_replication_user') psdb = pSqliteDb('master_replication_user')
auth_policy = getAuthPolicy()
if psdb.where("username=?", (username)).count() > 0: if psdb.where("username=?", (username)).count() > 0:
return mw.returnJson(False, '用户已存在!') return mw.returnJson(False, '用户已存在!')
if version == "8.0": if version == "8.0":
sql = "CREATE USER '" + username + \ sql = "CREATE USER '" + username + \
"' IDENTIFIED WITH mysql_native_password BY '" + password + "';" "' IDENTIFIED WITH "+auth_policy+" BY '" + password + "';"
pdb.execute(sql) pdb.execute(sql)
sql = "grant replication slave on *.* to '" + username + "'@'%';" sql = "grant replication slave on *.* to '" + username + "'@'%';"
result = pdb.execute(sql) result = pdb.execute(sql)
@@ -2197,6 +2372,56 @@ def getSlaveList(version=''):
data['data'] = dlist data['data'] = dlist
return mw.getJson(data) return mw.getJson(data)
def trySlaveSyncBugfix(version=''):
if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', [])
mode_file = getSyncModeFile()
if not os.path.exists(mode_file):
return mw.returnJson(False, '需要先设置同步配置')
mode = mw.readFile(mode_file)
if mode != 'sync-user':
return mw.returnJson(False, '仅支持【同步账户】模式')
conn = pSqliteDb('slave_sync_user')
slave_sync_data = conn.field('ip,port,user,pass,mode,cmd').select()
if len(slave_sync_data) < 1:
return mw.returnJson(False, '需要先添加【同步用户】配置!')
# print(slave_sync_data)
# 本地从库
sdb = pMysqlDb()
gtid_purged = ''
for i in range(len(slave_sync_data)):
port = slave_sync_data[i]['port']
password = slave_sync_data[i]['pass']
host = slave_sync_data[i]['ip']
user = slave_sync_data[i]['user']
# print(port, password, host)
mdb = mw.getMyORM()
mdb.setHost(host)
mdb.setPort(port)
mdb.setUser(user)
mdb.setPwd(password)
mdb.setSocket('')
var_gtid = mdb.query('show VARIABLES like "%gtid_purged%"')
if len(var_gtid) > 0:
gtid_purged += var_gtid[0]['Value'] + ','
gtid_purged = gtid_purged.strip(',')
sql = "set @@global.gtid_purged='" + gtid_purged + "'"
sdb.query('stop slave')
# print(sql)
sdb.query(sql)
sdb.query('start slave')
return mw.returnJson(True, '修复成功!')
def getSlaveSyncCmd(version=''): def getSlaveSyncCmd(version=''):
@@ -2775,6 +3000,8 @@ if __name__ == "__main__":
print(getConf()) print(getConf())
elif func == 'bin_log': elif func == 'bin_log':
print(binLog()) print(binLog())
elif func == 'binlog_list':
print(binLogList())
elif func == 'clean_bin_log': elif func == 'clean_bin_log':
print(cleanBinLog()) print(cleanBinLog())
elif func == 'error_log': elif func == 'error_log':
@@ -2825,6 +3052,8 @@ if __name__ == "__main__":
print(setDbAccess()) print(setDbAccess())
elif func == 'fix_db_access': elif func == 'fix_db_access':
print(fixDbAccess(version)) print(fixDbAccess(version))
elif func == 'fix_db_access2':
print(fixDbAccess2(version))
elif func == 'set_db_rw': elif func == 'set_db_rw':
print(setDbRw(version)) print(setDbRw(version))
elif func == 'set_db_ps': elif func == 'set_db_ps':
@@ -2869,6 +3098,8 @@ if __name__ == "__main__":
print(getMasterRepSlaveUserCmd(version)) print(getMasterRepSlaveUserCmd(version))
elif func == 'get_slave_list': elif func == 'get_slave_list':
print(getSlaveList(version)) print(getSlaveList(version))
elif func == 'try_slave_sync_bugfix':
print(trySlaveSyncBugfix(version))
elif func == 'get_slave_sync_cmd': elif func == 'get_slave_sync_cmd':
print(getSlaveSyncCmd(version)) print(getSlaveSyncCmd(version))
elif func == 'get_slave_ssh_list': elif func == 'get_slave_ssh_list':
+186
View File
@@ -0,0 +1,186 @@
# coding:utf-8
import sys
import io
import os
import time
import subprocess
import re
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
if mw.isAppleSystem():
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)
app_debug = False
if mw.isAppleSystem():
app_debug = True
def getPluginName():
return 'mysql-yum'
def getPluginDir():
return mw.getPluginDir() + '/' + getPluginName()
def getSPluginDir():
return '/www/server/mdserver-web/plugins/' + getPluginName()
def getServerDir():
return mw.getServerDir() + '/' + getPluginName()
def getConf():
path = getServerDir() + '/etc/my.cnf'
return path
def getDataDir():
file = getConf()
content = mw.readFile(file)
rep = 'datadir\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getRelayLogName():
file = getConf()
content = mw.readFile(file)
rep = 'relay-log\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getLogBinName():
file = getConf()
content = mw.readFile(file)
rep = 'log-bin\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def binLogListLook(args):
file = args['file']
line = args['line']
data_dir = getDataDir()
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata = {}
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListLookDecode(args):
file = args['file']
line = args['line']
data_dir = getDataDir()
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata = {}
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListTraceRelay(args):
rdata = {}
file = args['file']
line = args['line']
relay_name = getRelayLogName()
data_dir = getDataDir()
alist = os.listdir(data_dir)
relay_list = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(relay_name) and not f.endswith('.index'):
relay_list.append(f)
relay_list = sorted(relay_list, reverse=True)
if len(relay_list) == 0:
rdata['cmd'] = ''
rdata['data'] = '无Relay日志'
return rdata
file = relay_list[0]
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
def binLogListTraceBinLog(args):
rdata = {}
file = args['file']
line = args['line']
data_dir = getDataDir()
log_bin_name = getLogBinName()
alist = os.listdir(data_dir)
log_bin_l = []
for x in range(len(alist)):
f = alist[x]
t = {}
if f.startswith(log_bin_name) and not f.endswith('.index'):
log_bin_l.append(f)
if len(log_bin_l) == 0:
rdata['cmd'] = ''
rdata['data'] = '无BINLOG'
return rdata
log_bin_l = sorted(log_bin_l, reverse=True)
file = log_bin_l[0]
my_bin = getServerDir() + '/bin/usr/bin'
my_binlog_cmd = my_bin + '/mysqlbinlog'
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
data_dir + '/' + file + '|tail -' + str(line)
data = mw.execShell(cmd)
rdata['cmd'] = cmd
rdata['data'] = data[0]
return rdata
+295 -64
View File
@@ -59,6 +59,63 @@ function myAsyncPost(method,args){
return syncPost('/plugins/run', {name:'mysql-yum', func:method, args:_args}); return syncPost('/plugins/run', {name:'mysql-yum', func:method, args:_args});
} }
function myPostCallbak(method, version, args,callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
var req_data = {};
req_data['name'] = 'mysql-yum';
req_data['func'] = method;
req_data['script']='index_mysql_yum';
args['version'] = version;
if (typeof(args) == 'string' && args == ''){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/callback', req_data, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function myPostCallbakN(method, version, args,callback){
var req_data = {};
req_data['name'] = 'mysql-yum';
req_data['func'] = method;
req_data['script']='index_mysql_yum';
args['version'] = version;
if (typeof(args) == 'string' && args == ''){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/callback', req_data, function(data) {
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function vaildPhpmyadmin(url,username,password){ function vaildPhpmyadmin(url,username,password){
// console.log("Authorization: Basic " + btoa(username + ":" + password)); // console.log("Authorization: Basic " + btoa(username + ":" + password));
$.ajax({ $.ajax({
@@ -439,7 +496,6 @@ function setRootPwd(type, pwd){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){ showMsg(rdata.msg,function(){
dbList(); dbList();
$('.layui-layer-close1').click();
},{icon: rdata.status ? 1 : 2}); },{icon: rdata.status ? 1 : 2});
}); });
return; return;
@@ -451,7 +507,7 @@ function setRootPwd(type, pwd){
title: '修改数据库密码', title: '修改数据库密码',
closeBtn: 1, closeBtn: 1,
shift: 5, shift: 5,
btn:["提交","关闭"], btn:["提交", "关闭", "复制ROOT密码", "强制修改"],
shadeClose: true, shadeClose: true,
content: "<form class='bt-form pd20' id='mod_pwd'>\ content: "<form class='bt-form pd20' id='mod_pwd'>\
<div class='line'>\ <div class='line'>\
@@ -461,8 +517,36 @@ function setRootPwd(type, pwd){
</div>\ </div>\
</div>\ </div>\
</form>", </form>",
yes:function(){ yes:function(layerIndex){
setRootPwd(1); var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
},
btn3:function(){
var password = $("#MyPassword").val();
copyText(password);
return false;
},
btn4:function(layerIndex){
layer.confirm('强制修改,是为了在重建时使用,确定强制?', {
btn: ['确定', '取消']
}, function(index, layero){
layer.close(index);
var password = $("#MyPassword").val();
myPost('set_root_pwd', {password:password,force:'1'}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
});
return false;
} }
}); });
} }
@@ -773,68 +857,53 @@ function setDbPs(id, name, obj) {
} }
function openPhpmyadmin(name,username,password){ function openPhpmyadmin(name,username,password){
$.post('/plugins/run', {'name':'phpmyadmin','func':'plugins_db_support'}, function(data){
var rdata = $.parseJSON(data.data);
data = syncPost('/plugins/check',{'name':'phpmyadmin'}); if (rdata.data['installed'] != 'ok'){
layer.msg('phpMyAdmin未安装!',{icon:2,shade: [0.3, '#000']});
return;
}
if (rdata.data['status'] != 'start'){
layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']});
return;
}
if (!data.status){ if (rdata.data['cfg']['choose'] != 'mysql-yum'){
layer.msg(data.msg,{icon:2,shade: [0.3, '#000']}); layer.msg('当前为['+rdata.choose+']模式,若要使用请修改phpMyAdmin访问切换.',{icon:2,shade: [0.3, '#000']});
return; return;
} }
var home_page = rdata.data['home_page'];
$("#toPHPMyAdmin").attr('action',home_page);
if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){
layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']});
setTimeout(function(){ window.location.href = '/soft'; },3000);
return;
}
//检查版本
bigVer = rdata.data['version'];
if (bigVer>=4.5){
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'status'}); setTimeout(function(){
if (data.data != 'start'){ $("#toPHPMyAdmin").submit();
layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']}); },2000);
return; layer.msg('phpMyAdmin['+data.data+']需要手动登录😭',{icon:16,shade: [0.3, '#000'],time:4000});
}
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_cfg'}); } else{
var rdata = $.parseJSON(data.data); var murl = $("#toPHPMyAdmin").attr('action');
if (rdata.choose != 'mysql-yum'){ $("#pma_username").val(username);
layer.msg('当前为['+rdata.choose+']模式,若要使用请修改phpMyAdmin访问切换.',{icon:2,shade: [0.3, '#000']}); $("#pma_password").val(password);
return; $("#db").val(name);
}
var phpmyadmin_cfg = rdata; layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:2000});
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_home_page'});
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']});
return;
}
var home_page = rdata.data;
home_page = home_page.replace("http://","http://"+phpmyadmin_cfg['username']+":"+phpmyadmin_cfg['password']+"@") setTimeout(function(){
$("#toPHPMyAdmin").submit();
},2000);
}
$("#toPHPMyAdmin").attr('action',home_page); },'json');
if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){
layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']});
setTimeout(function(){ window.location.href = '/soft'; },3000);
return;
}
//检查版本
data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'version'});
bigVer = data.data.split('.')[0];
if (bigVer>=4.5){
setTimeout(function(){
$("#toPHPMyAdmin").submit();
},3000);
layer.msg('phpMyAdmin['+data.data+']需要手动登录😭',{icon:16,shade: [0.3, '#000'],time:4000});
} else{
var murl = $("#toPHPMyAdmin").attr('action');
$("#pma_username").val(username);
$("#pma_password").val(password);
$("#db").val(name);
layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:2000});
setTimeout(function(){
$("#toPHPMyAdmin").submit();
},3000);
}
} }
function delBackup(filename, name, path){ function delBackup(filename, name, path){
@@ -1083,7 +1152,7 @@ function dbList(page, search){
list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>'; list += '<td><span class="c9 input-edit" onclick="setDbPs(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\',this)" style="display: inline-block;">'+rdata.data[i]['ps']+'</span></td>';
list += '<td style="text-align:right">'; list += '<td style="text-align:right">';
list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'备份':'未备份') +'</a> | '; list += '<a href="javascript:;" class="btlink" class="btlink" onclick="setBackup(\''+rdata.data[i]['name']+'\',this)" title="数据库备份">'+(rdata.data[i]['is_backup']?'已备份':'未备份') +'</a> | ';
var rw = ''; var rw = '';
var rw_change = 'all'; var rw_change = 'all';
@@ -1162,6 +1231,146 @@ function dbList(page, search){
}); });
} }
function myBinRollingLogs(_name, func, _args, line){
var file_line = 100;
if ( typeof(line) != 'undefined' ){
file_line = line;
}
var reqTimer = null;
function requestLogs(func,file,line){
myPostCallbakN(func,'',{'file':file,"line":line}, function(rdata){
var data = rdata.data.data;
var cmd = rdata.data.cmd;
if(data == '') {
data = '当前没有日志!';
}
$('#my_rolling_cmd').html(cmd);
$('#my_rolling_copy').click(function(){
copyText(cmd);
});
var ebody = '<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log">'+data+'</textarea>';
$("#my_rolling_logs").html(ebody);
var ob = document.getElementById('roll_info_log');
ob.scrollTop = ob.scrollHeight;
});
}
layer.open({
type: 1,
title: _name + '日志',
area: ['800px','700px'],
end: function(){
if (reqTimer){
clearInterval(reqTimer);
}
},
content:'<div class="change-default" style="padding:0px 20px 0px;">\
<div class="divtable mtb10">\
<table class="table table-hover"><tr>\
<td id="my_rolling_cmd">cmd</td>\
<td id="my_rolling_copy" style="width:35px;"><span class="ico-copy cursor btcopy" title="复制密码"></span></td>\
<tr>\
</table>\
</div>\
</div>\
<div class="change-default" style="padding:0px 20px 0px;" id="my_rolling_logs">\
<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log"></textarea>\
</div>',
success:function(){
var fileName = _args['file'];
requestLogs(func,fileName,file_line);
reqTimer = setInterval(function(){
requestLogs(func,fileName,file_line);
},1000);
}
});
}
function myBinLogsRender(page){
var _data = {};
if (typeof(page) =='undefined'){
var page = 1;
}
_data['page'] = page;
_data['page_size'] = 10;
_data['tojs'] = 'myBinLogsRender';
myPost('binlog_list', _data, function(data){
var rdata = $.parseJSON(data.data);
// console.log(rdata);
var list = '';
for(i in rdata.data){
list += '<tr>';
list += '<td>' + rdata.data[i]['name'] +'</td>';
list += '<td>' + toSize(rdata.data[i]['size'])+'</td>';
list += '<td>' + rdata.data[i]['time'] +'</td>';
list += '<td style="text-align:right">';
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look" class="btlink">查看</a> | ';
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look_decode" class="btlink">解码查看</a>';
list += '</td></tr>';
}
if (rdata.data.length ==0){
list = '<tr><td colspan="4">无数据</td</tr>';
}
$("#binlog_list tbody").html(list);
$('#binlog_page').html(rdata.page);
$('#binlog_list .look').click(function(){
var i = $(this).data('index');
var file = rdata.data[i]['name'];
myBinRollingLogs('查看BINLOG','binLogListLook',{'file':file },100);
});
$('#binlog_list .look_decode').click(function(){
var i = $(this).data('index');
var file = rdata.data[i]['name'];
myBinRollingLogs('查看解码BINLOG','binLogListLookDecode',{'file':file },100);
});
});
}
function myBinLogs(){
var con = '<div class="safe bgw">\
<button class="btn btn-success btn-sm relay_trace" type="button" style="margin-right: 5px;">中继日志跟踪</button>\
<button class="btn btn-default btn-sm binlog_trace" type="button" style="margin-right: 5px;">最新BINLOG日志跟踪</button>\
<div id="binlog_list" class="divtable mtb10">\
<div class="tablescroll">\
<table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>文件名称</th>\
<th>大小</th>\
<th>时间</th>\
<th style="text-align:right;">操作</th>\
</tr></thead>\
<tbody></tbody></table>\
</div>\
<div id="binlog_page" class="dataTables_paginate paging_bootstrap page"></div>\
</div>\
</div>';
$(".soft-man-con").html(con);
myBinLogsRender(1);
$('.soft-man-con .relay_trace').click(function(){
myBinRollingLogs('中继日志跟踪','binLogListTraceRelay',{'file':''},100);
});
$('.soft-man-con .binlog_trace').click(function(){
myBinRollingLogs('最新BINLOG日志跟踪','binLogListTraceBinLog',{'file':''},100);
});
}
function myLogs(){ function myLogs(){
@@ -2345,11 +2554,15 @@ function masterOrSlaveConf(version=''){
<td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\ <td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\
</tr>"; </tr>";
var btn_list = ['复制错误',"取消"];
if (info['Last_IO_Error'].search(/1236/i)>0){
btn_list = ['复制错误',"取消","尝试修复"];
}
layer.open({ layer.open({
type: 1, type: 1,
title: '同步异常信息', title: '同步异常信息',
area: ['600px','300px'], area: ['600px','300px'],
btn:['复制错误',"取消"], btn:btn_list,
content:"<form class='bt-form pd15'>\ content:"<form class='bt-form pd15'>\
<div class='divtable mtb10'>\ <div class='divtable mtb10'>\
<div class='tablescroll'>\ <div class='tablescroll'>\
@@ -2364,10 +2577,20 @@ function masterOrSlaveConf(version=''){
</div>\ </div>\
</form>", </form>",
success:function(){ success:function(){
// copyText(v['Error']); if (info['Last_IO_Error'] != ''){
// $('.class-copy-db-err').click(function(){ copyText(info['Last_IO_Error']);
// copyText(v['Error']); return;
// }); }
if (info['Last_SQL_Error'] != ''){
copyText(info['Last_SQL_Error']);
return;
}
if (info['Slave_SQL_Running_State'] != ''){
copyText(info['Slave_SQL_Running_State']);
return;
}
}, },
yes:function(){ yes:function(){
if (info['Last_IO_Error'] != ''){ if (info['Last_IO_Error'] != ''){
@@ -2384,6 +2607,14 @@ function masterOrSlaveConf(version=''){
copyText(info['Slave_SQL_Running_State']); copyText(info['Slave_SQL_Running_State']);
return; return;
} }
},
btn3:function(){
myPost('try_slave_sync_bugfix', {}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg, function(){
masterOrSlaveConf();
},{ icon: rdata.status ? 1 : 5 },2000);
});
} }
}); });
}); });
+2 -2
View File
@@ -100,7 +100,7 @@ Install_mysql()
rm -rf $myDir rm -rf $myDir
echo '8.0' > $serverPath/mysql-yum/version.pl echo '8.0' > $serverPath/mysql-yum/version.pl
echo '安装完成' > $install_tmp echo '安装完成'
} }
Uninstall_mysql() Uninstall_mysql()
@@ -110,7 +110,7 @@ Uninstall_mysql()
YUM_UNINSTALL YUM_UNINSTALL
fi fi
rm -rf $serverPath/mysql-yum rm -rf $serverPath/mysql-yum
echo '卸载完成' > $install_tmp echo '卸载完成'
} }
action=$1 action=$1
+291
View File
@@ -0,0 +1,291 @@
# 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_SOCKET = '/www/server/mysql/mysql.sock'
__DB_CHARSET = "utf8"
# orm
__DB_TABLE = "" # 被操作的表名称
__OPT_WHERE = "" # where条件
__OPT_LIMIT = "" # limit条件
__OPT_GROUP = "" # group条件
__OPT_ORDER = "" # order条件
__OPT_FIELD = "*" # field条件
__OPT_PARAM = () # where值
def __Conn(self):
'''连接数据库'''
try:
if 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=1,
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=1,
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=1,
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=1,
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 setDbName(self, name):
self.__DB_NAME = name
def execute(self, sql, param=()):
# 执行SQL语句返回受影响行
if not self.__Conn():
return self.__DB_ERR
try:
result = self.__DB_CUR.execute(sql,param)
self.__DB_CONN.commit()
self.__Close()
return result
except Exception as ex:
return ex
def query(self, sql, param=()):
# 执行SQL语句返回数据集
if not self.__Conn():
return self.__DB_ERR
try:
self.__DB_CUR.execute(sql,param)
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()
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 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 find(self):
# 取一行数据
result = self.limit("1").select()
# print(result)
if len(result) == 1:
return result[0]
return result
def select(self):
# 查询数据集
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.query(sql, self.__OPT_PARAM)
return result
def getField(self, keyName):
# 取回指定字段
result = self.field(keyName).select()
# print(result[0][keyName])
if len(result) == 1:
return result[0][keyName]
return result
def setField(self, keyName, keyValue):
# 更新指定字段
return self.save(keyName, (keyValue,))
# 构造数据
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 delete(self, id=None):
# 删除数据
if id:
self.__OPT_WHERE = " WHERE id=%s"
self.__OPT_PARAM = (id,)
sql = "DELETE FROM " + self.__DB_TABLE + self.__OPT_WHERE
# print(sql)
result = self.execute(sql, self.__OPT_PARAM)
return result
def save(self, keys, param):
# 更新数据
opt = ""
for key in keys.split(','):
opt += key + "=%s,"
opt = opt[0:len(opt) - 1]
sql = "UPDATE " + self.__DB_TABLE + " SET " + opt + self.__OPT_WHERE
# 处理拼接WHERE与UPDATE参数
tmp = list(param)
for arg in self.__OPT_PARAM:
tmp.append(arg)
self.__OPT_PARAM = tuple(tmp)
# print(sql,self.__OPT_PARAM)
result = self.execute(sql, self.__OPT_PARAM)
return result
# 更新数据
def update(self, pdata):
if not pdata:
return False
keys, param = self.__format_pdata(pdata)
return self.save(keys, param)
def add(self, keys, param):
# 插入数据
values = ""
for key in keys.split(','):
values += "%s,"
values = self.checkInput(values[0:len(values) - 1])
sql = "INSERT INTO " + self.__DB_TABLE + \
"(" + keys + ") " + "VALUES(" + values + ")"
# print(sql)
result = self.execute(sql, param)
return result
+1
View File
@@ -2,3 +2,4 @@
# SHOW GLOBAL VARIABLES LIKE '%gtid%' # SHOW GLOBAL VARIABLES LIKE '%gtid%'
gtid_mode=ON gtid_mode=ON
enforce_gtid_consistency=ON enforce_gtid_consistency=ON
binlog_checksum=NONE
+1 -4
View File
@@ -20,7 +20,7 @@ basedir = {$SERVER_APP_PATH}
datadir = {$SERVER_APP_PATH}/data datadir = {$SERVER_APP_PATH}/data
log-error = {$SERVER_APP_PATH}/data/error.log log-error = {$SERVER_APP_PATH}/data/error.log
server-id = {$SERVER_ID} server-id = {$SERVER_ID}
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default_storage_engine = InnoDB default_storage_engine = InnoDB
@@ -48,7 +48,6 @@ skip_name_resolve=1
#skip-grant-tables #skip-grant-tables
log-bin=mysql-bin log-bin=mysql-bin
binlog_format=mixed
slow_query_log=1 slow_query_log=1
slow-query-log-file={$SERVER_APP_PATH}/data/mysql-slow.log slow-query-log-file={$SERVER_APP_PATH}/data/mysql-slow.log
long_query_time=10 long_query_time=10
@@ -84,8 +83,6 @@ replicate-ignore-db = performance_schema
replicate-ignore-db = mysql replicate-ignore-db = mysql
replicate-ignore-db = test replicate-ignore-db = test
master_info_repository = table
relay_log_info_repository = table
innodb_data_home_dir = {$SERVER_APP_PATH}/data innodb_data_home_dir = {$SERVER_APP_PATH}/data
innodb_data_file_path = ibdata1:10M:autoextend innodb_data_file_path = ibdata1:10M:autoextend
+116
View File
@@ -0,0 +1,116 @@
[client]
user = root
#password = your_password
port = 3306
socket = {$SERVER_APP_PATH}/mysql.sock
default-character-set = UTF8MB4
[mysqld]
!include {$SERVER_APP_PATH}/etc/mode/classic.cnf
sha256_password_private_key_path={$SERVER_APP_PATH}/data/mysql.pem
sha256_password_public_key_path={$SERVER_APP_PATH}/data/mysql.pub
authentication_policy=mysql_native_password
pid-file = {$SERVER_APP_PATH}/data/mysql.pid
user = mysql
port = 3306
socket = {$SERVER_APP_PATH}/mysql.sock
basedir = {$SERVER_APP_PATH}
datadir = {$SERVER_APP_PATH}/data
log-error = {$SERVER_APP_PATH}/data/error.log
server-id = {$SERVER_ID}
#sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default_storage_engine = InnoDB
key_buffer_size = 8M
table_open_cache = 32
sort_buffer_size = 256K
net_buffer_length = 4K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 4M
thread_cache_size = 4
lower_case_table_names=0
tmp_table_size = 8M
character-set-server = UTF8MB4
max_connections = 500
max_connect_errors = 100
open_files_limit = 2560
max_allowed_packet = 128M
skip_name_resolve=1
#skip-networking
#skip-external-locking
#loose-skip-innodb
#skip-grant-tables
log-bin=mysql-bin
slow_query_log=1
slow-query-log-file={$SERVER_APP_PATH}/data/mysql-slow.log
long_query_time=10
#log_queries_not_using_indexes=1
#log_slow_admin_statements=1
#log_slow_replica_statements=1
binlog_expire_logs_seconds=2592000
relay-log=mdserver
relay-log-index=mdserver
#多主设置
#auto_increment_offset=2
#auto_increment_increment=2
#master
#sync_binlog=1
#binlog-do-db
binlog-ignore-db = test
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
#slave
log_replica_updates = 1
# Prevent replication from starting automatically with MySQL
#skip_replica_start = 1
#replicate-do-db
replica_skip_errors=1062,1396
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = mysql
replicate-ignore-db = test
innodb_data_home_dir = {$SERVER_APP_PATH}/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = {$SERVER_APP_PATH}/data
innodb_buffer_pool_size = 16M
#innodb_log_file_size = 5M
innodb_redo_log_capacity=10485760
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 120
innodb_max_dirty_pages_pct = 90
innodb_read_io_threads = 1
innodb_write_io_threads = 1
innodb_file_per_table=1
secure-file-priv={$SERVER_APP_PATH}/tmp
[mysqldump]
quick
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
+116
View File
@@ -0,0 +1,116 @@
[client]
user = root
#password = your_password
port = 3306
socket = {$SERVER_APP_PATH}/mysql.sock
default-character-set = UTF8MB4
[mysqld]
!include {$SERVER_APP_PATH}/etc/mode/classic.cnf
sha256_password_private_key_path={$SERVER_APP_PATH}/data/mysql.pem
sha256_password_public_key_path={$SERVER_APP_PATH}/data/mysql.pub
authentication_policy=mysql_native_password
pid-file = {$SERVER_APP_PATH}/data/mysql.pid
user = mysql
port = 3306
socket = {$SERVER_APP_PATH}/mysql.sock
basedir = {$SERVER_APP_PATH}
datadir = {$SERVER_APP_PATH}/data
log-error = {$SERVER_APP_PATH}/data/error.log
server-id = {$SERVER_ID}
#sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default_storage_engine = InnoDB
key_buffer_size = 8M
table_open_cache = 32
sort_buffer_size = 256K
net_buffer_length = 4K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 4M
thread_cache_size = 4
lower_case_table_names=0
tmp_table_size = 8M
character-set-server = UTF8MB4
max_connections = 500
max_connect_errors = 100
open_files_limit = 2560
max_allowed_packet = 128M
skip_name_resolve=1
#skip-networking
#skip-external-locking
#loose-skip-innodb
#skip-grant-tables
log-bin=mysql-bin
slow_query_log=1
slow-query-log-file={$SERVER_APP_PATH}/data/mysql-slow.log
long_query_time=10
#log_queries_not_using_indexes=1
#log_slow_admin_statements=1
#log_slow_replica_statements=1
binlog_expire_logs_seconds=2592000
relay-log=mdserver
relay-log-index=mdserver
#多主设置
#auto_increment_offset=2
#auto_increment_increment=2
#master
#sync_binlog=1
#binlog-do-db
binlog-ignore-db = test
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
#slave
log_replica_updates = 1
# Prevent replication from starting automatically with MySQL
#skip_replica_start = 1
#replicate-do-db
replica_skip_errors=1062,1396
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = mysql
replicate-ignore-db = test
innodb_data_home_dir = {$SERVER_APP_PATH}/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = {$SERVER_APP_PATH}/data
innodb_buffer_pool_size = 16M
#innodb_log_file_size = 5M
innodb_redo_log_capacity=10485760
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 120
innodb_max_dirty_pages_pct = 90
innodb_read_io_threads = 1
innodb_write_io_threads = 1
innodb_file_per_table=1
secure-file-priv={$SERVER_APP_PATH}/tmp
[mysqldump]
quick
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
+145 -46
View File
@@ -116,6 +116,16 @@ def getErrorLogsFile():
tmp = re.search(rep, content) tmp = re.search(rep, content)
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def getAuthPolicy():
file = getConf()
content = mw.readFile(file)
rep = 'authentication_policy\s*=\s*(.*)'
tmp = re.search(rep, content)
if tmp:
return tmp.groups()[0].strip()
# caching_sha2_password
return 'mysql_native_password'
def getInitdTpl(version=''): def getInitdTpl(version=''):
path = getPluginDir() + '/init.d/mysql' + version + '.tpl' path = getPluginDir() + '/init.d/mysql' + version + '.tpl'
@@ -182,7 +192,11 @@ def pMysqlDb():
def makeInitRsaKey(version=''): def makeInitRsaKey(version=''):
datadir = getServerDir() + "/data" try:
datadir = getDataDir()
except Exception as e:
datadir = getServerDir() + "/data"
mysql_pem = datadir + "/mysql.pem" mysql_pem = datadir + "/mysql.pem"
if not os.path.exists(mysql_pem): if not os.path.exists(mysql_pem):
rdata = mw.execShell( rdata = mw.execShell(
@@ -395,22 +409,6 @@ def cleanBinLog():
db.execute("PURGE MASTER LOGS BEFORE '" + cleanTime + "';") db.execute("PURGE MASTER LOGS BEFORE '" + cleanTime + "';")
return mw.returnJson(True, '清理BINLOG成功!') return mw.returnJson(True, '清理BINLOG成功!')
def setSkipGrantTables(v):
'''
设置是否密码验证
'''
conf = getConf()
con = mw.readFile(conf)
if v:
if con.find('#skip-grant-tables') != -1:
con = con.replace('#skip-grant-tables', 'skip-grant-tables')
else:
con = con.replace('skip-grant-tables', '#skip-grant-tables')
mw.writeFile(conf, con)
return True
def getErrorLog(): def getErrorLog():
args = getArgs() args = getArgs()
filename = getErrorLogsFile() filename = getErrorLogsFile()
@@ -516,20 +514,22 @@ def initMysqlPwd():
hostname = mw.execShell('hostname')[0].strip() hostname = mw.execShell('hostname')[0].strip()
if hostname != 'localhost': if hostname != 'localhost':
drop_hostname = serverdir + '/bin/mysql --defaults-file=' + \ drop_hostname = serverdir + '/bin/mysql --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop user \'\'@\'' + hostname + '\'";' myconf + ' -uroot -p"' + pwd + '" -e "drop user \'\'@\'' + hostname + '\'";'
mw.execShell(drop_hostname) mw.execShell(drop_hostname)
drop_root_hostname = serverdir + '/bin/mysql --defaults-file=' + \ drop_root_hostname = serverdir + '/bin/mysql --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop user \'root\'@\'' + hostname + '\'";' myconf + ' -uroot -p"' + pwd + '" -e "drop user \'root\'@\'' + hostname + '\'";'
mw.execShell(drop_root_hostname) mw.execShell(drop_root_hostname)
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
return True return True
def initMysql8Pwd(): def initMysql8Pwd():
time.sleep(8) time.sleep(8)
auth_policy = getAuthPolicy()
serverdir = getServerDir() serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf" myconf = serverdir + "/etc/my.cnf"
@@ -543,7 +543,7 @@ def initMysql8Pwd():
alter_root_pwd = alter_root_pwd + \ alter_root_pwd = alter_root_pwd + \
"alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';" "alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
alter_root_pwd = alter_root_pwd + \ alter_root_pwd = alter_root_pwd + \
"alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '" + pwd + "';" "alter user 'root'@'localhost' IDENTIFIED WITH "+auth_policy+" by '" + pwd + "';"
alter_root_pwd = alter_root_pwd + "flush privileges;" alter_root_pwd = alter_root_pwd + "flush privileges;"
cmd_pass = serverdir + '/bin/mysqladmin --defaults-file=' + \ cmd_pass = serverdir + '/bin/mysqladmin --defaults-file=' + \
@@ -562,7 +562,7 @@ def initMysql8Pwd():
# 删除测试数据库 # 删除测试数据库
drop_test_db = serverdir + '/bin/mysql --defaults-file=' + \ drop_test_db = serverdir + '/bin/mysql --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop database test";' myconf + ' -uroot -p"' + pwd + '" -e "drop database test";'
mw.execShell(drop_test_db) mw.execShell(drop_test_db)
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
@@ -571,11 +571,11 @@ def initMysql8Pwd():
hostname = mw.execShell('hostname')[0].strip() hostname = mw.execShell('hostname')[0].strip()
if hostname != 'localhost': if hostname != 'localhost':
drop_hostname = serverdir + '/bin/mysql --defaults-file=' + \ drop_hostname = serverdir + '/bin/mysql --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop user \'\'@\'' + hostname + '\'";' myconf + ' -uroot -p"' + pwd + '" -e "drop user \'\'@\'' + hostname + '\'";'
mw.execShell(drop_hostname) mw.execShell(drop_hostname)
drop_root_hostname = serverdir + '/bin/mysql --defaults-file=' + \ drop_root_hostname = serverdir + '/bin/mysql --defaults-file=' + \
myconf + ' -uroot -p' + pwd + ' -e "drop user \'root\'@\'' + hostname + '\'";' myconf + ' -uroot -p"' + pwd + '" -e "drop user \'root\'@\'' + hostname + '\'";'
mw.execShell(drop_root_hostname) mw.execShell(drop_root_hostname)
return True return True
@@ -620,6 +620,10 @@ def my8cmd(version, method):
isInited = initMysql57Data() isInited = initMysql57Data()
elif version == '8.0': elif version == '8.0':
isInited = initMysql8Data() isInited = initMysql8Data()
elif version == '8.2':
isInited = initMysql8Data()
elif version == '8.3':
isInited = initMysql8Data()
if not isInited: if not isInited:
@@ -660,7 +664,7 @@ def my8cmd(version, method):
def appCMD(version, action): def appCMD(version, action):
makeInitRsaKey(version) makeInitRsaKey(version)
if version == '8.0' or version == '5.7': if float(version) >= 5.7:
status = my8cmd(version, action) status = my8cmd(version, action)
else: else:
status = myOp(version, action) status = myOp(version, action)
@@ -792,7 +796,7 @@ def getMyPort():
return tmp.groups()[0].strip() return tmp.groups()[0].strip()
def setMyPort(): def setMyPort(version):
args = getArgs() args = getArgs()
data = checkArgs(args, ['port']) data = checkArgs(args, ['port'])
if not data[0]: if not data[0]:
@@ -804,7 +808,7 @@ def setMyPort():
rep = "port\s*=\s*([0-9]+)\s*\n" rep = "port\s*=\s*([0-9]+)\s*\n"
content = re.sub(rep, 'port = ' + port + '\n', content) content = re.sub(rep, 'port = ' + port + '\n', content)
mw.writeFile(file, content) mw.writeFile(file, content)
restart() restart(version)
return mw.returnJson(True, '编辑成功!') return mw.returnJson(True, '编辑成功!')
@@ -1052,7 +1056,7 @@ def importDbExternal():
myPass(True, pwd) myPass(True, pwd)
mysql_cmd = getServerDir() + '/bin/mysql --defaults-file=' + my_cnf + \ mysql_cmd = getServerDir() + '/bin/mysql --defaults-file=' + my_cnf + \
' -uroot -p\"' + pwd + '\" -f ' + name + ' < ' + import_sql ' -uroot -p"' + pwd + '" -f ' + name + ' < ' + import_sql
# print(mysql_cmd) # print(mysql_cmd)
rdata = mw.execShell(mysql_cmd) rdata = mw.execShell(mysql_cmd)
@@ -1090,8 +1094,8 @@ def importDbBackup():
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
sock = getSocketFile() sock = getSocketFile()
mysql_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \ mysql_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p"' + pwd + \
' ' + name + ' < ' + file_path_sql '" ' + name + ' < ' + file_path_sql
# print(mysql_cmd) # print(mysql_cmd)
# os.system(mysql_cmd) # os.system(mysql_cmd)
@@ -1259,7 +1263,7 @@ def syncGetDatabases():
host = user["Host"] host = user["Host"]
break break
ps = mw.getMsg('INPUT_PS') ps = vdb_name
if vdb_name == 'test': if vdb_name == 'test':
ps = mw.getMsg('DATABASE_TEST') ps = mw.getMsg('DATABASE_TEST')
addTime = time.strftime('%Y-%m-%d %X', time.localtime()) addTime = time.strftime('%Y-%m-%d %X', time.localtime())
@@ -1331,12 +1335,20 @@ def setRootPwd(version=''):
if not data[0]: if not data[0]:
return data[1] return data[1]
#强制修改
force = 0
if 'force' in args and args['force'] == '1':
force = 1
password = args['password'] password = args['password']
try: try:
pdb = pMysqlDb() pdb = pMysqlDb()
result = pdb.query("show databases") result = pdb.query("show databases")
isError = isSqlError(result) isError = isSqlError(result)
if isError != None: if isError != None:
if force == 1:
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '【强制修改】数据库root密码修改成功(不意为成功连接数据)!')
return isError return isError
if version.find('5.7') > -1 or version.find('8.0') > -1: if version.find('5.7') > -1 or version.find('8.0') > -1:
@@ -1351,7 +1363,12 @@ def setRootPwd(version=''):
"update mysql.user set Password=password('" + password + "') where User='root'") "update mysql.user set Password=password('" + password + "') where User='root'")
pdb.execute("flush privileges") pdb.execute("flush privileges")
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,)) pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (password,))
return mw.returnJson(True, '数据库root密码修改成功!')
msg = ''
if force == 1:
msg = ',无须强制!'
return mw.returnJson(True, '数据库root密码修改成功!'+msg)
except Exception as ex: except Exception as ex:
return mw.returnJson(False, '修改错误:' + str(ex)) return mw.returnJson(False, '修改错误:' + str(ex))
@@ -1561,15 +1578,79 @@ def setDbAccess():
return mw.returnJson(True, '设置成功!') return mw.returnJson(True, '设置成功!')
def openSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('#skip-grant-tables','skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def closeSkipGrantTables():
mycnf = getConf()
content = mw.readFile(mycnf)
content = content.replace('skip-grant-tables','#skip-grant-tables')
mw.writeFile(mycnf, content)
return True
def resetDbRootPwd(version):
serverdir = getServerDir()
myconf = serverdir + "/etc/my.cnf"
pwd = mw.getRandomString(16)
pSqliteDb('config').where('id=?', (1,)).save('mysql_root', (pwd,))
if float(version) < 5.7:
cmd_pass = serverdir + '/bin/mysql --defaults-file=' + myconf + ' -uroot -e'
cmd_pass = cmd_pass + '"UPDATE mysql.user SET password=PASSWORD(\'' + pwd + "') WHERE user='root';"
cmd_pass = cmd_pass + 'flush privileges;"'
data = mw.execShell(cmd_pass)
# print(data)
else:
auth_policy = getAuthPolicy()
reset_pwd = 'flush privileges;'
reset_pwd = reset_pwd + \
"UPDATE mysql.user SET authentication_string='' WHERE user='root';"
reset_pwd = reset_pwd + "flush privileges;"
reset_pwd = reset_pwd + \
"alter user 'root'@'localhost' IDENTIFIED by '" + pwd + "';"
reset_pwd = reset_pwd + \
"alter user 'root'@'localhost' IDENTIFIED WITH "+auth_policy+" by '" + pwd + "';"
reset_pwd = reset_pwd + "flush privileges;"
tmp_file = "/tmp/mysql_init_tmp.log"
mw.writeFile(tmp_file, reset_pwd)
cmd_pass = serverdir + '/bin/mysql --defaults-file=' + myconf + ' -uroot -proot < ' + tmp_file
data = mw.execShell(cmd_pass)
# print(data)
os.remove(tmp_file)
return True
def fixDbAccess(version): def fixDbAccess(version):
pdb = pMysqlDb()
mdb_ddir = getDataDir()
if not os.path.exists(mdb_ddir):
return mw.returnJson(False, '数据目录不存在,尝试重启重建!')
try: try:
pdb = pMysqlDb()
data = pdb.query('show databases') data = pdb.query('show databases')
isError = isSqlError(data) isError = isSqlError(data)
if isError != None: if isError != None:
# 重置密码
appCMD(version, 'stop') appCMD(version, 'stop')
mw.execShell("rm -rf " + getServerDir() + "/data") openSkipGrantTables()
appCMD(version, 'start') appCMD(version, 'start')
time.sleep(3)
resetDbRootPwd(version)
appCMD(version, 'stop')
closeSkipGrantTables()
appCMD(version, 'start')
return mw.returnJson(True, '修复成功!') return mw.returnJson(True, '修复成功!')
return mw.returnJson(True, '正常无需修复!') return mw.returnJson(True, '正常无需修复!')
except Exception as e: except Exception as e:
@@ -2123,12 +2204,14 @@ def addMasterRepSlaveUser(version=''):
pdb = pMysqlDb() pdb = pMysqlDb()
psdb = pSqliteDb('master_replication_user') psdb = pSqliteDb('master_replication_user')
auth_policy = getAuthPolicy()
if psdb.where("username=?", (username)).count() > 0: if psdb.where("username=?", (username)).count() > 0:
return mw.returnJson(False, '用户已存在!') return mw.returnJson(False, '用户已存在!')
if version == "8.0": if version == "8.0":
sql = "CREATE USER '" + username + \ sql = "CREATE USER '" + username + \
"' IDENTIFIED WITH mysql_native_password BY '" + password + "';" "' IDENTIFIED WITH "+auth_policy+" BY '" + password + "';"
pdb.execute(sql) pdb.execute(sql)
sql = "grant replication slave on *.* to '" + username + "'@'%';" sql = "grant replication slave on *.* to '" + username + "'@'%';"
result = pdb.execute(sql) result = pdb.execute(sql)
@@ -2517,6 +2600,10 @@ def trySlaveSyncBugfix(version=''):
gtid_purged = '' gtid_purged = ''
var_slave_gtid = sdb.query('show VARIABLES like "%gtid_purged%"')
if len(var_slave_gtid) > 0:
gtid_purged += var_slave_gtid[0]['Value'] + ','
for i in range(len(slave_sync_data)): for i in range(len(slave_sync_data)):
port = slave_sync_data[i]['port'] port = slave_sync_data[i]['port']
password = slave_sync_data[i]['pass'] password = slave_sync_data[i]['pass']
@@ -2536,6 +2623,8 @@ def trySlaveSyncBugfix(version=''):
if len(var_gtid) > 0: if len(var_gtid) > 0:
gtid_purged += var_gtid[0]['Value'] + ',' gtid_purged += var_gtid[0]['Value'] + ','
gtid_purged = gtid_purged.strip(',') gtid_purged = gtid_purged.strip(',')
sql = "set @@global.gtid_purged='" + gtid_purged + "'" sql = "set @@global.gtid_purged='" + gtid_purged + "'"
@@ -2865,6 +2954,8 @@ def doFullSyncUser(version=''):
ip = data['ip'] ip = data['ip']
bak_file = '/tmp/tmp.sql' bak_file = '/tmp/tmp.sql'
if os.path.exists(bak_file):
os.system("rm -rf " + bak_file)
writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0}) writeDbSyncStatus({'code': 0, 'msg': '开始同步...', 'progress': 0})
dmp_option = '' dmp_option = ''
@@ -2872,22 +2963,32 @@ def doFullSyncUser(version=''):
if mode == 'gtid': if mode == 'gtid':
dmp_option = ' --set-gtid-purged=off ' dmp_option = ' --set-gtid-purged=off '
writeDbSyncStatus({'code': 1, 'msg': '远程导出数据...', 'progress': 20}) time.sleep(1)
writeDbSyncStatus({'code': 1, 'msg': '正在停止从库...', 'progress': 15})
if version == '8.0':
db.query("stop slave user='{}' password='{}';".format(user, apass))
else:
db.query("stop slave")
time.sleep(2)
writeDbSyncStatus({'code': 2, 'msg': '远程导出数据...', 'progress': 20})
if not os.path.exists(bak_file): if not os.path.exists(bak_file):
dump_sql_data = getServerDir() + "/bin/mysqldump " + dmp_option + " --force --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \ dump_sql_data = getServerDir() + "/bin/mysqldump " + dmp_option + " --force --opt --default-character-set=utf8 --single-transaction -h" + ip + " -P" + \
port + " -u" + user + " -p\"" + apass + \ port + " -u" + user + " -p'" + apass + \
"\" --ssl-mode=DISABLED " + sync_db + " > " + bak_file "' --ssl-mode=DISABLED " + sync_db + " > " + bak_file
# print(dump_sql_data) print(dump_sql_data)
mw.execShell(dump_sql_data) mw.execShell(dump_sql_data)
writeDbSyncStatus({'code': 2, 'msg': '本地导入数据...', 'progress': 40})
writeDbSyncStatus({'code': 3, 'msg': '正在到本地导入数据中...', 'progress': 40})
if os.path.exists(bak_file): if os.path.exists(bak_file):
pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root') pwd = pSqliteDb('config').where('id=?', (1,)).getField('mysql_root')
sock = getSocketFile() sock = getSocketFile()
my_import_cmd = getServerDir() + '/bin/mysql -S ' + sock + ' -uroot -p' + pwd + \ my_import_cmd = getServerDir() + '/bin/mysql -S ' + sock + " -uroot -p'" + pwd + \
' ' + sync_db_import + ' < ' + bak_file "' " + sync_db_import + ' < ' + bak_file
# print(my_import_cmd) print(my_import_cmd)
mw.execShell(my_import_cmd) mw.execShell(my_import_cmd)
if version == '8.0': if version == '8.0':
@@ -3133,8 +3234,6 @@ if __name__ == "__main__":
print(binLog()) print(binLog())
elif func == 'binlog_list': elif func == 'binlog_list':
print(binLogList()) print(binLogList())
elif func == 'binlog_look':
print(binLogListLook())
elif func == 'clean_bin_log': elif func == 'clean_bin_log':
print(cleanBinLog()) print(cleanBinLog())
elif func == 'error_log': elif func == 'error_log':
@@ -3148,7 +3247,7 @@ if __name__ == "__main__":
elif func == 'my_port': elif func == 'my_port':
print(getMyPort()) print(getMyPort())
elif func == 'set_my_port': elif func == 'set_my_port':
print(setMyPort()) print(setMyPort(version))
elif func == 'init_pwd': elif func == 'init_pwd':
print(initMysqlPwd()) print(initMysqlPwd())
elif func == 'root_pwd': elif func == 'root_pwd':
+3 -3
View File
@@ -9,9 +9,9 @@
"uninstall_pre_inspection":true, "uninstall_pre_inspection":true,
"checks": "server/mysql/VERSION/bin/mysql", "checks": "server/mysql/VERSION/bin/mysql",
"path": "server/mysql/VERSION", "path": "server/mysql/VERSION",
"todo_versions":["5.6","5.7","8.0"], "todo_versions":["5.6","5.7","8.0","8.2"],
"versions":["5.5", "5.6", "5.7","8.0"], "versions":["5.5", "5.6", "5.7","8.0","8.2","8.3"],
"updates":["5.5.62","5.6.50", "5.7.32","8.0.34"], "updates":["5.5.62","5.6.50", "5.7.32","8.0.34","8.2.0","8.3.0"],
"shell":"install.sh", "shell":"install.sh",
"checks":"server/mysql", "checks":"server/mysql",
"path":"server/mysql", "path":"server/mysql",
+3
View File
@@ -5,6 +5,9 @@ export PATH
# 手动主从设置 # 手动主从设置
# https://www.cnblogs.com/whiteY/p/17331882.html # https://www.cnblogs.com/whiteY/p/17331882.html
# cd /www/server/mdserver-web/plugins/mysql && bash install.sh install 8.2
# cd /www/server/mdserver-web && source bin/activate && python3 /www/server/mdserver-web/plugins/mysql/index.py try_slave_sync_bugfix {}
curPath=`pwd` curPath=`pwd`
rootPath=$(dirname "$curPath") rootPath=$(dirname "$curPath")
rootPath=$(dirname "$rootPath") rootPath=$(dirname "$rootPath")

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