InPanel 1.2.6__tar.gz → 1.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. {inpanel-1.2.6 → inpanel-1.2.8}/InPanel.egg-info/PKG-INFO +55 -39
  2. {inpanel-1.2.6 → inpanel-1.2.8}/InPanel.egg-info/SOURCES.txt +29 -3
  3. inpanel-1.2.8/MANIFEST.in +6 -0
  4. {inpanel-1.2.6 → inpanel-1.2.8}/PKG-INFO +55 -39
  5. {inpanel-1.2.6 → inpanel-1.2.8}/README.md +53 -6
  6. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/app.py +2 -1
  7. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/base.py +14 -8
  8. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/config.py +1 -1
  9. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/lib/filelock.py +1 -1
  10. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/lib/pxssh.py +2 -2
  11. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/acme.py +16 -18
  12. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/aliyuncs.py +3 -4
  13. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/apt.py +35 -35
  14. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/brew.py +46 -46
  15. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/certificate.py +7 -7
  16. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/config.py +3 -3
  17. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/cron.py +7 -7
  18. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/disk.py +19 -22
  19. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/dnf.py +25 -25
  20. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/docker_source.py +30 -30
  21. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/file.py +443 -154
  22. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/ftp.py +19 -19
  23. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/httpd.py +10 -10
  24. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/login.py +7 -8
  25. inpanel-1.2.8/inpanel/mod/logs.py +840 -0
  26. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/mysql.py +68 -69
  27. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/nginx.py +2326 -2326
  28. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/php.py +7 -7
  29. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/pip.py +13 -13
  30. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/process.py +3 -3
  31. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/query.py +4 -4
  32. inpanel-1.2.8/inpanel/mod/redis.py +518 -0
  33. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/remote.py +10 -10
  34. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/server.py +93 -97
  35. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/service.py +15 -14
  36. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/setting.py +3 -3
  37. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/ssh.py +324 -324
  38. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/task.py +2 -1
  39. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/user.py +5 -5
  40. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/yum.py +50 -50
  41. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/css/global.css +5 -14
  42. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/index.html +6 -2
  43. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/controllers.js +0 -9
  44. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/database.js +258 -12
  45. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/file.js +139 -42
  46. inpanel-1.2.8/inpanel/public/js/controllers/logs.js +291 -0
  47. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/utils.js +182 -23
  48. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/core.js +247 -246
  49. inpanel-1.2.8/inpanel/public/lib/codemirror/addon/edit/matchbrackets.min.js +1 -0
  50. inpanel-1.2.8/inpanel/public/lib/codemirror/addon/search/match-highlighter.min.js +1 -0
  51. inpanel-1.2.8/inpanel/public/lib/codemirror/addon/selection/active-line.min.js +1 -0
  52. inpanel-1.2.8/inpanel/public/lib/codemirror/codemirror.min.css +1 -0
  53. inpanel-1.2.8/inpanel/public/lib/codemirror/codemirror.min.js +1 -0
  54. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/css/css.min.js +1 -0
  55. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/diff/diff.min.js +1 -0
  56. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/dockerfile/dockerfile.min.js +1 -0
  57. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/go/go.min.js +1 -0
  58. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/htmlmixed/htmlmixed.min.js +1 -0
  59. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/javascript/javascript.min.js +1 -0
  60. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/lua/lua.min.js +1 -0
  61. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/markdown/markdown.min.js +1 -0
  62. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/nginx/nginx.min.js +1 -0
  63. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/perl/perl.min.js +1 -0
  64. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/php/php.min.js +1 -0
  65. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/properties/properties.min.js +1 -0
  66. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/python/python.min.js +1 -0
  67. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/ruby/ruby.min.js +1 -0
  68. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/rust/rust.min.js +1 -0
  69. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/shell/shell.min.js +1 -0
  70. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/sql/sql.min.js +1 -0
  71. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/toml/toml.min.js +1 -0
  72. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/xml/xml.min.js +1 -0
  73. inpanel-1.2.8/inpanel/public/lib/codemirror/mode/yaml/yaml.min.js +1 -0
  74. inpanel-1.2.8/inpanel/public/partials/database/index.html +401 -0
  75. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/file/trash.html +4 -2
  76. inpanel-1.2.8/inpanel/public/partials/logs.html +442 -0
  77. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/index.html +20 -20
  78. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/sources.html +181 -126
  79. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/templates/index.html +6 -2
  80. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/utils.py +9 -10
  81. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/web.py +65 -40
  82. {inpanel-1.2.6 → inpanel-1.2.8}/pyproject.toml +8 -7
  83. inpanel-1.2.6/MANIFEST.in +0 -2
  84. inpanel-1.2.6/inpanel/public/lib/codemirror/codemirror-compressed.js +0 -1
  85. inpanel-1.2.6/inpanel/public/lib/codemirror/codemirror.css +0 -173
  86. inpanel-1.2.6/inpanel/public/partials/database/index.html +0 -172
  87. inpanel-1.2.6/inpanel/public/partials/log.html +0 -83
  88. {inpanel-1.2.6 → inpanel-1.2.8}/InPanel.egg-info/dependency_links.txt +0 -0
  89. {inpanel-1.2.6 → inpanel-1.2.8}/InPanel.egg-info/entry_points.txt +0 -0
  90. {inpanel-1.2.6 → inpanel-1.2.8}/InPanel.egg-info/requires.txt +0 -0
  91. {inpanel-1.2.6 → inpanel-1.2.8}/InPanel.egg-info/top_level.txt +0 -0
  92. {inpanel-1.2.6 → inpanel-1.2.8}/LICENSE +0 -0
  93. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/__init__.py +0 -0
  94. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/lib/__init__.py +0 -0
  95. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/lib/async_process.py +0 -0
  96. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/lib/magic.py +0 -0
  97. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/lib/pyDes.py +0 -0
  98. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/__init__.py +0 -0
  99. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/docker.py +0 -0
  100. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/firewall.py +0 -0
  101. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/firewall_base.py +0 -0
  102. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/firewall_firewalld.py +0 -0
  103. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/firewall_iptables.py +0 -0
  104. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/firewall_macos.py +0 -0
  105. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/firewall_ufw.py +0 -0
  106. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/lighttpd.py +0 -0
  107. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/named.py +0 -0
  108. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package.py +0 -0
  109. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package_apt.py +0 -0
  110. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package_base.py +0 -0
  111. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package_brew.py +0 -0
  112. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package_dnf.py +0 -0
  113. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package_map.py +0 -0
  114. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/package_yum.py +0 -0
  115. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/plugins.py +0 -0
  116. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/proftpd.py +0 -0
  117. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/pureftpd.py +0 -0
  118. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/service_manager.py +0 -0
  119. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/shell.py +0 -0
  120. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/system.py +0 -0
  121. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/mod/vsftpd.py +0 -0
  122. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/plugin.py +0 -0
  123. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/favicon.ico +0 -0
  124. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/images/alipay.jpg +0 -0
  125. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/images/loading.gif +0 -0
  126. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/images/weixin.jpg +0 -0
  127. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/container.js +0 -0
  128. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/ecs.js +0 -0
  129. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/plugins.js +0 -0
  130. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/service.js +0 -0
  131. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/controllers/site.js +0 -0
  132. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/directives.js +0 -0
  133. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/filters.js +0 -0
  134. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/js/services.js +0 -0
  135. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/angular/1.0.2/angular-resource.min.js +0 -0
  136. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/angular/1.0.2/angular.min.js +0 -0
  137. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/angular/1.0.8/angular.min.js +0 -0
  138. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css +0 -0
  139. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +0 -0
  140. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +0 -0
  141. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +0 -0
  142. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap.css +0 -0
  143. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap.css.map +0 -0
  144. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap.min.css +0 -0
  145. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +0 -0
  146. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  147. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
  148. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  149. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  150. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  151. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  152. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  153. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/js/bootstrap.js +0 -0
  154. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/js/bootstrap.min.js +0 -0
  155. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/bootstrap/js/npm.js +0 -0
  156. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/jquery/jquery-1.12.4.min.js +0 -0
  157. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/md5/md5.js +0 -0
  158. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/lib/md5/md5.min.js +0 -0
  159. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/message.html +0 -0
  160. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/navbar.html +0 -0
  161. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/selector.html +0 -0
  162. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvbase.html +0 -0
  163. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvext.html +0 -0
  164. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvfile.html +0 -0
  165. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvinstall.html +0 -0
  166. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvlog.html +0 -0
  167. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvminiop.html +0 -0
  168. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvuninstall.html +0 -0
  169. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/directives/srvupdate.html +0 -0
  170. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/container/index.html +0 -0
  171. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/database/mysql/dbedit.html +0 -0
  172. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/database/mysql/dbnew.html +0 -0
  173. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/database/mysql/useredit.html +0 -0
  174. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/database/mysql/usernew.html +0 -0
  175. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/ecs/account.html +0 -0
  176. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/ecs/ecs.html +0 -0
  177. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/ecs/index.html +0 -0
  178. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/ecs/setings.html +0 -0
  179. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/file/file.html +0 -0
  180. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/ftp.html +0 -0
  181. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/login.html +0 -0
  182. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/logout.html +0 -0
  183. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/main.html +0 -0
  184. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/plugins/config.html +0 -0
  185. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/plugins/detail.html +0 -0
  186. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/plugins/index.html +0 -0
  187. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/plugins/info.html +0 -0
  188. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/secure.html +0 -0
  189. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/apache.html +0 -0
  190. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/cron.html +0 -0
  191. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/fail2ban.html +0 -0
  192. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/firewalld.html +0 -0
  193. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/index.html +0 -0
  194. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/iptables.html +0 -0
  195. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/java11.html +0 -0
  196. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/java17.html +0 -0
  197. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/java21.html +0 -0
  198. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/java8.html +0 -0
  199. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/lighttpd.html +0 -0
  200. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/mariadb.html +0 -0
  201. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/memcache.html +0 -0
  202. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/minio.html +0 -0
  203. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/mongodb.html +0 -0
  204. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/mysql.html +0 -0
  205. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/named.html +0 -0
  206. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/nginx.html +0 -0
  207. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/nodejs18.html +0 -0
  208. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/nodejs20.html +0 -0
  209. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/nodejs22.html +0 -0
  210. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/nodejs24.html +0 -0
  211. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/ntp.html +0 -0
  212. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php.html +0 -0
  213. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php56.html +0 -0
  214. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php74.html +0 -0
  215. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php80.html +0 -0
  216. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php81.html +0 -0
  217. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php82.html +0 -0
  218. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php83.html +0 -0
  219. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/php84.html +0 -0
  220. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/proftpd.html +0 -0
  221. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/pureftpd.html +0 -0
  222. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/redis.html +0 -0
  223. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/samba.html +0 -0
  224. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/sendmail.html +0 -0
  225. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/ssh.html +0 -0
  226. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/tomcat.html +0 -0
  227. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/ufw.html +0 -0
  228. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/service/vsftpd.html +0 -0
  229. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/setting.html +0 -0
  230. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/site/apache/site.html +0 -0
  231. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/site/index.html +0 -0
  232. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/site/nginx/site.html +0 -0
  233. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/sorry.html +0 -0
  234. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/storage/autofm.html +0 -0
  235. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/storage/backup.html +0 -0
  236. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/storage/index.html +0 -0
  237. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/storage/migrate.html +0 -0
  238. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/storage/movedata.html +0 -0
  239. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/storage/remote.html +0 -0
  240. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/cron.html +0 -0
  241. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/firewall.html +0 -0
  242. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/network.html +0 -0
  243. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/process.html +0 -0
  244. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/shell.html +0 -0
  245. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/ssl.html +0 -0
  246. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/task.html +0 -0
  247. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/time.html +0 -0
  248. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/partials/utils/user.html +0 -0
  249. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/robots.txt +0 -0
  250. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/public/templates/file/preview.html +0 -0
  251. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/__init__.py +0 -0
  252. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/__init__.py +0 -0
  253. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/_common.json +0 -0
  254. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/categories.json +0 -0
  255. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/database.json +0 -0
  256. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/ftp.json +0 -0
  257. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/http.json +0 -0
  258. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/java.json +0 -0
  259. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/mail.json +0 -0
  260. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/nodejs.json +0 -0
  261. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/php.json +0 -0
  262. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/security.json +0 -0
  263. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/storage.json +0 -0
  264. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/services/system.json +0 -0
  265. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/__init__.py +0 -0
  266. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/apt.json +0 -0
  267. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/brew.json +0 -0
  268. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/dnf.json +0 -0
  269. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/docker.json +0 -0
  270. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/package_map.json +0 -0
  271. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/pip.json +0 -0
  272. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/third_party.json +0 -0
  273. {inpanel-1.2.6 → inpanel-1.2.8}/inpanel/templates/sources/yum.json +0 -0
  274. {inpanel-1.2.6 → inpanel-1.2.8}/setup.cfg +0 -0
