InPanel 1.2.2__tar.gz → 1.2.3__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 (237) hide show
  1. {inpanel-1.2.2 → inpanel-1.2.3}/InPanel.egg-info/PKG-INFO +3 -3
  2. {inpanel-1.2.2 → inpanel-1.2.3}/InPanel.egg-info/SOURCES.txt +28 -15
  3. {inpanel-1.2.2 → inpanel-1.2.3}/PKG-INFO +3 -3
  4. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/app.py +11 -6
  5. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/base.py +49 -42
  6. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/apt.py +136 -7
  7. inpanel-1.2.3/inpanel/mod/brew.py +242 -0
  8. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/dnf.py +138 -7
  9. inpanel-1.2.3/inpanel/mod/docker.py +440 -0
  10. inpanel-1.2.3/inpanel/mod/pip.py +207 -0
  11. inpanel-1.2.3/inpanel/mod/plugins.py +525 -0
  12. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/server.py +41 -25
  13. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/service.py +18 -0
  14. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/yum.py +135 -6
  15. inpanel-1.2.3/inpanel/plugin.py +204 -0
  16. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/index.html +1 -1
  17. inpanel-1.2.3/inpanel/public/js/controllers/container.js +195 -0
  18. inpanel-1.2.3/inpanel/public/js/controllers/plugins.js +222 -0
  19. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/service.js +582 -0
  20. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/utils.js +106 -201
  21. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/core.js +22 -1
  22. inpanel-1.2.3/inpanel/public/partials/container/index.html +348 -0
  23. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/navbar.html +2 -1
  24. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/main.html +22 -5
  25. inpanel-1.2.3/inpanel/public/partials/plugins/config.html +25 -0
  26. inpanel-1.2.3/inpanel/public/partials/plugins/detail.html +61 -0
  27. inpanel-1.2.3/inpanel/public/partials/plugins/index.html +51 -0
  28. inpanel-1.2.3/inpanel/public/partials/plugins/info.html +23 -0
  29. inpanel-1.2.3/inpanel/public/partials/service/fail2ban.html +40 -0
  30. inpanel-1.2.3/inpanel/public/partials/service/firewalld.html +40 -0
  31. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/index.html +191 -16
  32. inpanel-1.2.3/inpanel/public/partials/service/java11.html +40 -0
  33. inpanel-1.2.3/inpanel/public/partials/service/java17.html +40 -0
  34. inpanel-1.2.3/inpanel/public/partials/service/java21.html +40 -0
  35. inpanel-1.2.3/inpanel/public/partials/service/java8.html +40 -0
  36. inpanel-1.2.3/inpanel/public/partials/service/nodejs18.html +40 -0
  37. inpanel-1.2.3/inpanel/public/partials/service/nodejs20.html +40 -0
  38. inpanel-1.2.3/inpanel/public/partials/service/nodejs22.html +40 -0
  39. inpanel-1.2.3/inpanel/public/partials/service/nodejs24.html +40 -0
  40. inpanel-1.2.3/inpanel/public/partials/service/php56.html +233 -0
  41. inpanel-1.2.3/inpanel/public/partials/service/php74.html +233 -0
  42. inpanel-1.2.3/inpanel/public/partials/service/php80.html +233 -0
  43. inpanel-1.2.3/inpanel/public/partials/service/php81.html +233 -0
  44. inpanel-1.2.3/inpanel/public/partials/service/php82.html +233 -0
  45. inpanel-1.2.3/inpanel/public/partials/service/php83.html +233 -0
  46. inpanel-1.2.3/inpanel/public/partials/service/php84.html +233 -0
  47. inpanel-1.2.3/inpanel/public/partials/service/ufw.html +40 -0
  48. inpanel-1.2.3/inpanel/public/partials/utils/repository.html +644 -0
  49. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/templates/index.html +1 -0
  50. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/web.py +299 -96
  51. {inpanel-1.2.2 → inpanel-1.2.3}/pyproject.toml +3 -3
  52. inpanel-1.2.2/inpanel/data/bookmarks.ini +0 -20
  53. inpanel-1.2.2/inpanel/data/config.ini +0 -29
  54. inpanel-1.2.2/inpanel/data/error.log +0 -294
  55. inpanel-1.2.2/inpanel/data/history.txt +0 -30
  56. inpanel-1.2.2/inpanel/data/inpanel.pid +0 -1
  57. inpanel-1.2.2/inpanel/data/lastfile.ini +0 -4
  58. inpanel-1.2.2/inpanel/data/main.log +0 -3300
  59. inpanel-1.2.2/inpanel/data/upgrade.ini +0 -6
  60. inpanel-1.2.2/inpanel/plugins/__init__.py +0 -10
  61. inpanel-1.2.2/inpanel/plugins/acme/static/index.html +0 -10
  62. inpanel-1.2.2/inpanel/plugins/acme/static/index.js +0 -13
  63. inpanel-1.2.2/inpanel/plugins/shadowsocks-libev/info.py +0 -73
  64. inpanel-1.2.2/inpanel/plugins/shadowsocks-libev/static/index.html +0 -70
  65. inpanel-1.2.2/inpanel/plugins/shadowsocks-libev/static/index.js +0 -18
  66. inpanel-1.2.2/inpanel/public/js/controllers/plugins.js +0 -105
  67. inpanel-1.2.2/inpanel/public/partials/plugins/index.html +0 -55
  68. inpanel-1.2.2/inpanel/public/partials/plugins/plugins.html +0 -13
  69. inpanel-1.2.2/inpanel/public/partials/utils/repository.html +0 -373
  70. {inpanel-1.2.2 → inpanel-1.2.3}/InPanel.egg-info/dependency_links.txt +0 -0
  71. {inpanel-1.2.2 → inpanel-1.2.3}/InPanel.egg-info/entry_points.txt +0 -0
  72. {inpanel-1.2.2 → inpanel-1.2.3}/InPanel.egg-info/requires.txt +0 -0
  73. {inpanel-1.2.2 → inpanel-1.2.3}/InPanel.egg-info/top_level.txt +0 -0
  74. {inpanel-1.2.2 → inpanel-1.2.3}/LICENSE +0 -0
  75. {inpanel-1.2.2 → inpanel-1.2.3}/MANIFEST.in +0 -0
  76. {inpanel-1.2.2 → inpanel-1.2.3}/README.md +0 -0
  77. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/__init__.py +0 -0
  78. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/acme.py +0 -0
  79. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/aliyuncs.py +0 -0
  80. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/apt.py +0 -0
  81. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/config.py +0 -0
  82. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/dnf.py +0 -0
  83. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/lib/__init__.py +0 -0
  84. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/lib/async_process.py +0 -0
  85. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/lib/filelock.py +0 -0
  86. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/lib/magic.py +0 -0
  87. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/lib/pxssh.py +0 -0
  88. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/lib/pyDes.py +0 -0
  89. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/__init__.py +0 -0
  90. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/certificate.py +0 -0
  91. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/config.py +0 -0
  92. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/cron.py +0 -0
  93. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/disk.py +0 -0
  94. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/file.py +0 -0
  95. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/firewall.py +0 -0
  96. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/firewall_base.py +0 -0
  97. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/firewall_firewalld.py +0 -0
  98. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/firewall_iptables.py +0 -0
  99. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/firewall_macos.py +0 -0
  100. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/firewall_ufw.py +0 -0
  101. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/ftp.py +0 -0
  102. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/httpd.py +0 -0
  103. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/lighttpd.py +0 -0
  104. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/login.py +0 -0
  105. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/mysql.py +0 -0
  106. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/named.py +0 -0
  107. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/nginx.py +0 -0
  108. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/package.py +0 -0
  109. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/package_apt.py +0 -0
  110. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/package_base.py +0 -0
  111. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/package_dnf.py +0 -0
  112. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/package_map.py +0 -0
  113. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/package_yum.py +0 -0
  114. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/php.py +0 -0
  115. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/process.py +0 -0
  116. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/proftpd.py +0 -0
  117. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/pureftpd.py +0 -0
  118. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/query.py +0 -0
  119. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/setting.py +0 -0
  120. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/shell.py +0 -0
  121. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/ssh.py +0 -0
  122. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/system.py +0 -0
  123. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/task.py +0 -0
  124. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/ufw.py +0 -0
  125. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/user.py +0 -0
  126. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/mod/vsftpd.py +0 -0
  127. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/css/global.css +0 -0
  128. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/favicon.ico +0 -0
  129. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/images/alipay.jpg +0 -0
  130. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/images/loading.gif +0 -0
  131. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/images/weixin.jpg +0 -0
  132. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/controllers.js +0 -0
  133. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/database.js +0 -0
  134. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/ecs.js +0 -0
  135. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/file.js +0 -0
  136. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/controllers/site.js +0 -0
  137. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/directives.js +0 -0
  138. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/filters.js +0 -0
  139. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/js/services.js +0 -0
  140. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/angular/1.0.2/angular-resource.min.js +0 -0
  141. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/angular/1.0.2/angular.min.js +0 -0
  142. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css +0 -0
  143. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +0 -0
  144. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +0 -0
  145. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +0 -0
  146. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap.css +0 -0
  147. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap.css.map +0 -0
  148. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap.min.css +0 -0
  149. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +0 -0
  150. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  151. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
  152. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  153. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  154. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  155. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  156. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  157. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/js/bootstrap.js +0 -0
  158. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/js/bootstrap.min.js +0 -0
  159. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/bootstrap/js/npm.js +0 -0
  160. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/codemirror/codemirror-compressed.js +0 -0
  161. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/codemirror/codemirror.css +0 -0
  162. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/jquery/jquery-1.12.4.min.js +0 -0
  163. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/md5/md5.js +0 -0
  164. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/lib/md5/md5.min.js +0 -0
  165. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/database/index.html +0 -0
  166. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/database/mysql/dbedit.html +0 -0
  167. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/database/mysql/dbnew.html +0 -0
  168. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/database/mysql/useredit.html +0 -0
  169. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/database/mysql/usernew.html +0 -0
  170. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/message.html +0 -0
  171. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/selector.html +0 -0
  172. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvbase.html +0 -0
  173. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvext.html +0 -0
  174. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvfile.html +0 -0
  175. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvinstall.html +0 -0
  176. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvlog.html +0 -0
  177. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvminiop.html +0 -0
  178. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvuninstall.html +0 -0
  179. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/directives/srvupdate.html +0 -0
  180. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/ecs/account.html +0 -0
  181. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/ecs/ecs.html +0 -0
  182. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/ecs/index.html +0 -0
  183. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/ecs/setings.html +0 -0
  184. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/file/file.html +0 -0
  185. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/file/trash.html +0 -0
  186. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/ftp.html +0 -0
  187. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/log.html +0 -0
  188. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/login.html +0 -0
  189. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/logout.html +0 -0
  190. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/secure.html +0 -0
  191. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/apache.html +0 -0
  192. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/cron.html +0 -0
  193. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/iptables.html +0 -0
  194. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/lighttpd.html +0 -0
  195. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/mariadb.html +0 -0
  196. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/memcache.html +0 -0
  197. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/minio.html +0 -0
  198. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/mongodb.html +0 -0
  199. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/mysql.html +0 -0
  200. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/named.html +0 -0
  201. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/nginx.html +0 -0
  202. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/ntp.html +0 -0
  203. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/php.html +0 -0
  204. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/proftpd.html +0 -0
  205. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/pureftpd.html +0 -0
  206. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/redis.html +0 -0
  207. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/samba.html +0 -0
  208. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/sendmail.html +0 -0
  209. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/ssh.html +0 -0
  210. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/tomcat.html +0 -0
  211. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/service/vsftpd.html +0 -0
  212. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/setting.html +0 -0
  213. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/site/apache/site.html +0 -0
  214. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/site/index.html +0 -0
  215. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/site/nginx/site.html +0 -0
  216. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/sorry.html +0 -0
  217. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/storage/autofm.html +0 -0
  218. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/storage/backup.html +0 -0
  219. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/storage/index.html +0 -0
  220. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/storage/migrate.html +0 -0
  221. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/storage/movedata.html +0 -0
  222. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/storage/remote.html +0 -0
  223. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/cron.html +0 -0
  224. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/firewall.html +0 -0
  225. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/index.html +0 -0
  226. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/network.html +0 -0
  227. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/process.html +0 -0
  228. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/shell.html +0 -0
  229. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/ssl.html +0 -0
  230. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/time.html +0 -0
  231. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/partials/utils/user.html +0 -0
  232. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/public/robots.txt +0 -0
  233. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/remote.py +0 -0
  234. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/templates/file/preview.html +0 -0
  235. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/utils.py +0 -0
  236. {inpanel-1.2.2 → inpanel-1.2.3}/inpanel/yum.py +0 -0
  237. {inpanel-1.2.2 → inpanel-1.2.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.2
3
+ Version: 1.2.3
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>
@@ -35,9 +35,9 @@ License: BSD 3-Clause License
35
35
  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
36
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
37
 
38
- Project-URL: Homepage, https://inpanel.org/
38
+ Project-URL: Homepage, https://inpanel.org
39
39
  Project-URL: Repository, https://github.com/inpanel/inpanel
40
- Project-URL: Documentation, https://inpanel.org/
40
+ Project-URL: Documentation, https://inpanel.org
41
41
  Project-URL: Issues, https://github.com/inpanel/inpanel/issues
42
42
  Keywords: server,management,admin,panel,linux
43
43
  Classifier: Development Status :: 5 - Production/Stable
@@ -16,18 +16,11 @@ inpanel/apt.py
16
16
  inpanel/base.py
17
17
  inpanel/config.py
18
18
  inpanel/dnf.py
19
+ inpanel/plugin.py
19
20
  inpanel/remote.py
20
21
  inpanel/utils.py
21
22
  inpanel/web.py
22
23
  inpanel/yum.py
23
- inpanel/data/bookmarks.ini
24
- inpanel/data/config.ini
25
- inpanel/data/error.log
26
- inpanel/data/history.txt
27
- inpanel/data/inpanel.pid
28
- inpanel/data/lastfile.ini
29
- inpanel/data/main.log
30
- inpanel/data/upgrade.ini
31
24
  inpanel/lib/__init__.py
32
25
  inpanel/lib/async_process.py
33
26
  inpanel/lib/filelock.py
@@ -36,11 +29,13 @@ inpanel/lib/pxssh.py
36
29
  inpanel/lib/pyDes.py
37
30
  inpanel/mod/__init__.py
38
31
  inpanel/mod/apt.py
32
+ inpanel/mod/brew.py
39
33
  inpanel/mod/certificate.py
40
34
  inpanel/mod/config.py
41
35
  inpanel/mod/cron.py
42
36
  inpanel/mod/disk.py
43
37
  inpanel/mod/dnf.py
38
+ inpanel/mod/docker.py
44
39
  inpanel/mod/file.py
45
40
  inpanel/mod/firewall.py
46
41
  inpanel/mod/firewall_base.py
@@ -62,6 +57,8 @@ inpanel/mod/package_dnf.py
62
57
  inpanel/mod/package_map.py
63
58
  inpanel/mod/package_yum.py
64
59
  inpanel/mod/php.py
60
+ inpanel/mod/pip.py
61
+ inpanel/mod/plugins.py
65
62
  inpanel/mod/process.py
66
63
  inpanel/mod/proftpd.py
67
64
  inpanel/mod/pureftpd.py
@@ -77,12 +74,6 @@ inpanel/mod/ufw.py
77
74
  inpanel/mod/user.py
78
75
  inpanel/mod/vsftpd.py
79
76
  inpanel/mod/yum.py
80
- inpanel/plugins/__init__.py
81
- inpanel/plugins/acme/static/index.html
82
- inpanel/plugins/acme/static/index.js
83
- inpanel/plugins/shadowsocks-libev/info.py
84
- inpanel/plugins/shadowsocks-libev/static/index.html
85
- inpanel/plugins/shadowsocks-libev/static/index.js
86
77
  inpanel/public/favicon.ico
87
78
  inpanel/public/index.html
88
79
  inpanel/public/robots.txt
@@ -94,6 +85,7 @@ inpanel/public/js/core.js
94
85
  inpanel/public/js/directives.js
95
86
  inpanel/public/js/filters.js
96
87
  inpanel/public/js/services.js
88
+ inpanel/public/js/controllers/container.js
97
89
  inpanel/public/js/controllers/controllers.js
98
90
  inpanel/public/js/controllers/database.js
99
91
  inpanel/public/js/controllers/ecs.js
@@ -135,6 +127,7 @@ inpanel/public/partials/main.html
135
127
  inpanel/public/partials/secure.html
136
128
  inpanel/public/partials/setting.html
137
129
  inpanel/public/partials/sorry.html
130
+ inpanel/public/partials/container/index.html
138
131
  inpanel/public/partials/database/index.html
139
132
  inpanel/public/partials/database/mysql/dbedit.html
140
133
  inpanel/public/partials/database/mysql/dbnew.html
@@ -157,12 +150,20 @@ inpanel/public/partials/ecs/index.html
157
150
  inpanel/public/partials/ecs/setings.html
158
151
  inpanel/public/partials/file/file.html
159
152
  inpanel/public/partials/file/trash.html
153
+ inpanel/public/partials/plugins/config.html
154
+ inpanel/public/partials/plugins/detail.html
160
155
  inpanel/public/partials/plugins/index.html
161
- inpanel/public/partials/plugins/plugins.html
156
+ inpanel/public/partials/plugins/info.html
162
157
  inpanel/public/partials/service/apache.html
163
158
  inpanel/public/partials/service/cron.html
159
+ inpanel/public/partials/service/fail2ban.html
160
+ inpanel/public/partials/service/firewalld.html
164
161
  inpanel/public/partials/service/index.html
165
162
  inpanel/public/partials/service/iptables.html
163
+ inpanel/public/partials/service/java11.html
164
+ inpanel/public/partials/service/java17.html
165
+ inpanel/public/partials/service/java21.html
166
+ inpanel/public/partials/service/java8.html
166
167
  inpanel/public/partials/service/lighttpd.html
167
168
  inpanel/public/partials/service/mariadb.html
168
169
  inpanel/public/partials/service/memcache.html
@@ -171,8 +172,19 @@ inpanel/public/partials/service/mongodb.html
171
172
  inpanel/public/partials/service/mysql.html
172
173
  inpanel/public/partials/service/named.html
173
174
  inpanel/public/partials/service/nginx.html
175
+ inpanel/public/partials/service/nodejs18.html
176
+ inpanel/public/partials/service/nodejs20.html
177
+ inpanel/public/partials/service/nodejs22.html
178
+ inpanel/public/partials/service/nodejs24.html
174
179
  inpanel/public/partials/service/ntp.html
175
180
  inpanel/public/partials/service/php.html
181
+ inpanel/public/partials/service/php56.html
182
+ inpanel/public/partials/service/php74.html
183
+ inpanel/public/partials/service/php80.html
184
+ inpanel/public/partials/service/php81.html
185
+ inpanel/public/partials/service/php82.html
186
+ inpanel/public/partials/service/php83.html
187
+ inpanel/public/partials/service/php84.html
176
188
  inpanel/public/partials/service/proftpd.html
177
189
  inpanel/public/partials/service/pureftpd.html
178
190
  inpanel/public/partials/service/redis.html
@@ -180,6 +192,7 @@ inpanel/public/partials/service/samba.html
180
192
  inpanel/public/partials/service/sendmail.html
181
193
  inpanel/public/partials/service/ssh.html
182
194
  inpanel/public/partials/service/tomcat.html
195
+ inpanel/public/partials/service/ufw.html
183
196
  inpanel/public/partials/service/vsftpd.html
184
197
  inpanel/public/partials/site/index.html
185
198
  inpanel/public/partials/site/apache/site.html
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.2
3
+ Version: 1.2.3
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>
@@ -35,9 +35,9 @@ License: BSD 3-Clause License
35
35
  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
36
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
37
 
38
- Project-URL: Homepage, https://inpanel.org/
38
+ Project-URL: Homepage, https://inpanel.org
39
39
  Project-URL: Repository, https://github.com/inpanel/inpanel
40
- Project-URL: Documentation, https://inpanel.org/
40
+ Project-URL: Documentation, https://inpanel.org
41
41
  Project-URL: Issues, https://github.com/inpanel/inpanel/issues
42
42
  Keywords: server,management,admin,panel,linux
43
43
  Classifier: Development Status :: 5 - Production/Stable
@@ -20,7 +20,7 @@ import logging
20
20
  from tornado import httpserver, ioloop
21
21
 
22
22
  from . import web
23
- from .base import pidfile, logfile, logerror, config_file, config_path, logging_path, run_type, DEBUG, root_path
23
+ from .base import pidfile, logfile, logerror, config_file, config_path, logging_path, run_type, DEBUG, root_path, data_path
24
24
  from .mod.process import remove_pid_file, save_pid_file, WebRequestProcess
25
25
  from .mod.config import load_config
26
26
  from .utils import make_cookie_secret
@@ -355,11 +355,11 @@ def run_server():
355
355
  'autoreload' : DEBUG,
356
356
  'cookie_secret' : 'debug' if DEBUG else make_cookie_secret(),
357
357
  'root_path' : root_path,
358
- 'data_path' : config_path,
358
+ 'data_path' : data_path,
359
359
  'index_path' : str(Path(root_path) / 'templates' / 'index.html'),
360
360
  'template_path' : str(Path(root_path) / 'templates'),
361
361
  'static_path' : str(Path(root_path) / 'public'),
362
- 'plugins_path' : str(Path(root_path) / 'plugins'),
362
+ 'plugins_path' : str(Path(data_path) / 'plugins'),
363
363
  'xsrf_cookies' : True,
364
364
  'gzip' : True
365
365
  }
