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.
- {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/PKG-INFO +2 -2
- {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/SOURCES.txt +27 -11
- {inpanel-1.2.5 → inpanel-1.2.6}/PKG-INFO +2 -2
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/app.py +14 -13
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/base.py +2 -3
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/acme.py +1 -2
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/apt.py +6 -7
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/brew.py +5 -6
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/certificate.py +2 -3
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/disk.py +84 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/dnf.py +7 -8
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/docker_source.py +10 -11
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/file.py +246 -14
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/ftp.py +24 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/httpd.py +1 -1
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/mysql.py +966 -577
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/nginx.py +3 -4
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package.py +2 -1
- inpanel-1.2.6/inpanel/mod/package_brew.py +60 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/php.py +0 -1
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/pip.py +5 -6
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/plugins.py +1 -2
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/query.py +15 -4
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/remote.py +84 -7
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/server.py +56 -6
- inpanel-1.2.6/inpanel/mod/service.py +597 -0
- inpanel-1.2.6/inpanel/mod/service_manager.py +910 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/setting.py +3 -3
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/ssh.py +45 -1
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/system.py +86 -2
- inpanel-1.2.6/inpanel/mod/task.py +365 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/yum.py +7 -8
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/index.html +1 -1
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/controllers.js +6 -6
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/database.js +30 -30
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/ecs.js +6 -6
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/file.js +988 -988
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/service.js +249 -155
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/site.js +36 -37
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/utils.js +2789 -2789
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/core.js +1 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/directives.js +116 -300
- inpanel-1.2.6/inpanel/public/lib/angular/1.0.8/angular.min.js +163 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/main.html +0 -5
- inpanel-1.2.6/inpanel/public/partials/service/index.html +77 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/setting.html +1 -1
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/task.html +9 -9
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/templates/index.html +1 -1
- inpanel-1.2.6/inpanel/templates/services/__init__.py +124 -0
- inpanel-1.2.6/inpanel/templates/services/_common.json +8 -0
- inpanel-1.2.6/inpanel/templates/services/categories.json +68 -0
- inpanel-1.2.6/inpanel/templates/services/database.json +170 -0
- inpanel-1.2.6/inpanel/templates/services/ftp.json +69 -0
- inpanel-1.2.6/inpanel/templates/services/http.json +153 -0
- inpanel-1.2.6/inpanel/templates/services/java.json +86 -0
- inpanel-1.2.6/inpanel/templates/services/mail.json +47 -0
- inpanel-1.2.6/inpanel/templates/services/nodejs.json +82 -0
- inpanel-1.2.6/inpanel/templates/services/php.json +194 -0
- inpanel-1.2.6/inpanel/templates/services/security.json +93 -0
- inpanel-1.2.6/inpanel/templates/services/storage.json +28 -0
- inpanel-1.2.6/inpanel/templates/services/system.json +122 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/__init__.py +3 -2
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/web.py +161 -387
- {inpanel-1.2.5 → inpanel-1.2.6}/pyproject.toml +2 -2
- inpanel-1.2.5/inpanel/mod/service.py +0 -280
- inpanel-1.2.5/inpanel/mod/task.py +0 -1442
- inpanel-1.2.5/inpanel/public/partials/service/index.html +0 -468
- {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/dependency_links.txt +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/entry_points.txt +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/requires.txt +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/InPanel.egg-info/top_level.txt +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/LICENSE +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/MANIFEST.in +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/README.md +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/__init__.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/config.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/__init__.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/async_process.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/filelock.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/magic.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/pxssh.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/lib/pyDes.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/__init__.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/aliyuncs.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/config.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/cron.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/docker.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_base.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_firewalld.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_iptables.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_macos.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/firewall_ufw.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/lighttpd.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/login.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/named.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_apt.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_base.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_dnf.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_map.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/package_yum.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/process.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/proftpd.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/pureftpd.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/shell.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/user.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/mod/vsftpd.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/plugin.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/css/global.css +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/favicon.ico +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/images/alipay.jpg +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/images/loading.gif +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/images/weixin.jpg +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/container.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/controllers/plugins.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/filters.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/js/services.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/angular/1.0.2/angular-resource.min.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/angular/1.0.2/angular.min.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.css +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.css.map +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.min.css +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/js/bootstrap.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/js/bootstrap.min.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/bootstrap/js/npm.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/codemirror/codemirror-compressed.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/codemirror/codemirror.css +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/jquery/jquery-1.12.4.min.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/md5/md5.js +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/lib/md5/md5.min.js +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/message.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/navbar.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/selector.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvbase.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvext.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvfile.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvinstall.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvlog.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvminiop.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvuninstall.html +0 -0
- {inpanel-1.2.5/inpanel/public/partials → inpanel-1.2.6/inpanel/public/partials/container}/directives/srvupdate.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/container/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/dbedit.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/dbnew.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/useredit.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/database/mysql/usernew.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/account.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/ecs.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ecs/setings.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/file/file.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/file/trash.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/ftp.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/log.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/login.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/logout.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/config.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/detail.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/plugins/info.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/secure.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/apache.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/cron.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/fail2ban.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/firewalld.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/iptables.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java11.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java17.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java21.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/java8.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/lighttpd.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/mariadb.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/memcache.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/minio.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/mongodb.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/mysql.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/named.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nginx.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs18.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs20.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs22.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/nodejs24.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/ntp.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php56.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php74.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php80.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php81.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php82.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php83.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/php84.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/proftpd.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/pureftpd.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/redis.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/samba.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/sendmail.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/ssh.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/tomcat.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/ufw.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/service/vsftpd.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/site/apache/site.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/site/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/site/nginx/site.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/sorry.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/autofm.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/backup.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/migrate.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/movedata.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/storage/remote.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/cron.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/firewall.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/index.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/network.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/process.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/shell.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/sources.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/ssl.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/time.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/partials/utils/user.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/robots.txt +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/public/templates/file/preview.html +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/__init__.py +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/apt.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/brew.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/dnf.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/docker.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/package_map.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/pip.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/third_party.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/templates/sources/yum.json +0 -0
- {inpanel-1.2.5 → inpanel-1.2.6}/inpanel/utils.py +0 -0
- {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.
|
|
4
|
-
Summary: InPanel - A
|
|
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.
|
|
4
|
-
Summary: InPanel - A
|
|
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
|
|
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
|
-
|
|
256
|
+
Path(systemd_service).unlink()
|
|
257
257
|
print(f' removed: {systemd_service}')
|
|
258
|
-
if
|
|
259
|
-
|
|
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
|
|
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
|
-
|
|
276
|
+
Path(initd_script).unlink()
|
|
277
277
|
print(f' removed: {initd_script}')
|
|
278
278
|
|
|
279
279
|
# 移除二进制文件 / 控制台脚本
|
|
280
|
-
if
|
|
281
|
-
|
|
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
|
|
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
|
|
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 =
|
|
311
|
-
if
|
|
312
|
-
|
|
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-
|
|
45
|
-
DEBUG =
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
62
|
-
if not
|
|
60
|
+
conf_dir = str(Path(filepath).parent)
|
|
61
|
+
if not Path(conf_dir).is_dir():
|
|
63
62
|
try:
|
|
64
|
-
|
|
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(
|
|
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
|
|
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
|
|
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 =
|
|
64
|
-
if not
|
|
62
|
+
conf_dir = str(Path(filepath).parent)
|
|
63
|
+
if not Path(conf_dir).is_dir():
|
|
65
64
|
try:
|
|
66
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
62
|
-
if not
|
|
60
|
+
conf_dir = str(Path(filepath).parent)
|
|
61
|
+
if not Path(conf_dir).is_dir():
|
|
63
62
|
try:
|
|
64
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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 =
|
|
66
|
-
if not
|
|
64
|
+
conf_dir = str(Path(filepath).parent)
|
|
65
|
+
if not Path(conf_dir).is_dir():
|
|
67
66
|
try:
|
|
68
|
-
|
|
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
|
|
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 =
|
|
104
|
-
if not
|
|
105
|
-
|
|
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 =
|
|
336
|
+
daemon_exists = Path(_DOCKER_DAEMON_PATH).is_file()
|
|
338
337
|
active_mirrors = _get_active_mirrors()
|
|
339
338
|
context.write({
|
|
340
339
|
'code': 0,
|