2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 06:47:20 +08:00

feat: 命令行获取信息和初始化

This commit is contained in:
耗子
2024-09-30 17:52:23 +08:00
parent 3fce818d13
commit 54470f87b0
40 changed files with 389 additions and 297 deletions

View File

@@ -8,10 +8,10 @@ app:
root: "/www"
http:
debug: false
address: ":3000"
debug: true
port: 8888
entrance: "/"
ssl: false
tls: false
database:
debug: false

View File

@@ -1,4 +1,4 @@
package panel
package app
import (
"github.com/go-chi/chi/v5"

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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())
}

View File

@@ -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 {

View File

@@ -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]

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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())
}
}

View File

@@ -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))
}

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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()
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -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
}

View File

@@ -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) {

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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,
})
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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)

View File

@@ -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
}
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -3,13 +3,11 @@ import type { AxiosResponse } from 'axios'
export default {
// 获取设置
list: (): Promise<AxiosResponse<any>> => request.get('/setting/list'),
list: (): Promise<AxiosResponse<any>> => request.get('/setting'),
// 保存设置
update: (settings: any): Promise<AxiosResponse<any>> =>
request.post('/setting/update', settings),
update: (settings: any): Promise<AxiosResponse<any>> => request.post('/setting', settings),
// 获取HTTPS设置
getHttps: (): Promise<AxiosResponse<any>> => request.get('/setting/https'),
// 保存HTTPS设置
updateHttps: (https: any): Promise<AxiosResponse<any>> =>
request.post('/setting/https', https)
updateHttps: (https: any): Promise<AxiosResponse<any>> => request.post('/setting/https', https)
}