@@ -1,40 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.6
3
+ Version: 1.2.8
4
4
  Summary: InPanel - A Server Management Tool
5
5
  Author-email: Jackson Dou <jksdou@qq.com>
6
6
  Maintainer-email: Jackson Dou <jksdou@qq.com>
7
- License: BSD 3-Clause License
8
-
9
- Copyright (c) 2017-2026, Jackson Dou
10
- Copyright (c) 2012-2013, VPSMate development team
11
- All rights reserved.
12
-
13
- Redistribution and use in source and binary forms, with or without
14
- modification, are permitted provided that the following conditions are met:
15
-
16
- 1. Redistributions of source code must retain the above copyright notice, this
17
- list of conditions and the following disclaimer.
18
-
19
- 2. Redistributions in binary form must reproduce the above copyright notice,
20
- this list of conditions and the following disclaimer in the documentation
21
- and/or other materials provided with the distribution.
22
-
23
- 3. Neither the name of the copyright holder nor the names of its
24
- contributors may be used to endorse or promote products derived from
25
- this software without specific prior written permission.
26
-
27
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
31
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
33
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
35
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
-
7
+ License: BSD-3-Clause
38
8
  Project-URL: Homepage, https://inpanel.org
39
9
  Project-URL: Repository, https://github.com/inpanel/inpanel
