diff --git a/config/config.example.yml b/config/config.example.yml index 1b3563ae..66c6a725 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -8,10 +8,10 @@ app: root: "/www" http: - debug: false - address: ":3000" + debug: true + port: 8888 entrance: "/" - ssl: false + tls: false database: debug: false diff --git a/internal/panel/global.go b/internal/app/global.go similarity index 97% rename from internal/panel/global.go rename to internal/app/global.go index 39fe1a9c..62ece90c 100644 --- a/internal/panel/global.go +++ b/internal/app/global.go @@ -1,4 +1,4 @@ -package panel +package app import ( "github.com/go-chi/chi/v5" diff --git a/internal/apps/fail2ban/service.go b/internal/apps/fail2ban/service.go index faee0240..9613808f 100644 --- a/internal/apps/fail2ban/service.go +++ b/internal/apps/fail2ban/service.go @@ -9,9 +9,9 @@ import ( "github.com/go-rat/chix" "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/data" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/os" @@ -127,7 +127,7 @@ maxretry = ` + jailMaxRetry + ` findtime = ` + jailFindTime + ` bantime = ` + jailBanTime + ` action = %(action_mwl)s -logpath = ` + panel.Root + `/wwwlogs/` + website.Name + `.log +logpath = ` + app.Root + `/wwwlogs/` + website.Name + `.log # ` + jailWebsiteName + `-` + jailWebsiteMode + `-END ` raw += rule @@ -170,13 +170,13 @@ ignoreregex = filter = "sshd" port, err = shell.Execf("cat /etc/ssh/sshd_config | grep 'Port ' | awk '{print $2}'") case "mysql": - logPath = panel.Root + "/server/mysql/mysql-error.log" + logPath = app.Root + "/server/mysql/mysql-error.log" filter = "mysqld-auth" - port, err = shell.Execf("cat %s/server/mysql/conf/my.cnf | grep 'port' | head -n 1 | awk '{print $3}'", panel.Root) + port, err = shell.Execf("cat %s/server/mysql/conf/my.cnf | grep 'port' | head -n 1 | awk '{print $3}'", app.Root) case "pure-ftpd": logPath = "/var/log/messages" filter = "pure-ftpd" - port, err = shell.Execf(`cat %s/server/pure-ftpd/etc/pure-ftpd.conf | grep "Bind" | awk '{print $2}' | awk -F "," '{print $2}'`, panel.Root) + port, err = shell.Execf(`cat %s/server/pure-ftpd/etc/pure-ftpd.conf | grep "Bind" | awk '{print $2}' | awk -F "," '{print $2}'`, app.Root) default: service.Error(w, http.StatusUnprocessableEntity, "未知服务") return diff --git a/internal/apps/frp/service.go b/internal/apps/frp/service.go index 596c0f1f..3991040e 100644 --- a/internal/apps/frp/service.go +++ b/internal/apps/frp/service.go @@ -4,7 +4,7 @@ import ( "fmt" "net/http" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/systemctl" @@ -23,7 +23,7 @@ func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { return } - config, err := io.Read(fmt.Sprintf("%s/server/frp/%s.toml", panel.Root, req.Name)) + config, err := io.Read(fmt.Sprintf("%s/server/frp/%s.toml", app.Root, req.Name)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -39,7 +39,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err = io.Write(fmt.Sprintf("%s/server/frp/%s.toml", panel.Root, req.Name), req.Config, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/frp/%s.toml", app.Root, req.Name), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } diff --git a/internal/apps/gitea/service.go b/internal/apps/gitea/service.go index ff2f5be7..f30e1474 100644 --- a/internal/apps/gitea/service.go +++ b/internal/apps/gitea/service.go @@ -4,7 +4,7 @@ import ( "fmt" "net/http" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/systemctl" @@ -17,7 +17,7 @@ func NewService() *Service { } func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(fmt.Sprintf("%s/server/gitea/app.ini", panel.Root)) + config, err := io.Read(fmt.Sprintf("%s/server/gitea/app.ini", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -33,7 +33,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err = io.Write(fmt.Sprintf("%s/server/gitea/app.ini", panel.Root), req.Config, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/gitea/app.ini", app.Root), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } diff --git a/internal/apps/openresty/service.go b/internal/apps/openresty/service.go index 6bf4970b..9621bdf2 100644 --- a/internal/apps/openresty/service.go +++ b/internal/apps/openresty/service.go @@ -9,7 +9,7 @@ import ( "github.com/go-resty/resty/v2" "github.com/spf13/cast" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/shell" @@ -27,7 +27,7 @@ func NewService() *Service { } func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(fmt.Sprintf("%s/server/openresty/conf/nginx.conf", panel.Root)) + config, err := io.Read(fmt.Sprintf("%s/server/openresty/conf/nginx.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, "获取配置失败") return @@ -42,7 +42,7 @@ func (s *Service) SaveConfig(w http.ResponseWriter, r *http.Request) { service.Error(w, http.StatusInternalServerError, "配置不能为空") } - if err := io.Write(fmt.Sprintf("%s/server/openresty/conf/nginx.conf", panel.Root), config, 0644); err != nil { + if err := io.Write(fmt.Sprintf("%s/server/openresty/conf/nginx.conf", app.Root), config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, "保存配置失败") } @@ -55,11 +55,11 @@ func (s *Service) SaveConfig(w http.ResponseWriter, r *http.Request) { } func (s *Service) ErrorLog(w http.ResponseWriter, r *http.Request) { - if !io.Exists(fmt.Sprintf("%s/wwwlogs/nginx_error.log", panel.Root)) { + if !io.Exists(fmt.Sprintf("%s/wwwlogs/nginx_error.log", app.Root)) { service.Success(w, "") } - out, err := shell.Execf("tail -n 100 %s/%s", panel.Root, "/wwwlogs/openresty_error.log") + out, err := shell.Execf("tail -n 100 %s/%s", app.Root, "/wwwlogs/openresty_error.log") if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) } @@ -68,7 +68,7 @@ func (s *Service) ErrorLog(w http.ResponseWriter, r *http.Request) { } func (s *Service) ClearErrorLog(w http.ResponseWriter, r *http.Request) { - if _, err := shell.Execf("echo '' > %s/%s", panel.Root, "/wwwlogs/openresty_error.log"); err != nil { + if _, err := shell.Execf("echo '' > %s/%s", app.Root, "/wwwlogs/openresty_error.log"); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) } diff --git a/internal/apps/percona/service.go b/internal/apps/percona/service.go index b2f1be7c..becb1f80 100644 --- a/internal/apps/percona/service.go +++ b/internal/apps/percona/service.go @@ -7,9 +7,9 @@ import ( "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/data" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/db" "github.com/TheTNB/panel/pkg/io" @@ -31,7 +31,7 @@ func NewService() *Service { // GetConfig 获取配置 func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(panel.Root + "/server/mysql/conf/my.cnf") + config, err := io.Read(app.Root + "/server/mysql/conf/my.cnf") if err != nil { service.Error(w, http.StatusInternalServerError, "获取 Percona 配置失败") return @@ -48,7 +48,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err := io.Write(panel.Root+"/server/mysql/conf/my.cnf", req.Config, 0644); err != nil { + if err := io.Write(app.Root+"/server/mysql/conf/my.cnf", req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, "写入 Percona 配置失败") return } @@ -138,7 +138,7 @@ func (s *Service) Load(w http.ResponseWriter, r *http.Request) { // ErrorLog 获取错误日志 func (s *Service) ErrorLog(w http.ResponseWriter, r *http.Request) { - log, err := shell.Execf("tail -n 100 %s/server/mysql/mysql-error.log", panel.Root) + log, err := shell.Execf("tail -n 100 %s/server/mysql/mysql-error.log", app.Root) if err != nil { service.Error(w, http.StatusInternalServerError, log) return @@ -149,7 +149,7 @@ func (s *Service) ErrorLog(w http.ResponseWriter, r *http.Request) { // ClearErrorLog 清空错误日志 func (s *Service) ClearErrorLog(w http.ResponseWriter, r *http.Request) { - if _, err := shell.Execf("echo '' > %s/server/mysql/mysql-error.log", panel.Root); err != nil { + if _, err := shell.Execf("echo '' > %s/server/mysql/mysql-error.log", app.Root); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } @@ -159,7 +159,7 @@ func (s *Service) ClearErrorLog(w http.ResponseWriter, r *http.Request) { // SlowLog 获取慢查询日志 func (s *Service) SlowLog(w http.ResponseWriter, r *http.Request) { - log, err := shell.Execf("tail -n 100 %s/server/mysql/mysql-slow.log", panel.Root) + log, err := shell.Execf("tail -n 100 %s/server/mysql/mysql-slow.log", app.Root) if err != nil { service.Error(w, http.StatusInternalServerError, log) return @@ -170,7 +170,7 @@ func (s *Service) SlowLog(w http.ResponseWriter, r *http.Request) { // ClearSlowLog 清空慢查询日志 func (s *Service) ClearSlowLog(w http.ResponseWriter, r *http.Request) { - if _, err := shell.Execf("echo '' > %s/server/mysql/mysql-slow.log", panel.Root); err != nil { + if _, err := shell.Execf("echo '' > %s/server/mysql/mysql-slow.log", app.Root); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } @@ -227,8 +227,8 @@ func (s *Service) getSock() string { if io.Exists("/tmp/mysql.sock") { return "/tmp/mysql.sock" } - if io.Exists(panel.Root + "/server/mysql/config/my.cnf") { - config, _ := io.Read(panel.Root + "/server/mysql/config/my.cnf") + if io.Exists(app.Root + "/server/mysql/config/my.cnf") { + config, _ := io.Read(app.Root + "/server/mysql/config/my.cnf") re := regexp.MustCompile(`socket\s*=\s*(['"]?)([^'"]+)`) matches := re.FindStringSubmatch(config) if len(matches) > 2 { diff --git a/internal/apps/php/service.go b/internal/apps/php/service.go index 66498f9e..7272298f 100644 --- a/internal/apps/php/service.go +++ b/internal/apps/php/service.go @@ -11,9 +11,9 @@ import ( "github.com/go-resty/resty/v2" "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/data" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/shell" @@ -33,7 +33,7 @@ func NewService(version uint) *Service { } func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(fmt.Sprintf("%s/server/php/%d/etc/php.ini", panel.Root, s.version)) + config, err := io.Read(fmt.Sprintf("%s/server/php/%d/etc/php.ini", app.Root, s.version)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -49,7 +49,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err = io.Write(fmt.Sprintf("%s/server/php/%d/etc/php.ini", panel.Root, s.version), req.Config, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/php/%d/etc/php.ini", app.Root, s.version), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } @@ -58,7 +58,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { } func (s *Service) GetFPMConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(fmt.Sprintf("%s/server/php/%d/etc/php-fpm.conf", panel.Root, s.version)) + config, err := io.Read(fmt.Sprintf("%s/server/php/%d/etc/php-fpm.conf", app.Root, s.version)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -74,7 +74,7 @@ func (s *Service) UpdateFPMConfig(w http.ResponseWriter, r *http.Request) { return } - if err = io.Write(fmt.Sprintf("%s/server/php/%d/etc/php-fpm.conf", panel.Root, s.version), req.Config, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/php/%d/etc/php-fpm.conf", app.Root, s.version), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } @@ -110,17 +110,17 @@ func (s *Service) Load(w http.ResponseWriter, r *http.Request) { } func (s *Service) ErrorLog(w http.ResponseWriter, r *http.Request) { - log, _ := shell.Execf("tail -n 500 %s/server/php/%d/var/log/php-fpm.log", panel.Root, s.version) + log, _ := shell.Execf("tail -n 500 %s/server/php/%d/var/log/php-fpm.log", app.Root, s.version) service.Success(w, log) } func (s *Service) SlowLog(w http.ResponseWriter, r *http.Request) { - log, _ := shell.Execf("tail -n 500 %s/server/php/%d/var/log/slow.log", panel.Root, s.version) + log, _ := shell.Execf("tail -n 500 %s/server/php/%d/var/log/slow.log", app.Root, s.version) service.Success(w, log) } func (s *Service) ClearErrorLog(w http.ResponseWriter, r *http.Request) { - if _, err := shell.Execf("echo '' > %s/server/php/%d/var/log/php-fpm.log", panel.Root, s.version); err != nil { + if _, err := shell.Execf("echo '' > %s/server/php/%d/var/log/php-fpm.log", app.Root, s.version); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } @@ -129,7 +129,7 @@ func (s *Service) ClearErrorLog(w http.ResponseWriter, r *http.Request) { } func (s *Service) ClearSlowLog(w http.ResponseWriter, r *http.Request) { - if _, err := shell.Execf("echo '' > %s/server/php/%d/var/log/slow.log", panel.Root, s.version); err != nil { + if _, err := shell.Execf("echo '' > %s/server/php/%d/var/log/slow.log", app.Root, s.version); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } @@ -150,7 +150,7 @@ func (s *Service) ExtensionList(w http.ResponseWriter, r *http.Request) { }) } - raw, err := shell.Execf("%s/server/php/%d/bin/php -m", panel.Root, s.version) + raw, err := shell.Execf("%s/server/php/%d/bin/php -m", app.Root, s.version) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -183,10 +183,10 @@ func (s *Service) InstallExtension(w http.ResponseWriter, r *http.Request) { return } - cmd := fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/%s.sh' install %d >> '/tmp/%s.log' 2>&1`, panel.Root, req.Slug, s.version, req.Slug) + cmd := fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/%s.sh' install %d >> '/tmp/%s.log' 2>&1`, app.Root, req.Slug, s.version, req.Slug) officials := []string{"fileinfo", "exif", "imap", "pdo_pgsql", "zip", "bz2", "readline", "snmp", "ldap", "enchant", "pspell", "calendar", "gmp", "sysvmsg", "sysvsem", "sysvshm", "xsl", "intl", "gettext"} if slices.Contains(officials, req.Slug) { - cmd = fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/official.sh' install '%d' '%s' >> '/tmp/%s.log' 2>&1`, panel.Root, s.version, req.Slug, req.Slug) + cmd = fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/official.sh' install '%d' '%s' >> '/tmp/%s.log' 2>&1`, app.Root, s.version, req.Slug, req.Slug) } task := new(biz.Task) @@ -214,10 +214,10 @@ func (s *Service) UninstallExtension(w http.ResponseWriter, r *http.Request) { return } - cmd := fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/%s.sh' uninstall %d >> '/tmp/%s.log' 2>&1`, panel.Root, req.Slug, s.version, req.Slug) + cmd := fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/%s.sh' uninstall %d >> '/tmp/%s.log' 2>&1`, app.Root, req.Slug, s.version, req.Slug) officials := []string{"fileinfo", "exif", "imap", "pdo_pgsql", "zip", "bz2", "readline", "snmp", "ldap", "enchant", "pspell", "calendar", "gmp", "sysvmsg", "sysvsem", "sysvshm", "xsl", "intl", "gettext"} if slices.Contains(officials, req.Slug) { - cmd = fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/official.sh' uninstall '%d' '%s' >> '/tmp/%s.log' 2>&1`, panel.Root, s.version, req.Slug, req.Slug) + cmd = fmt.Sprintf(`bash '%s/panel/scripts/php_extensions/official.sh' uninstall '%d' '%s' >> '/tmp/%s.log' 2>&1`, app.Root, s.version, req.Slug, req.Slug) } task := new(biz.Task) @@ -372,7 +372,7 @@ func (s *Service) getExtensions() []Extension { }) } - raw, _ := shell.Execf("%s/server/php/%d/bin/php -m", panel.Root, s.version) + raw, _ := shell.Execf("%s/server/php/%d/bin/php -m", app.Root, s.version) extensionMap := make(map[string]*Extension) for i := range extensions { extensionMap[extensions[i].Slug] = &extensions[i] diff --git a/internal/apps/phpmyadmin/service.go b/internal/apps/phpmyadmin/service.go index d8a2d641..6cd13b85 100644 --- a/internal/apps/phpmyadmin/service.go +++ b/internal/apps/phpmyadmin/service.go @@ -9,7 +9,7 @@ import ( "github.com/go-rat/chix" "github.com/spf13/cast" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/firewall" "github.com/TheTNB/panel/pkg/io" @@ -24,7 +24,7 @@ func NewService() *Service { } func (s *Service) Info(w http.ResponseWriter, r *http.Request) { - files, err := io.ReadDir(fmt.Sprintf("%s/server/phpmyadmin", panel.Root)) + files, err := io.ReadDir(fmt.Sprintf("%s/server/phpmyadmin", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, "找不到 phpMyAdmin 目录") return @@ -41,7 +41,7 @@ func (s *Service) Info(w http.ResponseWriter, r *http.Request) { return } - conf, err := io.Read(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", panel.Root)) + conf, err := io.Read(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -65,13 +65,13 @@ func (s *Service) UpdatePort(w http.ResponseWriter, r *http.Request) { return } - conf, err := io.Read(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", panel.Root)) + conf, err := io.Read(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } conf = regexp.MustCompile(`listen\s+(\d+);`).ReplaceAllString(conf, "listen "+cast.ToString(req.Port)+";") - if err = io.Write(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", panel.Root), conf, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", app.Root), conf, 0644); err != nil { service.ErrorSystem(w) return } @@ -96,7 +96,7 @@ func (s *Service) UpdatePort(w http.ResponseWriter, r *http.Request) { } func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", panel.Root)) + config, err := io.Read(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -112,7 +112,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err = io.Write(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", panel.Root), req.Config, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/vhost/phpmyadmin.conf", app.Root), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } diff --git a/internal/apps/postgresql/service.go b/internal/apps/postgresql/service.go index 66e83096..2e73191f 100644 --- a/internal/apps/postgresql/service.go +++ b/internal/apps/postgresql/service.go @@ -5,7 +5,7 @@ import ( "net/http" "time" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/shell" @@ -22,7 +22,7 @@ func NewService() *Service { // GetConfig 获取配置 func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { // 获取配置 - config, err := io.Read(fmt.Sprintf("%s/server/postgresql/data/postgresql.conf", panel.Root)) + config, err := io.Read(fmt.Sprintf("%s/server/postgresql/data/postgresql.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, "获取PostgreSQL配置失败") return @@ -39,7 +39,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err := io.Write(fmt.Sprintf("%s/server/postgresql/data/postgresql.conf", panel.Root), req.Config, 0644); err != nil { + if err := io.Write(fmt.Sprintf("%s/server/postgresql/data/postgresql.conf", app.Root), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, "写入PostgreSQL配置失败") return } @@ -55,7 +55,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { // GetUserConfig 获取用户配置 func (s *Service) GetUserConfig(w http.ResponseWriter, r *http.Request) { // 获取配置 - config, err := io.Read(fmt.Sprintf("%s/server/postgresql/data/pg_hba.conf", panel.Root)) + config, err := io.Read(fmt.Sprintf("%s/server/postgresql/data/pg_hba.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, "获取PostgreSQL配置失败") return @@ -72,7 +72,7 @@ func (s *Service) UpdateUserConfig(w http.ResponseWriter, r *http.Request) { return } - if err := io.Write(fmt.Sprintf("%s/server/postgresql/data/pg_hba.conf", panel.Root), req.Config, 0644); err != nil { + if err := io.Write(fmt.Sprintf("%s/server/postgresql/data/pg_hba.conf", app.Root), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, "写入PostgreSQL配置失败") return } @@ -132,7 +132,7 @@ func (s *Service) Load(w http.ResponseWriter, r *http.Request) { // Log 获取日志 func (s *Service) Log(w http.ResponseWriter, r *http.Request) { - log, err := shell.Execf("tail -n 100 %s/server/postgresql/logs/postgresql-%s.log", panel.Root, time.Now().Format(time.DateOnly)) + log, err := shell.Execf("tail -n 100 %s/server/postgresql/logs/postgresql-%s.log", app.Root, time.Now().Format(time.DateOnly)) if err != nil { service.Error(w, http.StatusInternalServerError, log) return @@ -143,7 +143,7 @@ func (s *Service) Log(w http.ResponseWriter, r *http.Request) { // ClearLog 清空日志 func (s *Service) ClearLog(w http.ResponseWriter, r *http.Request) { - if _, err := shell.Execf("rm -rf %s/server/postgresql/logs/postgresql-*.log", panel.Root); err != nil { + if _, err := shell.Execf("rm -rf %s/server/postgresql/logs/postgresql-*.log", app.Root); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } diff --git a/internal/apps/pureftpd/service.go b/internal/apps/pureftpd/service.go index 8ba2bde3..ede57fd3 100644 --- a/internal/apps/pureftpd/service.go +++ b/internal/apps/pureftpd/service.go @@ -8,7 +8,7 @@ import ( "github.com/go-rat/chix" "github.com/spf13/cast" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/firewall" "github.com/TheTNB/panel/pkg/io" @@ -132,7 +132,7 @@ func (s *Service) ChangePassword(w http.ResponseWriter, r *http.Request) { // GetPort 获取端口 func (s *Service) GetPort(w http.ResponseWriter, r *http.Request) { - port, err := shell.Execf(`cat %s/server/pure-ftpd/etc/pure-ftpd.conf | grep "Bind" | awk '{print $2}' | awk -F "," '{print $2}'`, panel.Root) + port, err := shell.Execf(`cat %s/server/pure-ftpd/etc/pure-ftpd.conf | grep "Bind" | awk '{print $2}' | awk -F "," '{print $2}'`, app.Root) if err != nil { service.Error(w, http.StatusInternalServerError, "获取PureFtpd端口失败") return @@ -149,7 +149,7 @@ func (s *Service) UpdatePort(w http.ResponseWriter, r *http.Request) { return } - if _, err = shell.Execf(`sed -i "s/Bind.*/Bind 0.0.0.0,%d/g" %s/server/pure-ftpd/etc/pure-ftpd.conf`, req.Port, panel.Root); err != nil { + if _, err = shell.Execf(`sed -i "s/Bind.*/Bind 0.0.0.0,%d/g" %s/server/pure-ftpd/etc/pure-ftpd.conf`, req.Port, app.Root); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } diff --git a/internal/apps/redis/service.go b/internal/apps/redis/service.go index e26194d1..8bf815f3 100644 --- a/internal/apps/redis/service.go +++ b/internal/apps/redis/service.go @@ -5,7 +5,7 @@ import ( "net/http" "strings" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/shell" @@ -66,7 +66,7 @@ func (s *Service) Load(w http.ResponseWriter, r *http.Request) { } func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) { - config, err := io.Read(fmt.Sprintf("%s/server/redis/redis.conf", panel.Root)) + config, err := io.Read(fmt.Sprintf("%s/server/redis/redis.conf", app.Root)) if err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return @@ -82,7 +82,7 @@ func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) { return } - if err = io.Write(fmt.Sprintf("%s/server/redis/redis.conf", panel.Root), req.Config, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/redis/redis.conf", app.Root), req.Config, 0644); err != nil { service.Error(w, http.StatusInternalServerError, err.Error()) return } diff --git a/internal/apps/toolbox/service.go b/internal/apps/toolbox/service.go index 2530aff7..1f83a7ce 100644 --- a/internal/apps/toolbox/service.go +++ b/internal/apps/toolbox/service.go @@ -9,7 +9,7 @@ import ( "github.com/go-rat/chix" "github.com/spf13/cast" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/service" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/shell" @@ -73,8 +73,8 @@ func (s *Service) UpdateDNS(w http.ResponseWriter, r *http.Request) { func (s *Service) GetSWAP(w http.ResponseWriter, r *http.Request) { var total, used, free string var size int64 - if io.Exists(filepath.Join(panel.Root, "swap")) { - file, err := io.FileInfo(filepath.Join(panel.Root, "swap")) + if io.Exists(filepath.Join(app.Root, "swap")) { + file, err := io.FileInfo(filepath.Join(app.Root, "swap")) if err != nil { service.Error(w, http.StatusUnprocessableEntity, "获取 SWAP 信息失败") return @@ -115,16 +115,16 @@ func (s *Service) UpdateSWAP(w http.ResponseWriter, r *http.Request) { return } - if io.Exists(filepath.Join(panel.Root, "swap")) { - if _, err = shell.Execf("swapoff '%s'", filepath.Join(panel.Root, "swap")); err != nil { + if io.Exists(filepath.Join(app.Root, "swap")) { + if _, err = shell.Execf("swapoff '%s'", filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } - if _, err = shell.Execf("rm -f '%s'", filepath.Join(panel.Root, "swap")); err != nil { + if _, err = shell.Execf("rm -f '%s'", filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } - if _, err = shell.Execf(`sed -i '%s/d' /etc/fstab`, filepath.Join(panel.Root, "swap")); err != nil { + if _, err = shell.Execf(`sed -i '%s/d' /etc/fstab`, filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } @@ -132,7 +132,7 @@ func (s *Service) UpdateSWAP(w http.ResponseWriter, r *http.Request) { if req.Size > 1 { var free string - free, err = shell.Execf("df -k %s | awk '{print $4}' | tail -n 1", panel.Root) + free, err = shell.Execf("df -k %s | awk '{print $4}' | tail -n 1", app.Root) if err != nil { service.Error(w, http.StatusUnprocessableEntity, "获取磁盘空间失败") return @@ -142,31 +142,31 @@ func (s *Service) UpdateSWAP(w http.ResponseWriter, r *http.Request) { return } - btrfsCheck, _ := shell.Execf("df -T %s | awk '{print $2}' | tail -n 1", panel.Root) + btrfsCheck, _ := shell.Execf("df -T %s | awk '{print $2}' | tail -n 1", app.Root) if strings.Contains(btrfsCheck, "btrfs") { - if _, err = shell.Execf("btrfs filesystem mkswapfile --size %dM --uuid clear %s", req.Size, filepath.Join(panel.Root, "swap")); err != nil { + if _, err = shell.Execf("btrfs filesystem mkswapfile --size %dM --uuid clear %s", req.Size, filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } } else { - if _, err = shell.Execf("dd if=/dev/zero of=%s bs=1M count=%d", filepath.Join(panel.Root, "swap"), req.Size); err != nil { + if _, err = shell.Execf("dd if=/dev/zero of=%s bs=1M count=%d", filepath.Join(app.Root, "swap"), req.Size); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } - if _, err = shell.Execf("mkswap -f '%s'", filepath.Join(panel.Root, "swap")); err != nil { + if _, err = shell.Execf("mkswap -f '%s'", filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } - if err = io.Chmod(filepath.Join(panel.Root, "swap"), 0600); err != nil { + if err = io.Chmod(filepath.Join(app.Root, "swap"), 0600); err != nil { service.Error(w, http.StatusUnprocessableEntity, "设置 SWAP 权限失败") return } } - if _, err = shell.Execf("swapon '%s'", filepath.Join(panel.Root, "swap")); err != nil { + if _, err = shell.Execf("swapon '%s'", filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } - if _, err = shell.Execf("echo '%s swap swap defaults 0 0' >> /etc/fstab", filepath.Join(panel.Root, "swap")); err != nil { + if _, err = shell.Execf("echo '%s swap swap defaults 0 0' >> /etc/fstab", filepath.Join(app.Root, "swap")); err != nil { service.Error(w, http.StatusUnprocessableEntity, err.Error()) return } diff --git a/internal/biz/user.go b/internal/biz/user.go index 9a038860..652e81ef 100644 --- a/internal/biz/user.go +++ b/internal/biz/user.go @@ -17,6 +17,7 @@ type User struct { } type UserRepo interface { + Create(username, password string) (*User, error) CheckPassword(username, password string) (*User, error) Get(id uint) (*User, error) Save(user *User) error diff --git a/internal/bootstrap/cli.go b/internal/bootstrap/cli.go index 1b6e6519..f2560582 100644 --- a/internal/bootstrap/cli.go +++ b/internal/bootstrap/cli.go @@ -2,13 +2,13 @@ package bootstrap import ( "context" - "fmt" "os" "strings" + "github.com/gookit/color" "github.com/urfave/cli/v3" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/route" ) @@ -39,10 +39,10 @@ func initCli() { cmd := &cli.Command{ Name: "panel-cli", Usage: "耗子面板命令行工具", - Version: panel.Version, + Version: app.Version, Commands: route.Cli(), } if err := cmd.Run(context.Background(), os.Args); err != nil { - panic(fmt.Sprintf("failed to run cli: %v", err)) + color.Redln(err.Error()) } } diff --git a/internal/bootstrap/conf.go b/internal/bootstrap/conf.go index 3ae5c05a..0b4a4972 100644 --- a/internal/bootstrap/conf.go +++ b/internal/bootstrap/conf.go @@ -8,23 +8,23 @@ import ( "github.com/knadh/koanf/providers/file" "github.com/knadh/koanf/v2" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" ) func initConf() { - panel.Conf = koanf.New(".") - if err := panel.Conf.Load(file.Provider("config/config.yml"), yaml.Parser()); err != nil { + app.Conf = koanf.New(".") + if err := app.Conf.Load(file.Provider("config/config.yml"), yaml.Parser()); err != nil { panic(fmt.Sprintf("failed to load config: %v", err)) } } func initGlobal() { - panel.Root = panel.Conf.MustString("app.root") - panel.Version = panel.Conf.MustString("app.version") - panel.Locale = panel.Conf.MustString("app.locale") + app.Root = app.Conf.MustString("app.root") + app.Version = app.Conf.MustString("app.version") + app.Locale = app.Conf.MustString("app.locale") // 初始化时区 - loc, err := time.LoadLocation(panel.Conf.MustString("app.timezone")) + loc, err := time.LoadLocation(app.Conf.MustString("app.timezone")) if err != nil { panic(fmt.Sprintf("failed to load timezone: %v", err)) } diff --git a/internal/bootstrap/db.go b/internal/bootstrap/db.go index fc52ff23..9038afda 100644 --- a/internal/bootstrap/db.go +++ b/internal/bootstrap/db.go @@ -8,13 +8,13 @@ import ( "gorm.io/gorm" "gorm.io/gorm/logger" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/migration" - "github.com/TheTNB/panel/internal/panel" ) func initOrm() { logLevel := logger.Error - if panel.Conf.Bool("database.debug") { + if app.Conf.Bool("database.debug") { logLevel = logger.Info } // You can use any other database, like MySQL or PostgreSQL. @@ -26,11 +26,11 @@ func initOrm() { if err != nil { panic(fmt.Sprintf("failed to connect database: %v", err)) } - panel.Orm = db + app.Orm = db } func runMigrate() { - migrator := gormigrate.New(panel.Orm, &gormigrate.Options{ + migrator := gormigrate.New(app.Orm, &gormigrate.Options{ UseTransaction: true, // Note: MySQL not support DDL transaction ValidateUnknownMigrations: true, }, migration.Migrations) diff --git a/internal/bootstrap/http.go b/internal/bootstrap/http.go index 6de46f3b..02d74036 100644 --- a/internal/bootstrap/http.go +++ b/internal/bootstrap/http.go @@ -6,25 +6,25 @@ import ( "github.com/go-chi/chi/v5" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/apps" "github.com/TheTNB/panel/internal/http/middleware" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/internal/route" ) func initHttp() { - panel.Http = chi.NewRouter() + app.Http = chi.NewRouter() // add middleware - panel.Http.Use(middleware.GlobalMiddleware()...) + app.Http.Use(middleware.GlobalMiddleware()...) // add route - route.Http(panel.Http) - apps.Boot(panel.Http) + route.Http(app.Http) + apps.Boot(app.Http) server := &http.Server{ - Addr: panel.Conf.MustString("http.address"), - Handler: http.AllowQuerySemicolons(panel.Http), + Addr: fmt.Sprintf(":%d", app.Conf.MustInt("http.port")), + Handler: http.AllowQuerySemicolons(app.Http), MaxHeaderBytes: 2048 << 20, } if err := server.ListenAndServe(); err != nil { diff --git a/internal/bootstrap/queue.go b/internal/bootstrap/queue.go index 8ec02ebd..69fec45f 100644 --- a/internal/bootstrap/queue.go +++ b/internal/bootstrap/queue.go @@ -1,11 +1,11 @@ package bootstrap import ( - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/pkg/queue" ) func initQueue() { - panel.Queue = queue.New() - go panel.Queue.Run() + app.Queue = queue.New() + go app.Queue.Run() } diff --git a/internal/bootstrap/session.go b/internal/bootstrap/session.go index ee767ce1..aeeb8416 100644 --- a/internal/bootstrap/session.go +++ b/internal/bootstrap/session.go @@ -6,13 +6,13 @@ import ( "github.com/go-rat/gormstore" "github.com/go-rat/sessions" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" ) func initSession() { // initialize session manager manager, err := sessions.NewManager(&sessions.ManagerOptions{ - Key: panel.Conf.String("app.key"), + Key: app.Conf.String("app.key"), Lifetime: 120, GcInterval: 30, DisableDefaultDriver: true, @@ -22,10 +22,10 @@ func initSession() { } // extend gorm store driver - store := gormstore.New(panel.Orm) + store := gormstore.New(app.Orm) if err = manager.Extend("default", store); err != nil { panic(fmt.Sprintf("failed to extend session manager: %v", err)) } - panel.Session = manager + app.Session = manager } diff --git a/internal/bootstrap/validator.go b/internal/bootstrap/validator.go index 8841903d..2427fb1c 100644 --- a/internal/bootstrap/validator.go +++ b/internal/bootstrap/validator.go @@ -8,7 +8,7 @@ import ( "github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10/translations/zh" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" ) func initValidator() { @@ -21,6 +21,6 @@ func initValidator() { panic(fmt.Sprintf("failed to register validator translations: %v", err)) } - panel.Translator = &trans - panel.Validator = validate + app.Translator = &trans + app.Validator = validate } diff --git a/internal/data/app.go b/internal/data/app.go index 3ad27fb6..d032cd00 100644 --- a/internal/data/app.go +++ b/internal/data/app.go @@ -9,8 +9,8 @@ import ( "github.com/expr-lang/expr" "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/api" "github.com/TheTNB/panel/pkg/apploader" ) @@ -25,7 +25,7 @@ func NewAppRepo() biz.AppRepo { return &appRepo{ cacheRepo: NewCacheRepo(), taskRepo: NewTaskRepo(), - api: api.NewAPI(panel.Version), + api: api.NewAPI(app.Version), } } @@ -52,7 +52,7 @@ func (r *appRepo) Get(slug string) (*api.App, error) { func (r *appRepo) Installed() ([]*biz.App, error) { var apps []*biz.App - if err := panel.Orm.Find(&apps).Error; err != nil { + if err := app.Orm.Find(&apps).Error; err != nil { return nil, err } @@ -61,17 +61,17 @@ func (r *appRepo) Installed() ([]*biz.App, error) { } func (r *appRepo) GetInstalled(slug string) (*biz.App, error) { - app := new(biz.App) - if err := panel.Orm.Where("slug = ?", slug).First(app).Error; err != nil { + installed := new(biz.App) + if err := app.Orm.Where("slug = ?", slug).First(installed).Error; err != nil { return nil, err } - return app, nil + return installed, nil } func (r *appRepo) GetInstalledAll(query string, cond ...string) ([]*biz.App, error) { var apps []*biz.App - if err := panel.Orm.Where(query, cond).Find(&apps).Error; err != nil { + if err := app.Orm.Where(query, cond).Find(&apps).Error; err != nil { return nil, err } @@ -80,13 +80,13 @@ func (r *appRepo) GetInstalledAll(query string, cond ...string) ([]*biz.App, err func (r *appRepo) GetHomeShow() ([]map[string]string, error) { var apps []*biz.App - if err := panel.Orm.Where("show = ?", true).Order("show_order").Find(&apps).Error; err != nil { + if err := app.Orm.Where("show = ?", true).Order("show_order").Find(&apps).Error; err != nil { return nil, err } var filtered []map[string]string - for app := range slices.Values(apps) { - loaded, err := r.Get(app.Slug) + for item := range slices.Values(apps) { + loaded, err := r.Get(item.Slug) if err != nil { continue } @@ -95,7 +95,7 @@ func (r *appRepo) GetHomeShow() ([]map[string]string, error) { "description": loaded.Description, "slug": loaded.Slug, "icon": loaded.Icon, - "version": app.Version, + "version": item.Version, }) } @@ -105,11 +105,11 @@ func (r *appRepo) GetHomeShow() ([]map[string]string, error) { func (r *appRepo) IsInstalled(query string, cond ...string) (bool, error) { var count int64 if len(cond) == 0 { - if err := panel.Orm.Model(&biz.App{}).Where("slug = ?", query).Count(&count).Error; err != nil { + if err := app.Orm.Model(&biz.App{}).Where("slug = ?", query).Count(&count).Error; err != nil { return false, err } } else { - if err := panel.Orm.Model(&biz.App{}).Where(query, cond).Count(&count).Error; err != nil { + if err := app.Orm.Model(&biz.App{}).Where(query, cond).Count(&count).Error; err != nil { return false, err } } @@ -118,7 +118,7 @@ func (r *appRepo) IsInstalled(query string, cond ...string) (bool, error) { } func (r *appRepo) Install(slug string) error { - app, err := r.Get(slug) + item, err := r.Get(slug) if err != nil { return err } @@ -128,25 +128,25 @@ func (r *appRepo) Install(slug string) error { } var shellUrl string - for version := range slices.Values(app.Versions) { - if version.PanelVersion == panel.Version { + for version := range slices.Values(item.Versions) { + if version.PanelVersion == app.Version { shellUrl = version.Install break } } if shellUrl == "" { - return fmt.Errorf("应用 %s 不支持当前面板版本", app.Name) + return fmt.Errorf("应用 %s 不支持当前面板版本", item.Name) } - if err = r.preCheck(app); err != nil { + if err = r.preCheck(item); err != nil { return err } task := new(biz.Task) - task.Name = "安装应用 " + app.Name + task.Name = "安装应用 " + item.Name task.Status = biz.TaskStatusWaiting - task.Shell = fmt.Sprintf("%s >> /tmp/%s.log 2>&1", shellUrl, app.Slug) - task.Log = "/tmp/" + app.Slug + ".log" + task.Shell = fmt.Sprintf("%s >> /tmp/%s.log 2>&1", shellUrl, item.Slug) + task.Log = "/tmp/" + item.Slug + ".log" if err = r.taskRepo.Push(task); err != nil { return err } @@ -155,7 +155,7 @@ func (r *appRepo) Install(slug string) error { } func (r *appRepo) Uninstall(slug string) error { - app, err := r.Get(slug) + item, err := r.Get(slug) if err != nil { return err } @@ -165,28 +165,28 @@ func (r *appRepo) Uninstall(slug string) error { } var shellUrl string - for version := range slices.Values(app.Versions) { - if version.PanelVersion == panel.Version { + for version := range slices.Values(item.Versions) { + if version.PanelVersion == app.Version { shellUrl = version.Uninstall break } } - if shellUrl == "" && len(app.Versions) > 0 { - shellUrl = app.Versions[0].Uninstall + if shellUrl == "" && len(item.Versions) > 0 { + shellUrl = item.Versions[0].Uninstall } if shellUrl == "" { - return fmt.Errorf("无法获取应用 %s 的卸载脚本", app.Name) + return fmt.Errorf("无法获取应用 %s 的卸载脚本", item.Name) } - if err = r.preCheck(app); err != nil { + if err = r.preCheck(item); err != nil { return err } task := new(biz.Task) - task.Name = "卸载应用 " + app.Name + task.Name = "卸载应用 " + item.Name task.Status = biz.TaskStatusWaiting - task.Shell = fmt.Sprintf("%s >> /tmp/%s.log 2>&1", shellUrl, app.Slug) - task.Log = "/tmp/" + app.Slug + ".log" + task.Shell = fmt.Sprintf("%s >> /tmp/%s.log 2>&1", shellUrl, item.Slug) + task.Log = "/tmp/" + item.Slug + ".log" if err = r.taskRepo.Push(task); err != nil { return err } @@ -195,7 +195,7 @@ func (r *appRepo) Uninstall(slug string) error { } func (r *appRepo) Update(slug string) error { - app, err := r.Get(slug) + item, err := r.Get(slug) if err != nil { return err } @@ -205,25 +205,25 @@ func (r *appRepo) Update(slug string) error { } var shellUrl string - for version := range slices.Values(app.Versions) { - if version.PanelVersion == panel.Version { + for version := range slices.Values(item.Versions) { + if version.PanelVersion == app.Version { shellUrl = version.Update break } } if shellUrl == "" { - return fmt.Errorf("应用 %s 不支持当前面板版本", app.Name) + return fmt.Errorf("应用 %s 不支持当前面板版本", item.Name) } - if err = r.preCheck(app); err != nil { + if err = r.preCheck(item); err != nil { return err } task := new(biz.Task) - task.Name = "更新应用 " + app.Name + task.Name = "更新应用 " + item.Name task.Status = biz.TaskStatusWaiting - task.Shell = fmt.Sprintf("%s >> /tmp/%s.log 2>&1", shellUrl, app.Slug) - task.Log = "/tmp/" + app.Slug + ".log" + task.Shell = fmt.Sprintf("%s >> /tmp/%s.log 2>&1", shellUrl, item.Slug) + task.Log = "/tmp/" + item.Slug + ".log" if err = r.taskRepo.Push(task); err != nil { return err } @@ -232,14 +232,14 @@ func (r *appRepo) Update(slug string) error { } func (r *appRepo) UpdateShow(slug string, show bool) error { - app, err := r.GetInstalled(slug) + item, err := r.GetInstalled(slug) if err != nil { return err } - app.Show = show + item.Show = show - return panel.Orm.Save(app).Error + return app.Orm.Save(item).Error } func (r *appRepo) UpdateCache() error { diff --git a/internal/data/cache.go b/internal/data/cache.go index 82637c6a..958577b2 100644 --- a/internal/data/cache.go +++ b/internal/data/cache.go @@ -5,8 +5,8 @@ import ( "gorm.io/gorm" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" - "github.com/TheTNB/panel/internal/panel" ) type cacheRepo struct{} @@ -17,7 +17,7 @@ func NewCacheRepo() biz.CacheRepo { func (r *cacheRepo) Get(key biz.CacheKey, defaultValue ...string) (string, error) { cache := new(biz.Cache) - if err := panel.Orm.Where("key = ?", key).First(cache).Error; err != nil { + if err := app.Orm.Where("key = ?", key).First(cache).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return "", err } @@ -32,10 +32,10 @@ func (r *cacheRepo) Get(key biz.CacheKey, defaultValue ...string) (string, error func (r *cacheRepo) Set(key biz.CacheKey, value string) error { cache := new(biz.Cache) - if err := panel.Orm.Where(biz.Cache{Key: key}).FirstOrInit(cache).Error; err != nil { + if err := app.Orm.Where(biz.Cache{Key: key}).FirstOrInit(cache).Error; err != nil { return err } cache.Value = value - return panel.Orm.Save(cache).Error + return app.Orm.Save(cache).Error } diff --git a/internal/data/cert.go b/internal/data/cert.go index 32ac9687..c882d8dc 100644 --- a/internal/data/cert.go +++ b/internal/data/cert.go @@ -7,9 +7,9 @@ import ( "strings" "time" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/acme" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/shell" @@ -30,13 +30,13 @@ func NewCertRepo() biz.CertRepo { func (r *certRepo) List(page, limit uint) ([]*biz.Cert, int64, error) { var certs []*biz.Cert var total int64 - err := panel.Orm.Model(&biz.Cert{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&certs).Error + err := app.Orm.Model(&biz.Cert{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&certs).Error return certs, total, err } func (r *certRepo) Get(id uint) (*biz.Cert, error) { cert := new(biz.Cert) - err := panel.Orm.Model(&biz.Cert{}).Where("id = ?", id).First(cert).Error + err := app.Orm.Model(&biz.Cert{}).Where("id = ?", id).First(cert).Error return cert, err } @@ -49,14 +49,14 @@ func (r *certRepo) Create(req *request.CertCreate) (*biz.Cert, error) { Domains: req.Domains, AutoRenew: req.AutoRenew, } - if err := panel.Orm.Create(cert).Error; err != nil { + if err := app.Orm.Create(cert).Error; err != nil { return nil, err } return cert, nil } func (r *certRepo) Update(req *request.CertUpdate) error { - return panel.Orm.Model(&biz.Cert{}).Where("id = ?", req.ID).Updates(&biz.Cert{ + return app.Orm.Model(&biz.Cert{}).Where("id = ?", req.ID).Updates(&biz.Cert{ AccountID: req.AccountID, WebsiteID: req.WebsiteID, DNSID: req.DNSID, @@ -67,7 +67,7 @@ func (r *certRepo) Update(req *request.CertUpdate) error { } func (r *certRepo) Delete(id uint) error { - return panel.Orm.Model(&biz.Cert{}).Where("id = ?", id).Delete(&biz.Cert{}).Error + return app.Orm.Model(&biz.Cert{}).Where("id = ?", id).Delete(&biz.Cert{}).Error } func (r *certRepo) ObtainAuto(id uint) (*acme.Certificate, error) { @@ -92,7 +92,7 @@ func (r *certRepo) ObtainAuto(id uint) (*acme.Certificate, error) { return nil, errors.New("通配符域名无法使用 HTTP 验证") } } - conf := fmt.Sprintf("%s/server/vhost/acme/%s.conf", panel.Root, cert.Website.Name) + conf := fmt.Sprintf("%s/server/vhost/acme/%s.conf", app.Root, cert.Website.Name) client.UseHTTP(conf, cert.Website.Path) } } @@ -105,7 +105,7 @@ func (r *certRepo) ObtainAuto(id uint) (*acme.Certificate, error) { cert.CertURL = ssl.URL cert.Cert = string(ssl.ChainPEM) cert.Key = string(ssl.PrivateKey) - if err = panel.Orm.Save(cert).Error; err != nil { + if err = app.Orm.Save(cert).Error; err != nil { return nil, err } @@ -134,7 +134,7 @@ func (r *certRepo) ObtainManual(id uint) (*acme.Certificate, error) { cert.CertURL = ssl.URL cert.Cert = string(ssl.ChainPEM) cert.Key = string(ssl.PrivateKey) - if err = panel.Orm.Save(cert).Error; err != nil { + if err = app.Orm.Save(cert).Error; err != nil { return nil, err } @@ -171,7 +171,7 @@ func (r *certRepo) Renew(id uint) (*acme.Certificate, error) { return nil, errors.New("通配符域名无法使用 HTTP 验证") } } - conf := fmt.Sprintf("%s/server/vhost/acme/%s.conf", panel.Root, cert.Website.Name) + conf := fmt.Sprintf("%s/server/vhost/acme/%s.conf", app.Root, cert.Website.Name) client.UseHTTP(conf, cert.Website.Path) } } @@ -184,7 +184,7 @@ func (r *certRepo) Renew(id uint) (*acme.Certificate, error) { cert.CertURL = ssl.URL cert.Cert = string(ssl.ChainPEM) cert.Key = string(ssl.PrivateKey) - if err = panel.Orm.Save(cert).Error; err != nil { + if err = app.Orm.Save(cert).Error; err != nil { return nil, err } @@ -236,10 +236,10 @@ func (r *certRepo) Deploy(ID, WebsiteID uint) error { return err } - if err = io.Write(fmt.Sprintf("%s/server/vhost/ssl/%s.pem", panel.Root, website.Name), cert.Cert, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/vhost/ssl/%s.pem", app.Root, website.Name), cert.Cert, 0644); err != nil { return err } - if err = io.Write(fmt.Sprintf("%s/server/vhost/ssl/%s.key", panel.Root, website.Name), cert.Key, 0644); err != nil { + if err = io.Write(fmt.Sprintf("%s/server/vhost/ssl/%s.key", app.Root, website.Name), cert.Key, 0644); err != nil { return err } if err = systemctl.Reload("openresty"); err != nil { diff --git a/internal/data/cert_account.go b/internal/data/cert_account.go index c8229b11..d43e5e0b 100644 --- a/internal/data/cert_account.go +++ b/internal/data/cert_account.go @@ -7,9 +7,9 @@ import ( "github.com/go-resty/resty/v2" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/acme" "github.com/TheTNB/panel/pkg/cert" ) @@ -23,13 +23,13 @@ func NewCertAccountRepo() biz.CertAccountRepo { func (r certAccountRepo) List(page, limit uint) ([]*biz.CertAccount, int64, error) { var accounts []*biz.CertAccount var total int64 - err := panel.Orm.Model(&biz.CertAccount{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&accounts).Error + err := app.Orm.Model(&biz.CertAccount{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&accounts).Error return accounts, total, err } func (r certAccountRepo) Get(id uint) (*biz.CertAccount, error) { account := new(biz.CertAccount) - err := panel.Orm.Model(&biz.CertAccount{}).Where("id = ?", id).First(account).Error + err := app.Orm.Model(&biz.CertAccount{}).Where("id = ?", id).First(account).Error return account, err } @@ -72,7 +72,7 @@ func (r certAccountRepo) Create(req *request.CertAccountCreate) (*biz.CertAccoun } account.PrivateKey = string(privateKey) - if err = panel.Orm.Create(account).Error; err != nil { + if err = app.Orm.Create(account).Error; err != nil { return nil, err } @@ -121,11 +121,11 @@ func (r certAccountRepo) Update(req *request.CertAccountUpdate) error { } account.PrivateKey = string(privateKey) - return panel.Orm.Save(account).Error + return app.Orm.Save(account).Error } func (r certAccountRepo) Delete(id uint) error { - return panel.Orm.Model(&biz.CertAccount{}).Where("id = ?", id).Delete(&biz.CertAccount{}).Error + return app.Orm.Model(&biz.CertAccount{}).Where("id = ?", id).Delete(&biz.CertAccount{}).Error } // getZeroSSLEAB 获取 ZeroSSL EAB diff --git a/internal/data/cert_dns.go b/internal/data/cert_dns.go index 0b87641d..a0c2158e 100644 --- a/internal/data/cert_dns.go +++ b/internal/data/cert_dns.go @@ -1,9 +1,9 @@ package data import ( + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" ) type certDNSRepo struct{} @@ -15,13 +15,13 @@ func NewCertDNSRepo() biz.CertDNSRepo { func (r certDNSRepo) List(page, limit uint) ([]*biz.CertDNS, int64, error) { var certDNS []*biz.CertDNS var total int64 - err := panel.Orm.Model(&biz.CertDNS{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&certDNS).Error + err := app.Orm.Model(&biz.CertDNS{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&certDNS).Error return certDNS, total, err } func (r certDNSRepo) Get(id uint) (*biz.CertDNS, error) { certDNS := new(biz.CertDNS) - err := panel.Orm.Model(&biz.CertDNS{}).Where("id = ?", id).First(certDNS).Error + err := app.Orm.Model(&biz.CertDNS{}).Where("id = ?", id).First(certDNS).Error return certDNS, err } @@ -32,7 +32,7 @@ func (r certDNSRepo) Create(req *request.CertDNSCreate) (*biz.CertDNS, error) { Data: req.Data, } - if err := panel.Orm.Create(certDNS).Error; err != nil { + if err := app.Orm.Create(certDNS).Error; err != nil { return nil, err } @@ -49,9 +49,9 @@ func (r certDNSRepo) Update(req *request.CertDNSUpdate) error { cert.Type = req.Type cert.Data = req.Data - return panel.Orm.Save(cert).Error + return app.Orm.Save(cert).Error } func (r certDNSRepo) Delete(id uint) error { - return panel.Orm.Model(&biz.CertDNS{}).Where("id = ?", id).Delete(&biz.CertDNS{}).Error + return app.Orm.Model(&biz.CertDNS{}).Where("id = ?", id).Delete(&biz.CertDNS{}).Error } diff --git a/internal/data/cron.go b/internal/data/cron.go index 7d947975..553ce375 100644 --- a/internal/data/cron.go +++ b/internal/data/cron.go @@ -8,9 +8,9 @@ import ( "strconv" "time" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/io" "github.com/TheTNB/panel/pkg/os" "github.com/TheTNB/panel/pkg/shell" @@ -30,7 +30,7 @@ func NewCronRepo() biz.CronRepo { func (r *cronRepo) Count() (int64, error) { var count int64 - if err := panel.Orm.Model(&biz.Cron{}).Count(&count).Error; err != nil { + if err := app.Orm.Model(&biz.Cron{}).Count(&count).Error; err != nil { return 0, err } @@ -40,13 +40,13 @@ func (r *cronRepo) Count() (int64, error) { func (r *cronRepo) List(page, limit uint) ([]*biz.Cron, int64, error) { var cron []*biz.Cron var total int64 - err := panel.Orm.Model(&biz.Cert{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&cron).Error + err := app.Orm.Model(&biz.Cert{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&cron).Error return cron, total, err } func (r *cronRepo) Get(id uint) (*biz.Cron, error) { cron := new(biz.Cron) - if err := panel.Orm.Where("id = ?", id).First(cron).Error; err != nil { + if err := app.Orm.Where("id = ?", id).First(cron).Error; err != nil { return nil, err } @@ -95,8 +95,8 @@ panel cutoff ${name} ${save} `, req.Target, req.Save) } - shellDir := fmt.Sprintf("%s/server/cron/", panel.Root) - shellLogDir := fmt.Sprintf("%s/server/cron/logs/", panel.Root) + shellDir := fmt.Sprintf("%s/server/cron/", app.Root) + shellLogDir := fmt.Sprintf("%s/server/cron/logs/", app.Root) if !io.Exists(shellDir) { return errors.New("计划任务目录不存在") } @@ -119,7 +119,7 @@ panel cutoff ${name} ${save} cron.Shell = shellDir + shellFile + ".sh" cron.Log = shellLogDir + shellFile + ".log" - if err := panel.Orm.Create(cron).Error; err != nil { + if err := app.Orm.Create(cron).Error; err != nil { return err } if err := r.addToSystem(cron); err != nil { @@ -145,7 +145,7 @@ func (r *cronRepo) Update(req *request.CronUpdate) error { cron.Time = req.Time cron.Name = req.Name - if err = panel.Orm.Save(cron).Error; err != nil { + if err = app.Orm.Save(cron).Error; err != nil { return err } @@ -181,7 +181,7 @@ func (r *cronRepo) Delete(id uint) error { return err } - return panel.Orm.Delete(cron).Error + return app.Orm.Delete(cron).Error } func (r *cronRepo) Status(id uint, status bool) error { @@ -199,7 +199,7 @@ func (r *cronRepo) Status(id uint, status bool) error { cron.Status = status - return panel.Orm.Save(cron).Error + return app.Orm.Save(cron).Error } func (r *cronRepo) Log(id uint) (string, error) { diff --git a/internal/data/monitor.go b/internal/data/monitor.go index f7088818..63182dee 100644 --- a/internal/data/monitor.go +++ b/internal/data/monitor.go @@ -6,9 +6,9 @@ import ( "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" ) type monitorRepo struct { @@ -50,12 +50,12 @@ func (r monitorRepo) UpdateSetting(setting *request.MonitorSetting) error { } func (r monitorRepo) Clear() error { - return panel.Orm.Delete(&biz.Monitor{}).Error + return app.Orm.Delete(&biz.Monitor{}).Error } func (r monitorRepo) List(start, end time.Time) ([]*biz.Monitor, error) { var monitors []*biz.Monitor - if err := panel.Orm.Where("created_at BETWEEN ? AND ?", start, end).Find(&monitors).Error; err != nil { + if err := app.Orm.Where("created_at BETWEEN ? AND ?", start, end).Find(&monitors).Error; err != nil { return nil, err } diff --git a/internal/data/setting.go b/internal/data/setting.go index 111f87ce..56129091 100644 --- a/internal/data/setting.go +++ b/internal/data/setting.go @@ -5,9 +5,9 @@ import ( "gorm.io/gorm" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" ) type settingRepo struct{} @@ -18,7 +18,7 @@ func NewSettingRepo() biz.SettingRepo { func (r *settingRepo) Get(key biz.SettingKey, defaultValue ...string) (string, error) { setting := new(biz.Setting) - if err := panel.Orm.Where("key = ?", key).First(setting).Error; err != nil { + if err := app.Orm.Where("key = ?", key).First(setting).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return "", err } @@ -33,17 +33,17 @@ func (r *settingRepo) Get(key biz.SettingKey, defaultValue ...string) (string, e func (r *settingRepo) Set(key biz.SettingKey, value string) error { setting := new(biz.Setting) - if err := panel.Orm.Where("key = ?", key).FirstOrInit(setting).Error; err != nil { + if err := app.Orm.Where("key = ?", key).FirstOrInit(setting).Error; err != nil { return err } setting.Value = value - return panel.Orm.Save(setting).Error + return app.Orm.Save(setting).Error } func (r *settingRepo) Delete(key biz.SettingKey) error { setting := new(biz.Setting) - if err := panel.Orm.Where("key = ?", key).Delete(setting).Error; err != nil { + if err := app.Orm.Where("key = ?", key).Delete(setting).Error; err != nil { return err } @@ -52,7 +52,7 @@ func (r *settingRepo) Delete(key biz.SettingKey) error { func (r *settingRepo) GetPanelSetting() (*request.PanelSetting, error) { setting := new(biz.Setting) - if err := panel.Orm.Where("key = ?", biz.SettingKeyName).First(setting).Error; err != nil { + if err := app.Orm.Where("key = ?", biz.SettingKeyName).First(setting).Error; err != nil { return nil, err } diff --git a/internal/data/task.go b/internal/data/task.go index 47aeeb50..f51f9a72 100644 --- a/internal/data/task.go +++ b/internal/data/task.go @@ -1,9 +1,9 @@ package data import ( + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/job" - "github.com/TheTNB/panel/internal/panel" ) type taskRepo struct{} @@ -14,36 +14,36 @@ func NewTaskRepo() biz.TaskRepo { func (r *taskRepo) HasRunningTask() bool { var count int64 - panel.Orm.Model(&biz.Task{}).Where("status = ?", biz.TaskStatusRunning).Or("status = ?", biz.TaskStatusWaiting).Count(&count) + app.Orm.Model(&biz.Task{}).Where("status = ?", biz.TaskStatusRunning).Or("status = ?", biz.TaskStatusWaiting).Count(&count) return count > 0 } func (r *taskRepo) List(page, limit uint) ([]*biz.Task, int64, error) { var tasks []*biz.Task var total int64 - err := panel.Orm.Model(&biz.Task{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&tasks).Error + err := app.Orm.Model(&biz.Task{}).Order("id desc").Count(&total).Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&tasks).Error return tasks, total, err } func (r *taskRepo) Get(id uint) (*biz.Task, error) { task := new(biz.Task) - err := panel.Orm.Model(&biz.Task{}).Where("id = ?", id).First(task).Error + err := app.Orm.Model(&biz.Task{}).Where("id = ?", id).First(task).Error return task, err } func (r *taskRepo) Delete(id uint) error { - return panel.Orm.Model(&biz.Task{}).Where("id = ?", id).Delete(&biz.Task{}).Error + return app.Orm.Model(&biz.Task{}).Where("id = ?", id).Delete(&biz.Task{}).Error } func (r *taskRepo) UpdateStatus(id uint, status biz.TaskStatus) error { - return panel.Orm.Model(&biz.Task{}).Where("id = ?", id).Update("status", status).Error + return app.Orm.Model(&biz.Task{}).Where("id = ?", id).Update("status", status).Error } func (r *taskRepo) Push(task *biz.Task) error { - if err := panel.Orm.Create(task).Error; err != nil { + if err := app.Orm.Create(task).Error; err != nil { return err } - return panel.Queue.Push(job.NewProcessTask(r), []any{ + return app.Queue.Push(job.NewProcessTask(r), []any{ task.ID, }) } diff --git a/internal/data/user.go b/internal/data/user.go index b6f52760..53edc121 100644 --- a/internal/data/user.go +++ b/internal/data/user.go @@ -6,8 +6,8 @@ import ( "github.com/go-rat/utils/hash" "gorm.io/gorm" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" - "github.com/TheTNB/panel/internal/panel" ) type userRepo struct { @@ -20,9 +20,26 @@ func NewUserRepo() biz.UserRepo { } } +func (r *userRepo) Create(username, password string) (*biz.User, error) { + value, err := r.hasher.Make(password) + if err != nil { + return nil, err + } + + user := &biz.User{ + Username: username, + Password: value, + } + if err = app.Orm.Create(user).Error; err != nil { + return nil, err + } + + return user, nil +} + func (r *userRepo) CheckPassword(username, password string) (*biz.User, error) { user := new(biz.User) - if err := panel.Orm.Where("username = ?", username).First(user).Error; err != nil { + if err := app.Orm.Where("username = ?", username).First(user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("用户名或密码错误") } else { @@ -39,7 +56,7 @@ func (r *userRepo) CheckPassword(username, password string) (*biz.User, error) { func (r *userRepo) Get(id uint) (*biz.User, error) { user := new(biz.User) - if err := panel.Orm.First(user, id).Error; err != nil { + if err := app.Orm.First(user, id).Error; err != nil { return nil, err } @@ -47,5 +64,5 @@ func (r *userRepo) Get(id uint) (*biz.User, error) { } func (r *userRepo) Save(user *biz.User) error { - return panel.Orm.Save(user).Error + return app.Orm.Save(user).Error } diff --git a/internal/data/website.go b/internal/data/website.go index 29949dd3..cbf8d20d 100644 --- a/internal/data/website.go +++ b/internal/data/website.go @@ -11,10 +11,10 @@ import ( "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/embed" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/cert" "github.com/TheTNB/panel/pkg/db" "github.com/TheTNB/panel/pkg/io" @@ -35,10 +35,10 @@ func NewWebsiteRepo() biz.WebsiteRepo { } func (r *websiteRepo) UpdateDefaultConfig(req *request.WebsiteDefaultConfig) error { - if err := io.Write(filepath.Join(panel.Root, "server/openresty/html/index.html"), req.Index, 0644); err != nil { + if err := io.Write(filepath.Join(app.Root, "server/openresty/html/index.html"), req.Index, 0644); err != nil { return err } - if err := io.Write(filepath.Join(panel.Root, "server/openresty/html/stop.html"), req.Stop, 0644); err != nil { + if err := io.Write(filepath.Join(app.Root, "server/openresty/html/stop.html"), req.Stop, 0644); err != nil { return err } @@ -47,7 +47,7 @@ func (r *websiteRepo) UpdateDefaultConfig(req *request.WebsiteDefaultConfig) err func (r *websiteRepo) Count() (int64, error) { var count int64 - if err := panel.Orm.Model(&biz.Website{}).Count(&count).Error; err != nil { + if err := app.Orm.Model(&biz.Website{}).Count(&count).Error; err != nil { return 0, err } @@ -56,11 +56,11 @@ func (r *websiteRepo) Count() (int64, error) { func (r *websiteRepo) Get(id uint) (*types.WebsiteSetting, error) { website := new(biz.Website) - if err := panel.Orm.Where("id", id).First(website).Error; err != nil { + if err := app.Orm.Where("id", id).First(website).Error; err != nil { return nil, err } - config, err := io.Read(filepath.Join(panel.Root, "server/vhost", website.Name+".conf")) + config, err := io.Read(filepath.Join(app.Root, "server/vhost", website.Name+".conf")) if err != nil { return nil, err } @@ -120,9 +120,9 @@ func (r *websiteRepo) Get(id uint) (*types.WebsiteSetting, error) { } } - crt, _ := io.Read(filepath.Join(panel.Root, "server/vhost/ssl", website.Name+".pem")) + crt, _ := io.Read(filepath.Join(app.Root, "server/vhost/ssl", website.Name+".pem")) setting.SSLCertificate = crt - key, _ := io.Read(filepath.Join(panel.Root, "server/vhost/ssl", website.Name+".key")) + key, _ := io.Read(filepath.Join(app.Root, "server/vhost/ssl", website.Name+".key")) setting.SSLCertificateKey = key if setting.SSL { ssl := str.Cut(config, "# ssl标记位开始", "# ssl标记位结束") @@ -155,9 +155,9 @@ func (r *websiteRepo) Get(id uint) (*types.WebsiteSetting, error) { setting.WafCache = match[1] } - rewrite, _ := io.Read(filepath.Join(panel.Root, "server/vhost/rewrite", website.Name+".conf")) + rewrite, _ := io.Read(filepath.Join(app.Root, "server/vhost/rewrite", website.Name+".conf")) setting.Rewrite = rewrite - log, _ := shell.Execf(`tail -n 100 '%s/wwwlogs/%s.log'`, panel.Root, website.Name) + log, _ := shell.Execf(`tail -n 100 '%s/wwwlogs/%s.log'`, app.Root, website.Name) setting.Log = log return setting, err @@ -165,7 +165,7 @@ func (r *websiteRepo) Get(id uint) (*types.WebsiteSetting, error) { func (r *websiteRepo) GetByName(name string) (*types.WebsiteSetting, error) { website := new(biz.Website) - if err := panel.Orm.Where("name", name).First(website).Error; err != nil { + if err := app.Orm.Where("name", name).First(website).Error; err != nil { return nil, err } @@ -177,11 +177,11 @@ func (r *websiteRepo) List(page, limit uint) ([]*biz.Website, int64, error) { var websites []*biz.Website var total int64 - if err := panel.Orm.Model(&biz.Website{}).Count(&total).Error; err != nil { + if err := app.Orm.Model(&biz.Website{}).Count(&total).Error; err != nil { return nil, 0, err } - if err := panel.Orm.Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&websites).Error; err != nil { + if err := app.Orm.Offset(int((page - 1) * limit)).Limit(int(limit)).Find(&websites).Error; err != nil { return nil, 0, err } @@ -196,7 +196,7 @@ func (r *websiteRepo) Create(req *request.WebsiteCreate) (*biz.Website, error) { PHP: cast.ToInt(req.PHP), SSL: false, } - if err := panel.Orm.Create(w).Error; err != nil { + if err := app.Orm.Create(w).Error; err != nil { return nil, err } @@ -302,21 +302,21 @@ server access_log %s/wwwlogs/%s.log; error_log %s/wwwlogs/%s.log; } -`, portList, domainList, req.Path, req.PHP, panel.Root, panel.Root, req.Name, panel.Root, req.Name, panel.Root, req.Name, panel.Root, req.Name) +`, portList, domainList, req.Path, req.PHP, app.Root, app.Root, req.Name, app.Root, req.Name, app.Root, req.Name, app.Root, req.Name) - if err = io.Write(filepath.Join(panel.Root, "server/vhost", req.Name+".conf"), nginxConf, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost", req.Name+".conf"), nginxConf, 0644); err != nil { return nil, err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost/rewrite", req.Name+".conf"), "", 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/rewrite", req.Name+".conf"), "", 0644); err != nil { return nil, err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost/acme", req.Name+".conf"), "", 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/acme", req.Name+".conf"), "", 0644); err != nil { return nil, err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost/ssl", req.Name+".pem"), "", 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/ssl", req.Name+".pem"), "", 0644); err != nil { return nil, err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost/ssl", req.Name+".key"), "", 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/ssl", req.Name+".key"), "", 0644); err != nil { return nil, err } @@ -354,7 +354,7 @@ server _, _ = shell.Execf(`echo "ALTER DATABASE '%s' OWNER TO '%s';" | su - postgres -c "psql"`, req.DBName, req.DBUser) _, _ = shell.Execf(`echo "GRANT ALL PRIVILEGES ON DATABASE '%s' TO '%s';" | su - postgres -c "psql"`, req.DBName, req.DBUser) userConfig := "host " + req.DBName + " " + req.DBUser + " 127.0.0.1/32 scram-sha-256" - _, _ = shell.Execf(`echo "`+userConfig+`" >> %s/server/postgresql/data/pg_hba.conf`, panel.Root) + _, _ = shell.Execf(`echo "`+userConfig+`" >> %s/server/postgresql/data/pg_hba.conf`, app.Root) _ = systemctl.Reload("postgresql") } @@ -363,7 +363,7 @@ server func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { website := new(biz.Website) - if err := panel.Orm.Where("id", req.ID).First(website).Error; err != nil { + if err := app.Orm.Where("id", req.ID).First(website).Error; err != nil { return err } @@ -372,12 +372,12 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { } // 原文 - raw, err := io.Read(filepath.Join(panel.Root, "server/vhost", website.Name+".conf")) + raw, err := io.Read(filepath.Join(app.Root, "server/vhost", website.Name+".conf")) if err != nil { return err } if strings.TrimSpace(raw) != strings.TrimSpace(req.Raw) { - if err = io.Write(filepath.Join(panel.Root, "server/vhost", website.Name+".conf"), req.Raw, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost", website.Name+".conf"), req.Raw, 0644); err != nil { return err } if err = systemctl.Reload("openresty"); err != nil { @@ -490,7 +490,7 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { waf_mode %s; waf_cc_deny %s; waf_cache %s; - `, wafStr, panel.Root, req.WafMode, req.WafCcDeny, req.WafCache) + `, wafStr, app.Root, req.WafMode, req.WafCcDeny, req.WafCache) wafConfigOld := str.Cut(raw, "# waf标记位开始", "# waf标记位结束") if len(strings.TrimSpace(wafConfigOld)) != 0 { raw = strings.Replace(raw, wafConfigOld, "", -1) @@ -498,10 +498,10 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { raw = strings.Replace(raw, "# waf标记位开始", wafConfig, -1) // SSL - if err = io.Write(filepath.Join(panel.Root, "server/vhost/ssl", website.Name+".pem"), req.SSLCertificate, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/ssl", website.Name+".pem"), req.SSLCertificate, 0644); err != nil { return err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost/ssl", website.Name+".key"), req.SSLCertificateKey, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/ssl", website.Name+".key"), req.SSLCertificateKey, 0644); err != nil { return err } website.SSL = req.SSL @@ -521,7 +521,7 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_early_data on; - `, panel.Root, website.Name, panel.Root, website.Name) + `, app.Root, website.Name, app.Root, website.Name) if req.HTTPRedirect { sslConfig += `# http重定向标记位开始 if ($server_port !~ 443){ @@ -567,14 +567,14 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { } } - if err = panel.Orm.Save(website).Error; err != nil { + if err = app.Orm.Save(website).Error; err != nil { return err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost", website.Name+".conf"), raw, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost", website.Name+".conf"), raw, 0644); err != nil { return err } - if err = io.Write(filepath.Join(panel.Root, "server/vhost/rewrite", website.Name+".conf"), req.Rewrite, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost/rewrite", website.Name+".conf"), req.Rewrite, 0644); err != nil { return err } @@ -588,7 +588,7 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { func (r *websiteRepo) Delete(req *request.WebsiteDelete) error { website := new(biz.Website) - if err := panel.Orm.Preload("Cert").Where("id", req.ID).First(website).Error; err != nil { + if err := app.Orm.Preload("Cert").Where("id", req.ID).First(website).Error; err != nil { return err } @@ -596,15 +596,15 @@ func (r *websiteRepo) Delete(req *request.WebsiteDelete) error { return errors.New("网站" + website.Name + "已绑定SSL证书,请先删除证书") } - if err := panel.Orm.Delete(website).Error; err != nil { + if err := app.Orm.Delete(website).Error; err != nil { return err } - _ = io.Remove(filepath.Join(panel.Root, "server/vhost", website.Name+".conf")) - _ = io.Remove(filepath.Join(panel.Root, "server/vhost/rewrite", website.Name+".conf")) - _ = io.Remove(filepath.Join(panel.Root, "server/vhost/acme", website.Name+".conf")) - _ = io.Remove(filepath.Join(panel.Root, "server/vhost/ssl", website.Name+".pem")) - _ = io.Remove(filepath.Join(panel.Root, "server/vhost/ssl", website.Name+".key")) + _ = io.Remove(filepath.Join(app.Root, "server/vhost", website.Name+".conf")) + _ = io.Remove(filepath.Join(app.Root, "server/vhost/rewrite", website.Name+".conf")) + _ = io.Remove(filepath.Join(app.Root, "server/vhost/acme", website.Name+".conf")) + _ = io.Remove(filepath.Join(app.Root, "server/vhost/ssl", website.Name+".pem")) + _ = io.Remove(filepath.Join(app.Root, "server/vhost/ssl", website.Name+".key")) if req.Path { _ = io.Remove(website.Path) @@ -634,33 +634,33 @@ func (r *websiteRepo) Delete(req *request.WebsiteDelete) error { func (r *websiteRepo) ClearLog(id uint) error { website := new(biz.Website) - if err := panel.Orm.Where("id", id).First(website).Error; err != nil { + if err := app.Orm.Where("id", id).First(website).Error; err != nil { return err } - _, err := shell.Execf(`echo "" > %s/wwwlogs/%s.log`, panel.Root, website.Name) + _, err := shell.Execf(`echo "" > %s/wwwlogs/%s.log`, app.Root, website.Name) return err } func (r *websiteRepo) UpdateRemark(id uint, remark string) error { website := new(biz.Website) - if err := panel.Orm.Where("id", id).First(website).Error; err != nil { + if err := app.Orm.Where("id", id).First(website).Error; err != nil { return err } website.Remark = remark - return panel.Orm.Save(website).Error + return app.Orm.Save(website).Error } func (r *websiteRepo) ResetConfig(id uint) error { website := new(biz.Website) - if err := panel.Orm.Where("id", id).First(&website).Error; err != nil { + if err := app.Orm.Where("id", id).First(&website).Error; err != nil { return err } website.Status = true website.SSL = false - if err := panel.Orm.Save(website).Error; err != nil { + if err := app.Orm.Save(website).Error; err != nil { return err } @@ -724,14 +724,14 @@ server error_log %s/wwwlogs/%s.log; } -`, website.Path, website.PHP, panel.Root, panel.Root, website.Name, panel.Root, website.Name, panel.Root, website.Name, panel.Root, website.Name) - if err := io.Write(filepath.Join(panel.Root, "server/vhost", website.Name+".conf"), raw, 0644); err != nil { +`, website.Path, website.PHP, app.Root, app.Root, website.Name, app.Root, website.Name, app.Root, website.Name, app.Root, website.Name) + if err := io.Write(filepath.Join(app.Root, "server/vhost", website.Name+".conf"), raw, 0644); err != nil { return nil } - if err := io.Write(filepath.Join(panel.Root, "server/vhost/rewrite", website.Name+".conf"), "", 0644); err != nil { + if err := io.Write(filepath.Join(app.Root, "server/vhost/rewrite", website.Name+".conf"), "", 0644); err != nil { return nil } - if err := io.Write(filepath.Join(panel.Root, "server/vhost/acme", website.Name+".conf"), "", 0644); err != nil { + if err := io.Write(filepath.Join(app.Root, "server/vhost/acme", website.Name+".conf"), "", 0644); err != nil { return nil } if err := systemctl.Reload("openresty"); err != nil { @@ -744,16 +744,16 @@ server func (r *websiteRepo) UpdateStatus(id uint, status bool) error { website := new(biz.Website) - if err := panel.Orm.Where("id", id).First(&website).Error; err != nil { + if err := app.Orm.Where("id", id).First(&website).Error; err != nil { return err } website.Status = status - if err := panel.Orm.Save(website).Error; err != nil { + if err := app.Orm.Save(website).Error; err != nil { return err } - raw, err := io.Read(filepath.Join(panel.Root, "server/vhost", website.Name+".conf")) + raw, err := io.Read(filepath.Join(app.Root, "server/vhost", website.Name+".conf")) if err != nil { return err } @@ -766,7 +766,7 @@ func (r *websiteRepo) UpdateStatus(id uint, status bool) error { root := regexp.MustCompile(`# root\s+(.+);`).FindStringSubmatch(rootConfig) raw = strings.ReplaceAll(raw, rootConfig, fmt.Sprintf(" root %s;\n ", root[1])) } else { - raw = strings.ReplaceAll(raw, rootConfig, fmt.Sprintf(" root %s/server/openresty/html;\n # root %s;\n ", panel.Root, match[1])) + raw = strings.ReplaceAll(raw, rootConfig, fmt.Sprintf(" root %s/server/openresty/html;\n # root %s;\n ", app.Root, match[1])) } } @@ -782,7 +782,7 @@ func (r *websiteRepo) UpdateStatus(id uint, status bool) error { } } - if err = io.Write(filepath.Join(panel.Root, "server/vhost", website.Name+".conf"), raw, 0644); err != nil { + if err = io.Write(filepath.Join(app.Root, "server/vhost", website.Name+".conf"), raw, 0644); err != nil { return err } if err = systemctl.Reload("openresty"); err != nil { diff --git a/internal/http/middleware/middleware.go b/internal/http/middleware/middleware.go index af5676ae..7c563bf5 100644 --- a/internal/http/middleware/middleware.go +++ b/internal/http/middleware/middleware.go @@ -6,13 +6,13 @@ import ( "github.com/go-chi/chi/v5/middleware" sessionmiddleware "github.com/go-rat/sessions/middleware" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" ) // GlobalMiddleware is a collection of global middleware that will be applied to every request. func GlobalMiddleware() []func(http.Handler) http.Handler { return []func(http.Handler) http.Handler{ - sessionmiddleware.StartSession(panel.Session), + sessionmiddleware.StartSession(app.Session), //middleware.SupressNotFound(app.Http),// bug https://github.com/go-chi/chi/pull/940 middleware.CleanPath, middleware.StripSlashes, diff --git a/internal/http/middleware/must_login.go b/internal/http/middleware/must_login.go index 1074921b..77bbd4e5 100644 --- a/internal/http/middleware/must_login.go +++ b/internal/http/middleware/must_login.go @@ -7,13 +7,13 @@ import ( "github.com/go-rat/chix" "github.com/spf13/cast" - "github.com/TheTNB/panel/internal/panel" + "github.com/TheTNB/panel/internal/app" ) // MustLogin 确保已登录 func MustLogin(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - session, err := panel.Session.GetSession(r) + session, err := app.Session.GetSession(r) if err != nil { render := chix.NewRender(w) render.Status(http.StatusInternalServerError) diff --git a/internal/service/base.go b/internal/service/base.go index aa864fba..0409ee03 100644 --- a/internal/service/base.go +++ b/internal/service/base.go @@ -10,8 +10,8 @@ import ( "github.com/go-playground/validator/v10" "github.com/go-rat/chix" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" ) // SuccessResponse 通用成功响应 @@ -87,12 +87,12 @@ func Bind[T any](r *http.Request) (*T, error) { } if reqWithRules, ok := any(req).(request.WithRules); ok { if rules := reqWithRules.Rules(r); rules != nil { - panel.Validator.RegisterStructValidationMapRules(rules, req) + app.Validator.RegisterStructValidationMapRules(rules, req) } } // 验证参数 - err := panel.Validator.Struct(req) + err := app.Validator.Struct(req) if err == nil { return req, nil } @@ -106,7 +106,7 @@ func Bind[T any](r *http.Request) (*T, error) { return nil, errors.New(msg) } } - return nil, errors.New(e.Translate(*panel.Translator)) // nolint:staticcheck + return nil, errors.New(e.Translate(*app.Translator)) // nolint:staticcheck } } diff --git a/internal/service/cli.go b/internal/service/cli.go index dbfa60d1..63798124 100644 --- a/internal/service/cli.go +++ b/internal/service/cli.go @@ -2,17 +2,30 @@ package service import ( "context" + "fmt" + "github.com/go-rat/utils/hash" + "github.com/gookit/color" "github.com/urfave/cli/v3" + "github.com/TheTNB/panel/internal/app" + "github.com/TheTNB/panel/internal/biz" + "github.com/TheTNB/panel/internal/data" + "github.com/TheTNB/panel/pkg/str" "github.com/TheTNB/panel/pkg/systemctl" + "github.com/TheTNB/panel/pkg/tools" ) type CliService struct { + repo biz.UserRepo + hash hash.Hasher } func NewCliService() *CliService { - return &CliService{} + return &CliService{ + repo: data.NewUserRepo(), + hash: hash.NewArgon2id(), + } } func (s *CliService) Restart(ctx context.Context, cmd *cli.Command) error { @@ -33,7 +46,50 @@ func (s *CliService) Update(ctx context.Context, cmd *cli.Command) error { } func (s *CliService) Info(ctx context.Context, cmd *cli.Command) error { - println("Hello, World!") + user := new(biz.User) + if err := app.Orm.Where("id", 1).First(user).Error; err != nil { + return fmt.Errorf("获取管理员信息失败:%v", err) + } + + password := str.RandomString(16) + hashed, err := s.hash.Make(password) + if err != nil { + return fmt.Errorf("密码生成失败:%v", err) + } + user.Username = str.RandomString(8) + user.Password = hashed + if user.Email == "" { + user.Email = str.RandomString(8) + "@example.com" + } + + err = app.Orm.Save(user).Error + if err != nil { + return fmt.Errorf("管理员信息保存失败:%v", err) + } + + protocol := "http" + if app.Conf.Bool("http.tls") { + protocol = "https" + } + ip, err := tools.GetPublicIP() + if err != nil { + ip = "127.0.0.1" + } + port := app.Conf.String("http.port") + if port == "" { + return fmt.Errorf("端口获取失败") + } + entrance := app.Conf.String("http.entrance") + if entrance == "" { + return fmt.Errorf("入口获取失败") + } + + color.Greenln(fmt.Sprintf("用户名: %s", user.Username)) + color.Greenln(fmt.Sprintf("密码: %s", password)) + color.Greenln(fmt.Sprintf("端口: %s", port)) + color.Greenln(fmt.Sprintf("入口: %s", entrance)) + color.Greenln(fmt.Sprintf("地址: %s://%s:%s%s", protocol, ip, port, entrance)) + return nil } @@ -153,6 +209,26 @@ func (s *CliService) RemoveSetting(ctx context.Context, cmd *cli.Command) error } func (s *CliService) Init(ctx context.Context, cmd *cli.Command) error { - println("Hello, World!") + var check biz.User + if err := app.Orm.First(&check).Error; err == nil { + return fmt.Errorf("已经初始化过了") + } + + settings := []biz.Setting{{Key: biz.SettingKeyName, Value: "耗子面板"}, {Key: biz.SettingKeyMonitor, Value: "1"}, {Key: biz.SettingKeyMonitorDays, Value: "30"}, {Key: biz.SettingKeyBackupPath, Value: "/www/backup"}, {Key: biz.SettingKeyWebsitePath, Value: "/www/wwwroot"}, {Key: biz.SettingKeyVersion, Value: app.Conf.String("app.version")}} + if err := app.Orm.Create(&settings).Error; err != nil { + return fmt.Errorf("初始化失败: %v", err) + } + + value, err := hash.NewArgon2id().Make(str.RandomString(32)) + if err != nil { + return fmt.Errorf("初始化失败: %v", err) + } + + user := data.NewUserRepo() + _, err = user.Create("admin", value) + if err != nil { + return fmt.Errorf("初始化失败: %v", err) + } + return nil } diff --git a/internal/service/info.go b/internal/service/info.go index 6c09294b..31b687a2 100644 --- a/internal/service/info.go +++ b/internal/service/info.go @@ -9,9 +9,9 @@ import ( "github.com/go-rat/chix" "github.com/hashicorp/go-version" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/data" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/db" "github.com/TheTNB/panel/pkg/shell" "github.com/TheTNB/panel/pkg/tools" @@ -44,7 +44,7 @@ func (s *InfoService) Panel(w http.ResponseWriter, r *http.Request) { Success(w, chix.M{ "name": name, - "language": panel.Conf.MustString("app.locale"), + "language": app.Conf.MustString("app.locale"), }) } @@ -68,7 +68,7 @@ func (s *InfoService) SystemInfo(w http.ResponseWriter, r *http.Request) { Success(w, chix.M{ "os_name": monitorInfo.Host.Platform + " " + monitorInfo.Host.PlatformVersion, "uptime": fmt.Sprintf("%.2f", float64(monitorInfo.Host.Uptime)/86400), - "panel_version": panel.Conf.MustString("app.version"), + "panel_version": app.Conf.MustString("app.version"), }) } @@ -117,7 +117,7 @@ func (s *InfoService) CountInfo(w http.ResponseWriter, r *http.Request) { } } if postgresqlInstalled { - postgres, err := db.NewPostgres("postgres", "", "127.0.0.1", fmt.Sprintf("%s/server/postgresql/data/pg_hba.conf", panel.Root), 5432) + postgres, err := db.NewPostgres("postgres", "", "127.0.0.1", fmt.Sprintf("%s/server/postgresql/data/pg_hba.conf", app.Root), 5432) if err == nil { defer postgres.Close() if err = postgres.Ping(); err != nil { @@ -202,7 +202,7 @@ func (s *InfoService) InstalledDbAndPhp(w http.ResponseWriter, r *http.Request) } func (s *InfoService) CheckUpdate(w http.ResponseWriter, r *http.Request) { - current := panel.Conf.MustString("app.version") + current := app.Conf.MustString("app.version") latest, err := tools.GetLatestPanelVersion() if err != nil { Error(w, http.StatusInternalServerError, "获取最新版本失败") @@ -232,7 +232,7 @@ func (s *InfoService) CheckUpdate(w http.ResponseWriter, r *http.Request) { } func (s *InfoService) UpdateInfo(w http.ResponseWriter, r *http.Request) { - current := panel.Conf.MustString("app.version") + current := app.Conf.MustString("app.version") latest, err := tools.GetLatestPanelVersion() if err != nil { Error(w, http.StatusInternalServerError, "获取最新版本失败") @@ -278,7 +278,7 @@ func (s *InfoService) Update(w http.ResponseWriter, r *http.Request) { Error(w, http.StatusInternalServerError, "当前有任务正在执行,禁止更新") return } - if err := panel.Orm.Exec("PRAGMA wal_checkpoint(TRUNCATE)").Error; err != nil { + if err := app.Orm.Exec("PRAGMA wal_checkpoint(TRUNCATE)").Error; err != nil { types.Status = types.StatusFailed Error(w, http.StatusInternalServerError, fmt.Sprintf("面板数据库异常,已终止操作:%s", err.Error())) return diff --git a/internal/service/user.go b/internal/service/user.go index 46fd294a..a29a7c91 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -6,10 +6,10 @@ import ( "github.com/go-rat/chix" "github.com/spf13/cast" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/data" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" ) type UserService struct { @@ -23,7 +23,7 @@ func NewUserService() *UserService { } func (s *UserService) Login(w http.ResponseWriter, r *http.Request) { - sess, err := panel.Session.GetSession(r) + sess, err := app.Session.GetSession(r) if err != nil { Error(w, http.StatusInternalServerError, err.Error()) return @@ -46,7 +46,7 @@ func (s *UserService) Login(w http.ResponseWriter, r *http.Request) { } func (s *UserService) Logout(w http.ResponseWriter, r *http.Request) { - sess, err := panel.Session.GetSession(r) + sess, err := app.Session.GetSession(r) if err == nil { sess.Forget("user_id") } @@ -54,7 +54,7 @@ func (s *UserService) Logout(w http.ResponseWriter, r *http.Request) { } func (s *UserService) IsLogin(w http.ResponseWriter, r *http.Request) { - sess, err := panel.Session.GetSession(r) + sess, err := app.Session.GetSession(r) if err != nil { Success(w, false) return diff --git a/internal/service/website.go b/internal/service/website.go index 7332e1ac..be4f3bd3 100644 --- a/internal/service/website.go +++ b/internal/service/website.go @@ -6,10 +6,10 @@ import ( "github.com/go-rat/chix" + "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/biz" "github.com/TheTNB/panel/internal/data" "github.com/TheTNB/panel/internal/http/request" - "github.com/TheTNB/panel/internal/panel" "github.com/TheTNB/panel/pkg/io" ) @@ -26,12 +26,12 @@ func NewWebsiteService() *WebsiteService { } func (s *WebsiteService) GetDefaultConfig(w http.ResponseWriter, r *http.Request) { - index, err := io.Read(filepath.Join(panel.Root, "server/openresty/html/index.html")) + index, err := io.Read(filepath.Join(app.Root, "server/openresty/html/index.html")) if err != nil { Error(w, http.StatusInternalServerError, err.Error()) return } - stop, err := io.Read(filepath.Join(panel.Root, "server/openresty/html/stop.html")) + stop, err := io.Read(filepath.Join(app.Root, "server/openresty/html/stop.html")) if err != nil { Error(w, http.StatusInternalServerError, err.Error()) return diff --git a/web/src/api/panel/setting/index.ts b/web/src/api/panel/setting/index.ts index 1384ec4f..6887327d 100644 --- a/web/src/api/panel/setting/index.ts +++ b/web/src/api/panel/setting/index.ts @@ -3,13 +3,11 @@ import type { AxiosResponse } from 'axios' export default { // 获取设置 - list: (): Promise> => request.get('/setting/list'), + list: (): Promise> => request.get('/setting'), // 保存设置 - update: (settings: any): Promise> => - request.post('/setting/update', settings), + update: (settings: any): Promise> => request.post('/setting', settings), // 获取HTTPS设置 getHttps: (): Promise> => request.get('/setting/https'), // 保存HTTPS设置 - updateHttps: (https: any): Promise> => - request.post('/setting/https', https) + updateHttps: (https: any): Promise> => request.post('/setting/https', https) }