@@ -377,18 +377,23 @@ def run_server():
377
377
  (r'/api/repos/yum/(.+?)(?:/(.+))?', web.RepoYumHandler),
378
378
  (r'/api/repos/dnf/(.+?)(?:/(.+))?', web.RepoDnfHandler),
379
379
  (r'/api/repos/apt/(.+?)(?:/(.+))?', web.RepoAptHandler),
380
+ (r'/api/repos/brew/(.+?)(?:/(.+))?', web.RepoBrewHandler),
381
+ (r'/api/repos/pip/(.+?)(?:/(.+))?', web.RepoPipHandler),
382
+ (r'/api/repos/supported/?', web.RepoSupportedHandler),
380
383
  (r'/api/firewall/(.+)', web.FirewallHandler),
381
384
  (r'/api/setting/(.+)', web.SettingHandler),
382
385
  (r'/api/operation/(.+)', web.OperationHandler),
383
- (r'/page/file/preview/(.+)', web.FilePreviewHandler),
384
- (r'/page/(.+)/(.+)', web.PageHandler),
385
386
  (r'/api/backend/(.+)', web.BackendHandler),
386
387
  (r'/api/sitepackage/(.+)', web.SitePackageHandler),
387
388
  (r'/api/client/(.+)', web.ClientHandler),