40
10
  Project-URL: Documentation, https://inpanel.org
@@ -44,7 +14,6 @@ Classifier: Development Status :: 5 - Production/Stable
44
14
  Classifier: Environment :: Web Environment
45
15
  Classifier: Framework :: AsyncIO
46
16
  Classifier: Intended Audience :: System Administrators
47
- Classifier: License :: OSI Approved :: BSD License
48
17
  Classifier: Operating System :: POSIX :: Linux
49
18
  Classifier: Programming Language :: Python :: 3
50
19
  Classifier: Programming Language :: Python :: 3.6
@@ -370,18 +339,65 @@ inpanel run
370
339
 
371
340
  ### 构建安装包
372
341
 
342
+ 使用项目提供的构建脚本构建各类安装包:
343
+
344
+ ```bash
345
+ # 进入项目目录
346
+ cd inpanel
347
+
348
+ # 构建 pip 包(wheel + sdist)
349
+ bash scripts/build_pip.sh
350
+
351
+ # 构建并上传 pip 包到 PyPI
352
+ bash scripts/build_pip.sh upload
353
+
354
+ # 一键构建 RPM 和 DEB 包
355
+ bash scripts/build_package.sh
356
+
357
+ # 或单独构建
358
+ bash scripts/build_rpm.sh # 仅构建 RPM
359
+ bash scripts/build_deb.sh # 仅构建 DEB
360
+ ```
361
+
362
+ #### 构建依赖
363
+
364
+ 构建脚本依赖以下工具,请根据系统安装:
365
+
366
+ | 依赖 | 用途 | 安装命令 |
367
+ |------|------|----------|
368
+ | `python3` | Python 运行环境 | 系统通常已自带 |
369
+ | `python3-build` | 构建 Python 包(wheel/sdist) | `pip install build` |
370
+ | `twine` | 上传 pip 包到 PyPI | `pip install twine` |
371
+ | `rpmbuild` | RPM 包构建(CentOS/RHEL) | `yum install rpm-build` |
372
+ | `dpkg-buildpackage` | DEB 包构建(Debian/Ubuntu) | `apt-get install dpkg-dev` |
373
+ | `debhelper` | DEB 包构建辅助工具 | `apt-get install debhelper` |
374
+ | `python3-all` | DEB 包 Python 兼容性 | `apt-get install python3-all` |
375
+ | `python3-setuptools` | DEB 包 setuptools 支持 | `apt-get install python3-setuptools` |
376
+
377
+ #### 完整依赖安装示例
378
+
379
+ **所有平台**(构建 pip 包 / 上传 PyPI):
380
+
373
381
  ```bash
374
- # 构建 pip
382
+ pip install build twine
383
+ ```
384
+
385
+ **Debian / Ubuntu**(构建 DEB 包):
386
+
387
+ ```bash
388
+ sudo apt-get install -y debhelper python3-all python3-setuptools dpkg-dev
375
389
  pip install build
376
- python -m build
390
+ ```
377
391
 
