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