Compare commits
1099 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 44c6a4ffe3 | |||
| 1ff071a59f | |||
| 6ae756d5ea | |||
| 744f1eb524 | |||
| c8494ddcb4 | |||
| 9633a54643 | |||
| 7e64e37ca2 | |||
| 14808a44e5 | |||
| 289c7765d4 | |||
| 37032d935f | |||
| 5378df1cf3 | |||
| 0c44305a01 | |||
| 9c4d482471 | |||
| 713f77c1ad | |||
| db2b71582b | |||
| ccc750cce3 | |||
| 0dc26232b6 | |||
| fa0fc8eefe | |||
| 1cadcde740 | |||
| a602cad2db | |||
| 0a400aeda9 | |||
| aaca85bc7e | |||
| fcba8a9269 | |||
| 8931a28286 | |||
| 8d4d72e14d | |||
| fa40d1dc92 | |||
| 4007d14517 | |||
| 389db5404c | |||
| 763065e7ab | |||
| c697f016aa | |||
| 1df3b8efd0 | |||
| bfce862180 | |||
| 3f0cc58bdc | |||
| 710482e9ed | |||
| 49dc230feb | |||
| bf6cca7b95 | |||
| 6281e7ae2d | |||
| 4f488ba75f | |||
| 1fa59d0a08 | |||
| ccc9bd26c5 | |||
| 1436a508a5 | |||
| a9aabdfa0c | |||
| a6d2081d22 | |||
| 88dba0e876 | |||
| 88c9680682 | |||
| 1e1157159a | |||
| b2fe48e1f2 | |||
| e1b5d6f8b1 | |||
| 003a0bfacc | |||
| 08b73394ee | |||
| ec9d4c050f | |||
| 6460a0d7db | |||
| f709a033a5 | |||
| 851d6829ee | |||
| 8b5f2aec6b | |||
| 32f911c3cf | |||
| ef74376c21 | |||
| 2752d758b5 | |||
| 296d4fb96d | |||
| 69f8a492c8 | |||
| 21cf32852b | |||
| 5eff5e7b1a | |||
| 9edd79e5f1 | |||
| 4c2a42fc48 | |||
| 10446a1934 | |||
| 3aeb2b0959 | |||
| e9807280d5 | |||
| 395f8b456a | |||
| ef7c9d4e47 | |||
| f8bea1c812 | |||
| 4a83cfba83 | |||
| 199aec01ca | |||
| 65d6b5e360 | |||
| dac412ad4e | |||
| 0f3aaf015a | |||
| d48be332ca | |||
| c943034145 | |||
| e453a8fa79 | |||
| b84b7ec0d0 | |||
| 22b3b1e90f | |||
| d1eb61bb84 | |||
| aba61490d4 | |||
| 298023f283 | |||
| e5e55431ed | |||
| 13c3a20e84 | |||
| b5a15244b3 | |||
| cb446ae89c | |||
| 83ccf6ff24 | |||
| 1eb20f7cb6 | |||
| 34574a36f1 | |||
| 91c8d1f47a | |||
| 0e5760eaa2 | |||
| 81a25eeedf | |||
| 627c9efb44 | |||
| e76db6c669 | |||
| c44e901992 | |||
| b88d03f316 | |||
| ede3872627 | |||
| 29b50e057c | |||
| ff75e0440f | |||
| 4ab8d5854b | |||
| d555cdacb8 | |||
| c704184884 | |||
| 9e58352fad | |||
| 0c7a32f372 | |||
| 604c5bc8a0 | |||
| 87c97694f7 | |||
| aee7c53729 | |||
| 22e0ba7043 | |||
| 280de58a54 | |||
| b6774d8656 | |||
| 268eb0eb2d | |||
| fac0e1179b | |||
| 985c6f0a67 | |||
| db1d9320bd | |||
| 0a110c4afa | |||
| e436375090 | |||
| 8723ad9577 | |||
| f8693c8cc3 | |||
| 1a1b0a59ee | |||
| af22a68540 | |||
| 696df06794 | |||
| 9886e43335 | |||
| 3bd5886a6c | |||
| aa071bfb15 | |||
| 98d3001861 | |||
| 36b55cc73c | |||
| 80f64066a7 | |||
| a5ce95d831 | |||
| b07409050a | |||
| a2ee7c9092 | |||
| f9c9c91490 | |||
| dca43f812d | |||
| d93329478d | |||
| 3d296e4099 | |||
| b7f9485ff6 | |||
| 65bd3fefa9 | |||
| 5a4c831809 | |||
| 3c6ce19b3a | |||
| cdb6966455 | |||
| 27c8142602 | |||
| c04779efe2 | |||
| be5a9f7b4b | |||
| 1564047a26 | |||
| e561a909e7 | |||
| 3e06062784 | |||
| 65a2af748b | |||
| febd9de71b | |||
| 870808b31b | |||
| debfdabde9 | |||
| 6cf7152478 | |||
| f75d121a59 | |||
| 407b5a619a | |||
| b46bc89cb9 | |||
| cb587b18bd | |||
| 8b67421c0c | |||
| 64f882c6b8 | |||
| eb6590a275 | |||
| 595c238fb5 | |||
| 80d1e4efe7 | |||
| 8ee6f9d190 | |||
| 94a2f88633 | |||
| 605cf36e9c | |||
| 21194aa285 | |||
| e3876de3d2 | |||
| 1e054f9801 | |||
| df048c6bd6 | |||
| 3056fb9ceb | |||
| bb655b55e5 | |||
| 97ab18a771 | |||
| 26760502d0 | |||
| 126c7e08e3 | |||
| 5e55cf753e | |||
| da8b0ccbfc | |||
| c746e8e139 | |||
| 0e2df5620e | |||
| b1b43120ea | |||
| e854cc083f | |||
| 791f2b8ec9 | |||
| 0c6b293337 | |||
| da9b3bf435 | |||
| 301086faa1 | |||
| 3b6b54103b | |||
| 6dda90b64f | |||
| d28fcce8b6 | |||
| ba2da974c9 | |||
| 024f8bd62f | |||
| fe7853781b | |||
| d92010bfe0 | |||
| 2631f1771c | |||
| 4cf7a6b8fe | |||
| af460ffed6 | |||
| a7982c4df3 | |||
| 0850654da8 | |||
| 086e050914 | |||
| 4c57b9a2e6 | |||
| ca7095c65a | |||
| 2c3f2e797d | |||
| cccd3ff7fc | |||
| effc3ba296 | |||
| e96fdea003 | |||
| 00a43549a2 | |||
| ebd09842a2 | |||
| 1eccc9cb7c | |||
| a44df8dd9a | |||
| 58d78d5c5d | |||
| 9babeb4373 | |||
| 8345bd8bb5 | |||
| 9106246891 | |||
| 21209a75d8 | |||
| 3b6d50661b | |||
| 295cc70e0a | |||
| c7fa266ae1 | |||
| 8788afc35f | |||
| 44c55ee923 | |||
| 2073fbd680 | |||
| 1b876d4cac | |||
| 0961b233e0 | |||
| 184bcf88d7 | |||
| 3f07a11b53 | |||
| aa3a66cf01 | |||
| 0bc8f670f5 | |||
| 63cb8f0e84 | |||
| 5a17df7c5c | |||
| 3ce9735ff8 | |||
| 1819b814a3 | |||
| f5c5bd03e6 | |||
| 04c6d4b3cc | |||
| 7e5116ba59 | |||
| 44d254415e | |||
| 0efba47c53 | |||
| c7be9b7230 | |||
| 311310e04c | |||
| 59ca997372 | |||
| 27a96495ae | |||
| cd1662761b | |||
| 4995131e24 | |||
| ae9989a13f | |||
| db143ea39f | |||
| 7582b0e6ba | |||
| 1ce6cbef51 | |||
| e136330e36 | |||
| 346f09dabd | |||
| 0d56f1ab5f | |||
| 2f771b1f05 | |||
| 1862e68c52 | |||
| aaca9cc654 | |||
| bda83eb434 | |||
| 6f5838306d | |||
| 615e1b60b7 | |||
| 4300a532ba | |||
| 52c92183f5 | |||
| feda58b8c4 | |||
| a41d0b4553 | |||
| 68e9fa157d | |||
| 81f79582b5 | |||
| 552aa85eb6 | |||
| 5119e522d4 | |||
| 46f112fe7f | |||
| 2215c1bd38 | |||
| aa38037087 | |||
| b48efb4607 | |||
| 3c22dd6380 | |||
| 9127ed5220 | |||
| a04c6b46af | |||
| ed7bc1cdf3 | |||
| 6d191fc162 | |||
| b14f22a0cf | |||
| bb9fe44a0f | |||
| ee6adfa83c | |||
| 8d990b3f96 | |||
| 9b0b5d1504 | |||
| aac1cc30a5 | |||
| e8f1cb4e02 | |||
| f973794e4a | |||
| 062a8917cb | |||
| 3c412c91f7 | |||
| b3f338e4e0 | |||
| 78f422c64a | |||
| 6f76846497 | |||
| 638426b81b | |||
| a982e8a0e2 | |||
| 79a2954486 | |||
| 3e73314cb1 | |||
| 92e94ab4e9 | |||
| 1e0ec8e17e | |||
| a1e0e95925 | |||
| ceb1a7828a | |||
| 02beb55896 | |||
| f53377cc7d | |||
| 02fbb7cdcf | |||
| 58059111c1 | |||
| f51cc16500 | |||
| 1d6fa13a94 | |||
| 6924adbda3 | |||
| 983dde38d2 | |||
| bda0753b77 | |||
| 93d9dbfd20 | |||
| 0a277b7e52 | |||
| 4825a1ca09 | |||
| 21dd6f39a8 | |||
| 261b85dbda | |||
| 4716cff256 | |||
| d86c6ad6ee | |||
| bd7906595a | |||
| f00478cf17 | |||
| 1a24d11137 | |||
| b8185e042f | |||
| 318cc79b8e | |||
| 389abf794f | |||
| 1d37ec38ee | |||
| fd2a9223ff | |||
| 84e7da76b5 | |||
| 90d30df686 | |||
| 9fa9ed9f6e | |||
| c26867c80b | |||
| 221a005fc7 | |||
| 7fb61a5121 | |||
| 6eadbcd53e | |||
| b43da4eea8 | |||
| 1590e1061c | |||
| 3ac32665b8 | |||
| 97f01aeb74 | |||
| 92e3bd82ef | |||
| ad2ce68a49 | |||
| 75f212bec7 | |||
| 13f6ee18f9 | |||
| 571d2056fb | |||
| 08ef87c77e | |||
| 5d2e7acc95 | |||
| 58e18e3ebb | |||
| a4731e0053 | |||
| db22749219 | |||
| 942c0023fb | |||
| 0b4fa3ea5c | |||
| e23b15ccd1 | |||
| 0f515829fe | |||
| 95a3de24b3 | |||
| 154b543f82 | |||
| 3b3f22f4fa | |||
| 6cce72c966 | |||
| 2309d07d26 | |||
| 3617eb6028 | |||
| 9ce4de6237 | |||
| 02e8c98de0 | |||
| 566c6d3b24 | |||
| 0b8d662be1 | |||
| 71602d2440 | |||
| 212aea1fc3 | |||
| 8a5d8236e9 | |||
| ad484adf2a | |||
| 04c2f9d155 | |||
| d387e0ef22 | |||
| dc74db0313 | |||
| 2bc336ea7d | |||
| 5b13be2dd9 | |||
| f94db9bcdc | |||
| da599b3947 | |||
| f559e19da8 | |||
| 866fc68a81 | |||
| 546bd4f577 | |||
| 37bc9a71b3 | |||
| fab204143a | |||
| 46a7f8d754 | |||
| e0b1f8b622 | |||
| ebf63d0fae | |||
| 53ed086f84 | |||
| 44555af3da | |||
| 042880b115 | |||
| eb99b18bd3 | |||
| eda0911a2e | |||
| 4a92866138 | |||
| 32f64b3dab | |||
| 3f94905735 | |||
| e7b69c46a3 | |||
| f1695efa6e | |||
| cd4996477b | |||
| 6490610c30 | |||
| 49e2eb47ef | |||
| 34504e80a8 | |||
| dccf70fef9 | |||
| d74ed17e9e | |||
| 72b2da6558 | |||
| 7cbc4e0d38 | |||
| 23889fbe29 | |||
| c44d9b4a52 | |||
| 1f00ebeefb | |||
| a06d55531e | |||
| 7f5dcc2667 | |||
| f1ec8ad714 | |||
| b1a03e50b2 | |||
| 85c80cfe28 | |||
| 89d15a2f10 | |||
| 6225e77eb8 | |||
| a1f03de98d | |||
| c8105363df | |||
| 5f416ba2d4 | |||
| bd6cb8f029 | |||
| 03e2b95305 | |||
| a9a26a3b84 | |||
| c89c4963a2 | |||
| ec83257a27 | |||
| 853234c4b6 | |||
| 29f2a3ce7e | |||
| 6da5641263 | |||
| 2b7514c5b4 | |||
| 65ba422c77 | |||
| 5edf8b8dda | |||
| 6384c1bd13 | |||
| 53398031b1 | |||
| 060b2160aa | |||
| b0d1586d78 | |||
| 0838f759a1 | |||
| d3a539638e | |||
| 59abf77572 | |||
| 1467efa015 | |||
| 56dca95325 | |||
| 5d705246b9 | |||
| 5423046937 | |||
| 3068007aa8 | |||
| a8f8e84ae3 | |||
| 3d66bb47bd | |||
| cc3757e869 | |||
| f6b9e2da54 | |||
| f752d99e8b | |||
| 69947f5353 | |||
| 4d73843e00 | |||
| f882c85e83 | |||
| d9c886ce95 | |||
| 200bf07644 | |||
| b981d89077 | |||
| 8ab69bf40f | |||
| b7a2b6cbf8 | |||
| d740ca4d2e | |||
| 1bb9613de1 | |||
| 73cf09e75e | |||
| fb5c483b22 | |||
| 8d9126ea80 | |||
| 81ddf69370 | |||
| 0545fffd8c | |||
| 8fa6060729 | |||
| 63c3e513be | |||
| 5249658207 | |||
| 10585f6406 | |||
| 72d5939ec3 | |||
| 6c65e45d00 | |||
| 89e3940771 | |||
| f802cc36d3 | |||
| d938affe9b | |||
| c1af2aaa63 | |||
| 1fec620adb | |||
| 245ee059a1 | |||
| b39bf7e4d7 | |||
| 9533cc3960 | |||
| 8eebaebdf6 | |||
| 6bde23e737 | |||
| 1a61754255 | |||
| 9496ee401b | |||
| e35b0ecf76 | |||
| f2505df3d7 | |||
| 45e8c22825 | |||
| f7115481dd | |||
| b728766677 | |||
| 6912798076 | |||
| 667210fc24 | |||
| b42710c0ed | |||
| 490df14a0a | |||
| 8e174f837d | |||
| 48c24c0126 | |||
| bd352d946e | |||
| d956531421 | |||
| 679c74b15a | |||
| 907e1ca275 | |||
| caefc23670 | |||
| 53510581aa | |||
| 27b1d94a86 | |||
| 8e6edf8cd7 | |||
| 2651ed8ecb | |||
| bffe9547ff | |||
| d6cae70249 | |||
| ff7e063f09 | |||
| 3b53bcbcdb | |||
| 497d6dd961 | |||
| 41d33eef54 | |||
| 2ff18a9cf9 | |||
| 0c43fcda07 | |||
| d0bb505b3f | |||
| a21cca51c3 | |||
| 30cb7516b1 | |||
| 06e6deff87 | |||
| a4ce338088 | |||
| 45c7430af3 | |||
| b0b34a6ea1 | |||
| 0fcada900b | |||
| ca5729e26d | |||
| 22eed3f67b | |||
| cd0799cc15 | |||
| a0724c4fa9 | |||
| 0145d8db47 | |||
| 7ba4d2332d | |||
| fb5e522a81 | |||
| 71dae04946 | |||
| 8418c3c3a0 | |||
| 94ac06b35c | |||
| 9fd6160571 | |||
| 4b9ffbe71f | |||
| 8018682049 | |||
| f44ff2fb0d | |||
| 7a79388978 | |||
| 0d5af34b19 | |||
| d05f5ebff8 | |||
| 4c64feef62 | |||
| 0491503774 | |||
| fa67ee7e71 | |||
| 1ae0682d77 | |||
| 357749f22d | |||
| 9a078193bd | |||
| fd9746b7ef | |||
| a2de2b6ff1 | |||
| 970706028a | |||
| ced6c480d1 | |||
| d795097290 | |||
| 084a21a071 | |||
| 590a13256d | |||
| 49c2250900 | |||
| a6d70cd8a6 | |||
| ed6d8e0d34 | |||
| c0f37ceb08 | |||
| d2160f388d | |||
| 1617bd521a | |||
| 15e475d667 | |||
| ed779fd026 | |||
| 214634606f | |||
| afaecef2d7 | |||
| c76920f531 | |||
| 1657823988 | |||
| df9c7928ae | |||
| f44710c0f1 | |||
| adbfe2fdef | |||
| 910198ffc3 | |||
| 19a172347f | |||
| ccf00d17f6 | |||
| 1ac01637ef | |||
| 3861de61aa | |||
| 549686b9ef | |||
| c484fd5136 | |||
| 1f3cb33bd2 | |||
| 438628c773 | |||
| aeac132b09 | |||
| 8664186f7c | |||
| 07e716c95f | |||
| 092b9ed4e8 | |||
| 2ae578a010 | |||
| df14029aa9 | |||
| 4b3c44cc18 | |||
| 859df3cb04 | |||
| 51485fcabb | |||
| 43d2dcb81c | |||
| 9d020beff0 | |||
| 02af143025 | |||
| 826bf7f540 | |||
| 8f4b72d551 | |||
| 67dbfc8569 | |||
| 71c7a38297 | |||
| 7c3ba76494 | |||
| a223f1e722 | |||
| a71d0b5a55 | |||
| 37cb8c3898 | |||
| c3b4fffd17 | |||
| b3c917f456 | |||
| 7f58398a43 | |||
| 777eb0c4a2 | |||
| 9c69443e2f | |||
| 440f68529c | |||
| 50706f9286 | |||
| 44e3434b6d | |||
| a096631ab0 | |||
| 25ee8ab83b | |||
| 28a9fdcdc8 | |||
| ee12d11709 | |||
| 6db083584e | |||
| d833c9b441 | |||
| 7c2e77dbc5 | |||
| 2e0dcb9b00 | |||
| 6063ce9fcb | |||
| 2d6c2e8f9c | |||
| e6b9427b3a | |||
| 6a0a53ce7e | |||
| 5cec4d5c82 | |||
| 0d403c9c8f | |||
| c1e66ba5a7 | |||
| 94c3d7d2e2 | |||
| 202cfdb628 | |||
| d9176781ab | |||
| 0979dc67e8 | |||
| 2e02f6d274 | |||
| 3893f057e1 | |||
| 7a25982022 | |||
| 824abad8e5 | |||
| 94239e2e44 | |||
| 72f1d1c43a | |||
| a026da484f | |||
| 2e5c5efde7 | |||
| 72edb784db | |||
| 53c66ed216 | |||
| f510735231 | |||
| e6ea2737c0 | |||
| 65e84830a2 | |||
| 687decec5f | |||
| 967ca42c6b | |||
| 457f861ee0 | |||
| 572a8d82b0 | |||
| 0cbf7bb65a | |||
| 647c997a21 | |||
| 1575e2976b | |||
| 9198799caa | |||
| e766058c57 | |||
| d7c758ccd5 | |||
| ed3f29b824 | |||
| 789bd8fd70 | |||
| c4f11af537 | |||
| fe939bc073 | |||
| ae18a12894 | |||
| 0f51e27a14 | |||
| 3409849c4a | |||
| 72900d7df6 | |||
| 2dae8ff902 | |||
| b1dbaf1d6d | |||
| 7bd49e6de1 | |||
| a63bf8c39a | |||
| 8e14e0c82f | |||
| e631259caa | |||
| ff7b6a52e6 | |||
| f336d977ef | |||
| 3b9d2c8c37 | |||
| 22699b9d6b | |||
| 2468e8ca6b | |||
| dfad245187 | |||
| 3d2bc25355 | |||
| 1f4095fa65 | |||
| 6898193218 | |||
| fccf4fcd5b | |||
| 183b142203 | |||
| 70e87ff5d6 | |||
| 77174243ed | |||
| db4136ef62 | |||
| 220ca5a0a2 | |||
| 9bdf449d38 | |||
| e2be44ad78 | |||
| 3913a77265 | |||
| f395469a09 | |||
| 0101516935 | |||
| d726fca5d0 | |||
| 39902363ab | |||
| 4b93a7e3a1 | |||
| 9152fca0c9 | |||
| e5393b2127 | |||
| 034939a0c5 | |||
| d35c6bb02f | |||
| 56746d9c01 | |||
| b2fe702d51 | |||
| c6282d5660 | |||
| a2851b2787 | |||
| 26f41228db | |||
| f5cb06ea53 | |||
| a16441e87d | |||
| 3b4601e083 | |||
| 556f8175e8 | |||
| 13d6128e39 | |||
| 3bd56d161a | |||
| eed88c721e | |||
| 0fbb507b07 | |||
| 57516929c1 | |||
| a8d6a7eaf2 | |||
| 49022b2f57 | |||
| a7cd64a54c | |||
| db4a7af2b5 | |||
| c746876026 | |||
| 7578aa32ae | |||
| 9cae0dc4ab | |||
| cc97c6299d | |||
| e6e0f7dea7 | |||
| bdfcf9179d | |||
| cdb50b681f | |||
| 8ca50abb0c | |||
| 0196a7a622 | |||
| 835a575535 | |||
| d54d123850 | |||
| 83f033427d | |||
| de8242e5e5 | |||
| 8f416db0ad | |||
| 2323cbdf77 | |||
| 925bb15d7b | |||
| 50e18bb3d9 | |||
| c15b97f2ba | |||
| f367f10d02 | |||
| 9ee3e2a88e | |||
| 5e0f877d20 | |||
| 6e3d9e6983 | |||
| b1d04333bf | |||
| 1af55a1dd3 | |||
| 5f9cee95e6 | |||
| f139587464 | |||
| 0f2ee7ae54 | |||
| eff62918ba | |||
| 345808c200 | |||
| 15eabc51cb | |||
| a7c6a89583 | |||
| 5acba5ad76 | |||
| 40f782c602 | |||
| 1c0ac62b4f | |||
| 3d13ab9096 | |||
| 29bdbf0d5e | |||
| 555fdb4ff0 | |||
| 541d74fc71 | |||
| aee77b2ec6 | |||
| fdbc8ad689 | |||
| 3200412e0b | |||
| 39af5b6702 | |||
| c18f3c11f6 | |||
| f5e55d4f58 | |||
| 2438d2ab61 | |||
| 7bd906d374 | |||
| 6a326649f9 | |||
| 72636d598f | |||
| bd6635ee09 | |||
| ef9bb2c4a6 | |||
| f8f892e323 | |||
| 7eeec1625b | |||
| 26a33573fd | |||
| 72c7044465 | |||
| 5191c711c3 | |||
| 6a536c14fd | |||
| 63a965f978 | |||
| e2b4c330fc | |||
| 02431fdd9e | |||
| 7a8bd83ab8 | |||
| 3475dd5036 | |||
| 8771059682 | |||
| 48990384df | |||
| 0c84f0da80 | |||
| a1d701cd9f | |||
| b23315f19b | |||
| 0ee844ee5b | |||
| 0d4d20553d | |||
| 457a86b742 | |||
| 3482d5cb3e | |||
| 4ce30ff46e | |||
| bceec90de4 | |||
| 3e396f9e60 | |||
| 9370884eb5 | |||
| 8627925274 | |||
| 2bfb240c7f | |||
| acbf965f94 | |||
| 74800f70bc | |||
| 003c8f856c | |||
| 29c3557c66 | |||
| f7f8a5042a | |||
| 19911de04f | |||
| 954df1b522 | |||
| e1d6a16672 | |||
| 536138b9ce | |||
| 33e311f98e | |||
| 66c542dbc8 | |||
| bd333d9854 | |||
| ecad6fe891 | |||
| f709bef197 | |||
| 980392b811 | |||
| 497217446b | |||
| f82c66a6bd | |||
| e1c10caf81 | |||
| bdea272028 | |||
| e6e6dab8f6 | |||
| 03655f16eb | |||
| b11f8793e3 | |||
| 595219da19 | |||
| 735aa7224b | |||
| 8a522c43e5 | |||
| c5b6df846b | |||
| 4326e2c7ca | |||
| d899e332e0 | |||
| 0eeedf22ea | |||
| c56e487e8d | |||
| 0d753f0c9d | |||
| 9a3855f2df | |||
| 7d4a0bb1d4 | |||
| 49be7f3779 | |||
| 01288d2fa9 | |||
| 527a1a70c8 | |||
| cfe1b29518 | |||
| c0335f0936 | |||
| f1156b221d | |||
| 43c260522c | |||
| 2272242493 | |||
| 4bc68d1f17 | |||
| 3f0957e3df | |||
| 77c5ead2b6 | |||
| 19674add02 | |||
| 064bd1a810 | |||
| 1f11d6b622 | |||
| e5374afee3 | |||
| c874c3e6b2 | |||
| bdc5c7b85c | |||
| 9b55c92dc2 | |||
| b838831970 | |||
| 21fcf429b6 | |||
| 8d19106412 | |||
| 4b6460bd5b | |||
| 5c5cddd1bf | |||
| 5b6db26617 | |||
| a40fc46f47 | |||
| 490daa14de | |||
| a022ea419f | |||
| 54c6ab3f08 | |||
| 83a9accf0f | |||
| 956e3b3ca2 | |||
| 83cf0c2604 | |||
| 7999108b91 | |||
| b80de25598 | |||
| 7c25ae0ec2 | |||
| 84e9c4a484 | |||
| 5178e11e44 | |||
| 0e7c2769c8 | |||
| 6651a706b7 | |||
| a81f922592 | |||
| 2b87887054 | |||
| 7859bfb451 | |||
| 35369f8f41 | |||
| a47166d547 | |||
| 457a69b34a | |||
| 881f571902 | |||
| d889c3305f | |||
| cb793d5f3f | |||
| b4882aa0fc | |||
| ef3b5b2a6c | |||
| d4501b736b | |||
| 261e24390f | |||
| 10abbd7efd | |||
| e2196735d9 | |||
| dbbc243359 | |||
| 94bb8e31cf | |||
| 282bcccf39 | |||
| 886f6c2369 | |||
| ab822f0572 | |||
| 4ec2355182 | |||
| a4237ca213 | |||
| 4615b70c60 | |||
| 97b9d12769 | |||
| 35a7c2d96f | |||
| 11ea1e2e1f | |||
| 1860dda320 | |||
| 5610b1b1da | |||
| 422dea0e3f | |||
| d52a355cc9 | |||
| 389d87c2b5 | |||
| 7ef8322731 | |||
| d1a0b32bf6 | |||
| 295cb399e3 | |||
| db9477c22e | |||
| b2ae6b67d6 | |||
| bf5f0cecff | |||
| 251503952d | |||
| 60445a565d | |||
| 6a8db02aa7 | |||
| ac50b335c3 | |||
| c9826d5daf | |||
| ada8225e05 | |||
| 613ca4bce0 | |||
| 1bdfb0625a | |||
| ad2e33fcd2 | |||
| 6e846a4a51 | |||
| dc76f0ca33 | |||
| c619f00c54 | |||
| 015b132b85 | |||
| 4e4b4ad308 | |||
| 1226caaa39 | |||
| 5a92027f20 | |||
| ea6ed08461 | |||
| 009231bbcf | |||
| d6fa8ca2a5 | |||
| e3bfca777d | |||
| 292fb9362a | |||
| f68a8c88d7 | |||
| 4175a71547 | |||
| 0a5680de12 | |||
| b3df13210d | |||
| 55c9cb8856 | |||
| 740ad102ea | |||
| 1af0097673 | |||
| b86a2f4243 | |||
| 9500e4a39d | |||
| 73b5d91ddc | |||
| 645cf21898 | |||
| 04e4e5a9dd | |||
| 3d215ba96d | |||
| 9b7722f847 | |||
| 040a6c0ed1 | |||
| ef2a04e886 | |||
| e656c64fee | |||
| 0ee24a763a | |||
| 26120018c6 | |||
| ae78b0aa8c | |||
| 3cca69ae9f | |||
| 422460c422 | |||
| 47a60b3465 | |||
| 701ff6f817 | |||
| 385fa4bb5d | |||
| f410727d42 | |||
| f9baee0a4a | |||
| c97e1ad3a7 | |||
| deaa193478 | |||
| e290af5403 | |||
| f6f160883c | |||
| 0a2f8c9765 | |||
| 788a672e74 | |||
| 2a078d3290 | |||
| 03d3761805 | |||
| 6d16ae5767 | |||
| 66c9828b68 | |||
| cf2ea6e16c | |||
| b2533943ed | |||
| 5c9ccd9bd2 | |||
| fa48db5f1b | |||
| 79a45082c1 | |||
| 7998afb78a | |||
| 492f875205 | |||
| 5e767fde08 | |||
| 15acc8c67c | |||
| 6234188ceb | |||
| 36842c8b2c | |||
| 089de80c59 | |||
| c60e9aabcd | |||
| 3195f915f5 | |||
| 24191e082a | |||
| c2745a5f16 | |||
| 7d03e6ddf3 | |||
| 77cfc12013 | |||
| 0bf9c06ef2 | |||
| d2b40b3399 | |||
| 482f4072c7 | |||
| 4879fee9a8 | |||
| 51307c31f8 | |||
| db451b630c | |||
| 400ea68cc9 | |||
| 078c755684 | |||
| f17c89605f | |||
| 5f961febac | |||
| 1fb2c3ed5d | |||
| acc6cd0c73 | |||
| 4e27082225 | |||
| 6563bb0044 | |||
| d4b2a1214e | |||
| 097fb3b4cb | |||
| f3f69767a1 | |||
| dc149ac022 | |||
| 37cde7a7af | |||
| e320104fb8 | |||
| af4ad33031 | |||
| 2038111a11 | |||
| 3481e660a3 | |||
| 4651bf782c | |||
| 608a78ac67 | |||
| 4a12128315 | |||
| 746b3295cb | |||
| 3d42cf67d7 | |||
| b7f5b7b5e5 | |||
| 5e548f7899 | |||
| fb68ad7705 | |||
| e959ae2494 | |||
| 3a6e84119f | |||
| 4f3f7a70a9 | |||
| e1bf1e306d | |||
| c9333a3023 | |||
| 840fd5243a | |||
| dde8fb3202 | |||
| 0f5ef505d0 | |||
| 1673a23455 | |||
| b4b16ada27 | |||
| a4d75bfc04 | |||
| 61bd4f799b | |||
| 002a3ea79e | |||
| 5dce56357b | |||
| 89ab800565 | |||
| 349741b31b | |||
| 725b398da9 | |||
| ce9f53dddb | |||
| fc37413d91 | |||
| ba39c39622 | |||
| 6c5ee78b18 | |||
| eafa575e8e | |||
| a3dd458cb2 | |||
| c5cb8b65f3 | |||
| 994b93852e | |||
| 912eda2cb8 | |||
| 0461fabab0 | |||
| 0324872499 | |||
| 5877644570 | |||
| f292fdd354 | |||
| 85ce4dc462 | |||
| a9d3aa4962 | |||
| 9a562934e5 | |||
| 784304f639 | |||
| 582792c2bf | |||
| 946523a73d | |||
| 39021dca1e | |||
| e240ef713b | |||
| 2b1f88ae0f | |||
| 8259823451 | |||
| 05109a500d | |||
| 78b156aeed | |||
| 39789bcc33 | |||
| 310c8a57e7 | |||
| 3b947d6446 | |||
| d163c84916 | |||
| ef43ceab48 | |||
| 665952869a | |||
| 942a1fbf1a | |||
| 0c05f87acd | |||
| ef856a1420 | |||
| 0ea666bb7c | |||
| 5fc3a8607f | |||
| 163ca52b7f | |||
| dbcf62edb1 | |||
| 6e1ef774df | |||
| 84e646dbe4 | |||
| 705ea56813 | |||
| 91ae7244b0 | |||
| 1539504258 | |||
| 1ef899d11e | |||
| e36df4fff5 | |||
| 76a1fed75d | |||
| 338ccef6d6 | |||
| 1fa7fbda45 | |||
| 4459d296eb | |||
| a9f7a47022 | |||
| e1e69a4677 | |||
| 6827de3f67 | |||
| bffd4c1150 | |||
| ad44c255cb | |||
| c884197f2e | |||
| 1bc335d715 | |||
| a10f5a3337 | |||
| c2c413a9ef | |||
| c9eea53ff5 | |||
| e176ac2e8d | |||
| 522f9f22e4 | |||
| 8fded1c678 | |||
| 2b0782f125 | |||
| f7c2e38a5e | |||
| 93d3fc3cef | |||
| 0e200e8c12 | |||
| 28ddb57c8e | |||
| 348ecd938e | |||
| 6de200a294 | |||
| 8b0dc43f74 | |||
| e14d8109f2 | |||
| ea8b829c6e | |||
| faf637aae1 | |||
| bb69c92a9c | |||
| 3886888843 | |||
| 1bd0a38f6b | |||
| ac7fe66734 | |||
| 3365ab9a49 | |||
| 3cfaa5361f | |||
| 43800b6578 | |||
| 0891e206d5 | |||
| 8f6aae7e4c | |||
| d860405b16 | |||
| df4f1aa28b | |||
| b464c848a9 | |||
| 04780d8094 | |||
| e41604499a | |||
| ef90ba7aab | |||
| b5954be201 | |||
| 5d7b37cb18 | |||
| 71026d74e9 | |||
| d656d07487 | |||
| 3bf395c86f | |||
| f841a89940 | |||
| 287de96277 | |||
| 860bcd0c9d | |||
| 73f6354332 | |||
| 9770821628 | |||
| dff57a4b13 | |||
| cfed5e813d | |||
| 2518e53abc | |||
| bf970dbd02 | |||
| aa583e4586 | |||
| 07a33f1a5f | |||
| bd1eff9fc8 | |||
| ded6dad023 | |||
| 52f7bdd65d | |||
| 6874bfc059 | |||
| bef439ce55 | |||
| 726c684a94 | |||
| e6b9fd8a66 | |||
| 350a1e8b61 | |||
| b904ef4e8a | |||
| d64040abb7 |
8
.gitignore
vendored
@@ -116,6 +116,10 @@ data/iplist.txt
|
||||
data/json/index.json
|
||||
data/json/config.json
|
||||
data/site.pl
|
||||
data/admin_path.pl
|
||||
data/close.pl
|
||||
data/admin_path.pl
|
||||
data/close.pl
|
||||
ssl/input.pl
|
||||
data/datadir.pl
|
||||
data/502Task.pl
|
||||
data/default.pl
|
||||
data/backup.pl
|
||||
|
||||
45
README.md
@@ -1,7 +1,46 @@
|
||||
# mdserver-web
|
||||
简单的Linux面板
|
||||
### mdserver-web 0.8.6
|
||||
简单的Linux面板,感谢BT.CN写出如此好的web管理软件。我一看到,就知道这是我一直想要的页面化管理方式。
|
||||
复制了后台管理界面,按照自己想要的方式写了一版。
|
||||
|
||||
* ssh工具优化
|
||||
* 面板收藏功能完成
|
||||
* 网站子目录绑定
|
||||
* 网站备份功能
|
||||
* 自动更新优化
|
||||
* 插件方式管理
|
||||
|
||||
基本上可以使用,后续会继续优化!欢迎提供意见!
|
||||
|
||||
### 主要插件介绍
|
||||
* OpenResty - 轻量级,占有内存少,并发能力强。
|
||||
* PHP[52-80] - PHP是世界上最好的编程语言。
|
||||
* MySQL - MySQL是一种关系数据库管理系统。
|
||||
* phpMyAdmin - 著名Web端MySQL管理工具。
|
||||
* Memcached - 一个高性能的分布式内存对象缓存系统。
|
||||
* Redis - 一个高性能的key-value数据库。
|
||||
* CSVN - 最流行的SVN代码共享管理软件。
|
||||
* PureFtpd - 一款专注于程序健壮和软件安全的免费FTP服务器软件。
|
||||
* Gogs - 一款极易搭建的自助Git服务。
|
||||
* Rsyncd - 通用同步服务。
|
||||
|
||||
### 版本更新 0.8.6
|
||||
* mysql主从配置。
|
||||
* swap插件[虚拟内存]。
|
||||
|
||||
### 自动安装
|
||||
```
|
||||
curl -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/master/scripts/install.sh | sh
|
||||
```
|
||||
```
|
||||
|
||||
### 更新
|
||||
|
||||
```
|
||||
curl -fsSL https://raw.githubusercontent.com/midoks/mdserver-web/master/scripts/update.sh | sh
|
||||
```
|
||||
|
||||
### 无图不真相
|
||||
[](/route/static/mdw.jpg)
|
||||
|
||||
### wiki
|
||||
[了解更多...](https://github.com/midoks/mdserver-web/wiki)
|
||||
|
||||
|
||||
2
app.py
@@ -11,4 +11,4 @@ try:
|
||||
HOST = '0.0.0.0'
|
||||
socketio.run(app, host=HOST, port=PORT)
|
||||
except Exception as ex:
|
||||
print ex
|
||||
print(ex)
|
||||
|
||||
@@ -13,7 +13,7 @@ import re
|
||||
import hashlib
|
||||
from random import Random
|
||||
|
||||
import public
|
||||
import mw
|
||||
import db
|
||||
|
||||
from flask import redirect
|
||||
@@ -41,41 +41,45 @@ def checkClose():
|
||||
def initDB():
|
||||
try:
|
||||
sql = db.Sql().dbfile('default')
|
||||
csql = public.readFile('data/sql/default.sql')
|
||||
csql = mw.readFile('data/sql/default.sql')
|
||||
csql_list = csql.split(';')
|
||||
for index in range(len(csql_list)):
|
||||
sql.execute(csql_list[index], ())
|
||||
|
||||
except Exception, ex:
|
||||
print str(ex)
|
||||
except Exception as ex:
|
||||
print(str(ex))
|
||||
|
||||
|
||||
def initInitD():
|
||||
script = public.getRunDir() + '/scripts/init.d/mw.tpl'
|
||||
script_bin = public.getRunDir() + '/scripts/init.d/mw'
|
||||
script = mw.getRunDir() + '/scripts/init.d/mw.tpl'
|
||||
script_bin = mw.getRunDir() + '/scripts/init.d/mw'
|
||||
# if os.path.exists(script_bin):
|
||||
# return
|
||||
|
||||
content = public.readFile(script)
|
||||
content = content.replace("{$SERVER_PATH}", public.getRunDir())
|
||||
content = mw.readFile(script)
|
||||
content = content.replace("{$SERVER_PATH}", mw.getRunDir())
|
||||
|
||||
public.writeFile(script_bin, content)
|
||||
public.execShell('chmod +x ' + script_bin)
|
||||
mw.writeFile(script_bin, content)
|
||||
mw.execShell('chmod +x ' + script_bin)
|
||||
|
||||
if not public.isAppleSystem():
|
||||
mw.setHostAddr(mw.getLocalIp())
|
||||
|
||||
if not mw.isAppleSystem():
|
||||
initd_bin = '/etc/init.d/mw'
|
||||
if not os.path.exists(initd_bin):
|
||||
import shutil
|
||||
shutil.copyfile(script_bin, initd_bin)
|
||||
public.execShell('chmod +x ' + initd_bin)
|
||||
mw.execShell('chmod +x ' + initd_bin)
|
||||
# 加入自启动
|
||||
mw.execShell('chkconfig --add mw')
|
||||
|
||||
|
||||
def initUserInfo():
|
||||
|
||||
data = public.M('users').where('id=?', (1,)).getField('password')
|
||||
data = mw.M('users').where('id=?', (1,)).getField('password')
|
||||
if data == '21232f297a57a5a743894a0e4a801fc3':
|
||||
pwd = public.getRandomString(8).lower()
|
||||
file_pw = public.getRunDir() + '/data/default.pl'
|
||||
public.writeFile(file_pw, pwd)
|
||||
public.M('users').where('id=?', (1,)).setField(
|
||||
'password', public.md5(pwd))
|
||||
pwd = mw.getRandomString(8).lower()
|
||||
file_pw = mw.getRunDir() + '/data/default.pl'
|
||||
mw.writeFile(file_pw, pwd)
|
||||
mw.M('users').where('id=?', (1,)).setField(
|
||||
'password', mw.md5(pwd))
|
||||
|
||||
@@ -4,7 +4,7 @@ import psutil
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
import public
|
||||
import mw
|
||||
import re
|
||||
import json
|
||||
import pwd
|
||||
@@ -15,7 +15,10 @@ from flask import request
|
||||
|
||||
class config_api:
|
||||
|
||||
__version = '0.0.5'
|
||||
# 本版解决自启动问题
|
||||
# 文件管理重命名
|
||||
# 优化计划任务管理
|
||||
__version = '0.8.6'
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
@@ -24,9 +27,9 @@ class config_api:
|
||||
|
||||
# 取面板列表
|
||||
def getPanelListApi(self):
|
||||
data = public.M('panel').field(
|
||||
data = mw.M('panel').field(
|
||||
'id,title,url,username,password,click,addtime').order('click desc').select()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def addPanelInfoApi(self):
|
||||
title = request.form.get('title', '')
|
||||
@@ -34,24 +37,24 @@ class config_api:
|
||||
username = request.form.get('username', '')
|
||||
password = request.form.get('password', '')
|
||||
# 校验是还是重复
|
||||
isAdd = public.M('panel').where(
|
||||
isAdd = mw.M('panel').where(
|
||||
'title=? OR url=?', (title, url)).count()
|
||||
if isAdd:
|
||||
return public.returnJson(False, '备注或面板地址重复!')
|
||||
isRe = public.M('panel').add('title,url,username,password,click,addtime',
|
||||
(title, url, username, password, 0, int(time.time())))
|
||||
return mw.returnJson(False, '备注或面板地址重复!')
|
||||
isRe = mw.M('panel').add('title,url,username,password,click,addtime',
|
||||
(title, url, username, password, 0, int(time.time())))
|
||||
if isRe:
|
||||
return public.returnJson(True, '添加成功!')
|
||||
return public.returnJson(False, '添加失败!')
|
||||
return mw.returnJson(True, '添加成功!')
|
||||
return mw.returnJson(False, '添加失败!')
|
||||
|
||||
# 删除面板资料
|
||||
def delPanelInfoApi(self):
|
||||
mid = request.form.get('id', '')
|
||||
isExists = public.M('panel').where('id=?', (mid,)).count()
|
||||
isExists = mw.M('panel').where('id=?', (mid,)).count()
|
||||
if not isExists:
|
||||
return public.returnJson(False, '指定面板资料不存在!')
|
||||
public.M('panel').where('id=?', (mid,)).delete()
|
||||
return public.returnJson(True, '删除成功!')
|
||||
return mw.returnJson(False, '指定面板资料不存在!')
|
||||
mw.M('panel').where('id=?', (mid,)).delete()
|
||||
return mw.returnJson(True, '删除成功!')
|
||||
|
||||
# 修改面板资料
|
||||
def setPanelInfoApi(self):
|
||||
@@ -61,51 +64,51 @@ class config_api:
|
||||
password = request.form.get('password', '')
|
||||
mid = request.form.get('id', '')
|
||||
# 校验是还是重复
|
||||
isSave = public.M('panel').where(
|
||||
isSave = mw.M('panel').where(
|
||||
'(title=? OR url=?) AND id!=?', (title, url, mid)).count()
|
||||
if isSave:
|
||||
return public.returnMsg(False, '备注或面板地址重复!')
|
||||
return mw.returnJson(False, '备注或面板地址重复!')
|
||||
|
||||
# 更新到数据库
|
||||
isRe = public.M('panel').where('id=?', (mid,)).save(
|
||||
isRe = mw.M('panel').where('id=?', (mid,)).save(
|
||||
'title,url,username,password', (title, url, username, password))
|
||||
if isRe:
|
||||
return public.returnMsg(True, '修改成功!')
|
||||
return public.returnMsg(False, '修改失败!')
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
return mw.returnJson(False, '修改失败!')
|
||||
|
||||
def syncDateApi(self):
|
||||
if public.isAppleSystem():
|
||||
return public.returnJson(True, '开发系统不必同步时间!')
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(True, '开发系统不必同步时间!')
|
||||
|
||||
data = public.execShell('ntpdate -s time.nist.gov')
|
||||
data = mw.execShell('ntpdate -s time.nist.gov')
|
||||
if data[0] == '':
|
||||
return public.returnJson(True, '同步成功!')
|
||||
return public.returnJson(False, '同步失败:' + data[0])
|
||||
return mw.returnJson(True, '同步成功!')
|
||||
return mw.returnJson(False, '同步失败:' + data[0])
|
||||
|
||||
def setPasswordApi(self):
|
||||
password1 = request.form.get('password1', '')
|
||||
password2 = request.form.get('password2', '')
|
||||
if password1 != password2:
|
||||
return public.returnJson(False, '两次输入的密码不一致,请重新输入!')
|
||||
return mw.returnJson(False, '两次输入的密码不一致,请重新输入!')
|
||||
if len(password1) < 5:
|
||||
return public.returnJson(False, '用户密码不能小于5位!')
|
||||
public.M('users').where("username=?", (session['username'],)).setField(
|
||||
'password', public.md5(password1.strip()))
|
||||
return public.returnJson(True, '密码修改成功!')
|
||||
return mw.returnJson(False, '用户密码不能小于5位!')
|
||||
mw.M('users').where("username=?", (session['username'],)).setField(
|
||||
'password', mw.md5(password1.strip()))
|
||||
return mw.returnJson(True, '密码修改成功!')
|
||||
|
||||
def setNameApi(self):
|
||||
name1 = request.form.get('name1', '')
|
||||
name2 = request.form.get('name2', '')
|
||||
if name1 != name2:
|
||||
return public.returnJson(False, '两次输入的用户名不一致,请重新输入!')
|
||||
return mw.returnJson(False, '两次输入的用户名不一致,请重新输入!')
|
||||
if len(name1) < 3:
|
||||
return public.returnJson(False, '用户名长度不能少于3位')
|
||||
return mw.returnJson(False, '用户名长度不能少于3位')
|
||||
|
||||
public.M('users').where("username=?", (session['username'],)).setField(
|
||||
mw.M('users').where("username=?", (session['username'],)).setField(
|
||||
'username', name1.strip())
|
||||
|
||||
session['username'] = name1
|
||||
return public.returnJson(True, '用户修改成功!')
|
||||
return mw.returnJson(True, '用户修改成功!')
|
||||
|
||||
def setApi(self):
|
||||
webname = request.form.get('webname', '')
|
||||
@@ -118,34 +121,34 @@ class config_api:
|
||||
if domain != '':
|
||||
reg = "^([\w\-\*]{1,100}\.){1,4}(\w{1,10}|\w{1,10}\.\w{1,10})$"
|
||||
if not re.match(reg, domain):
|
||||
return public.returnJson(False, '主域名格式不正确')
|
||||
return mw.returnJson(False, '主域名格式不正确')
|
||||
|
||||
if int(port) >= 65535 or int(port) < 100:
|
||||
return public.returnJson(False, '端口范围不正确!')
|
||||
return mw.returnJson(False, '端口范围不正确!')
|
||||
|
||||
if webname != public.getConfig('title'):
|
||||
public.setConfig('title', webname)
|
||||
if webname != mw.getConfig('title'):
|
||||
mw.setConfig('title', webname)
|
||||
|
||||
if sites_path != public.getWwwDir():
|
||||
public.setWwwDir(sites_path)
|
||||
if sites_path != mw.getWwwDir():
|
||||
mw.setWwwDir(sites_path)
|
||||
|
||||
if backup_path != public.getWwwDir():
|
||||
public.setBackupDir(backup_path)
|
||||
if backup_path != mw.getWwwDir():
|
||||
mw.setBackupDir(backup_path)
|
||||
|
||||
if port != public.getHostPort():
|
||||
if port != mw.getHostPort():
|
||||
import system_api
|
||||
public.setHostPort(port)
|
||||
mw.setHostPort(port)
|
||||
system_api.system_api().restartMw()
|
||||
|
||||
if host_ip != public.getHostAddr():
|
||||
public.setHostAddr(host_ip)
|
||||
if host_ip != mw.getHostAddr():
|
||||
mw.setHostAddr(host_ip)
|
||||
|
||||
mhost = public.getHostAddr()
|
||||
mhost = mw.getHostAddr()
|
||||
info = {
|
||||
'uri': '/config',
|
||||
'host': mhost + ':' + port
|
||||
}
|
||||
return public.returnJson(True, '保存成功!', info)
|
||||
return mw.returnJson(True, '保存成功!', info)
|
||||
|
||||
def setAdminPathApi(self):
|
||||
admin_path = request.form.get('admin_path', '').strip()
|
||||
@@ -157,59 +160,59 @@ class config_api:
|
||||
admin_path = '/'
|
||||
if admin_path != '/':
|
||||
if len(admin_path) < 6:
|
||||
return public.returnJson(False, '安全入口地址长度不能小于6位!')
|
||||
return mw.returnJson(False, '安全入口地址长度不能小于6位!')
|
||||
if admin_path in admin_path_checks:
|
||||
return public.returnJson(False, '该入口已被面板占用,请使用其它入口!')
|
||||
return mw.returnJson(False, '该入口已被面板占用,请使用其它入口!')
|
||||
if not re.match("^/[\w\./-_]+$", admin_path):
|
||||
return public.returnJson(False, '入口地址格式不正确,示例: /my_panel')
|
||||
return mw.returnJson(False, '入口地址格式不正确,示例: /my_panel')
|
||||
else:
|
||||
domain = public.readFile('data/domain.conf')
|
||||
domain = mw.readFile('data/domain.conf')
|
||||
if not domain:
|
||||
domain = ''
|
||||
limitip = public.readFile('data/limitip.conf')
|
||||
limitip = mw.readFile('data/limitip.conf')
|
||||
if not limitip:
|
||||
limitip = ''
|
||||
if not domain.strip() and not limitip.strip():
|
||||
return public.returnJson(False, '警告,关闭安全入口等于直接暴露你的后台地址在外网,十分危险,至少开启以下一种安全方式才能关闭:<a style="color:red;"><br>1、绑定访问域名<br>2、绑定授权IP</a>')
|
||||
return mw.returnJson(False, '警告,关闭安全入口等于直接暴露你的后台地址在外网,十分危险,至少开启以下一种安全方式才能关闭:<a style="color:red;"><br>1、绑定访问域名<br>2、绑定授权IP</a>')
|
||||
|
||||
admin_path_file = 'data/admin_path.pl'
|
||||
admin_path_old = '/'
|
||||
if os.path.exists(admin_path_file):
|
||||
admin_path_old = public.readFile(admin_path_file).strip()
|
||||
admin_path_old = mw.readFile(admin_path_file).strip()
|
||||
|
||||
if admin_path_old != admin_path:
|
||||
public.writeFile(admin_path_file, admin_path)
|
||||
public.restartMw()
|
||||
return public.returnJson(True, '修改成功!')
|
||||
mw.writeFile(admin_path_file, admin_path)
|
||||
mw.restartMw()
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
|
||||
def closePanelApi(self):
|
||||
filename = 'data/close.pl'
|
||||
if os.path.exists(filename):
|
||||
os.remove(filename)
|
||||
return public.returnJson(True, '开启成功')
|
||||
public.writeFile(filename, 'True')
|
||||
public.execShell("chmod 600 " + filename)
|
||||
public.execShell("chown root.root " + filename)
|
||||
return public.returnJson(True, '面板已关闭!')
|
||||
return mw.returnJson(True, '开启成功')
|
||||
mw.writeFile(filename, 'True')
|
||||
mw.execShell("chmod 600 " + filename)
|
||||
mw.execShell("chown root.root " + filename)
|
||||
return mw.returnJson(True, '面板已关闭!')
|
||||
|
||||
def setIpv6StatusApi(self):
|
||||
ipv6_file = 'data/ipv6.pl'
|
||||
if os.path.exists('data/ipv6.pl'):
|
||||
os.remove(ipv6_file)
|
||||
public.writeLog('面板设置', '关闭面板IPv6兼容!')
|
||||
mw.writeLog('面板设置', '关闭面板IPv6兼容!')
|
||||
else:
|
||||
public.writeFile(ipv6_file, 'True')
|
||||
public.writeLog('面板设置', '开启面板IPv6兼容!')
|
||||
public.restartMw()
|
||||
return public.returnJson(True, '设置成功!')
|
||||
mw.writeFile(ipv6_file, 'True')
|
||||
mw.writeLog('面板设置', '开启面板IPv6兼容!')
|
||||
mw.restartMw()
|
||||
return mw.returnJson(True, '设置成功!')
|
||||
|
||||
# 获取面板证书
|
||||
def getPanelSslApi(self):
|
||||
cert = {}
|
||||
cert['privateKey'] = public.readFile('ssl/privateKey.pem')
|
||||
cert['certPem'] = public.readFile('ssl/certificate.pem')
|
||||
cert['privateKey'] = mw.readFile('ssl/privateKey.pem')
|
||||
cert['certPem'] = mw.readFile('ssl/certificate.pem')
|
||||
cert['rep'] = os.path.exists('ssl/input.pl')
|
||||
return public.getJson(cert)
|
||||
return mw.getJson(cert)
|
||||
|
||||
# 保存面板证书
|
||||
def savePanelSslApi(self):
|
||||
@@ -220,37 +223,37 @@ class config_api:
|
||||
certPem = request.form.get('certPem', '').strip()
|
||||
privateKey = request.form.get('privateKey', '').strip()
|
||||
|
||||
public.writeFile(checkCert, certPem)
|
||||
mw.writeFile(checkCert, certPem)
|
||||
if privateKey:
|
||||
public.writeFile(keyPath, privateKey)
|
||||
mw.writeFile(keyPath, privateKey)
|
||||
if certPem:
|
||||
public.writeFile(certPath, certPem)
|
||||
if not public.checkCert(checkCert):
|
||||
return public.returnJson(False, '证书错误,请检查!')
|
||||
public.writeFile('ssl/input.pl', 'True')
|
||||
return public.returnJson(True, '证书已保存!')
|
||||
mw.writeFile(certPath, certPem)
|
||||
if not mw.checkCert(checkCert):
|
||||
return mw.returnJson(False, '证书错误,请检查!')
|
||||
mw.writeFile('ssl/input.pl', 'True')
|
||||
return mw.returnJson(True, '证书已保存!')
|
||||
|
||||
# 设置面板SSL
|
||||
def setPanelSslApi(self):
|
||||
sslConf = public.getRunDir() + '/data/ssl.pl'
|
||||
sslConf = mw.getRunDir() + '/data/ssl.pl'
|
||||
if os.path.exists(sslConf):
|
||||
os.system('rm -f ' + sslConf)
|
||||
return public.returnJson(True, 'SSL已关闭,请使用http协议访问面板!')
|
||||
return mw.returnJson(True, 'SSL已关闭,请使用http协议访问面板!')
|
||||
else:
|
||||
os.system('pip install cffi==1.10')
|
||||
os.system('pip install cryptography==2.1')
|
||||
os.system('pip install pyOpenSSL==16.2')
|
||||
try:
|
||||
if not self.createSSL():
|
||||
return public.returnJson(False, '开启失败,无法自动安装pyOpenSSL组件!<p>请尝试手动安装: pip install pyOpenSSL</p>')
|
||||
public.writeFile(sslConf, 'True')
|
||||
return mw.returnJson(False, '开启失败,无法自动安装pyOpenSSL组件!<p>请尝试手动安装: pip install pyOpenSSL</p>')
|
||||
mw.writeFile(sslConf, 'True')
|
||||
except Exception as ex:
|
||||
return public.returnJson(False, '开启失败,无法自动安装pyOpenSSL组件!<p>请尝试手动安装: pip install pyOpenSSL</p>')
|
||||
return public.returnJson(True, '开启成功,请使用https协议访问面板!')
|
||||
return mw.returnJson(False, '开启失败,无法自动安装pyOpenSSL组件!<p>请尝试手动安装: pip install pyOpenSSL</p>')
|
||||
return mw.returnJson(True, '开启成功,请使用https协议访问面板!')
|
||||
|
||||
def getApi(self):
|
||||
data = {}
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
##### ----- end ----- ###
|
||||
|
||||
# 自签证书
|
||||
@@ -262,7 +265,7 @@ class config_api:
|
||||
key.generate_key(OpenSSL.crypto.TYPE_RSA, 2048)
|
||||
cert = OpenSSL.crypto.X509()
|
||||
cert.set_serial_number(0)
|
||||
cert.get_subject().CN = '120.27.27.98'
|
||||
cert.get_subject().CN = mw.getLocalIp()
|
||||
cert.set_issuer(cert.get_subject())
|
||||
cert.gmtime_adj_notBefore(0)
|
||||
cert.gmtime_adj_notAfter(86400 * 3650)
|
||||
@@ -273,9 +276,9 @@ class config_api:
|
||||
private_key = OpenSSL.crypto.dump_privatekey(
|
||||
OpenSSL.crypto.FILETYPE_PEM, key)
|
||||
if len(cert_ca) > 100 and len(private_key) > 100:
|
||||
public.writeFile('ssl/certificate.pem', cert_ca)
|
||||
public.writeFile('ssl/privateKey.pem', private_key)
|
||||
print cert_ca, private_key
|
||||
mw.writeFile('ssl/certificate.pem', cert_ca)
|
||||
mw.writeFile('ssl/privateKey.pem', private_key)
|
||||
print(cert_ca, private_key)
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -285,20 +288,20 @@ class config_api:
|
||||
def get(self):
|
||||
|
||||
data = {}
|
||||
data['title'] = public.getConfig('title')
|
||||
data['site_path'] = public.getWwwDir()
|
||||
data['backup_path'] = public.getBackupDir()
|
||||
data['title'] = mw.getConfig('title')
|
||||
data['site_path'] = mw.getWwwDir()
|
||||
data['backup_path'] = mw.getBackupDir()
|
||||
sformat = 'date +"%Y-%m-%d %H:%M:%S %Z %z"'
|
||||
data['systemdate'] = public.execShell(sformat)[0].strip()
|
||||
data['systemdate'] = mw.execShell(sformat)[0].strip()
|
||||
|
||||
data['port'] = public.getHostPort()
|
||||
data['ip'] = public.getHostAddr()
|
||||
data['port'] = mw.getHostPort()
|
||||
data['ip'] = mw.getHostAddr()
|
||||
|
||||
admin_path_file = 'data/admin_path.pl'
|
||||
if not os.path.exists(admin_path_file):
|
||||
data['admin_path'] = '/'
|
||||
else:
|
||||
data['admin_path'] = public.readFile(admin_path_file)
|
||||
data['admin_path'] = mw.readFile(admin_path_file)
|
||||
|
||||
ipv6_file = 'data/ipv6.pl'
|
||||
if os.path.exists('data/ipv6.pl'):
|
||||
@@ -312,9 +315,9 @@ class config_api:
|
||||
else:
|
||||
data['ssl'] = ''
|
||||
|
||||
data['site_count'] = public.M('sites').count()
|
||||
data['site_count'] = mw.M('sites').count()
|
||||
|
||||
data['username'] = public.M('users').where(
|
||||
data['username'] = mw.M('users').where(
|
||||
"id=?", (1,)).getField('username')
|
||||
|
||||
return data
|
||||
|
||||
@@ -4,7 +4,7 @@ import psutil
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
import public
|
||||
import mw
|
||||
import re
|
||||
import json
|
||||
import pwd
|
||||
@@ -21,62 +21,71 @@ class crontab_api:
|
||||
|
||||
##### ----- start ----- ###
|
||||
def listApi(self):
|
||||
_list = public.M('crontab').where('', ()).field(self.field).limit(
|
||||
'0,5').order('id desc').select()
|
||||
p = request.args.get('p', 1)
|
||||
psize = 10
|
||||
|
||||
startPage = (int(p) - 1) * psize
|
||||
pageInfo = str(startPage) + ',' + str(psize)
|
||||
|
||||
_list = mw.M('crontab').where('', ()).field(
|
||||
self.field).limit(pageInfo).order('id desc').select()
|
||||
|
||||
data = []
|
||||
for i in range(len(_list)):
|
||||
tmp = _list[i]
|
||||
if _list[i]['type'] == "day":
|
||||
tmp['type'] = '每天'
|
||||
tmp['cycle'] = public.getInfo('每天, {1}点{2}分 执行', (str(
|
||||
tmp['cycle'] = mw.getInfo('每天, {1}点{2}分 执行', (str(
|
||||
_list[i]['where_hour']), str(_list[i]['where_minute'])))
|
||||
elif _list[i]['type'] == "day-n":
|
||||
tmp['type'] = public.getInfo(
|
||||
tmp['type'] = mw.getInfo(
|
||||
'每{1}天', (str(_list[i]['where1']),))
|
||||
tmp['cycle'] = public.getInfo('每隔{1}天, {2}点{3}分 执行', (str(
|
||||
tmp['cycle'] = mw.getInfo('每隔{1}天, {2}点{3}分 执行', (str(
|
||||
_list[i]['where1']), str(_list[i]['where_hour']), str(_list[i]['where_minute'])))
|
||||
elif _list[i]['type'] == "hour":
|
||||
tmp['type'] = '每小时'
|
||||
tmp['cycle'] = public.getInfo(
|
||||
tmp['cycle'] = mw.getInfo(
|
||||
'每小时, 第{1}分钟 执行', (str(_list[i]['where_minute']),))
|
||||
elif _list[i]['type'] == "hour-n":
|
||||
tmp['type'] = public.getInfo(
|
||||
tmp['type'] = mw.getInfo(
|
||||
'每{1}小时', (str(_list[i]['where1']),))
|
||||
tmp['cycle'] = public.getInfo('每{1}小时, 第{2}分钟 执行', (str(
|
||||
tmp['cycle'] = mw.getInfo('每{1}小时, 第{2}分钟 执行', (str(
|
||||
_list[i]['where1']), str(_list[i]['where_minute'])))
|
||||
elif _list[i]['type'] == "minute-n":
|
||||
tmp['type'] = public.getInfo(
|
||||
tmp['type'] = mw.getInfo(
|
||||
'每{1}分钟', (str(_list[i]['where1']),))
|
||||
tmp['cycle'] = public.getInfo(
|
||||
tmp['cycle'] = mw.getInfo(
|
||||
'每隔{1}分钟执行', (str(_list[i]['where1']),))
|
||||
elif _list[i]['type'] == "week":
|
||||
tmp['type'] = '每周'
|
||||
if not _list[i]['where1']:
|
||||
_list[i]['where1'] = '0'
|
||||
tmp['cycle'] = public.getInfo('每周{1}, {2}点{3}分执行', (self.toWeek(int(
|
||||
tmp['cycle'] = mw.getInfo('每周{1}, {2}点{3}分执行', (self.toWeek(int(
|
||||
_list[i]['where1'])), str(_list[i]['where_hour']), str(_list[i]['where_minute'])))
|
||||
elif _list[i]['type'] == "month":
|
||||
tmp['type'] = '每月'
|
||||
tmp['cycle'] = public.getInfo('每月, {1}日 {2}点{3}分执行', (str(_list[i]['where1']), str(
|
||||
tmp['cycle'] = mw.getInfo('每月, {1}日 {2}点{3}分执行', (str(_list[i]['where1']), str(
|
||||
_list[i]['where_hour']), str(_list[i]['where_minute'])))
|
||||
data.append(tmp)
|
||||
|
||||
_ret = {}
|
||||
_ret['data'] = data
|
||||
|
||||
count = public.M('crontab').where('', ()).count()
|
||||
count = mw.M('crontab').where('', ()).count()
|
||||
_page = {}
|
||||
_page['count'] = count
|
||||
_page['tojs'] = 'remind'
|
||||
_page['p'] = p
|
||||
_page['row'] = psize
|
||||
_page['tojs'] = "getCronData"
|
||||
|
||||
_ret['page'] = public.getPage(_page)
|
||||
return public.getJson(_ret)
|
||||
_ret['list'] = mw.getPage(_page)
|
||||
_ret['p'] = p
|
||||
return mw.getJson(_ret)
|
||||
|
||||
# 设置计划任务状态
|
||||
def setCronStatusApi(self):
|
||||
mid = request.form.get('id', '')
|
||||
cronInfo = public.M('crontab').where(
|
||||
cronInfo = mw.M('crontab').where(
|
||||
'id=?', (mid,)).field(self.field).find()
|
||||
status = 1
|
||||
if cronInfo['status'] == status:
|
||||
@@ -86,17 +95,17 @@ class crontab_api:
|
||||
cronInfo['status'] = 1
|
||||
self.syncToCrond(cronInfo)
|
||||
|
||||
public.M('crontab').where('id=?', (mid,)).setField('status', status)
|
||||
public.writeLog(
|
||||
mw.M('crontab').where('id=?', (mid,)).setField('status', status)
|
||||
mw.writeLog(
|
||||
'计划任务', '修改计划任务[' + cronInfo['name'] + ']状态为[' + str(status) + ']')
|
||||
return public.returnJson(True, '设置成功')
|
||||
return mw.returnJson(True, '设置成功')
|
||||
|
||||
# 获取指定任务数据
|
||||
def getCrondFindApi(self):
|
||||
sid = request.form.get('id', '')
|
||||
data = public.M('crontab').where(
|
||||
data = mw.M('crontab').where(
|
||||
'id=?', (sid,)).field(self.field).find()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def modifyCrondApi(self):
|
||||
sid = request.form.get('id', '')
|
||||
@@ -114,7 +123,7 @@ class crontab_api:
|
||||
urladdress = request.form.get('urladdress', '')
|
||||
|
||||
if len(iname) < 1:
|
||||
return public.returnJson(False, '任务名称不能为空!')
|
||||
return mw.returnJson(False, '任务名称不能为空!')
|
||||
|
||||
params = {
|
||||
'name': iname,
|
||||
@@ -131,7 +140,7 @@ class crontab_api:
|
||||
'urladdress': urladdress,
|
||||
}
|
||||
cuonConfig, get, name = self.getCrondCycle(params)
|
||||
cronInfo = public.M('crontab').where(
|
||||
cronInfo = mw.M('crontab').where(
|
||||
'id=?', (sid,)).field(self.field).find()
|
||||
del(cronInfo['id'])
|
||||
del(cronInfo['addtime'])
|
||||
@@ -145,21 +154,21 @@ class crontab_api:
|
||||
cronInfo['sbody'] = get['sbody']
|
||||
cronInfo['urladdress'] = get['urladdress']
|
||||
|
||||
addData = public.M('crontab').where('id=?', (sid,)).save('name,type,where1,where_hour,where_minute,save,backup_to,sbody,urladdress', (get[
|
||||
addData = mw.M('crontab').where('id=?', (sid,)).save('name,type,where1,where_hour,where_minute,save,backup_to,sbody,urladdress', (get[
|
||||
'name'], field_type, get['where1'], get['hour'], get['minute'], get['save'], get['backup_to'], get['sbody'], get['urladdress']))
|
||||
self.removeForCrond(cronInfo['echo'])
|
||||
self.syncToCrond(cronInfo)
|
||||
public.writeLog('计划任务', '修改计划任务[' + cronInfo['name'] + ']成功')
|
||||
return public.returnJson(True, '修改成功')
|
||||
mw.writeLog('计划任务', '修改计划任务[' + cronInfo['name'] + ']成功')
|
||||
return mw.returnJson(True, '修改成功')
|
||||
|
||||
def logsApi(self):
|
||||
sid = request.form.get('id', '')
|
||||
echo = public.M('crontab').where("id=?", (sid,)).field('echo').find()
|
||||
logFile = public.getServerDir() + '/cron/' + echo['echo'] + '.log'
|
||||
echo = mw.M('crontab').where("id=?", (sid,)).field('echo').find()
|
||||
logFile = mw.getServerDir() + '/cron/' + echo['echo'] + '.log'
|
||||
if not os.path.exists(logFile):
|
||||
return public.returnJson(False, '当前日志为空!')
|
||||
log = public.getNumLines(logFile, 2000)
|
||||
return public.returnJson(True, log)
|
||||
return mw.returnJson(False, '当前日志为空!')
|
||||
log = mw.getNumLines(logFile, 500)
|
||||
return mw.returnJson(True, log)
|
||||
|
||||
def addApi(self):
|
||||
iname = request.form.get('name', '')
|
||||
@@ -176,7 +185,7 @@ class crontab_api:
|
||||
urladdress = request.form.get('urladdress', '')
|
||||
|
||||
if len(iname) < 1:
|
||||
return public.returnJson(False, '任务名称不能为空!')
|
||||
return mw.returnJson(False, '任务名称不能为空!')
|
||||
|
||||
params = {
|
||||
'name': iname,
|
||||
@@ -194,49 +203,50 @@ class crontab_api:
|
||||
}
|
||||
|
||||
# print params
|
||||
cuonConfig, get, name = self.getCrondCycle(params)
|
||||
cronPath = public.getServerDir() + '/cron'
|
||||
cronConfig, get, name = self.getCrondCycle(params)
|
||||
cronPath = mw.getServerDir() + '/cron'
|
||||
|
||||
cronName = self.getShell(params)
|
||||
# print cuonConfig, _params, name
|
||||
# print cronPath, cronName
|
||||
# print stype
|
||||
# print cronConfig, _params, name
|
||||
# print 'vv', cronPath, cronName
|
||||
# print 'stype', stype
|
||||
|
||||
if type(cronName) == dict:
|
||||
return cronName
|
||||
|
||||
cuonConfig += ' ' + cronPath + '/' + cronName + \
|
||||
cronConfig += ' ' + cronPath + '/' + cronName + \
|
||||
' >> ' + cronPath + '/' + cronName + '.log 2>&1'
|
||||
wRes = self.writeShell(cuonConfig)
|
||||
|
||||
if type(wRes) != bool:
|
||||
return wRes
|
||||
if not mw.isAppleSystem():
|
||||
wRes = self.writeShell(cronConfig)
|
||||
if type(wRes) != bool:
|
||||
return wRes
|
||||
self.crondReload()
|
||||
|
||||
self.crondReload()
|
||||
addData = public.M('crontab').add('name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress', (iname, field_type, where1, hour, minute, cronName, time.strftime(
|
||||
addData = mw.M('crontab').add('name,type,where1,where_hour,where_minute,echo,addtime,status,save,backup_to,stype,sname,sbody,urladdress', (iname, field_type, where1, hour, minute, cronName, time.strftime(
|
||||
'%Y-%m-%d %X', time.localtime()), 1, save, backup_to, stype, sname, sbody, urladdress))
|
||||
|
||||
if addData > 0:
|
||||
return public.returnJson(True, '添加成功')
|
||||
return public.returnJson(False, '添加失败')
|
||||
return mw.returnJson(True, '添加成功')
|
||||
return mw.returnJson(False, '添加失败')
|
||||
|
||||
def startTaskApi(self):
|
||||
sid = request.form.get('id', '')
|
||||
echo = public.M('crontab').where('id=?', (sid,)).getField('echo')
|
||||
execstr = public.getServerDir() + '/cron/' + echo
|
||||
echo = mw.M('crontab').where('id=?', (sid,)).getField('echo')
|
||||
execstr = mw.getServerDir() + '/cron/' + echo
|
||||
os.system('chmod +x ' + execstr)
|
||||
os.system('nohup ' + execstr + ' >> ' + execstr + '.log 2>&1 &')
|
||||
return public.returnJson(True, '任务已执行!')
|
||||
return mw.returnJson(True, '任务已执行!')
|
||||
|
||||
def delApi(self):
|
||||
sid = request.form.get('id', '')
|
||||
try:
|
||||
find = public.M('crontab').where(
|
||||
find = mw.M('crontab').where(
|
||||
"id=?", (sid,)).field('name,echo').find()
|
||||
if not self.removeForCrond(find['echo']):
|
||||
return public.returnJson(False, '无法写入文件,请检查是否开启了系统加固功能!')
|
||||
return mw.returnJson(False, '无法写入文件,请检查是否开启了系统加固功能!')
|
||||
|
||||
cronPath = public.getServerDir() + '/cron'
|
||||
cronPath = mw.getServerDir() + '/cron'
|
||||
sfile = cronPath + '/' + find['echo']
|
||||
|
||||
if os.path.exists(sfile):
|
||||
@@ -245,42 +255,42 @@ class crontab_api:
|
||||
if os.path.exists(sfile):
|
||||
os.remove(sfile)
|
||||
|
||||
public.M('crontab').where("id=?", (sid,)).delete()
|
||||
public.writeLog('计划任务', public.getInfo(
|
||||
mw.M('crontab').where("id=?", (sid,)).delete()
|
||||
mw.writeLog('计划任务', mw.getInfo(
|
||||
'删除计划任务[{1}]成功!', (find['name'],)))
|
||||
return public.returnJson(True, '删除成功')
|
||||
return mw.returnJson(True, '删除成功')
|
||||
except Exception as e:
|
||||
return public.returnJson(False, '删除失败:' + str(e))
|
||||
return mw.returnJson(False, '删除失败:' + str(e))
|
||||
|
||||
def delLogsApi(self):
|
||||
sid = request.form.get('id', '')
|
||||
try:
|
||||
echo = public.M('crontab').where("id=?", (sid,)).getField('echo')
|
||||
logFile = public.getServerDir() + '/cron/' + echo + '.log'
|
||||
echo = mw.M('crontab').where("id=?", (sid,)).getField('echo')
|
||||
logFile = mw.getServerDir() + '/cron/' + echo + '.log'
|
||||
os.remove(logFile)
|
||||
return public.returnJson(True, '任务日志已清空!')
|
||||
return mw.returnJson(True, '任务日志已清空!')
|
||||
except:
|
||||
return public.returnJson(False, '任务日志清空失败!')
|
||||
return mw.returnJson(False, '任务日志清空失败!')
|
||||
|
||||
# 取数据列表
|
||||
def getDataListApi(self):
|
||||
stype = request.form.get('type', '').encode('utf-8')
|
||||
stype = request.form.get('type', '')
|
||||
if stype == 'databases':
|
||||
db_list = {}
|
||||
db_list['orderOpt'] = []
|
||||
path = public.getServerDir() + '/mysql'
|
||||
path = mw.getServerDir() + '/mysql'
|
||||
if not os.path.exists(path + '/mysql.db'):
|
||||
db_list['data'] = []
|
||||
else:
|
||||
db_list['data'] = public.M('databases').dbPos(
|
||||
db_list['data'] = mw.M('databases').dbPos(
|
||||
path, 'mysql').field('name,ps').select()
|
||||
return public.getJson(db_list)
|
||||
return mw.getJson(db_list)
|
||||
|
||||
data = {}
|
||||
data['data'] = public.M(stype).field('name,ps').select()
|
||||
data['data'] = mw.M(stype).field('name,ps').select()
|
||||
data['orderOpt'] = []
|
||||
# try:
|
||||
# tmp = public.readFile('data/libList.conf')
|
||||
# tmp = mw.readFile('data/libList.conf')
|
||||
# libs = json.loads(tmp)
|
||||
# import imp
|
||||
# for lib in libs:
|
||||
@@ -291,7 +301,7 @@ class crontab_api:
|
||||
# data['orderOpt'].append(tmp)
|
||||
# except Exception as e:
|
||||
# print e
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
##### ----- start ----- ###
|
||||
|
||||
# 转换大写星期
|
||||
@@ -318,7 +328,7 @@ class crontab_api:
|
||||
name = '每天'
|
||||
elif params['type'] == "day-n":
|
||||
cuonConfig = self.getDay_N(params)
|
||||
name = public.getInfo('每{1}天', (params['where1'],))
|
||||
name = mw.getInfo('每{1}天', (params['where1'],))
|
||||
elif params['type'] == "hour":
|
||||
cuonConfig = self.getHour(params)
|
||||
name = '每小时'
|
||||
@@ -384,24 +394,24 @@ class crontab_api:
|
||||
log = '.log'
|
||||
|
||||
wheres = {
|
||||
'path': head + "python " + public.getServerDir() + "/mdserver-web/scripts/backup.py path " + param['sname'] + " " + str(param['save']),
|
||||
'site': head + "python " + public.getServerDir() + "/mdserver-web/scripts/backup.py site " + param['sname'] + " " + str(param['save']),
|
||||
'database': head + "python " + public.getServerDir() + "/mdserver-web/scripts/backup.py database " + param['sname'] + " " + str(param['save']),
|
||||
'logs': head + "python " + public.getServerDir() + "/mdserver-web/scripts/logs_backup.py " + param['sname'] + log + " " + str(param['save']),
|
||||
'rememory': head + "/bin/bash " + public.getServerDir() + '/mdserver-web/scripts/rememory.sh'
|
||||
'path': head + "python " + mw.getServerDir() + "/mdserver-web/scripts/backup.py path " + param['sname'] + " " + str(param['save']),
|
||||
'site': head + "python " + mw.getServerDir() + "/mdserver-web/scripts/backup.py site " + param['sname'] + " " + str(param['save']),
|
||||
'database': head + "python " + mw.getServerDir() + "/mdserver-web/scripts/backup.py database " + param['sname'] + " " + str(param['save']),
|
||||
'logs': head + "python " + mw.getServerDir() + "/mdserver-web/scripts/logs_backup.py " + param['sname'] + log + " " + str(param['save']),
|
||||
'rememory': head + "/bin/bash " + mw.getServerDir() + '/mdserver-web/scripts/rememory.sh'
|
||||
}
|
||||
if param['backup_to'] != 'localhost':
|
||||
cfile = public.getServerDir() + "/mdserver-web/plugin/" + param[
|
||||
cfile = mw.getServerDir() + "/mdserver-web/plugin/" + param[
|
||||
'backup_to'] + "/" + param['backup_to'] + "_main.py"
|
||||
if not os.path.exists(cfile):
|
||||
cfile = public.getServerDir() + "/mdserver-web/script/backup_" + \
|
||||
cfile = mw.getServerDir() + "/mdserver-web/script/backup_" + \
|
||||
param['backup_to'] + ".py"
|
||||
wheres = {
|
||||
'path': head + "python " + cfile + " path " + param['sname'] + " " + str(param['save']),
|
||||
'site': head + "python " + cfile + " site " + param['sname'] + " " + str(param['save']),
|
||||
'database': head + "python " + cfile + " database " + param['sname'] + " " + str(param['save']),
|
||||
'logs': head + "python " + public.getServerDir() + "/mdserver-web/scripts/logs_backup.py " + param['sname'] + log + " " + str(param['save']),
|
||||
'rememory': head + "/bin/bash " + public.getServerDir() + '/mdserver-web/scripts/rememory.sh'
|
||||
'logs': head + "python " + mw.getServerDir() + "/mdserver-web/scripts/logs_backup.py " + param['sname'] + log + " " + str(param['save']),
|
||||
'rememory': head + "/bin/bash " + mw.getServerDir() + '/mdserver-web/scripts/rememory.sh'
|
||||
}
|
||||
try:
|
||||
shell = wheres[stype]
|
||||
@@ -418,16 +428,16 @@ endDate=`date +"%Y-%m-%d %H:%M:%S"`
|
||||
echo "★[$endDate] Successful"
|
||||
echo "----------------------------------------------------------------------------"
|
||||
'''
|
||||
cronPath = public.getServerDir() + '/cron'
|
||||
cronPath = mw.getServerDir() + '/cron'
|
||||
if not os.path.exists(cronPath):
|
||||
public.execShell('mkdir -p ' + cronPath)
|
||||
mw.execShell('mkdir -p ' + cronPath)
|
||||
if not 'echo' in param:
|
||||
cronName = public.md5(public.md5(str(time.time()) + '_mw'))
|
||||
cronName = mw.md5(mw.md5(str(time.time()) + '_mw'))
|
||||
else:
|
||||
cronName = param['echo']
|
||||
file = cronPath + '/' + cronName
|
||||
public.writeFile(file, self.checkScript(shell))
|
||||
public.execShell('chmod 750 ' + file)
|
||||
mw.writeFile(file, self.checkScript(shell))
|
||||
mw.execShell('chmod 750 ' + file)
|
||||
return cronName
|
||||
|
||||
# 检查脚本
|
||||
@@ -443,52 +453,52 @@ echo "--------------------------------------------------------------------------
|
||||
u_file = '/var/spool/cron/crontabs/root'
|
||||
if not os.path.exists(u_file):
|
||||
file = '/var/spool/cron/root'
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
file = '/etc/crontab'
|
||||
else:
|
||||
file = u_file
|
||||
|
||||
if not os.path.exists(file):
|
||||
public.writeFile(file, '')
|
||||
conf = public.readFile(file)
|
||||
conf += config + "\n"
|
||||
if public.writeFile(file, conf):
|
||||
mw.writeFile(file, '')
|
||||
conf = mw.readFile(file)
|
||||
conf += str(config) + "\n"
|
||||
if mw.writeFile(file, conf):
|
||||
if not os.path.exists(u_file):
|
||||
public.execShell("chmod 600 '" + file +
|
||||
"' && chown root.root " + file)
|
||||
mw.execShell("chmod 600 '" + file +
|
||||
"' && chown root.root " + file)
|
||||
else:
|
||||
public.execShell("chmod 600 '" + file +
|
||||
"' && chown root.crontab " + file)
|
||||
mw.execShell("chmod 600 '" + file +
|
||||
"' && chown root.crontab " + file)
|
||||
return True
|
||||
return public.returnJson(False, '文件写入失败,请检查是否开启系统加固功能!')
|
||||
return mw.returnJson(False, '文件写入失败,请检查是否开启系统加固功能!')
|
||||
|
||||
# 重载配置
|
||||
def crondReload(self):
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
if os.path.exists('/etc/crontab'):
|
||||
pass
|
||||
# public.execShell('/usr/sbin/cron restart')
|
||||
# mw.execShell('/usr/sbin/cron restart')
|
||||
else:
|
||||
if os.path.exists('/etc/init.d/crond'):
|
||||
public.execShell('/etc/init.d/crond reload')
|
||||
mw.execShell('/etc/init.d/crond reload')
|
||||
elif os.path.exists('/etc/init.d/cron'):
|
||||
public.execShell('service cron restart')
|
||||
mw.execShell('service cron restart')
|
||||
else:
|
||||
public.execShell("systemctl reload crond")
|
||||
mw.execShell("systemctl reload crond")
|
||||
|
||||
# 从crond删除
|
||||
def removeForCrond(self, echo):
|
||||
u_file = '/var/spool/cron/crontabs/root'
|
||||
if not os.path.exists(u_file):
|
||||
file = '/var/spool/cron/root'
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
file = '/etc/crontab'
|
||||
else:
|
||||
file = u_file
|
||||
conf = public.readFile(file)
|
||||
conf = mw.readFile(file)
|
||||
rep = ".+" + str(echo) + ".+\n"
|
||||
conf = re.sub(rep, "", conf)
|
||||
if not public.writeFile(file, conf):
|
||||
if not mw.writeFile(file, conf):
|
||||
return False
|
||||
self.crondReload()
|
||||
return True
|
||||
@@ -502,7 +512,7 @@ echo "--------------------------------------------------------------------------
|
||||
cronInfo['minute'] = cronInfo['where_minute']
|
||||
cronInfo['week'] = cronInfo['where1']
|
||||
cuonConfig, cronInfo, name = self.getCrondCycle(cronInfo)
|
||||
cronPath = public.getServerDir() + '/cron'
|
||||
cronPath = mw.getServerDir() + '/cron'
|
||||
cronName = self.getShell(cronInfo)
|
||||
if type(cronName) == dict:
|
||||
return cronName
|
||||
|
||||
@@ -26,7 +26,7 @@ class Sql():
|
||||
try:
|
||||
if self.__DB_CONN == None:
|
||||
self.__DB_CONN = sqlite3.connect(self.__DB_FILE)
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def dbfile(self, name):
|
||||
@@ -96,7 +96,7 @@ class Sql():
|
||||
del(tmp)
|
||||
self.__close()
|
||||
return data
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def getField(self, keyName):
|
||||
@@ -142,7 +142,7 @@ class Sql():
|
||||
self.__close()
|
||||
self.__DB_CONN.commit()
|
||||
return id
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def checkInput(self, data):
|
||||
@@ -176,7 +176,7 @@ class Sql():
|
||||
"(" + keys + ") " + "VALUES(" + values + ")"
|
||||
result = self.__DB_CONN.execute(sql, param)
|
||||
return True
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def commit(self):
|
||||
@@ -194,8 +194,8 @@ class Sql():
|
||||
opt = opt[0:len(opt) - 1]
|
||||
sql = "UPDATE " + self.__DB_TABLE + " SET " + opt + self.__OPT_WHERE
|
||||
|
||||
import public
|
||||
public.writeFile('/tmp/test.pl', sql)
|
||||
import mw
|
||||
mw.writeFile('/tmp/test.pl', sql)
|
||||
|
||||
# 处理拼接WHERE与UPDATE参数
|
||||
tmp = list(param)
|
||||
@@ -206,7 +206,7 @@ class Sql():
|
||||
self.__close()
|
||||
self.__DB_CONN.commit()
|
||||
return result.rowcount
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def delete(self, id=None):
|
||||
@@ -221,7 +221,7 @@ class Sql():
|
||||
self.__close()
|
||||
self.__DB_CONN.commit()
|
||||
return result.rowcount
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def execute(self, sql, param):
|
||||
@@ -232,7 +232,7 @@ class Sql():
|
||||
result = self.__DB_CONN.execute(sql, param)
|
||||
self.__DB_CONN.commit()
|
||||
return result.rowcount
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def query(self, sql, param):
|
||||
@@ -243,14 +243,14 @@ class Sql():
|
||||
# 将元组转换成列表
|
||||
data = map(list, result)
|
||||
return data
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return "error: " + str(ex)
|
||||
|
||||
def create(self, name):
|
||||
# 创建数据表
|
||||
self.__GetConn()
|
||||
import public
|
||||
script = public.readFile('data/' + name + '.sql')
|
||||
import mw
|
||||
script = mw.readFile('data/' + name + '.sql')
|
||||
result = self.__DB_CONN.executescript(script)
|
||||
self.__DB_CONN.commit()
|
||||
return result.rowcount
|
||||
@@ -258,8 +258,8 @@ class Sql():
|
||||
def fofile(self, filename):
|
||||
# 执行脚本
|
||||
self.__GetConn()
|
||||
import public
|
||||
script = public.readFile(filename)
|
||||
import mw
|
||||
script = mw.readFile(filename)
|
||||
result = self.__DB_CONN.executescript(script)
|
||||
self.__DB_CONN.commit()
|
||||
return result.rowcount
|
||||
|
||||
@@ -4,7 +4,7 @@ import psutil
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
import public
|
||||
import mw
|
||||
import re
|
||||
import json
|
||||
import pwd
|
||||
@@ -13,6 +13,7 @@ import shutil
|
||||
from flask import request
|
||||
from flask import send_file, send_from_directory
|
||||
from flask import make_response
|
||||
from flask import session
|
||||
|
||||
|
||||
class files_api:
|
||||
@@ -20,34 +21,34 @@ class files_api:
|
||||
rPath = None
|
||||
|
||||
def __init__(self):
|
||||
self.rPath = public.getRootDir() + '/recycle_bin/'
|
||||
self.rPath = mw.getRootDir() + '/recycle_bin/'
|
||||
|
||||
##### ----- start ----- ###
|
||||
def getBodyApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
return self.getBody(path)
|
||||
|
||||
def getLastBodyApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
line = request.form.get('line', '100')
|
||||
|
||||
if not os.path.exists(path):
|
||||
return public.returnJson(False, '文件不存在', (path,))
|
||||
return mw.returnJson(False, '文件不存在', (path,))
|
||||
|
||||
try:
|
||||
data = public.getNumLines(path, int(line))
|
||||
return public.returnJson(True, 'OK', data)
|
||||
data = mw.getNumLines(path, int(line))
|
||||
return mw.returnJson(True, 'OK', data)
|
||||
except Exception as ex:
|
||||
return public.returnJson(False, u'无法正确读取文件!' + str(ex))
|
||||
return mw.returnJson(False, u'无法正确读取文件!' + str(ex))
|
||||
|
||||
def saveBodyApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
data = request.form.get('data', '').encode('utf-8')
|
||||
encoding = request.form.get('encoding', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
data = request.form.get('data', '')
|
||||
encoding = request.form.get('encoding', '')
|
||||
return self.saveBody(path, data, encoding)
|
||||
|
||||
def downloadApi(self):
|
||||
filename = request.args.get('filename', '').encode('utf-8')
|
||||
filename = request.args.get('filename', '')
|
||||
if not os.path.exists(filename):
|
||||
return ''
|
||||
response = make_response(send_from_directory(
|
||||
@@ -55,90 +56,142 @@ class files_api:
|
||||
return response
|
||||
|
||||
def zipApi(self):
|
||||
sfile = request.form.get('sfile', '').encode('utf-8')
|
||||
dfile = request.form.get('dfile', '').encode('utf-8')
|
||||
stype = request.form.get('type', '').encode('utf-8')
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
sfile = request.form.get('sfile', '')
|
||||
dfile = request.form.get('dfile', '')
|
||||
stype = request.form.get('type', '')
|
||||
path = request.form.get('path', '')
|
||||
return self.zip(sfile, dfile, stype, path)
|
||||
|
||||
# 移动文件或目录
|
||||
def mvFileApi(self):
|
||||
sfile = request.form.get('sfile', '')
|
||||
dfile = request.form.get('dfile', '')
|
||||
if not self.checkFileName(dfile):
|
||||
return mw.returnJson(False, '文件名中不能包含特殊字符!')
|
||||
if not os.path.exists(sfile):
|
||||
return mw.returnJson(False, '指定文件不存在!')
|
||||
|
||||
if not self.checkDir(sfile):
|
||||
return mw.returnJson(False, 'FILE_DANGER')
|
||||
|
||||
import shutil
|
||||
try:
|
||||
shutil.move(sfile, dfile)
|
||||
msg = mw.getInfo('移动文件或目录[{1}]到[{2}]成功!', (sfile, dfile,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, '移动文件或目录成功!')
|
||||
except:
|
||||
return mw.returnJson(False, '移动文件或目录失败!')
|
||||
|
||||
def deleteApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
return self.delete(path)
|
||||
|
||||
def fileAccessApi(self):
|
||||
filename = request.form.get('filename', '').encode('utf-8')
|
||||
filename = request.form.get('filename', '')
|
||||
data = self.getAccess(filename)
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def setFileAccessApi(self):
|
||||
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(True, '开发机不设置!')
|
||||
|
||||
filename = request.form.get('filename', '')
|
||||
user = request.form.get('user', '')
|
||||
access = request.form.get('access', '755')
|
||||
sall = '-R'
|
||||
try:
|
||||
if not self.checkDir(filename):
|
||||
return mw.returnJson(False, '请不要花样作死')
|
||||
|
||||
if not os.path.exists(filename):
|
||||
return mw.returnJson(False, '指定文件不存在!')
|
||||
|
||||
os.system('chmod ' + sall + ' ' + access + " '" + filename + "'")
|
||||
os.system('chown ' + sall + ' ' + user +
|
||||
':' + user + " '" + filename + "'")
|
||||
msg = mw.getInfo(
|
||||
'设置[{1}]权限为[{2}]所有者为[{3}]', (filename, access, user,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, '设置成功!')
|
||||
except:
|
||||
return mw.returnJson(False, '设置失败!')
|
||||
|
||||
def getDirSizeApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
tmp = self.getDirSize(path)
|
||||
return public.returnJson(True, tmp[0].split()[0])
|
||||
print(tmp)
|
||||
return mw.returnJson(True, tmp[0].split()[0])
|
||||
|
||||
def getDirApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
if not os.path.exists(path):
|
||||
path = public.getRootDir() + "/wwwroot"
|
||||
path = mw.getRootDir() + "/wwwroot"
|
||||
search = request.args.get('search', '').strip().lower()
|
||||
page = request.args.get('p', '1').strip().lower()
|
||||
row = request.args.get('showRow', '10')
|
||||
disk = request.form.get('disk', '')
|
||||
if disk == 'True':
|
||||
row = 1000
|
||||
|
||||
return self.getDir(path, int(page), int(row), search)
|
||||
|
||||
def createFileApi(self):
|
||||
file = request.form.get('path', '').encode('utf-8')
|
||||
file = request.form.get('path', '')
|
||||
try:
|
||||
if not self.checkFileName(file):
|
||||
return public.returnJson(False, '文件名中不能包含特殊字符!')
|
||||
return mw.returnJson(False, '文件名中不能包含特殊字符!')
|
||||
if os.path.exists(file):
|
||||
return public.returnJson(False, '指定文件已存在!')
|
||||
return mw.returnJson(False, '指定文件已存在!')
|
||||
_path = os.path.dirname(file)
|
||||
if not os.path.exists(_path):
|
||||
os.makedirs(_path)
|
||||
open(file, 'w+').close()
|
||||
self.setFileAccept(file)
|
||||
msg = public.getInfo('创建文件[{1}]成功!', (file,))
|
||||
public.writeLog('文件管理', msg)
|
||||
return public.returnJson(True, '文件创建成功!')
|
||||
msg = mw.getInfo('创建文件[{1}]成功!', (file,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, '文件创建成功!')
|
||||
except Exception as e:
|
||||
# print str(e)
|
||||
return public.returnJson(True, '文件创建失败!')
|
||||
return mw.returnJson(True, '文件创建失败!')
|
||||
|
||||
def createDirApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
try:
|
||||
if not self.checkFileName(path):
|
||||
return public.returnJson(False, '目录名中不能包含特殊字符!')
|
||||
return mw.returnJson(False, '目录名中不能包含特殊字符!')
|
||||
if os.path.exists(path):
|
||||
return public.returnJson(False, '指定目录已存在!')
|
||||
return mw.returnJson(False, '指定目录已存在!')
|
||||
os.makedirs(path)
|
||||
self.setFileAccept(path)
|
||||
msg = public.getInfo('创建目录[{1}]成功!', (path,))
|
||||
public.writeLog('文件管理', msg)
|
||||
return public.returnJson(True, '目录创建成功!')
|
||||
msg = mw.getInfo('创建目录[{1}]成功!', (path,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, '目录创建成功!')
|
||||
except Exception as e:
|
||||
return public.returnJson(False, '目录创建失败!')
|
||||
return mw.returnJson(False, '目录创建失败!')
|
||||
|
||||
def downloadFileApi(self):
|
||||
import db
|
||||
import time
|
||||
url = request.form.get('url', '').encode('utf-8')
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
filename = request.form.get('filename', '').encode('utf-8')
|
||||
url = request.form.get('url', '')
|
||||
path = request.form.get('path', '')
|
||||
filename = request.form.get('filename', '')
|
||||
|
||||
isTask = public.getRootDir() + '/tmp/panelTask.pl'
|
||||
isTask = mw.getRootDir() + '/tmp/panelTask.pl'
|
||||
execstr = url + '|mw|' + path + '/' + filename
|
||||
public.M('tasks').add('name,type,status,addtime,execstr',
|
||||
('下载文件[' + filename + ']', 'download', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr))
|
||||
public.writeFile(isTask, 'True')
|
||||
mw.M('tasks').add('name,type,status,addtime,execstr',
|
||||
('下载文件[' + filename + ']', 'download', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr))
|
||||
mw.writeFile(isTask, 'True')
|
||||
# self.setFileAccept(path + '/' + filename)
|
||||
return public.returnJson(True, '已将下载任务添加到队列!')
|
||||
return mw.returnJson(True, '已将下载任务添加到队列!')
|
||||
|
||||
def removeTaskApi(self):
|
||||
mid = request.form.get('id', '').encode('utf-8')
|
||||
mid = request.form.get('id', '')
|
||||
try:
|
||||
name = public.M('tasks').where('id=?', (mid,)).getField('name')
|
||||
status = public.M('tasks').where('id=?', (mid,)).getField('status')
|
||||
public.M('tasks').delete(mid)
|
||||
name = mw.M('tasks').where('id=?', (mid,)).getField('name')
|
||||
status = mw.M('tasks').where('id=?', (mid,)).getField('status')
|
||||
mw.M('tasks').delete(mid)
|
||||
if status == '-1':
|
||||
os.system(
|
||||
"kill `ps -ef |grep 'python panelSafe.pyc'|grep -v grep|grep -v panelExec|awk '{print $2}'`")
|
||||
@@ -156,26 +209,25 @@ done
|
||||
|
||||
os.system(
|
||||
'rm -f ' + name.replace('扫描目录[', '').replace(']', '') + '/scan.pl')
|
||||
isTask = public.getRootDir() + '/tmp/panelTask.pl'
|
||||
public.writeFile(isTask, 'True')
|
||||
isTask = mw.getRootDir() + '/tmp/panelTask.pl'
|
||||
mw.writeFile(isTask, 'True')
|
||||
os.system('/etc/init.d/mw start')
|
||||
except:
|
||||
os.system('/etc/init.d/mw start')
|
||||
return public.returnJson(True, '任务已删除!')
|
||||
return mw.returnJson(True, '任务已删除!')
|
||||
|
||||
# 上传文件
|
||||
def uploadFileApi(self):
|
||||
from werkzeug.utils import secure_filename
|
||||
from flask import request
|
||||
|
||||
path = request.args.get('path', '').encode('utf-8')
|
||||
path = request.args.get('path', '')
|
||||
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
f = request.files['zunfile']
|
||||
filename = os.path.join(path, f.filename)
|
||||
if sys.version_info[0] == 2:
|
||||
filename = filename.encode('utf-8')
|
||||
|
||||
s_path = path
|
||||
if os.path.exists(filename):
|
||||
s_path = filename
|
||||
@@ -184,9 +236,9 @@ done
|
||||
os.chown(filename, p_stat.st_uid, p_stat.st_gid)
|
||||
os.chmod(filename, p_stat.st_mode)
|
||||
|
||||
msg = public.getInfo('上传文件[{1}] 到 [{2}]成功!', (filename, path))
|
||||
public.writeLog('文件管理', msg)
|
||||
return public.returnMsg(True, '上传成功!')
|
||||
msg = mw.getInfo('上传文件[{1}] 到 [{2}]成功!', (filename, path))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnMsg(True, '上传成功!')
|
||||
|
||||
def getRecycleBinApi(self):
|
||||
rPath = self.rPath
|
||||
@@ -220,48 +272,49 @@ done
|
||||
data['dirs'].append(tmp)
|
||||
else:
|
||||
data['files'].append(tmp)
|
||||
except:
|
||||
except Exception as e:
|
||||
print(e)
|
||||
continue
|
||||
return public.returnJson(True, 'OK', data)
|
||||
return mw.returnJson(True, 'OK', data)
|
||||
|
||||
# 回收站开关
|
||||
def recycleBinApi(self):
|
||||
c = 'data/recycle_bin.pl'
|
||||
db = request.form.get('db', '').encode('utf-8')
|
||||
db = request.form.get('db', '')
|
||||
if db != '':
|
||||
c = 'data/recycle_bin_db.pl'
|
||||
if os.path.exists(c):
|
||||
os.remove(c)
|
||||
public.writeLog('文件管理', '已关闭回收站功能!')
|
||||
return public.returnJson(True, '已关闭回收站功能!')
|
||||
mw.writeLog('文件管理', '已关闭回收站功能!')
|
||||
return mw.returnJson(True, '已关闭回收站功能!')
|
||||
else:
|
||||
public.writeFile(c, 'True')
|
||||
public.writeLog('文件管理', '已开启回收站功能!')
|
||||
return public.returnJson(True, '已开启回收站功能!')
|
||||
mw.writeFile(c, 'True')
|
||||
mw.writeLog('文件管理', '已开启回收站功能!')
|
||||
return mw.returnJson(True, '已开启回收站功能!')
|
||||
|
||||
def reRecycleBinApi(self):
|
||||
rPath = self.rPath
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
dFile = path.replace('_mw_', '/').split('_t_')[0]
|
||||
try:
|
||||
import shutil
|
||||
shutil.move(rPath + path, dFile)
|
||||
msg = public.getInfo('移动文件[{1}]到回收站成功!', (dFile,))
|
||||
public.writeLog('文件管理', msg)
|
||||
return public.returnJson(True, '恢复成功!')
|
||||
msg = mw.getInfo('移动文件[{1}]到回收站成功!', (dFile,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, '恢复成功!')
|
||||
except Exception as e:
|
||||
msg = public.getInfo('从回收站恢复[{1}]失败!', (dFile,))
|
||||
public.writeLog('文件管理', msg)
|
||||
return public.returnJson(False, '恢复失败!')
|
||||
msg = mw.getInfo('从回收站恢复[{1}]失败!', (dFile,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(False, '恢复失败!')
|
||||
|
||||
def delRecycleBinApi(self):
|
||||
rPath = self.rPath
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
empty = request.form.get('empty', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
empty = request.form.get('empty', '')
|
||||
dFile = path.split('_t_')[0]
|
||||
|
||||
if not self.checkDir(path):
|
||||
return public.returnJson(False, '敏感目录,请不要花样作死!')
|
||||
return mw.returnJson(False, '敏感目录,请不要花样作死!')
|
||||
|
||||
os.system('which chattr && chattr -R -i ' + rPath + path)
|
||||
if os.path.isdir(rPath + path):
|
||||
@@ -271,14 +324,14 @@ done
|
||||
os.remove(rPath + path)
|
||||
|
||||
tfile = path.replace('_mw_', '/').split('_t_')[0]
|
||||
msg = public.getInfo('已彻底从回收站删除{1}!', (tfile,))
|
||||
public.writeLog('文件管理', msg)
|
||||
return public.returnJson(True, msg)
|
||||
msg = mw.getInfo('已彻底从回收站删除{1}!', (tfile,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, msg)
|
||||
|
||||
# 获取进度
|
||||
def getSpeedApi(self):
|
||||
data = public.getSpeed()
|
||||
return public.returnJson(True, '已清空回收站!', data)
|
||||
data = mw.getSpeed()
|
||||
return mw.returnJson(True, '已清空回收站!', data)
|
||||
|
||||
def closeRecycleBinApi(self):
|
||||
rPath = self.rPath
|
||||
@@ -289,19 +342,19 @@ done
|
||||
for name in rlist:
|
||||
i += 1
|
||||
path = rPath + name
|
||||
public.writeSpeed(name, i, l)
|
||||
mw.writeSpeed(name, i, l)
|
||||
if os.path.isdir(path):
|
||||
shutil.rmtree(path)
|
||||
else:
|
||||
os.remove(path)
|
||||
public.writeSpeed(None, 0, 0)
|
||||
public.writeLog('文件管理', '已清空回收站!')
|
||||
return public.returnJson(True, '已清空回收站!')
|
||||
mw.writeSpeed(None, 0, 0)
|
||||
mw.writeLog('文件管理', '已清空回收站!')
|
||||
return mw.returnJson(True, '已清空回收站!')
|
||||
|
||||
def deleteDirApi(self):
|
||||
path = request.form.get('path', '').encode('utf-8')
|
||||
path = request.form.get('path', '')
|
||||
if not os.path.exists(path):
|
||||
return public.returnJson(False, '指定文件不存在!')
|
||||
return mw.returnJson(False, '指定文件不存在!')
|
||||
|
||||
# 检查是否为.user.ini
|
||||
if path.find('.user.ini'):
|
||||
@@ -309,26 +362,207 @@ done
|
||||
try:
|
||||
if os.path.exists('data/recycle_bin.pl'):
|
||||
if self.mvRecycleBin(path):
|
||||
return public.returnJson(True, '已将文件移动到回收站!')
|
||||
os.remove(path)
|
||||
public.writeLog('文件管理', '删除文件成功!', (path,))
|
||||
return public.returnJson(True, '删除文件成功!')
|
||||
return mw.returnJson(True, '已将文件移动到回收站!')
|
||||
mw.execShell('rm -rf ' + path)
|
||||
mw.writeLog('文件管理', '删除文件成功!', (path,))
|
||||
return mw.returnJson(True, '删除文件成功!')
|
||||
except:
|
||||
return public.returnJson(False, '删除文件失败!')
|
||||
return mw.returnJson(False, '删除文件失败!')
|
||||
|
||||
def closeLogsApi(self):
|
||||
logPath = public.getLogsDir()
|
||||
logPath = mw.getLogsDir()
|
||||
os.system('rm -f ' + logPath + '/*')
|
||||
os.system('kill -USR1 `cat ' + public.getServerDir() +
|
||||
os.system('kill -USR1 `cat ' + mw.getServerDir() +
|
||||
'openresty/nginx/logs/nginx.pid`')
|
||||
public.writeLog('文件管理', '网站日志已被清空!')
|
||||
mw.writeLog('文件管理', '网站日志已被清空!')
|
||||
tmp = self.getDirSize(logPath)
|
||||
return public.returnJson(True, tmp[0].split()[0])
|
||||
return mw.returnJson(True, tmp[0].split()[0])
|
||||
|
||||
def setBatchDataApi(self):
|
||||
path = request.form.get('path', '')
|
||||
stype = request.form.get('type', '')
|
||||
access = request.form.get('access', '')
|
||||
user = request.form.get('user', '')
|
||||
data = request.form.get('data')
|
||||
if stype == '1' or stype == '2':
|
||||
session['selected'] = {
|
||||
'path': path,
|
||||
'type': stype,
|
||||
'access': access,
|
||||
'user': user,
|
||||
'data': data
|
||||
}
|
||||
return mw.returnJson(True, '标记成功,请在目标目录点击粘贴所有按钮!')
|
||||
elif stype == '3':
|
||||
for key in json.loads(data):
|
||||
try:
|
||||
filename = path + '/' + key
|
||||
if not self.checkDir(filename):
|
||||
return mw.returnJson(False, 'FILE_DANGER')
|
||||
os.system('chmod -R ' + access + " '" + filename + "'")
|
||||
os.system('chown -R ' + user + ':' +
|
||||
user + " '" + filename + "'")
|
||||
except:
|
||||
continue
|
||||
mw.writeLog('文件管理', '批量设置权限成功!')
|
||||
return mw.returnJson(True, '批量设置权限成功!')
|
||||
else:
|
||||
import shutil
|
||||
isRecyle = os.path.exists('data/recycle_bin.pl')
|
||||
data = json.loads(data)
|
||||
l = len(data)
|
||||
i = 0
|
||||
for key in data:
|
||||
try:
|
||||
filename = path + '/' + key
|
||||
topath = filename
|
||||
if not os.path.exists(filename):
|
||||
continue
|
||||
|
||||
i += 1
|
||||
mw.writeSpeed(key, i, l)
|
||||
if os.path.isdir(filename):
|
||||
if not self.checkDir(filename):
|
||||
return mw.returnJson(False, '请不要花样作死!')
|
||||
if isRecyle:
|
||||
self.mvRecycleBin(topath)
|
||||
else:
|
||||
shutil.rmtree(filename)
|
||||
else:
|
||||
if key == '.user.ini':
|
||||
os.system('which chattr && chattr -i ' + filename)
|
||||
if isRecyle:
|
||||
self.mvRecycleBin(topath)
|
||||
else:
|
||||
os.remove(filename)
|
||||
except:
|
||||
continue
|
||||
mw.writeSpeed(None, 0, 0)
|
||||
mw.writeLog('文件管理', '批量删除成功!')
|
||||
return mw.returnJson(True, '批量删除成功!')
|
||||
|
||||
def checkExistsFilesApi(self):
|
||||
dfile = request.form.get('dfile', '')
|
||||
filename = request.form.get('filename', '')
|
||||
data = []
|
||||
filesx = []
|
||||
if filename == '':
|
||||
filesx = json.loads(session['selected']['data'])
|
||||
else:
|
||||
filesx.append(filename)
|
||||
|
||||
# print(filesx)
|
||||
|
||||
for fn in filesx:
|
||||
if fn == '.':
|
||||
continue
|
||||
filename = dfile + '/' + fn
|
||||
if os.path.exists(filename):
|
||||
tmp = {}
|
||||
stat = os.stat(filename)
|
||||
tmp['filename'] = fn
|
||||
tmp['size'] = os.path.getsize(filename)
|
||||
tmp['mtime'] = str(int(stat.st_mtime))
|
||||
data.append(tmp)
|
||||
return mw.returnJson(True, 'ok', data)
|
||||
|
||||
def batchPasteApi(self):
|
||||
path = request.form.get('path', '')
|
||||
stype = request.form.get('type', '')
|
||||
# filename = request.form.get('filename', '')
|
||||
import shutil
|
||||
if not self.checkDir(path):
|
||||
return mw.returnJson(False, '请不要花样作死!')
|
||||
i = 0
|
||||
myfiles = json.loads(session['selected']['data'])
|
||||
l = len(myfiles)
|
||||
if stype == '1':
|
||||
for key in myfiles:
|
||||
i += 1
|
||||
mw.writeSpeed(key, i, l)
|
||||
try:
|
||||
|
||||
sfile = session['selected'][
|
||||
'path'] + '/' + key
|
||||
dfile = path + '/' + key
|
||||
|
||||
if os.path.isdir(sfile):
|
||||
shutil.copytree(sfile, dfile)
|
||||
else:
|
||||
shutil.copyfile(sfile, dfile)
|
||||
stat = os.stat(sfile)
|
||||
os.chown(dfile, stat.st_uid, stat.st_gid)
|
||||
except:
|
||||
continue
|
||||
msg = mw.getInfo('从[{1}]批量复制到[{2}]成功',
|
||||
(session['selected']['path'], path,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
else:
|
||||
for key in myfiles:
|
||||
try:
|
||||
i += 1
|
||||
mw.writeSpeed(key, i, l)
|
||||
|
||||
sfile = session['selected'][
|
||||
'path'] + '/' + key
|
||||
dfile = path + '/' + key
|
||||
|
||||
shutil.move(sfile, dfile)
|
||||
except:
|
||||
continue
|
||||
msg = mw.getInfo('从[{1}]批量移动到[{2}]成功',
|
||||
(session['selected']['path'], path,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
mw.writeSpeed(None, 0, 0)
|
||||
errorCount = len(myfiles) - i
|
||||
del(session['selected'])
|
||||
msg = mw.getInfo('批量操作成功[{1}],失败[{2}]', (str(i), str(errorCount)))
|
||||
return mw.returnJson(True, msg)
|
||||
|
||||
def copyFileApi(self):
|
||||
sfile = request.form.get('sfile', '')
|
||||
dfile = request.form.get('dfile', '')
|
||||
|
||||
if not os.path.exists(sfile):
|
||||
return mw.returnJson(False, '指定文件不存在!')
|
||||
|
||||
if os.path.isdir(sfile):
|
||||
return self.copyDir(sfile, dfile)
|
||||
|
||||
import shutil
|
||||
try:
|
||||
shutil.copyfile(sfile, dfile)
|
||||
msg = mw.getInfo('复制文件[{1}]到[{2}]成功!', (sfile, dfile,))
|
||||
mw.writeLog('文件管理', msg)
|
||||
stat = os.stat(sfile)
|
||||
os.chown(dfile, stat.st_uid, stat.st_gid)
|
||||
return mw.returnJson(True, '文件复制成功!')
|
||||
except:
|
||||
return mw.returnJson(False, '文件复制失败!')
|
||||
|
||||
##### ----- end ----- ###
|
||||
|
||||
def copyDir(self, sfile, dfile):
|
||||
|
||||
if not os.path.exists(sfile):
|
||||
return mw.returnJson(False, '指定目录不存在!')
|
||||
|
||||
if os.path.exists(dfile):
|
||||
return mw.returnJson(False, '指定目录已存在!')
|
||||
import shutil
|
||||
try:
|
||||
shutil.copytree(sfile, dfile)
|
||||
stat = os.stat(sfile)
|
||||
os.chown(dfile, stat.st_uid, stat.st_gid)
|
||||
msg = mw.getInfo('复制目录[{1}]到[{2}]成功!', (sfile, dfile))
|
||||
mw.writeLog('文件管理', msg)
|
||||
return mw.returnJson(True, '目录复制成功!')
|
||||
except:
|
||||
return mw.returnJson(False, '目录复制失败!')
|
||||
|
||||
# 检查敏感目录
|
||||
def checkDir(self, path):
|
||||
path = str(path, encoding='utf-8')
|
||||
path = path.replace('//', '/')
|
||||
if path[-1:] == '/':
|
||||
path = path[:-1]
|
||||
@@ -357,15 +591,15 @@ done
|
||||
'/selinux',
|
||||
'/www/server',
|
||||
'/www/server/data',
|
||||
public.getRootDir())
|
||||
mw.getRootDir())
|
||||
|
||||
return not path in nDirs
|
||||
|
||||
def getDirSize(self, path):
|
||||
if public.getOs() == 'darwin':
|
||||
tmp = public.execShell('du -sh ' + path)
|
||||
if mw.getOs() == 'darwin':
|
||||
tmp = mw.execShell('du -sh ' + path)
|
||||
else:
|
||||
tmp = public.execShell('du -sbh ' + path)
|
||||
tmp = mw.execShell('du -sbh ' + path)
|
||||
return tmp
|
||||
|
||||
def checkFileName(self, filename):
|
||||
@@ -380,8 +614,8 @@ done
|
||||
|
||||
def setFileAccept(self, filename):
|
||||
auth = 'www:www'
|
||||
if public.getOs() == 'darwin':
|
||||
user = public.execShell(
|
||||
if mw.getOs() == 'darwin':
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
auth = user + ':staff'
|
||||
os.system('chown -R ' + auth + ' ' + filename)
|
||||
@@ -397,20 +631,20 @@ done
|
||||
try:
|
||||
import shutil
|
||||
shutil.move(path, rFile)
|
||||
public.writeLog('TYPE_FILE', public.getInfo(
|
||||
mw.writeLog('文件管理', mw.getInfo(
|
||||
'移动文件[{1}]到回收站成功!', (path)))
|
||||
return True
|
||||
except:
|
||||
public.writeLog('TYPE_FILE', public.getInfo(
|
||||
mw.writeLog('文件管理', mw.getInfo(
|
||||
'移动文件[{1}]到回收站失败!', (path)))
|
||||
return False
|
||||
|
||||
def getBody(self, path):
|
||||
if not os.path.exists(path):
|
||||
return public.returnJson(False, '文件不存在', (path,))
|
||||
return mw.returnJson(False, '文件不存在', (path,))
|
||||
|
||||
if os.path.getsize(path) > 2097152:
|
||||
return public.returnJson(False, u'不能在线编辑大于2MB的文件!')
|
||||
return mw.returnJson(False, u'不能在线编辑大于2MB的文件!')
|
||||
|
||||
fp = open(path, 'rb')
|
||||
data = {}
|
||||
@@ -457,13 +691,13 @@ done
|
||||
data['data'] = srcBody.decode('utf-8')
|
||||
data['encoding'] = u'utf-8'
|
||||
|
||||
return public.returnJson(True, 'OK', data)
|
||||
return mw.returnJson(True, 'OK', data)
|
||||
except Exception as ex:
|
||||
return public.returnJson(False, u'文件编码不被兼容,无法正确读取文件!' + str(ex))
|
||||
return mw.returnJson(False, u'文件编码不被兼容,无法正确读取文件!' + str(ex))
|
||||
|
||||
def saveBody(self, path, data, encoding='utf-8'):
|
||||
if not os.path.exists(path):
|
||||
return public.returnJson(False, '文件不存在')
|
||||
return mw.returnJson(False, '文件不存在')
|
||||
try:
|
||||
if encoding == 'ascii':
|
||||
encoding = 'utf-8'
|
||||
@@ -477,18 +711,18 @@ done
|
||||
fp.write(data)
|
||||
fp.close()
|
||||
|
||||
public.writeLog('TYPE_FILE', '文件保存成功', (path,))
|
||||
return public.returnJson(True, '文件保存成功')
|
||||
mw.writeLog('文件管理', '文件保存成功', (path,))
|
||||
return mw.returnJson(True, '文件保存成功')
|
||||
except Exception as ex:
|
||||
return public.returnJson(False, 'FILE_SAVE_ERR:' + str(ex))
|
||||
return mw.returnJson(False, 'FILE_SAVE_ERR:' + str(ex))
|
||||
|
||||
def zip(self, sfile, dfile, stype, path):
|
||||
if sfile.find(',') == -1:
|
||||
if not os.path.exists(path + '/' + sfile):
|
||||
return public.returnMsg(False, '指定文件不存在!')
|
||||
return mw.returnMsg(False, '指定文件不存在!')
|
||||
|
||||
try:
|
||||
tmps = public.getRunDir() + '/tmp/panelExec.log'
|
||||
tmps = mw.getRunDir() + '/tmp/panelExec.log'
|
||||
if stype == 'zip':
|
||||
os.system("cd '" + path + "' && zip '" + dfile +
|
||||
"' -r '" + sfile + "' > " + tmps + " 2>&1")
|
||||
@@ -501,15 +735,15 @@ done
|
||||
os.system("cd '" + path + "' && tar -zcvf '" +
|
||||
dfile + "' " + sfiles + " > " + tmps + " 2>&1")
|
||||
self.setFileAccept(dfile)
|
||||
public.writeLog("TYPE_FILE", '文件压缩成功!', (sfile, dfile))
|
||||
return public.returnJson(True, '文件压缩成功!')
|
||||
mw.writeLog("文件管理", '文件压缩成功!', (sfile, dfile))
|
||||
return mw.returnJson(True, '文件压缩成功!')
|
||||
except:
|
||||
return public.returnJson(False, '文件压缩失败!')
|
||||
return mw.returnJson(False, '文件压缩失败!')
|
||||
|
||||
def delete(self, path):
|
||||
|
||||
if not os.path.exists(path):
|
||||
return public.returnJson(False, '指定文件不存在!')
|
||||
return mw.returnJson(False, '指定文件不存在!')
|
||||
|
||||
# 检查是否为.user.ini
|
||||
if path.find('.user.ini') >= 0:
|
||||
@@ -518,13 +752,13 @@ done
|
||||
try:
|
||||
if os.path.exists('data/recycle_bin.pl'):
|
||||
if self.mvRecycleBin(path):
|
||||
return public.returnJson(True, '已将文件移动到回收站!')
|
||||
return mw.returnJson(True, '已将文件移动到回收站!')
|
||||
os.remove(path)
|
||||
public.writeLog('TYPE_FILE', public.getInfo(
|
||||
mw.writeLog('文件管理', mw.getInfo(
|
||||
'删除文件[{1}]成功!', (path)))
|
||||
return public.returnJson(True, '删除文件成功!')
|
||||
return mw.returnJson(True, '删除文件成功!')
|
||||
except:
|
||||
return public.returnJson(False, '删除文件失败!')
|
||||
return mw.returnJson(False, '删除文件失败!')
|
||||
|
||||
def getAccess(self, filename):
|
||||
data = {}
|
||||
@@ -559,7 +793,7 @@ done
|
||||
info['row'] = page_size
|
||||
info['p'] = page
|
||||
info['tojs'] = 'getFiles'
|
||||
pageObj = public.getPageObject(info, '1,2,3,4,5,6,7,8')
|
||||
pageObj = mw.getPageObject(info, '1,2,3,4,5,6,7,8')
|
||||
data['PAGE'] = pageObj[0]
|
||||
|
||||
i = 0
|
||||
@@ -573,9 +807,8 @@ done
|
||||
break
|
||||
if i < pageObj[1].SHIFT:
|
||||
continue
|
||||
|
||||
try:
|
||||
filePath = (path + '/' + filename).encode('utf8')
|
||||
filePath = path + '/' + filename
|
||||
link = ''
|
||||
if os.path.islink(filePath):
|
||||
filePath = os.readlink(filePath)
|
||||
@@ -591,8 +824,9 @@ done
|
||||
user = ''
|
||||
try:
|
||||
user = pwd.getpwuid(stat.st_uid).pw_name
|
||||
except:
|
||||
except Exception as ee:
|
||||
user = str(stat.st_uid)
|
||||
|
||||
size = str(stat.st_size)
|
||||
if os.path.isdir(filePath):
|
||||
dirnames.append(filename + ';' + size + ';' +
|
||||
@@ -601,10 +835,11 @@ done
|
||||
filenames.append(filename + ';' + size + ';' +
|
||||
mtime + ';' + accept + ';' + user + ';' + link)
|
||||
n += 1
|
||||
except:
|
||||
except Exception as e:
|
||||
print('getdir:dd.', e)
|
||||
continue
|
||||
|
||||
data['DIR'] = sorted(dirnames)
|
||||
data['FILES'] = sorted(filenames)
|
||||
data['PATH'] = path.replace('//', '/')
|
||||
return public.getJson(data)
|
||||
|
||||
return mw.getJson(data)
|
||||
|
||||
@@ -4,7 +4,7 @@ import psutil
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
import public
|
||||
import mw
|
||||
import re
|
||||
import json
|
||||
import pwd
|
||||
@@ -23,7 +23,7 @@ class firewall_api:
|
||||
self.__isFirewalld = True
|
||||
if os.path.exists('/usr/sbin/ufw'):
|
||||
self.__isUfw = True
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
self.__isMac = True
|
||||
|
||||
##### ----- start ----- ###
|
||||
@@ -35,30 +35,34 @@ class firewall_api:
|
||||
|
||||
rep = "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\/\d{1,2})?$"
|
||||
if not re.search(rep, port):
|
||||
return public.returnJson(False, '您输入的IP地址不合法!')
|
||||
return mw.returnJson(False, '您输入的IP地址不合法!')
|
||||
address = port
|
||||
if public.M('firewall').where("port=?", (address,)).count() > 0:
|
||||
return public.returnJson(False, '您要放屏蔽的IP已存在屏蔽列表,无需重复处理!')
|
||||
if mw.M('firewall').where("port=?", (address,)).count() > 0:
|
||||
return mw.returnJson(False, '您要放屏蔽的IP已存在屏蔽列表,无需重复处理!')
|
||||
if self.__isUfw:
|
||||
public.execShell('ufw deny from ' + address + ' to any')
|
||||
mw.execShell('ufw deny from ' + address + ' to any')
|
||||
else:
|
||||
if self.__isFirewalld:
|
||||
cmd = 'firewall-cmd --permanent --add-rich-rule=\'rule family=ipv4 source address="' + \
|
||||
address + '" drop\''
|
||||
public.execShell(cmd)
|
||||
mw.execShell(cmd)
|
||||
else:
|
||||
cmd = 'iptables -I INPUT -s ' + address + ' -j DROP'
|
||||
public.execShell(cmd)
|
||||
mw.execShell(cmd)
|
||||
|
||||
msg = public.getInfo('屏蔽IP[{1}]成功!', (address,))
|
||||
public.writeLog("防火墙管理", msg)
|
||||
msg = mw.getInfo('屏蔽IP[{1}]成功!', (address,))
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
addtime = time.strftime('%Y-%m-%d %X', time.localtime())
|
||||
public.M('firewall').add('port,ps,addtime', (address, ps, addtime))
|
||||
mw.M('firewall').add('port,ps,addtime', (address, ps, addtime))
|
||||
self.firewallReload()
|
||||
return public.returnJson(True, '添加成功!')
|
||||
return mw.returnJson(True, '添加成功!')
|
||||
|
||||
# 添加放行端口
|
||||
def addAcceptPortApi(self):
|
||||
|
||||
if not self.getFwStatus():
|
||||
return mw.returnJson(False, '防火墙启动时,才能添加规则!')
|
||||
|
||||
import re
|
||||
import time
|
||||
port = request.form.get('port', '').strip()
|
||||
@@ -67,76 +71,79 @@ class firewall_api:
|
||||
|
||||
rep = "^\d{1,5}(:\d{1,5})?$"
|
||||
if not re.search(rep, port):
|
||||
return public.returnJson(False, '端口范围不正确!')
|
||||
return mw.returnJson(False, '端口范围不正确!')
|
||||
|
||||
if public.M('firewall').where("port=?", (port,)).count() > 0:
|
||||
return public.returnJson(False, '您要放行的端口已存在,无需重复放行!')
|
||||
if mw.M('firewall').where("port=?", (port,)).count() > 0:
|
||||
return mw.returnJson(False, '您要放行的端口已存在,无需重复放行!')
|
||||
|
||||
msg = public.getInfo('放行端口[{1}]成功', (port,))
|
||||
public.writeLog("防火墙管理", msg)
|
||||
msg = mw.getInfo('放行端口[{1}]成功', (port,))
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
addtime = time.strftime('%Y-%m-%d %X', time.localtime())
|
||||
public.M('firewall').add('port,ps,addtime', (port, ps, addtime))
|
||||
mw.M('firewall').add('port,ps,addtime', (port, ps, addtime))
|
||||
|
||||
self.addAcceptPort(port)
|
||||
self.firewallReload()
|
||||
return public.returnJson(True, '添加放行(' + port + ')端口成功!')
|
||||
return mw.returnJson(True, '添加放行(' + port + ')端口成功!')
|
||||
|
||||
# 删除IP屏蔽
|
||||
def delDropAddressApi(self):
|
||||
if not self.getFwStatus():
|
||||
return mw.returnJson(False, '防火墙启动时,才能删除规则!')
|
||||
|
||||
port = request.form.get('port', '').strip()
|
||||
ps = request.form.get('ps', '').strip()
|
||||
sid = request.form.get('id', '').strip()
|
||||
address = port
|
||||
if self.__isUfw:
|
||||
public.execShell('ufw delete deny from ' + address + ' to any')
|
||||
mw.execShell('ufw delete deny from ' + address + ' to any')
|
||||
else:
|
||||
if self.__isFirewalld:
|
||||
public.execShell(
|
||||
mw.execShell(
|
||||
'firewall-cmd --permanent --remove-rich-rule=\'rule family=ipv4 source address="' + address + '" drop\'')
|
||||
elif self.__isMac:
|
||||
pass
|
||||
else:
|
||||
cmd = 'iptables -D INPUT -s ' + address + ' -j DROP'
|
||||
public.execShell(cmd)
|
||||
mw.execShell(cmd)
|
||||
|
||||
msg = public.getInfo('解除IP[{1}]的屏蔽!', (address,))
|
||||
public.writeLog("防火墙管理", msg)
|
||||
public.M('firewall').where("id=?", (sid,)).delete()
|
||||
msg = mw.getInfo('解除IP[{1}]的屏蔽!', (address,))
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
mw.M('firewall').where("id=?", (sid,)).delete()
|
||||
|
||||
self.firewallReload()
|
||||
return public.returnJson(True, '删除成功!')
|
||||
return mw.returnJson(True, '删除成功!')
|
||||
|
||||
# 删除放行端口
|
||||
def delAcceptPortApi(self):
|
||||
port = request.form.get('port', '').strip()
|
||||
sid = request.form.get('id', '').strip()
|
||||
mw_port = public.readFile('data/port.pl')
|
||||
mw_port = mw.readFile('data/port.pl')
|
||||
try:
|
||||
if(port == mw_port):
|
||||
return public.returnJson(False, '失败,不能删除当前面板端口!')
|
||||
return mw.returnJson(False, '失败,不能删除当前面板端口!')
|
||||
if self.__isUfw:
|
||||
public.execShell('ufw delete allow ' + port + '/tcp')
|
||||
mw.execShell('ufw delete allow ' + port + '/tcp')
|
||||
else:
|
||||
if self.__isFirewalld:
|
||||
public.execShell(
|
||||
mw.execShell(
|
||||
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/tcp')
|
||||
public.execShell(
|
||||
mw.execShell(
|
||||
'firewall-cmd --permanent --zone=public --remove-port=' + port + '/udp')
|
||||
else:
|
||||
public.execShell(
|
||||
mw.execShell(
|
||||
'iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT')
|
||||
msg = public.getInfo('删除防火墙放行端口[{1}]成功!', (port,))
|
||||
public.writeLog("防火墙管理", msg)
|
||||
public.M('firewall').where("id=?", (sid,)).delete()
|
||||
msg = mw.getInfo('删除防火墙放行端口[{1}]成功!', (port,))
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
mw.M('firewall').where("id=?", (sid,)).delete()
|
||||
|
||||
self.firewallReload()
|
||||
return public.returnJson(True, '删除成功!')
|
||||
return mw.returnJson(True, '删除成功!')
|
||||
except Exception as e:
|
||||
return public.returnJson(False, '删除失败!:' + str(e))
|
||||
return mw.returnJson(False, '删除失败!:' + str(e))
|
||||
|
||||
def getWwwPathApi(self):
|
||||
path = public.getLogsDir()
|
||||
return public.getJson({'path': path})
|
||||
path = mw.getLogsDir()
|
||||
return mw.getJson({'path': path})
|
||||
|
||||
def getListApi(self):
|
||||
p = request.form.get('p', '1').strip()
|
||||
@@ -151,17 +158,17 @@ class firewall_api:
|
||||
|
||||
def getSshInfoApi(self):
|
||||
file = '/etc/ssh/sshd_config'
|
||||
conf = public.readFile(file)
|
||||
conf = mw.readFile(file)
|
||||
rep = "#*Port\s+([0-9]+)\s*\n"
|
||||
port = re.search(rep, conf).groups(0)[0]
|
||||
|
||||
isPing = True
|
||||
try:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
isPing = True
|
||||
else:
|
||||
file = '/etc/sysctl.conf'
|
||||
conf = public.readFile(file)
|
||||
conf = mw.readFile(file)
|
||||
rep = "#*net\.ipv4\.icmp_echo_ignore_all\s*=\s*([0-9]+)"
|
||||
tmp = re.search(rep, conf).groups(0)[0]
|
||||
if tmp == '1':
|
||||
@@ -175,17 +182,17 @@ class firewall_api:
|
||||
if os.path.exists('/usr/bin/apt-get'):
|
||||
if os.path.exists('/etc/init.d/sshd'):
|
||||
cmd = "service sshd status | grep -P '(dead|stop)'|grep -v grep"
|
||||
status = public.execShell(cmd)
|
||||
status = mw.execShell(cmd)
|
||||
else:
|
||||
cmd = "service ssh status | grep -P '(dead|stop)'|grep -v grep"
|
||||
status = public.execShell(cmd)
|
||||
status = mw.execShell(cmd)
|
||||
else:
|
||||
if version.find(' 7.') != -1:
|
||||
cmd = "systemctl status sshd.service | grep 'dead'|grep -v grep"
|
||||
status = public.execShell(cmd)
|
||||
status = mw.execShell(cmd)
|
||||
else:
|
||||
cmd = "/etc/init.d/sshd status | grep -e 'stopped' -e '已停'|grep -v grep"
|
||||
status = public.execShell(cmd)
|
||||
status = mw.execShell(cmd)
|
||||
if len(status[0]) > 3:
|
||||
status = False
|
||||
else:
|
||||
@@ -196,54 +203,54 @@ class firewall_api:
|
||||
|
||||
data['status'] = status
|
||||
data['ping'] = isPing
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
data['firewall_status'] = False
|
||||
else:
|
||||
data['firewall_status'] = self.getFwStatus()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def setSshPortApi(self):
|
||||
port = request.form.get('port', '1').strip()
|
||||
if int(port) < 22 or int(port) > 65535:
|
||||
return public.returnJson(False, '端口范围必需在22-65535之间!')
|
||||
return mw.returnJson(False, '端口范围必需在22-65535之间!')
|
||||
|
||||
ports = ['21', '25', '80', '443', '7200', '8080', '888', '8888']
|
||||
if port in ports:
|
||||
return public.returnJson(False, '(' + port + ')' + '特殊端口不可设置!')
|
||||
return mw.returnJson(False, '(' + port + ')' + '特殊端口不可设置!')
|
||||
|
||||
file = '/etc/ssh/sshd_config'
|
||||
conf = public.readFile(file)
|
||||
conf = mw.readFile(file)
|
||||
|
||||
rep = "#*Port\s+([0-9]+)\s*\n"
|
||||
conf = re.sub(rep, "Port " + port + "\n", conf)
|
||||
public.writeFile(file, conf)
|
||||
mw.writeFile(file, conf)
|
||||
|
||||
if self.__isFirewalld:
|
||||
public.execShell('setenforce 0')
|
||||
public.execShell(
|
||||
mw.execShell('setenforce 0')
|
||||
mw.execShell(
|
||||
'sed -i "s#SELINUX=enforcing#SELINUX=disabled#" /etc/selinux/config')
|
||||
public.execShell("systemctl restart sshd.service")
|
||||
mw.execShell("systemctl restart sshd.service")
|
||||
elif self.__isUfw:
|
||||
public.execShell('ufw allow ' + port + '/tcp')
|
||||
public.execShell("service ssh restart")
|
||||
mw.execShell('ufw allow ' + port + '/tcp')
|
||||
mw.execShell("service ssh restart")
|
||||
else:
|
||||
public.execShell(
|
||||
mw.execShell(
|
||||
'iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT')
|
||||
public.execShell("/etc/init.d/sshd restart")
|
||||
mw.execShell("/etc/init.d/sshd restart")
|
||||
|
||||
self.firewallReload()
|
||||
# public.M('firewall').where(
|
||||
# mw.M('firewall').where(
|
||||
# "ps=?", ('SSH远程管理服务',)).setField('port', port)
|
||||
msg = public.getInfo('改SSH端口为[{1}]成功!', port)
|
||||
public.writeLog("防火墙管理", msg)
|
||||
return public.returnJson(True, '修改成功!')
|
||||
msg = mw.getInfo('改SSH端口为[{1}]成功!', port)
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
|
||||
def setSshStatusApi(self):
|
||||
if public.isAppleSystem():
|
||||
return public.returnJson(True, '开发机不能操作!')
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(True, '开发机不能操作!')
|
||||
|
||||
status = request.form.get('status', '1').strip()
|
||||
version = public.readFile('/etc/redhat-release')
|
||||
version = mw.readFile('/etc/redhat-release')
|
||||
if int(status) == 1:
|
||||
msg = 'SSH服务已停用'
|
||||
act = 'stop'
|
||||
@@ -252,66 +259,68 @@ class firewall_api:
|
||||
act = 'start'
|
||||
|
||||
if not os.path.exists('/etc/redhat-release'):
|
||||
public.execShell('service ssh ' + act)
|
||||
mw.execShell('service ssh ' + act)
|
||||
elif version.find(' 7.') != -1:
|
||||
public.execShell("systemctl " + act + " sshd.service")
|
||||
mw.execShell("systemctl " + act + " sshd.service")
|
||||
else:
|
||||
public.execShell("/etc/init.d/sshd " + act)
|
||||
mw.execShell("/etc/init.d/sshd " + act)
|
||||
|
||||
public.writeLog("防火墙管理", msg)
|
||||
return public.returnJson(True, '操作成功!')
|
||||
mw.writeLog("防火墙管理", msg)
|
||||
return mw.returnJson(True, '操作成功!')
|
||||
|
||||
def setPingApi(self):
|
||||
if public.isAppleSystem():
|
||||
return public.returnJson(True, '开发机不能操作!')
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(True, '开发机不能操作!')
|
||||
|
||||
status = request.form.get('status')
|
||||
filename = '/etc/sysctl.conf'
|
||||
conf = public.readFile(filename)
|
||||
conf = mw.readFile(filename)
|
||||
if conf.find('net.ipv4.icmp_echo') != -1:
|
||||
rep = u"net\.ipv4\.icmp_echo.*"
|
||||
conf = re.sub(rep, 'net.ipv4.icmp_echo_ignore_all=' + status, conf)
|
||||
else:
|
||||
conf += "\nnet.ipv4.icmp_echo_ignore_all=" + status
|
||||
|
||||
public.writeFile(filename, conf)
|
||||
public.execShell('sysctl -p')
|
||||
return public.returnJson(True, '设置成功!')
|
||||
mw.writeFile(filename, conf)
|
||||
mw.execShell('sysctl -p')
|
||||
return mw.returnJson(True, '设置成功!')
|
||||
|
||||
def setFwApi(self):
|
||||
if public.isAppleSystem():
|
||||
return public.returnJson(True, '开发机不能设置!')
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(True, '开发机不能设置!')
|
||||
|
||||
status = request.form.get('status', '1')
|
||||
if status == '1':
|
||||
if self.__isUfw:
|
||||
public.execShell('/usr/sbin/ufw stop')
|
||||
mw.execShell('/usr/sbin/ufw stop')
|
||||
return
|
||||
if self.__isFirewalld:
|
||||
public.execShell('systemctl stop firewalld.service')
|
||||
mw.execShell('systemctl stop firewalld.service')
|
||||
mw.execShell('systemctl disable firewalld.service')
|
||||
elif self.__isMac:
|
||||
pass
|
||||
else:
|
||||
public.execShell('/etc/init.d/iptables save')
|
||||
public.execShell('/etc/init.d/iptables stop')
|
||||
mw.execShell('/etc/init.d/iptables save')
|
||||
mw.execShell('/etc/init.d/iptables stop')
|
||||
else:
|
||||
if self.__isUfw:
|
||||
public.execShell('/usr/sbin/ufw start')
|
||||
mw.execShell('/usr/sbin/ufw start')
|
||||
return
|
||||
if self.__isFirewalld:
|
||||
public.execShell('systemctl start firewalld.service')
|
||||
mw.execShell('systemctl start firewalld.service')
|
||||
mw.execShell('systemctl enable firewalld.service')
|
||||
elif self.__isMac:
|
||||
pass
|
||||
else:
|
||||
public.execShell('/etc/init.d/iptables save')
|
||||
public.execShell('/etc/init.d/iptables restart')
|
||||
mw.execShell('/etc/init.d/iptables save')
|
||||
mw.execShell('/etc/init.d/iptables restart')
|
||||
|
||||
return public.returnJson(True, '设置成功!')
|
||||
return mw.returnJson(True, '设置成功!')
|
||||
|
||||
def delPanelLogsApi(self):
|
||||
public.M('logs').where('id>?', (0,)).delete()
|
||||
public.writeLog('面板设置', '面板操作日志已清空!')
|
||||
return public.returnJson(True, '面板操作日志已清空!')
|
||||
mw.M('logs').where('id>?', (0,)).delete()
|
||||
mw.writeLog('面板设置', '面板操作日志已清空!')
|
||||
return mw.returnJson(True, '面板操作日志已清空!')
|
||||
|
||||
##### ----- start ----- ###
|
||||
|
||||
@@ -319,19 +328,19 @@ class firewall_api:
|
||||
|
||||
start = (page - 1) * limit
|
||||
|
||||
_list = public.M('firewall').field('id,port,ps,addtime').limit(
|
||||
_list = mw.M('firewall').field('id,port,ps,addtime').limit(
|
||||
str(start) + ',' + str(limit)).order('id desc').select()
|
||||
data = {}
|
||||
data['data'] = _list
|
||||
|
||||
count = public.M('firewall').count()
|
||||
count = mw.M('firewall').count()
|
||||
_page = {}
|
||||
_page['count'] = count
|
||||
_page['tojs'] = 'showAccept'
|
||||
_page['p'] = page
|
||||
|
||||
data['page'] = public.getPage(_page)
|
||||
return public.getJson(data)
|
||||
data['page'] = mw.getPage(_page)
|
||||
return mw.getJson(data)
|
||||
|
||||
def getLogList(self, page, limit, search=''):
|
||||
find_search = ''
|
||||
@@ -341,56 +350,56 @@ class firewall_api:
|
||||
|
||||
start = (page - 1) * limit
|
||||
|
||||
_list = public.M('logs').where(find_search, ()).field(
|
||||
_list = mw.M('logs').where(find_search, ()).field(
|
||||
'id,type,log,addtime').limit(str(start) + ',' + str(limit)).order('id desc').select()
|
||||
data = {}
|
||||
data['data'] = _list
|
||||
|
||||
count = public.M('logs').where(find_search, ()).count()
|
||||
count = mw.M('logs').where(find_search, ()).count()
|
||||
_page = {}
|
||||
_page['count'] = count
|
||||
_page['tojs'] = 'getLogs'
|
||||
_page['p'] = page
|
||||
|
||||
data['page'] = public.getPage(_page)
|
||||
return public.getJson(data)
|
||||
data['page'] = mw.getPage(_page)
|
||||
return mw.getJson(data)
|
||||
|
||||
def addAcceptPort(self, port):
|
||||
if self.__isUfw:
|
||||
public.execShell('ufw allow ' + port + '/tcp')
|
||||
mw.execShell('ufw allow ' + port + '/tcp')
|
||||
else:
|
||||
if self.__isFirewalld:
|
||||
port = port.replace(':', '-')
|
||||
cmd = 'firewall-cmd --permanent --zone=public --add-port=' + port + '/tcp'
|
||||
public.execShell(cmd)
|
||||
mw.execShell(cmd)
|
||||
elif self.__isMac:
|
||||
pass
|
||||
else:
|
||||
cmd = 'iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ' + port + ' -j ACCEPT'
|
||||
public.execShell(cmd)
|
||||
mw.execShell(cmd)
|
||||
|
||||
def firewallReload(self):
|
||||
if self.__isUfw:
|
||||
public.execShell('/usr/sbin/ufw reload')
|
||||
mw.execShell('/usr/sbin/ufw reload')
|
||||
return
|
||||
if self.__isFirewalld:
|
||||
public.execShell('firewall-cmd --reload')
|
||||
mw.execShell('firewall-cmd --reload')
|
||||
elif self.__isMac:
|
||||
pass
|
||||
else:
|
||||
public.execShell('/etc/init.d/iptables save')
|
||||
public.execShell('/etc/init.d/iptables restart')
|
||||
mw.execShell('/etc/init.d/iptables save')
|
||||
mw.execShell('/etc/init.d/iptables restart')
|
||||
|
||||
def getFwStatus(self):
|
||||
if self.__isUfw:
|
||||
cmd = "ps -ef|grep ufw |grep -v grep | awk '{print $2}'"
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return False
|
||||
return True
|
||||
if self.__isFirewalld:
|
||||
cmd = "ps -ef|grep firewalld |grep -v grep | awk '{print $2}'"
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return False
|
||||
return True
|
||||
@@ -398,7 +407,7 @@ class firewall_api:
|
||||
return False
|
||||
else:
|
||||
cmd = "ps -ef|grep iptables |grep -v grep | awk '{print $2}'"
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -10,7 +10,6 @@ import shlex
|
||||
import datetime
|
||||
import subprocess
|
||||
import re
|
||||
import hashlib
|
||||
|
||||
import db
|
||||
|
||||
@@ -35,7 +34,17 @@ def execShell(cmdstring, cwd=None, timeout=None, shell=True):
|
||||
if end_time <= datetime.datetime.now():
|
||||
raise Exception("Timeout:%s" % cmdstring)
|
||||
|
||||
return sub.communicate()
|
||||
if sys.version_info[0] == 2:
|
||||
return sub.communicate()
|
||||
|
||||
data = sub.communicate()
|
||||
# python3 fix 返回byte数据
|
||||
if isinstance(data[0], bytes):
|
||||
t1 = str(data[0], encoding='utf-8')
|
||||
|
||||
if isinstance(data[1], bytes):
|
||||
t2 = str(data[1], encoding='utf-8')
|
||||
return (t1, t2)
|
||||
|
||||
|
||||
def getRunDir():
|
||||
@@ -143,19 +152,19 @@ def getPageObject(args, result='1,2,3,4,5,8'):
|
||||
info = {}
|
||||
|
||||
info['count'] = 0
|
||||
if args.has_key('count'):
|
||||
if 'count' in args:
|
||||
info['count'] = int(args['count'])
|
||||
|
||||
info['row'] = 10
|
||||
if args.has_key('row'):
|
||||
if 'row' in args:
|
||||
info['row'] = int(args['row'])
|
||||
|
||||
info['p'] = 1
|
||||
if args.has_key('p'):
|
||||
if 'p' in args:
|
||||
info['p'] = int(args['p'])
|
||||
info['uri'] = {}
|
||||
info['return_js'] = ''
|
||||
if args.has_key('tojs'):
|
||||
if 'tojs' in args:
|
||||
info['return_js'] = args['tojs']
|
||||
|
||||
return (page.GetPage(info, result), page)
|
||||
@@ -165,9 +174,10 @@ def md5(str):
|
||||
# 生成MD5
|
||||
try:
|
||||
m = hashlib.md5()
|
||||
m.update(str)
|
||||
m.update(str.encode("utf-8"))
|
||||
return m.hexdigest()
|
||||
except:
|
||||
except Exception as ex:
|
||||
print(ex)
|
||||
return False
|
||||
|
||||
|
||||
@@ -273,7 +283,8 @@ def readFile(filename):
|
||||
fBody = fp.read()
|
||||
fp.close()
|
||||
return fBody
|
||||
except:
|
||||
except Exception as e:
|
||||
# print('readFile:', e)
|
||||
return False
|
||||
|
||||
|
||||
@@ -301,7 +312,7 @@ def writeLog(type, logMsg, args=()):
|
||||
data = (type, logMsg, mDate)
|
||||
result = sql.table('logs').add('type,log,addtime', data)
|
||||
except Exception as e:
|
||||
print e
|
||||
print(e)
|
||||
|
||||
|
||||
def writeFile(filename, str):
|
||||
@@ -355,13 +366,16 @@ def HttpGet(url, timeout=10):
|
||||
|
||||
|
||||
def HttpGet2(url, timeout):
|
||||
import urllib
|
||||
import urllib2
|
||||
|
||||
req = urllib2.Request(url)
|
||||
res = urllib2.urlopen(req, timeout=timeout)
|
||||
result = res.read()
|
||||
return result
|
||||
try:
|
||||
req = urllib2.Request(url)
|
||||
res = urllib2.urlopen(req, timeout=timeout)
|
||||
result = res.read()
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
return str(e)
|
||||
|
||||
|
||||
def httpGet(url, timeout=10):
|
||||
@@ -426,7 +440,7 @@ def writeSpeed(title, used, total, speed=0):
|
||||
|
||||
def getSpeed():
|
||||
# 取进度
|
||||
path = public.getRootDir()
|
||||
path = getRootDir()
|
||||
data = readFile(path + '/tmp/panelSpeed.pl')
|
||||
if not data:
|
||||
data = json.dumps({'title': None, 'progress': 0,
|
||||
@@ -526,8 +540,8 @@ def downloadFile(url, filename):
|
||||
|
||||
def downloadHook(count, blockSize, totalSize):
|
||||
speed = {'total': totalSize, 'block': blockSize, 'count': count}
|
||||
print speed
|
||||
print '%02d%%' % (100.0 * count * blockSize / totalSize)
|
||||
print(speed)
|
||||
print('%02d%%' % (100.0 * count * blockSize / totalSize))
|
||||
|
||||
|
||||
def getLocalIp():
|
||||
@@ -879,7 +893,7 @@ def get_string_arr(t):
|
||||
def getSSHPort():
|
||||
try:
|
||||
file = '/etc/ssh/sshd_config'
|
||||
conf = ReadFile(file)
|
||||
conf = readFile(file)
|
||||
rep = "#*Port\s+([0-9]+)\s*\n"
|
||||
port = re.search(rep, conf).groups(0)[0]
|
||||
return int(port)
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
import math
|
||||
import string
|
||||
import public
|
||||
import mw
|
||||
|
||||
|
||||
class Page():
|
||||
@@ -29,7 +29,7 @@ class Page():
|
||||
__END_NUM = None # 结束行
|
||||
|
||||
def __init__(self):
|
||||
# tmp = public.getMsg('PAGE')
|
||||
# tmp = mw.getMsg('PAGE')
|
||||
if False:
|
||||
self.__PREV = tmp['PREV']
|
||||
self.__NEXT = tmp['NEXT']
|
||||
@@ -55,7 +55,6 @@ class Page():
|
||||
self.SHIFT = self.__START_NUM - 1
|
||||
|
||||
keys = limit.split(',')
|
||||
|
||||
pages = {}
|
||||
# 起始页
|
||||
pages['1'] = self.__GetStart()
|
||||
@@ -70,14 +69,16 @@ class Page():
|
||||
|
||||
# 当前显示页与总页数
|
||||
pages['6'] = "<span class='Pnumber'>" + \
|
||||
bytes(self.__C_PAGE) + "/" + bytes(self.__COUNT_PAGE) + "</span>"
|
||||
str(self.__C_PAGE) + "/" + \
|
||||
str(self.__COUNT_PAGE) + "</span>"
|
||||
|
||||
# 本页显示开始与结束行
|
||||
pages['7'] = "<span class='Pline'>" + self.__FO + \
|
||||
bytes(self.__START_NUM) + "-" + \
|
||||
bytes(self.__END_NUM) + self.__LINE + "</span>"
|
||||
pages['7'] = "<span class='Pline'>" + str(self.__FO) + \
|
||||
str(self.__START_NUM) + "-" + \
|
||||
str(self.__END_NUM) + str(self.__LINE) + "</span>"
|
||||
# 行数
|
||||
pages['8'] = "<span class='Pcount'>" + self.__COUNT_START + \
|
||||
bytes(self.__COUNT_ROW) + self.__COUNT_END + "</span>"
|
||||
pages['8'] = "<span class='Pcount'>" + str(self.__COUNT_START) + \
|
||||
str(self.__COUNT_ROW) + str(self.__COUNT_END) + "</span>"
|
||||
|
||||
# 构造返回数据
|
||||
retuls = '<div>'
|
||||
@@ -96,10 +97,11 @@ class Page():
|
||||
else:
|
||||
if self.__RTURN_JS == "":
|
||||
endStr = "<a class='Pend' href='" + self.__URI + "p=" + \
|
||||
bytes(self.__COUNT_PAGE) + "'>" + self.__END + "</a>"
|
||||
str(self.__COUNT_PAGE) + "'>" + str(self.__END) + "</a>"
|
||||
else:
|
||||
endStr = "<a class='Pend' onclick='" + self.__RTURN_JS + \
|
||||
"(" + bytes(self.__COUNT_PAGE) + ")'>" + self.__END + "</a>"
|
||||
"(" + str(self.__COUNT_PAGE) + ")'>" + \
|
||||
str(self.__END) + "</a>"
|
||||
return endStr
|
||||
|
||||
def __GetNext(self):
|
||||
@@ -110,10 +112,11 @@ class Page():
|
||||
else:
|
||||
if self.__RTURN_JS == "":
|
||||
nextStr = "<a class='Pnext' href='" + self.__URI + "p=" + \
|
||||
bytes(self.__C_PAGE + 1) + "'>" + self.__NEXT + "</a>"
|
||||
str(self.__C_PAGE + 1) + "'>" + str(self.__NEXT) + "</a>"
|
||||
else:
|
||||
nextStr = "<a class='Pnext' onclick='" + self.__RTURN_JS + \
|
||||
"(" + bytes(self.__C_PAGE + 1) + ")'>" + self.__NEXT + "</a>"
|
||||
"(" + str(self.__C_PAGE + 1) + ")'>" + \
|
||||
str(self.__NEXT) + "</a>"
|
||||
|
||||
return nextStr
|
||||
|
||||
@@ -134,15 +137,15 @@ class Page():
|
||||
if page > 0:
|
||||
if self.__RTURN_JS == "":
|
||||
pages += "<a class='Pnum' href='" + self.__URI + \
|
||||
"p=" + bytes(page) + "'>" + bytes(page) + "</a>"
|
||||
"p=" + str(page) + "'>" + str(page) + "</a>"
|
||||
else:
|
||||
pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
|
||||
"(" + bytes(page) + ")'>" + bytes(page) + "</a>"
|
||||
"(" + str(page) + ")'>" + str(page) + "</a>"
|
||||
|
||||
# 当前页
|
||||
if self.__C_PAGE > 0:
|
||||
pages += "<span class='Pcurrent'>" + \
|
||||
bytes(self.__C_PAGE) + "</span>"
|
||||
str(self.__C_PAGE) + "</span>"
|
||||
|
||||
# 当前页之后
|
||||
if self.__C_PAGE <= self.__LIST_NUM:
|
||||
@@ -157,10 +160,10 @@ class Page():
|
||||
break
|
||||
if self.__RTURN_JS == "":
|
||||
pages += "<a class='Pnum' href='" + self.__URI + \
|
||||
"p=" + bytes(page) + "'>" + bytes(page) + "</a>"
|
||||
"p=" + str(page) + "'>" + str(page) + "</a>"
|
||||
else:
|
||||
pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
|
||||
"(" + bytes(page) + ")'>" + bytes(page) + "</a>"
|
||||
"(" + str(page) + ")'>" + str(page) + "</a>"
|
||||
|
||||
return pages
|
||||
|
||||
@@ -172,10 +175,11 @@ class Page():
|
||||
else:
|
||||
if self.__RTURN_JS == "":
|
||||
startStr = "<a class='Ppren' href='" + self.__URI + "p=" + \
|
||||
bytes(self.__C_PAGE - 1) + "'>" + self.__PREV + "</a>"
|
||||
str(self.__C_PAGE - 1) + "'>" + str(self.__PREV) + "</a>"
|
||||
else:
|
||||
startStr = "<a class='Ppren' onclick='" + self.__RTURN_JS + \
|
||||
"(" + bytes(self.__C_PAGE - 1) + ")'>" + self.__PREV + "</a>"
|
||||
"(" + str(self.__C_PAGE - 1) + ")'>" + \
|
||||
str(self.__PREV) + "</a>"
|
||||
return startStr
|
||||
|
||||
def __GetStart(self):
|
||||
@@ -186,10 +190,10 @@ class Page():
|
||||
else:
|
||||
if self.__RTURN_JS == "":
|
||||
startStr = "<a class='Pstart' href='" + \
|
||||
self.__URI + "p=1'>" + self.__START + "</a>"
|
||||
self.__URI + "p=1'>" + str(self.__START) + "</a>"
|
||||
else:
|
||||
startStr = "<a class='Pstart' onclick='" + \
|
||||
self.__RTURN_JS + "(1)'>" + self.__START + "</a>"
|
||||
self.__RTURN_JS + "(1)'>" + str(self.__START) + "</a>"
|
||||
return startStr
|
||||
|
||||
def __GetCpage(self, p):
|
||||
@@ -212,11 +216,11 @@ class Page():
|
||||
# 取总页数
|
||||
return int(math.ceil(self.__COUNT_ROW / float(self.ROW)))
|
||||
|
||||
def __SetUri(self, input):
|
||||
def __SetUri(self, sinput):
|
||||
# 构造URI
|
||||
uri = '?'
|
||||
for key in input:
|
||||
for key in sinput:
|
||||
if key == 'p':
|
||||
continue
|
||||
uri += key + '=' + input[key] + '&'
|
||||
uri += key + '=' + sinput[key] + '&'
|
||||
return str(uri)
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
import psutil
|
||||
import time
|
||||
import os
|
||||
import public
|
||||
import mw
|
||||
import re
|
||||
import json
|
||||
|
||||
import sys
|
||||
reload(sys)
|
||||
sys.setdefaultencoding('utf8')
|
||||
|
||||
# reload(sys)
|
||||
# sys.setdefaultencoding('utf8')
|
||||
|
||||
import threading
|
||||
import multiprocessing
|
||||
@@ -50,7 +51,7 @@ class plugins_api:
|
||||
sPage = request.args.get('p', '1')
|
||||
# print sPage
|
||||
data = self.getPluginList(sType, int(sPage))
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def fileApi(self):
|
||||
name = request.args.get('name', '')
|
||||
@@ -61,28 +62,28 @@ class plugins_api:
|
||||
if f.strip() == '':
|
||||
return ''
|
||||
|
||||
file = self.__plugin_dir + '/' + name + '/' + f
|
||||
file = mw.getPluginDir() + '/' + name + '/' + f
|
||||
if not os.path.exists(file):
|
||||
return ''
|
||||
|
||||
c = public.readFile(file)
|
||||
c = open(file, 'rb').read()
|
||||
return c
|
||||
|
||||
def indexListApi(self):
|
||||
data = self.getIndexList()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def indexSortApi(self):
|
||||
sort = request.form.get('ssort', '')
|
||||
if sort.strip() == '':
|
||||
return public.returnJson(False, '排序数据不能为空!')
|
||||
return mw.returnJson(False, '排序数据不能为空!')
|
||||
data = self.setIndexSort(sort)
|
||||
if data:
|
||||
return public.returnJson(True, '成功!')
|
||||
return public.returnJson(False, '失败!')
|
||||
return mw.returnJson(True, '成功!')
|
||||
return mw.returnJson(False, '失败!')
|
||||
|
||||
def installApi(self):
|
||||
rundir = public.getRunDir()
|
||||
rundir = mw.getRunDir()
|
||||
name = request.form.get('name', '')
|
||||
version = request.form.get('version', '')
|
||||
|
||||
@@ -92,18 +93,18 @@ class plugins_api:
|
||||
mmsg = 'upgrade'
|
||||
|
||||
if name.strip() == '':
|
||||
return public.returnJson(False, '缺少插件名称!', ())
|
||||
return mw.returnJson(False, '缺少插件名称!', ())
|
||||
|
||||
if version.strip() == '':
|
||||
return public.returnJson(False, '缺少版本信息!', ())
|
||||
return mw.returnJson(False, '缺少版本信息!', ())
|
||||
|
||||
infoJsonPos = self.__plugin_dir + '/' + name + '/' + 'info.json'
|
||||
print infoJsonPos
|
||||
# print infoJsonPos
|
||||
|
||||
if not os.path.exists(infoJsonPos):
|
||||
return public.retJson(False, '配置文件不存在!', ())
|
||||
return mw.returnJson(False, '配置文件不存在!', ())
|
||||
|
||||
pluginInfo = json.loads(public.readFile(infoJsonPos))
|
||||
pluginInfo = json.loads(mw.readFile(infoJsonPos))
|
||||
|
||||
execstr = "cd " + os.getcwd() + "/plugins/" + \
|
||||
name + " && /bin/bash " + pluginInfo["shell"] \
|
||||
@@ -112,25 +113,25 @@ class plugins_api:
|
||||
taskAdd = (None, mmsg + '[' + name + '-' + version + ']',
|
||||
'execshell', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr)
|
||||
|
||||
public.M('tasks').add('id,name,type,status,addtime, execstr', taskAdd)
|
||||
return public.returnJson(True, '已将安装任务添加到队列!')
|
||||
mw.M('tasks').add('id,name,type,status,addtime, execstr', taskAdd)
|
||||
return mw.returnJson(True, '已将安装任务添加到队列!')
|
||||
|
||||
def uninstallApi(self):
|
||||
rundir = public.getRunDir()
|
||||
def uninstallOldApi(self):
|
||||
rundir = mw.getRunDir()
|
||||
name = request.form.get('name', '')
|
||||
version = request.form.get('version', '')
|
||||
if name.strip() == '':
|
||||
return public.returnJson(False, "缺少插件名称!", ())
|
||||
return mw.returnJson(False, "缺少插件名称!", ())
|
||||
|
||||
if version.strip() == '':
|
||||
return public.returnJson(False, "缺少版本信息!", ())
|
||||
return mw.returnJson(False, "缺少版本信息!", ())
|
||||
|
||||
infoJsonPos = self.__plugin_dir + '/' + name + '/' + 'info.json'
|
||||
|
||||
if not os.path.exists(infoJsonPos):
|
||||
return public.retJson(False, "配置文件不存在!", ())
|
||||
return mw.returnJson(False, "配置文件不存在!", ())
|
||||
|
||||
pluginInfo = json.loads(public.readFile(infoJsonPos))
|
||||
pluginInfo = json.loads(mw.readFile(infoJsonPos))
|
||||
|
||||
execstr = "cd " + os.getcwd() + "/plugins/" + \
|
||||
name + " && /bin/bash " + pluginInfo["shell"] \
|
||||
@@ -139,18 +140,50 @@ class plugins_api:
|
||||
taskAdd = (None, '卸载[' + name + '-' + version + ']',
|
||||
'execshell', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr)
|
||||
|
||||
public.M('tasks').add('id,name,type,status,addtime, execstr', taskAdd)
|
||||
return public.returnJson(True, '已将卸载任务添加到队列!')
|
||||
mw.M('tasks').add('id,name,type,status,addtime, execstr', taskAdd)
|
||||
return mw.returnJson(True, '已将卸载任务添加到队列!')
|
||||
|
||||
# 卸载时间短,不加入任务中...
|
||||
def uninstallApi(self):
|
||||
rundir = mw.getRunDir()
|
||||
name = request.form.get('name', '')
|
||||
version = request.form.get('version', '')
|
||||
if name.strip() == '':
|
||||
return mw.returnJson(False, "缺少插件名称!", ())
|
||||
|
||||
if version.strip() == '':
|
||||
return mw.returnJson(False, "缺少版本信息!", ())
|
||||
|
||||
infoJsonPos = self.__plugin_dir + '/' + name + '/' + 'info.json'
|
||||
|
||||
if not os.path.exists(infoJsonPos):
|
||||
return mw.returnJson(False, "配置文件不存在!", ())
|
||||
|
||||
pluginInfo = json.loads(mw.readFile(infoJsonPos))
|
||||
|
||||
execstr = "cd " + os.getcwd() + "/plugins/" + \
|
||||
name + " && /bin/bash " + pluginInfo["shell"] \
|
||||
+ " uninstall " + version
|
||||
|
||||
data = mw.execShell(execstr)
|
||||
if mw.isAppleSystem():
|
||||
print(execstr)
|
||||
print(data[0], data[1])
|
||||
return mw.returnJson(True, '卸载执行成功!')
|
||||
# if data[1] == '':
|
||||
# return mw.returnJson(True, '已将卸载成功!')
|
||||
# else:
|
||||
# return mw.returnJson(False, '卸载出现错误信息!' + data[1])
|
||||
|
||||
def checkApi(self):
|
||||
name = request.form.get('name', '')
|
||||
if name.strip() == '':
|
||||
return public.returnJson(False, "缺少插件名称!", ())
|
||||
return mw.returnJson(False, "缺少插件名称!", ())
|
||||
|
||||
infoJsonPos = self.__plugin_dir + '/' + name + '/' + 'info.json'
|
||||
if not os.path.exists(infoJsonPos):
|
||||
return public.returnJson(False, "配置文件不存在!", ())
|
||||
return public.returnJson(True, "插件存在!", ())
|
||||
return mw.returnJson(False, "配置文件不存在!", ())
|
||||
return mw.returnJson(True, "插件存在!", ())
|
||||
|
||||
def setIndexApi(self):
|
||||
name = request.form.get('name', '')
|
||||
@@ -163,7 +196,7 @@ class plugins_api:
|
||||
def settingApi(self):
|
||||
name = request.args.get('name', '')
|
||||
html = self.__plugin_dir + '/' + name + '/index.html'
|
||||
return public.readFile(html)
|
||||
return mw.readFile(html)
|
||||
|
||||
def runApi(self):
|
||||
name = request.form.get('name', '')
|
||||
@@ -174,23 +207,36 @@ class plugins_api:
|
||||
|
||||
data = self.run(name, func, version, args, script)
|
||||
if data[1] == '':
|
||||
return public.returnJson(True, "OK", data[0].strip())
|
||||
return public.returnJson(False, data[1].strip())
|
||||
r = mw.returnJson(True, "OK", data[0].strip())
|
||||
else:
|
||||
r = mw.returnJson(False, data[1].strip())
|
||||
return r
|
||||
|
||||
def callbackApi(self):
|
||||
name = request.form.get('name', '')
|
||||
func = request.form.get('func', '')
|
||||
args = request.form.get('args', '')
|
||||
script = request.form.get('script', 'index')
|
||||
|
||||
data = self.callback(name, func, args, script)
|
||||
if data[0]:
|
||||
return mw.returnJson(True, "OK", data[1])
|
||||
return mw.returnJson(False, data[1])
|
||||
|
||||
def updateZipApi(self):
|
||||
tmp_path = public.getRootDir() + '/temp'
|
||||
tmp_path = mw.getRootDir() + '/temp'
|
||||
if not os.path.exists(tmp_path):
|
||||
os.makedirs(tmp_path)
|
||||
public.execShell("rm -rf " + tmp_path + '/*')
|
||||
mw.execShell("rm -rf " + tmp_path + '/*')
|
||||
|
||||
tmp_file = tmp_path + '/plugin_tmp.zip'
|
||||
from werkzeug.utils import secure_filename
|
||||
from flask import request
|
||||
f = request.files['plugin_zip']
|
||||
if f.filename[-4:] != '.zip':
|
||||
return public.returnJson(False, '仅支持zip文件!')
|
||||
return mw.returnJson(False, '仅支持zip文件!')
|
||||
f.save(tmp_file)
|
||||
public.execShell('cd ' + tmp_path + ' && unzip ' + tmp_file)
|
||||
mw.execShell('cd ' + tmp_path + ' && unzip ' + tmp_file)
|
||||
os.remove(tmp_file)
|
||||
|
||||
p_info = tmp_path + '/info.json'
|
||||
@@ -210,44 +256,47 @@ class plugins_api:
|
||||
tmp_path = d_path
|
||||
p_info = tmp_path + '/info.json'
|
||||
try:
|
||||
data = json.loads(public.readFile(p_info))
|
||||
data['size'] = public.getPathSize(tmp_path)
|
||||
data = json.loads(mw.readFile(p_info))
|
||||
data['size'] = mw.getPathSize(tmp_path)
|
||||
if not 'author' in data:
|
||||
data['author'] = '未知'
|
||||
if not 'home' in data:
|
||||
data['home'] = 'https://www.bt.cn/bbs/forum-40-1.html'
|
||||
plugin_path = public.getPluginDir() + data['name'] + '/info.json'
|
||||
plugin_path = mw.getPluginDir() + data['name'] + '/info.json'
|
||||
data['old_version'] = '0'
|
||||
data['tmp_path'] = tmp_path
|
||||
if os.path.exists(plugin_path):
|
||||
try:
|
||||
old_info = json.loads(public.ReadFile(plugin_path))
|
||||
old_info = json.loads(mw.ReadFile(plugin_path))
|
||||
data['old_version'] = old_info['versions']
|
||||
except:
|
||||
pass
|
||||
except:
|
||||
public.execShell("rm -rf " + tmp_path)
|
||||
return public.returnJson(False, '在压缩包中没有找到插件信息,请检查插件包!')
|
||||
return public.getJson(data)
|
||||
mw.execShell("rm -rf " + tmp_path)
|
||||
return mw.returnJson(False, '在压缩包中没有找到插件信息,请检查插件包!')
|
||||
protectPlist = ('openresty', 'mysql', 'php', 'csvn', 'gogs', 'pureftp')
|
||||
if data['name'] in protectPlist:
|
||||
return mw.returnJson(False, '[' + data['name'] + '],重要插件不可修改!')
|
||||
return mw.getJson(data)
|
||||
|
||||
def inputZipApi(self):
|
||||
plugin_name = request.form.get('plugin_name', '')
|
||||
tmp_path = request.form.get('tmp_path', '')
|
||||
|
||||
if not os.path.exists(tmp_path):
|
||||
return public.returnJson(False, '临时文件不存在,请重新上传!')
|
||||
plugin_path = public.getPluginDir() + '/' + plugin_name
|
||||
return mw.returnJson(False, '临时文件不存在,请重新上传!')
|
||||
plugin_path = mw.getPluginDir() + '/' + plugin_name
|
||||
if not os.path.exists(plugin_path):
|
||||
print public.execShell('mkdir -p ' + plugin_path)
|
||||
public.execShell("\cp -rf " + tmp_path + '/* ' + plugin_path + '/')
|
||||
public.execShell('chmod -R 755 ' + plugin_path)
|
||||
p_info = public.readFile(plugin_path + '/info.json')
|
||||
print(mw.execShell('mkdir -p ' + plugin_path))
|
||||
mw.execShell("\cp -rf " + tmp_path + '/* ' + plugin_path + '/')
|
||||
mw.execShell('chmod -R 755 ' + plugin_path)
|
||||
p_info = mw.readFile(plugin_path + '/info.json')
|
||||
if p_info:
|
||||
public.writeLog('软件管理', '安装第三方插件[%s]' %
|
||||
json.loads(p_info)['title'])
|
||||
return public.returnJson(True, '安装成功!')
|
||||
public.execShell("rm -rf " + plugin_path)
|
||||
return public.returnJson(False, '安装失败!')
|
||||
mw.writeLog('软件管理', '安装第三方插件[%s]' %
|
||||
json.loads(p_info)['title'])
|
||||
return mw.returnJson(True, '安装成功!')
|
||||
mw.execShell("rm -rf " + plugin_path)
|
||||
return mw.returnJson(False, '安装失败!')
|
||||
##### ----- end ----- ###
|
||||
|
||||
# 进程是否存在
|
||||
@@ -271,30 +320,21 @@ class plugins_api:
|
||||
return True
|
||||
|
||||
# 检查是否正在安装
|
||||
def checkSetupTask(self, sName):
|
||||
sName = ''
|
||||
version = ''
|
||||
def checkSetupTask(self, sName, sVer, sCoexist):
|
||||
if not self.__tasks:
|
||||
self.__tasks = public.M('tasks').where(
|
||||
self.__tasks = mw.M('tasks').where(
|
||||
"status!=?", ('1',)).field('status,name').select()
|
||||
|
||||
if sName.find('php-') != -1:
|
||||
tmp = sName.split('-')
|
||||
sName = tmp[0]
|
||||
version = tmp[1]
|
||||
isTask = '1'
|
||||
for task in self.__tasks:
|
||||
tmpt = public.getStrBetween('[', ']', task['name'])
|
||||
tmpt = mw.getStrBetween('[', ']', task['name'])
|
||||
if not tmpt:
|
||||
continue
|
||||
tmp1 = tmpt.split('-')
|
||||
name1 = tmp1[0].lower()
|
||||
if sName == 'php':
|
||||
if name1 == sName and tmp1[1] == version:
|
||||
if sCoexist:
|
||||
if name1 == sName and tmp1[1] == sVer:
|
||||
isTask = task['status']
|
||||
else:
|
||||
if name1 == 'pure':
|
||||
name1 = 'pure-ftpd'
|
||||
if name1 == sName:
|
||||
isTask = task['status']
|
||||
return isTask
|
||||
@@ -345,7 +385,7 @@ class plugins_api:
|
||||
t = threads[i].getResult()
|
||||
plugins_info[i]['status'] = t
|
||||
except Exception as e:
|
||||
print 'checkStatusMThreads:', str(e)
|
||||
print('checkStatusMThreads:', str(e))
|
||||
|
||||
return plugins_info
|
||||
|
||||
@@ -370,9 +410,9 @@ class plugins_api:
|
||||
|
||||
def checkDisplayIndex(self, name, version):
|
||||
if not os.path.exists(self.__index):
|
||||
public.writeFile(self.__index, '[]')
|
||||
mw.writeFile(self.__index, '[]')
|
||||
|
||||
indexList = json.loads(public.readFile(self.__index))
|
||||
indexList = json.loads(mw.readFile(self.__index))
|
||||
if type(version) == list:
|
||||
for index in range(len(version)):
|
||||
vname = name + '-' + version[index]
|
||||
@@ -387,7 +427,7 @@ class plugins_api:
|
||||
def getVersion(self, path):
|
||||
version_f = path + '/version.pl'
|
||||
if os.path.exists(version_f):
|
||||
return public.readFile(version_f).strip()
|
||||
return mw.readFile(version_f).strip()
|
||||
return ''
|
||||
|
||||
# 构造本地插件信息
|
||||
@@ -399,18 +439,18 @@ class plugins_api:
|
||||
if info["checks"][0:1] == '/':
|
||||
checks = info["checks"]
|
||||
else:
|
||||
checks = public.getRootDir() + '/' + info['checks']
|
||||
checks = mw.getRootDir() + '/' + info['checks']
|
||||
|
||||
if info.has_key('path'):
|
||||
if 'path' in info:
|
||||
path = info['path']
|
||||
|
||||
if path[0:1] != '/':
|
||||
path = public.getRootDir() + '/' + path
|
||||
path = mw.getRootDir() + '/' + path
|
||||
|
||||
if info.has_key('coexist') and info['coexist']:
|
||||
if 'coexist' in info and info['coexist']:
|
||||
coexist = True
|
||||
|
||||
pluginInfo = {
|
||||
pInfo = {
|
||||
"id": 10000,
|
||||
"pid": info['pid'],
|
||||
"type": 1000,
|
||||
@@ -431,29 +471,28 @@ class plugins_api:
|
||||
"status": False,
|
||||
}
|
||||
|
||||
pluginInfo['task'] = self.checkSetupTask(pluginInfo['name'])
|
||||
|
||||
if checks.find('VERSION') > -1:
|
||||
pluginInfo['install_checks'] = checks.replace(
|
||||
pInfo['install_checks'] = checks.replace(
|
||||
'VERSION', info['versions'])
|
||||
|
||||
if path.find('VERSION') > -1:
|
||||
pluginInfo['path'] = path.replace(
|
||||
pInfo['path'] = path.replace(
|
||||
'VERSION', info['versions'])
|
||||
|
||||
pluginInfo['display'] = self.checkDisplayIndex(
|
||||
info['name'], pluginInfo['versions'])
|
||||
pInfo['task'] = self.checkSetupTask(
|
||||
pInfo['name'], info['versions'], coexist)
|
||||
pInfo['display'] = self.checkDisplayIndex(
|
||||
info['name'], pInfo['versions'])
|
||||
|
||||
pluginInfo['setup'] = os.path.exists(pluginInfo['install_checks'])
|
||||
pInfo['setup'] = os.path.exists(pInfo['install_checks'])
|
||||
|
||||
if coexist and pluginInfo['setup']:
|
||||
pluginInfo['setup_version'] = info['versions']
|
||||
if coexist and pInfo['setup']:
|
||||
pInfo['setup_version'] = info['versions']
|
||||
else:
|
||||
pluginInfo['setup_version'] = self.getVersion(
|
||||
pluginInfo['install_checks'])
|
||||
pInfo['setup_version'] = self.getVersion(pInfo['install_checks'])
|
||||
# pluginInfo['status'] = self.checkStatus(pluginInfo)
|
||||
pluginInfo['status'] = False
|
||||
return pluginInfo
|
||||
pInfo['status'] = False
|
||||
return pInfo
|
||||
|
||||
def makeCoexist(self, data):
|
||||
plugins_info = []
|
||||
@@ -471,7 +510,7 @@ class plugins_api:
|
||||
plugins_info = []
|
||||
|
||||
if (data['pid'] == sType):
|
||||
if type(data['versions']) == list and data.has_key('coexist') and data['coexist']:
|
||||
if type(data['versions']) == list and 'coexist' in data and data['coexist']:
|
||||
tmp_data = self.makeCoexist(data)
|
||||
for index in range(len(tmp_data)):
|
||||
plugins_info.append(tmp_data[index])
|
||||
@@ -481,7 +520,7 @@ class plugins_api:
|
||||
return plugins_info
|
||||
|
||||
if sType == '0':
|
||||
if type(data['versions']) == list and data.has_key('coexist') and data['coexist']:
|
||||
if type(data['versions']) == list and 'coexist' in data and data['coexist']:
|
||||
tmp_data = self.makeCoexist(data)
|
||||
for index in range(len(tmp_data)):
|
||||
plugins_info.append(tmp_data[index])
|
||||
@@ -502,12 +541,12 @@ class plugins_api:
|
||||
json_file = path + '/info.json'
|
||||
if os.path.exists(json_file):
|
||||
try:
|
||||
data = json.loads(public.readFile(json_file))
|
||||
data = json.loads(mw.readFile(json_file))
|
||||
tmp_data = self.makeList(data, sType)
|
||||
for index in range(len(tmp_data)):
|
||||
plugins_info.append(tmp_data[index])
|
||||
except Exception, e:
|
||||
print e
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return plugins_info
|
||||
|
||||
def getAllListPage(self, sType='0', page=1, pageSize=10):
|
||||
@@ -520,12 +559,12 @@ class plugins_api:
|
||||
json_file = path + '/info.json'
|
||||
if os.path.exists(json_file):
|
||||
try:
|
||||
data = json.loads(public.readFile(json_file))
|
||||
data = json.loads(mw.readFile(json_file))
|
||||
tmp_data = self.makeList(data, sType)
|
||||
for index in range(len(tmp_data)):
|
||||
plugins_info.append(tmp_data[index])
|
||||
except Exception, e:
|
||||
print e
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
start = (page - 1) * pageSize
|
||||
end = start + pageSize
|
||||
@@ -570,7 +609,7 @@ class plugins_api:
|
||||
if os.path.isdir(path):
|
||||
json_file = path + '/info.json'
|
||||
if os.path.exists(json_file):
|
||||
data = json.loads(public.readFile(json_file))
|
||||
data = json.loads(mw.readFile(json_file))
|
||||
if sType == '0':
|
||||
tmp_list.append(data)
|
||||
|
||||
@@ -631,7 +670,7 @@ class plugins_api:
|
||||
if os.path.isdir(path):
|
||||
json_file = path + '/info.json'
|
||||
if os.path.exists(json_file):
|
||||
data = json.loads(public.readFile(json_file))
|
||||
data = json.loads(mw.readFile(json_file))
|
||||
if sType == '0':
|
||||
tmp_list.append(data)
|
||||
|
||||
@@ -659,7 +698,7 @@ class plugins_api:
|
||||
# print sType, sPage, sPageSize
|
||||
|
||||
ret = {}
|
||||
ret['type'] = json.loads(public.readFile(self.__type))
|
||||
ret['type'] = json.loads(mw.readFile(self.__type))
|
||||
# plugins_info = self.getAllListThread(sType)
|
||||
# plugins_info = self.getAllListProcess(sType)
|
||||
data = self.getAllListPage(sType, sPage, sPageSize)
|
||||
@@ -671,14 +710,14 @@ class plugins_api:
|
||||
args['tojs'] = 'getSList'
|
||||
args['row'] = sPageSize
|
||||
|
||||
ret['list'] = public.getPage(args)
|
||||
ret['list'] = mw.getPage(args)
|
||||
return ret
|
||||
|
||||
def getIndexList(self):
|
||||
if not os.path.exists(self.__index):
|
||||
public.writeFile(self.__index, '[]')
|
||||
mw.writeFile(self.__index, '[]')
|
||||
|
||||
indexList = json.loads(public.readFile(self.__index))
|
||||
indexList = json.loads(mw.readFile(self.__index))
|
||||
plist = []
|
||||
app = []
|
||||
for i in indexList:
|
||||
@@ -690,15 +729,15 @@ class plugins_api:
|
||||
json_file = path + '/info.json'
|
||||
if os.path.exists(json_file):
|
||||
try:
|
||||
data = json.loads(public.readFile(json_file))
|
||||
data = json.loads(mw.readFile(json_file))
|
||||
tmp_data = self.makeList(data)
|
||||
for index in range(len(tmp_data)):
|
||||
if tmp_data[index]['versions'] == info[1] or info[1] in tmp_data[index]['versions']:
|
||||
tmp_data[index]['display'] = True
|
||||
plist.append(tmp_data[index])
|
||||
continue
|
||||
except Exception, e:
|
||||
print 'getIndexList:', e
|
||||
except Exception as e:
|
||||
print('getIndexList:', e)
|
||||
|
||||
# 使用gevent模式时,无法使用多进程
|
||||
# plist = self.checkStatusMProcess(plist)
|
||||
@@ -707,39 +746,40 @@ class plugins_api:
|
||||
|
||||
def setIndexSort(self, sort):
|
||||
data = sort.split('|')
|
||||
public.writeFile(self.__index, json.dumps(data))
|
||||
mw.writeFile(self.__index, json.dumps(data))
|
||||
return True
|
||||
|
||||
def addIndex(self, name, version):
|
||||
if not os.path.exists(self.__index):
|
||||
public.writeFile(self.__index, '[]')
|
||||
mw.writeFile(self.__index, '[]')
|
||||
|
||||
indexList = json.loads(public.readFile(self.__index))
|
||||
indexList = json.loads(mw.readFile(self.__index))
|
||||
vname = name + '-' + version
|
||||
|
||||
if vname in indexList:
|
||||
return public.returnJson(False, '请不要重复添加!')
|
||||
return mw.returnJson(False, '请不要重复添加!')
|
||||
if len(indexList) >= 12:
|
||||
return public.returnJson(False, '首页最多只能显示12个软件!')
|
||||
return mw.returnJson(False, '首页最多只能显示12个软件!')
|
||||
|
||||
indexList.append(vname)
|
||||
public.writeFile(self.__index, json.dumps(indexList))
|
||||
return public.returnJson(True, '添加成功!')
|
||||
mw.writeFile(self.__index, json.dumps(indexList))
|
||||
return mw.returnJson(True, '添加成功!')
|
||||
|
||||
def removeIndex(self, name, version):
|
||||
if not os.path.exists(self.__index):
|
||||
public.writeFile(self.__index, '[]')
|
||||
mw.writeFile(self.__index, '[]')
|
||||
|
||||
indexList = json.loads(public.readFile(self.__index))
|
||||
indexList = json.loads(mw.readFile(self.__index))
|
||||
vname = name + '-' + version
|
||||
if not vname in indexList:
|
||||
return public.returnJson(True, '删除成功!')
|
||||
return mw.returnJson(True, '删除成功!')
|
||||
indexList.remove(vname)
|
||||
public.writeFile(self.__index, json.dumps(indexList))
|
||||
return public.returnJson(True, '删除成功!')
|
||||
mw.writeFile(self.__index, json.dumps(indexList))
|
||||
return mw.returnJson(True, '删除成功!')
|
||||
|
||||
# shell 调用
|
||||
def run(self, name, func, version, args='', script='index'):
|
||||
path = public.getRunDir() + '/' + self.__plugin_dir + \
|
||||
path = mw.getRunDir() + '/' + self.__plugin_dir + \
|
||||
'/' + name + '/' + script + '.py'
|
||||
py = 'python ' + path
|
||||
|
||||
@@ -750,10 +790,25 @@ class plugins_api:
|
||||
|
||||
if not os.path.exists(path):
|
||||
return ('', '')
|
||||
data = public.execShell(py_cmd)
|
||||
# data = os.popen(py_cmd).read()
|
||||
data = mw.execShell(py_cmd)
|
||||
|
||||
if public.isAppleSystem():
|
||||
print py_cmd
|
||||
if mw.isAppleSystem():
|
||||
print('run', py_cmd)
|
||||
print(data)
|
||||
# print os.path.exists(py_cmd)
|
||||
|
||||
return (data[0].strip(), data[1].strip())
|
||||
|
||||
# 映射包调用
|
||||
def callback(self, name, func, args='', script='index'):
|
||||
package = mw.getRunDir() + '/plugins/' + name
|
||||
if not os.path.exists(package):
|
||||
return (False, "插件不存在!")
|
||||
|
||||
sys.path.append(package)
|
||||
eval_str = "__import__('" + script + "')." + func + '(' + args + ')'
|
||||
newRet = eval(eval_str)
|
||||
if mw.isAppleSystem():
|
||||
print('callback', eval_str)
|
||||
|
||||
return (True, newRet)
|
||||
|
||||
@@ -11,7 +11,8 @@ from flask import Flask, session
|
||||
from flask import request
|
||||
|
||||
import db
|
||||
import public
|
||||
import mw
|
||||
import requests
|
||||
import config_api
|
||||
|
||||
|
||||
@@ -19,7 +20,7 @@ from threading import Thread
|
||||
from time import sleep
|
||||
|
||||
|
||||
def async(f):
|
||||
def mw_async(f):
|
||||
def wrapper(*args, **kwargs):
|
||||
thr = Thread(target=f, args=args, kwargs=kwargs)
|
||||
thr.start()
|
||||
@@ -31,12 +32,12 @@ class system_api:
|
||||
pids = None
|
||||
|
||||
def __init__(self):
|
||||
self.setupPath = public.getServerDir()
|
||||
self.setupPath = mw.getServerDir()
|
||||
|
||||
##### ----- start ----- ###
|
||||
def networkApi(self):
|
||||
data = self.getNetWork()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def updateServerApi(self):
|
||||
stype = request.args.get('type', 'check')
|
||||
@@ -45,11 +46,11 @@ class system_api:
|
||||
|
||||
def systemTotalApi(self):
|
||||
data = self.getSystemTotal()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def diskInfoApi(self):
|
||||
diskInfo = self.getDiskInfo()
|
||||
return public.getJson(diskInfo)
|
||||
return mw.getJson(diskInfo)
|
||||
|
||||
def setControlApi(self):
|
||||
stype = request.form.get('type', '')
|
||||
@@ -61,57 +62,58 @@ class system_api:
|
||||
start = request.args.get('start', '')
|
||||
end = request.args.get('end', '')
|
||||
data = self.getLoadAverageData(start, end)
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def getCpuIoApi(self):
|
||||
start = request.args.get('start', '')
|
||||
end = request.args.get('end', '')
|
||||
data = self.getCpuIoData(start, end)
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def getDiskIoApi(self):
|
||||
start = request.args.get('start', '')
|
||||
end = request.args.get('end', '')
|
||||
data = self.getDiskIoData(start, end)
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def getNetworkIoApi(self):
|
||||
start = request.args.get('start', '')
|
||||
end = request.args.get('end', '')
|
||||
data = self.getNetWorkIoData(start, end)
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
def rememoryApi(self):
|
||||
os.system('sync')
|
||||
scriptFile = public.getRunDir() + '/script/rememory.sh'
|
||||
public.execShell("/bin/bash " + scriptFile)
|
||||
scriptFile = mw.getRunDir() + '/script/rememory.sh'
|
||||
mw.execShell("/bin/bash " + scriptFile)
|
||||
data = self.getMemInfo()
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
# 重启面板
|
||||
def restartApi(self):
|
||||
self.restartMw()
|
||||
return public.returnJson(True, '面板已重启!')
|
||||
return mw.returnJson(True, '面板已重启!')
|
||||
|
||||
def restartServerApi(self):
|
||||
if public.isAppleSystem():
|
||||
return public.returnJson(False, "开发环境不可重起")
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(False, "开发环境不可重起")
|
||||
self.restartServer()
|
||||
return public.returnJson(True, '正在重启服务器!')
|
||||
return mw.returnJson(True, '正在重启服务器!')
|
||||
##### ----- end ----- ###
|
||||
|
||||
@async
|
||||
@mw_async
|
||||
def restartMw(self):
|
||||
sleep(1)
|
||||
cmd = public.getRunDir() + '/scripts/init.d/mw reload'
|
||||
public.execShell(cmd)
|
||||
sleep(0.3)
|
||||
# cmd = mw.getRunDir() + '/scripts/init.d/mw restart'
|
||||
# print cmd
|
||||
mw.execShell('service mw restart')
|
||||
|
||||
@async
|
||||
@mw_async
|
||||
def restartServer(self):
|
||||
if not public.isRestart():
|
||||
return public.returnJson(False, '请等待所有安装任务完成再执行!')
|
||||
public.execShell("sync && init 6 &")
|
||||
return public.returnJson(True, '命令发送成功!')
|
||||
if not mw.isRestart():
|
||||
return mw.returnJson(False, '请等待所有安装任务完成再执行!')
|
||||
mw.execShell("sync && init 6 &")
|
||||
return mw.returnJson(True, '命令发送成功!')
|
||||
|
||||
# 名取PID
|
||||
def getPid(self, pname):
|
||||
@@ -149,30 +151,30 @@ class system_api:
|
||||
|
||||
def getPanelInfo(self, get=None):
|
||||
# 取面板配置
|
||||
address = public.GetLocalIp()
|
||||
address = mw.GetLocalIp()
|
||||
try:
|
||||
try:
|
||||
port = web.ctx.host.split(':')[1]
|
||||
except:
|
||||
port = public.readFile('data/port.pl')
|
||||
port = mw.readFile('data/port.pl')
|
||||
except:
|
||||
port = '8888'
|
||||
domain = ''
|
||||
if os.path.exists('data/domain.conf'):
|
||||
domain = public.readFile('data/domain.conf')
|
||||
domain = mw.readFile('data/domain.conf')
|
||||
|
||||
autoUpdate = ''
|
||||
if os.path.exists('data/autoUpdate.pl'):
|
||||
autoUpdate = 'checked'
|
||||
limitip = ''
|
||||
if os.path.exists('data/limitip.conf'):
|
||||
limitip = public.readFile('data/limitip.conf')
|
||||
limitip = mw.readFile('data/limitip.conf')
|
||||
|
||||
templates = []
|
||||
for template in os.listdir('templates/'):
|
||||
if os.path.isdir('templates/' + template):
|
||||
templates.append(template)
|
||||
template = public.readFile('data/templates.pl')
|
||||
template = mw.readFile('data/templates.pl')
|
||||
|
||||
check502 = ''
|
||||
if os.path.exists('data/502Task.pl'):
|
||||
@@ -187,7 +189,7 @@ class system_api:
|
||||
data['cpuRealUsed'] = cpu[0]
|
||||
data['time'] = self.getBootTime()
|
||||
data['system'] = self.getSystemVersion()
|
||||
data['isuser'] = public.M('users').where(
|
||||
data['isuser'] = mw.M('users').where(
|
||||
'username=?', ('admin',)).count()
|
||||
data['version'] = '0.0.1'
|
||||
return data
|
||||
@@ -224,22 +226,22 @@ class system_api:
|
||||
titlePl = 'data/title.pl'
|
||||
title = 'Linux面板'
|
||||
if os.path.exists(titlePl):
|
||||
title = public.readFile(titlePl).strip()
|
||||
title = mw.readFile(titlePl).strip()
|
||||
return title
|
||||
|
||||
def getSystemVersion(self):
|
||||
# 取操作系统版本
|
||||
if public.getOs() == 'darwin':
|
||||
data = public.execShell('sw_vers')[0]
|
||||
if mw.getOs() == 'darwin':
|
||||
data = mw.execShell('sw_vers')[0]
|
||||
data_list = data.strip().split("\n")
|
||||
mac_version = ''
|
||||
for x in data_list:
|
||||
mac_version += x.split("\t")[1] + ' '
|
||||
return mac_version
|
||||
|
||||
version = public.readFile('/etc/redhat-release')
|
||||
version = mw.readFile('/etc/redhat-release')
|
||||
if not version:
|
||||
version = public.readFile(
|
||||
version = mw.readFile(
|
||||
'/etc/issue').strip().split("\n")[0].replace('\\n', '').replace('\l', '').strip()
|
||||
else:
|
||||
version = version.replace('release ', '').strip()
|
||||
@@ -249,14 +251,14 @@ class system_api:
|
||||
# 取系统启动时间
|
||||
start_time = psutil.boot_time()
|
||||
run_time = time.time() - start_time
|
||||
# conf = public.readFile('/proc/uptime').split()
|
||||
# conf = mw.readFile('/proc/uptime').split()
|
||||
tStr = float(run_time)
|
||||
min = tStr / 60
|
||||
hours = min / 60
|
||||
days = math.floor(hours / 24)
|
||||
hours = math.floor(hours - (days * 24))
|
||||
min = math.floor(min - (days * 60 * 24) - (hours * 60))
|
||||
return public.getInfo('已不间断运行: {1}天{2}小时{3}分钟', (str(int(days)), str(int(hours)), str(int(min))))
|
||||
return mw.getInfo('已不间断运行: {1}天{2}小时{3}分钟', (str(int(days)), str(int(hours)), str(int(min))))
|
||||
|
||||
def getCpuInfo(self, interval=1):
|
||||
# 取CPU信息
|
||||
@@ -267,7 +269,7 @@ class system_api:
|
||||
def getMemInfo(self):
|
||||
# 取内存信息
|
||||
mem = psutil.virtual_memory()
|
||||
if public.getOs() == 'darwin':
|
||||
if mw.getOs() == 'darwin':
|
||||
memInfo = {
|
||||
'memTotal': mem.total / 1024 / 1024
|
||||
}
|
||||
@@ -291,7 +293,7 @@ class system_api:
|
||||
import psutil
|
||||
mem = psutil.virtual_memory()
|
||||
|
||||
if public.getOs() == 'darwin':
|
||||
if mw.getOs() == 'darwin':
|
||||
return mem.percent
|
||||
|
||||
memInfo = {'memTotal': mem.total / 1024 / 1024, 'memFree': mem.free / 1024 / 1024,
|
||||
@@ -300,7 +302,7 @@ class system_api:
|
||||
memInfo['memBuffers'] - memInfo['memCached']
|
||||
tmp1 = memInfo['memTotal'] / 100
|
||||
return (tmp / tmp1)
|
||||
except Exception, ex:
|
||||
except Exception as ex:
|
||||
return 1
|
||||
|
||||
def getDiskInfo(self, get=None):
|
||||
@@ -322,9 +324,9 @@ class system_api:
|
||||
|
||||
def getDiskInfo2(self):
|
||||
# 取磁盘分区信息
|
||||
temp = public.execShell(
|
||||
temp = mw.execShell(
|
||||
"df -h -P|grep '/'|grep -v tmpfs | grep -v devfs")[0]
|
||||
tempInodes = public.execShell(
|
||||
tempInodes = mw.execShell(
|
||||
"df -i -P|grep '/'|grep -v tmpfs | grep -v devfs")[0]
|
||||
temp1 = temp.split('\n')
|
||||
tempInodes1 = tempInodes.split('\n')
|
||||
@@ -394,7 +396,7 @@ class system_api:
|
||||
shutil.rmtree(filename)
|
||||
else:
|
||||
os.remove(filename)
|
||||
print '\t\033[1;32m[OK]\033[0m'
|
||||
print('\t\033[1;32m[OK]\033[0m')
|
||||
num += 1
|
||||
total += size
|
||||
count += num
|
||||
@@ -422,7 +424,7 @@ class system_api:
|
||||
else:
|
||||
os.remove(filename)
|
||||
count += 1
|
||||
public.serviceReload()
|
||||
mw.serviceReload()
|
||||
os.system('echo > /tmp/panelBoot.pl')
|
||||
return total, count
|
||||
|
||||
@@ -458,8 +460,8 @@ class system_api:
|
||||
networkInfo['mem'] = self.getMemInfo()
|
||||
|
||||
return networkInfo
|
||||
except Exception, e:
|
||||
print e
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return None
|
||||
|
||||
def getNetWorkApi(self):
|
||||
@@ -469,10 +471,10 @@ class system_api:
|
||||
networkIo = psutil.net_io_counters()[:4]
|
||||
|
||||
if not os.path.exists(tmpfile):
|
||||
public.writeFile(tmpfile, str(
|
||||
mw.writeFile(tmpfile, str(
|
||||
networkIo[0]) + '|' + str(networkIo[1]) + '|' + str(int(time.time())))
|
||||
|
||||
lastValue = public.readFile(tmpfile).split('|')
|
||||
lastValue = mw.readFile(tmpfile).split('|')
|
||||
|
||||
ntime = time.time()
|
||||
networkInfo = {}
|
||||
@@ -485,7 +487,7 @@ class system_api:
|
||||
networkInfo['downPackets'] = networkIo[3]
|
||||
networkInfo['upPackets'] = networkIo[2]
|
||||
|
||||
public.writeFile(tmpfile, str(
|
||||
mw.writeFile(tmpfile, str(
|
||||
networkIo[0]) + '|' + str(networkIo[1]) + '|' + str(int(time.time())))
|
||||
|
||||
# networkInfo['cpu'] = self.GetCpuInfo(0.1)
|
||||
@@ -495,24 +497,24 @@ class system_api:
|
||||
|
||||
def getNetWorkIoData(self, start, end):
|
||||
# 取指定时间段的网络Io
|
||||
data = public.M('network').dbfile('system').where("addtime>=? AND addtime<=?", (start, end)).field(
|
||||
data = mw.M('network').dbfile('system').where("addtime>=? AND addtime<=?", (start, end)).field(
|
||||
'id,up,down,total_up,total_down,down_packets,up_packets,addtime').order('id asc').select()
|
||||
return self.toAddtime(data)
|
||||
|
||||
def getDiskIoData(self, start, end):
|
||||
# 取指定时间段的磁盘Io
|
||||
data = public.M('diskio').dbfile('system').where("addtime>=? AND addtime<=?", (start, end)).field(
|
||||
data = mw.M('diskio').dbfile('system').where("addtime>=? AND addtime<=?", (start, end)).field(
|
||||
'id,read_count,write_count,read_bytes,write_bytes,read_time,write_time,addtime').order('id asc').select()
|
||||
return self.toAddtime(data)
|
||||
|
||||
def getCpuIoData(self, start, end):
|
||||
# 取指定时间段的CpuIo
|
||||
data = public.M('cpuio').dbfile('system').where("addtime>=? AND addtime<=?",
|
||||
(start, end)).field('id,pro,mem,addtime').order('id asc').select()
|
||||
data = mw.M('cpuio').dbfile('system').where("addtime>=? AND addtime<=?",
|
||||
(start, end)).field('id,pro,mem,addtime').order('id asc').select()
|
||||
return self.toAddtime(data, True)
|
||||
|
||||
def getLoadAverageData(self, start, end):
|
||||
data = public.M('load_average').dbfile('system').where("addtime>=? AND addtime<=?", (
|
||||
data = mw.M('load_average').dbfile('system').where("addtime>=? AND addtime<=?", (
|
||||
start, end)).field('id,pro,one,five,fifteen,addtime').order('id asc').select()
|
||||
return self.toAddtime(data)
|
||||
|
||||
@@ -558,37 +560,37 @@ class system_api:
|
||||
filename = 'data/control.conf'
|
||||
|
||||
if stype == '0':
|
||||
public.execShell("rm -f " + filename)
|
||||
mw.execShell("rm -f " + filename)
|
||||
elif stype == '1':
|
||||
_day = int(day)
|
||||
if _day < 1:
|
||||
return public.returnJson(False, "设置失败!")
|
||||
public.writeFile(filename, day)
|
||||
return mw.returnJson(False, "设置失败!")
|
||||
mw.writeFile(filename, day)
|
||||
elif stype == 'del':
|
||||
if not public.isRestart():
|
||||
return public.returnJson(False, '请等待所有安装任务完成再执行')
|
||||
if not mw.isRestart():
|
||||
return mw.returnJson(False, '请等待所有安装任务完成再执行')
|
||||
os.remove("data/system.db")
|
||||
|
||||
sql = db.Sql().dbfile('system')
|
||||
csql = public.readFile('data/sql/system.sql')
|
||||
csql = mw.readFile('data/sql/system.sql')
|
||||
csql_list = csql.split(';')
|
||||
for index in range(len(csql_list)):
|
||||
sql.execute(csql_list[index], ())
|
||||
return public.returnJson(True, "监控服务已关闭")
|
||||
return mw.returnJson(True, "监控服务已关闭")
|
||||
else:
|
||||
data = {}
|
||||
if os.path.exists(filename):
|
||||
try:
|
||||
data['day'] = int(public.readFile(filename))
|
||||
data['day'] = int(mw.readFile(filename))
|
||||
except:
|
||||
data['day'] = 30
|
||||
data['status'] = True
|
||||
else:
|
||||
data['day'] = 30
|
||||
data['status'] = False
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
return public.returnJson(True, "设置成功!")
|
||||
return mw.returnJson(True, "设置成功!")
|
||||
|
||||
def versionDiff(self, old, new):
|
||||
'''
|
||||
@@ -601,93 +603,93 @@ class system_api:
|
||||
return 'test'
|
||||
|
||||
old_list = old.split('.')
|
||||
|
||||
ret = 'none'
|
||||
for i in range(len(old_list)):
|
||||
tm_new = int(new_list[i])
|
||||
tm_old = int(new_list[i])
|
||||
if tm_new > tm_old:
|
||||
return 'new'
|
||||
|
||||
isHasNew = True
|
||||
if int(new_list[0]) == int(old_list[0]) and int(new_list[1]) == int(old_list[1]) and int(new_list[2]) == int(old_list[2]):
|
||||
isHasNew = False
|
||||
|
||||
if isHasNew:
|
||||
return 'new'
|
||||
return ret
|
||||
|
||||
def getServerInfo(self):
|
||||
upAddr = 'https://raw.githubusercontent.com/midoks/mdserver-web/master/version/info.json'
|
||||
try:
|
||||
version = public.httpGet(upAddr)
|
||||
print version
|
||||
version = json.loads(version)
|
||||
requests.adapters.DEFAULT_RETRIES = 2
|
||||
r = requests.get(upAddr, verify=False)
|
||||
version = json.loads(r.content)
|
||||
return version[0]
|
||||
except Exception as e:
|
||||
print 'getServerInfo', e
|
||||
print('getServerInfo', e)
|
||||
return {}
|
||||
|
||||
def updateServer(self, stype, version=''):
|
||||
# 更新服务
|
||||
try:
|
||||
if not public.isRestart():
|
||||
return public.returnJson(False, '请等待所有安装任务完成再执行!')
|
||||
if not mw.isRestart():
|
||||
return mw.returnJson(False, '请等待所有安装任务完成再执行!')
|
||||
|
||||
if stype == 'check':
|
||||
version_now = config_api.config_api().getVersion()
|
||||
version_new_info = self.getServerInfo()
|
||||
if not 'version' in version_new_info:
|
||||
return public.returnJson(False, '服务器数据有问题!')
|
||||
return mw.returnJson(False, '服务器数据或网络有问题!')
|
||||
|
||||
diff = self.versionDiff(
|
||||
version_now, version_new_info['version'])
|
||||
if diff == 'new':
|
||||
return public.returnJson(True, '有新版本!', version_new_info['version'])
|
||||
return mw.returnJson(True, '有新版本!', version_new_info['version'])
|
||||
elif diff == 'test':
|
||||
return public.returnJson(True, '有测试版本!', version_new_info['version'])
|
||||
return mw.returnJson(True, '有测试版本!', version_new_info['version'])
|
||||
else:
|
||||
return public.returnJson(False, '已经是最新,无需更新!')
|
||||
return mw.returnJson(False, '已经是最新,无需更新!')
|
||||
|
||||
if stype == 'info':
|
||||
version_new_info = self.getServerInfo()
|
||||
version_now = config_api.config_api().getVersion()
|
||||
|
||||
if not 'version' in version_new_info:
|
||||
return public.returnJson(False, '服务器数据有问题!')
|
||||
return mw.returnJson(False, '服务器数据有问题!')
|
||||
diff = self.versionDiff(
|
||||
version_now, version_new_info['version'])
|
||||
return public.returnJson(True, '更新信息!', version_new_info)
|
||||
return mw.returnJson(True, '更新信息!', version_new_info)
|
||||
|
||||
if stype == 'update':
|
||||
if version == '':
|
||||
return public.returnJson(False, '缺少版本信息!')
|
||||
return mw.returnJson(False, '缺少版本信息!')
|
||||
|
||||
v_new_info = self.getServerInfo()
|
||||
if v_new_info['version'] != version:
|
||||
return public.returnJson(False, '更新失败,请重试!')
|
||||
return mw.returnJson(False, '更新失败,请重试!')
|
||||
|
||||
if not 'path' in v_new_info or v_new_info['path'] == '':
|
||||
return public.returnJson(False, '下载地址不存在!')
|
||||
return mw.returnJson(False, '下载地址不存在!')
|
||||
|
||||
newUrl = v_new_info['path']
|
||||
toPath = public.getRootDir() + '/temp'
|
||||
toPath = mw.getRootDir() + '/temp'
|
||||
if not os.path.exists(toPath):
|
||||
public.execShell('mkdir -p ' + toPath)
|
||||
mw.execShell('mkdir -p ' + toPath)
|
||||
|
||||
if not os.path.exists(toPath + '/mw.zip'):
|
||||
public.execShell('wget -O ' + toPath + '/mw.zip ' + newUrl)
|
||||
mw.execShell('wget -O ' + toPath + '/mw.zip ' + newUrl)
|
||||
|
||||
public.execShell('unzip -o ' + toPath + '/mw.zip' + ' -d ./')
|
||||
public.execShell('unzip -o mdserver-web.zip -d ./')
|
||||
public.execShell('rm -f mdserver-web.zip')
|
||||
return public.returnJson(True, '安装更新成功!')
|
||||
mw.execShell('unzip -o ' + toPath + '/mw.zip' + ' -d ./')
|
||||
mw.execShell('unzip -o mw.zip -d ./')
|
||||
mw.execShell('rm -f mw.zip')
|
||||
return mw.returnJson(True, '安装更新成功,需自己重启!')
|
||||
|
||||
return public.returnJson(False, '已经是最新,无需更新!')
|
||||
return mw.returnJson(False, '已经是最新,无需更新!')
|
||||
except Exception as ex:
|
||||
print 'updateServer', ex
|
||||
return public.returnJson(False, "连接服务器失败!")
|
||||
print('updateServer', ex)
|
||||
return mw.returnJson(False, "连接服务器失败!")
|
||||
|
||||
# 修复面板
|
||||
def repPanel(self, get):
|
||||
vp = ''
|
||||
if public.readFile('/www/server/mdserver-web/class/common.py').find('checkSafe') != -1:
|
||||
if mw.readFile('/www/server/mdserver-web/class/common.py').find('checkSafe') != -1:
|
||||
vp = '_pro'
|
||||
public.ExecShell("wget -O update.sh " + public.get_url() +
|
||||
"/install/update" + vp + ".sh && bash update.sh")
|
||||
mw.ExecShell("wget -O update.sh " + mw.get_url() +
|
||||
"/install/update" + vp + ".sh && bash update.sh")
|
||||
if hasattr(web.ctx.session, 'getCloudPlugin'):
|
||||
del(web.ctx.session['getCloudPlugin'])
|
||||
return True
|
||||
|
||||
@@ -4,7 +4,7 @@ import psutil
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
import public
|
||||
import mw
|
||||
import re
|
||||
import json
|
||||
import pwd
|
||||
@@ -19,48 +19,48 @@ class task_api:
|
||||
pass
|
||||
|
||||
def countApi(self):
|
||||
c = public.M('tasks').where("status!=?", ('1',)).count()
|
||||
c = mw.M('tasks').where("status!=?", ('1',)).count()
|
||||
return str(c)
|
||||
|
||||
def listApi(self):
|
||||
|
||||
p = request.form.get('p', '1').encode('utf-8')
|
||||
p = request.form.get('p', '1')
|
||||
limit = request.form.get('limit', '10').strip()
|
||||
search = request.form.get('search', '').strip()
|
||||
|
||||
start = (int(p) - 1) * int(limit)
|
||||
limit_str = str(start) + ',' + str(limit)
|
||||
|
||||
_list = public.M('tasks').where('', ()).field(
|
||||
_list = mw.M('tasks').where('', ()).field(
|
||||
'id,name,type,status,addtime,start,end').limit(limit_str).order('id desc').select()
|
||||
_ret = {}
|
||||
_ret['data'] = _list
|
||||
|
||||
count = public.M('tasks').where('', ()).count()
|
||||
count = mw.M('tasks').where('', ()).count()
|
||||
_page = {}
|
||||
_page['count'] = count
|
||||
_page['tojs'] = 'remind'
|
||||
_page['p'] = p
|
||||
|
||||
_ret['page'] = public.getPage(_page)
|
||||
return public.getJson(_ret)
|
||||
_ret['page'] = mw.getPage(_page)
|
||||
return mw.getJson(_ret)
|
||||
|
||||
def getExecLogApi(self):
|
||||
file = os.getcwd() + "/tmp/panelExec.log"
|
||||
v = public.getLastLine(file, 100)
|
||||
v = mw.getLastLine(file, 100)
|
||||
return v
|
||||
|
||||
def getTaskSpeedApi(self):
|
||||
tempFile = os.getcwd() + '/tmp/panelExec.log'
|
||||
freshFile = os.getcwd() + '/tmp/panelFresh'
|
||||
|
||||
find = public.M('tasks').where('status=? OR status=?',
|
||||
('-1', '0')).field('id,type,name,execstr').find()
|
||||
find = mw.M('tasks').where('status=? OR status=?',
|
||||
('-1', '0')).field('id,type,name,execstr').find()
|
||||
if not len(find):
|
||||
return public.returnJson(False, '当前没有任务队列在执行-2!')
|
||||
return mw.returnJson(False, '当前没有任务队列在执行-2!')
|
||||
|
||||
isTask = os.getcwd() + '/tmp/panelTask.pl'
|
||||
public.writeFile(isTask, 'True')
|
||||
mw.writeFile(isTask, 'True')
|
||||
|
||||
echoMsg = {}
|
||||
echoMsg['name'] = find['name']
|
||||
@@ -68,19 +68,19 @@ class task_api:
|
||||
if find['type'] == 'download':
|
||||
import json
|
||||
try:
|
||||
tmp = public.readFile(tempFile)
|
||||
tmp = mw.readFile(tempFile)
|
||||
if len(tmp) < 10:
|
||||
return public.returnJson(False, '当前没有任务队列在执行-3!')
|
||||
return mw.returnJson(False, '当前没有任务队列在执行-3!')
|
||||
echoMsg['msg'] = json.loads(tmp)
|
||||
echoMsg['isDownload'] = True
|
||||
except:
|
||||
public.M('tasks').where(
|
||||
mw.M('tasks').where(
|
||||
"id=?", (find['id'],)).save('status', ('0',))
|
||||
return public.returnJson(False, '当前没有任务队列在执行-4!')
|
||||
return mw.returnJson(False, '当前没有任务队列在执行-4!')
|
||||
else:
|
||||
echoMsg['msg'] = public.getLastLine(tempFile, 10)
|
||||
echoMsg['msg'] = mw.getLastLine(tempFile, 10)
|
||||
echoMsg['isDownload'] = False
|
||||
|
||||
echoMsg['task'] = public.M('tasks').where("status!=?", ('1',)).field(
|
||||
echoMsg['task'] = mw.M('tasks').where("status!=?", ('1',)).field(
|
||||
'id,status,name,type').order("id asc").select()
|
||||
return public.getJson(echoMsg)
|
||||
return mw.getJson(echoMsg)
|
||||
|
||||
@@ -75,7 +75,7 @@ class vieCode:
|
||||
if not self.__inNoise:
|
||||
return
|
||||
font = ImageFont.truetype(self.__fontPatn, int(self.__fontSize / 1.5))
|
||||
for i in xrange(5):
|
||||
for i in range(5):
|
||||
# 杂点颜色
|
||||
noiseColor = (random.randint(150, 200), random.randint(
|
||||
150, 200), random.randint(150, 200))
|
||||
@@ -104,9 +104,9 @@ class vieCode:
|
||||
# 画曲线
|
||||
color = (random.randint(30, 150), random.randint(
|
||||
30, 150), random.randint(30, 150))
|
||||
for x in xrange(xend):
|
||||
for x in range(xend):
|
||||
if w != 0:
|
||||
for k in xrange(int(self.__heigth / 10)):
|
||||
for k in range(int(self.__heigth / 10)):
|
||||
y = a * math.sin(w * x + f) + b + self.__heigth / 2
|
||||
i = int(self.__fontSize / 5)
|
||||
while i > 0:
|
||||
@@ -120,7 +120,7 @@ class vieCode:
|
||||
font = ImageFont.truetype(self.__fontPatn, self.__fontSize)
|
||||
x = 0
|
||||
# 打印字符到画板
|
||||
for i in xrange(self.__length):
|
||||
for i in range(self.__length):
|
||||
# 设置字体随机颜色
|
||||
color = (random.randint(30, 150), random.randint(
|
||||
30, 150), random.randint(30, 150))
|
||||
|
||||
7
clear.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/lib/python2.7/bin
|
||||
|
||||
|
||||
|
||||
find . -name .DS_Store | xargs rm -rf
|
||||
find . -type d -name "*.pyc" | xargs rm -rf
|
||||
7
cli.sh
@@ -15,12 +15,15 @@ mw_start_debug(){
|
||||
gunicorn -b :7200 -k gevent -w 1 app:app
|
||||
# gunicorn -b :7200 -k eventlet -w 1 app:app
|
||||
# gunicorn -c setting.py app:app
|
||||
|
||||
}
|
||||
|
||||
mw_stop()
|
||||
{
|
||||
ps -ef|grep app:app |grep -v grep|awk '{print $2}'|xargs kill -9
|
||||
PLIST=`ps -ef|grep app:app |grep -v grep|awk '{print $2}'`
|
||||
for i in $PLIST
|
||||
do
|
||||
kill -9 $i
|
||||
done
|
||||
ps -ef|grep task.py |grep -v grep|awk '{print $2}'|xargs kill -9
|
||||
}
|
||||
|
||||
|
||||
1
data/api_login.txt
Normal file
@@ -0,0 +1 @@
|
||||
jnuxgfkj
|
||||
@@ -1 +0,0 @@
|
||||
qpzw99oc
|
||||
1
data/defaultSite.pl
Normal file
@@ -0,0 +1 @@
|
||||
t.vvv
|
||||
@@ -47,8 +47,9 @@ CREATE TABLE IF NOT EXISTS `firewall` (
|
||||
INSERT INTO `firewall` (`id`, `port`, `ps`, `addtime`) VALUES
|
||||
(1, '80', '网站默认端口', '0000-00-00 00:00:00'),
|
||||
(2, '7200', 'WEB面板', '0000-00-00 00:00:00'),
|
||||
(3, '22', 'SSH远程管理服务', '0000-00-00 00:00:00')
|
||||
(3, '888', 'phpMyAdmin默认端口', '0000-00-00 00:00:00');
|
||||
(3, '22', 'SSH远程管理服务', '0000-00-00 00:00:00'),
|
||||
(4, '888', 'phpMyAdmin默认端口', '0000-00-00 00:00:00'),
|
||||
(5, '3306', 'MySQL端口', '0000-00-00 00:00:00');
|
||||
|
||||
|
||||
|
||||
@@ -65,11 +66,17 @@ CREATE TABLE IF NOT EXISTS `sites` (
|
||||
`path` TEXT,
|
||||
`status` TEXT,
|
||||
`index` TEXT,
|
||||
`type_id` INTEGER,
|
||||
`ps` TEXT,
|
||||
`edate` TEXT,
|
||||
`addtime` TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `site_types` (
|
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
`name` TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `domain` (
|
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
`pid` INTEGER,
|
||||
|
||||
@@ -47,6 +47,6 @@ server
|
||||
access_log /dev/null;
|
||||
}
|
||||
|
||||
access_log {$LOGPATH}/{$SERVER_NAME}.log;
|
||||
access_log {$LOGPATH}/{$SERVER_NAME}.log main;
|
||||
error_log {$LOGPATH}/{$SERVER_NAME}.error.log;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 181 B |
@@ -1,16 +0,0 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('abkill');">服务</p>
|
||||
<p onclick="pluginInitD('abkill');">自启动</p>
|
||||
<p onclick="pluginConfig('abkill');">黑名单</p>
|
||||
<p onclick="pluginConfig('abkill');">异常日志</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$.getScript( "/plugins/file?name=abkill&f=js/abkill.js");
|
||||
</script>
|
||||
@@ -1,172 +0,0 @@
|
||||
# coding: utf-8
|
||||
|
||||
import time
|
||||
import random
|
||||
import os
|
||||
import urllib
|
||||
import binascii
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import public
|
||||
|
||||
|
||||
app_debug = False
|
||||
if public.getOs() == 'darwin':
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'abkill'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return public.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return public.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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 initDreplace():
|
||||
initd_file = getInitDFile()
|
||||
|
||||
if not os.path.exists(initd_file):
|
||||
return getServerDir()
|
||||
|
||||
return initd_file
|
||||
|
||||
|
||||
def status():
|
||||
data = public.execShell(
|
||||
"ps -ef|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def csvnOp(method):
|
||||
|
||||
if app_debug:
|
||||
os_name = public.getOs()
|
||||
if os_name == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_initd_csvn = '/etc/init.d/csvn'
|
||||
_initd_csvn_httpd = '/etc/init.d/csvn-httpd'
|
||||
#_csvn = getServerDir() + '/bin/csvn'
|
||||
#_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn_httpd = public.execShell(_initd_csvn_httpd + ' ' + method)
|
||||
# ret_csvn = public.execShell(_initd_csvn + ' ' + method)
|
||||
subprocess.Popen(_initd_csvn + ' ' + method,
|
||||
stdout=subprocess.PIPE, shell=True)
|
||||
if ret_csvn_httpd[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def start():
|
||||
return csvnOp('start')
|
||||
|
||||
|
||||
def stop():
|
||||
return csvnOp('stop')
|
||||
|
||||
|
||||
def restart():
|
||||
return csvnOp('restart')
|
||||
|
||||
|
||||
def reload():
|
||||
return csvnOp('reload')
|
||||
|
||||
|
||||
def initdStatus():
|
||||
if not app_debug:
|
||||
if public.getOs() == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_initd_csvn = '/etc/init.d/csvn'
|
||||
_initd_csvn_httpd = '/etc/init.d/csvn-httpd'
|
||||
|
||||
if os.path.exists(_initd_csvn) and os.path.exists(_initd_csvn_httpd):
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdInstall():
|
||||
import shutil
|
||||
if not app_debug:
|
||||
if public.getOs() == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_csvn = getServerDir() + '/bin/csvn'
|
||||
_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn = public.execShell(_csvn + ' install')
|
||||
ret_csvn_httpd = public.execShell(_csvn_httpd + ' install')
|
||||
if ret_csvn[1] == '' and ret_csvn_httpd[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
if public.getOs() == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_csvn = getServerDir() + '/bin/csvn'
|
||||
_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn = public.execShell(_csvn + ' remove')
|
||||
ret_csvn_httpd = public.execShell(_csvn_httpd + ' remove')
|
||||
return 'ok'
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
elif func == 'start':
|
||||
print start()
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
elif func == 'initd_status':
|
||||
print initdStatus()
|
||||
elif func == 'initd_install':
|
||||
print initdInstall()
|
||||
elif func == 'initd_uninstall':
|
||||
print initdUinstall()
|
||||
else:
|
||||
print 'fail'
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"sort": 7,
|
||||
"ps": "异常程序监控和KILL",
|
||||
"shell": "install.sh",
|
||||
"name": "abkill",
|
||||
"title": "异常程序监控",
|
||||
"versions": "0.1",
|
||||
"updates":"0.1",
|
||||
"tip": "soft",
|
||||
"checks": "server/abkill",
|
||||
"author": "midoks",
|
||||
"date": "201-04-01",
|
||||
"home": "https://www.collab.net",
|
||||
"type": "异常程序监控和KILL",
|
||||
"pid": "4"
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
ak_path={$SERVER_PATH}/abkill
|
||||
|
||||
ak_start(){
|
||||
isStart=$(ps aux |grep 'abkill.py'|grep -v grep|awk '{print $2}')
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "Starting abkill... \c"
|
||||
cd $ak_path && nohup python abkill.py >> $ak_path/task.log 2>&1 &
|
||||
sleep 0.3
|
||||
isStart=$(ps aux |grep 'abkill.py'|grep -v grep|awk '{print $2}')
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "\033[31mfailed\033[0m"
|
||||
echo '------------------------------------------------------'
|
||||
tail -n 20 $ak_path/task.log
|
||||
echo '------------------------------------------------------'
|
||||
echo -e "\033[31mError: abkill service startup failed.\033[0m"
|
||||
return;
|
||||
fi
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
else
|
||||
echo "Starting abkill(pid $isStart) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
ak_stop()
|
||||
{
|
||||
echo -e "Stopping abkill... \c";
|
||||
pids=$(ps aux | grep 'abkill.py' | grep -v grep|awk '{print $2}')
|
||||
arr=($pids)
|
||||
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
kill -9 $p
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
|
||||
}
|
||||
|
||||
ak_status()
|
||||
{
|
||||
isStart=$(ps aux|grep 'abkill.py'|grep -v grep|awk '{print $2}')
|
||||
if [ "$isStart" != '' ];then
|
||||
echo -e "\033[32mabkill (pid $(echo $isStart)) already running\033[0m"
|
||||
else
|
||||
echo -e "\033[31mabkill not running\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
ak_reload()
|
||||
{
|
||||
isStart=$(ps aux|grep 'abkill.py'|grep -v grep|awk '{print $2}')
|
||||
|
||||
if [ "$isStart" != '' ];then
|
||||
ak_stop
|
||||
ak_start
|
||||
else
|
||||
echo -e "\033[31mmw not running\033[0m"
|
||||
mw_start
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
case "$1" in
|
||||
'start') ak_start;;
|
||||
'stop') ak_stop;;
|
||||
'reload') ak_reload;;
|
||||
'restart')
|
||||
ak_stop
|
||||
sleep 0.3
|
||||
ak_start;;
|
||||
'status') ak_status;;
|
||||
esac
|
||||
@@ -1 +0,0 @@
|
||||
pluginService('abkill');
|
||||
@@ -1,85 +0,0 @@
|
||||
# coding: utf-8
|
||||
|
||||
# 使用示例:
|
||||
# 1、将此文件重命名为btkill.py , 然后上传到服务器/root目录
|
||||
# 2、执行 python /root/btkill.py
|
||||
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
sys.path.append("/usr/local/lib/python2.7/site-packages")
|
||||
import psutil
|
||||
|
||||
|
||||
class btkill:
|
||||
__limit = 10 # Cpu使用率触发上限
|
||||
__vmsize = 1048576 / 4 # 虚拟内存触发上限(字节)
|
||||
|
||||
def checkMain(self):
|
||||
pids = psutil.pids()
|
||||
print pids
|
||||
num = 0
|
||||
for pid in pids:
|
||||
try:
|
||||
p = psutil.Process(pid)
|
||||
if p.exe() == "":
|
||||
continue
|
||||
name = p.name()
|
||||
if self.whiteList(name):
|
||||
continue
|
||||
cputimes = p.cpu_times()
|
||||
if cputimes.user < 0.1:
|
||||
continue
|
||||
print p
|
||||
percent = p.cpu_percent(interval=1)
|
||||
vm = p.memory_info().vms
|
||||
if percent > self.__limit or vm > self.__vmsize:
|
||||
log = time.strftime('%Y-%m-%d %X', time.localtime()) + " (PID=" + str(
|
||||
pid) + ", NAME=" + name + ", VMS=" + str(vm) + ", PERCENT=" + str(percent) + "%)"
|
||||
# p.kill()
|
||||
num += 1
|
||||
print log + " >> killed\n"
|
||||
except Exception as ex:
|
||||
print str(ex)
|
||||
return num
|
||||
|
||||
# 检查白名单
|
||||
def whiteList(self, name):
|
||||
wlist = ['yum', 'apt-get', 'apt', 'redis-cli', 'memcached', 'sshd', 'vm', 'vim', 'htop', 'top', 'sh', 'bash', 'zip', 'gzip', 'rsync',
|
||||
'tar', 'unzip', 'php', 'composer', 'pkill', 'mongo', 'mongod', 'php-fpm', 'nginx', 'httpd', 'lsof', 'ps', 'redis-server',
|
||||
'mysqld', 'mysqld_safe', 'mysql', 'pure-ftpd', 'sparse_dd', 'stunnel', 'squeezed', 'vncterm', 'awk', 'ruby', 'postgres',
|
||||
'mpathalert', 'vncterm', 'multipathd', 'fe', 'elasticsyslog', 'syslogd', 'v6d', 'xapi', 'screen', 'runsvdir', 'svlogd',
|
||||
'java', 'udevd', 'ntpd', 'irqbalance', 'qmgr', 'wpa_supplicant', 'mysqld_safe', 'sftp-server', 'lvmetad', 'gitlab-web',
|
||||
'pure-ftpd', 'auditd', 'master', 'dbus-daemon', 'tapdisk', 'sshd', 'init', 'ksoftirqd', 'kworker', 'kmpathd',
|
||||
'kmpath_handlerd', 'python', 'kdmflush', 'bioset', 'crond', 'kthreadd', 'migration', 'rcu_sched', 'kjournald',
|
||||
'gcc', 'gcc++', 'nginx', 'mysqld', 'php-cgi', 'login', 'firewalld', 'iptables', 'systemd', 'network', 'dhclient',
|
||||
'systemd-journald', 'NetworkManager', 'systemd-logind', 'systemd-udevd', 'polkitd', 'tuned', 'rsyslogd', 'AliYunDunUpdate', 'AliYunDun', 'sendmail']
|
||||
wslist = ['vif', 'qemu', 'scsi_eh', 'xcp',
|
||||
'xen', 'docker', 'yunsuo', 'aliyun', 'PM2']
|
||||
|
||||
for key in wlist:
|
||||
if key == name:
|
||||
return True
|
||||
|
||||
for key in wslist:
|
||||
if name.find(key) != -1:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
# 开始处理
|
||||
def start(self):
|
||||
num = 0
|
||||
while True:
|
||||
num += self.checkMain()
|
||||
print "查杀完成, 共查杀[" + str(num) + "]个异常进程!"
|
||||
time.sleep(3)
|
||||
print '======================================='
|
||||
print "查杀完成, 共查杀[" + str(num) + "]个异常进程!"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print "正在检测异常进程..."
|
||||
print '======================================='
|
||||
c = btkill()
|
||||
c.start()
|
||||
102
plugins/aria2/conf/aria2.conf
Executable file
@@ -0,0 +1,102 @@
|
||||
## 文件保存相关 ##
|
||||
|
||||
# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
|
||||
dir=/tmp/aria2
|
||||
# 设置日志等级
|
||||
log-level=error
|
||||
# 日志保存路径
|
||||
log={$SERVER_PATH}/aria2.log
|
||||
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
|
||||
disk-cache=32M
|
||||
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
|
||||
# 预分配所需时间: none < falloc ? trunc < prealloc
|
||||
# falloc和trunc则需要文件系统和内核支持
|
||||
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
|
||||
#file-allocation=none
|
||||
# 断点续传
|
||||
continue=true
|
||||
|
||||
## 下载连接相关 ##
|
||||
|
||||
# 最大同时下载任务数, 运行时可修改, 默认:5
|
||||
max-concurrent-downloads=5
|
||||
# 同一服务器连接数, 添加时可指定, 默认:1
|
||||
max-connection-per-server=10
|
||||
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
|
||||
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
|
||||
min-split-size=10M
|
||||
# 单个任务最大线程数, 添加时可指定, 默认:5
|
||||
split=128
|
||||
# 整体下载速度限制, 运行时可修改, 默认:0
|
||||
#max-overall-download-limit=0
|
||||
# 单个任务下载速度限制, 默认:0
|
||||
#max-download-limit=0
|
||||
# 整体上传速度限制, 运行时可修改, 默认:0
|
||||
#max-overall-upload-limit=0
|
||||
# 单个任务上传速度限制, 默认:0
|
||||
#max-upload-limit=0
|
||||
# 禁用IPv6, 默认:false
|
||||
disable-ipv6=true
|
||||
|
||||
## 进度保存相关 ##
|
||||
|
||||
# 从会话文件中读取下载任务
|
||||
input-file={$SERVER_PATH}/aria2.session
|
||||
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
|
||||
save-session={$SERVER_PATH}/aria2.session
|
||||
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
|
||||
#save-session-interval=60
|
||||
|
||||
## RPC相关设置 ##
|
||||
|
||||
# 启用RPC, 默认:false
|
||||
enable-rpc=true
|
||||
# 允许所有来源, 默认:false
|
||||
rpc-allow-origin-all=true
|
||||
# 允许非外部访问, 默认:false
|
||||
rpc-listen-all=true
|
||||
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
|
||||
#event-poll=select
|
||||
# RPC监听端口, 端口被占用时可以修改, 默认:6800
|
||||
rpc-listen-port=6800
|
||||
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
|
||||
#rpc-secret=sark
|
||||
# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
|
||||
#rpc-user=<USER>
|
||||
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
|
||||
#rpc-passwd=<PASSWD>
|
||||
|
||||
## BT/PT下载相关 ##
|
||||
|
||||
# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
|
||||
#follow-torrent=true
|
||||
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
|
||||
listen-port=51413
|
||||
# 单个种子最大连接数, 默认:55
|
||||
#bt-max-peers=55
|
||||
# 打开DHT功能, PT需要禁用, 默认:true
|
||||
enable-dht=false
|
||||
# 打开IPv6 DHT功能, PT需要禁用
|
||||
#enable-dht6=false
|
||||
# DHT网络监听端口, 默认:6881-6999
|
||||
#dht-listen-port=6881-6999
|
||||
# 本地节点查找, PT需要禁用, 默认:false
|
||||
#bt-enable-lpd=false
|
||||
# 种子交换, PT需要禁用, 默认:true
|
||||
enable-peer-exchange=false
|
||||
# 每个种子限速, 对少种的PT很有用, 默认:50K
|
||||
#bt-request-peer-speed-limit=50K
|
||||
# 客户端伪装, PT需要
|
||||
peer-id-prefix=-TR2770-
|
||||
user-agent=Transmission/2.77
|
||||
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
|
||||
seed-ratio=0
|
||||
# 强制保存会话, 即使任务已经完成, 默认:false
|
||||
# 较新的版本开启后会在任务完成后依然保留.aria2文件
|
||||
#force-save=false
|
||||
# BT校验相关, 默认:true
|
||||
#bt-hash-check-seed=true
|
||||
# 继续之前的BT任务时, 无需再次校验, 默认:false
|
||||
bt-seed-unverified=true
|
||||
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
|
||||
bt-save-metadata=true
|
||||
BIN
plugins/aria2/ico.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
19
plugins/aria2/index.html
Executable file
@@ -0,0 +1,19 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('aria2');">服务</p>
|
||||
<p onclick="pluginInitD('aria2');">自启动</p>
|
||||
<p onclick="pluginConfig('aria2');">配置修改</p>
|
||||
<p onclick="pluginLogs('aria2','','run_log');">运行日志</p>
|
||||
<p onclick="readme();">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$.getScript( "/plugins/file?name=aria2&f=js/aria2.js", function(){
|
||||
pluginService('aria2');
|
||||
});
|
||||
</script>
|
||||
211
plugins/aria2/index.py
Executable file
@@ -0,0 +1,211 @@
|
||||
# coding:utf-8
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import shutil
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'aria2'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDTpl():
|
||||
path = getPluginDir() + "/init.d/aria2.tpl"
|
||||
return path
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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 initDreplace():
|
||||
|
||||
file_tpl = getInitDTpl()
|
||||
service_path = os.path.dirname(os.getcwd())
|
||||
|
||||
initD_path = getServerDir() + '/init.d'
|
||||
|
||||
file_bin = initD_path + '/' + getPluginName()
|
||||
if not os.path.exists(initD_path):
|
||||
os.mkdir(initD_path)
|
||||
|
||||
# initd replace
|
||||
content = mw.readFile(file_tpl)
|
||||
content = content.replace('{$SERVER_PATH}', service_path)
|
||||
mw.writeFile(file_bin, content)
|
||||
mw.execShell('chmod +x ' + file_bin)
|
||||
|
||||
aria2_path = getServerDir() + '/aria2'
|
||||
mw.execShell('mkdir -p /tmp/download')
|
||||
if not os.path.exists(aria2_path):
|
||||
|
||||
mw.execShell('mkdir -p ' + aria2_path)
|
||||
mw.execShell('touch ' + aria2_path + '/aria2.session')
|
||||
|
||||
path = getPluginDir() + "/conf/aria2.conf"
|
||||
content = mw.readFile(path)
|
||||
content = content.replace('{$SERVER_PATH}', aria2_path)
|
||||
|
||||
mw.writeFile(aria2_path + '/aria2.conf', content)
|
||||
|
||||
return file_bin
|
||||
|
||||
|
||||
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():
|
||||
cmd = "ps -ef|grep aria2 |grep -v grep | grep -v 'mdserver-web'| awk '{print $2}'"
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def start():
|
||||
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' start')
|
||||
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def stop():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' stop')
|
||||
# print data
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def restart():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' reload')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def reload():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' reload')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def getPathFile():
|
||||
if mw.isAppleSystem():
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
return '/Users/' + user + '/.aria2/aria2.conf'
|
||||
return getServerDir() + '/aria2/aria2.conf'
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def initdStatus():
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
initd_bin = getInitDFile()
|
||||
if os.path.exists(initd_bin):
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdInstall():
|
||||
source_bin = initDreplace()
|
||||
initd_bin = getInitDFile()
|
||||
shutil.copyfile(source_bin, initd_bin)
|
||||
mw.execShell('chmod +x ' + initd_bin)
|
||||
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --add ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --del ' + getPluginName())
|
||||
|
||||
initd_bin = getInitDFile()
|
||||
|
||||
if os.path.exists(initd_bin):
|
||||
os.remove(initd_bin)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def getLog():
|
||||
if mw.isAppleSystem():
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
return '/Users/' + user + '/.aria2/aria2.log'
|
||||
return getServerDir() + '/aria2/aria2.log'
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print(status())
|
||||
elif func == 'start':
|
||||
print(start())
|
||||
elif func == 'stop':
|
||||
print(stop())
|
||||
elif func == 'restart':
|
||||
print(restart())
|
||||
elif func == 'reload':
|
||||
print(reload())
|
||||
elif func == 'conf':
|
||||
print(getPathFile())
|
||||
elif func == 'initd_status':
|
||||
print(initdStatus())
|
||||
elif func == 'initd_install':
|
||||
print(initdInstall())
|
||||
elif func == 'initd_uninstall':
|
||||
print(initdUinstall())
|
||||
elif func == 'run_log':
|
||||
print(getLog())
|
||||
else:
|
||||
print('error')
|
||||
15
plugins/aria2/info.json
Executable file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"title":"aria2",
|
||||
"tip":"soft",
|
||||
"name":"aria2",
|
||||
"type":"其他插件",
|
||||
"ps":"一款下载神器",
|
||||
"versions":"1.0",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/aria2",
|
||||
"path": "server/aria2",
|
||||
"author":"midoks",
|
||||
"home":"https://github.com/aria2/aria2",
|
||||
"date":"2020-06-08",
|
||||
"pid": "5"
|
||||
}
|
||||
49
plugins/aria2/init.d/aria2.tpl
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
# chkconfig: 2345 55 25
|
||||
# description: aria2 Service
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: aria2
|
||||
# Required-Start: $all
|
||||
# Required-Stop: $all
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: starts aria2
|
||||
# Description: starts the MDW-Web
|
||||
### END INIT INFO
|
||||
|
||||
|
||||
app_start(){
|
||||
# aria2c -D
|
||||
aria2c --daemon --enable-rpc --rpc-listen-all -c -D --conf-path={$SERVER_PATH}/aria2/aria2/aria2.conf
|
||||
echo "aria2 started"
|
||||
}
|
||||
app_stop(){
|
||||
echo "Stopping ..."
|
||||
arr=`ps -ef | grep "aria2" | grep -v 'grep' | grep -v '/bin/sh'|grep -v 'index.py' | awk '{print $2}'`
|
||||
echo $arr
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
kill -9 $p &>/dev/null
|
||||
done
|
||||
echo "aria2 stopped"
|
||||
}
|
||||
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
app_start
|
||||
;;
|
||||
stop)
|
||||
app_stop
|
||||
;;
|
||||
restart|reload)
|
||||
app_stop
|
||||
sleep 0.3
|
||||
app_start
|
||||
;;
|
||||
*)
|
||||
echo "Please use start or stop as first argument"
|
||||
;;
|
||||
esac
|
||||
|
||||
49
plugins/aria2/install.sh
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
SYSOS=`uname`
|
||||
|
||||
Install_aria2()
|
||||
{
|
||||
isStart=""
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/aria2
|
||||
echo '1.0' > $serverPath/aria2/version.pl
|
||||
|
||||
if [ "Darwin" == "$SYSOS" ];then
|
||||
echo 'macosx unavailable' > $install_tmp
|
||||
find_sh=`which aria2c`
|
||||
if [ "$?" != "0" ];then
|
||||
brew install aria2
|
||||
fi
|
||||
else
|
||||
find_sh=`which aria2c`
|
||||
if [ "$?" != "0" ];then
|
||||
yum install aria2 -y
|
||||
fi
|
||||
fi
|
||||
|
||||
echo 'Install complete' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_aria2()
|
||||
{
|
||||
rm -rf $serverPath/aria2
|
||||
echo "Uninstall completed" > $install_tmp
|
||||
}
|
||||
|
||||
action=$1
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_aria2
|
||||
else
|
||||
Uninstall_aria2
|
||||
fi
|
||||
92
plugins/aria2/js/aria2.js
Executable file
@@ -0,0 +1,92 @@
|
||||
function str2Obj(str){
|
||||
var data = {};
|
||||
kv = str.split('&');
|
||||
for(i in kv){
|
||||
v = kv[i].split('=');
|
||||
data[v[0]] = v[1];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function lpPost(method,args,callback, title){
|
||||
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var _title = '正在获取...';
|
||||
if (typeof(title) != 'undefined'){
|
||||
_title = title;
|
||||
}
|
||||
|
||||
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'aria2', func:method, args:_args}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function lpAsyncPost(method,args){
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
return syncPost('/plugins/run', {name:'l2tp', func:method, args:_args});
|
||||
}
|
||||
|
||||
function userList(){
|
||||
lpPost('user_list', '' ,function(data){
|
||||
var rdata = $.parseJSON(data['data']);
|
||||
|
||||
if (!rdata['status']){
|
||||
layer.msg(rdata.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
var list = rdata['data'];
|
||||
|
||||
var con = '';
|
||||
con += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
|
||||
con += '<thead><tr>';
|
||||
con += '<th>用户</th>';
|
||||
con += '<th>密码</th>';
|
||||
con += '<th>操作(<a class="btlink" onclick="addUser()">添加</a>)</th>';
|
||||
con += '</tr></thead>';
|
||||
|
||||
con += '<tbody>';
|
||||
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
con += '<tr>'+
|
||||
'<td>' + list[i]['user']+'</td>' +
|
||||
'<td>' + list[i]['pwd']+'</td>' +
|
||||
'<td><a class="btlink" onclick="modUser(\''+list[i]['user']+'\')">改密</a>|<a class="btlink" onclick="delUser(\''+list[i]['user']+'\')">删除</a></td></tr>';
|
||||
}
|
||||
|
||||
con += '</tbody>';
|
||||
con += '</table></div>';
|
||||
|
||||
$(".soft-man-con").html(con);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
function readme(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>使用时,查看对应的端口</li>';
|
||||
readme += '</ul>';
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
BIN
plugins/bbr/ico.png
Normal file
|
After Width: | Height: | Size: 498 B |
17
plugins/bbr/index.html
Executable file
@@ -0,0 +1,17 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('bbr');">服务</p>
|
||||
<p onclick="readme();">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
$.getScript( "/plugins/file?name=bbr&f=js/bbr.js", function() {
|
||||
pluginService('bbr');
|
||||
});
|
||||
</script>
|
||||
109
plugins/bbr/index.py
Executable file
@@ -0,0 +1,109 @@
|
||||
# coding: utf-8
|
||||
|
||||
import time
|
||||
import random
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'bbr'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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 status():
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "stop"
|
||||
|
||||
data = mw.execShell('sudo sysctl -n net.ipv4.tcp_congestion_control')
|
||||
r = data[0].strip()
|
||||
if r == 'bbr':
|
||||
return 'start'
|
||||
return 'stop'
|
||||
|
||||
|
||||
def start():
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
mw.execShell('echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf')
|
||||
cmd = 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
|
||||
mw.execShell(cmd)
|
||||
mw.execShell('sysctl -p')
|
||||
return '执行成功!重启系统生效'
|
||||
|
||||
|
||||
def stop():
|
||||
if not app_debug:
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
cmd1 = "sed -i '/net\.core\.default_qdisc/d' /etc/sysctl.conf"
|
||||
mw.execShell(cmd1)
|
||||
cmd2 = "sed -i '/net\.ipv4\.tcp_congestion_control/d' /etc/sysctl.conf"
|
||||
mw.execShell(cmd2)
|
||||
mw.execShell("sysctl -p")
|
||||
return '执行成功!重启系统生效'
|
||||
|
||||
|
||||
def restart():
|
||||
return '无效'
|
||||
|
||||
|
||||
def reload():
|
||||
return '无效'
|
||||
|
||||
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())
|
||||
16
plugins/bbr/info.json
Executable file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"id":4,
|
||||
"title":"BBR",
|
||||
"tip":"soft",
|
||||
"name":"bbr",
|
||||
"type":"软件",
|
||||
"ps":"[DEV][谨慎]BBR是Google提出的一种新型拥塞控制算法",
|
||||
"versions":"1.0",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/bbr",
|
||||
"path":"server/bbr",
|
||||
"author":"Google",
|
||||
"home":"https://github.com/google/bbr",
|
||||
"date":"2019-03-29",
|
||||
"pid":"5"
|
||||
}
|
||||
36
plugins/bbr/install.sh
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
Install_bbr()
|
||||
{
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
|
||||
chmod +x $curPath/scripts/bbr.sh
|
||||
sh $curPath/scripts/bbr.sh
|
||||
|
||||
mkdir -p $serverPath/bbr
|
||||
echo '1.0' > $serverPath/bbr/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_bbr()
|
||||
{
|
||||
rm -rf $serverPath/bbr
|
||||
echo "卸载完成" > $install_tmp
|
||||
}
|
||||
|
||||
action=$1
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_bbr
|
||||
else
|
||||
Uninstall_bbr
|
||||
fi
|
||||
13
plugins/bbr/js/bbr.js
Executable file
@@ -0,0 +1,13 @@
|
||||
|
||||
function readme(){
|
||||
var con = '<ul class="help-info-text c7">';
|
||||
con += '<li>一旦安装无法退回!谨慎使用</li>';
|
||||
con += '<li>只有KVM架构的VPS才能使用</li>';
|
||||
con += '<li>安装 Google BBR 需升级系统内核,而安装锐速则需降级系统内核,<br/>故两者不能同时安装。</li>';
|
||||
con += '<li>安装 Google BBR 需升级系统内核,有可能造成系统不稳定,<br/>故不建议将其应用在重要的生产环境中</li>';
|
||||
con += '<hr/>';
|
||||
con += '<li>安装升级后,可删除无用的旧内核[谨慎操作]</li>';
|
||||
con += '<li>yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))</li>';
|
||||
con += '</ul>';
|
||||
$(".soft-man-con").html(con);
|
||||
}
|
||||
389
plugins/bbr/scripts/bbr.sh
Normal file
@@ -0,0 +1,389 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Auto install latest kernel for TCP BBR
|
||||
#
|
||||
# System Required: CentOS 6+, Debian7+, Ubuntu12+
|
||||
#
|
||||
# Copyright (C) 2016-2018 Teddysun <i@teddysun.com>
|
||||
#
|
||||
# URL: https://teddysun.com/489.html
|
||||
#
|
||||
|
||||
red='\033[0;31m'
|
||||
green='\033[0;32m'
|
||||
yellow='\033[0;33m'
|
||||
plain='\033[0m'
|
||||
|
||||
cur_dir=$(pwd)
|
||||
|
||||
[[ $EUID -ne 0 ]] && echo -e "${red}Error:${plain} This script must be run as root!" && exit 1
|
||||
|
||||
[[ -d "/proc/vz" ]] && echo -e "${red}Error:${plain} Your VPS is based on OpenVZ, which is not supported." && exit 1
|
||||
|
||||
if [ -f /etc/redhat-release ]; then
|
||||
release="centos"
|
||||
elif cat /etc/issue | grep -Eqi "debian"; then
|
||||
release="debian"
|
||||
elif cat /etc/issue | grep -Eqi "ubuntu"; then
|
||||
release="ubuntu"
|
||||
elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
|
||||
release="centos"
|
||||
elif cat /proc/version | grep -Eqi "debian"; then
|
||||
release="debian"
|
||||
elif cat /proc/version | grep -Eqi "ubuntu"; then
|
||||
release="ubuntu"
|
||||
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
|
||||
release="centos"
|
||||
else
|
||||
release=""
|
||||
fi
|
||||
|
||||
is_digit(){
|
||||
local input=${1}
|
||||
if [[ "$input" =~ ^[0-9]+$ ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
is_64bit(){
|
||||
if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
get_valid_valname(){
|
||||
local val=${1}
|
||||
local new_val=$(eval echo $val | sed 's/[-.]/_/g')
|
||||
echo ${new_val}
|
||||
}
|
||||
|
||||
get_hint(){
|
||||
local val=${1}
|
||||
local new_val=$(get_valid_valname $val)
|
||||
eval echo "\$hint_${new_val}"
|
||||
}
|
||||
|
||||
#Display Memu
|
||||
display_menu(){
|
||||
local soft=${1}
|
||||
local default=${2}
|
||||
eval local arr=(\${${soft}_arr[@]})
|
||||
local default_prompt
|
||||
if [[ "$default" != "" ]]; then
|
||||
if [[ "$default" == "last" ]]; then
|
||||
default=${#arr[@]}
|
||||
fi
|
||||
default_prompt="(default ${arr[$default-1]})"
|
||||
fi
|
||||
local pick
|
||||
local hint
|
||||
local vname
|
||||
local prompt="which ${soft} you'd select ${default_prompt}: "
|
||||
|
||||
while :
|
||||
do
|
||||
echo -e "\n------------ ${soft} setting ------------\n"
|
||||
for ((i=1;i<=${#arr[@]};i++ )); do
|
||||
vname="$(get_valid_valname ${arr[$i-1]})"
|
||||
hint="$(get_hint $vname)"
|
||||
[[ "$hint" == "" ]] && hint="${arr[$i-1]}"
|
||||
echo -e "${green}${i}${plain}) $hint"
|
||||
done
|
||||
echo
|
||||
read -p "${prompt}" pick
|
||||
if [[ "$pick" == "" && "$default" != "" ]]; then
|
||||
pick=${default}
|
||||
break
|
||||
fi
|
||||
|
||||
if ! is_digit "$pick"; then
|
||||
prompt="Input error, please input a number"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ "$pick" -lt 1 || "$pick" -gt ${#arr[@]} ]]; then
|
||||
prompt="Input error, please input a number between 1 and ${#arr[@]}: "
|
||||
continue
|
||||
fi
|
||||
|
||||
break
|
||||
done
|
||||
|
||||
eval ${soft}=${arr[$pick-1]}
|
||||
vname="$(get_valid_valname ${arr[$pick-1]})"
|
||||
hint="$(get_hint $vname)"
|
||||
[[ "$hint" == "" ]] && hint="${arr[$pick-1]}"
|
||||
echo -e "\nyour selection: $hint\n"
|
||||
}
|
||||
|
||||
version_ge(){
|
||||
test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"
|
||||
}
|
||||
|
||||
get_latest_version() {
|
||||
latest_version=($(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9]./{print $2}' | cut -d/ -f1 | grep -v - | sort -V))
|
||||
|
||||
[ ${#latest_version[@]} -eq 0 ] && echo -e "${red}Error:${plain} Get latest kernel version failed." && exit 1
|
||||
|
||||
kernel_arr=()
|
||||
for i in ${latest_version[@]}; do
|
||||
if version_ge $i 4.14; then
|
||||
kernel_arr+=($i);
|
||||
fi
|
||||
done
|
||||
|
||||
display_menu kernel last
|
||||
|
||||
if [[ `getconf WORD_BIT` == "32" && `getconf LONG_BIT` == "64" ]]; then
|
||||
deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1)
|
||||
deb_kernel_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${deb_name}"
|
||||
deb_kernel_name="linux-image-${kernel}-amd64.deb"
|
||||
modules_deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-modules" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1)
|
||||
deb_kernel_modules_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${modules_deb_name}"
|
||||
deb_kernel_modules_name="linux-modules-${kernel}-amd64.deb"
|
||||
else
|
||||
deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1)
|
||||
deb_kernel_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${deb_name}"
|
||||
deb_kernel_name="linux-image-${kernel}-i386.deb"
|
||||
modules_deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-modules" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1)
|
||||
deb_kernel_modules_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${modules_deb_name}"
|
||||
deb_kernel_modules_name="linux-modules-${kernel}-i386.deb"
|
||||
fi
|
||||
|
||||
[ -z ${deb_name} ] && echo -e "${red}Error:${plain} Getting Linux kernel binary package name failed, maybe kernel build failed. Please choose other one and try again." && exit 1
|
||||
}
|
||||
|
||||
get_opsy() {
|
||||
[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return
|
||||
[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return
|
||||
[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return
|
||||
}
|
||||
|
||||
opsy=$( get_opsy )
|
||||
arch=$( uname -m )
|
||||
lbit=$( getconf LONG_BIT )
|
||||
kern=$( uname -r )
|
||||
|
||||
get_char() {
|
||||
SAVEDSTTY=`stty -g`
|
||||
stty -echo
|
||||
stty cbreak
|
||||
dd if=/dev/tty bs=1 count=1 2> /dev/null
|
||||
stty -raw
|
||||
stty echo
|
||||
stty $SAVEDSTTY
|
||||
}
|
||||
|
||||
getversion() {
|
||||
if [[ -s /etc/redhat-release ]]; then
|
||||
grep -oE "[0-9.]+" /etc/redhat-release
|
||||
else
|
||||
grep -oE "[0-9.]+" /etc/issue
|
||||
fi
|
||||
}
|
||||
|
||||
centosversion() {
|
||||
if [ x"${release}" == x"centos" ]; then
|
||||
local code=$1
|
||||
local version="$(getversion)"
|
||||
local main_ver=${version%%.*}
|
||||
if [ "$main_ver" == "$code" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_bbr_status() {
|
||||
local param=$(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}')
|
||||
if [[ x"${param}" == x"bbr" ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_kernel_version() {
|
||||
local kernel_version=$(uname -r | cut -d- -f1)
|
||||
if version_ge ${kernel_version} 4.9; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
install_elrepo() {
|
||||
|
||||
if centosversion 5; then
|
||||
echo -e "${red}Error:${plain} not supported CentOS 5."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
|
||||
|
||||
if centosversion 6; then
|
||||
rpm -Uvh https://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
|
||||
elif centosversion 7; then
|
||||
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
|
||||
fi
|
||||
|
||||
if [ ! -f /etc/yum.repos.d/elrepo.repo ]; then
|
||||
echo -e "${red}Error:${plain} Install elrepo failed, please check it."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
sysctl_config() {
|
||||
sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf
|
||||
sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf
|
||||
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
|
||||
sysctl -p >/dev/null 2>&1
|
||||
}
|
||||
|
||||
install_config() {
|
||||
if [[ x"${release}" == x"centos" ]]; then
|
||||
if centosversion 6; then
|
||||
if [ ! -f "/boot/grub/grub.conf" ]; then
|
||||
echo -e "${red}Error:${plain} /boot/grub/grub.conf not found, please check it."
|
||||
exit 1
|
||||
fi
|
||||
sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf
|
||||
elif centosversion 7; then
|
||||
if [ ! -f "/boot/grub2/grub.cfg" ]; then
|
||||
echo -e "${red}Error:${plain} /boot/grub2/grub.cfg not found, please check it."
|
||||
exit 1
|
||||
fi
|
||||
grub2-set-default 0
|
||||
fi
|
||||
elif [[ x"${release}" == x"debian" || x"${release}" == x"ubuntu" ]]; then
|
||||
/usr/sbin/update-grub
|
||||
fi
|
||||
}
|
||||
|
||||
reboot_os() {
|
||||
echo
|
||||
echo -e "${green}Info:${plain} The system needs to reboot."
|
||||
# read -p "Do you want to restart system? [y/n]" is_reboot
|
||||
# if [[ ${is_reboot} == "y" || ${is_reboot} == "Y" ]]; then
|
||||
# reboot
|
||||
# else
|
||||
# echo -e "${green}Info:${plain} Reboot has been canceled..."
|
||||
# exit 0
|
||||
# fi
|
||||
}
|
||||
|
||||
install_bbr() {
|
||||
check_bbr_status
|
||||
if [ $? -eq 0 ]; then
|
||||
echo
|
||||
echo -e "${green}Info:${plain} TCP BBR has already been installed. nothing to do..."
|
||||
exit 0
|
||||
fi
|
||||
check_kernel_version
|
||||
if [ $? -eq 0 ]; then
|
||||
echo
|
||||
echo -e "${green}Info:${plain} Your kernel version is greater than 4.9, directly setting TCP BBR..."
|
||||
sysctl_config
|
||||
echo -e "${green}Info:${plain} Setting TCP BBR completed..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ x"${release}" == x"centos" ]]; then
|
||||
install_elrepo
|
||||
[ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1
|
||||
[ x"$(yum-config-manager elrepo-kernel | grep -w enabled | awk '{print $3}')" != x"True" ] && yum-config-manager --enable elrepo-kernel > /dev/null 2>&1
|
||||
if centosversion 6; then
|
||||
if is_64bit; then
|
||||
rpm_kernel_name="kernel-ml-4.18.20-1.el6.elrepo.x86_64.rpm"
|
||||
rpm_kernel_devel_name="kernel-ml-devel-4.18.20-1.el6.elrepo.x86_64.rpm"
|
||||
rpm_kernel_url_1="http://repos.lax.quadranet.com/elrepo/archive/kernel/el6/x86_64/RPMS/"
|
||||
else
|
||||
rpm_kernel_name="kernel-ml-4.18.20-1.el6.elrepo.i686.rpm"
|
||||
rpm_kernel_devel_name="kernel-ml-devel-4.18.20-1.el6.elrepo.i686.rpm"
|
||||
rpm_kernel_url_1="http://repos.lax.quadranet.com/elrepo/archive/kernel/el6/i386/RPMS/"
|
||||
fi
|
||||
rpm_kernel_url_2="https://dl.lamp.sh/files/"
|
||||
wget -c -t3 -T60 -O ${rpm_kernel_name} ${rpm_kernel_url_1}${rpm_kernel_name}
|
||||
if [ $? -ne 0 ]; then
|
||||
rm -rf ${rpm_kernel_name}
|
||||
wget -c -t3 -T60 -O ${rpm_kernel_name} ${rpm_kernel_url_2}${rpm_kernel_name}
|
||||
fi
|
||||
wget -c -t3 -T60 -O ${rpm_kernel_devel_name} ${rpm_kernel_url_1}${rpm_kernel_devel_name}
|
||||
if [ $? -ne 0 ]; then
|
||||
rm -rf ${rpm_kernel_devel_name}
|
||||
wget -c -t3 -T60 -O ${rpm_kernel_devel_name} ${rpm_kernel_url_2}${rpm_kernel_devel_name}
|
||||
fi
|
||||
if [ -f "${rpm_kernel_name}" ]; then
|
||||
rpm -ivh ${rpm_kernel_name}
|
||||
else
|
||||
echo -e "${red}Error:${plain} Download ${rpm_kernel_name} failed, please check it."
|
||||
exit 1
|
||||
fi
|
||||
if [ -f "${rpm_kernel_devel_name}" ]; then
|
||||
rpm -ivh ${rpm_kernel_devel_name}
|
||||
else
|
||||
echo -e "${red}Error:${plain} Download ${rpm_kernel_devel_name} failed, please check it."
|
||||
exit 1
|
||||
fi
|
||||
rm -f ${rpm_kernel_name} ${rpm_kernel_devel_name}
|
||||
elif centosversion 7; then
|
||||
yum -y install kernel-ml kernel-ml-devel
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${red}Error:${plain} Install latest kernel failed, please check it."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
elif [[ x"${release}" == x"debian" || x"${release}" == x"ubuntu" ]]; then
|
||||
[[ ! -e "/usr/bin/wget" ]] && apt-get -y update && apt-get -y install wget
|
||||
echo -e "${green}Info:${plain} Getting latest kernel version..."
|
||||
get_latest_version
|
||||
if [ -n ${modules_deb_name} ]; then
|
||||
wget -c -t3 -T60 -O ${deb_kernel_modules_name} ${deb_kernel_modules_url}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${red}Error:${plain} Download ${deb_kernel_modules_name} failed, please check it."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
wget -c -t3 -T60 -O ${deb_kernel_name} ${deb_kernel_url}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${red}Error:${plain} Download ${deb_kernel_name} failed, please check it."
|
||||
exit 1
|
||||
fi
|
||||
[ -f ${deb_kernel_modules_name} ] && dpkg -i ${deb_kernel_modules_name}
|
||||
dpkg -i ${deb_kernel_name}
|
||||
rm -f ${deb_kernel_name} ${deb_kernel_modules_name}
|
||||
else
|
||||
echo -e "${red}Error:${plain} OS is not be supported, please change to CentOS/Debian/Ubuntu and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
install_config
|
||||
sysctl_config
|
||||
reboot_os
|
||||
}
|
||||
|
||||
|
||||
clear
|
||||
echo "---------- System Information ----------"
|
||||
echo " OS : $opsy"
|
||||
echo " Arch : $arch ($lbit Bit)"
|
||||
echo " Kernel : $kern"
|
||||
echo "----------------------------------------"
|
||||
echo " Auto install latest kernel for TCP BBR"
|
||||
echo
|
||||
echo " URL: https://teddysun.com/489.html"
|
||||
echo "----------------------------------------"
|
||||
echo
|
||||
# echo "Press any key to start...or Press Ctrl+C to cancel"
|
||||
# char=`get_char`
|
||||
|
||||
#install_bbr 2>&1 | tee ${cur_dir}/install_bbr.log
|
||||
install_bbr
|
||||
@@ -25,14 +25,17 @@ resetPluginWinWidth(700);
|
||||
$.getScript( "/plugins/file?name=csvn&f=js/csvn.js");
|
||||
|
||||
function csvnReadme(){
|
||||
var html = '<p>* 注意:在启动时会比较慢,需要耐心等待一会</p>';
|
||||
html += '<p>* 注意:csvn需要java环境,在安装会自动检查并安装</p>';
|
||||
html += '<p>* 注意:默认后台密码admin:admin,最好马上修改</p>';
|
||||
html += '<p>* 注意:牢记admin的密码,在后csvn的管理后台和这里不同步</p>';
|
||||
html += '<p>* 注意:在这里添加用户和csvn后台并不同步</p>';
|
||||
html += '<p>* 注意:项目管理的地址一般是正确的,但在特殊环境下,地址可能不一致</p>';
|
||||
html += '<p>* 注意:脚本内使用sudo名,需要注释(vi /etc/sudoers)[#Default requiretty]</p>';
|
||||
|
||||
$('.bt-w-main .soft-man-con').html(html);
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>注意:在启动时会比较慢,需要耐心等待一会</li>';
|
||||
readme += '<li>注意:csvn需要java环境,在安装会自动检查并安装</li>';
|
||||
readme += '<li>注意:默认后台密码admin:admin,最好马上修改</li>';
|
||||
readme += '<li>注意:牢记admin的密码,在后csvn的管理后台和这里不同步</li>';
|
||||
readme += '<li>注意:在这里添加用户和csvn后台并不同步</li>';
|
||||
readme += '<li>注意:项目管理的地址一般是正确的,但在特殊环境下,地址可能不一致</li>';
|
||||
readme += '<li>注意:脚本内使用sudo名,需要注释(vi /etc/sudoers)[#Default requiretty]</li>';
|
||||
readme += '</ul>';
|
||||
|
||||
$('.bt-w-main .soft-man-con').html(readme);
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -11,11 +11,11 @@ import sys
|
||||
import subprocess
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import public
|
||||
import mw
|
||||
|
||||
|
||||
app_debug = False
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
@@ -24,11 +24,11 @@ def getPluginName():
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return public.getPluginDir() + '/' + getPluginName()
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return public.getServerDir() + '/' + getPluginName()
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
@@ -64,7 +64,7 @@ def initDreplace():
|
||||
|
||||
|
||||
def status():
|
||||
data = public.execShell(
|
||||
data = mw.execShell(
|
||||
"ps -ef|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
@@ -74,7 +74,7 @@ def status():
|
||||
def csvnOp(method):
|
||||
|
||||
if app_debug:
|
||||
os_name = public.getOs()
|
||||
os_name = mw.getOs()
|
||||
if os_name == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
@@ -83,8 +83,8 @@ def csvnOp(method):
|
||||
#_csvn = getServerDir() + '/bin/csvn'
|
||||
#_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn_httpd = public.execShell(_initd_csvn_httpd + ' ' + method)
|
||||
# ret_csvn = public.execShell(_initd_csvn + ' ' + method)
|
||||
ret_csvn_httpd = mw.execShell(_initd_csvn_httpd + ' ' + method)
|
||||
# ret_csvn = mw.execShell(_initd_csvn + ' ' + method)
|
||||
subprocess.Popen(_initd_csvn + ' ' + method,
|
||||
stdout=subprocess.PIPE, shell=True)
|
||||
if ret_csvn_httpd[1] == '':
|
||||
@@ -110,7 +110,7 @@ def reload():
|
||||
|
||||
def initdStatus():
|
||||
if not app_debug:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_initd_csvn = '/etc/init.d/csvn'
|
||||
@@ -124,14 +124,14 @@ def initdStatus():
|
||||
def initdInstall():
|
||||
import shutil
|
||||
if not app_debug:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_csvn = getServerDir() + '/bin/csvn'
|
||||
_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn = public.execShell(_csvn + ' install')
|
||||
ret_csvn_httpd = public.execShell(_csvn_httpd + ' install')
|
||||
ret_csvn = mw.execShell(_csvn + ' install')
|
||||
ret_csvn_httpd = mw.execShell(_csvn_httpd + ' install')
|
||||
if ret_csvn[1] == '' and ret_csvn_httpd[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
@@ -139,14 +139,14 @@ def initdInstall():
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
_csvn = getServerDir() + '/bin/csvn'
|
||||
_csvn_httpd = getServerDir() + '/bin/csvn-httpd'
|
||||
|
||||
ret_csvn = public.execShell(_csvn + ' remove')
|
||||
ret_csvn_httpd = public.execShell(_csvn_httpd + ' remove')
|
||||
ret_csvn = mw.execShell(_csvn + ' remove')
|
||||
ret_csvn_httpd = mw.execShell(_csvn_httpd + ' remove')
|
||||
return 'ok'
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@ def csvnEdit():
|
||||
data['svn_access_file'] = getServerDir() + '/data/conf/svn_access_file'
|
||||
data['commit_tpl'] = getPluginDir() + '/hook/commit.tpl'
|
||||
data['post_commit_tpl'] = getPluginDir() + '/hook/post-commit.tpl'
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def userAdd():
|
||||
@@ -170,7 +170,7 @@ def userAdd():
|
||||
svn_auth_file = getServerDir() + "/data/conf/svn_auth_file"
|
||||
cmd = htpasswd + ' -b ' + svn_auth_file + ' ' + \
|
||||
args['username'] + ' ' + args['password']
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
# print data
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
@@ -185,7 +185,7 @@ def userDel():
|
||||
htpasswd = getServerDir() + "/bin/htpasswd"
|
||||
svn_auth_file = getServerDir() + "/data/conf/svn_auth_file"
|
||||
cmd = htpasswd + ' -D ' + svn_auth_file + ' ' + args['username']
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
@@ -194,8 +194,8 @@ def userDel():
|
||||
def getAllUser(search=''):
|
||||
svn_auth_file = getServerDir() + '/data/conf/svn_auth_file'
|
||||
if not os.path.exists(svn_auth_file):
|
||||
return public.getJson([])
|
||||
auth = public.readFile(svn_auth_file)
|
||||
return mw.getJson([])
|
||||
auth = mw.readFile(svn_auth_file)
|
||||
auth = auth.strip()
|
||||
auth_list = auth.split("\n")
|
||||
|
||||
@@ -232,14 +232,14 @@ def userList():
|
||||
page_info = {'count': ulist_sum, 'p': page,
|
||||
'row': 10, 'tojs': 'csvnUserList'}
|
||||
data = {}
|
||||
data['list'] = public.getPage(page_info)
|
||||
data['list'] = mw.getPage(page_info)
|
||||
data['page'] = page
|
||||
data['page_size'] = page_size
|
||||
data['page_count'] = int(math.ceil(ulist_sum / page_size))
|
||||
start = (page - 1) * page_size
|
||||
|
||||
data['data'] = ulist[start:start + page_size]
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def projectAdd():
|
||||
@@ -249,9 +249,9 @@ def projectAdd():
|
||||
path = getServerDir() + '/bin/svnadmin'
|
||||
dest = getServerDir() + '/data/repositories/' + args['name']
|
||||
cmd = path + ' create ' + dest
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
if data[1] == '':
|
||||
public.execShell('chown -R csvn:csvn ' + dest)
|
||||
mw.execShell('chown -R csvn:csvn ' + dest)
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
@@ -263,7 +263,7 @@ def projectDel():
|
||||
|
||||
dest = getServerDir() + '/data/repositories/' + args['name']
|
||||
cmd = 'rm -rf ' + dest
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
@@ -273,7 +273,7 @@ def getHttpPort():
|
||||
http_main_conf = getServerDir() + '/data/conf/csvn_main_httpd.conf'
|
||||
try:
|
||||
if os.path.exists(http_main_conf):
|
||||
content = public.readFile(http_main_conf)
|
||||
content = mw.readFile(http_main_conf)
|
||||
return re.search('Listen\s(\d+)', content).groups()[0]
|
||||
except Exception as e:
|
||||
pass # print e
|
||||
@@ -284,7 +284,7 @@ def getCsvnPort():
|
||||
http_main_conf = getServerDir() + '/data/conf/csvn-wrapper.conf'
|
||||
try:
|
||||
if os.path.exists(http_main_conf):
|
||||
content = public.readFile(http_main_conf)
|
||||
content = mw.readFile(http_main_conf)
|
||||
return re.search('wrapper.java.additional.3=-Djetty.port=(\d+)', content).groups()[0]
|
||||
except Exception as e:
|
||||
pass # print e
|
||||
@@ -347,18 +347,18 @@ def projectList():
|
||||
|
||||
data = {}
|
||||
data['data'] = ret_data
|
||||
data['list'] = public.getPage(
|
||||
data['list'] = mw.getPage(
|
||||
{'count': dlist_sum, 'p': page, 'row': 10, 'tojs': 'csvnProjectList'})
|
||||
data['ip'] = public.getLocalIp()
|
||||
data['ip'] = mw.getLocalIp()
|
||||
data['port'] = getHttpPort()
|
||||
data['csvn_port'] = getCsvnPort()
|
||||
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def getAllAclList():
|
||||
svn_access_file = getServerDir() + '/data/conf/svn_access_file'
|
||||
aData = public.readFile(svn_access_file)
|
||||
aData = mw.readFile(svn_access_file)
|
||||
aData = re.sub('#.*', '', aData)
|
||||
aData = aData.strip().split('[')[1:]
|
||||
allAcl = {}
|
||||
@@ -394,7 +394,7 @@ def makeAclFile(content):
|
||||
tmp += v[iv]['user'] + ' = ' + v[iv]['acl'] + "\n"
|
||||
tmp += "\n"
|
||||
# svn_tmp_path = getServerDir() + '/data/conf/svn_access_file.log'
|
||||
return public.writeFile(svn_access_file, tmp)
|
||||
return mw.writeFile(svn_access_file, tmp)
|
||||
|
||||
|
||||
def projectAclList():
|
||||
@@ -405,7 +405,7 @@ def projectAclList():
|
||||
acl = getAllAclList()
|
||||
|
||||
if name in acl:
|
||||
return public.getJson(acl[name])
|
||||
return mw.getJson(acl[name])
|
||||
else:
|
||||
return 'fail'
|
||||
|
||||
@@ -543,19 +543,19 @@ def getCsvnPwd(user):
|
||||
pwd_file = 'data/csvn_sync.pl'
|
||||
|
||||
if os.path.exists(pwd_file):
|
||||
return public.readFile(pwd_file).strip()
|
||||
return mw.readFile(pwd_file).strip()
|
||||
|
||||
import time
|
||||
cur_time = time.time()
|
||||
rand_pwd = public.md5(str(cur_time))
|
||||
rand_pwd = mw.md5(str(cur_time))
|
||||
pwd = user + rand_pwd[:5]
|
||||
|
||||
htpasswd = getServerDir() + "/bin/htpasswd"
|
||||
svn_auth_file = getServerDir() + "/data/conf/svn_auth_file"
|
||||
cmd = htpasswd + ' -b ' + svn_auth_file + ' ' + user + ' ' + pwd
|
||||
data = public.execShell(cmd)
|
||||
data = mw.execShell(cmd)
|
||||
|
||||
public.writeFile(pwd_file, pwd)
|
||||
mw.writeFile(pwd_file, pwd)
|
||||
return pwd
|
||||
|
||||
|
||||
@@ -570,21 +570,21 @@ def projectScriptLoad():
|
||||
args['pname'] + '/hooks'
|
||||
post_commit_file = hook_path + '/post-commit'
|
||||
|
||||
pct_content = public.readFile(post_commit_tpl)
|
||||
public.writeFile(post_commit_file, pct_content)
|
||||
public.execShell('chmod 777 ' + post_commit_file)
|
||||
pct_content = mw.readFile(post_commit_tpl)
|
||||
mw.writeFile(post_commit_file, pct_content)
|
||||
mw.execShell('chmod 777 ' + post_commit_file)
|
||||
|
||||
commit_tpl = getPluginDir() + '/hook/commit.tpl'
|
||||
commit_file = hook_path + '/commit'
|
||||
|
||||
ct_content = public.readFile(commit_tpl)
|
||||
ct_content = ct_content.replace('{$PROJECT_DIR}', public.getRootDir())
|
||||
ct_content = mw.readFile(commit_tpl)
|
||||
ct_content = ct_content.replace('{$PROJECT_DIR}', mw.getRootDir())
|
||||
ct_content = ct_content.replace('{$PORT}', getHttpPort())
|
||||
ct_content = ct_content.replace('{$CSVN_USER}', getCsvnUser())
|
||||
ct_content = ct_content.replace('{$CSVN_PWD}', getCsvnPwd(getCsvnUser()))
|
||||
|
||||
public.writeFile(commit_file, ct_content)
|
||||
public.execShell('chmod 777 ' + commit_file)
|
||||
mw.writeFile(commit_file, ct_content)
|
||||
mw.execShell('chmod 777 ' + commit_file)
|
||||
|
||||
return 'ok'
|
||||
|
||||
@@ -596,11 +596,11 @@ def projectScriptUnload():
|
||||
|
||||
post_commit_file = getServerDir() + '/data/repositories/' + '/' + \
|
||||
args['pname'] + '/hooks/post-commit'
|
||||
public.execShell('rm -f ' + post_commit_file)
|
||||
mw.execShell('rm -f ' + post_commit_file)
|
||||
|
||||
commit_file = getServerDir() + '/data/repositories/' + '/' + \
|
||||
args['pname'] + '/hooks/commit'
|
||||
public.execShell('rm -f ' + commit_file)
|
||||
mw.execShell('rm -f ' + commit_file)
|
||||
return 'ok'
|
||||
|
||||
|
||||
@@ -619,7 +619,7 @@ def projectScriptEdit():
|
||||
data['status'] = False
|
||||
data['msg'] = 'file does not exist'
|
||||
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def projectScriptDebug():
|
||||
@@ -637,7 +637,7 @@ def projectScriptDebug():
|
||||
data['status'] = False
|
||||
data['msg'] = 'file does not exist'
|
||||
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def getTotalStatistics():
|
||||
@@ -647,63 +647,63 @@ def getTotalStatistics():
|
||||
svn_path = getServerDir() + '/data/repositories'
|
||||
data['status'] = True
|
||||
data['count'] = len(os.listdir(svn_path))
|
||||
data['ver'] = public.readFile(getServerDir() + '/version.pl').strip()
|
||||
return public.returnJson(True, 'ok', data)
|
||||
data['ver'] = mw.readFile(getServerDir() + '/version.pl').strip()
|
||||
return mw.returnJson(True, 'ok', data)
|
||||
else:
|
||||
data['status'] = False
|
||||
data['count'] = 0
|
||||
return public.returnJson(False, 'fail', data)
|
||||
return mw.returnJson(False, 'fail', data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
print(status())
|
||||
elif func == 'start':
|
||||
print start()
|
||||
print(start())
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
print(stop())
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
print(restart())
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
print(reload())
|
||||
elif func == 'initd_status':
|
||||
print initdStatus()
|
||||
print(initdStatus())
|
||||
elif func == 'initd_install':
|
||||
print initdInstall()
|
||||
print(initdInstall())
|
||||
elif func == 'initd_uninstall':
|
||||
print initdUinstall()
|
||||
print(initdUinstall())
|
||||
elif func == 'csvn_edit':
|
||||
print csvnEdit()
|
||||
print(csvnEdit())
|
||||
elif func == 'user_list':
|
||||
print userList()
|
||||
print(userList())
|
||||
elif func == 'user_add':
|
||||
print userAdd()
|
||||
print(userAdd())
|
||||
elif func == 'user_del':
|
||||
print userDel()
|
||||
print(userDel())
|
||||
elif func == 'project_list':
|
||||
print projectList()
|
||||
print(projectList())
|
||||
elif func == 'project_del':
|
||||
print projectDel()
|
||||
print(projectDel())
|
||||
elif func == 'project_add':
|
||||
print projectAdd()
|
||||
print(projectAdd())
|
||||
elif func == 'project_acl_list':
|
||||
print projectAclList()
|
||||
print(projectAclList())
|
||||
elif func == 'project_acl_add':
|
||||
print projectAclAdd()
|
||||
print(projectAclAdd())
|
||||
elif func == 'project_acl_del':
|
||||
print projectAclDel()
|
||||
print(projectAclDel())
|
||||
elif func == 'project_acl_set':
|
||||
print projectAclSet()
|
||||
print(projectAclSet())
|
||||
elif func == 'project_script_load':
|
||||
print projectScriptLoad()
|
||||
print(projectScriptLoad())
|
||||
elif func == 'project_script_unload':
|
||||
print projectScriptUnload()
|
||||
print(projectScriptUnload())
|
||||
elif func == 'project_script_edit':
|
||||
print projectScriptEdit()
|
||||
print(projectScriptEdit())
|
||||
elif func == 'project_script_debug':
|
||||
print projectScriptDebug()
|
||||
print(projectScriptDebug())
|
||||
elif func == 'get_total_statistics':
|
||||
print getTotalStatistics()
|
||||
print(getTotalStatistics())
|
||||
else:
|
||||
print 'fail'
|
||||
print('fail')
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"updates":"5.1.4",
|
||||
"tip": "soft",
|
||||
"checks": "server/csvn",
|
||||
"path":"server/csvn",
|
||||
"author": "midoks",
|
||||
"date": "2017-04-01",
|
||||
"home": "https://www.collab.net",
|
||||
|
||||
@@ -7,7 +7,7 @@ rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/bt_install.pl
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
|
||||
CSVN_SOURCE='https://github.com/midoks/mdserver-web/releases/download/init/CollabNetSubversionEdge-5.1.4_linux-x86_64.tar.xz'
|
||||
|
||||
@@ -8,7 +8,7 @@ import re
|
||||
import sys
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import public
|
||||
import mw
|
||||
|
||||
|
||||
def getPluginName():
|
||||
@@ -16,11 +16,11 @@ def getPluginName():
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return public.getPluginDir() + '/' + getPluginName()
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return public.getServerDir() + '/' + getPluginName()
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
@@ -51,7 +51,7 @@ def status():
|
||||
|
||||
|
||||
def getAllProjectList(search):
|
||||
path = public.getWwwDir()
|
||||
path = mw.getWwwDir()
|
||||
dlist = []
|
||||
if os.path.exists(path):
|
||||
for filename in os.listdir(path):
|
||||
@@ -92,7 +92,7 @@ def projectListEdit():
|
||||
|
||||
file = getServerDir() + '/' + args['name'] + '.json'
|
||||
if not os.path.exists(file):
|
||||
public.execShell('touch ' + file)
|
||||
mw.execShell('touch ' + file)
|
||||
return file
|
||||
|
||||
|
||||
@@ -103,17 +103,17 @@ def projectListDel():
|
||||
|
||||
file = getServerDir() + '/' + args['name'] + '.json'
|
||||
if os.path.exists(file):
|
||||
content = public.readFile(file)
|
||||
content = mw.readFile(file)
|
||||
contentObj = json.loads(content)
|
||||
asyncUser = contentObj['client_email']
|
||||
cmd = getServerDir() + '/google-cloud-sdk/bin/'
|
||||
public.execShell(cmd + 'gcloud auth revoke ' + asyncUser)
|
||||
public.execShell('rm -rf ' + file)
|
||||
mw.execShell(cmd + 'gcloud auth revoke ' + asyncUser)
|
||||
mw.execShell('rm -rf ' + file)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def checkUserExist(cmd, user):
|
||||
data = public.execShell(cmd + 'gcloud auth list | grep ' + user)
|
||||
data = mw.execShell(cmd + 'gcloud auth list | grep ' + user)
|
||||
if data[0] == '':
|
||||
return False
|
||||
return True
|
||||
@@ -129,14 +129,14 @@ def projectListAsync():
|
||||
if not os.path.exists(file):
|
||||
return 'not configured file!'
|
||||
|
||||
content = public.readFile(file)
|
||||
content = mw.readFile(file)
|
||||
contentObj = json.loads(content)
|
||||
asyncUser = contentObj['client_email']
|
||||
cmd = getServerDir() + '/google-cloud-sdk/bin/'
|
||||
projectDir = public.getWwwDir() + '/' + args['name']
|
||||
projectDir = mw.getWwwDir() + '/' + args['name']
|
||||
|
||||
if not checkUserExist(cmd, asyncUser):
|
||||
public.execShell(
|
||||
mw.execShell(
|
||||
cmd + 'gcloud auth activate-service-account --key-file ' + file)
|
||||
|
||||
pName = contentObj['project_id']
|
||||
@@ -147,7 +147,7 @@ def projectListAsync():
|
||||
|
||||
taskAdd = (None, 'gae[async]',
|
||||
'execshell', '0', time.strftime('%Y-%m-%d %H:%M:%S'), asyncCmd)
|
||||
public.M('tasks').add('id,name,type,status,addtime, execstr', taskAdd)
|
||||
mw.M('tasks').add('id,name,type,status,addtime, execstr', taskAdd)
|
||||
return 'ok'
|
||||
|
||||
|
||||
@@ -160,12 +160,12 @@ def projectListCmd():
|
||||
if not os.path.exists(file):
|
||||
return 'not configured file!'
|
||||
|
||||
content = public.readFile(file)
|
||||
content = mw.readFile(file)
|
||||
contentObj = json.loads(content)
|
||||
asyncUser = contentObj['client_email']
|
||||
cmd = getServerDir() + '/google-cloud-sdk/bin/'
|
||||
pName = contentObj['project_id']
|
||||
projectDir = public.getWwwDir() + '/' + args['name']
|
||||
projectDir = mw.getWwwDir() + '/' + args['name']
|
||||
|
||||
setUserCmd = 'sudo ' + cmd + 'gcloud config set account ' + asyncUser
|
||||
setUserCmd += ' && sudo ' + cmd + 'gcloud config set project ' + pName
|
||||
@@ -183,7 +183,7 @@ def projectListUrl():
|
||||
if not os.path.exists(file):
|
||||
return 'not configured file!'
|
||||
|
||||
content = public.readFile(file)
|
||||
content = mw.readFile(file)
|
||||
contentObj = json.loads(content)
|
||||
asyncUser = contentObj['client_email']
|
||||
plist = asyncUser.split('@')
|
||||
@@ -216,9 +216,9 @@ def projectList():
|
||||
|
||||
data = {}
|
||||
data['data'] = ret_data
|
||||
data['list'] = public.getPage(
|
||||
data['list'] = mw.getPage(
|
||||
{'count': dlist_sum, 'p': page, 'row': 10, 'tojs': 'projectList'})
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"title":"GAE",
|
||||
"tip":"soft",
|
||||
"name":"gae",
|
||||
"ps":"GAE(Google App Engine)。它是Google管理的数据中心中用于WEB应用程序的开发和托管的平台",
|
||||
"ps":"GAE是Google用于WEB应用程序的开发和托管的平台",
|
||||
"versions": "0.1",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/gae",
|
||||
|
||||
@@ -7,7 +7,7 @@ rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/bt_install.pl
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
Install_gae()
|
||||
{
|
||||
|
||||
BIN
plugins/go-fastdfs-web/ico.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
21
plugins/go-fastdfs-web/index.html
Executable file
@@ -0,0 +1,21 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('go-fastdfs-web');">服务</p>
|
||||
<p onclick="pluginInitD('go-fastdfs-web');">自启动</p>
|
||||
<p onclick="pluginConfig('go-fastdfs-web');">配置</p>
|
||||
<p onclick="pluginLogs('go-fastdfs-web','','run_log');">运行日志</p>
|
||||
<p onclick="pRead()">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
resetPluginWinWidth(700);
|
||||
$.getScript( "/plugins/file?name=go-fastdfs-web&f=js/fastdfs.js", function() {
|
||||
pluginService('go-fastdfs');
|
||||
});
|
||||
</script>
|
||||
196
plugins/go-fastdfs-web/index.py
Executable file
@@ -0,0 +1,196 @@
|
||||
# coding: utf-8
|
||||
|
||||
import time
|
||||
import random
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
import threading
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'go-fastdfs-web'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDTpl():
|
||||
return getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
|
||||
|
||||
|
||||
def getLog():
|
||||
return getServerDir() + "/log/fileserver.log"
|
||||
|
||||
|
||||
def gfBreakpointLog():
|
||||
return getServerDir() + "/log/tusd.log"
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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():
|
||||
pn = getPluginName()
|
||||
data = mw.execShell(
|
||||
"ps -ef|grep " + pn + " | grep -v grep | grep -v python | awk '{print $2}'")
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def initDreplace():
|
||||
|
||||
file_tpl = getInitDTpl()
|
||||
service_path = os.path.dirname(os.getcwd())
|
||||
|
||||
initD_path = getServerDir() + '/init.d'
|
||||
if not os.path.exists(initD_path):
|
||||
os.mkdir(initD_path)
|
||||
|
||||
file_bin = initD_path + '/' + getPluginName()
|
||||
if not os.path.exists(file_bin):
|
||||
content = mw.readFile(file_tpl)
|
||||
content = content.replace('{$SERVER_PATH}', service_path)
|
||||
mw.writeFile(file_bin, content)
|
||||
mw.execShell('chmod +x ' + file_bin)
|
||||
|
||||
return file_bin
|
||||
|
||||
|
||||
def start():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' start')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def stop():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' stop')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def restart():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' restart')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def reload():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' reload')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdStatus():
|
||||
initd_bin = getInitDFile()
|
||||
if os.path.exists(initd_bin):
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdInstall():
|
||||
import shutil
|
||||
|
||||
source_bin = initDreplace()
|
||||
initd_bin = getInitDFile()
|
||||
shutil.copyfile(source_bin, initd_bin)
|
||||
mw.execShell('chmod +x ' + initd_bin)
|
||||
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --add ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --del ' + getPluginName())
|
||||
|
||||
initd_bin = getInitDFile()
|
||||
|
||||
if os.path.exists(initd_bin):
|
||||
os.remove(initd_bin)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def gfConf():
|
||||
return getServerDir() + "/config/application-prod.properties"
|
||||
|
||||
|
||||
def getLog():
|
||||
return getServerDir() + "/logs/go-fastdfs-web.log"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
elif func == 'start':
|
||||
print start()
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
elif func == 'initd_status':
|
||||
print initdStatus()
|
||||
elif func == 'initd_install':
|
||||
print initdInstall()
|
||||
elif func == 'initd_uninstall':
|
||||
print initdUinstall()
|
||||
elif func == 'run_log':
|
||||
print getLog()
|
||||
elif func == 'conf':
|
||||
print gfConf()
|
||||
else:
|
||||
print 'error'
|
||||
16
plugins/go-fastdfs-web/info.json
Executable file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"id":10,
|
||||
"title":"go-fastdfs-web",
|
||||
"tip":"soft",
|
||||
"name":"go-fastdfs-web",
|
||||
"type":"软件",
|
||||
"ps":"Go-Fastdfs web管理平台",
|
||||
"versions":"1.1.2",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/go-fastdfs-web",
|
||||
"path": "server/go-fastdfs-web",
|
||||
"author":"midoks",
|
||||
"home":"https://github.com/perfree/go-fastdfs-web",
|
||||
"date":"2019-08-07",
|
||||
"pid":"2"
|
||||
}
|
||||
91
plugins/go-fastdfs-web/init.d/go-fastdfs-web.tpl
Normal file
@@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
# chkconfig: 2345 55 25
|
||||
# description: go-fastdfs-web Cloud Service
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: bt
|
||||
# Required-Start: $all
|
||||
# Required-Stop: $all
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: starts go-fastdfs-web
|
||||
# Description: starts the go-fastdfs-web
|
||||
### END INIT INFO
|
||||
|
||||
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
SpringBoot=go-fastdfs-web.jar
|
||||
gf_path={$SERVER_PATH}/go-fastdfs-web/$SpringBoot
|
||||
|
||||
if [ "$1" = "" ];
|
||||
then
|
||||
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$SpringBoot" = "" ];
|
||||
then
|
||||
echo -e "\033[0;31m 未输入应用名 \033[0m"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function start()
|
||||
{
|
||||
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
|
||||
if [ $count != 0 ];then
|
||||
echo "$SpringBoot is running..."
|
||||
else
|
||||
echo "Start $SpringBoot success..."
|
||||
cd $gf_path
|
||||
nohup java -jar $SpringBoot > /dev/null 2>&1 &
|
||||
fi
|
||||
}
|
||||
|
||||
function stop()
|
||||
{
|
||||
echo "Stop $SpringBoot"
|
||||
boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
|
||||
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
|
||||
|
||||
if [ $count != 0 ];then
|
||||
kill $boot_id
|
||||
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
|
||||
|
||||
boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
|
||||
kill -9 $boot_id
|
||||
fi
|
||||
}
|
||||
|
||||
function restart()
|
||||
{
|
||||
stop
|
||||
sleep 2
|
||||
start
|
||||
}
|
||||
|
||||
function status()
|
||||
{
|
||||
count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
|
||||
if [ $count != 0 ];then
|
||||
echo "$SpringBoot is running..."
|
||||
else
|
||||
echo "$SpringBoot is not running..."
|
||||
fi
|
||||
}
|
||||
|
||||
case $1 in
|
||||
start)
|
||||
start;;
|
||||
stop)
|
||||
stop;;
|
||||
restart)
|
||||
restart;;
|
||||
status)
|
||||
status;;
|
||||
*)
|
||||
|
||||
echo -e "\033[0;31m Usage: \033[0m \033[0;34m sh $0 {start|stop|restart|status} {SpringBootJarName} \033[0m
|
||||
\033[0;31m Example: \033[0m
|
||||
\033[0;33m sh $0 start esmart-test.jar \033[0m"
|
||||
esac
|
||||
54
plugins/go-fastdfs-web/install.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
sysName=`uname`
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
action=$1
|
||||
version=$2
|
||||
Install_gf()
|
||||
{
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/go-fastdfs-web
|
||||
FF_DIR=${serverPath}/go-fastdfs-web
|
||||
cd $FF_DIR
|
||||
|
||||
if [ $sysName == 'Darwin' ]; then
|
||||
FF_SS_DIR=${serverPath}/source/go-fastdfs-web
|
||||
mkdir -p $FF_SS_DIR
|
||||
if [ ! -f $FF_SS_DIR/go-fastdfs-web-1.1.2.tar.gz ]; then
|
||||
wget -O $FF_SS_DIR/go-fastdfs-web-1.1.2.tar.gz https://github.com/perfree/go-fastdfs-web/releases/download/1.1.2/go-fastdfs-web-1.1.2.tar.gz
|
||||
fi
|
||||
|
||||
cd $FF_SS_DIR
|
||||
if [ ! -d $FF_SS_DIR/go-fastdfs-web ]; then
|
||||
tar -zxvf $FF_SS_DIR/go-fastdfs-web-1.1.2.tar.gz
|
||||
fi
|
||||
|
||||
if [ ! -d $FF_DIR/config ];then
|
||||
cp -rf $FF_SS_DIR/go-fastdfs-web/* $FF_DIR/
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "$version" > $FF_DIR/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_gf()
|
||||
{
|
||||
rm -rf $serverPath/go-fastdfs-web
|
||||
echo "卸载完成" > $install_tmp
|
||||
}
|
||||
|
||||
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_gf $version
|
||||
else
|
||||
Uninstall_gf $version
|
||||
fi
|
||||
47
plugins/go-fastdfs-web/js/fastdfs.js
Executable file
@@ -0,0 +1,47 @@
|
||||
function str2Obj(str){
|
||||
var data = {};
|
||||
kv = str.split('&');
|
||||
for(i in kv){
|
||||
v = kv[i].split('=');
|
||||
data[v[0]] = v[1];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function pPost(method,args,callback, title){
|
||||
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var _title = '正在获取...';
|
||||
if (typeof(title) != 'undefined'){
|
||||
_title = title;
|
||||
}
|
||||
|
||||
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'go-fastdfs-web', func:method, args:_args}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
|
||||
|
||||
function pRead(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>根据配置查看,开启相应防火墙端口</li>';
|
||||
readme += '</ul>';
|
||||
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
BIN
plugins/go-fastdfs/ico.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
23
plugins/go-fastdfs/index.html
Executable file
@@ -0,0 +1,23 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('go-fastdfs');">服务</p>
|
||||
<p onclick="pluginInitD('go-fastdfs');">自启动</p>
|
||||
<p onclick="pluginConfig('go-fastdfs');">配置文件</p>
|
||||
<p onclick="gfConfigSet()">重要配置查看</p>
|
||||
<p onclick="pluginLogs('go-fastdfs','','run_log');">运行日志</p>
|
||||
<p onclick="pluginLogs('go-fastdfs','','breakpoint_log');">断点日志</p>
|
||||
<p onclick="pRead()">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
resetPluginWinWidth(700);
|
||||
$.getScript( "/plugins/file?name=go-fastdfs&f=js/fastdfs.js", function() {
|
||||
pluginService('go-fastdfs');
|
||||
});
|
||||
</script>
|
||||
224
plugins/go-fastdfs/index.py
Executable file
@@ -0,0 +1,224 @@
|
||||
# coding: utf-8
|
||||
|
||||
import time
|
||||
import random
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
import threading
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'go-fastdfs'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDTpl():
|
||||
return getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
|
||||
|
||||
|
||||
def getLog():
|
||||
return getServerDir() + "/log/fileserver.log"
|
||||
|
||||
|
||||
def gfBreakpointLog():
|
||||
return getServerDir() + "/log/tusd.log"
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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():
|
||||
pn = getPluginName()
|
||||
data = mw.execShell(
|
||||
"ps -ef|grep " + pn + " |grep -v grep |grep -v .jar | grep -v python | awk '{print $2}'")
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def initDreplace():
|
||||
|
||||
file_tpl = getInitDTpl()
|
||||
service_path = os.path.dirname(os.getcwd())
|
||||
|
||||
initD_path = getServerDir() + '/init.d'
|
||||
if not os.path.exists(initD_path):
|
||||
os.mkdir(initD_path)
|
||||
|
||||
file_bin = initD_path + '/' + getPluginName()
|
||||
if not os.path.exists(file_bin):
|
||||
content = mw.readFile(file_tpl)
|
||||
content = content.replace('{$SERVER_PATH}', service_path)
|
||||
mw.writeFile(file_bin, content)
|
||||
mw.execShell('chmod +x ' + file_bin)
|
||||
|
||||
return file_bin
|
||||
|
||||
|
||||
def start():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' start')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def stop():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' stop')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def restart():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' restart')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def reload():
|
||||
file = initDreplace()
|
||||
data = mw.execShell(file + ' reload')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdStatus():
|
||||
initd_bin = getInitDFile()
|
||||
if os.path.exists(initd_bin):
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdInstall():
|
||||
import shutil
|
||||
|
||||
source_bin = initDreplace()
|
||||
initd_bin = getInitDFile()
|
||||
shutil.copyfile(source_bin, initd_bin)
|
||||
mw.execShell('chmod +x ' + initd_bin)
|
||||
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --add ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --del ' + getPluginName())
|
||||
|
||||
initd_bin = getInitDFile()
|
||||
|
||||
if os.path.exists(initd_bin):
|
||||
os.remove(initd_bin)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def gfConf():
|
||||
return getServerDir() + "/conf/cfg.json"
|
||||
|
||||
|
||||
def gfConfSet():
|
||||
gets = [
|
||||
{'name': 'addr', 'type': -1, 'ps': '绑定端口'},
|
||||
{'name': 'peer_id', 'type': -1, 'ps': '集群内唯一,请使用0-9的单字符'},
|
||||
{'name': 'host', 'type': -1, 'ps': '本主机地址'},
|
||||
{'name': 'group', 'type': -1, 'ps': '组号'},
|
||||
{'name': 'support_group_manage', 'type': 0, 'ps': '是否支持按组(集群)管理'},
|
||||
{'name': 'enable_merge_small_file', 'type': 0, 'ps': '是否合并小文件'},
|
||||
{'name': 'refresh_interval', 'type': 1, 'ps': '重试同步失败文件的时间'},
|
||||
{'name': 'rename_file', 'type': 0, 'ps': '是否自动重命名'},
|
||||
{'name': 'enable_web_upload', 'type': 0, 'ps': '是否支持web上传,方便调试'},
|
||||
{'name': 'enable_custom_path', 'type': 0, 'ps': '是否支持非日期路径'},
|
||||
{'name': 'enable_migrate', 'type': 0, 'ps': '是否启用迁移'},
|
||||
{'name': 'enable_cross_origin', 'type': 0, 'ps': '是否开启跨站访问'},
|
||||
{'name': 'enable_tus', 'type': 0, 'ps': '是否开启断点续传'}
|
||||
]
|
||||
file = mw.readFile(gfConf())
|
||||
data = json.loads(file)
|
||||
|
||||
result = []
|
||||
for g in gets:
|
||||
if g['name'] in data:
|
||||
g['value'] = data[g['name']]
|
||||
result.append(g)
|
||||
|
||||
return mw.getJson(result)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
elif func == 'start':
|
||||
print start()
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
elif func == 'initd_status':
|
||||
print initdStatus()
|
||||
elif func == 'initd_install':
|
||||
print initdInstall()
|
||||
elif func == 'initd_uninstall':
|
||||
print initdUinstall()
|
||||
elif func == 'run_log':
|
||||
print getLog()
|
||||
elif func == 'breakpoint_log':
|
||||
print gfBreakpointLog()
|
||||
elif func == 'conf':
|
||||
print gfConf()
|
||||
elif func == 'gf_conf_set':
|
||||
print gfConfSet()
|
||||
else:
|
||||
print 'error'
|
||||
16
plugins/go-fastdfs/info.json
Executable file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"id":10,
|
||||
"title":"go-fastdfs",
|
||||
"tip":"soft",
|
||||
"name":"go-fastdfs",
|
||||
"type":"软件",
|
||||
"ps":"一个基于http协议的分布式文件系统",
|
||||
"versions":"1.3.1",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/go-fastdfs",
|
||||
"path": "server/go-fastdfs",
|
||||
"author":"midoks",
|
||||
"home":"https://github.com/sjqzhang/go-fastdfs",
|
||||
"date":"2019-08-02",
|
||||
"pid":"2"
|
||||
}
|
||||
72
plugins/go-fastdfs/init.d/go-fastdfs.tpl
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/bin/bash
|
||||
# chkconfig: 2345 55 25
|
||||
# description: go-fastdfs Cloud Service
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: bt
|
||||
# Required-Start: $all
|
||||
# Required-Stop: $all
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: starts go-fastdfs
|
||||
# Description: starts the go-fastdfs
|
||||
### END INIT INFO
|
||||
|
||||
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
|
||||
gf_path={$SERVER_PATH}/go-fastdfs
|
||||
|
||||
gf_start(){
|
||||
isStart=`ps -ef| grep -v python|grep -v bash |grep go-fastdfs |grep -v .jar | grep -v grep|awk '{print $2}'`
|
||||
if [ "$isStart" == '' ];then
|
||||
echo -e "Starting go-fastdfs... \c"
|
||||
cd $gf_path
|
||||
nohup ./go-fastdfs > /dev/null 2>&1 &
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
else
|
||||
echo -e "Starting go-fastdfs(pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
gf_stop()
|
||||
{
|
||||
echo -e "Stopping go-fastdfs... \c"
|
||||
|
||||
pids=$(ps -ef| grep -v python |grep -v bash |grep go-fastdfs |grep -v .jar | grep -v grep | awk '{print $2}')
|
||||
arr=($pids)
|
||||
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
kill -9 $p
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
}
|
||||
|
||||
gf_status()
|
||||
{
|
||||
isStart=$(ps -ef | grep -v python | grep -v bash | grep go-fastdfs |grep -v .jar | grep -v grep | awk '{print $2}')
|
||||
if [ "$isStart" != '' ];then
|
||||
echo -e "\033[32mgo-fastdfs (pid $(echo $isStart)) already running\033[0m"
|
||||
else
|
||||
echo -e "\033[31mgo-fastdfs not running\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
gf_reload()
|
||||
{
|
||||
gf_stop
|
||||
gf_start
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
'start') gf_start;;
|
||||
'stop') gf_stop;;
|
||||
'reload') gf_reload;;
|
||||
'status') gf_status;;
|
||||
'restart')
|
||||
gf_stop
|
||||
gf_start;;
|
||||
esac
|
||||
75
plugins/go-fastdfs/install.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
sysName=`uname`
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
action=$1
|
||||
version=$2
|
||||
Install_gf()
|
||||
{
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/go-fastdfs
|
||||
FF_DIR=${serverPath}/go-fastdfs
|
||||
cd $FF_DIR
|
||||
|
||||
if [ $sysName == 'Darwin' ]; then
|
||||
FF_SS_DIR=${serverPath}/source/go-fastdfs
|
||||
mkdir -p $FF_SS_DIR
|
||||
if [ ! -f $FF_SS_DIR/v1.3.1.tar.gz ]; then
|
||||
wget -O $FF_SS_DIR/v1.3.1.tar.gz https://github.com/sjqzhang/go-fastdfs/archive/v1.3.1.tar.gz
|
||||
fi
|
||||
|
||||
if [ ! -d $FF_SS_DIR/go-fastdfs-1.3.1 ]; then
|
||||
cd $FF_SS_DIR && tar -zxvf $FF_SS_DIR/v1.3.1.tar.gz
|
||||
fi
|
||||
|
||||
|
||||
cd $FF_SS_DIR/go-fastdfs-1.3.1
|
||||
|
||||
if [ -d $FF_SS_DIR/go-fastdfs-1.3.1/vendor ];then
|
||||
mv vendor src
|
||||
fi
|
||||
|
||||
if [ ! -f $FF_SS_DIR/go-fastdfs-1.3.1/fileserver ]; then
|
||||
pwd=`pwd`
|
||||
echo "$pwd go build -o fileserver fileserver.go"
|
||||
GOPATH=$pwd go build -o fileserver fileserver.go
|
||||
fi
|
||||
|
||||
if [ ! -f $FF_DIR/go-fastdfs ];then
|
||||
cp -f fileserver $FF_DIR/go-fastdfs
|
||||
|
||||
cd $FF_DIR
|
||||
fi
|
||||
else
|
||||
cd $FF_DIR
|
||||
if [ ! -f ${FF_DIR}/fileserver ];then
|
||||
wget --no-check-certificate https://github.com/sjqzhang/go-fastdfs/releases/download/v1.3.1/fileserver -O fileserver
|
||||
chmod +x fileserver
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
echo "$version" > $FF_DIR/version.pl
|
||||
echo '安装完成' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_gf()
|
||||
{
|
||||
rm -rf $serverPath/go-fastdfs
|
||||
echo "卸载完成" > $install_tmp
|
||||
}
|
||||
|
||||
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_gf $version
|
||||
else
|
||||
Uninstall_gf $version
|
||||
fi
|
||||
93
plugins/go-fastdfs/js/fastdfs.js
Executable file
@@ -0,0 +1,93 @@
|
||||
function str2Obj(str){
|
||||
var data = {};
|
||||
kv = str.split('&');
|
||||
for(i in kv){
|
||||
v = kv[i].split('=');
|
||||
data[v[0]] = v[1];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function pPost(method,args,callback, title){
|
||||
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var _title = '正在获取...';
|
||||
if (typeof(title) != 'undefined'){
|
||||
_title = title;
|
||||
}
|
||||
|
||||
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'go-fastdfs', func:method, args:_args}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
|
||||
|
||||
function gfConfigSet(){
|
||||
pPost('gf_conf_set', '', function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
|
||||
var mlist = '';
|
||||
for (var i = 0; i < rdata.length; i++) {
|
||||
var w = '140';
|
||||
if (rdata[i].name == 'error_reporting') w = '250';
|
||||
var ibody = '<input style="width: ' + w + 'px;" class="bt-input-text mr5" name="' + rdata[i].name + '" value="' + rdata[i].value + '" type="text" >';
|
||||
switch (rdata[i].type) {
|
||||
case 0:
|
||||
var selected_1 = (rdata[i].value == 1) ? 'selected' : '';
|
||||
var selected_0 = (rdata[i].value == 0) ? 'selected' : '';
|
||||
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
|
||||
<option value="1" ' + selected_1 + '>开启</option>\
|
||||
<option value="0" ' + selected_0 + '>关闭</option>\
|
||||
</select>';
|
||||
break;
|
||||
case 1:
|
||||
var selected_1 = (rdata[i].value == 'On') ? 'selected' : '';
|
||||
var selected_0 = (rdata[i].value == 'Off') ? 'selected' : '';
|
||||
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
|
||||
<option value="On" ' + selected_1 + '>开启</option>\
|
||||
<option value="Off" ' + selected_0 + '>关闭</option></select>'
|
||||
break;
|
||||
case 2:
|
||||
var selected_1 = (rdata[i].value == 'true') ? 'selected' : '';
|
||||
var selected_0 = (rdata[i].value == 'false') ? 'selected' : '';
|
||||
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;">\
|
||||
<option value="true" ' + selected_1 + '>开启</option>\
|
||||
<option value="false" ' + selected_0 + '>关闭</option></select>'
|
||||
break;
|
||||
}
|
||||
mlist += '<p><span>' + rdata[i].name + '</span>' + ibody + ', <font>' + rdata[i].ps + '</font></p>'
|
||||
}
|
||||
var html = '<style>.conf_p p{margin-bottom: 2px}</style><div class="conf_p" style="margin-bottom:0">\
|
||||
' + mlist + '\
|
||||
<div style="margin-top:10px; padding-right:15px" class="text-right">\
|
||||
</div>';
|
||||
$(".soft-man-con").html(html);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function pRead(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>官方地址<a target="_blank" href="https://github.com/sjqzhang/go-fastdfs">查看</a></li>';
|
||||
readme += '<li>如果开启防火墙,需要放行端口,例如(8080)</li>';
|
||||
readme += '<li>要自行配置openresty</li>';
|
||||
readme += '</ul>';
|
||||
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import sys
|
||||
sys.path.append("/usr/local/lib/python2.7/site-packages")
|
||||
|
||||
|
||||
class mysql:
|
||||
class mysqlDb:
|
||||
__DB_PASS = None
|
||||
__DB_USER = 'root'
|
||||
__DB_PORT = 3306
|
||||
@@ -13,7 +13,7 @@ PATH = data/gogs.db
|
||||
|
||||
[repository]
|
||||
ROOT = {$ROOT_PATH}/gogs-repositories
|
||||
FORCE_PRIVATE = false
|
||||
FORCE_PRIVATE = true
|
||||
|
||||
[server]
|
||||
DOMAIN = 127.0.0.1
|
||||
@@ -35,9 +35,9 @@ USE_PLAIN_TEXT = true
|
||||
[service]
|
||||
REGISTER_EMAIL_CONFIRM = false
|
||||
ENABLE_NOTIFY_MAIL = false
|
||||
DISABLE_REGISTRATION = false
|
||||
DISABLE_REGISTRATION = true
|
||||
ENABLE_CAPTCHA = true
|
||||
REQUIRE_SIGNIN_VIEW = false
|
||||
REQUIRE_SIGNIN_VIEW = true
|
||||
|
||||
[picture]
|
||||
DISABLE_GRAVATAR = false
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
GITADDR="{$GITROOTURL}{$USERNAME}/{$PROJECT}"
|
||||
echo `date`
|
||||
|
||||
GITADDR="{$GITROOTURL}/{$USERNAME}/{$PROJECT}"
|
||||
GIT_SDIR="{$CODE_DIR}"
|
||||
|
||||
GIT_USER_DIR="${GIT_SDIR}/{$USERNAME}"
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -10,11 +10,11 @@ sys.path.append("/usr/local/lib/python2.7/site-packages")
|
||||
import psutil
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import public
|
||||
import mw
|
||||
|
||||
|
||||
app_debug = False
|
||||
if public.getOs() == 'darwin':
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
@@ -23,14 +23,14 @@ def getPluginName():
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return public.getPluginDir() + '/' + getPluginName()
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
sys.path.append(getPluginDir() + "/class")
|
||||
import mysql
|
||||
import mysqlDb
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return public.getServerDir() + '/' + getPluginName()
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
@@ -46,11 +46,11 @@ def getArgs():
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
t = t.split(':', 1)
|
||||
tmp[t[0]] = t[1]
|
||||
elif args_len > 1:
|
||||
for i in range(len(args)):
|
||||
t = args[i].split(':')
|
||||
t = args[i].split(':', 1)
|
||||
tmp[t[0]] = t[1]
|
||||
|
||||
return tmp
|
||||
@@ -77,26 +77,44 @@ def getConfTpl():
|
||||
|
||||
|
||||
def status():
|
||||
data = public.execShell(
|
||||
data = mw.execShell(
|
||||
"ps -ef|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def contentReplace(content):
|
||||
user = 'root'
|
||||
if public.isAppleSystem():
|
||||
user = public.execShell(
|
||||
def getHomeDir():
|
||||
if mw.isAppleSystem():
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
content = content.replace('{$HOME_DIR}', '/Users/' + user)
|
||||
return '/Users/' + user
|
||||
else:
|
||||
content = content.replace('{$HOME_DIR}', '/root')
|
||||
return '/root'
|
||||
|
||||
service_path = public.getServerDir()
|
||||
content = content.replace('{$ROOT_PATH}', public.getRootDir())
|
||||
|
||||
def getRunUser():
|
||||
if mw.isAppleSystem():
|
||||
user = mw.execShell(
|
||||
"who | sed -n '2, 1p' |awk '{print $1}'")[0].strip()
|
||||
return user
|
||||
else:
|
||||
return 'root'
|
||||
|
||||
__SR = '''#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
export USER=%s
|
||||
export HOME=%s && ''' % ( getRunUser(), getHomeDir())
|
||||
|
||||
|
||||
def contentReplace(content):
|
||||
|
||||
service_path = mw.getServerDir()
|
||||
content = content.replace('{$ROOT_PATH}', mw.getRootDir())
|
||||
content = content.replace('{$SERVER_PATH}', service_path)
|
||||
content = content.replace('{$RUN_USER}', user)
|
||||
content = content.replace('{$RUN_USER}', getRunUser())
|
||||
content = content.replace('{$HOME_DIR}', getHomeDir())
|
||||
|
||||
return content
|
||||
|
||||
@@ -104,7 +122,7 @@ def contentReplace(content):
|
||||
def initDreplace():
|
||||
|
||||
file_tpl = getInitdConfTpl()
|
||||
service_path = public.getServerDir()
|
||||
service_path = mw.getServerDir()
|
||||
|
||||
initD_path = getServerDir() + '/init.d'
|
||||
if not os.path.exists(initD_path):
|
||||
@@ -112,18 +130,18 @@ def initDreplace():
|
||||
file_bin = initD_path + '/' + getPluginName()
|
||||
|
||||
if not os.path.exists(file_bin):
|
||||
content = public.readFile(file_tpl)
|
||||
content = mw.readFile(file_tpl)
|
||||
content = contentReplace(content)
|
||||
public.writeFile(file_bin, content)
|
||||
public.execShell('chmod +x ' + file_bin)
|
||||
mw.writeFile(file_bin, content)
|
||||
mw.execShell('chmod +x ' + file_bin)
|
||||
|
||||
conf_bin = getConf()
|
||||
if not os.path.exists(conf_bin):
|
||||
public.execShell('mkdir -p ' + getServerDir() + '/custom/conf')
|
||||
mw.execShell('mkdir -p ' + getServerDir() + '/custom/conf')
|
||||
conf_tpl = getConfTpl()
|
||||
content = public.readFile(conf_tpl)
|
||||
content = mw.readFile(conf_tpl)
|
||||
content = contentReplace(content)
|
||||
public.writeFile(conf_bin, content)
|
||||
mw.writeFile(conf_bin, content)
|
||||
|
||||
log_path = getServerDir() + '/log'
|
||||
if not os.path.exists(log_path):
|
||||
@@ -133,7 +151,7 @@ def initDreplace():
|
||||
|
||||
|
||||
def getRootUrl():
|
||||
content = public.readFile(getConf())
|
||||
content = mw.readFile(getConf())
|
||||
rep = 'ROOT_URL\s*=\s*(.*)'
|
||||
tmp = re.search(rep, content)
|
||||
if not tmp:
|
||||
@@ -141,8 +159,17 @@ def getRootUrl():
|
||||
return tmp.groups()[0]
|
||||
|
||||
|
||||
def getSshPort():
|
||||
content = mw.readFile(getConf())
|
||||
rep = 'SSH_PORT\s*=\s*(.*)'
|
||||
tmp = re.search(rep, content)
|
||||
if not tmp:
|
||||
return ''
|
||||
return tmp.groups()[0]
|
||||
|
||||
|
||||
def getRootPath():
|
||||
content = public.readFile(getConf())
|
||||
content = mw.readFile(getConf())
|
||||
rep = 'ROOT\s*=\s*(.*)'
|
||||
tmp = re.search(rep, content)
|
||||
if not tmp:
|
||||
@@ -151,7 +178,7 @@ def getRootPath():
|
||||
|
||||
|
||||
def getDbConfValue():
|
||||
content = public.readFile(getConf())
|
||||
content = mw.readFile(getConf())
|
||||
|
||||
rep_scope = "\[database\](.*?)\["
|
||||
tmp = re.findall(rep_scope, content, re.S)
|
||||
@@ -170,7 +197,7 @@ def pMysqlDb():
|
||||
conf = getDbConfValue()
|
||||
|
||||
host = conf['HOST'].split(':')
|
||||
conn = mysql.mysql()
|
||||
conn = mysqlDb.mysqlDb()
|
||||
|
||||
conn.setHost(host[0])
|
||||
conn.setUser(conf['USER'])
|
||||
@@ -185,22 +212,22 @@ def isSqlError(mysqlMsg):
|
||||
_mysqlMsg = str(mysqlMsg)
|
||||
# print _mysqlMsg
|
||||
if "MySQLdb" in _mysqlMsg:
|
||||
return public.returnData(False, 'MySQLdb组件缺失! <br>进入SSH命令行输入: pip install mysql-python')
|
||||
return mw.returnData(False, 'MySQLdb组件缺失! <br>进入SSH命令行输入: pip install mysql-python')
|
||||
if "2002," in _mysqlMsg:
|
||||
return public.returnData(False, '数据库连接失败,请检查数据库服务是否启动!')
|
||||
return mw.returnData(False, '数据库连接失败,请检查数据库服务是否启动!')
|
||||
if "using password:" in _mysqlMsg:
|
||||
return public.returnData(False, '数据库管理密码错误!')
|
||||
return mw.returnData(False, '数据库管理密码错误!')
|
||||
if "Connection refused" in _mysqlMsg:
|
||||
return public.returnData(False, '数据库连接失败,请检查数据库服务是否启动!')
|
||||
return mw.returnData(False, '数据库连接失败,请检查数据库服务是否启动!')
|
||||
if "1133," in _mysqlMsg:
|
||||
return public.returnData(False, '数据库用户不存在!')
|
||||
return mw.returnData(False, '数据库用户不存在!')
|
||||
if "1007," in _mysqlMsg:
|
||||
return public.returnData(False, '数据库已经存在!')
|
||||
return mw.returnData(False, '数据库已经存在!')
|
||||
if "1044," in _mysqlMsg:
|
||||
return public.returnData(False, mysqlMsg[1])
|
||||
return mw.returnData(False, mysqlMsg[1])
|
||||
if "2003," in _mysqlMsg:
|
||||
return public.returnData(False, mysqlMsg[1])
|
||||
return public.returnData(True, 'OK')
|
||||
return mw.returnData(False, mysqlMsg[1])
|
||||
return mw.returnData(True, 'OK')
|
||||
|
||||
|
||||
def start():
|
||||
@@ -221,7 +248,7 @@ def start():
|
||||
if not data['status']:
|
||||
return data['msg']
|
||||
|
||||
data = public.execShell(file + ' start')
|
||||
data = mw.execShell(__SR + file + ' start')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[0]
|
||||
@@ -229,7 +256,7 @@ def start():
|
||||
|
||||
def stop():
|
||||
file = initDreplace()
|
||||
data = public.execShell(file + ' stop')
|
||||
data = mw.execShell(__SR + file + ' stop')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
@@ -237,7 +264,7 @@ def stop():
|
||||
|
||||
def restart():
|
||||
file = initDreplace()
|
||||
data = public.execShell(file + ' reload')
|
||||
data = mw.execShell(__SR + file + ' restart')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
@@ -245,7 +272,7 @@ def restart():
|
||||
|
||||
def reload():
|
||||
file = initDreplace()
|
||||
data = public.execShell(file + ' reload')
|
||||
data = mw.execShell(__SR + file + ' reload')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
@@ -253,7 +280,7 @@ def reload():
|
||||
|
||||
def initdStatus():
|
||||
if not app_debug:
|
||||
os_name = public.getOs()
|
||||
os_name = mw.getOs()
|
||||
if os_name == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
initd_bin = getInitDFile()
|
||||
@@ -265,24 +292,26 @@ def initdStatus():
|
||||
def initdInstall():
|
||||
import shutil
|
||||
if not app_debug:
|
||||
os_name = public.getOs()
|
||||
os_name = mw.getOs()
|
||||
if os_name == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
|
||||
mem_bin = initDreplace()
|
||||
initd_bin = getInitDFile()
|
||||
shutil.copyfile(mem_bin, initd_bin)
|
||||
public.execShell('chmod +x ' + initd_bin)
|
||||
mw.execShell('chmod +x ' + initd_bin)
|
||||
mw.execShell('chkconfig --add ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
os_name = public.getOs()
|
||||
os_name = mw.getOs()
|
||||
if os_name == 'darwin':
|
||||
return "Apple Computer does not support"
|
||||
initd_bin = getInitDFile()
|
||||
os.remove(initd_bin)
|
||||
mw.execShell('chkconfig --del ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
@@ -317,7 +346,7 @@ def getGogsConf():
|
||||
{'name': 'SHOW_FOOTER_VERSION', 'type': 2, 'ps': 'Gogs版本信息'},
|
||||
{'name': 'SHOW_FOOTER_TEMPLATE_LOAD_TIME', 'type': 2, 'ps': 'Gogs模板加载时间'},
|
||||
]
|
||||
conf = public.readFile(getConf())
|
||||
conf = mw.readFile(getConf())
|
||||
result = []
|
||||
|
||||
for g in gets:
|
||||
@@ -327,7 +356,7 @@ def getGogsConf():
|
||||
continue
|
||||
g['value'] = tmp.groups()[0]
|
||||
result.append(g)
|
||||
return public.getJson(result)
|
||||
return mw.getJson(result)
|
||||
|
||||
|
||||
def submitGogsConf():
|
||||
@@ -347,15 +376,15 @@ def submitGogsConf():
|
||||
'SHOW_FOOTER_TEMPLATE_LOAD_TIME']
|
||||
args = getArgs()
|
||||
filename = getConf()
|
||||
conf = public.readFile(filename)
|
||||
conf = mw.readFile(filename)
|
||||
for g in gets:
|
||||
if g in args:
|
||||
rep = g + '\s*=\s*(.*)'
|
||||
val = g + ' = ' + args[g]
|
||||
conf = re.sub(rep, val, conf)
|
||||
public.writeFile(filename, conf)
|
||||
mw.writeFile(filename, conf)
|
||||
reload()
|
||||
return public.returnJson(True, '设置成功')
|
||||
return mw.returnJson(True, '设置成功')
|
||||
|
||||
|
||||
def userList():
|
||||
@@ -388,12 +417,12 @@ def userList():
|
||||
|
||||
page_info = {'count': count, 'p': page,
|
||||
'row': page_size, 'tojs': 'gogsUserList'}
|
||||
data['list'] = public.getPage(page_info)
|
||||
data['list'] = mw.getPage(page_info)
|
||||
data['page'] = page
|
||||
data['page_size'] = page_size
|
||||
data['page_count'] = int(math.ceil(count / page_size))
|
||||
data['data'] = list_data
|
||||
return public.returnJson(True, 'OK', data)
|
||||
return mw.returnJson(True, 'OK', data)
|
||||
|
||||
|
||||
def getAllUserProject(user, search=''):
|
||||
@@ -436,7 +465,7 @@ def userProjectList():
|
||||
search = ''
|
||||
|
||||
if not 'name' in args:
|
||||
return public.returnJson(False, '缺少参数name')
|
||||
return mw.returnJson(False, '缺少参数name')
|
||||
if 'page' in args:
|
||||
page = int(args['page'])
|
||||
|
||||
@@ -458,38 +487,38 @@ def userProjectList():
|
||||
data['root_url'] = getRootUrl()
|
||||
data['data'] = ret_data
|
||||
data['args'] = args
|
||||
data['list'] = public.getPage(
|
||||
data['list'] = mw.getPage(
|
||||
{'count': dlist_sum, 'p': page, 'row': page_size, 'tojs': 'userProjectList'})
|
||||
|
||||
return public.returnJson(True, 'OK', data)
|
||||
return mw.returnJson(True, 'OK', data)
|
||||
|
||||
|
||||
def projectScriptEdit():
|
||||
args = getArgs()
|
||||
|
||||
if not 'user' in args:
|
||||
return public.returnJson(True, 'username missing')
|
||||
return mw.returnJson(True, 'username missing')
|
||||
|
||||
if not 'name' in args:
|
||||
return public.returnJson(True, 'project name missing')
|
||||
return mw.returnJson(True, 'project name missing')
|
||||
|
||||
user = args['user']
|
||||
name = args['name'] + '.git'
|
||||
post_receive = getRootPath() + '/' + user + '/' + name + \
|
||||
'/custom_hooks/post-receive'
|
||||
'/custom_hooks/commit'
|
||||
if os.path.exists(post_receive):
|
||||
return public.returnJson(True, 'OK', {'path': post_receive})
|
||||
return mw.returnJson(True, 'OK', {'path': post_receive})
|
||||
else:
|
||||
return public.returnJson(False, 'file does not exist')
|
||||
return mw.returnJson(False, 'file does not exist')
|
||||
|
||||
|
||||
def projectScriptLoad():
|
||||
args = getArgs()
|
||||
if not 'user' in args:
|
||||
return public.returnJson(True, 'username missing')
|
||||
return mw.returnJson(True, 'username missing')
|
||||
|
||||
if not 'name' in args:
|
||||
return public.returnJson(True, 'project name missing')
|
||||
return mw.returnJson(True, 'project name missing')
|
||||
|
||||
user = args['user']
|
||||
name = args['name'] + '.git'
|
||||
@@ -499,26 +528,28 @@ def projectScriptLoad():
|
||||
post_receive = path + '/custom_hooks/post-receive'
|
||||
|
||||
if not os.path.exists(path + '/custom_hooks'):
|
||||
public.execShell('mkdir -p ' + path + '/custom_hooks')
|
||||
mw.execShell('mkdir -p ' + path + '/custom_hooks')
|
||||
|
||||
pct_content = public.readFile(post_receive_tpl)
|
||||
pct_content = mw.readFile(post_receive_tpl)
|
||||
pct_content = pct_content.replace('{$PATH}', path + '/custom_hooks')
|
||||
public.writeFile(post_receive, pct_content)
|
||||
public.execShell('chmod 777 ' + post_receive)
|
||||
mw.writeFile(post_receive, pct_content)
|
||||
mw.execShell('chmod 777 ' + post_receive)
|
||||
|
||||
commit_tpl = getPluginDir() + '/hook/commit.tpl'
|
||||
commit = path + '/custom_hooks/commit'
|
||||
|
||||
codeDir = public.getRootDir() + '/git'
|
||||
codeDir = mw.getRootDir() + '/git'
|
||||
|
||||
cc_content = public.readFile(commit_tpl)
|
||||
cc_content = cc_content.replace('{$GITROOTURL}', getRootUrl())
|
||||
cc_content = mw.readFile(commit_tpl)
|
||||
|
||||
sshUrl = 'ssh://127.0.0.1:' + getSshPort()
|
||||
cc_content = cc_content.replace('{$GITROOTURL}', sshUrl)
|
||||
cc_content = cc_content.replace('{$CODE_DIR}', codeDir)
|
||||
cc_content = cc_content.replace('{$USERNAME}', user)
|
||||
cc_content = cc_content.replace('{$PROJECT}', args['name'])
|
||||
cc_content = cc_content.replace('{$WEB_ROOT}', public.getWwwDir())
|
||||
public.writeFile(commit, cc_content)
|
||||
public.execShell('chmod 777 ' + commit)
|
||||
cc_content = cc_content.replace('{$WEB_ROOT}', mw.getWwwDir())
|
||||
mw.writeFile(commit, cc_content)
|
||||
mw.execShell('chmod 777 ' + commit)
|
||||
|
||||
return 'ok'
|
||||
|
||||
@@ -526,31 +557,31 @@ def projectScriptLoad():
|
||||
def projectScriptUnload():
|
||||
args = getArgs()
|
||||
if not 'user' in args:
|
||||
return public.returnJson(True, 'username missing')
|
||||
return mw.returnJson(True, 'username missing')
|
||||
|
||||
if not 'name' in args:
|
||||
return public.returnJson(True, 'project name missing')
|
||||
return mw.returnJson(True, 'project name missing')
|
||||
|
||||
user = args['user']
|
||||
name = args['name'] + '.git'
|
||||
|
||||
post_receive = getRootPath() + '/' + user + '/' + name + \
|
||||
'/custom_hooks/post-receive'
|
||||
public.execShell('rm -f ' + post_receive)
|
||||
mw.execShell('rm -f ' + post_receive)
|
||||
|
||||
commit = getRootPath() + '/' + user + '/' + name + \
|
||||
'/custom_hooks/commit'
|
||||
public.execShell('rm -f ' + commit)
|
||||
mw.execShell('rm -f ' + commit)
|
||||
return 'ok'
|
||||
|
||||
|
||||
def projectScriptDebug():
|
||||
args = getArgs()
|
||||
if not 'user' in args:
|
||||
return public.returnJson(True, 'username missing')
|
||||
return mw.returnJson(True, 'username missing')
|
||||
|
||||
if not 'name' in args:
|
||||
return public.returnJson(True, 'project name missing')
|
||||
return mw.returnJson(True, 'project name missing')
|
||||
user = args['user']
|
||||
name = args['name'] + '.git'
|
||||
commit_log = getRootPath() + '/' + user + '/' + name + \
|
||||
@@ -564,14 +595,25 @@ def projectScriptDebug():
|
||||
data['status'] = False
|
||||
data['msg'] = '没有日志文件'
|
||||
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def gogsEdit():
|
||||
data = {}
|
||||
data['post_receive'] = getPluginDir() + '/hook/post-receive.tpl'
|
||||
data['commit'] = getPluginDir() + '/hook/commit.tpl'
|
||||
return public.getJson(data)
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def getRsaPublic():
|
||||
path = getHomeDir()
|
||||
path += '/.ssh/id_rsa.pub'
|
||||
|
||||
content = mw.readFile(path)
|
||||
|
||||
data = {}
|
||||
data['mw'] = content
|
||||
return mw.getJson(data)
|
||||
|
||||
|
||||
def getTotalStatistics():
|
||||
@@ -584,58 +626,61 @@ def getTotalStatistics():
|
||||
|
||||
data['status'] = True
|
||||
data['count'] = count
|
||||
data['ver'] = public.readFile(getServerDir() + '/version.pl').strip()
|
||||
return public.returnJson(True, 'ok', data)
|
||||
data['ver'] = mw.readFile(getServerDir() + '/version.pl').strip()
|
||||
return mw.returnJson(True, 'ok', data)
|
||||
else:
|
||||
data['status'] = False
|
||||
data['count'] = 0
|
||||
return public.returnJson(False, 'fail', data)
|
||||
return mw.returnJson(False, 'fail', data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
print(status())
|
||||
elif func == 'start':
|
||||
print start()
|
||||
print(start())
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
print(stop())
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
print(restart())
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
print(reload())
|
||||
elif func == 'initd_status':
|
||||
print initdStatus()
|
||||
print(initdStatus())
|
||||
elif func == 'initd_install':
|
||||
print initdInstall()
|
||||
print(initdInstall())
|
||||
elif func == 'initd_uninstall':
|
||||
print initdUinstall()
|
||||
print(initdUinstall())
|
||||
elif func == 'run_log':
|
||||
print runLog()
|
||||
print(runLog())
|
||||
elif func == 'post_receive_log':
|
||||
print postReceiveLog()
|
||||
print(postReceiveLog())
|
||||
elif func == 'conf':
|
||||
print getConf()
|
||||
print(getConf())
|
||||
elif func == 'init_conf':
|
||||
print getInitdConf()
|
||||
print(getInitdConf())
|
||||
elif func == 'get_gogs_conf':
|
||||
print getGogsConf()
|
||||
print(getGogsConf())
|
||||
elif func == 'submit_gogs_conf':
|
||||
print submitGogsConf()
|
||||
print(submitGogsConf())
|
||||
elif func == 'user_list':
|
||||
print userList()
|
||||
print(userList())
|
||||
elif func == 'user_project_list':
|
||||
print userProjectList()
|
||||
print(userProjectList())
|
||||
elif func == 'project_script_edit':
|
||||
print projectScriptEdit()
|
||||
print(projectScriptEdit())
|
||||
elif func == 'project_script_load':
|
||||
print projectScriptLoad()
|
||||
print(projectScriptLoad())
|
||||
elif func == 'project_script_unload':
|
||||
print projectScriptUnload()
|
||||
print(projectScriptUnload())
|
||||
elif func == 'project_script_debug':
|
||||
print projectScriptDebug()
|
||||
print(projectScriptDebug())
|
||||
elif func == 'gogs_edit':
|
||||
print gogsEdit()
|
||||
print(gogsEdit())
|
||||
elif func == 'get_rsa_public':
|
||||
print(getRsaPublic())
|
||||
elif func == 'get_total_statistics':
|
||||
print getTotalStatistics()
|
||||
print(getTotalStatistics())
|
||||
else:
|
||||
print 'fail'
|
||||
print('fail')
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
"ps": "Gogs是一款极易搭建的自助Git服务",
|
||||
"name": "gogs",
|
||||
"title": "Gogs",
|
||||
"versions": ["0.11.86","0.11.79"],
|
||||
"versions": ["0.11.86"],
|
||||
"tip": "soft",
|
||||
"checks": "server/gogs",
|
||||
"path":"server/gogs",
|
||||
"author": "midoks",
|
||||
"date": "201-04-01",
|
||||
"home": "https://gogs.io",
|
||||
|
||||
@@ -25,12 +25,17 @@ if [ -f /etc/init.d/functions ];then
|
||||
. /etc/init.d/functions
|
||||
fi
|
||||
|
||||
if [ -f /etc/rc.d/init.d/functions ];then
|
||||
. /etc/rc.d/init.d/functions
|
||||
fi
|
||||
|
||||
# Default values
|
||||
HOME={$HOME_DIR}
|
||||
export HOME={$HOME_DIR}
|
||||
export USER={$RUN_USER}
|
||||
NAME=gogs
|
||||
GOGS_HOME={$SERVER_PATH}/gogs
|
||||
GOGS_PATH=${GOGS_HOME}/$NAME
|
||||
GOGS_USER=midoks
|
||||
GOGS_USER={$RUN_USER}
|
||||
SERVICENAME="Gogs"
|
||||
LOCKFILE=/tmp/gogs.lock
|
||||
LOGPATH=${GOGS_HOME}/log
|
||||
@@ -38,12 +43,17 @@ LOGFILE=${LOGPATH}/gogs.log
|
||||
RETVAL=0
|
||||
|
||||
|
||||
[ -r /etc/sysconfig/$NAME ] && . /etc/sysconfig/$NAME
|
||||
DAEMON_OPTS="--check $NAME"
|
||||
[ ! -z "$GOGS_USER" ] && DAEMON_OPTS="$DAEMON_OPTS --user=${GOGS_USER}"
|
||||
|
||||
|
||||
status(){
|
||||
isStart=`ps -ef|grep 'gogs web' |grep -v grep|awk '{print $2}'`
|
||||
if [ "$isStart" == '' ];then
|
||||
echo "${SERVICENAME} not running"
|
||||
echo -e "${SERVICENAME} not running"
|
||||
else
|
||||
echo "${SERVICENAME}(pid $(echo $isStart)) already running"
|
||||
echo -e "${SERVICENAME}(pid $(echo $isStart)) already running"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -55,24 +65,23 @@ start() {
|
||||
fi
|
||||
|
||||
cd ${GOGS_HOME}
|
||||
echo "Starting ${SERVICENAME}: \c"
|
||||
echo -e "Starting ${SERVICENAME}: \c"
|
||||
${GOGS_PATH} web > ${LOGFILE} 2>&1 &
|
||||
RETVAL=$?
|
||||
[ $RETVAL = 0 ] && touch ${LOCKFILE} && echo "\033[32mdone\033[0m"
|
||||
[ $RETVAL = 0 ] && touch ${LOCKFILE} && echo -e "\033[32mdone\033[0m"
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
stop() {
|
||||
cd ${GOGS_HOME}
|
||||
echo "Shutting down ${SERVICENAME}: \c"
|
||||
which "killproc" > /dev/null
|
||||
if [ $? -eq 0 ];then
|
||||
killproc ${NAME}
|
||||
else
|
||||
pkill ${NAME}
|
||||
fi
|
||||
RETVAL=$?
|
||||
[ $RETVAL = 0 ] && rm -f ${LOCKFILE} && echo "\033[32mdone\033[0m"
|
||||
|
||||
pids=`ps -ef|grep 'gogs web' |grep -v grep|awk '{print $2}'`
|
||||
arr=($pids)
|
||||
echo -e "Stopping gogs... \c"
|
||||
for p in ${arr[@]}
|
||||
do
|
||||
kill -9 $p
|
||||
done
|
||||
echo -e "\033[32mdone\033[0m"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
|
||||
@@ -7,7 +7,7 @@ rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
install_tmp=${rootPath}/tmp/bt_install.pl
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
|
||||
GOGS_DOWNLOAD='https://dl.gogs.io'
|
||||
@@ -49,6 +49,14 @@ Install_gogs()
|
||||
mv $serverPath/source/gogs/gogs_${version}/gogs/ $serverPath/gogs
|
||||
echo $version > $serverPath/gogs/version.pl
|
||||
|
||||
# if id -u gogs > /dev/null 2>&1; then
|
||||
# echo "gogs user exists"
|
||||
# else
|
||||
# useradd gogs
|
||||
# cp /etc/sudoers{,.`date +"%Y-%m-%d_%H-%M-%S"`}
|
||||
# echo "gogs ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
# fi
|
||||
|
||||
echo 'install success' > $install_tmp
|
||||
}
|
||||
|
||||
|
||||
@@ -87,13 +87,12 @@ function gogsSetConfig(){
|
||||
//提交PHP配置
|
||||
function submitGogsConf() {
|
||||
var data = {
|
||||
DOMAIN: $("select[name='DOMAIN']").val(),
|
||||
ROOT_URL: $("select[name='ROOT_URL']").val(),
|
||||
DOMAIN: $("input[name='DOMAIN']").val(),
|
||||
ROOT_URL: $("input[name='ROOT_URL']").val(),
|
||||
HTTP_ADDR: $("select[name='HTTP_ADDR']").val(),
|
||||
HTTP_PORT: $("select[name='HTTP_PORT']").val(),
|
||||
HTTP_PORT: $("input[name='HTTP_PORT']").val(),
|
||||
START_SSH_SERVER: $("select[name='START_SSH_SERVER']").val() || 'false',
|
||||
SSH_PORT: $("select[name='SSH_PORT']").val(),
|
||||
ROOT_URL: $("select[name='ROOT_URL']").val(),
|
||||
SSH_PORT: $("input[name='SSH_PORT']").val(),
|
||||
REQUIRE_SIGNIN_VIEW: $("select[name='REQUIRE_SIGNIN_VIEW']").val() || 'false',
|
||||
ENABLE_CAPTCHA: $("select[name='ENABLE_CAPTCHA']").val() || 'true',
|
||||
DISABLE_REGISTRATION: $("select[name='DISABLE_REGISTRATION']").val() || 'false',
|
||||
@@ -228,7 +227,7 @@ function userProjectList(user, search){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '用户('+user+')项目列表',
|
||||
area: '300px',
|
||||
area: '500px',
|
||||
content:"<div class='bt-form pd20 c6'>\
|
||||
<div>\
|
||||
<div class='divtable' style='margin-top:5px;'>\
|
||||
@@ -313,8 +312,35 @@ function projectScriptDebug(user,name){
|
||||
});
|
||||
}
|
||||
|
||||
function getRsaPublic(){
|
||||
gogsPost('get_rsa_public', {}, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
var con = '<div class="tab-con">\
|
||||
<div class="myKeyCon ptb15">\
|
||||
<textarea style="margin:0px;width:580px;height:110px;outline:none;" spellcheck="false">'+rdata.public+'</textarea>\
|
||||
</div>\
|
||||
<ul class="help-info-text c7 pull-left"></ul>\
|
||||
</div>'
|
||||
layer.open({
|
||||
type: 1,
|
||||
area: "600px",
|
||||
title: '本机公钥',
|
||||
closeBtn: 2,
|
||||
shift: 5,
|
||||
shadeClose: false,
|
||||
content:con
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function gogsRead(){
|
||||
var readme = '<p>* 默认使用MySQL,第一个启动加载各种配置,并修改成正确的数据库配置</p>';
|
||||
readme += '<p>* 邮件端口使用456,gogs仅支持使用STARTTLS的SMTP协议</p>';
|
||||
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>默认使用MySQL,第一个启动加载各种配置,并修改成正确的数据库配置</li>';
|
||||
readme += '<li>邮件端口使用456,gogs仅支持使用STARTTLS的SMTP协议</li>';
|
||||
readme += '<li>如果使用项目中脚本本地同步,<a target="_blank" href="https://github.com/midoks/mdserver-web/wiki/%E6%8F%92%E4%BB%B6%E7%AE%A1%E7%90%86%5Bgogs%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%5D#%E5%90%AF%E5%8A%A8gogs%E5%90%8E%E5%A6%82%E6%9E%9C%E8%A6%81%E4%BD%BF%E7%94%A8hook%E8%84%9A%E6%9C%AC%E5%90%8C%E6%AD%A5%E4%BB%A3%E7%A0%81%E9%9C%80%E8%A6%81%E5%BC%80%E5%90%AFssh%E7%AB%AF%E5%8F%A3">点击查看</></li>';
|
||||
readme += '<li><a href="#" onclick="getRsaPublic();">点击查看本机公钥</></li>';
|
||||
readme += '</ul>';
|
||||
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
BIN
plugins/jenkins/ico.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
20
plugins/jenkins/index.html
Executable file
@@ -0,0 +1,20 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('jenkins');">服务</p>
|
||||
<p onclick="pluginInitD('jenkins');">自启动</p>
|
||||
<p onclick="pluginLogs('jenkins','','run_log');">日志</p>
|
||||
<p onclick="pRead()">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
resetPluginWinWidth(700);
|
||||
$.getScript( "/plugins/file?name=jenkins&f=js/jenkins.js", function() {
|
||||
pluginService('walle');
|
||||
});
|
||||
</script>
|
||||
154
plugins/jenkins/index.py
Executable file
@@ -0,0 +1,154 @@
|
||||
# coding: utf-8
|
||||
|
||||
import time
|
||||
import random
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'jenkins'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
if app_debug:
|
||||
return '/tmp/' + getPluginName()
|
||||
return '/etc/init.d/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDTpl():
|
||||
return getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
|
||||
|
||||
|
||||
def getLog():
|
||||
return "/var/log/jenkins/jenkins.log"
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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():
|
||||
pn = getPluginName()
|
||||
cmd = "ps -ef|grep 'jenkins.war' | grep -v grep | awk '{print $2}'"
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def start():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service jenkins start')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def stop():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service jenkins stop')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def restart():
|
||||
data = mw.execShell('service jenkins restart')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def reload():
|
||||
data = mw.execShell('service jenkins restart')
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdStatus():
|
||||
initd_bin = getInitDFile()
|
||||
if os.path.exists(initd_bin):
|
||||
return 'ok'
|
||||
return 'fail'
|
||||
|
||||
|
||||
def initdInstall():
|
||||
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --add ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
mw.execShell('chkconfig --del ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
# rsyncdReceive
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
elif func == 'start':
|
||||
print start()
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
elif func == 'initd_status':
|
||||
print initdStatus()
|
||||
elif func == 'initd_install':
|
||||
print initdInstall()
|
||||
elif func == 'initd_uninstall':
|
||||
print initdUinstall()
|
||||
elif func == 'run_log':
|
||||
print getLog()
|
||||
else:
|
||||
print 'error'
|
||||
16
plugins/jenkins/info.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"id":13,
|
||||
"title":"jenkins",
|
||||
"tip":"soft",
|
||||
"name":"jenkins",
|
||||
"type":"扩展",
|
||||
"ps":"开源CI&CD软件领导者",
|
||||
"versions":"1.0",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/jenkins",
|
||||
"path": "server/jenkins",
|
||||
"author":"midoks",
|
||||
"home":"https://jenkins.io/zh/",
|
||||
"date":"2019-12-06",
|
||||
"pid":"3"
|
||||
}
|
||||
43
plugins/jenkins/install.sh
Normal file
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
sysName=`uname`
|
||||
|
||||
Install_walle()
|
||||
{
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/jenkins
|
||||
echo '1.0' > $serverPath/jenkins/version.pl
|
||||
|
||||
|
||||
if [ $sysName == 'Darwin' ]; then
|
||||
echo "jenkins mac no install!"
|
||||
else
|
||||
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
|
||||
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
|
||||
yum -y install jenkins
|
||||
fi
|
||||
|
||||
echo '安装完成' > $install_tmp
|
||||
|
||||
}
|
||||
|
||||
Uninstall_walle()
|
||||
{
|
||||
rm -rf $serverPath/jenkins
|
||||
echo "卸载完成" > $install_tmp
|
||||
}
|
||||
|
||||
action=$1
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_walle
|
||||
else
|
||||
Uninstall_walle
|
||||
fi
|
||||
74
plugins/jenkins/js/jenkins.js
Executable file
@@ -0,0 +1,74 @@
|
||||
function str2Obj(str){
|
||||
var data = {};
|
||||
kv = str.split('&');
|
||||
for(i in kv){
|
||||
v = kv[i].split('=');
|
||||
data[v[0]] = v[1];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function pPost(method,args,callback, title){
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var _title = '正在获取...';
|
||||
if (typeof(title) != 'undefined'){
|
||||
_title = title;
|
||||
}
|
||||
|
||||
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'walle', func:method, args:_args}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function pPostCallbak(method, version, args,callback){
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
|
||||
var req_data = {};
|
||||
req_data['name'] = 'walle';
|
||||
req_data['func'] = method;
|
||||
args['version'] = version;
|
||||
|
||||
if (typeof(args) == 'string'){
|
||||
req_data['args'] = JSON.stringify(str2Obj(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 pRead(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>修改配置正确后:</li>';
|
||||
readme += '<li>手动[初始化环境]:cat /var/lib/jenkins/secrets/initialAdminPassword</li>';
|
||||
readme += '<li><a target="_blank" href="https://jenkins.io/zh/doc/">官方文档</a></li>';
|
||||
readme += '</ul>';
|
||||
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
21
plugins/l2tp/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Mr Chen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
BIN
plugins/l2tp/ico.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
19
plugins/l2tp/index.html
Executable file
@@ -0,0 +1,19 @@
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('l2tp');">服务</p>
|
||||
<p onclick="pluginConfig('l2tp',null, 'conf');">用户配置</p>
|
||||
<p onclick="pluginConfig('l2tp',null, 'conf_psk');">PSK配置</p>
|
||||
<p onclick="userList();">用户列表</p>
|
||||
<p onclick="readme();">说明</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$.getScript( "/plugins/file?name=l2tp&f=js/l2tp.js", function(){
|
||||
pluginService('l2tp');
|
||||
});
|
||||
</script>
|
||||
233
plugins/l2tp/index.py
Executable file
@@ -0,0 +1,233 @@
|
||||
# coding:utf-8
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import shutil
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'l2tp'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getArgs():
|
||||
args = sys.argv[2:]
|
||||
tmp = {}
|
||||
args_len = len(args)
|
||||
|
||||
if args_len == 1:
|
||||
t = args[0].strip('{').strip('}')
|
||||
t = t.split(':')
|
||||
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():
|
||||
cmd = "ps -ef|grep xl2tpd |grep -v grep | grep -v python | awk '{print $2}'"
|
||||
data = mw.execShell(cmd)
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
return 'start'
|
||||
|
||||
|
||||
def initConf():
|
||||
l2tp_cs = getServerDir() + '/chap-secrets'
|
||||
if not os.path.exists(l2tp_cs):
|
||||
mw.execShell('cp -rf ' + getPluginDir() +
|
||||
'/tmp/chap-secrets' + ' ' + getServerDir())
|
||||
|
||||
l2tp_is = getServerDir() + '/ipsec.secrets'
|
||||
if not os.path.exists(l2tp_is):
|
||||
mw.execShell('cp -rf ' + getPluginDir() +
|
||||
'/tmp/ipsec.secrets' + ' ' + getServerDir())
|
||||
|
||||
|
||||
def start():
|
||||
initConf()
|
||||
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service xl2tpd start')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def stop():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service xl2tpd stop')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def restart():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
data = mw.execShell('service xl2tpd restart')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def reload():
|
||||
data = mw.execShell('service xl2tpd reload')
|
||||
if data[0] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
|
||||
|
||||
def getPathFile():
|
||||
if mw.isAppleSystem():
|
||||
return getServerDir() + '/chap-secrets'
|
||||
return '/etc/ppp/chap-secrets'
|
||||
|
||||
|
||||
def getPathFilePsk():
|
||||
if mw.isAppleSystem():
|
||||
return getServerDir() + '/ipsec.secrets'
|
||||
return '/etc/ipsec.secrets'
|
||||
|
||||
|
||||
def getUserList():
|
||||
import re
|
||||
path = getPathFile()
|
||||
if not os.path.exists(path):
|
||||
return mw.returnJson(False, '密码配置文件不存在!')
|
||||
conf = mw.readFile(path)
|
||||
|
||||
conf = re.sub('#(.*)\n', '', conf)
|
||||
|
||||
if conf.strip() == '':
|
||||
return mw.returnJson(True, 'ok', [])
|
||||
|
||||
ulist = conf.strip().split('\n')
|
||||
|
||||
user = []
|
||||
for line in ulist:
|
||||
line_info = {}
|
||||
line = re.match(r'(\w*)\s*(\w*)\s*(\w*)\s*(.*)',
|
||||
line.strip(), re.M | re.I).groups()
|
||||
line_info['user'] = line[0]
|
||||
line_info['pwd'] = line[2]
|
||||
line_info['type'] = line[1]
|
||||
line_info['ip'] = line[3]
|
||||
user.append(line_info)
|
||||
|
||||
return mw.returnJson(True, 'ok', user)
|
||||
|
||||
|
||||
def addUser():
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(False, "Apple Computer does not support")
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
ret = mw.execShell('echo ' + args['username'] + '|l2tp -a')
|
||||
if ret[1] == '':
|
||||
return mw.returnJson(True, '添加成功!:' + ret[0])
|
||||
return mw.returnJson(False, '添加失败:' + ret[0])
|
||||
|
||||
|
||||
def delUser():
|
||||
if mw.isAppleSystem():
|
||||
return mw.returnJson(False, "Apple Computer does not support")
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
ret = mw.execShell('echo ' + args['username'] + '|l2tp -d')
|
||||
if ret[1] == '':
|
||||
return mw.returnJson(True, '删除成功!:' + ret[0])
|
||||
return mw.returnJson(False, '删除失败:' + ret[0])
|
||||
|
||||
|
||||
def modUser():
|
||||
|
||||
args = getArgs()
|
||||
data = checkArgs(args, ['username', 'password'])
|
||||
if not data[0]:
|
||||
return data[1]
|
||||
|
||||
path = getPathFile()
|
||||
username = args['username']
|
||||
password = args['password']
|
||||
|
||||
# sed -i "/^\<${user}\>/d" /etc/ppp/chap-secrets
|
||||
# echo "${user} l2tpd ${pass} *" >> /etc/ppp/chap-secrets
|
||||
|
||||
if mw.isAppleSystem():
|
||||
mw.execShell("sed -i .bak '/^\(" + username + "\)/d' " + path)
|
||||
else:
|
||||
mw.execShell("sed -i '/^\(" + username + "\)/d' " + path)
|
||||
# print 'echo "' + username + " l2tpd " + password + " *\" >>"
|
||||
# + path
|
||||
ret = mw.execShell("echo \"" + username +
|
||||
" l2tpd " + password + " *\" >>" + path)
|
||||
if ret[1] == '':
|
||||
return mw.returnJson(True, '修改成功!')
|
||||
return mw.returnJson(False, '修改失败')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
func = sys.argv[1]
|
||||
if func == 'status':
|
||||
print status()
|
||||
elif func == 'start':
|
||||
print start()
|
||||
elif func == 'stop':
|
||||
print stop()
|
||||
elif func == 'restart':
|
||||
print restart()
|
||||
elif func == 'reload':
|
||||
print reload()
|
||||
elif func == 'conf':
|
||||
print getPathFile()
|
||||
elif func == 'conf_psk':
|
||||
print getPathFilePsk()
|
||||
elif func == 'user_list':
|
||||
print getUserList()
|
||||
elif func == 'add_user':
|
||||
print addUser()
|
||||
elif func == 'del_user':
|
||||
print delUser()
|
||||
elif func == 'mod_user':
|
||||
print modUser()
|
||||
else:
|
||||
print 'error'
|
||||
14
plugins/l2tp/info.json
Executable file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"title":"L2TP",
|
||||
"tip":"soft",
|
||||
"name":"l2tp",
|
||||
"type":"运行环境",
|
||||
"ps":"VPN网关",
|
||||
"versions":"1.0",
|
||||
"shell":"install.sh",
|
||||
"checks":"server/l2tp",
|
||||
"author":"teddysun",
|
||||
"home":"https://github.com/teddysun/across/blob/master/l2tp.sh",
|
||||
"date":"2019-02-27",
|
||||
"pid": "4"
|
||||
}
|
||||
46
plugins/l2tp/install.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
|
||||
curPath=`pwd`
|
||||
rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
SYSOS=`uname`
|
||||
|
||||
Install_l2tp()
|
||||
{
|
||||
isStart=""
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
mkdir -p $serverPath/l2tp
|
||||
echo '1.0' > $serverPath/l2tp/version.pl
|
||||
|
||||
cp -rf scripts/l2tp.sh $serverPath/l2tp
|
||||
chmod +x $serverPath/l2tp/l2tp.sh
|
||||
|
||||
if [ "Darwin" == "$SYSOS" ];then
|
||||
echo 'macosx unavailable' > $install_tmp
|
||||
exit 0
|
||||
fi
|
||||
|
||||
/bin/sh $serverPath/l2tp/l2tp.sh
|
||||
|
||||
echo 'install complete' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_l2tp()
|
||||
{
|
||||
rm -rf $serverPath/l2tp
|
||||
echo "Uninstall completed" > $install_tmp
|
||||
}
|
||||
|
||||
action=$1
|
||||
if [ "${1}" == 'install' ];then
|
||||
Install_l2tp
|
||||
else
|
||||
Uninstall_l2tp
|
||||
fi
|
||||
158
plugins/l2tp/js/l2tp.js
Executable file
@@ -0,0 +1,158 @@
|
||||
function str2Obj(str){
|
||||
var data = {};
|
||||
kv = str.split('&');
|
||||
for(i in kv){
|
||||
v = kv[i].split('=');
|
||||
data[v[0]] = v[1];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function lpPost(method,args,callback, title){
|
||||
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var _title = '正在获取...';
|
||||
if (typeof(title) != 'undefined'){
|
||||
_title = title;
|
||||
}
|
||||
|
||||
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
||||
$.post('/plugins/run', {name:'l2tp', func:method, args:_args}, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function lpAsyncPost(method,args){
|
||||
var _args = null;
|
||||
if (typeof(args) == 'string'){
|
||||
_args = JSON.stringify(str2Obj(args));
|
||||
} else {
|
||||
_args = JSON.stringify(args);
|
||||
}
|
||||
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
return syncPost('/plugins/run', {name:'l2tp', func:method, args:_args});
|
||||
}
|
||||
|
||||
function userList(){
|
||||
lpPost('user_list', '' ,function(data){
|
||||
var rdata = $.parseJSON(data['data']);
|
||||
|
||||
if (!rdata['status']){
|
||||
layer.msg(rdata.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
var list = rdata['data'];
|
||||
|
||||
var con = '';
|
||||
con += '<div class="divtable" style="margin-top:5px;"><table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">';
|
||||
con += '<thead><tr>';
|
||||
con += '<th>用户</th>';
|
||||
con += '<th>密码</th>';
|
||||
con += '<th>操作(<a class="btlink" onclick="addUser()">添加</a>)</th>';
|
||||
con += '</tr></thead>';
|
||||
|
||||
con += '<tbody>';
|
||||
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
con += '<tr>'+
|
||||
'<td>' + list[i]['user']+'</td>' +
|
||||
'<td>' + list[i]['pwd']+'</td>' +
|
||||
'<td><a class="btlink" onclick="modUser(\''+list[i]['user']+'\')">改密</a>|<a class="btlink" onclick="delUser(\''+list[i]['user']+'\')">删除</a></td></tr>';
|
||||
}
|
||||
|
||||
con += '</tbody>';
|
||||
con += '</table></div>';
|
||||
|
||||
$(".soft-man-con").html(con);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function addUser(){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '添加用户',
|
||||
area: '240px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>\
|
||||
<div><input class='bt-input-text mr5 outline_no' type='text' id='username' name='username' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入用户名'></div>\
|
||||
</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='add_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#add_ok').click(function(){
|
||||
_data = {};
|
||||
_data['username'] = $('#username').val();
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
lpPost('add_user', _data, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
layer.close(loadOpen);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){userList();},2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function delUser(username){
|
||||
lpPost('del_user', {username:username}, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){userList();},2000);
|
||||
});
|
||||
}
|
||||
|
||||
function modUser(username){
|
||||
var loadOpen = layer.open({
|
||||
type: 1,
|
||||
title: '修改密码',
|
||||
area: '240px',
|
||||
content:"<div class='bt-form pd20 pb70 c6'>\
|
||||
<div class='version line'>\
|
||||
<div><input class='bt-input-text mr5 outline_no' type='text' id='password' name='password' style='height: 28px; border-radius: 3px;width: 200px;' placeholder='输入密码'></div>\
|
||||
</div>\
|
||||
<div class='bt-form-submit-btn'>\
|
||||
<button type='button' id='mod_ok' class='btn btn-success btn-sm btn-title bi-btn'>确认</button>\
|
||||
</div>\
|
||||
</div>"
|
||||
});
|
||||
|
||||
$('#mod_ok').click(function(){
|
||||
_data = {};
|
||||
_data['username'] = username;
|
||||
_data['password'] = $('#password').val();
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
lpPost('mod_user', _data, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
layer.close(loadOpen);
|
||||
layer.msg(rdata.msg,{icon:rdata.status?1:2,time:2000,shade: [0.3, '#000']});
|
||||
setTimeout(function(){userList();},2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function readme(){
|
||||
var readme = '<ul class="help-info-text c7">';
|
||||
readme += '<li>PPTP需开放端口:UDP:1723</li>';
|
||||
readme += '<li>L2TP需开放端口:UDP:500,UDP:4500,UDP:1701</li>';
|
||||
readme += '</ul>';
|
||||
$('.soft-man-con').html(readme);
|
||||
}
|
||||
820
plugins/l2tp/scripts/l2tp.sh
Normal file
@@ -0,0 +1,820 @@
|
||||
#!/usr/bin/env bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
#=======================================================================#
|
||||
# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+ #
|
||||
# Description: L2TP VPN Auto Installer #
|
||||
# Author: Teddysun <i@teddysun.com> #
|
||||
# Intro: https://teddysun.com/448.html #
|
||||
#=======================================================================#
|
||||
cur_dir=`pwd`
|
||||
|
||||
libreswan_filename="libreswan-3.27"
|
||||
download_root_url="https://dl.lamp.sh/files"
|
||||
|
||||
rootness(){
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Error:This script must be run as root!" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
tunavailable(){
|
||||
if [[ ! -e /dev/net/tun ]]; then
|
||||
echo "Error:TUN/TAP is not available!" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
disable_selinux(){
|
||||
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
|
||||
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
|
||||
setenforce 0
|
||||
fi
|
||||
}
|
||||
|
||||
get_opsy(){
|
||||
[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return
|
||||
[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return
|
||||
[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return
|
||||
}
|
||||
|
||||
get_os_info(){
|
||||
IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )
|
||||
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
|
||||
|
||||
local cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )
|
||||
local cores=$( awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo )
|
||||
local freq=$( awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )
|
||||
local tram=$( free -m | awk '/Mem/ {print $2}' )
|
||||
local swap=$( free -m | awk '/Swap/ {print $2}' )
|
||||
local up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime )
|
||||
local load=$( w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' )
|
||||
local opsy=$( get_opsy )
|
||||
local arch=$( uname -m )
|
||||
local lbit=$( getconf LONG_BIT )
|
||||
local host=$( hostname )
|
||||
local kern=$( uname -r )
|
||||
|
||||
echo "########## System Information ##########"
|
||||
echo
|
||||
echo "CPU model : ${cname}"
|
||||
echo "Number of cores : ${cores}"
|
||||
echo "CPU frequency : ${freq} MHz"
|
||||
echo "Total amount of ram : ${tram} MB"
|
||||
echo "Total amount of swap : ${swap} MB"
|
||||
echo "System uptime : ${up}"
|
||||
echo "Load average : ${load}"
|
||||
echo "OS : ${opsy}"
|
||||
echo "Arch : ${arch} (${lbit} Bit)"
|
||||
echo "Kernel : ${kern}"
|
||||
echo "Hostname : ${host}"
|
||||
echo "IPv4 address : ${IP}"
|
||||
echo
|
||||
echo "########################################"
|
||||
}
|
||||
|
||||
check_sys(){
|
||||
local checkType=$1
|
||||
local value=$2
|
||||
|
||||
local release=''
|
||||
local systemPackage=''
|
||||
|
||||
if [[ -f /etc/redhat-release ]]; then
|
||||
release="centos"
|
||||
systemPackage="yum"
|
||||
elif cat /etc/issue | grep -Eqi "debian"; then
|
||||
release="debian"
|
||||
systemPackage="apt"
|
||||
elif cat /etc/issue | grep -Eqi "ubuntu"; then
|
||||
release="ubuntu"
|
||||
systemPackage="apt"
|
||||
elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
|
||||
release="centos"
|
||||
systemPackage="yum"
|
||||
elif cat /proc/version | grep -Eqi "debian"; then
|
||||
release="debian"
|
||||
systemPackage="apt"
|
||||
elif cat /proc/version | grep -Eqi "ubuntu"; then
|
||||
release="ubuntu"
|
||||
systemPackage="apt"
|
||||
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
|
||||
release="centos"
|
||||
systemPackage="yum"
|
||||
fi
|
||||
|
||||
if [[ ${checkType} == "sysRelease" ]]; then
|
||||
if [ "$value" == "$release" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
elif [[ ${checkType} == "packageManager" ]]; then
|
||||
if [ "$value" == "$systemPackage" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
rand(){
|
||||
index=0
|
||||
str=""
|
||||
for i in {a..z}; do arr[index]=${i}; index=`expr ${index} + 1`; done
|
||||
for i in {A..Z}; do arr[index]=${i}; index=`expr ${index} + 1`; done
|
||||
for i in {0..9}; do arr[index]=${i}; index=`expr ${index} + 1`; done
|
||||
for i in {1..10}; do str="$str${arr[$RANDOM%$index]}"; done
|
||||
echo ${str}
|
||||
}
|
||||
|
||||
is_64bit(){
|
||||
if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
download_file(){
|
||||
if [ -s ${1} ]; then
|
||||
echo "$1 [found]"
|
||||
else
|
||||
echo "$1 not found!!!download now..."
|
||||
if ! wget -c -t3 -T60 ${download_root_url}/${1}; then
|
||||
echo "Failed to download $1, please download it to ${cur_dir} directory manually and try again."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
versionget(){
|
||||
if [[ -s /etc/redhat-release ]];then
|
||||
grep -oE "[0-9.]+" /etc/redhat-release
|
||||
else
|
||||
grep -oE "[0-9.]+" /etc/issue
|
||||
fi
|
||||
}
|
||||
|
||||
centosversion(){
|
||||
if check_sys sysRelease centos;then
|
||||
local code=${1}
|
||||
local version="`versionget`"
|
||||
local main_ver=${version%%.*}
|
||||
if [ "${main_ver}" == "${code}" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
debianversion(){
|
||||
if check_sys sysRelease debian;then
|
||||
local version=$( get_opsy )
|
||||
local code=${1}
|
||||
local main_ver=$( echo ${version} | sed 's/[^0-9]//g')
|
||||
if [ "${main_ver}" == "${code}" ];then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
version_check(){
|
||||
if check_sys packageManager yum; then
|
||||
if centosversion 5; then
|
||||
echo "Error: CentOS 5 is not supported, Please re-install OS and try again."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_char(){
|
||||
SAVEDSTTY=`stty -g`
|
||||
stty -echo
|
||||
stty cbreak
|
||||
dd if=/dev/tty bs=1 count=1 2> /dev/null
|
||||
stty -raw
|
||||
stty echo
|
||||
stty $SAVEDSTTY
|
||||
}
|
||||
|
||||
preinstall_l2tp(){
|
||||
|
||||
echo
|
||||
if [ -d "/proc/vz" ]; then
|
||||
echo -e "\033[41;37m WARNING: \033[0m Your VPS is based on OpenVZ, and IPSec might not be supported by the kernel."
|
||||
echo "Continue installation? (y/n)"
|
||||
read -p "(Default: n)" agree
|
||||
[ -z ${agree} ] && agree="n"
|
||||
if [ "${agree}" == "n" ]; then
|
||||
echo
|
||||
echo "L2TP installation cancelled."
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
echo
|
||||
echo "Please enter IP-Range:"
|
||||
# read -p "(Default Range: 192.168.18):" iprange
|
||||
# [ -z ${iprange} ] && iprange="192.168.18"
|
||||
iprange="192.168.18"
|
||||
echo ${iprange}
|
||||
|
||||
echo "Please enter PSK:"
|
||||
# read -p "(Default PSK: teddysun.com):" mypsk
|
||||
# [ -z ${mypsk} ] && mypsk="teddysun.com"
|
||||
mypsk="midoks"
|
||||
echo ${mypsk}
|
||||
|
||||
echo "Please enter Username:"
|
||||
# read -p "(Default Username: teddysun):" username
|
||||
# [ -z ${username} ] && username="teddysun"
|
||||
username="midoks"
|
||||
echo ${username}
|
||||
|
||||
# password=`rand`
|
||||
echo "Please enter ${username}'s password:"
|
||||
# read -p "(Default Password: ${password}):" tmppassword
|
||||
# [ ! -z ${tmppassword} ] && password=${tmppassword}
|
||||
password=midoks
|
||||
echo ${password}
|
||||
|
||||
echo
|
||||
echo "ServerIP:${IP}"
|
||||
echo "Server Local IP:${iprange}.1"
|
||||
echo "Client Remote IP Range:${iprange}.2-${iprange}.254"
|
||||
echo "PSK:${mypsk}"
|
||||
echo
|
||||
echo "Press any key to start... or press Ctrl + C to cancel."
|
||||
char=`get_char`
|
||||
|
||||
}
|
||||
|
||||
install_l2tp(){
|
||||
|
||||
mknod /dev/random c 1 9
|
||||
|
||||
if check_sys packageManager apt; then
|
||||
apt-get -y update
|
||||
|
||||
if debianversion 7; then
|
||||
if is_64bit; then
|
||||
local libnspr4_filename1="libnspr4_4.10.7-1_amd64.deb"
|
||||
local libnspr4_filename2="libnspr4-0d_4.10.7-1_amd64.deb"
|
||||
local libnspr4_filename3="libnspr4-dev_4.10.7-1_amd64.deb"
|
||||
local libnspr4_filename4="libnspr4-dbg_4.10.7-1_amd64.deb"
|
||||
local libnss3_filename1="libnss3_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename2="libnss3-1d_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename3="libnss3-tools_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename4="libnss3-dev_3.17.2-1.1_amd64.deb"
|
||||
local libnss3_filename5="libnss3-dbg_3.17.2-1.1_amd64.deb"
|
||||
else
|
||||
local libnspr4_filename1="libnspr4_4.10.7-1_i386.deb"
|
||||
local libnspr4_filename2="libnspr4-0d_4.10.7-1_i386.deb"
|
||||
local libnspr4_filename3="libnspr4-dev_4.10.7-1_i386.deb"
|
||||
local libnspr4_filename4="libnspr4-dbg_4.10.7-1_i386.deb"
|
||||
local libnss3_filename1="libnss3_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename2="libnss3-1d_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename3="libnss3-tools_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename4="libnss3-dev_3.17.2-1.1_i386.deb"
|
||||
local libnss3_filename5="libnss3-dbg_3.17.2-1.1_i386.deb"
|
||||
fi
|
||||
rm -rf ${cur_dir}/l2tp
|
||||
mkdir -p ${cur_dir}/l2tp
|
||||
cd ${cur_dir}/l2tp
|
||||
download_file "${libnspr4_filename1}"
|
||||
download_file "${libnspr4_filename2}"
|
||||
download_file "${libnspr4_filename3}"
|
||||
download_file "${libnspr4_filename4}"
|
||||
download_file "${libnss3_filename1}"
|
||||
download_file "${libnss3_filename2}"
|
||||
download_file "${libnss3_filename3}"
|
||||
download_file "${libnss3_filename4}"
|
||||
download_file "${libnss3_filename5}"
|
||||
dpkg -i ${libnspr4_filename1} ${libnspr4_filename2} ${libnspr4_filename3} ${libnspr4_filename4}
|
||||
dpkg -i ${libnss3_filename1} ${libnss3_filename2} ${libnss3_filename3} ${libnss3_filename4} ${libnss3_filename5}
|
||||
|
||||
apt-get -y install wget gcc ppp flex bison make pkg-config libpam0g-dev libcap-ng-dev iptables \
|
||||
libcap-ng-utils libunbound-dev libevent-dev libcurl4-nss-dev libsystemd-daemon-dev
|
||||
else
|
||||
apt-get -y install wget gcc ppp flex bison make python libnss3-dev libnss3-tools libselinux-dev iptables \
|
||||
libnspr4-dev pkg-config libpam0g-dev libcap-ng-dev libcap-ng-utils libunbound-dev \
|
||||
libevent-dev libcurl4-nss-dev libsystemd-dev
|
||||
fi
|
||||
apt-get -y --no-install-recommends install xmlto
|
||||
apt-get -y install xl2tpd
|
||||
|
||||
compile_install
|
||||
elif check_sys packageManager yum; then
|
||||
echo "Adding the EPEL repository..."
|
||||
yum -y install epel-release yum-utils
|
||||
[ ! -f /etc/yum.repos.d/epel.repo ] && echo "Install EPEL repository failed, please check it." && exit 1
|
||||
yum-config-manager --enable epel
|
||||
echo "Adding the EPEL repository complete..."
|
||||
|
||||
if centosversion 7; then
|
||||
yum -y install ppp libreswan xl2tpd firewalld
|
||||
yum_install
|
||||
elif centosversion 6; then
|
||||
yum -y remove libevent-devel
|
||||
yum -y install libevent2-devel
|
||||
yum -y install nss-devel nspr-devel pkgconfig pam-devel \
|
||||
libcap-ng-devel libselinux-devel lsof \
|
||||
curl-devel flex bison gcc ppp make iptables gmp-devel \
|
||||
fipscheck-devel unbound-devel xmlto libpcap-devel xl2tpd
|
||||
|
||||
compile_install
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
config_install(){
|
||||
|
||||
cat > /etc/ipsec.conf<<EOF
|
||||
version 2.0
|
||||
|
||||
config setup
|
||||
protostack=netkey
|
||||
nhelpers=0
|
||||
uniqueids=no
|
||||
interfaces=%defaultroute
|
||||
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!${iprange}.0/24
|
||||
|
||||
conn l2tp-psk
|
||||
rightsubnet=vhost:%priv
|
||||
also=l2tp-psk-nonat
|
||||
|
||||
conn l2tp-psk-nonat
|
||||
authby=secret
|
||||
pfs=no
|
||||
auto=add
|
||||
keyingtries=3
|
||||
rekey=no
|
||||
ikelifetime=8h
|
||||
keylife=1h
|
||||
type=transport
|
||||
left=%defaultroute
|
||||
leftid=${IP}
|
||||
leftprotoport=17/1701
|
||||
right=%any
|
||||
rightprotoport=17/%any
|
||||
dpddelay=40
|
||||
dpdtimeout=130
|
||||
dpdaction=clear
|
||||
sha2-truncbug=yes
|
||||
EOF
|
||||
|
||||
cat > /etc/ipsec.secrets<<EOF
|
||||
%any %any : PSK "${mypsk}"
|
||||
EOF
|
||||
|
||||
cat > /etc/xl2tpd/xl2tpd.conf<<EOF
|
||||
[global]
|
||||
port = 1701
|
||||
|
||||
[lns default]
|
||||
ip range = ${iprange}.2-${iprange}.254
|
||||
local ip = ${iprange}.1
|
||||
require chap = yes
|
||||
refuse pap = yes
|
||||
require authentication = yes
|
||||
name = l2tpd
|
||||
ppp debug = yes
|
||||
pppoptfile = /etc/ppp/options.xl2tpd
|
||||
length bit = yes
|
||||
EOF
|
||||
|
||||
cat > /etc/ppp/options.xl2tpd<<EOF
|
||||
ipcp-accept-local
|
||||
ipcp-accept-remote
|
||||
require-mschap-v2
|
||||
ms-dns 8.8.8.8
|
||||
ms-dns 8.8.4.4
|
||||
noccp
|
||||
auth
|
||||
hide-password
|
||||
idle 1800
|
||||
mtu 1410
|
||||
mru 1410
|
||||
nodefaultroute
|
||||
debug
|
||||
proxyarp
|
||||
connect-delay 5000
|
||||
EOF
|
||||
|
||||
rm -f /etc/ppp/chap-secrets
|
||||
cat > /etc/ppp/chap-secrets<<EOF
|
||||
# Secrets for authentication using CHAP
|
||||
# client server secret IP addresses
|
||||
${username} l2tpd ${password} *
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
compile_install(){
|
||||
|
||||
rm -rf ${cur_dir}/l2tp
|
||||
mkdir -p ${cur_dir}/l2tp
|
||||
cd ${cur_dir}/l2tp
|
||||
download_file "${libreswan_filename}.tar.gz"
|
||||
tar -zxf ${libreswan_filename}.tar.gz
|
||||
|
||||
cd ${cur_dir}/l2tp/${libreswan_filename}
|
||||
cat > Makefile.inc.local <<'EOF'
|
||||
WERROR_CFLAGS =
|
||||
USE_DNSSEC = false
|
||||
USE_DH31 = false
|
||||
USE_GLIBC_KERN_FLIP_HEADERS = true
|
||||
EOF
|
||||
make programs && make install
|
||||
|
||||
/usr/local/sbin/ipsec --version >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "${libreswan_filename} install failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
config_install
|
||||
|
||||
cp -pf /etc/sysctl.conf /etc/sysctl.conf.bak
|
||||
|
||||
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
|
||||
|
||||
for each in `ls /proc/sys/net/ipv4/conf/`; do
|
||||
echo "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.conf
|
||||
done
|
||||
sysctl -p
|
||||
|
||||
if centosversion 6; then
|
||||
[ -f /etc/sysconfig/iptables ] && cp -pf /etc/sysconfig/iptables /etc/sysconfig/iptables.old.`date +%Y%m%d`
|
||||
|
||||
if [ "`iptables -L -n | grep -c '\-\-'`" == "0" ]; then
|
||||
cat > /etc/sysconfig/iptables <<EOF
|
||||
# Added by L2TP VPN script
|
||||
*filter
|
||||
:INPUT ACCEPT [0:0]
|
||||
:FORWARD ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -p tcp --dport 22 -j ACCEPT
|
||||
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
COMMIT
|
||||
*nat
|
||||
:PREROUTING ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
:POSTROUTING ACCEPT [0:0]
|
||||
-A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
COMMIT
|
||||
EOF
|
||||
else
|
||||
iptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -I FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
iptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
/etc/init.d/iptables save
|
||||
fi
|
||||
|
||||
if [ ! -f /etc/ipsec.d/cert9.db ]; then
|
||||
echo > /var/tmp/libreswan-nss-pwd
|
||||
certutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.d
|
||||
rm -f /var/tmp/libreswan-nss-pwd
|
||||
fi
|
||||
|
||||
chkconfig --add iptables
|
||||
chkconfig iptables on
|
||||
chkconfig --add ipsec
|
||||
chkconfig ipsec on
|
||||
chkconfig --add xl2tpd
|
||||
chkconfig xl2tpd on
|
||||
|
||||
/etc/init.d/iptables restart
|
||||
/etc/init.d/ipsec start
|
||||
/etc/init.d/xl2tpd start
|
||||
|
||||
else
|
||||
[ -f /etc/iptables.rules ] && cp -pf /etc/iptables.rules /etc/iptables.rules.old.`date +%Y%m%d`
|
||||
|
||||
if [ "`iptables -L -n | grep -c '\-\-'`" == "0" ]; then
|
||||
cat > /etc/iptables.rules <<EOF
|
||||
# Added by L2TP VPN script
|
||||
*filter
|
||||
:INPUT ACCEPT [0:0]
|
||||
:FORWARD ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -p tcp --dport 22 -j ACCEPT
|
||||
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
COMMIT
|
||||
*nat
|
||||
:PREROUTING ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
:POSTROUTING ACCEPT [0:0]
|
||||
-A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
COMMIT
|
||||
EOF
|
||||
else
|
||||
iptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
|
||||
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -I FORWARD -s ${iprange}.0/24 -j ACCEPT
|
||||
iptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
|
||||
/sbin/iptables-save > /etc/iptables.rules
|
||||
fi
|
||||
|
||||
cat > /etc/network/if-up.d/iptables <<EOF
|
||||
#!/bin/sh
|
||||
/sbin/iptables-restore < /etc/iptables.rules
|
||||
EOF
|
||||
chmod +x /etc/network/if-up.d/iptables
|
||||
|
||||
if [ ! -f /etc/ipsec.d/cert9.db ]; then
|
||||
echo > /var/tmp/libreswan-nss-pwd
|
||||
certutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.d
|
||||
rm -f /var/tmp/libreswan-nss-pwd
|
||||
fi
|
||||
|
||||
update-rc.d -f xl2tpd defaults
|
||||
|
||||
cp -f /etc/rc.local /etc/rc.local.old.`date +%Y%m%d`
|
||||
sed --follow-symlinks -i -e '/^exit 0/d' /etc/rc.local
|
||||
cat >> /etc/rc.local <<EOF
|
||||
|
||||
# Added by L2TP VPN script
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
/usr/sbin/service ipsec start
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x /etc/rc.local
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
|
||||
/sbin/iptables-restore < /etc/iptables.rules
|
||||
/usr/sbin/service ipsec start
|
||||
/usr/sbin/service xl2tpd restart
|
||||
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
yum_install(){
|
||||
|
||||
config_install
|
||||
|
||||
cp -pf /etc/sysctl.conf /etc/sysctl.conf.bak
|
||||
|
||||
echo "# Added by L2TP VPN" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conf
|
||||
|
||||
for each in `ls /proc/sys/net/ipv4/conf/`; do
|
||||
echo "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.conf
|
||||
done
|
||||
sysctl -p
|
||||
|
||||
cat > /etc/firewalld/services/xl2tpd.xml<<EOF
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<service>
|
||||
<short>xl2tpd</short>
|
||||
<description>L2TP IPSec</description>
|
||||
<port protocol="udp" port="4500"/>
|
||||
<port protocol="udp" port="1701"/>
|
||||
</service>
|
||||
EOF
|
||||
chmod 640 /etc/firewalld/services/xl2tpd.xml
|
||||
|
||||
systemctl enable ipsec
|
||||
systemctl enable xl2tpd
|
||||
systemctl enable firewalld
|
||||
|
||||
systemctl status firewalld > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
firewall-cmd --reload
|
||||
echo "Checking firewalld status..."
|
||||
firewall-cmd --list-all
|
||||
echo "add firewalld rules..."
|
||||
firewall-cmd --permanent --add-service=ipsec
|
||||
firewall-cmd --permanent --add-service=xl2tpd
|
||||
firewall-cmd --permanent --add-masquerade
|
||||
firewall-cmd --reload
|
||||
else
|
||||
echo "Firewalld looks like not running, trying to start..."
|
||||
systemctl start firewalld
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Firewalld start successfully..."
|
||||
firewall-cmd --reload
|
||||
echo "Checking firewalld status..."
|
||||
firewall-cmd --list-all
|
||||
echo "adding firewalld rules..."
|
||||
firewall-cmd --permanent --add-service=ipsec
|
||||
firewall-cmd --permanent --add-service=xl2tpd
|
||||
firewall-cmd --permanent --add-masquerade
|
||||
firewall-cmd --reload
|
||||
else
|
||||
echo "Failed to start firewalld. please enable udp port 500 4500 1701 manually if necessary."
|
||||
fi
|
||||
fi
|
||||
|
||||
systemctl restart ipsec
|
||||
systemctl restart xl2tpd
|
||||
echo "Checking ipsec status..."
|
||||
systemctl -a | grep ipsec
|
||||
echo "Checking xl2tpd status..."
|
||||
systemctl -a | grep xl2tpd
|
||||
echo "Checking firewalld status..."
|
||||
firewall-cmd --list-all
|
||||
|
||||
}
|
||||
|
||||
finally(){
|
||||
|
||||
cd ${cur_dir}
|
||||
rm -fr ${cur_dir}/l2tp
|
||||
# create l2tp command
|
||||
cp -f ${cur_dir}/`basename $0` /usr/bin/l2tp
|
||||
|
||||
echo "Please wait a moment..."
|
||||
sleep 5
|
||||
ipsec verify
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "# L2TP VPN Auto Installer #"
|
||||
echo "# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+ #"
|
||||
echo "# Intro: https://teddysun.com/448.html #"
|
||||
echo "# Author: Teddysun <i@teddysun.com> #"
|
||||
echo "###############################################################"
|
||||
echo "If there is no [FAILED] above, you can connect to your L2TP "
|
||||
echo "VPN Server with the default Username/Password is below:"
|
||||
echo
|
||||
echo "Server IP: ${IP}"
|
||||
echo "PSK : ${mypsk}"
|
||||
echo "Username : ${username}"
|
||||
echo "Password : ${password}"
|
||||
echo
|
||||
echo "If you want to modify user settings, please use below command(s):"
|
||||
echo "l2tp -a (Add a user)"
|
||||
echo "l2tp -d (Delete a user)"
|
||||
echo "l2tp -l (List all users)"
|
||||
echo "l2tp -m (Modify a user password)"
|
||||
echo
|
||||
echo "Welcome to visit our website: https://teddysun.com/448.html"
|
||||
echo "Enjoy it!"
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
l2tp(){
|
||||
clear
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "# L2TP VPN Auto Installer #"
|
||||
echo "# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+ #"
|
||||
echo "# Intro: https://teddysun.com/448.html #"
|
||||
echo "# Author: Teddysun <i@teddysun.com> #"
|
||||
echo "###############################################################"
|
||||
echo
|
||||
rootness
|
||||
tunavailable
|
||||
disable_selinux
|
||||
version_check
|
||||
get_os_info
|
||||
preinstall_l2tp
|
||||
install_l2tp
|
||||
finally
|
||||
}
|
||||
|
||||
list_users(){
|
||||
if [ ! -f /etc/ppp/chap-secrets ];then
|
||||
echo "Error: /etc/ppp/chap-secrets file not found."
|
||||
exit 1
|
||||
fi
|
||||
local line="+-------------------------------------------+\n"
|
||||
local string=%20s
|
||||
printf "${line}|${string} |${string} |\n${line}" Username Password
|
||||
grep -v "^#" /etc/ppp/chap-secrets | awk '{printf "|'${string}' |'${string}' |\n", $1,$3}'
|
||||
printf ${line}
|
||||
}
|
||||
|
||||
add_user(){
|
||||
while :
|
||||
do
|
||||
read -p "Please input your Username:" user
|
||||
if [ -z ${user} ]; then
|
||||
echo "Username can not be empty"
|
||||
else
|
||||
grep -w "${user}" /etc/ppp/chap-secrets > /dev/null 2>&1
|
||||
if [ $? -eq 0 ];then
|
||||
echo "Username (${user}) already exists. Please re-enter your username."
|
||||
else
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
pass=`rand`
|
||||
echo "Please input ${user}'s password:"
|
||||
read -p "(Default Password: ${pass}):" tmppass
|
||||
[ ! -z ${tmppass} ] && pass=${tmppass}
|
||||
echo "${user} l2tpd ${pass} *" >> /etc/ppp/chap-secrets
|
||||
echo "Username (${user}) add completed."
|
||||
}
|
||||
|
||||
del_user(){
|
||||
while :
|
||||
do
|
||||
read -p "Please input Username you want to delete it:" user
|
||||
if [ -z ${user} ]; then
|
||||
echo "Username can not be empty"
|
||||
else
|
||||
grep -w "${user}" /etc/ppp/chap-secrets >/dev/null 2>&1
|
||||
if [ $? -eq 0 ];then
|
||||
break
|
||||
else
|
||||
echo "Username (${user}) is not exists. Please re-enter your username."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
sed -i "/^\<${user}\>/d" /etc/ppp/chap-secrets
|
||||
echo "Username (${user}) delete completed."
|
||||
}
|
||||
|
||||
mod_user(){
|
||||
while :
|
||||
do
|
||||
read -p "Please input Username you want to change password:" user
|
||||
if [ -z ${user} ]; then
|
||||
echo "Username can not be empty"
|
||||
else
|
||||
grep -w "${user}" /etc/ppp/chap-secrets >/dev/null 2>&1
|
||||
if [ $? -eq 0 ];then
|
||||
break
|
||||
else
|
||||
echo "Username (${user}) is not exists. Please re-enter your username."
|
||||
fi
|
||||
fi
|
||||
done
|
||||
pass=`rand`
|
||||
echo "Please input ${user}'s new password:"
|
||||
read -p "(Default Password: ${pass}):" tmppass
|
||||
[ ! -z ${tmppass} ] && pass=${tmppass}
|
||||
sed -i "/^\<${user}\>/d" /etc/ppp/chap-secrets
|
||||
echo "${user} l2tpd ${pass} *" >> /etc/ppp/chap-secrets
|
||||
echo "Username ${user}'s password has been changed."
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Main process
|
||||
action=$1
|
||||
if [ -z ${action} ] && [ "`basename $0`" != "l2tp" ]; then
|
||||
action=install
|
||||
fi
|
||||
|
||||
case ${action} in
|
||||
install)
|
||||
l2tp 2>&1 | tee ${cur_dir}/l2tp.log
|
||||
;;
|
||||
-l|--list)
|
||||
list_users
|
||||
;;
|
||||
-a|--add)
|
||||
add_user
|
||||
;;
|
||||
-d|--del)
|
||||
del_user
|
||||
;;
|
||||
-m|--mod)
|
||||
mod_user
|
||||
;;
|
||||
-h|--help)
|
||||
echo "Usage: `basename $0` -l,--list List all users"
|
||||
echo " `basename $0` -a,--add Add a user"
|
||||
echo " `basename $0` -d,--del Delete a user"
|
||||
echo " `basename $0` -m,--mod Modify a user password"
|
||||
echo " `basename $0` -h,--help Print this help information"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: `basename $0` [-l,--list|-a,--add|-d,--del|-m,--mod|-h,--help]" && exit
|
||||
;;
|
||||
esac
|
||||
3
plugins/l2tp/tmp/chap-secrets
Normal file
@@ -0,0 +1,3 @@
|
||||
# Secrets for authentication using CHAP
|
||||
# client server secret IP addresses
|
||||
demo demo demo *
|
||||
1
plugins/l2tp/tmp/ipsec.secrets
Normal file
@@ -0,0 +1 @@
|
||||
%any %any : PSK "midoks"
|
||||
@@ -7,10 +7,10 @@ import time
|
||||
import re
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import public
|
||||
import mw
|
||||
|
||||
app_debug = False
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
@@ -19,11 +19,11 @@ def getPluginName():
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return public.getPluginDir() + '/' + getPluginName()
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return public.getServerDir() + '/' + getPluginName()
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getInitDFile():
|
||||
@@ -44,7 +44,7 @@ def getConfTpl():
|
||||
|
||||
def getMemPort():
|
||||
path = getConf()
|
||||
content = public.readFile(path)
|
||||
content = mw.readFile(path)
|
||||
rep = 'PORT\s*=\s*(\d*)'
|
||||
tmp = re.search(rep, content)
|
||||
return tmp.groups()[0]
|
||||
@@ -68,7 +68,7 @@ def getArgs():
|
||||
|
||||
|
||||
def status():
|
||||
data = public.execShell(
|
||||
data = mw.execShell(
|
||||
"ps -ef|grep " + getPluginName() + " |grep -v grep | grep -v python | awk '{print $2}'")
|
||||
if data[0] == '':
|
||||
return 'stop'
|
||||
@@ -78,7 +78,7 @@ def status():
|
||||
def initDreplace():
|
||||
|
||||
file_tpl = getConfTpl()
|
||||
service_path = public.getServerDir()
|
||||
service_path = mw.getServerDir()
|
||||
|
||||
initD_path = getServerDir() + '/init.d'
|
||||
if not os.path.exists(initD_path):
|
||||
@@ -86,17 +86,17 @@ def initDreplace():
|
||||
file_bin = initD_path + '/memcached'
|
||||
|
||||
if not os.path.exists(file_bin):
|
||||
content = public.readFile(file_tpl)
|
||||
content = mw.readFile(file_tpl)
|
||||
content = content.replace('{$SERVER_PATH}', service_path)
|
||||
public.writeFile(file_bin, content)
|
||||
public.execShell('chmod +x ' + file_bin)
|
||||
mw.writeFile(file_bin, content)
|
||||
mw.execShell('chmod +x ' + file_bin)
|
||||
|
||||
return file_bin
|
||||
|
||||
|
||||
def memOp(method):
|
||||
file = initDreplace()
|
||||
data = public.execShell(file + ' ' + method)
|
||||
data = mw.execShell(file + ' ' + method)
|
||||
if data[1] == '':
|
||||
return 'ok'
|
||||
return data[1]
|
||||
@@ -146,15 +146,15 @@ def runInfo():
|
||||
result['hit'] = float(result['get_hits']) / \
|
||||
float(result['cmd_get']) * 100
|
||||
|
||||
conf = public.readFile(getConf())
|
||||
conf = mw.readFile(getConf())
|
||||
result['bind'] = re.search('IP=(.+)', conf).groups()[0]
|
||||
result['port'] = int(re.search('PORT=(\d+)', conf).groups()[0])
|
||||
result['maxconn'] = int(re.search('MAXCONN=(\d+)', conf).groups()[0])
|
||||
result['cachesize'] = int(
|
||||
re.search('CACHESIZE=(\d+)', conf).groups()[0])
|
||||
return public.getJson(result)
|
||||
return mw.getJson(result)
|
||||
except Exception, e:
|
||||
return public.getJson({})
|
||||
return mw.getJson({})
|
||||
|
||||
|
||||
def saveConf():
|
||||
@@ -164,13 +164,13 @@ def saveConf():
|
||||
print confFile
|
||||
try:
|
||||
args = getArgs()
|
||||
content = public.readFile(confFile)
|
||||
content = mw.readFile(confFile)
|
||||
content = re.sub('IP=.+', 'IP=' + args['ip'], content)
|
||||
content = re.sub('PORT=\d+', 'PORT=' + args['port'], content)
|
||||
content = re.sub('MAXCONN=\d+', 'MAXCONN=' + args['maxconn'], content)
|
||||
content = re.sub('CACHESIZE=\d+', 'CACHESIZE=' +
|
||||
args['cachesize'], content)
|
||||
public.writeFile(confFile, content)
|
||||
mw.writeFile(confFile, content)
|
||||
restart()
|
||||
return 'save ok'
|
||||
except Exception as e:
|
||||
@@ -180,7 +180,7 @@ def saveConf():
|
||||
|
||||
def initdStatus():
|
||||
if not app_debug:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
initd_bin = getInitDFile()
|
||||
if os.path.exists(initd_bin):
|
||||
@@ -191,20 +191,23 @@ def initdStatus():
|
||||
def initdInstall():
|
||||
import shutil
|
||||
if not app_debug:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
mem_bin = initDreplace()
|
||||
initd_bin = getInitDFile()
|
||||
shutil.copyfile(mem_bin, initd_bin)
|
||||
public.execShell('chmod +x ' + initd_bin)
|
||||
mw.execShell('chmod +x ' + initd_bin)
|
||||
mw.execShell('chkconfig --add ' + getPluginName())
|
||||
return 'ok'
|
||||
|
||||
|
||||
def initdUinstall():
|
||||
if not app_debug:
|
||||
if public.isAppleSystem():
|
||||
if mw.isAppleSystem():
|
||||
return "Apple Computer does not support"
|
||||
|
||||
mw.execShell('chkconfig --del ' + getPluginName())
|
||||
initd_bin = getInitDFile()
|
||||
os.remove(initd_bin)
|
||||
return 'ok'
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"sort": 7,
|
||||
"ps": "Memcached 是一个高性能的分布式内存对象缓存系统",
|
||||
"ps": "是一个高性能的分布式内存对象缓存系统",
|
||||
"name": "memcached",
|
||||
"title": "Memcached",
|
||||
"shell": "install.sh",
|
||||
"versions":["1.5"],
|
||||
"updates":["1.5.12"],
|
||||
"versions":["1.6"],
|
||||
"updates":["1.6.9"],
|
||||
"tip": "soft",
|
||||
"checks": "server/memcached",
|
||||
"path":"server/memcached",
|
||||
"display": 1,
|
||||
"author": "Zend",
|
||||
"date": "2017-04-01",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
@@ -7,35 +8,31 @@ rootPath=$(dirname "$curPath")
|
||||
rootPath=$(dirname "$rootPath")
|
||||
serverPath=$(dirname "$rootPath")
|
||||
|
||||
|
||||
install_tmp=${rootPath}/tmp/bt_install.pl
|
||||
install_tmp=${rootPath}/tmp/mw_install.pl
|
||||
|
||||
|
||||
Install_mem()
|
||||
{
|
||||
Install_mem(){
|
||||
mkdir -p $serverPath/source
|
||||
|
||||
echo '正在安装脚本文件...' > $install_tmp
|
||||
|
||||
if [ ! -f $serverPath/source/memcached.tar.gz ];then
|
||||
wget -O $serverPath/source/memcached.tar.gz http://www.memcached.org/files/memcached-1.5.12.tar.gz
|
||||
if
|
||||
wget -O $serverPath/source/memcached.tar.gz http://www.memcached.org/files/memcached-1.6.9.tar.gz
|
||||
fi
|
||||
|
||||
cd $serverPath/source && tar -zxvf memcached.tar.gz
|
||||
|
||||
mkdir -p $serverPath/memcached
|
||||
cd memcached* && ./configure --prefix=$serverPath/memcached && make && make install
|
||||
|
||||
echo '1.5' > $serverPath/memcached/version.pl
|
||||
|
||||
echo '安装完成' > $install_tmp
|
||||
cd $serverPath/source/memcached*
|
||||
./configure --prefix=$serverPath/memcached && make && make install
|
||||
|
||||
echo '1.6' > $serverPath/memcached/version.pl
|
||||
echo 'install ok' > $install_tmp
|
||||
}
|
||||
|
||||
Uninstall_mem()
|
||||
{
|
||||
$serverPath/memcached/init.d/memcached stop
|
||||
rm -rf mkdir -p $serverPath/memcached
|
||||
${serverPath}/memcached/init.d/memcached stop
|
||||
rm -rf $serverPath/memcached
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import sys
|
||||
sys.path.append("/usr/local/lib/python2.7/site-packages")
|
||||
|
||||
|
||||
class mysql:
|
||||
class mysqlDb:
|
||||
__DB_PASS = None
|
||||
__DB_USER = 'root'
|
||||
__DB_PORT = 3306
|
||||
@@ -20,7 +20,7 @@ class mysql:
|
||||
def __Conn(self):
|
||||
'''连接MYSQL数据库'''
|
||||
try:
|
||||
import public
|
||||
import mw
|
||||
socket = '/tmp/mysql.sock'
|
||||
try:
|
||||
import MySQLdb
|
||||
@@ -28,13 +28,13 @@ class mysql:
|
||||
self.__DB_ERR = ex
|
||||
return False
|
||||
try:
|
||||
myconf = public.readFile(self.__DB_CNF)
|
||||
myconf = mw.readFile(self.__DB_CNF)
|
||||
rep = "port\s*=\s*([0-9]+)"
|
||||
self.__DB_PORT = int(re.search(rep, myconf).groups()[0])
|
||||
except:
|
||||
self.__DB_PORT = 3306
|
||||
# print self.__DB_PASS
|
||||
#self.__DB_PASS = public.M('config').where('id=?', (1,)).getField('mysql_root')
|
||||
#self.__DB_PASS = mw.M('config').where('id=?', (1,)).getField('mysql_root')
|
||||
try:
|
||||
self.__DB_CONN = MySQLdb.connect(host=self.__DB_HOST, user=self.__DB_USER, passwd=self.__DB_PASS,
|
||||
port=self.__DB_PORT, charset="utf8", connect_timeout=1, unix_socket=socket)
|
||||
@@ -48,6 +48,9 @@ class mysql:
|
||||
self.__DB_ERR = e
|
||||
return False
|
||||
|
||||
def setDbConf(self, conf):
|
||||
self.__DB_CNF = conf
|
||||
|
||||
def setPwd(self, pwd):
|
||||
self.__DB_PASS = pwd
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
[client]
|
||||
user = root
|
||||
#password = your_password
|
||||
port = 3306
|
||||
socket = /tmp/mysql.sock
|
||||
socket = {$SERVER_APP_PATH}/mysql.sock
|
||||
|
||||
[mysqld]
|
||||
# 5.6
|
||||
#default-authentication-plugin=sha256_password
|
||||
port = 3306
|
||||
socket = /tmp/mysql.sock
|
||||
socket = {$SERVER_APP_PATH}/mysql.sock
|
||||
datadir = {$SERVER_APP_PATH}/data
|
||||
log-error = {$SERVER_APP_PATH}/data/error.log
|
||||
default_storage_engine = MyISAM
|
||||
#skip-external-locking
|
||||
#loose-skip-innodb
|
||||
key_buffer_size = 8M
|
||||
max_allowed_packet = 100G
|
||||
max_allowed_packet = 100M
|
||||
table_open_cache = 32
|
||||
sort_buffer_size = 256K
|
||||
net_buffer_length = 4K
|
||||
@@ -20,15 +21,21 @@ read_buffer_size = 128K
|
||||
read_rnd_buffer_size = 256K
|
||||
myisam_sort_buffer_size = 4M
|
||||
thread_cache_size = 4
|
||||
lower_case_table_names=2
|
||||
query_cache_size = 4M
|
||||
tmp_table_size = 8M
|
||||
|
||||
#skip-networking
|
||||
#skip-name-resolve
|
||||
max_connections = 500
|
||||
max_connect_errors = 100
|
||||
open_files_limit = 65535
|
||||
|
||||
#skip-networking
|
||||
#skip-name-resolve
|
||||
#skip-external-locking
|
||||
#loose-skip-innodb
|
||||
#skip-grant-tables
|
||||
|
||||
|
||||
log-bin=mysql-bin
|
||||
binlog_format=mixed
|
||||
server-id = 1
|
||||
@@ -38,6 +45,24 @@ 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
|
||||
#binlog-do-db
|
||||
binlog-ignore-db = test
|
||||
binlog-ignore-db = mysql
|
||||
binlog-ignore-db = information_schema
|
||||
binlog-ignore-db = performance_schema
|
||||
|
||||
#slave
|
||||
log-slave-updates
|
||||
#replicate-do-db
|
||||
replicate-ignore-db = information_schema
|
||||
replicate-ignore-db = performance_schema
|
||||
replicate-ignore-db = mysql
|
||||
replicate-ignore-db = test
|
||||
|
||||
default_storage_engine = InnoDB
|
||||
innodb_data_home_dir = {$SERVER_APP_PATH}/data
|
||||
innodb_data_file_path = ibdata1:10M:autoextend
|
||||
|
||||
92
plugins/mysql/conf/my8.0.cnf
Normal file
@@ -0,0 +1,92 @@
|
||||
[client]
|
||||
user = root
|
||||
#password = your_password
|
||||
port = 3306
|
||||
socket = {$SERVER_APP_PATH}/mysql.sock
|
||||
default-character-set = UTF8MB4
|
||||
|
||||
[mysqld]
|
||||
port = 3306
|
||||
socket = {$SERVER_APP_PATH}/mysql.sock
|
||||
datadir = {$SERVER_APP_PATH}/data
|
||||
log-error = {$SERVER_APP_PATH}/data/error.log
|
||||
default_storage_engine = MyISAM
|
||||
|
||||
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=2
|
||||
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
|
||||
server-id = 1
|
||||
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
|
||||
#binlog-do-db
|
||||
binlog-ignore-db = test
|
||||
binlog-ignore-db = mysql
|
||||
binlog-ignore-db = information_schema
|
||||
binlog-ignore-db = performance_schema
|
||||
|
||||
#slave
|
||||
log-slave-updates
|
||||
#replicate-do-db
|
||||
replicate-ignore-db = information_schema
|
||||
replicate-ignore-db = performance_schema
|
||||
replicate-ignore-db = mysql
|
||||
replicate-ignore-db = test
|
||||
|
||||
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_log_file_size = 5M
|
||||
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
|
||||
|
||||
[mysqldump]
|
||||
quick
|
||||
|
||||
[mysql]
|
||||
no-auto-rehash
|
||||
|
||||
[myisamchk]
|
||||
key_buffer_size = 20M
|
||||
sort_buffer_size = 20M
|
||||
read_buffer = 2M
|
||||
write_buffer = 2M
|
||||
|
||||
[mysqlhotcopy]
|
||||
interactive-timeout
|
||||
@@ -15,3 +15,14 @@ CREATE TABLE IF NOT EXISTS `databases` (
|
||||
`ps` TEXT,
|
||||
`addtime` TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `master_replication_user` (
|
||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
`username` TEXT,
|
||||
`password` TEXT,
|
||||
`accept` TEXT,
|
||||
`ps` TEXT,
|
||||
`addtime` TEXT
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 515 B After Width: | Height: | Size: 388 B |
@@ -1,3 +1,28 @@
|
||||
<div class="bt-form">
|
||||
<div class='plugin_version'></div>
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<script type="text/javascript">console.log($('.plugin_version').attr('version'));</script>
|
||||
<p class="bgw" onclick="pluginService('mysql', $('.plugin_version').attr('version'));">服务</p>
|
||||
<p onclick="pluginInitD('mysql', $('.plugin_version').attr('version'));">自启动</p>
|
||||
<p onclick="pluginConfig('mysql', $('.plugin_version').attr('version'));">配置文件</p>
|
||||
<p onclick="myDbPos();">存储位置</p>
|
||||
<p onclick="myPort();">端口</p>
|
||||
<p onclick="runInfo();">当前状态</p>
|
||||
<p onclick="myPerfOpt();">性能优化</p>
|
||||
<p onclick="myLogs();">日志</p>
|
||||
<p onclick="pluginLogs('mysql',$('.plugin_version').attr('version'),'show_log');">慢日志</p>
|
||||
<p onclick="dbList()">管理列表</p>
|
||||
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<style type="text/css">
|
||||
.db_list{
|
||||
padding: 0px 0 10px 0;
|
||||
@@ -25,28 +50,9 @@
|
||||
margin-right: 0;
|
||||
}
|
||||
</style>
|
||||
<div class="bt-form">
|
||||
<div class="bt-w-main">
|
||||
<div class="bt-w-menu">
|
||||
<p class="bgw" onclick="pluginService('mysql');">服务</p>
|
||||
<p onclick="pluginInitD('mysql');">自启动</p>
|
||||
<p onclick="pluginConfig('mysql');">配置文件</p>
|
||||
<p onclick="myPort();">端口</p>
|
||||
<p onclick="runInfo();">当前状态</p>
|
||||
<p onclick="myPerfOpt();">性能优化</p>
|
||||
<p onclick="myLogs();">日志</p>
|
||||
<p onclick="pluginLogs('mysql','','show_log');">慢日志</p>
|
||||
<p onclick="dbList()">管理列表</p>
|
||||
</div>
|
||||
<div class="bt-w-con pd15">
|
||||
<div class="soft-man-con"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
resetPluginWinWidth(800);
|
||||
pluginService('mysql');
|
||||
$.getScript( "/plugins/file?name=mysql&f=js/mysql.js");
|
||||
$.getScript( "/plugins/file?name=mysql&f=js/mysql.js", function(){
|
||||
pluginService('mysql',$('.plugin_version').attr('version'));
|
||||
});
|
||||
</script>
|
||||