388
- (r'/api/plugins/(.*)', web.StaticFileHandler, { 'path': settings['plugins_path']}),
389
+ (r'/api/plugins', web.PluginHandler),
390
+ (r'/api/plugins/(list|info|config|install|uninstall|toggle)', web.PluginHandler),
389
391
  (r'/api/file/download/(.+)', web.FileDownloadHandler, { 'path': '/' }),
390
392
  (r'/api/file/upload', web.FileUploadHandler),
391
393
  (r'/api/version', web.VersionHandler),
394
+ (r'/page/plugins/(.*)', web.PluginStaticFileHandler, { 'path': settings['plugins_path']}),
395
+ (r'/page/file/preview/(.+)', web.FilePreviewHandler),
396
+ (r'/page/(.+)/(.+)', web.PageHandler),
392
397
  (r'/((?:css|js|js.min|lib|partials|images|favicon\.ico|robots\.txt)(?:\/.*)?)', web.StaticFileHandler, { 'path': settings['static_path'] }),
393
398
  (r'/', web.IndexHandler),
394
399
  (r'/($)', web.StaticFileHandler, { 'path': settings['index_path'] }),
@@ -1,10 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
- '''The InPanel Base Information'''
2
+ #
3
3
  # Copyright (c) 2017-2026 Jackson Dou
