diff --git a/internal/web/actions/default/index/index.go b/internal/web/actions/default/index/index.go index 1beaf192..4152181f 100644 --- a/internal/web/actions/default/index/index.go +++ b/internal/web/actions/default/index/index.go @@ -9,12 +9,15 @@ import ( "github.com/TeaOSLab/EdgeAdmin/internal/setup" "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/TeaOSLab/EdgeCommon/pkg/configutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/types" stringutil "github.com/iwind/TeaGo/utils/string" + "net" "time" ) @@ -32,6 +35,25 @@ func (this *IndexAction) RunGet(params struct { Auth *helpers.UserShouldAuth }) { + // 是否自动从HTTP跳转到HTTPS + if this.Request.TLS == nil { + httpsPort, _ := adminserverutils.ReadServerHTTPS() + if httpsPort > 0 { + currentHost, _, err := net.SplitHostPort(this.Request.Host) + if err != nil { + currentHost = this.Request.Host + } + + var newHost = configutils.QuoteIP(currentHost) + if httpsPort != 443 /** default https port **/ { + newHost += ":" + types.String(httpsPort) + } + + this.RedirectURL("https://" + newHost + this.Request.RequestURI) + return + } + } + // DEMO模式 this.Data["isDemo"] = teaconst.IsDemoMode diff --git a/internal/web/actions/default/settings/server/admin-server-utils/utils.go b/internal/web/actions/default/settings/server/admin-server-utils/utils.go new file mode 100644 index 00000000..fe92f987 --- /dev/null +++ b/internal/web/actions/default/settings/server/admin-server-utils/utils.go @@ -0,0 +1,86 @@ +package adminserverutils + +import ( + "errors" + "github.com/iwind/TeaGo" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/types" + "gopkg.in/yaml.v3" + "net" + "os" + "time" +) + +var ServerConfigIsChanged = false + +const configFilename = "server.yaml" + +// LoadServerConfig 读取当前服务配置 +func LoadServerConfig() (*TeaGo.ServerConfig, error) { + configFile := Tea.ConfigFile(configFilename) + data, err := os.ReadFile(configFile) + if err != nil { + return nil, err + } + var serverConfig = &TeaGo.ServerConfig{} + err = yaml.Unmarshal(data, serverConfig) + if err != nil { + return nil, err + } + return serverConfig, nil +} + +// WriteServerConfig 保存当前服务配置 +func WriteServerConfig(serverConfig *TeaGo.ServerConfig) error { + data, err := yaml.Marshal(serverConfig) + if err != nil { + return err + } + err = os.WriteFile(Tea.ConfigFile(configFilename), data, 0666) + if err != nil { + return err + } + + ServerConfigIsChanged = true + + return nil +} + +// ReadServerHTTPS 检查HTTPS地址 +func ReadServerHTTPS() (port int, err error) { + config, err := LoadServerConfig() + if err != nil { + return 0, err + } + if config == nil { + return 0, errors.New("could not load server config") + } + + if config.Https.On && len(config.Https.Listen) > 0 { + for _, listen := range config.Https.Listen { + _, portString, splitErr := net.SplitHostPort(listen) + if splitErr == nil { + var portInt = types.Int(portString) + if portInt > 0 { + // 是否已经启动 + checkErr := func() error { + conn, connErr := net.DialTimeout("tcp", ":"+portString, 1*time.Second) + if connErr != nil { + return connErr + } + _ = conn.Close() + return nil + }() + if checkErr != nil { + continue + } + + port = portInt + err = nil + break + } + } + } + } + return +} diff --git a/internal/web/actions/default/settings/server/index.go b/internal/web/actions/default/settings/server/index.go index af16415a..1fe6d83a 100644 --- a/internal/web/actions/default/settings/server/index.go +++ b/internal/web/actions/default/settings/server/index.go @@ -2,6 +2,7 @@ package server import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils" ) type IndexAction struct { @@ -13,9 +14,9 @@ func (this *IndexAction) Init() { } func (this *IndexAction) RunGet(params struct{}) { - this.Data["serverIsChanged"] = serverConfigIsChanged + this.Data["serverIsChanged"] = adminserverutils.ServerConfigIsChanged - serverConfig, err := loadServerConfig() + serverConfig, err := adminserverutils.LoadServerConfig() if err != nil { this.ErrorPage(err) return diff --git a/internal/web/actions/default/settings/server/updateHTTPPopup.go b/internal/web/actions/default/settings/server/updateHTTPPopup.go index 4daa57d0..8cbf7c23 100644 --- a/internal/web/actions/default/settings/server/updateHTTPPopup.go +++ b/internal/web/actions/default/settings/server/updateHTTPPopup.go @@ -3,6 +3,7 @@ package server import ( "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils" "github.com/iwind/TeaGo/actions" "net" ) @@ -16,7 +17,7 @@ func (this *UpdateHTTPPopupAction) Init() { } func (this *UpdateHTTPPopupAction) RunGet(params struct{}) { - serverConfig, err := loadServerConfig() + serverConfig, err := adminserverutils.LoadServerConfig() if err != nil { this.ErrorPage(err) return @@ -38,7 +39,7 @@ func (this *UpdateHTTPPopupAction) RunPost(params struct { this.Fail("请输入绑定地址") } - serverConfig, err := loadServerConfig() + serverConfig, err := adminserverutils.LoadServerConfig() if err != nil { this.Fail("保存失败:" + err.Error()) } @@ -58,7 +59,7 @@ func (this *UpdateHTTPPopupAction) RunPost(params struct { } serverConfig.Http.Listen = listen - err = writeServerConfig(serverConfig) + err = adminserverutils.WriteServerConfig(serverConfig) if err != nil { this.Fail("保存失败:" + err.Error()) } diff --git a/internal/web/actions/default/settings/server/updateHTTPSPopup.go b/internal/web/actions/default/settings/server/updateHTTPSPopup.go index 7b4d553d..27311530 100644 --- a/internal/web/actions/default/settings/server/updateHTTPSPopup.go +++ b/internal/web/actions/default/settings/server/updateHTTPSPopup.go @@ -4,6 +4,7 @@ import ( "encoding/json" "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs" "github.com/iwind/TeaGo/Tea" @@ -21,7 +22,7 @@ func (this *UpdateHTTPSPopupAction) Init() { } func (this *UpdateHTTPSPopupAction) RunGet(params struct{}) { - serverConfig, err := loadServerConfig() + serverConfig, err := adminserverutils.LoadServerConfig() if err != nil { this.ErrorPage(err) return @@ -70,7 +71,7 @@ func (this *UpdateHTTPSPopupAction) RunPost(params struct { this.Fail("请输入绑定地址") } - serverConfig, err := loadServerConfig() + serverConfig, err := adminserverutils.LoadServerConfig() if err != nil { this.Fail("保存失败:" + err.Error()) } @@ -133,7 +134,7 @@ func (this *UpdateHTTPSPopupAction) RunPost(params struct { serverConfig.Https.Cert = "configs/https.cert.pem" } - err = writeServerConfig(serverConfig) + err = adminserverutils.WriteServerConfig(serverConfig) if err != nil { this.Fail("保存配置失败:" + err.Error()) } diff --git a/internal/web/actions/default/settings/server/utils.go b/internal/web/actions/default/settings/server/utils.go deleted file mode 100644 index d0497b29..00000000 --- a/internal/web/actions/default/settings/server/utils.go +++ /dev/null @@ -1,41 +0,0 @@ -package server - -import ( - "github.com/iwind/TeaGo" - "github.com/iwind/TeaGo/Tea" - "gopkg.in/yaml.v3" - "os" -) - -var serverConfigIsChanged = false - -// 读取当前服务配置 -func loadServerConfig() (*TeaGo.ServerConfig, error) { - configFile := Tea.ConfigFile("server.yaml") - data, err := os.ReadFile(configFile) - if err != nil { - return nil, err - } - serverConfig := &TeaGo.ServerConfig{} - err = yaml.Unmarshal(data, serverConfig) - if err != nil { - return nil, err - } - return serverConfig, nil -} - -// 保存当前服务配置 -func writeServerConfig(serverConfig *TeaGo.ServerConfig) error { - data, err := yaml.Marshal(serverConfig) - if err != nil { - return err - } - err = os.WriteFile(Tea.ConfigFile("server.yaml"), data, 0666) - if err != nil { - return err - } - - serverConfigIsChanged = true - - return nil -} diff --git a/web/views/@default/settings/server/index.html b/web/views/@default/settings/server/index.html index 5a82ec9b..148a5307 100644 --- a/web/views/@default/settings/server/index.html +++ b/web/views/@default/settings/server/index.html @@ -2,9 +2,6 @@ 服务配置已修改,请在命令行下重启后生效。 -
-

这里可以修改当前管理系统的HTTP和HTTPS访问服务。

-

HTTP 修改[演示版无法修改]

@@ -18,7 +15,7 @@
绑定地址 {{listen}} -

如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以用来使用访问当前管理系统。

+

访问当前管理系统的HTTP地址;如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以访问。

@@ -37,7 +34,7 @@ 绑定地址 {{listen}} -

如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以用来使用访问当前管理系统。

+

访问当前管理系统的HTTPS地址;如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以访问。