378
- # 构建 RPM 包(需要 rpmbuild)
379
- rpmbuild -bb rpmbuild.spec
392
+ **CentOS / RHEL**(构建 RPM 包):
380
393
 
381
- # 构建 DEB 包(需要 debuild)
382
- debuild -us -uc
394
+ ```bash
395
+ sudo yum install -y rpm-build
396
+ pip install build
383
397
  ```
384
398
 
399
+ 构建产物默认输出到项目目录下的 `packages/` 目录。
400
+
385
401
  ## 账号和密码
386
402
 
387
403
  默认用户名:`admin`
@@ -44,6 +44,7 @@ inpanel/mod/ftp.py
44
44
  inpanel/mod/httpd.py
45
45
  inpanel/mod/lighttpd.py
46
46
  inpanel/mod/login.py
47
+ inpanel/mod/logs.py
47
48
  inpanel/mod/mysql.py
48
49
  inpanel/mod/named.py
49
50
  inpanel/mod/nginx.py
@@ -61,6 +62,7 @@ inpanel/mod/process.py
61
62
  inpanel/mod/proftpd.py
62
63
  inpanel/mod/pureftpd.py
63
64
  inpanel/mod/query.py
65
+ inpanel/mod/redis.py
64
66
  inpanel/mod/remote.py
65
67
  inpanel/mod/server.py
66
68
  inpanel/mod/service.py
@@ -89,6 +91,7 @@ inpanel/public/js/controllers/controllers.js
89
91
  inpanel/public/js/controllers/database.js
90
92
  inpanel/public/js/controllers/ecs.js
91
93
  inpanel/public/js/controllers/file.js
94
+ inpanel/public/js/controllers/logs.js
92
95
  inpanel/public/js/controllers/plugins.js
93
96
  inpanel/public/js/controllers/service.js
94
97
  inpanel/public/js/controllers/site.js
@@ -114,15 +117,38 @@ inpanel/public/lib/bootstrap/img/glyphicons-halflings.png
114
117
  inpanel/public/lib/bootstrap/js/bootstrap.js
115
118
  inpanel/public/lib/bootstrap/js/bootstrap.min.js
116
119
  inpanel/public/lib/bootstrap/js/npm.js
117
- inpanel/public/lib/codemirror/codemirror-compressed.js
118
- inpanel/public/lib/codemirror/codemirror.css
120
+ inpanel/public/lib/codemirror/codemirror.min.css
121
+ inpanel/public/lib/codemirror/codemirror.min.js
122
+ inpanel/public/lib/codemirror/addon/edit/matchbrackets.min.js
123
+ inpanel/public/lib/codemirror/addon/search/match-highlighter.min.js
124
+ inpanel/public/lib/codemirror/addon/selection/active-line.min.js
125
+ inpanel/public/lib/codemirror/mode/css/css.min.js
126
+ inpanel/public/lib/codemirror/mode/diff/diff.min.js
127
+ inpanel/public/lib/codemirror/mode/dockerfile/dockerfile.min.js
128
+ inpanel/public/lib/codemirror/mode/go/go.min.js
129
+ inpanel/public/lib/codemirror/mode/htmlmixed/htmlmixed.min.js
130
+ inpanel/public/lib/codemirror/mode/javascript/javascript.min.js
131
+ inpanel/public/lib/codemirror/mode/lua/lua.min.js
132
+ inpanel/public/lib/codemirror/mode/markdown/markdown.min.js
133
+ inpanel/public/lib/codemirror/mode/nginx/nginx.min.js
134
+ inpanel/public/lib/codemirror/mode/perl/perl.min.js
135
+ inpanel/public/lib/codemirror/mode/php/php.min.js
136
+ inpanel/public/lib/codemirror/mode/properties/properties.min.js
137
+ inpanel/public/lib/codemirror/mode/python/python.min.js
138
+ inpanel/public/lib/codemirror/mode/ruby/ruby.min.js
139
+ inpanel/public/lib/codemirror/mode/rust/rust.min.js
140
+ inpanel/public/lib/codemirror/mode/shell/shell.min.js
141
+ inpanel/public/lib/codemirror/mode/sql/sql.min.js
142
+ inpanel/public/lib/codemirror/mode/toml/toml.min.js
143
+ inpanel/public/lib/codemirror/mode/xml/xml.min.js
144
+ inpanel/public/lib/codemirror/mode/yaml/yaml.min.js
119
145
  inpanel/public/lib/jquery/jquery-1.12.4.min.js
120
146
  inpanel/public/lib/md5/md5.js
121
147
  inpanel/public/lib/md5/md5.min.js
122
148
  inpanel/public/partials/ftp.html
123
- inpanel/public/partials/log.html
124
149
  inpanel/public/partials/login.html
125
150
  inpanel/public/partials/logout.html
151
+ inpanel/public/partials/logs.html
126
152
  inpanel/public/partials/main.html
127
153
  inpanel/public/partials/secure.html
128
154
  inpanel/public/partials/setting.html
