InPanel 1.2.5__tar.gz → 1.2.6__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 (246) hide show
  1. {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/PKG-INFO +2 -2
  2. {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/SOURCES.txt +27 -11
  3. {inpanel-1.2.5 → inpanel-1.2.6}/PKG-INFO +2 -2
  4. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/app.py +14 -13
  5. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/base.py +2 -3
  6. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/acme.py +1 -2
  7. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/apt.py +6 -7
  8. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/brew.py +5 -6
  9. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/certificate.py +2 -3
  10. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/disk.py +84 -0
  11. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/dnf.py +7 -8
  12. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/docker_source.py +10 -11
  13. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/file.py +246 -14
  14. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/ftp.py +24 -0
  15. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/httpd.py +1 -1
  16. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/mysql.py +966 -577
  17. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/nginx.py +3 -4
  18. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package.py +2 -1
  19. inpanel-1.2.6/inpanel/mod/package_brew.py +60 -0
  20. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/php.py +0 -1
  21. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/pip.py +5 -6
  22. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/plugins.py +1 -2
  23. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/query.py +15 -4
  24. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/remote.py +84 -7
  25. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/server.py +56 -6
  26. inpanel-1.2.6/inpanel/mod/service.py +597 -0
  27. inpanel-1.2.6/inpanel/mod/service_manager.py +910 -0
  28. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/setting.py +3 -3
  29. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/ssh.py +45 -1
  30. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/system.py +86 -2
  31. inpanel-1.2.6/inpanel/mod/task.py +365 -0
  32. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/yum.py +7 -8
  33. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/index.html +1 -1
  34. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/controllers.js +6 -6
  35. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/database.js +30 -30
  36. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/ecs.js +6 -6
  37. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/file.js +988 -988
  38. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/service.js +249 -155
  39. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/site.js +36 -37
  40. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/utils.js +2789 -2789
  41. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/core.js +1 -0
  42. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/directives.js +116 -300
  43. inpanel-1.2.6/inpanel/public/lib/angular/1.0.8/angular.min.js +163 -0
  44. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/main.html +0 -5
  45. inpanel-1.2.6/inpanel/public/partials/service/index.html +77 -0
  46. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/setting.html +1 -1
  47. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/task.html +9 -9
  48. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/templates/index.html +1 -1
  49. inpanel-1.2.6/inpanel/templates/services/__init__.py +124 -0
  50. inpanel-1.2.6/inpanel/templates/services/_common.json +8 -0
  51. inpanel-1.2.6/inpanel/templates/services/categories.json +68 -0
  52. inpanel-1.2.6/inpanel/templates/services/database.json +170 -0
  53. inpanel-1.2.6/inpanel/templates/services/ftp.json +69 -0
  54. inpanel-1.2.6/inpanel/templates/services/http.json +153 -0
  55. inpanel-1.2.6/inpanel/templates/services/java.json +86 -0
  56. inpanel-1.2.6/inpanel/templates/services/mail.json +47 -0
  57. inpanel-1.2.6/inpanel/templates/services/nodejs.json +82 -0
  58. inpanel-1.2.6/inpanel/templates/services/php.json +194 -0
  59. inpanel-1.2.6/inpanel/templates/services/security.json +93 -0
  60. inpanel-1.2.6/inpanel/templates/services/storage.json +28 -0
  61. inpanel-1.2.6/inpanel/templates/services/system.json +122 -0
  62. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/__init__.py +3 -2
  63. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/web.py +161 -387
  64. {inpanel-1.2.5 → inpanel-1.2.6}/pyproject.toml +2 -2
  65. inpanel-1.2.5/inpanel/mod/service.py +0 -280
  66. inpanel-1.2.5/inpanel/mod/task.py +0 -1442
  67. inpanel-1.2.5/inpanel/public/partials/service/index.html +0 -468
  68. {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/dependency_links.txt +0 -0
  69. {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/entry_points.txt +0 -0
  70. {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/requires.txt +0 -0
  71. {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/top_level.txt +0 -0
  72. {inpanel-1.2.5 → inpanel-1.2.6}/LICENSE +0 -0
  73. {inpanel-1.2.5 → inpanel-1.2.6}/MANIFEST.in +0 -0
  74. {inpanel-1.2.5 → inpanel-1.2.6}/README.md +0 -0
  75. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/__init__.py +0 -0
  76. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/config.py +0 -0
  77. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/__init__.py +0 -0
  78. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/async_process.py +0 -0
  79. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/filelock.py +0 -0
  80. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/magic.py +0 -0
  81. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/pxssh.py +0 -0
  82. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/pyDes.py +0 -0
  83. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/__init__.py +0 -0
  84. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/aliyuncs.py +0 -0
  85. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/config.py +0 -0
  86. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/cron.py +0 -0
  87. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/docker.py +0 -0
  88. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall.py +0 -0
  89. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_base.py +0 -0
  90. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_firewalld.py +0 -0
  91. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_iptables.py +0 -0
  92. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_macos.py +0 -0
  93. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_ufw.py +0 -0
  94. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/lighttpd.py +0 -0
  95. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/login.py +0 -0
  96. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/named.py +0 -0
  97. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_apt.py +0 -0
  98. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_base.py +0 -0
  99. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_dnf.py +0 -0
  100. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_map.py +0 -0
  101. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_yum.py +0 -0
  102. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/process.py +0 -0
  103. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/proftpd.py +0 -0
  104. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/pureftpd.py +0 -0
  105. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/shell.py +0 -0
  106. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/user.py +0 -0
  107. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/vsftpd.py +0 -0
  108. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/plugin.py +0 -0
  109. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/css/global.css +0 -0
  110. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/favicon.ico +0 -0
  111. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/images/alipay.jpg +0 -0
  112. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/images/loading.gif +0 -0
  113. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/images/weixin.jpg +0 -0
  114. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/container.js +0 -0
  115. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/plugins.js +0 -0
  116. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/filters.js +0 -0
  117. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/services.js +0 -0
  118. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/angular/1.0.2/angular-resource.min.js +0 -0
  119. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/angular/1.0.2/angular.min.js +0 -0
  120. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css +0 -0
  121. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +0 -0
  122. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +0 -0
  123. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +0 -0
  124. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.css +0 -0
  125. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.css.map +0 -0
  126. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.min.css +0 -0
  127. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +0 -0
  128. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  129. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
  130. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  131. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  132. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  133. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  134. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  135. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/js/bootstrap.js +0 -0
  136. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/js/bootstrap.min.js +0 -0
  137. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/js/npm.js +0 -0
  138. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/codemirror/codemirror-compressed.js +0 -0
  139. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/codemirror/codemirror.css +0 -0
  140. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/jquery/jquery-1.12.4.min.js +0 -0
  141. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/md5/md5.js +0 -0
  142. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/md5/md5.min.js +0 -0
  143. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/message.html +0 -0
  144. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/navbar.html +0 -0
  145. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/selector.html +0 -0
  146. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvbase.html +0 -0
  147. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvext.html +0 -0
  148. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvfile.html +0 -0
  149. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvinstall.html +0 -0
  150. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvlog.html +0 -0
  151. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvminiop.html +0 -0
  152. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvuninstall.html +0 -0
  153. {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvupdate.html +0 -0
  154. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/container/index.html +0 -0
  155. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/index.html +0 -0
  156. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/dbedit.html +0 -0
  157. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/dbnew.html +0 -0
  158. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/useredit.html +0 -0
  159. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/usernew.html +0 -0
  160. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/account.html +0 -0
  161. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/ecs.html +0 -0
  162. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/index.html +0 -0
  163. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/setings.html +0 -0
  164. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/file/file.html +0 -0
  165. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/file/trash.html +0 -0
  166. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ftp.html +0 -0
  167. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/log.html +0 -0
  168. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/login.html +0 -0
  169. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/logout.html +0 -0
  170. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/config.html +0 -0
  171. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/detail.html +0 -0
  172. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/index.html +0 -0
  173. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/info.html +0 -0
  174. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/secure.html +0 -0
  175. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/apache.html +0 -0
  176. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/cron.html +0 -0
  177. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/fail2ban.html +0 -0
  178. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/firewalld.html +0 -0
  179. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/iptables.html +0 -0
  180. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java11.html +0 -0
  181. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java17.html +0 -0
  182. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java21.html +0 -0
  183. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java8.html +0 -0
  184. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/lighttpd.html +0 -0
  185. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/mariadb.html +0 -0
  186. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/memcache.html +0 -0
  187. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/minio.html +0 -0
  188. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/mongodb.html +0 -0
  189. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/mysql.html +0 -0
  190. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/named.html +0 -0
  191. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nginx.html +0 -0
  192. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs18.html +0 -0
  193. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs20.html +0 -0
  194. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs22.html +0 -0
  195. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs24.html +0 -0
  196. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/ntp.html +0 -0
  197. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php.html +0 -0
  198. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php56.html +0 -0
  199. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php74.html +0 -0
  200. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php80.html +0 -0
  201. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php81.html +0 -0
  202. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php82.html +0 -0
  203. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php83.html +0 -0
  204. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php84.html +0 -0
  205. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/proftpd.html +0 -0
  206. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/pureftpd.html +0 -0
  207. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/redis.html +0 -0
  208. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/samba.html +0 -0
  209. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/sendmail.html +0 -0
  210. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/ssh.html +0 -0
  211. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/tomcat.html +0 -0
  212. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/ufw.html +0 -0
  213. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/vsftpd.html +0 -0
  214. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/site/apache/site.html +0 -0
  215. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/site/index.html +0 -0
  216. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/site/nginx/site.html +0 -0
  217. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/sorry.html +0 -0
  218. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/autofm.html +0 -0
  219. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/backup.html +0 -0
  220. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/index.html +0 -0
  221. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/migrate.html +0 -0
  222. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/movedata.html +0 -0
  223. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/remote.html +0 -0
  224. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/cron.html +0 -0
  225. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/firewall.html +0 -0
  226. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/index.html +0 -0
  227. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/network.html +0 -0
  228. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/process.html +0 -0
  229. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/shell.html +0 -0
  230. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/sources.html +0 -0
  231. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/ssl.html +0 -0
  232. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/time.html +0 -0
  233. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/user.html +0 -0
  234. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/robots.txt +0 -0
  235. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/templates/file/preview.html +0 -0
  236. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/__init__.py +0 -0
  237. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/apt.json +0 -0
  238. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/brew.json +0 -0
  239. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/dnf.json +0 -0
  240. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/docker.json +0 -0
  241. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/package_map.json +0 -0
  242. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/pip.json +0 -0
  243. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/third_party.json +0 -0
  244. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/yum.json +0 -0
  245. {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/utils.py +0 -0
  246. {inpanel-1.2.5 → inpanel-1.2.6}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.5
4
- Summary: InPanel - A Web-based Linux Server Management Tool
3
+ Version: 1.2.6
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
7
  License: BSD 3-Clause License
@@ -50,6 +50,7 @@ inpanel/mod/nginx.py
50
50
  inpanel/mod/package.py
51
51
  inpanel/mod/package_apt.py
52
52
  inpanel/mod/package_base.py
53
+ inpanel/mod/package_brew.py
53
54
  inpanel/mod/package_dnf.py
54
55
  inpanel/mod/package_map.py
55
56
  inpanel/mod/package_yum.py
@@ -63,6 +64,7 @@ inpanel/mod/query.py
63
64
  inpanel/mod/remote.py
64
65
  inpanel/mod/server.py
65
66
  inpanel/mod/service.py
67
+ inpanel/mod/service_manager.py
66
68
  inpanel/mod/setting.py
67
69
  inpanel/mod/shell.py
68
70
  inpanel/mod/ssh.py
@@ -93,6 +95,7 @@ inpanel/public/js/controllers/site.js
93
95
  inpanel/public/js/controllers/utils.js
94
96
  inpanel/public/lib/angular/1.0.2/angular-resource.min.js
95
97
  inpanel/public/lib/angular/1.0.2/angular.min.js
98
+ inpanel/public/lib/angular/1.0.8/angular.min.js
96
99
  inpanel/public/lib/bootstrap/css/bootstrap-theme.css
97
100
  inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map
98
101
  inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css
@@ -125,22 +128,22 @@ inpanel/public/partials/secure.html
125
128
  inpanel/public/partials/setting.html
126
129
  inpanel/public/partials/sorry.html
127
130
  inpanel/public/partials/container/index.html
131
+ inpanel/public/partials/container/directives/message.html
132
+ inpanel/public/partials/container/directives/navbar.html
133
+ inpanel/public/partials/container/directives/selector.html
134
+ inpanel/public/partials/container/directives/srvbase.html
135
+ inpanel/public/partials/container/directives/srvext.html
136
+ inpanel/public/partials/container/directives/srvfile.html
137
+ inpanel/public/partials/container/directives/srvinstall.html
138
+ inpanel/public/partials/container/directives/srvlog.html
139
+ inpanel/public/partials/container/directives/srvminiop.html
140
+ inpanel/public/partials/container/directives/srvuninstall.html
141
+ inpanel/public/partials/container/directives/srvupdate.html
128
142
  inpanel/public/partials/database/index.html
129
143
  inpanel/public/partials/database/mysql/dbedit.html
130
144
  inpanel/public/partials/database/mysql/dbnew.html
131
145
  inpanel/public/partials/database/mysql/useredit.html
132
146
  inpanel/public/partials/database/mysql/usernew.html
133
- inpanel/public/partials/directives/message.html
134
- inpanel/public/partials/directives/navbar.html
135
- inpanel/public/partials/directives/selector.html
136
- inpanel/public/partials/directives/srvbase.html
137
- inpanel/public/partials/directives/srvext.html
138
- inpanel/public/partials/directives/srvfile.html
139
- inpanel/public/partials/directives/srvinstall.html
140
- inpanel/public/partials/directives/srvlog.html
141
- inpanel/public/partials/directives/srvminiop.html
142
- inpanel/public/partials/directives/srvuninstall.html
143
- inpanel/public/partials/directives/srvupdate.html
144
147
  inpanel/public/partials/ecs/account.html
145
148
  inpanel/public/partials/ecs/ecs.html
146
149
  inpanel/public/partials/ecs/index.html
@@ -214,6 +217,19 @@ inpanel/public/partials/utils/user.html
214
217
  inpanel/public/templates/index.html
215
218
  inpanel/public/templates/file/preview.html
216
219
  inpanel/templates/__init__.py
220
+ inpanel/templates/services/__init__.py
221
+ inpanel/templates/services/_common.json
222
+ inpanel/templates/services/categories.json
223
+ inpanel/templates/services/database.json
224
+ inpanel/templates/services/ftp.json
225
+ inpanel/templates/services/http.json
226
+ inpanel/templates/services/java.json
227
+ inpanel/templates/services/mail.json
228
+ inpanel/templates/services/nodejs.json
229
+ inpanel/templates/services/php.json
230
+ inpanel/templates/services/security.json
231
+ inpanel/templates/services/storage.json
232
+ inpanel/templates/services/system.json
217
233
  inpanel/templates/sources/__init__.py
218
234
  inpanel/templates/sources/apt.json
219
235
  inpanel/templates/sources/brew.json
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: InPanel
3
- Version: 1.2.5
4
- Summary: InPanel - A Web-based Linux Server Management Tool
3
+ Version: 1.2.6
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
7
  License: BSD 3-Clause License
@@ -247,16 +247,16 @@ def cmd_uninstall(args=None):
247
247
  print('Uninstalling InPanel...')
248
248
 
249
249
  # 移除 systemd 服务
250
- if os.path.exists(systemd_service):
250
+ if Path(systemd_service).exists():
251
251
  try:
252
252
  subprocess.run(['systemctl', 'stop', 'inpanel'], stderr=subprocess.DEVNULL)
253
253
  subprocess.run(['systemctl', 'disable', 'inpanel'], stderr=subprocess.DEVNULL)
254
254
  except Exception:
255
255
  pass
256
- os.remove(systemd_service)
256
+ Path(systemd_service).unlink()
257
257
  print(f' removed: {systemd_service}')
258
- if os.path.exists(systemd_service_etc):
259
- os.remove(systemd_service_etc)
258
+ if Path(systemd_service_etc).exists():
259
+ Path(systemd_service_etc).unlink()
260
260
  print(f' removed: {systemd_service_etc}')
261
261
  try:
262
262
  subprocess.run(['systemctl', 'daemon-reload'], stderr=subprocess.DEVNULL)
@@ -264,7 +264,7 @@ def cmd_uninstall(args=None):
264
264
  pass
265
265
 
266
266
  # 移除 init.d 脚本
267
- if os.path.exists(initd_script):
267
+ if Path(initd_script).exists():
268
268
  try:
269
269
  subprocess.run(['chkconfig', '--del', 'inpanel'], stderr=subprocess.DEVNULL)
270
270
  except Exception:
@@ -273,12 +273,12 @@ def cmd_uninstall(args=None):
273
273
  subprocess.run(['update-rc.d', '-f', 'inpanel', 'remove'], stderr=subprocess.DEVNULL)
274
274
  except Exception:
275
275
  pass
276
- os.remove(initd_script)
276
+ Path(initd_script).unlink()
277
277
  print(f' removed: {initd_script}')
278
278
 
279
279
  # 移除二进制文件 / 控制台脚本
280
- if os.path.exists(bin_path):
281
- os.remove(bin_path)
280
+ if Path(bin_path).exists():
281
+ Path(bin_path).unlink()
282
282
  print(f' removed: {bin_path}')
283
283
 
284
284
  # 通过 pip 移除 Python 包
@@ -298,18 +298,18 @@ def cmd_uninstall(args=None):
298
298
  print(f' removed: {pkg_path}')
299
299
 
300
300
  # 移除配置文件(可选)
301
- if purge_config and config_path and os.path.exists(config_path):
301
+ if purge_config and config_path and Path(config_path).exists():
302
302
  shutil.rmtree(config_path, ignore_errors=True)
303
303
  print(f' removed: {config_path} (config files)')
304
304
 
305
305
  # 移除日志文件(可选)
306
- if purge_logs and logging_path and os.path.exists(logging_path):
306
+ if purge_logs and logging_path and Path(logging_path).exists():
307
307
  shutil.rmtree(logging_path, ignore_errors=True)
308
308
  print(f' removed: {logging_path} (log files)')
309
309
 
310
- pidfile_dir = os.path.dirname(pidfile)
311
- if os.path.exists(pidfile):
312
- os.remove(pidfile)
310
+ pidfile_dir = str(Path(pidfile).parent)
311
+ if Path(pidfile).exists():
312
+ Path(pidfile).unlink()
313
313
 
314
314
  print()
315
315
  print('InPanel uninstalled successfully.')
@@ -381,6 +381,7 @@ def run_server():
381
381
  (r'/api/sources/pip/(.+?)(?:/(.+))?', web.RepoPipHandler),
382
382
  (r'/api/sources/docker/(.+?)(?:/(.+))?', web.RepoDockerHandler),
383
383
  (r'/api/sources/supported/?', web.RepoSupportedHandler),
384
+ (r'/api/service/(.+?)(?:/(.+))?', web.ServiceHandler),
384
385
  (r'/api/firewall/(.+)', web.FirewallHandler),
385
386
  (r'/api/setting/(.+)', web.SettingHandler),
386
387
  (r'/api/operation/(.+)', web.OperationHandler),
@@ -8,7 +8,6 @@
8
8
  '''InPanel 基础信息模块'''
9
9
 
10
10
  import sys
11
- import os
12
11
  from pathlib import Path
13
12
  from platform import mac_ver, platform, uname, win32_ver
14
13
 
@@ -41,8 +40,8 @@ __author__ = 'Jackson Dou'
41
40
  __license__ = 'BSD'
42
41
 
43
42
  app_name = 'InPanel'
44
- releasetime = '2026-07-18'
45
- DEBUG = False
43
+ releasetime = '2026-07-22'
44
+ DEBUG = True
46
45
  COMMENTFLAG = '#INPANEL#'
47
46
  GENBY = 'AUTOMATICALLY GENERATED BY INPANEL'
48
47
 
@@ -14,7 +14,6 @@ from binascii import unhexlify
14
14
  from hashlib import sha256
15
15
  from json import dumps, loads
16
16
  from pathlib import Path
17
- import os
18
17
  from subprocess import PIPE, STDOUT, Popen
19
18
  from time import sleep
20
19
 
@@ -229,7 +228,7 @@ class ACME():
229
228
  wellknown_url = "http://{0}/.well-known/acme-challenge/{1}".format(domain, token)
230
229
  assert(disable_check or self._request(wellknown_url)[0] == key_auth)
231
230
  except (AssertionError, ValueError) as e:
232
- os.remove(wellknown_path)
231
+ Path(wellknown_path).unlink()
233
232
  raise ValueError("Wrote file to {0}, but couldn't download {1}: {2}".format(
234
233
  wellknown_path, wellknown_url, e))
235
234
 
@@ -13,7 +13,6 @@
13
13
  '''
14
14
 
15
15
  import json
16
- import os
17
16
  import re
18
17
  import time
19
18
  from pathlib import Path
@@ -38,12 +37,12 @@ from ..base import config_path
38
37
 
39
38
  def _get_sources_file():
40
39
  conf_dir = str(config_path).rstrip('/')
41
- return os.path.join(conf_dir, 'sources_apt.json')
40
+ return str(Path(conf_dir) / 'sources_apt.json')
42
41
 
43
42
 
44
43
  def _load_sources_config():
45
44
  filepath = _get_sources_file()
46
- if os.path.isfile(filepath):
45
+ if Path(filepath).is_file():
47
46
  try:
48
47
  with open(filepath, 'r', encoding='utf-8') as f:
49
48
  data = json.load(f)
@@ -58,10 +57,10 @@ def _load_sources_config():
58
57
 
59
58
  def _save_sources_config(sources):
60
59
  filepath = _get_sources_file()
61
- conf_dir = os.path.dirname(filepath)
62
- if not os.path.isdir(conf_dir):
60
+ conf_dir = str(Path(filepath).parent)
61
+ if not Path(conf_dir).is_dir():
63
62
  try:
64
- os.makedirs(conf_dir, exist_ok=True)
63
+ Path(conf_dir).mkdir(parents=True, exist_ok=True)
65
64
  except OSError:
66
65
  pass
67
66
  try:
@@ -153,7 +152,7 @@ def get_list():
153
152
  if Path(sources_list_path).exists():
154
153
  res.append('sources.list')
155
154
  if Path(sources_list_d_path).exists() and Path(sources_list_d_path).is_dir():
156
- items = sorted(os.listdir(sources_list_d_path))
155
+ items = sorted(p.name for p in Path(sources_list_d_path).iterdir())
157
156
  for item in items:
158
157
  if item.endswith('.list'):
159
158
  res.append('sources.list.d/' + item)
@@ -17,7 +17,6 @@
17
17
  '''
18
18
 
19
19
  import json
20
- import os
21
20
  import time
22
21
  from pathlib import Path
23
22
  from subprocess import getstatusoutput
@@ -40,12 +39,12 @@ _BREW_BUILTIN_MIRRORS = _cfg['brew_builtin_mirrors']
40
39
 
41
40
  def _get_sources_file():
42
41
  conf_dir = str(config_path).rstrip('/')
43
- return os.path.join(conf_dir, 'sources_brew.json')
42
+ return str(Path(conf_dir) / 'sources_brew.json')
44
43
 
45
44
 
46
45
  def _load_sources_config():
47
46
  filepath = _get_sources_file()
48
- if os.path.isfile(filepath):
47
+ if Path(filepath).is_file():
49
48
  try:
50
49
  with open(filepath, 'r', encoding='utf-8') as f:
51
50
  data = json.load(f)
@@ -60,10 +59,10 @@ def _load_sources_config():
60
59
 
61
60
  def _save_sources_config(sources):
62
61
  filepath = _get_sources_file()
63
- conf_dir = os.path.dirname(filepath)
64
- if not os.path.isdir(conf_dir):
62
+ conf_dir = str(Path(filepath).parent)
63
+ if not Path(conf_dir).is_dir():
65
64
  try:
66
- os.makedirs(conf_dir, exist_ok=True)
65
+ Path(conf_dir).mkdir(parents=True, exist_ok=True)
67
66
  except OSError:
68
67
  pass
69
68
  try:
@@ -13,14 +13,13 @@ from shutil import copy
13
13
  from subprocess import PIPE, Popen
14
14
 
15
15
  from . import file
16
- import os
17
16
  from .acme import ACME
18
17
 
19
18
 
20
19
  class Certificate():
21
20
 
22
21
  def __init__(self):
23
- # self.path_current = os.path.dirname(os.path.abspath(__file__))
22
+ # self.path_current = str(Path(__file__).resolve().parent)
24
23
  self.path_home = '/etc/inpanel/certs/'
25
24
  self.path_acc = str(Path(self.path_home) / 'client.key')
26
25
  self.path_crt = str(Path(self.path_home) / 'crt')
@@ -142,7 +141,7 @@ class Certificate():
142
141
  cmd.extend(['-reqexts', 'SAN', '-config', conf_tmp])
143
142
  out = self._cmd(cmd, err_msg="Create csr error")
144
143
  if conf_tmp is not None and Path(conf_tmp).exists():
145
- os.remove(conf_tmp)
144
+ Path(conf_tmp).unlink()
146
145
  if out is None:
147
146
  return {'code': -1, 'msg': 'csr_create_error'}
148
147
  else:
@@ -310,6 +310,90 @@ def fstab(devname, config=None):
310
310
  devname=devname, config=config)
311
311
 
312
312
 
313
+ # ------------------------------------------------------------------
314
+ # 异步任务函数(由 web.py 的 _dispatch_task 调用)
315
+ # 命名规则:disk_<method>,对应 jobname 中的 disk_<method>_...
316
+ # ------------------------------------------------------------------
317
+
318
+ from . import shell
319
+
320
+
321
+ async def disk_swap(tm, action, devname):
322
+ """启用/停用 swap(异步任务)"""
323
+ jobname = f'disk.swap_{action}_{devname}'
324
+ if not tm._start_job(jobname):
325
+ return
326
+
327
+ action_str = {'on': '启用', 'off': '停用'}
328
+ tm._update_job(jobname, 2, f'正在{action_str.get(action, action)} {devname}...')
329
+
330
+ if action == 'on':
331
+ cmd = f'swapon /dev/{devname}'
332
+ else:
333
+ cmd = f'swapoff /dev/{devname}'
334
+
335
+ result, output = await shell.async_command(cmd)
336
+ if result == 0:
337
+ tm._finish_job(jobname, 0, f'{action_str.get(action, action)} {devname} 成功!')
338
+ else:
339
+ tm._finish_job(jobname, -1,
340
+ f'{action_str.get(action, action)} {devname} 失败!',
341
+ data=output.strip().replace('\n', '<br>'))
342
+
343
+
344
+ async def disk_mount(tm, action, devname, mountpoint, fstype):
345
+ """挂载/卸载磁盘(异步任务)"""
346
+ jobname = f'disk.mount_{action}_{devname}'
347
+ if not tm._start_job(jobname):
348
+ return
349
+
350
+ action_str = {'mount': '挂载', 'umount': '卸载'}
351
+ tm._update_job(jobname, 2, f'正在{action_str.get(action, action)} {devname} 到 {mountpoint}...')
352
+
353
+ if action == 'mount':
354
+ fstab(devname, {
355
+ 'devname': devname,
356
+ 'mount': mountpoint,
357
+ 'fstype': fstype,
358
+ })
359
+ cmd = f'mount -t {fstype} /dev/{devname} {mountpoint}'
360
+ else:
361
+ cmd = f'umount /dev/{devname}'
362
+
363
+ result, output = await shell.async_command(cmd)
364
+ if result == 0:
365
+ tm._finish_job(jobname, 0, f'{action_str.get(action, action)} {devname} 成功!')
366
+ else:
367
+ tm._finish_job(jobname, -1,
368
+ f'{action_str.get(action, action)} {devname} 失败!',
369
+ data=output.strip().replace('\n', '<br>'))
370
+
371
+
372
+ async def disk_format(tm, devname, fstype):
373
+ """格式化磁盘(异步任务)"""
374
+ jobname = f'disk.format_{devname}'
375
+ if not tm._start_job(jobname):
376
+ return
377
+
378
+ tm._update_job(jobname, 2, f'正在格式化 {devname},可能需要较长时间,请耐心等候...')
379
+
380
+ if fstype in ('ext2', 'ext3', 'ext4'):
381
+ cmd = f'mkfs.{fstype} -F /dev/{devname}'
382
+ elif fstype in ('xfs', 'reiserfs', 'btrfs'):
383
+ cmd = f'mkfs.{fstype} -f /dev/{devname}'
384
+ elif fstype == 'swap':
385
+ cmd = f'mkswap -f /dev/{devname}'
386
+ else:
387
+ cmd = f'mkfs.{fstype} /dev/{devname}'
388
+
389
+ result, output = await shell.async_command(cmd)
390
+ if result == 0:
391
+ tm._finish_job(jobname, 0, f'{devname} 格式化成功!')
392
+ else:
393
+ tm._finish_job(jobname, -1, f'{devname} 格式化失败!',
394
+ data=output.strip().replace('\n', '<br>'))
395
+
396
+
313
397
  if __name__ == '__main__':
314
398
  # !!!!!!!!!!! DANGEROUS TESTING !!!!!!!!!!!
315
399
  # print('* Add partition to sdb with 5G:',)
@@ -13,7 +13,6 @@
13
13
  '''
14
14
 
15
15
  import json
16
- import os
17
16
  import re
18
17
  import time
19
18
  from pathlib import Path
@@ -38,12 +37,12 @@ config_path = '/etc/yum.repos.d'
38
37
 
39
38
  def _get_sources_file():
40
39
  conf_dir = str(_base_config_path).rstrip('/')
41
- return os.path.join(conf_dir, 'sources_dnf.json')
40
+ return str(Path(conf_dir) / 'sources_dnf.json')
42
41
 
43
42
 
44
43
  def _load_sources_config():
45
44
  filepath = _get_sources_file()
46
- if os.path.isfile(filepath):
45
+ if Path(filepath).is_file():
47
46
  try:
48
47
  with open(filepath, 'r', encoding='utf-8') as f:
49
48
  data = json.load(f)
@@ -58,10 +57,10 @@ def _load_sources_config():
58
57
 
59
58
  def _save_sources_config(sources):
60
59
  filepath = _get_sources_file()
61
- conf_dir = os.path.dirname(filepath)
62
- if not os.path.isdir(conf_dir):
60
+ conf_dir = str(Path(filepath).parent)
61
+ if not Path(conf_dir).is_dir():
63
62
  try:
64
- os.makedirs(conf_dir, exist_ok=True)
63
+ Path(conf_dir).mkdir(parents=True, exist_ok=True)
65
64
  except OSError:
66
65
  pass
67
66
  try:
@@ -144,7 +143,7 @@ def get_list():
144
143
  d = str(Path(config_path))
145
144
  if not Path(d).exists() or not Path(d).is_dir():
146
145
  return None
147
- items = sorted(os.listdir(d))
146
+ items = sorted(p.name for p in Path(d).iterdir())
148
147
  return items if len(items) > 0 else []
149
148
  elif base.kernel_name in ('Darwin'):
150
149
  return None
@@ -298,7 +297,7 @@ def get_repo_list():
298
297
  d = Path(config_path)
299
298
  if not d.exists() or not d.is_dir():
300
299
  return []
301
- items = sorted(os.listdir(str(d)))
300
+ items = sorted(p.name for p in Path(d).iterdir())
302
301
  repos = []
303
302
  for item in items:
304
303
  if not item.endswith('.repo'):
@@ -16,7 +16,6 @@ Docker 镜像加速源管理:通过 /etc/docker/daemon.json 中的 registry-mi
16
16
  """
17
17
 
18
18
  import json
19
- import os
20
19
  import time
21
20
  from pathlib import Path
22
21
 
@@ -34,7 +33,7 @@ _DOCKER_DAEMON_PATH = '/etc/docker/daemon.json'
34
33
 
35
34
  def _get_docker_sources_file():
36
35
  """获取 Docker 源配置文件的路径"""
37
- return os.path.join(config_path, 'sources_docker.json')
36
+ return str(Path(config_path) / 'sources_docker.json')
38
37
 
39
38
 
40
39
  def _load_sources_config():
@@ -44,7 +43,7 @@ def _load_sources_config():
44
43
  返回源列表(list of dict),每个 dict 包含 name、url、builtin。
45
44
  """
46
45
  filepath = _get_docker_sources_file()
47
- if os.path.isfile(filepath):
46
+ if Path(filepath).is_file():
48
47
  try:
49
48
  with open(filepath, 'r', encoding='utf-8') as f:
50
49
  data = json.load(f)
@@ -62,10 +61,10 @@ def _load_sources_config():
62
61
  def _save_sources_config(sources):
63
62
  """保存 Docker 源配置到 sources_docker.json"""
64
63
  filepath = _get_docker_sources_file()
65
- conf_dir = os.path.dirname(filepath)
66
- if not os.path.isdir(conf_dir):
64
+ conf_dir = str(Path(filepath).parent)
65
+ if not Path(conf_dir).is_dir():
67
66
  try:
68
- os.makedirs(conf_dir, exist_ok=True)
67
+ Path(conf_dir).mkdir(parents=True, exist_ok=True)
69
68
  except OSError:
70
69
  pass
71
70
  try:
@@ -81,7 +80,7 @@ def _read_daemon_json():
81
80
  Returns:
82
81
  dict: daemon.json 的内容,如果文件不存在或解析失败返回空 dict
83
82
  """
84
- if not os.path.isfile(_DOCKER_DAEMON_PATH):
83
+ if not Path(_DOCKER_DAEMON_PATH).is_file():
85
84
  return {}
86
85
  try:
87
86
  with open(_DOCKER_DAEMON_PATH, 'r', encoding='utf-8') as f:
@@ -100,9 +99,9 @@ def _write_daemon_json(config):
100
99
  config: dict,要写入的配置
101
100
  """
102
101
  try:
103
- daemon_dir = os.path.dirname(_DOCKER_DAEMON_PATH)
104
- if not os.path.isdir(daemon_dir):
105
- os.makedirs(daemon_dir, exist_ok=True)
102
+ daemon_dir = str(Path(_DOCKER_DAEMON_PATH).parent)
103
+ if not Path(daemon_dir).is_dir():
104
+ Path(daemon_dir).mkdir(parents=True, exist_ok=True)
106
105
  with open(_DOCKER_DAEMON_PATH, 'w', encoding='utf-8') as f:
107
106
  json.dump(config, f, ensure_ascii=False, indent=2)
108
107
  f.write('\n')
@@ -334,7 +333,7 @@ def web_handler(context, action):
334
333
  name = context.get_argument('name', '')
335
334
 
336
335
  if action == 'overview':
337
- daemon_exists = os.path.isfile(_DOCKER_DAEMON_PATH)
336
+ daemon_exists = Path(_DOCKER_DAEMON_PATH).is_file()
338
337
  active_mirrors = _get_active_mirrors()
339
338
  context.write({
340
339
  'code': 0,