4
4
  # All rights reserved.
5
5
  #
6
6
  # InPanel is distributed under the terms of the (new) BSD License.
7
7
  # The full license can be found in 'LICENSE'.
8
+ '''The InPanel Base Information'''
8
9
 
9
10
  import sys
10
11
  import os
@@ -40,7 +41,7 @@ __author__ = 'Jackson Dou'
40
41
  __license__ = 'BSD'
41
42
 
42
43
  app_name = 'InPanel'
43
- releasetime = '2026-07-07'
44
+ releasetime = '2026-07-12'
44
45
  DEBUG = True
45
46
  COMMENTFLAG = '#INPANEL#'
46
47
  GENBY = 'AUTOMATICALLY GENERATED BY INPANEL'
@@ -48,6 +49,7 @@ GENBY = 'AUTOMATICALLY GENERATED BY INPANEL'
48
49
  # 版本信息
49
50
  version_info = {
50
51
  'name' : app_name,
52
+ 'url' : 'https://inpanel.org',
51
53
  'changelog' : 'https://inpanel.org/changelog.html',
52
54
  'releasetime' : releasetime,
53
55
  'version' : __version__
@@ -60,50 +62,55 @@ app_api = {
60
62
  'download_package' : 'https://api.inpanel.org/?s=site_packages&a=download'
61
63
  }
62
64
 
65
+ execfile = '/usr/bin/inpanel'
66
+ data_path = '/var/lib/inpanel/'
67
+ config_path = '/etc/inpanel/'
68
+ config_file = '/etc/inpanel/config.ini'
69
+ lastfile_path = '/etc/inpanel/lastfile.ini'
70
+ bookmarks_path = '/etc/inpanel/bookmarks.ini'
71
+ upgrade_path = '/etc/inpanel/upgrade.ini'
72
+ history_path = '/etc/inpanel/history.txt'
73
+ logging_path = '/var/log/inpanel/'
74
+ logfile = '/var/log/inpanel/main.log'
75
+ logerror = '/var/log/inpanel/error.log'
76
+ pidfile = '/var/run/inpanel.pid'
77
+ install_type = 'unknown'
78
+
79
+
80
+ import shutil
81
+
63
82
  if hasattr(sys, 'frozen') and hasattr(sys, '_MEIPASS'):
64
- run_type = 'binary'
65
- root_path = sys._MEIPASS
66
- execfile = '/usr/bin/inpanel'
67
- config_path = '/etc/inpanel/'
68
- config_file = '/etc/inpanel/config.ini'
69
- lastfile_path = '/etc/inpanel/lastfile.ini'
70
- bookmarks_path = '/etc/inpanel/bookmarks.ini'
71
- upgrade_path = '/etc/inpanel/upgrade.ini'
72
- history_path = '/etc/inpanel/history.txt'
73
- logging_path = '/var/log/inpanel/'
74
- logfile = '/var/log/inpanel/main.log'
75
- logerror = '/var/log/inpanel/error.log'
76
- pidfile = '/var/run/inpanel.pid'
83
+ run_type = 'binary'
84
+ root_path = sys._MEIPASS
77
85
  else:
78
86
  package_dir = Path(__file__).parent.resolve()
79
87
  if package_dir.parts[-2] == 'site-packages' or 'dist-packages' in str(package_dir):
80
- run_type = 'system'
81
- root_path = str(package_dir)
82
- execfile = '/usr/bin/inpanel'
83
- config_path = '/etc/inpanel/'
84
- config_file = '/etc/inpanel/config.ini'
85
- lastfile_path = '/etc/inpanel/lastfile.ini'
86
- bookmarks_path = '/etc/inpanel/bookmarks.ini'
87
- upgrade_path = '/etc/inpanel/upgrade.ini'
88
- history_path = '/etc/inpanel/history.txt'
89
- logging_path = '/var/log/inpanel/'
90
- logfile = '/var/log/inpanel/main.log'
91
- logerror = '/var/log/inpanel/error.log'
92
- pidfile = '/var/run/inpanel.pid'
88
+ run_type = 'system'
89
+ root_path = str(package_dir)
90
+ pkg_str = str(package_dir)
91
+ if '/dist-packages/' in pkg_str:
92
+ install_type = 'apt'
93
+ elif '/site-packages/' in pkg_str:
94
+ from .mod.system import get_os_family
95
+ if '/usr/lib/python3/site-packages/' in pkg_str and get_os_family() == 'rhel':
96
+ install_type = 'dnf' if shutil.which('dnf') else 'yum'
97
+ else:
98
+ install_type = 'pip'
93
99
  else:
94
100
  run_type = 'source'
95
- root_path = str(Path(__file__).parent.resolve())
96
- execfile = str(Path(root_path) / 'app.py')
97
- config_path = str(Path(root_path) / 'data')
98
- config_file = str(Path(root_path) / 'data' / 'config.ini')
99
- lastfile_path = str(Path(root_path) / 'data' / 'lastfile.ini')
101
+ root_path = str(Path(__file__).parent.resolve())
102
+ execfile = str(Path(root_path) / 'app.py')
103
+ data_path = str(Path(root_path) / 'data')
104
+ config_path = str(Path(root_path) / 'data')
105
+ config_file = str(Path(root_path) / 'data' / 'config.ini')
106
+ lastfile_path = str(Path(root_path) / 'data' / 'lastfile.ini')
100
107
  bookmarks_path = str(Path(root_path) / 'data' / 'bookmarks.ini')
101
- upgrade_path = str(Path(root_path) / 'data' / 'upgrade.ini')
102
- history_path = str(Path(root_path) / 'data' / 'history.txt')
103
- logging_path = str(Path(root_path) / 'data')
104
- logfile = str(Path(root_path) / 'data' / 'main.log')
105
- logerror = str(Path(root_path) / 'data' / 'error.log')
106
- pidfile = str(Path(root_path) / 'data' / 'inpanel.pid')
108
+ upgrade_path = str(Path(root_path) / 'data' / 'upgrade.ini')
109
+ history_path = str(Path(root_path) / 'data' / 'history.txt')
110
+ logging_path = str(Path(root_path) / 'data')
111
+ logfile = str(Path(root_path) / 'data' / 'main.log')
112
+ logerror = str(Path(root_path) / 'data' / 'error.log')
113
+ pidfile = str(Path(root_path) / 'data' / 'inpanel.pid')
107
114
 
108
115
 
109
116
  kernel_name, hostname, kernel_release, kernel_version, machine, processor = uname()
@@ -188,8 +195,8 @@ server_info = {
188
195
  }
189
196
 
190
197
  __all__ = [
191
- '__version__', 'DEBUG', 'app_api', 'app_name', 'config_path',
192
- 'run_type', 'config_file', 'root_path', 'COMMENTFLAG', 'GENBY', 'execfile',
198
+ '__version__', 'DEBUG', 'app_api', 'app_name', 'config_path', 'data_path',
199
+ 'run_type', 'install_type', 'config_file', 'root_path', 'COMMENTFLAG', 'GENBY', 'execfile',
193
200
  'releasetime', 'version_info', 'server_info', 'os_name', 'os_title',
194
201
  'os_version', 'os_versint', 'os_platform', 'kernel_name', 'kernel_release',
195
202
  'kernel_version', 'hostname', 'machine', 'lastfile_path', 'bookmarks_path', 'upgrade_path',
@@ -200,4 +207,4 @@ if __name__ == '__main__':
200
207
  print(uname())
201
208
  print(mac_ver())
202
209
  print(platform())
203
- print(server_info)
210
+ print(server_info)
@@ -225,27 +225,156 @@ def get_repo_elastic(stack_version):
225
225
  return cmds
226
226
 
227
227
 
228
+ import shutil
229
+ import time
230
+ from subprocess import getstatusoutput
231
+
232
+
233
+ def is_installed():
234
+ '''check if apt is installed'''
235
+ return shutil.which('apt') is not None
236
+
237
+
238
+ def get_version():
239
+ '''get apt version'''
240
+ if not is_installed():
241
+ return ''
242
+ status, output = getstatusoutput('apt --version')
243
+ if status != 0:
244
+ return ''
245
+ return output.strip().split('\n')[0]
246
+
247
+
248
+ def get_status():
249
+ '''get apt status'''
250
+ status = {
251
+ 'installed': is_installed(),
252
+ 'version': '',
253
+ 'running': False,
254
+ 'config_path': sources_list_d_path,
255
+ }
256
+ if status['installed']:
257
+ status['version'] = get_version()
258
+ status['running'] = True
259
+ return status
260
+
261
+
262
+ def refresh_cache():
263
+ '''apt update'''
264
+ if not is_installed():
265
+ return {'code': -1, 'msg': 'apt 未安装!'}
266
+ status, output = getstatusoutput('apt update 2>&1')
267
+ if status == 0:
268
+ return {'code': 0, 'msg': 'apt 索引已更新!'}
269
+ return {'code': -1, 'msg': 'apt 索引更新失败:%s' % output}
270
+
271
+
272
+ def _source_full_path(source):
273
+ '''get full path of a source'''
274
+ if source == 'sources.list':
275
+ return sources_list_path
276
+ elif source.startswith('sources.list.d/'):
277
+ filename = source[len('sources.list.d/'):]
278
+ return str(Path(sources_list_d_path) / filename)
279
+ else:
280
+ return str(Path(sources_list_d_path) / source)
281
+
282
+
283
+ def get_repo_list():
284
+ '''get structured source list with name/path/created'''
285
+ if base.kernel_name != 'Linux':
286
+ return None
287
+ items = get_list() or []
288
+ repos = []
289
+ for item in items:
290
+ full = _source_full_path(item)
291
+ created = ''
292
+ try:
293
+ created = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(Path(full).stat().st_ctime))
294
+ except Exception:
295
+ pass
296
+ repos.append({'name': item, 'path': full, 'created': created})
297
+ return repos
298
+
299
+
300
+ def get_repo_detail(source):
301
+ '''get source detail with package list'''
302
+ if not source:
303
+ return None
304
+ data = get_item(source)
305
+ if data is None:
306
+ return None
307
+ full = _source_full_path(source)
308
+ created = ''
309
+ try:
310
+ created = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(Path(full).stat().st_ctime))
311
+ except Exception:
312
+ pass
313
+ # apt 无法精确按源列出包,这里列出系统已安装包作为参考
314
+ packages = []
315
+ st, out = getstatusoutput('dpkg -l 2>/dev/null')
316
+ if st == 0 and out:
317
+ for line in out.split('\n'):
318
+ if line.startswith('ii '):
319
+ parts = line.split()
320
+ if len(parts) >= 3:
321
+ packages.append({'name': parts[1], 'version': parts[2]})
322
+ return {'name': source, 'path': full, 'created': created, 'content': data.get('content', ''), 'packages': packages}
323
+
324
+
325
+ def search_repos(keyword):
326
+ '''search source files by name'''
327
+ if not keyword:
328
+ return []
329
+ items = get_repo_list() or []
330
+ kw = keyword.lower()
331
+ return [r for r in items if kw in r['name'].lower()]
332
+
333
+
334
+ def install_package(name):
335
+ '''install package via apt'''
336
+ if not name:
337
+ return {'code': -1, 'msg': '软件名称不能为空!'}
338
+ if not is_installed():
339
+ return {'code': -1, 'msg': 'apt 未安装!'}
340
+ status, output = getstatusoutput('apt install -y %s 2>&1' % name)
341
+ if status == 0:
342
+ return {'code': 0, 'msg': '软件 %s 安装成功!' % name, 'data': output}
343
+ return {'code': -1, 'msg': '软件 %s 安装失败:%s' % (name, output)}
344
+
345
+
228
346
  def web_handler(context):
