InPanel 1.2.4__tar.gz → 1.2.5__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 (228) hide show
  1. {inpanel-1.2.4 → inpanel-1.2.5}/InPanel.egg-info/PKG-INFO +1 -1
  2. {inpanel-1.2.4 → inpanel-1.2.5}/InPanel.egg-info/SOURCES.txt +1 -1
  3. {inpanel-1.2.4 → inpanel-1.2.5}/PKG-INFO +1 -1
  4. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/app.py +1 -1
  5. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/base.py +1 -1
  6. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/query.py +17 -14
  7. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/remote.py +1 -1
  8. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/task.py +131 -26
  9. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/controllers.js +10 -8
  10. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/database.js +52 -52
  11. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/ecs.js +11 -11
  12. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/file.js +37 -37
  13. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/service.js +24 -24
  14. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/site.js +17 -17
  15. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/utils.js +166 -67
  16. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/core.js +1 -0
  17. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/directives.js +53 -53
  18. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/services.js +6 -6
  19. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/index.html +1 -1
  20. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/index.html +5 -0
  21. inpanel-1.2.5/inpanel/public/partials/utils/task.html +106 -0
  22. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/web.py +99 -47
  23. {inpanel-1.2.4 → inpanel-1.2.5}/pyproject.toml +1 -1
  24. inpanel-1.2.4/inpanel/mod/ufw.py +0 -14
  25. {inpanel-1.2.4 → inpanel-1.2.5}/InPanel.egg-info/dependency_links.txt +0 -0
  26. {inpanel-1.2.4 → inpanel-1.2.5}/InPanel.egg-info/entry_points.txt +0 -0
  27. {inpanel-1.2.4 → inpanel-1.2.5}/InPanel.egg-info/requires.txt +0 -0
  28. {inpanel-1.2.4 → inpanel-1.2.5}/InPanel.egg-info/top_level.txt +0 -0
  29. {inpanel-1.2.4 → inpanel-1.2.5}/LICENSE +0 -0
  30. {inpanel-1.2.4 → inpanel-1.2.5}/MANIFEST.in +0 -0
  31. {inpanel-1.2.4 → inpanel-1.2.5}/README.md +0 -0
  32. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/__init__.py +0 -0
  33. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/config.py +0 -0
  34. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/lib/__init__.py +0 -0
  35. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/lib/async_process.py +0 -0
  36. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/lib/filelock.py +0 -0
  37. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/lib/magic.py +0 -0
  38. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/lib/pxssh.py +0 -0
  39. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/lib/pyDes.py +0 -0
  40. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/__init__.py +0 -0
  41. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/acme.py +0 -0
  42. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/aliyuncs.py +0 -0
  43. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/apt.py +0 -0
  44. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/brew.py +0 -0
  45. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/certificate.py +0 -0
  46. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/config.py +0 -0
  47. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/cron.py +0 -0
  48. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/disk.py +0 -0
  49. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/dnf.py +0 -0
  50. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/docker.py +0 -0
  51. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/docker_source.py +0 -0
  52. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/file.py +0 -0
  53. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/firewall.py +0 -0
  54. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/firewall_base.py +0 -0
  55. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/firewall_firewalld.py +0 -0
  56. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/firewall_iptables.py +0 -0
  57. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/firewall_macos.py +0 -0
  58. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/firewall_ufw.py +0 -0
  59. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/ftp.py +0 -0
  60. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/httpd.py +0 -0
  61. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/lighttpd.py +0 -0
  62. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/login.py +0 -0
  63. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/mysql.py +0 -0
  64. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/named.py +0 -0
  65. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/nginx.py +0 -0
  66. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/package.py +0 -0
  67. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/package_apt.py +0 -0
  68. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/package_base.py +0 -0
  69. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/package_dnf.py +0 -0
  70. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/package_map.py +0 -0
  71. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/package_yum.py +0 -0
  72. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/php.py +0 -0
  73. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/pip.py +0 -0
  74. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/plugins.py +0 -0
  75. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/process.py +0 -0
  76. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/proftpd.py +0 -0
  77. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/pureftpd.py +0 -0
  78. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/server.py +0 -0
  79. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/service.py +0 -0
  80. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/setting.py +0 -0
  81. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/shell.py +0 -0
  82. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/ssh.py +0 -0
  83. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/system.py +0 -0
  84. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/user.py +0 -0
  85. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/vsftpd.py +0 -0
  86. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/mod/yum.py +0 -0
  87. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/plugin.py +0 -0
  88. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/css/global.css +0 -0
  89. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/favicon.ico +0 -0
  90. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/images/alipay.jpg +0 -0
  91. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/images/loading.gif +0 -0
  92. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/images/weixin.jpg +0 -0
  93. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/index.html +0 -0
  94. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/container.js +0 -0
  95. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/controllers/plugins.js +0 -0
  96. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/js/filters.js +0 -0
  97. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/angular/1.0.2/angular-resource.min.js +0 -0
  98. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/angular/1.0.2/angular.min.js +0 -0
  99. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css +0 -0
  100. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +0 -0
  101. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +0 -0
  102. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +0 -0
  103. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap.css +0 -0
  104. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap.css.map +0 -0
  105. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap.min.css +0 -0
  106. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +0 -0
  107. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  108. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
  109. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  110. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  111. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  112. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  113. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  114. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/js/bootstrap.js +0 -0
  115. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/js/bootstrap.min.js +0 -0
  116. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/bootstrap/js/npm.js +0 -0
  117. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/codemirror/codemirror-compressed.js +0 -0
  118. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/codemirror/codemirror.css +0 -0
  119. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/jquery/jquery-1.12.4.min.js +0 -0
  120. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/md5/md5.js +0 -0
  121. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/lib/md5/md5.min.js +0 -0
  122. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/container/index.html +0 -0
  123. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/database/index.html +0 -0
  124. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/database/mysql/dbedit.html +0 -0
  125. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/database/mysql/dbnew.html +0 -0
  126. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/database/mysql/useredit.html +0 -0
  127. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/database/mysql/usernew.html +0 -0
  128. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/message.html +0 -0
  129. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/navbar.html +0 -0
  130. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/selector.html +0 -0
  131. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvbase.html +0 -0
  132. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvext.html +0 -0
  133. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvfile.html +0 -0
  134. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvinstall.html +0 -0
  135. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvlog.html +0 -0
  136. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvminiop.html +0 -0
  137. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvuninstall.html +0 -0
  138. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/directives/srvupdate.html +0 -0
  139. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/ecs/account.html +0 -0
  140. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/ecs/ecs.html +0 -0
  141. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/ecs/index.html +0 -0
  142. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/ecs/setings.html +0 -0
  143. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/file/file.html +0 -0
  144. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/file/trash.html +0 -0
  145. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/ftp.html +0 -0
  146. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/log.html +0 -0
  147. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/login.html +0 -0
  148. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/logout.html +0 -0
  149. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/main.html +0 -0
  150. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/plugins/config.html +0 -0
  151. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/plugins/detail.html +0 -0
  152. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/plugins/index.html +0 -0
  153. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/plugins/info.html +0 -0
  154. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/secure.html +0 -0
  155. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/apache.html +0 -0
  156. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/cron.html +0 -0
  157. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/fail2ban.html +0 -0
  158. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/firewalld.html +0 -0
  159. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/iptables.html +0 -0
  160. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/java11.html +0 -0
  161. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/java17.html +0 -0
  162. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/java21.html +0 -0
  163. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/java8.html +0 -0
  164. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/lighttpd.html +0 -0
  165. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/mariadb.html +0 -0
  166. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/memcache.html +0 -0
  167. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/minio.html +0 -0
  168. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/mongodb.html +0 -0
  169. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/mysql.html +0 -0
  170. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/named.html +0 -0
  171. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/nginx.html +0 -0
  172. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/nodejs18.html +0 -0
  173. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/nodejs20.html +0 -0
  174. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/nodejs22.html +0 -0
  175. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/nodejs24.html +0 -0
  176. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/ntp.html +0 -0
  177. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php.html +0 -0
  178. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php56.html +0 -0
  179. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php74.html +0 -0
  180. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php80.html +0 -0
  181. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php81.html +0 -0
  182. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php82.html +0 -0
  183. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php83.html +0 -0
  184. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/php84.html +0 -0
  185. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/proftpd.html +0 -0
  186. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/pureftpd.html +0 -0
  187. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/redis.html +0 -0
  188. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/samba.html +0 -0
  189. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/sendmail.html +0 -0
  190. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/ssh.html +0 -0
  191. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/tomcat.html +0 -0
  192. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/ufw.html +0 -0
  193. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/service/vsftpd.html +0 -0
  194. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/setting.html +0 -0
  195. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/site/apache/site.html +0 -0
  196. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/site/index.html +0 -0
  197. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/site/nginx/site.html +0 -0
  198. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/sorry.html +0 -0
  199. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/storage/autofm.html +0 -0
  200. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/storage/backup.html +0 -0
  201. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/storage/index.html +0 -0
  202. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/storage/migrate.html +0 -0
  203. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/storage/movedata.html +0 -0
  204. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/storage/remote.html +0 -0
  205. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/cron.html +0 -0
  206. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/firewall.html +0 -0
  207. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/network.html +0 -0
  208. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/process.html +0 -0
  209. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/shell.html +0 -0
  210. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/sources.html +0 -0
  211. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/ssl.html +0 -0
  212. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/time.html +0 -0
  213. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/partials/utils/user.html +0 -0
  214. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/robots.txt +0 -0
  215. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/templates/file/preview.html +0 -0
  216. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/public/templates/index.html +0 -0
  217. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/__init__.py +0 -0
  218. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/__init__.py +0 -0
  219. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/apt.json +0 -0
  220. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/brew.json +0 -0
  221. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/dnf.json +0 -0
  222. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/docker.json +0 -0
  223. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/package_map.json +0 -0
  224. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/pip.json +0 -0
  225. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/third_party.json +0 -0
  226. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/templates/sources/yum.json +0 -0
  227. {inpanel-1.2.4 → inpanel-1.2.5}/inpanel/utils.py +0 -0
  228. {inpanel-1.2.4 → inpanel-1.2.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.4
3
+ Version: 1.2.5
4
4
  Summary: InPanel - A Web-based Linux Server Management Tool
5
5
  Author-email: Jackson Dou <jksdou@qq.com>
6
6
  Maintainer-email: Jackson Dou <jksdou@qq.com>
@@ -68,7 +68,6 @@ inpanel/mod/shell.py
68
68
  inpanel/mod/ssh.py
69
69
  inpanel/mod/system.py
70
70
  inpanel/mod/task.py
71
- inpanel/mod/ufw.py
72
71
  inpanel/mod/user.py
73
72
  inpanel/mod/vsftpd.py
74
73
  inpanel/mod/yum.py
@@ -209,6 +208,7 @@ inpanel/public/partials/utils/process.html
209
208
  inpanel/public/partials/utils/shell.html
210
209
  inpanel/public/partials/utils/sources.html
211
210
  inpanel/public/partials/utils/ssl.html
211
+ inpanel/public/partials/utils/task.html
212
212
  inpanel/public/partials/utils/time.html
213
213
  inpanel/public/partials/utils/user.html
214
214
  inpanel/public/templates/index.html
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.4
3
+ Version: 1.2.5
4
4
  Summary: InPanel - A Web-based Linux Server Management Tool
5
5
  Author-email: Jackson Dou <jksdou@qq.com>
6
6
  Maintainer-email: Jackson Dou <jksdou@qq.com>
@@ -384,7 +384,7 @@ def run_server():
384
384
  (r'/api/firewall/(.+)', web.FirewallHandler),
385
385
  (r'/api/setting/(.+)', web.SettingHandler),
386
386
  (r'/api/operation/(.+)', web.OperationHandler),
387
- (r'/api/backend/(.+)', web.BackendHandler),
387
+ (r'/api/task/(.+)', web.TaskHandler),
388
388
  (r'/api/sitepackage/(.+)', web.SitePackageHandler),
389
389
  (r'/api/client/(.+)', web.ClientHandler),
390
390
  (r'/api/plugins', web.PluginHandler),
@@ -41,7 +41,7 @@ __author__ = 'Jackson Dou'
41
41
  __license__ = 'BSD'
42
42
 
43
43
  app_name = 'InPanel'
44
- releasetime = '2026-07-17'
44
+ releasetime = '2026-07-18'
45
45
  DEBUG = False
46
46
  COMMENTFLAG = '#INPANEL#'
47
47
  GENBY = 'AUTOMATICALLY GENERATED BY INPANEL'
@@ -25,16 +25,16 @@ def handle_query(items):
25
25
  qdict = {'server': [], 'service': [], 'config': [], 'tool': []}
26
26
 
27
27
  for item in items:
28
- if item == '**':
29
- qdict = {'server': '**', 'service': '**'}
28
+ if item == 'all':
29
+ qdict = {'server': 'all', 'service': 'all'}
30
30
  break
31
- elif item == '*':
32
- qdict = {'server': '*', 'service': '*'}
31
+ elif item == 'dynamic':
32
+ qdict = {'server': 'dynamic', 'service': 'dynamic'}
33
33
  break
34
- elif item == 'server.**':
35
- qdict['server'] = '**'
36
- elif item == 'mod.service.**':
37
- qdict['service'] = '**'
34
+ elif item == 'server.all':
35
+ qdict['server'] = 'all'
36
+ elif item == 'service.all':
37
+ qdict['service'] = 'all'
38
38
  else:
39
39
  iteminfo = item.split('.', 1)
40
40
  if len(iteminfo) != 2:
@@ -42,9 +42,12 @@ def handle_query(items):
42
42
  sec, q = iteminfo
43
43
  if sec not in ('server', 'service', 'config', 'tool'):
44
44
  continue
45
- if qdict[sec] == '**':
45
+ if qdict[sec] == 'all':
46
46
  continue
47
- qdict[sec].append(q)
47
+ if q in ('all', 'dynamic'):
48
+ qdict[sec] = q
49
+ else:
50
+ qdict[sec].append(q)
48
51
 
49
52
  config_items = {
50
53
  'fstab': False,
@@ -57,9 +60,9 @@ def handle_query(items):
57
60
  for sec, qs in qdict.items():
58
61
  if sec == 'server':
59
62
  server_items = server.ServerInfo.server_items
60
- if qs == '**':
63
+ if qs == 'all':
61
64
  qs = server_items.keys()
62
- elif qs == '*':
65
+ elif qs == 'dynamic':
63
66
  qs = [item for item, relup in server_items.items() if relup == True]
64
67
  for q in qs:
65
68
  if q not in server_items:
@@ -68,9 +71,9 @@ def handle_query(items):
68
71
  elif sec == 'service':
69
72
  service_items = service.Service.service_items
70
73
  autostart_services = service.get_autostart_list()
71
- if qs == '**':
74
+ if qs == 'all':
72
75
  qs = service_items.keys()
73
- elif qs == '*':
76
+ elif qs == 'dynamic':
74
77
  qs = [item for item, relup in service_items.items() if relup == True]
75
78
  for q in qs:
76
79
  if q not in service_items:
@@ -13,7 +13,7 @@ import base64
13
13
  import os
14
14
  import shlex
15
15
 
16
- from .lib import pxssh
16
+ from ..lib import pxssh
17
17
 
18
18
 
19
19
  def inpanel_install(ssh_ip, ssh_port, ssh_user, ssh_password, accesskey=None, inpanel_ip=None, inpanel_port=None):
@@ -6,8 +6,18 @@
6
6
  # InPanel is distributed under the terms of the (new) BSD License.
7
7
  # The full license can be found in 'LICENSE'.
8
8
 
9
- """任务管理模块"""
9
+ """后台异步任务管理模块
10
10
 
11
+ 提供异步任务的生命周期管理:创建、执行、状态查询、取消、清理。
12
+
13
+ 设计原则:
14
+ - TaskManager 管理任务状态(running → finish/cancel)
15
+ - 业务逻辑由各 async 方法实现,通过 run_job() 提交到事件循环
16
+ - 前端通过 Task service 的 "POST 创建 → GET 轮询" 模式获取任务结果
17
+ """
18
+
19
+ import asyncio
20
+ import logging
11
21
  import time
12
22
  from datetime import datetime
13
23
  from functools import partial
@@ -18,7 +28,6 @@ from subprocess import PIPE, Popen
18
28
  import tornado.escape
19
29
  import tornado.httpclient
20
30
 
21
- from . import remote
22
31
  from ..base import app_api, os_versint
23
32
  from . import disk
24
33
  from . import shell
@@ -29,52 +38,145 @@ from . import file
29
38
  from . import ssh
30
39
  from . import ftp
31
40
 
41
+ logger = logging.getLogger(__name__)
42
+
32
43
 
33
44
  class TaskManager:
34
- jobs = {}
35
- locks = {}
45
+ """后台异步任务管理器。
46
+
47
+ 管理所有后台任务的创建、执行、状态追踪。
48
+
49
+ 任务状态流转:
50
+ running → finish (成功/失败)
51
+ running → cancel (用户取消)
52
+ """
53
+
54
+ # 类变量:所有实例共享同一份任务数据
55
+ _jobs = {} # {jobname: {status, code, msg, started_at, finished_at, data?}}
56
+ _locks = {} # {lockname: True} 互斥锁
36
57
 
37
58
  def __init__(self, settings, config):
38
59
  self.settings = settings
39
60
  self.config = config
40
61
 
62
+ # ------------------------------------------------------------------
63
+ # 任务生命周期管理(公共接口)
64
+ # ------------------------------------------------------------------
65
+
66
+ def run_job(self, coro):
67
+ """将协程提交到事件循环异步执行。
68
+
69
+ Args:
70
+ coro: 协程对象 或 返回协程的 callable(如 partial, lambda)
71
+ """
72
+ async def _wrapper():
73
+ try:
74
+ if callable(coro) and not asyncio.iscoroutine(coro):
75
+ await coro()
76
+ else:
77
+ await coro
78
+ except Exception as e:
79
+ logger.error(f"TaskManager async task error: {e}", exc_info=True)
80
+ asyncio.ensure_future(_wrapper())
81
+
82
+ def get_job(self, jobname):
83
+ """获取指定任务的状态。
84
+
85
+ Returns:
86
+ dict: 任务状态,不存在的任务返回 {'status': 'none', 'code': -1, 'msg': ''}
87
+ """
88
+ if jobname not in self._jobs:
89
+ return {'status': 'none', 'code': -1, 'msg': ''}
90
+ return self._jobs[jobname]
91
+
92
+ def list_jobs(self):
93
+ """获取所有任务列表。
94
+
95
+ Returns:
96
+ list[dict]: 任务列表,每个任务包含 name, status, code, msg, started_at, finished_at
97
+ """
98
+ result = []
99
+ for name, info in self._jobs.items():
100
+ result.append({
101
+ 'name': name,
102
+ 'status': info.get('status', 'unknown'),
103
+ 'code': info.get('code', -1),
104
+ 'msg': info.get('msg', ''),
105
+ 'started_at': info.get('started_at', 0),
106
+ 'finished_at': info.get('finished_at', 0),
107
+ })
108
+ return result
109
+
110
+ def cancel_job(self, jobname):
111
+ """取消指定任务(仅标记状态,不强制终止进程)。
112
+
113
+ Returns:
114
+ bool: 是否成功取消
115
+ """
116
+ if jobname not in self._jobs:
117
+ return False
118
+ if self._jobs[jobname]['status'] == 'running':
119
+ self._jobs[jobname]['status'] = 'cancel'
120
+ self._jobs[jobname]['msg'] = '任务已被用户取消'
121
+ return True
122
+ return False
123
+
124
+ def clear_finished(self):
125
+ """清除所有已完成/已取消/无效的任务记录。
126
+
127
+ Returns:
128
+ int: 清除的任务数量
129
+ """
130
+ to_remove = [name for name, info in self._jobs.items()
131
+ if info.get('status') in ('finish', 'cancel', 'none')]
132
+ for name in to_remove:
133
+ del self._jobs[name]
134
+ return len(to_remove)
135
+
136
+ # ------------------------------------------------------------------
137
+ # 内部辅助方法
138
+ # ------------------------------------------------------------------
139
+
41
140
  def _lock_job(self, lockname):
42
- if lockname in self.locks:
141
+ """尝试获取互斥锁,防止同一类任务并发执行。"""
142
+ if lockname in self._locks:
43
143
  return False
44
- self.locks[lockname] = True
144
+ self._locks[lockname] = True
45
145
  return True
46
146
 
47
147
  def _unlock_job(self, lockname):
48
- if lockname not in self.locks:
148
+ """释放互斥锁。"""
149
+ if lockname not in self._locks:
49
150
  return False
50
- del self.locks[lockname]
151
+ del self._locks[lockname]
51
152
  return True
52
153
 
53
154
  def _start_job(self, jobname):
54
- if jobname in self.jobs and self.jobs[jobname]['status'] == 'running':
155
+ """标记任务为 running 状态。如果同名任务已在运行则返回 False。"""
156
+ if jobname in self._jobs and self._jobs[jobname]['status'] == 'running':
55
157
  return False
56
- self.jobs[jobname] = {'status': 'running', 'msg': ''}
158
+ self._jobs[jobname] = {'status': 'running', 'msg': '', 'started_at': time.time()}
57
159
  return True
58
160
 
59
161
  def _update_job(self, jobname, code, msg):
60
- self.jobs[jobname]['code'] = code
61
- self.jobs[jobname]['msg'] = msg
62
- return True
63
-
64
- def _get_job(self, jobname):
65
- if jobname not in self.jobs:
66
- return {'status': 'none', 'code': -1, 'msg': ''}
67
- return self.jobs[jobname]
162
+ """更新任务的进度消息(任务仍在运行中)。"""
163
+ self._jobs[jobname]['code'] = code
164
+ self._jobs[jobname]['msg'] = msg
68
165
 
69
166
  def _finish_job(self, jobname, code, msg, data=None):
70
- self.jobs[jobname]['status'] = 'finish'
71
- self.jobs[jobname]['code'] = code
72
- self.jobs[jobname]['msg'] = msg
73
- if data:
74
- self.jobs[jobname]['data'] = data
75
-
76
- def _call(self, callback):
77
- tornado.ioloop.IOLoop.instance().add_callback(callback)
167
+ """标记任务为 finish 状态。
168
+
169
+ Args:
170
+ code: 0=成功, -1=失败
171
+ msg: 结果描述
172
+ data: 可选的附加数据
173
+ """
174
+ self._jobs[jobname]['status'] = 'finish'
175
+ self._jobs[jobname]['code'] = code
176
+ self._jobs[jobname]['msg'] = msg
177
+ self._jobs[jobname]['finished_at'] = time.time()
178
+ if data is not None:
179
+ self._jobs[jobname]['data'] = data
78
180
 
79
181
  async def update(self):
80
182
  if not self._start_job('update'):
@@ -1263,6 +1365,7 @@ class TaskManager:
1263
1365
  self._finish_job(jobname, code, msg)
1264
1366
 
1265
1367
  async def inpanel_install(self, ssh_ip, ssh_port, ssh_user, ssh_password, instance_name, accessnet, accessport=None, accesskey=None):
1368
+ from . import remote
1266
1369
  jobname = f'remote_inpanel_install_{ssh_ip}'
1267
1370
  if not self._start_job(jobname):
1268
1371
  return
@@ -1281,6 +1384,7 @@ class TaskManager:
1281
1384
  self._finish_job(jobname, code, msg)
1282
1385
 
1283
1386
  async def inpanel_uninstall(self, ssh_ip, ssh_port, ssh_user, ssh_password, instance_name):
1387
+ from . import remote
1284
1388
  jobname = f'remote_inpanel_uninstall_{ssh_ip}'
1285
1389
  if not self._start_job(jobname):
1286
1390
  return
@@ -1301,6 +1405,7 @@ class TaskManager:
1301
1405
  self._finish_job(jobname, code, msg)
1302
1406
 
1303
1407
  async def inpanel_config(self, ssh_ip, ssh_port, ssh_user, ssh_password, accesskey=None):
1408
+ from . import remote
1304
1409
  jobname = f'remote_inpanel_config_{ssh_ip}'
1305
1410
  if not self._start_job(jobname):
1306
1411
  return
@@ -119,7 +119,7 @@ var MainCtrl = [
119
119
  $scope.auto_refresh = false;
120
120
 
121
121
  $scope.load = function () {
122
- $scope.loadInfo('**');
122
+ $scope.loadInfo('all');
123
123
  $scope.checkUpVersion();
124
124
  };
125
125
 
@@ -152,7 +152,7 @@ var MainCtrl = [
152
152
  }
153
153
 
154
154
  $scope.loadInfo = function (items) {
155
- if (!items) items = '*';
155
+ if (!items) items = 'dynamic';
156
156
  Request.get('/api/query/' + items, function (data) {
157
157
  if ($scope.info == null) {
158
158
  $scope.info = data;
@@ -162,6 +162,8 @@ var MainCtrl = [
162
162
  $scope.info['server.netifaces'][i]['tx_speed'] = '0';
163
163
  }
164
164
  if (!$scope.loaded) $scope.loaded = true;
165
+ // 首次加载后自动再拉一次,用于计算 CPU 使用率差值
166
+ Timeout(function () { $scope.loadInfo(items); }, 1000);
165
167
  } else {
166
168
  if ($scope.info) {
167
169
  // caculate the cpu usage
@@ -426,9 +428,9 @@ var SettingCtrl = [
426
428
  $scope.update = function () {
427
429
  $scope.upverMessage = '正在升级,请稍候...'
428
430
  $scope.showUpdateBtn = false;
429
- Request.post('/api/backend/update', {}, function (data) {
431
+ Request.post('/api/task/update', {}, function (data) {
430
432
  var getUpdateStatus = function () {
431
- Request.get('/api/backend/update', function (data) {
433
+ Request.get('/api/task/update', function (data) {
432
434
  Message.setInfo('')
433
435
  if (data.msg) $scope.upverMessage = data.msg;
434
436
  if (data.code == -1) {
@@ -437,11 +439,11 @@ var SettingCtrl = [
437
439
  // restart service
438
440
  $scope.upverMessage = '正在重启 InPanel...';
439
441
  Timeout(function () {
440
- Request.post('/api/backend/service_restart', {
442
+ Request.post('/api/task/service_restart', {
441
443
  service: 'inpanel'
442
444
  }, function (data) {
443
445
  var getRestartStatus = function () {
444
- Request.get('/api/backend/service_restart_inpanel', function (data) {
446
+ Request.get('/api/task/service_restart_inpanel', function (data) {
445
447
  Message.setInfo('')
446
448
  if (data.msg) $scope.upverMessage = data.msg;
447
449
  Timeout(getRestartStatus, 500, module);
@@ -470,11 +472,11 @@ var SettingCtrl = [
470
472
  $scope.restartMessage = '正在重启,请稍候...'
471
473
  $scope.showRestartBtn = false;
472
474
  Timeout(function () {
473
- Request.post('/api/backend/service_restart', {
475
+ Request.post('/api/task/service_restart', {
474
476
  service: 'inpanel'
475
477
  }, function (data) {
476
478
  var getRestartStatus = function () {
477
- Request.get('/api/backend/service_restart_inpanel', function (data) {
479
+ Request.get('/api/task/service_restart_inpanel', function (data) {
478
480
  if (data.msg) $scope.restartMessage = data.msg;
479
481
  Timeout(getRestartStatus, 500, module);
480
482
  }, function (data, status) { // error occur because server is terminate