@@ -0,0 +1,6 @@
1
+ exclude test/*
2
+ exclude tests/*
3
+ prune inpanel/data
4
+ prune inpanel/data/plugins
5
+ global-exclude *.pyc
6
+ global-exclude __pycache__
@@ -1,40 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.6
3
+ Version: 1.2.8
4
4
  Summary: InPanel - A Server Management Tool
5
5
  Author-email: Jackson Dou <jksdou@qq.com>
6
6
  Maintainer-email: Jackson Dou <jksdou@qq.com>
7
- License: BSD 3-Clause License
8
-
9
- Copyright (c) 2017-2026, Jackson Dou
10
- Copyright (c) 2012-2013, VPSMate development team
11
- All rights reserved.
12
-
13
- Redistribution and use in source and binary forms, with or without
14
- modification, are permitted provided that the following conditions are met:
15
-
16
- 1. Redistributions of source code must retain the above copyright notice, this
17
- list of conditions and the following disclaimer.
18
-
19
- 2. Redistributions in binary form must reproduce the above copyright notice,
20
- this list of conditions and the following disclaimer in the documentation
21
- and/or other materials provided with the distribution.
22
-
23
- 3. Neither the name of the copyright holder nor the names of its
24
- contributors may be used to endorse or promote products derived from
25
- this software without specific prior written permission.
26
-
27
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
31
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
33
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
35
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
-
7
+ License: BSD-3-Clause
38
8
  Project-URL: Homepage, https://inpanel.org
39
9
  Project-URL: Repository, https://github.com/inpanel/inpanel
40
10
  Project-URL: Documentation, https://inpanel.org
@@ -44,7 +14,6 @@ Classifier: Development Status :: 5 - Production/Stable
44
14
  Classifier: Environment :: Web Environment
45
15
  Classifier: Framework :: AsyncIO
46
16
  Classifier: Intended Audience :: System Administrators
47
- Classifier: License :: OSI Approved :: BSD License
48
17
  Classifier: Operating System :: POSIX :: Linux
49
18
  Classifier: Programming Language :: Python :: 3
50
19
  Classifier: Programming Language :: Python :: 3.6
@@ -370,18 +339,65 @@ inpanel run
370
339
 
371
340
  ### 构建安装包
372
341
 
342
+ 使用项目提供的构建脚本构建各类安装包:
343
+
344
+ ```bash
345
+ # 进入项目目录
346
+ cd inpanel
347
+
348
+ # 构建 pip 包(wheel + sdist)
349
+ bash scripts/build_pip.sh
350
+
351
+ # 构建并上传 pip 包到 PyPI
352
+ bash scripts/build_pip.sh upload
353
+
354
+ # 一键构建 RPM 和 DEB 包
355
+ bash scripts/build_package.sh
356
+
357
+ # 或单独构建
358
+ bash scripts/build_rpm.sh # 仅构建 RPM
359
+ bash scripts/build_deb.sh # 仅构建 DEB
360
+ ```
361
+
362
+ #### 构建依赖
363
+
364
+ 构建脚本依赖以下工具,请根据系统安装:
365
+
366
+ | 依赖 | 用途 | 安装命令 |
367
+ |------|------|----------|
368
+ | `python3` | Python 运行环境 | 系统通常已自带 |
369
+ | `python3-build` | 构建 Python 包(wheel/sdist) | `pip install build` |
370
+ | `twine` | 上传 pip 包到 PyPI | `pip install twine` |
371
+ | `rpmbuild` | RPM 包构建(CentOS/RHEL) | `yum install rpm-build` |
372
+ | `dpkg-buildpackage` | DEB 包构建(Debian/Ubuntu) | `apt-get install dpkg-dev` |
373
+ | `debhelper` | DEB 包构建辅助工具 | `apt-get install debhelper` |
374
+ | `python3-all` | DEB 包 Python 兼容性 | `apt-get install python3-all` |
375
+ | `python3-setuptools` | DEB 包 setuptools 支持 | `apt-get install python3-setuptools` |
376
+
377
+ #### 完整依赖安装示例
378
+
379
+ **所有平台**(构建 pip 包 / 上传 PyPI):
380
+
373
381
  ```bash
374
- # 构建 pip
382
+ pip install build twine
383
+ ```
384
+
385
+ **Debian / Ubuntu**(构建 DEB 包):
386
+
387
+ ```bash
388
+ sudo apt-get install -y debhelper python3-all python3-setuptools dpkg-dev
375
389
  pip install build
376
- python -m build
390
+ ```
377
391
 
378
- # 构建 RPM 包(需要 rpmbuild)
379
- rpmbuild -bb rpmbuild.spec
392
+ **CentOS / RHEL**(构建 RPM 包):
380
393
 
381
- # 构建 DEB 包(需要 debuild)
382
- debuild -us -uc
394
+ ```bash
395
+ sudo yum install -y rpm-build
396
+ pip install build
383
397
  ```
384
398
 
399
+ 构建产物默认输出到项目目录下的 `packages/` 目录。
400
+
385
401
  ## 账号和密码
386
402
 
387
403
  默认用户名:`admin`
@@ -302,18 +302,65 @@ inpanel run
302
302
 
303
303
  ### 构建安装包
304
304
 
305
+ 使用项目提供的构建脚本构建各类安装包:
306
+
307
+ ```bash
308
+ # 进入项目目录
309
+ cd inpanel
310
+
311
+ # 构建 pip 包(wheel + sdist)
312
+ bash scripts/build_pip.sh
313
+
314
+ # 构建并上传 pip 包到 PyPI
315
+ bash scripts/build_pip.sh upload
316
+
317
+ # 一键构建 RPM 和 DEB 包
318
+ bash scripts/build_package.sh
319
+
320
+ # 或单独构建
321
+ bash scripts/build_rpm.sh # 仅构建 RPM
322
+ bash scripts/build_deb.sh # 仅构建 DEB
323
+ ```
324
+
325
+ #### 构建依赖
326
+
327
+ 构建脚本依赖以下工具,请根据系统安装:
328
+
329
+ | 依赖 | 用途 | 安装命令 |
330
+ |------|------|----------|
331
+ | `python3` | Python 运行环境 | 系统通常已自带 |
332
+ | `python3-build` | 构建 Python 包(wheel/sdist) | `pip install build` |
333
+ | `twine` | 上传 pip 包到 PyPI | `pip install twine` |
334
+ | `rpmbuild` | RPM 包构建(CentOS/RHEL) | `yum install rpm-build` |
335
+ | `dpkg-buildpackage` | DEB 包构建(Debian/Ubuntu) | `apt-get install dpkg-dev` |
336
+ | `debhelper` | DEB 包构建辅助工具 | `apt-get install debhelper` |
337
+ | `python3-all` | DEB 包 Python 兼容性 | `apt-get install python3-all` |
338
+ | `python3-setuptools` | DEB 包 setuptools 支持 | `apt-get install python3-setuptools` |
339
+
340
+ #### 完整依赖安装示例
341
+
342
+ **所有平台**(构建 pip 包 / 上传 PyPI):
343
+
305
344
  ```bash
306
- # 构建 pip
345
+ pip install build twine
346
+ ```
347
+
348
+ **Debian / Ubuntu**(构建 DEB 包):
349
+
350
+ ```bash
351
+ sudo apt-get install -y debhelper python3-all python3-setuptools dpkg-dev
307
352
  pip install build
308
- python -m build
353
+ ```
309
354
 
310
- # 构建 RPM 包(需要 rpmbuild)
311
- rpmbuild -bb rpmbuild.spec
355
+ **CentOS / RHEL**(构建 RPM 包):
312
356
 
313
- # 构建 DEB 包(需要 debuild)
314
- debuild -us -uc
357
+ ```bash
358
+ sudo yum install -y rpm-build
359
+ pip install build
315
360
  ```
316
361
 
362
+ 构建产物默认输出到项目目录下的 `packages/` 目录。
363
+
317
364
  ## 账号和密码
318
365
 
319
366
  默认用户名:`admin`
@@ -125,7 +125,7 @@ def cmd_start():
125
125
  force_https = config.getboolean('server', 'forcehttps')
126
126
  print(f'InPanel: running on: http{"s" if force_https else ""}://*:{server_port}')
127
127
  else:
128
- print('InPanel: failed to start, check log file: %s' % logfile)
128
+ print(f'InPanel: failed to start, check log file: {logfile}')
129
129
  sys.exit(1)
130
130
  return
131
131
  except OSError as e:
@@ -384,6 +384,7 @@ def run_server():
384
384
  (r'/api/service/(.+?)(?:/(.+))?', web.ServiceHandler),
385
385
  (r'/api/firewall/(.+)', web.FirewallHandler),
386
386
  (r'/api/setting/(.+)', web.SettingHandler),
387
+ (r'/api/logs/(.+)', web.LogsHandler),
387
388
  (r'/api/operation/(.+)', web.OperationHandler),
388
389
  (r'/api/task/(.+)', web.TaskHandler),
389
390
  (r'/api/sitepackage/(.+)', web.SitePackageHandler),
@@ -40,8 +40,8 @@ __author__ = 'Jackson Dou'
40
40
  __license__ = 'BSD'
41
41
 
42
42
  app_name = 'InPanel'
43
- releasetime = '2026-07-22'
44
- DEBUG = True
43
+ releasetime = '2026-07-28'
44
+ DEBUG = False
45
45
  COMMENTFLAG = '#INPANEL#'
46
46
  GENBY = 'AUTOMATICALLY GENERATED BY INPANEL'
47
47
 
@@ -62,14 +62,15 @@ app_api = {
62
62
  }
63
63
 
64
64
  execfile = '/usr/bin/inpanel'
65
- data_path = '/var/lib/inpanel/'
66
65
  config_path = '/etc/inpanel/'
66
+ data_path = '/var/lib/inpanel/'
67
+ logging_path = '/var/log/inpanel/'
67
68
  config_file = '/etc/inpanel/config.ini'
68
69
  lastfile_path = '/etc/inpanel/lastfile.ini'
69
70
  bookmarks_path = '/etc/inpanel/bookmarks.ini'
70
71
  upgrade_path = '/etc/inpanel/upgrade.ini'
71
- history_path = '/etc/inpanel/history.txt'
72
- logging_path = '/var/log/inpanel/'
72
+ files_log = '/var/log/inpanel/files.log'
73
+ filespath_log = '/var/log/inpanel/filespath.log'
73
74
  logfile = '/var/log/inpanel/main.log'
74
75
  logerror = '/var/log/inpanel/error.log'
75
76
  pidfile = '/var/run/inpanel.pid'
@@ -83,7 +84,11 @@ if hasattr(sys, 'frozen') and hasattr(sys, '_MEIPASS'):
83
84
  root_path = sys._MEIPASS
84
85
  else:
85
86
  package_dir = Path(__file__).parent.resolve()
87
+ is_develop_mode = False
86
88
  if package_dir.parts[-2] == 'site-packages' or 'dist-packages' in str(package_dir):
89
+ if Path(__file__).is_symlink():
90
+ is_develop_mode = True
91
+ if not is_develop_mode and (package_dir.parts[-2] == 'site-packages' or 'dist-packages' in str(package_dir)):
87
92
  run_type = 'system'
88
93
  root_path = str(package_dir)
89
94
  pkg_str = str(package_dir)
@@ -101,12 +106,13 @@ else:
101
106
  execfile = str(Path(root_path) / 'app.py')
102
107
  data_path = str(Path(root_path) / 'data')
103
108
  config_path = str(Path(root_path) / 'data')
109
+ logging_path = str(Path(root_path) / 'data')
104
110
  config_file = str(Path(root_path) / 'data' / 'config.ini')
105
111
  lastfile_path = str(Path(root_path) / 'data' / 'lastfile.ini')
106
112
  bookmarks_path = str(Path(root_path) / 'data' / 'bookmarks.ini')
107
113
  upgrade_path = str(Path(root_path) / 'data' / 'upgrade.ini')
108
- history_path = str(Path(root_path) / 'data' / 'history.txt')
109
- logging_path = str(Path(root_path) / 'data')
114
+ files_log = str(Path(root_path) / 'data' / 'files.log')
115
+ filespath_log = str(Path(root_path) / 'data' / 'filespath.log')
110
116
  logfile = str(Path(root_path) / 'data' / 'main.log')
111
117
  logerror = str(Path(root_path) / 'data' / 'error.log')
112
118
  pidfile = str(Path(root_path) / 'data' / 'inpanel.pid')
@@ -199,7 +205,7 @@ __all__ = [
199
205
  'releasetime', 'version_info', 'server_info', 'os_name', 'os_title',
200
206
  'os_version', 'os_versint', 'os_platform', 'kernel_name', 'kernel_release',
201
207
  'kernel_version', 'hostname', 'machine', 'lastfile_path', 'bookmarks_path', 'upgrade_path',
202
- 'history_path', 'logfile', 'logerror', 'pidfile', 'processor'
208
+ 'files_log', 'filespath_log', 'logfile', 'logerror', 'pidfile', 'processor'
203
209
  ]
204
210
 
205
211
  if __name__ == '__main__':
@@ -119,7 +119,7 @@ Examples:
119
119
  key = md5(randstr().encode('utf-8')).hexdigest()
120
120
  md5_password = md5(value.encode('utf-8')).hexdigest()
121
121
  pwd = hmac_new(key.encode('utf-8'), md5_password.encode('utf-8'), md5).hexdigest()
122
- value = '%s:%s' % (pwd, key)
122
+ value = f'{pwd}:{key}'
123
123
  logger.info(f'Password hash generated, key length: {len(key)}, hash length: {len(pwd)}')
124
124
 
125
125
  result = config.set(section, option, value)
@@ -21,7 +21,7 @@ class FileLock(object):
21
21
  the maximum timeout and the delay between each attempt to lock.
22
22
  """
23
23
  self.is_locked = False
24
- self.lockfile = str(Path.cwd() / ("%s.lock" % file_name))
24
+ self.lockfile = str(Path.cwd() / (f"{file_name}.lock"))
25
25
  self.file_name = file_name
26
26
  self.timeout = timeout
27
27
  self.delay = delay
@@ -186,8 +186,8 @@ class pxssh (spawn):
186
186
  if self.force_password:
187
187
  ssh_options = ssh_options + ' ' + self.SSH_OPTS
188
188
  if port is not None:
189
- ssh_options = ssh_options + ' -p %s'%(str(port))
190
- cmd = "ssh %s -l %s %s" % (ssh_options, username, server)
189
+ ssh_options = ssh_options + f' -p {port!s}'
190
+ cmd = f"ssh {ssh_options} -l {username} {server}"
191
191
 
192
192
  # This does not distinguish between a remote server 'password' prompt
193
193
  # and a local ssh 'passphrase' prompt (for unlocking a private key).
@@ -57,7 +57,7 @@ class ACME():
57
57
  proc = Popen(cmd_list, stdin=stdin, stdout=PIPE, stderr=PIPE)
58
58
  out, err = proc.communicate(cmd_input)
59
59
  if proc.returncode != 0:
60
- raise IOError("{0}\n{1}".format(err_msg, err))
60
+ raise IOError(f"{err_msg}\n{err}")
61
61
  return out
62
62
 
63
63
  def _b64(self, b):
@@ -85,8 +85,7 @@ class ACME():
85
85
  if depth < 100 and code == 400 and res_data['type'] == 'urn:ietf:params:acme:error:badNonce':
86
86
  raise IndexError(res_data) # 允许对无效 nonce 重试 100 次
87
87
  if code not in [200, 201, 204]:
88
- raise ValueError("{0}:\nUrl: {1}\nData: {2}\nResponse Code: {3}\nResponse: {4}".format(
89
- err_msg, url, data, code, res_data))
88
+ raise ValueError(f"{err_msg}:\nUrl: {url}\nData: {data}\nResponse Code: {code}\nResponse: {res_data}")
90
89
  return res_data, code, headers
91
90
 
92
91
  def _s_request(self, url, payload, err_msg, depth=0):
@@ -96,7 +95,7 @@ class ACME():
96
95
  protected = {'url': url, 'alg': self.alg, "nonce": new_nonce}
97
96
  protected.update({"jwk": self.jwk} if self.acct_headers is None else {"kid": self.acct_headers['Location']})
98
97
  protected64 = self._b64(dumps(protected).encode('utf8'))
99
- protected_input = "{0}.{1}".format(protected64, payload64).encode('utf8')
98
+ protected_input = f"{protected64}.{payload64}".encode('utf8')
100
99
  cmd = ['openssl', 'dgst', '-sha256', '-sign', self.account_key]
101
100
  out = self._cmd(cmd, stdin=PIPE, cmd_input=protected_input, err_msg='OpenSSL Error')
102
101
  data = dumps({
@@ -146,8 +145,8 @@ class ACME():
146
145
  out = self._cmd(cmd, err_msg='openssl error')
147
146
  pub_pattern = r"modulus:\n\s+00:([a-f0-9\:\s]+?)\npublicExponent: ([0-9]+)"
148
147
  pub_hex, pub_exp = re.search(pub_pattern, out.decode('utf8'), re.MULTILINE | re.DOTALL).groups()
149
- pub_exp = "{0:x}".format(int(pub_exp))
150
- pub_exp = "0{0}".format(pub_exp) if len(pub_exp) % 2 else pub_exp
148
+ pub_exp = f"{int(pub_exp):x}"
149
+ pub_exp = f"0{pub_exp}" if len(pub_exp) % 2 else pub_exp
151
150
  self.jwk = {
152
151
  'e': self._b64(unhexlify(pub_exp.encode('utf-8'))),
153
152
  'kty': 'RSA',
@@ -182,7 +181,7 @@ class ACME():
182
181
  # 查找域名
183
182
  print('Domains CSR parsing...')
184
183
  cmd = ['openssl', 'req', '-in', self.csr, '-noout', '-text']
185
- out = self._cmd(cmd, err_msg="Error loading {0}".format(self.csr))
184
+ out = self._cmd(cmd, err_msg=f"Error loading {self.csr}")
186
185
  domains = set([])
187
186
  common_name = re.search(r"Subject:.*? CN\s?=\s?([^\s,;/]+)", out.decode('utf8'))
188
187
  if common_name is not None:
@@ -193,7 +192,7 @@ class ACME():
193
192
  for san in subject_alt_names.group(1).split(", "):
194
193
  if san.startswith("DNS:"):
195
194
  domains.add(san[4:])
196
- print("Found domains: {0}".format(", ".join(domains)))
195
+ print(f"Found domains: {', '.join(domains)}")
197
196
  # print('domains', domains)
198
197
  if order == True:
199
198
  self.create_new_order(domains)
@@ -213,32 +212,31 @@ class ACME():
213
212
  for auth_url in order['authorizations']:
214
213
  authorization, _, _ = self._request(auth_url, err_msg='Error getting challenges')
215
214
  domain = authorization['identifier']['value']
216
- print("Domain {0} Verifying...".format(domain))
215
+ print(f"Domain {domain} Verifying...")
217
216
 
218
217
  # 找到 http-01 挑战并写入挑战文件
219
218
  challenge = [c for c in authorization['challenges'] if c['type'] == "http-01"][0]
220
219
  token = re.sub(r"[^A-Za-z0-9_\-]", "_", challenge['token'])
221
- key_auth = "{0}.{1}".format(token, self.thumbprint)
220
+ key_auth = f"{token}.{self.thumbprint}"
222
221
  wellknown_path = str(Path(self.acme_check_dir) / token)
223
222
  with open(wellknown_path, 'w', encoding='utf-8') as f:
224
223
  f.write(key_auth)
225
224
 
226
225
  # 检查 wellknown 文件是否在指定位置
227
226
  try:
228
- wellknown_url = "http://{0}/.well-known/acme-challenge/{1}".format(domain, token)
227
+ wellknown_url = f"http://{domain}/.well-known/acme-challenge/{token}"
229
228
  assert(disable_check or self._request(wellknown_url)[0] == key_auth)
230
229
  except (AssertionError, ValueError) as e:
231
230
  Path(wellknown_path).unlink()
232
- raise ValueError("Wrote file to {0}, but couldn't download {1}: {2}".format(
233
- wellknown_path, wellknown_url, e))
231
+ raise ValueError(f"Wrote file to {wellknown_path}, but couldn't download {wellknown_url}: {e}")
234
232
 
235
233
  # 告知挑战已完成
236
234
  self._s_request(
237
- challenge['url'], {}, "Error submitting challenges: {0}".format(domain))
238
- authorization = self._poll_until_not(auth_url, ["pending"], "Error checking challenge status for {0}".format(domain))
235
+ challenge['url'], {}, f"Error submitting challenges: {domain}")
236
+ authorization = self._poll_until_not(auth_url, ["pending"], f"Error checking challenge status for {domain}")
239
237
  if authorization['status'] != "valid":
240
- raise ValueError("Challenge did not pass for {0}: {1}".format(domain, authorization))
241
- print("Domain {0} verified!".format(domain))
238
+ raise ValueError(f"Challenge did not pass for {domain}: {authorization}")
239
+ print(f"Domain {domain} verified!")
242
240
 
243
241
  # 使用 CSR 完成订单
244
242
  print('Certificate signing...')
@@ -247,7 +245,7 @@ class ACME():
247
245
  # 轮询订单以监控其完成状态
248
246
  order = self._poll_until_not(order_headers['Location'], ['pending', 'processing'], 'Error checking order status')
249
247
  if order['status'] != 'valid':
250
- raise ValueError("Order failed: {0}".format(order))
248
+ raise ValueError(f"Order failed: {order}")
251
249
  self.certificate = order['certificate']
252
250
 
253
251
  def get_certificate(self, certificate=None):
@@ -32,8 +32,7 @@ class ECS(object):
32
32
  def _sign(self, params):
33
33
  paramstrings = []
34
34
  for k, v in sorted(params.items()):
35
- paramstrings.append('%s=%s' %
36
- (ECS._urlencode(k), ECS._urlencode(v)))
35
+ paramstrings.append(f'{ECS._urlencode(k)}={ECS._urlencode(v)}')
37
36
  datastrings = [
38
37
  ECS._urlencode('GET'),
39
38
  ECS._urlencode('/'),
@@ -240,7 +239,7 @@ if __name__ == '__main__':
240
239
  print()
241
240
 
242
241
  for region in regions['Regions']:
243
- print('## Zones in %s\n' % region['RegionCode'])
242
+ print(f"## Zones in {region['RegionCode']}\n")
244
243
  zones = ecs.DescribeZones(region['RegionCode'])
245
244
  if not zones[0]:
246
245
  pp.pprint(zones)
@@ -250,7 +249,7 @@ if __name__ == '__main__':
250
249
  print()
251
250
 
252
251
  for zone in zones['Zones']:
253
- print('## Instances in %s\n' % zone['ZoneCode'])
252
+ print(f"## Instances in {zone['ZoneCode']}\n")
254
253
  instances = ecs.DescribeInstanceStatus(
255
254
  region['RegionCode'], zone['ZoneCode'])[1]
256
255
  pp.pprint(instances)