229
347
  '''Handle web requests for APT repository management'''
230
348
  action = context.get('action', '')
231
- source = context.get('source', '')
232
-
233
- if action == 'list':
234
- items = get_list()
349
+ source = context.get('source', '') or context.get('name', '')
350
+
351
+ if action == 'overview':
352
+ return {'code': 0, 'msg': '', 'data': get_status()}
353
+ elif action == 'refresh':
354
+ return refresh_cache()
355
+ elif action == 'list':
356
+ items = get_repo_list()
235
357
  if items is None:
236
358
  return {'code': -1, 'msg': '获取配置失败!'}
237
359
  else:
238
360
  return {'code': 0, 'msg': '', 'data': items}
239
-
361
+
240
362
  elif action == 'item':
241
363
  if not source:
242
364
  return {'code': -1, 'msg': '配置文件不能为空!'}
243
- data = get_item(source)
365
+ data = get_repo_detail(source)
244
366
  if data is None:
245
367
  return {'code': -1, 'msg': '配置文件不存在!'}
246
368
  else:
247
369
  return {'code': 0, 'msg': '', 'data': data}
248
-
370
+
371
+ elif action == 'search':
372
+ keyword = context.get('keyword', '')
373
+ return {'code': 0, 'msg': '', 'data': search_repos(keyword)}
374
+
375
+ elif action == 'install':
376
+ return install_package(source)
377
+
249
378
  elif action == 'add':
250
379
  if not source:
251
380
  return {'code': -1, 'msg': '配置文件不能为空!'}