diff --git a/internal/web/actions/default/servers/components/groups/createPopup.go b/internal/web/actions/default/servers/groups/createPopup.go similarity index 100% rename from internal/web/actions/default/servers/components/groups/createPopup.go rename to internal/web/actions/default/servers/groups/createPopup.go diff --git a/internal/web/actions/default/servers/components/groups/delete.go b/internal/web/actions/default/servers/groups/group/delete.go similarity index 98% rename from internal/web/actions/default/servers/components/groups/delete.go rename to internal/web/actions/default/servers/groups/group/delete.go index 6b757841..9b997df1 100644 --- a/internal/web/actions/default/servers/components/groups/delete.go +++ b/internal/web/actions/default/servers/groups/group/delete.go @@ -1,4 +1,4 @@ -package groups +package group import ( "github.com/TeaOSLab/EdgeAdmin/internal/oplogs" diff --git a/internal/web/actions/default/servers/groups/group/index.go b/internal/web/actions/default/servers/groups/group/index.go new file mode 100644 index 00000000..1c728cbc --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/index.go @@ -0,0 +1,193 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package group + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "group.index") +} + +func (this *IndexAction) RunGet(params struct { + GroupId int64 + Keyword string +}) { + this.Data["keyword"] = params.Keyword + + group, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["group"] = maps.Map{ + "id": group.Id, + "name": group.Name, + } + + // 是否有用户管理权限 + this.Data["canVisitUser"] = configloaders.AllowModule(this.AdminId(), configloaders.AdminModuleCodeUser) + + // 服务列表 + countResp, err := this.RPC().ServerRPC().CountAllEnabledServersMatch(this.AdminContext(), &pb.CountAllEnabledServersMatchRequest{ + ServerGroupId: params.GroupId, + Keyword: params.Keyword, + }) + if err != nil { + this.ErrorPage(err) + return + } + count := countResp.Count + page := this.NewPage(count) + this.Data["page"] = page.AsHTML() + + // 服务列表 + serversResp, err := this.RPC().ServerRPC().ListEnabledServersMatch(this.AdminContext(), &pb.ListEnabledServersMatchRequest{ + Offset: page.Offset, + Size: page.Size, + ServerGroupId: params.GroupId, + Keyword: params.Keyword, + }) + if err != nil { + this.ErrorPage(err) + return + } + serverMaps := []maps.Map{} + for _, server := range serversResp.Servers { + config := &serverconfigs.ServerConfig{} + err = json.Unmarshal(server.Config, config) + if err != nil { + this.ErrorPage(err) + return + } + + // 端口列表 + portMaps := []maps.Map{} + if len(server.HttpJSON) > 0 && config.HTTP.IsOn { + for _, listen := range config.HTTP.Listen { + portMaps = append(portMaps, maps.Map{ + "protocol": listen.Protocol, + "portRange": listen.PortRange, + }) + } + } + if config.HTTPS != nil && config.HTTPS.IsOn { + for _, listen := range config.HTTPS.Listen { + portMaps = append(portMaps, maps.Map{ + "protocol": listen.Protocol, + "portRange": listen.PortRange, + }) + } + } + if config.TCP != nil && config.TCP.IsOn { + for _, listen := range config.TCP.Listen { + portMaps = append(portMaps, maps.Map{ + "protocol": listen.Protocol, + "portRange": listen.PortRange, + }) + } + } + if config.TLS != nil && config.TLS.IsOn { + for _, listen := range config.TLS.Listen { + portMaps = append(portMaps, maps.Map{ + "protocol": listen.Protocol, + "portRange": listen.PortRange, + }) + } + } + if config.Unix != nil && config.Unix.IsOn { + for _, listen := range config.Unix.Listen { + portMaps = append(portMaps, maps.Map{ + "protocol": listen.Protocol, + "portRange": listen.Host, + }) + } + } + if config.UDP != nil && config.UDP.IsOn { + for _, listen := range config.UDP.Listen { + portMaps = append(portMaps, maps.Map{ + "protocol": listen.Protocol, + "portRange": listen.PortRange, + }) + } + } + + // 分组 + groupMaps := []maps.Map{} + if len(server.ServerGroups) > 0 { + for _, group := range server.ServerGroups { + groupMaps = append(groupMaps, maps.Map{ + "id": group.Id, + "name": group.Name, + }) + } + } + + // 域名列表 + serverNames := []*serverconfigs.ServerNameConfig{} + if server.IsAuditing || (server.AuditingResult != nil && !server.AuditingResult.IsOk) { + server.ServerNamesJSON = server.AuditingServerNamesJSON + } + auditingIsOk := true + if !server.IsAuditing && server.AuditingResult != nil && !server.AuditingResult.IsOk { + auditingIsOk = false + } + if len(server.ServerNamesJSON) > 0 { + err = json.Unmarshal(server.ServerNamesJSON, &serverNames) + if err != nil { + this.ErrorPage(err) + return + } + } + countServerNames := 0 + for _, serverName := range serverNames { + if len(serverName.SubNames) == 0 { + countServerNames++ + } else { + countServerNames += len(serverName.SubNames) + } + } + + // 用户 + var userMap maps.Map = nil + if server.User != nil { + userMap = maps.Map{ + "id": server.User.Id, + "fullname": server.User.Fullname, + } + } + + serverMaps = append(serverMaps, maps.Map{ + "id": server.Id, + "isOn": server.IsOn, + "name": server.Name, + "cluster": maps.Map{ + "id": server.NodeCluster.Id, + "name": server.NodeCluster.Name, + }, + "ports": portMaps, + "serverTypeName": serverconfigs.FindServerType(server.Type).GetString("name"), + "groups": groupMaps, + "serverNames": serverNames, + "countServerNames": countServerNames, + "isAuditing": server.IsAuditing, + "auditingIsOk": auditingIsOk, + "user": userMap, + }) + } + this.Data["servers"] = serverMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/servergrouputils/utils.go b/internal/web/actions/default/servers/groups/group/servergrouputils/utils.go new file mode 100644 index 00000000..48f1aad2 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/servergrouputils/utils.go @@ -0,0 +1,110 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package servergrouputils + +import ( + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" +) + +// InitGroup 初始化分组信息 +func InitGroup(parent *actionutils.ParentAction, groupId int64, menuItem string) (*pb.ServerGroup, error) { + groupResp, err := parent.RPC().ServerGroupRPC().FindEnabledServerGroup(parent.AdminContext(), &pb.FindEnabledServerGroupRequest{ServerGroupId: groupId}) + if err != nil { + return nil, err + } + var group = groupResp.ServerGroup + if group == nil { + return nil, errors.New("group with id '" + types.String(groupId) + "' not found") + } + + parent.Data["group"] = maps.Map{ + "id": group.Id, + "name": group.Name, + } + + // 初始化设置菜单 + if len(menuItem) > 0 { + // 获取设置概要信息 + configInfoResp, err := parent.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(parent.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{ServerGroupId: groupId}) + if err != nil { + return group, err + } + + var urlPrefix = "/servers/groups/group/settings" + parent.Data["leftMenuItems"] = []maps.Map{ + /**{ + "name": "Web设置", + "url": urlPrefix + "/web?groupId=" + types.String(groupId), + "isActive": menuItem == "web", + },**/ + { + "name": "HTTP反向代理", + "url": urlPrefix + "/httpReverseProxy?groupId=" + types.String(groupId), + "isActive": menuItem == "httpReverseProxy", + "isOn": configInfoResp.HasHTTPReverseProxy, + }, + { + "name": "TCP反向代理", + "url": urlPrefix + "/tcpReverseProxy?groupId=" + types.String(groupId), + "isActive": menuItem == "tcpReverseProxy", + "isOn": configInfoResp.HasTCPReverseProxy, + }, + { + "name": "UDP反向代理", + "url": urlPrefix + "/udpReverseProxy?groupId=" + types.String(groupId), + "isActive": menuItem == "udpReverseProxy", + "isOn": configInfoResp.HasUDPReverseProxy, + }, + /**{ + "name": "-", + "url": "", + }, + { + "name": "WAF", + "url": urlPrefix + "/waf?groupId=" + types.String(groupId), + "isActive": menuItem == "waf", + }, + { + "name": "缓存", + "url": urlPrefix + "/cache?groupId=" + types.String(groupId), + "isActive": menuItem == "cache", + }, + { + "name": "访问日志", + "url": urlPrefix + "/accessLog?groupId=" + types.String(groupId), + "isActive": menuItem == "accessLog", + }, + { + "name": "统计", + "url": urlPrefix + "/stat?groupId=" + types.String(groupId), + "isActive": menuItem == "stat", + }, + { + "name": "Gzip压缩", + "url": urlPrefix + "/gzip?groupId=" + types.String(groupId), + "isActive": menuItem == "gzip", + }, + { + "name": "特殊页面", + "url": urlPrefix + "/pages?groupId=" + types.String(groupId), + "isActive": menuItem == "page", + }, + { + "name": "HTTP Header", + "url": urlPrefix + "/headers?groupId=" + types.String(groupId), + "isActive": menuItem == "header", + }, + { + "name": "Websocket", + "url": urlPrefix + "/websocket?groupId=" + types.String(groupId), + "isActive": menuItem == "websocket", + },**/ + } + } + + return group, nil +} diff --git a/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/index.go b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/index.go new file mode 100644 index 00000000..f83f97a6 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/index.go @@ -0,0 +1,87 @@ +package httpReverseProxy + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +// IndexAction 源站列表 +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.FirstMenu("index") +} + +func (this *IndexAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "httpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["serverType"] = "httpProxy" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupHTTPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyRef"] = reverseProxyRef + + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyConfig"] = reverseProxy + + primaryOriginMaps := []maps.Map{} + backupOriginMaps := []maps.Map{} + for _, originConfig := range reverseProxy.PrimaryOrigins { + if len(originConfig.Domains) == 0 { + originConfig.Domains = []string{} + } + m := maps.Map{ + "id": originConfig.Id, + "weight": originConfig.Weight, + "addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, + "name": originConfig.Name, + "isOn": originConfig.IsOn, + "domains": originConfig.Domains, + } + primaryOriginMaps = append(primaryOriginMaps, m) + } + for _, originConfig := range reverseProxy.BackupOrigins { + if len(originConfig.Domains) == 0 { + originConfig.Domains = []string{} + } + m := maps.Map{ + "id": originConfig.Id, + "weight": originConfig.Weight, + "addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, + "name": originConfig.Name, + "isOn": originConfig.IsOn, + "domains": originConfig.Domains, + } + backupOriginMaps = append(backupOriginMaps, m) + } + this.Data["primaryOrigins"] = primaryOriginMaps + this.Data["backupOrigins"] = backupOriginMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/init.go b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/init.go new file mode 100644 index 00000000..2373dce3 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/init.go @@ -0,0 +1,21 @@ +package httpReverseProxy + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Data("teaMenu", "servers"). + Data("teaSubMenu", "group"). + Prefix("/servers/groups/group/settings/httpReverseProxy"). + Get("", new(IndexAction)). + GetPost("/scheduling", new(SchedulingAction)). + GetPost("/setting", new(SettingAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/scheduling.go b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/scheduling.go new file mode 100644 index 00000000..1513fca9 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/scheduling.go @@ -0,0 +1,54 @@ +package httpReverseProxy + +import ( + "encoding/json" + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/schedulingconfigs" +) + +type SchedulingAction struct { + actionutils.ParentAction +} + +func (this *SchedulingAction) Init() { + this.FirstMenu("scheduling") +} + +func (this *SchedulingAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "httpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["family"] = "http" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupHTTPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyId"] = reverseProxy.Id + + schedulingCode := reverseProxy.FindSchedulingConfig().Code + schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode) + if schedulingMap == nil { + this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'")) + return + } + this.Data["scheduling"] = schedulingMap + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/setting.go b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/setting.go new file mode 100644 index 00000000..80dccf51 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy/setting.go @@ -0,0 +1,102 @@ +package httpReverseProxy + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/types" +) + +type SettingAction struct { + actionutils.ParentAction +} + +func (this *SettingAction) Init() { + this.FirstMenu("setting") +} + +func (this *SettingAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "httpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["family"] = "http" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupHTTPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupHTTPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef) + if err != nil { + this.ErrorPage(err) + return + } + + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["reverseProxyRef"] = reverseProxyRef + this.Data["reverseProxyConfig"] = reverseProxy + + this.Show() +} + +func (this *SettingAction) RunPost(params struct { + GroupId int64 + ReverseProxyRefJSON []byte + ReverseProxyJSON []byte + + Must *actions.Must +}) { + defer this.CreateLogInfo("修改分组 %d 的反向代理设置", params.GroupId) + + // TODO 校验配置 + + reverseProxyConfig := &serverconfigs.ReverseProxyConfig{} + err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + err = reverseProxyConfig.Init() + if err != nil { + this.Fail("配置校验失败:" + err.Error()) + } + + // 设置是否启用 + _, err = this.RPC().ServerGroupRPC().UpdateServerGroupHTTPReverseProxy(this.AdminContext(), &pb.UpdateServerGroupHTTPReverseProxyRequest{ + ServerGroupId: params.GroupId, + ReverseProxyJSON: params.ReverseProxyRefJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + + // 设置反向代理相关信息 + _, err = this.RPC().ReverseProxyRPC().UpdateReverseProxy(this.AdminContext(), &pb.UpdateReverseProxyRequest{ + ReverseProxyId: reverseProxyConfig.Id, + RequestHostType: types.Int32(reverseProxyConfig.RequestHostType), + RequestHost: reverseProxyConfig.RequestHost, + RequestURI: reverseProxyConfig.RequestURI, + StripPrefix: reverseProxyConfig.StripPrefix, + AutoFlush: reverseProxyConfig.AutoFlush, + AddHeaders: reverseProxyConfig.AddHeaders, + }) + + this.Success() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/index/index.go b/internal/web/actions/default/servers/groups/group/settings/index/index.go new file mode 100644 index 00000000..770e2f94 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/index/index.go @@ -0,0 +1,23 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package reverseProxy + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/iwind/TeaGo/types" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "") +} + +func (this *IndexAction) RunGet(params struct { + GroupId int64 +}) { + this.RedirectURL("/servers/groups/group/settings/httpReverseProxy?groupId=" + types.String(params.GroupId)) + return +} diff --git a/internal/web/actions/default/servers/groups/group/settings/index/init.go b/internal/web/actions/default/servers/groups/group/settings/index/init.go new file mode 100644 index 00000000..c12df93f --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/index/init.go @@ -0,0 +1,22 @@ +package reverseProxy + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/locations/locationutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Helper(locationutils.NewLocationHelper()). + Helper(serverutils.NewServerHelper()). + Data("mainTab", "setting"). + Prefix("/servers/groups/group/settings"). + Get("", new(IndexAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/index.go b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/index.go new file mode 100644 index 00000000..09be7a4a --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/index.go @@ -0,0 +1,87 @@ +package tcpReverseProxy + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +// IndexAction 源站列表 +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.FirstMenu("index") +} + +func (this *IndexAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "tcpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["serverType"] = "tcpProxy" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupTCPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupTCPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyRef"] = reverseProxyRef + + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyConfig"] = reverseProxy + + primaryOriginMaps := []maps.Map{} + backupOriginMaps := []maps.Map{} + for _, originConfig := range reverseProxy.PrimaryOrigins { + if len(originConfig.Domains) == 0 { + originConfig.Domains = []string{} + } + m := maps.Map{ + "id": originConfig.Id, + "weight": originConfig.Weight, + "addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, + "name": originConfig.Name, + "isOn": originConfig.IsOn, + "domains": originConfig.Domains, + } + primaryOriginMaps = append(primaryOriginMaps, m) + } + for _, originConfig := range reverseProxy.BackupOrigins { + if len(originConfig.Domains) == 0 { + originConfig.Domains = []string{} + } + m := maps.Map{ + "id": originConfig.Id, + "weight": originConfig.Weight, + "addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, + "name": originConfig.Name, + "isOn": originConfig.IsOn, + "domains": originConfig.Domains, + } + backupOriginMaps = append(backupOriginMaps, m) + } + this.Data["primaryOrigins"] = primaryOriginMaps + this.Data["backupOrigins"] = backupOriginMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/init.go b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/init.go new file mode 100644 index 00000000..e2e1af8c --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/init.go @@ -0,0 +1,21 @@ +package tcpReverseProxy + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Data("teaMenu", "servers"). + Data("teaSubMenu", "group"). + Prefix("/servers/groups/group/settings/tcpReverseProxy"). + Get("", new(IndexAction)). + GetPost("/scheduling", new(SchedulingAction)). + GetPost("/setting", new(SettingAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/scheduling.go b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/scheduling.go new file mode 100644 index 00000000..c244033b --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/scheduling.go @@ -0,0 +1,54 @@ +package tcpReverseProxy + +import ( + "encoding/json" + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/schedulingconfigs" +) + +type SchedulingAction struct { + actionutils.ParentAction +} + +func (this *SchedulingAction) Init() { + this.FirstMenu("scheduling") +} + +func (this *SchedulingAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "tcpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["family"] = "tcp" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupTCPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupTCPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyId"] = reverseProxy.Id + + schedulingCode := reverseProxy.FindSchedulingConfig().Code + schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode) + if schedulingMap == nil { + this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'")) + return + } + this.Data["scheduling"] = schedulingMap + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/setting.go b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/setting.go new file mode 100644 index 00000000..77424a65 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy/setting.go @@ -0,0 +1,102 @@ +package tcpReverseProxy + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/types" +) + +type SettingAction struct { + actionutils.ParentAction +} + +func (this *SettingAction) Init() { + this.FirstMenu("setting") +} + +func (this *SettingAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "tcpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["family"] = "tcp" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupTCPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupTCPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef) + if err != nil { + this.ErrorPage(err) + return + } + + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["reverseProxyRef"] = reverseProxyRef + this.Data["reverseProxyConfig"] = reverseProxy + + this.Show() +} + +func (this *SettingAction) RunPost(params struct { + GroupId int64 + ReverseProxyRefJSON []byte + ReverseProxyJSON []byte + + Must *actions.Must +}) { + defer this.CreateLogInfo("修改分组 %d 的反向代理设置", params.GroupId) + + // TODO 校验配置 + + reverseProxyConfig := &serverconfigs.ReverseProxyConfig{} + err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + err = reverseProxyConfig.Init() + if err != nil { + this.Fail("配置校验失败:" + err.Error()) + } + + // 设置是否启用 + _, err = this.RPC().ServerGroupRPC().UpdateServerGroupTCPReverseProxy(this.AdminContext(), &pb.UpdateServerGroupTCPReverseProxyRequest{ + ServerGroupId: params.GroupId, + ReverseProxyJSON: params.ReverseProxyRefJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + + // 设置反向代理相关信息 + _, err = this.RPC().ReverseProxyRPC().UpdateReverseProxy(this.AdminContext(), &pb.UpdateReverseProxyRequest{ + ReverseProxyId: reverseProxyConfig.Id, + RequestHostType: types.Int32(reverseProxyConfig.RequestHostType), + RequestHost: reverseProxyConfig.RequestHost, + RequestURI: reverseProxyConfig.RequestURI, + StripPrefix: reverseProxyConfig.StripPrefix, + AutoFlush: reverseProxyConfig.AutoFlush, + AddHeaders: reverseProxyConfig.AddHeaders, + }) + + this.Success() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/index.go b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/index.go new file mode 100644 index 00000000..8a899272 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/index.go @@ -0,0 +1,87 @@ +package udpReverseProxy + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +// IndexAction 源站列表 +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.FirstMenu("index") +} + +func (this *IndexAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "udpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["serverType"] = "udpProxy" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupUDPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupUDPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyRef"] = reverseProxyRef + + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyConfig"] = reverseProxy + + primaryOriginMaps := []maps.Map{} + backupOriginMaps := []maps.Map{} + for _, originConfig := range reverseProxy.PrimaryOrigins { + if len(originConfig.Domains) == 0 { + originConfig.Domains = []string{} + } + m := maps.Map{ + "id": originConfig.Id, + "weight": originConfig.Weight, + "addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, + "name": originConfig.Name, + "isOn": originConfig.IsOn, + "domains": originConfig.Domains, + } + primaryOriginMaps = append(primaryOriginMaps, m) + } + for _, originConfig := range reverseProxy.BackupOrigins { + if len(originConfig.Domains) == 0 { + originConfig.Domains = []string{} + } + m := maps.Map{ + "id": originConfig.Id, + "weight": originConfig.Weight, + "addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, + "name": originConfig.Name, + "isOn": originConfig.IsOn, + "domains": originConfig.Domains, + } + backupOriginMaps = append(backupOriginMaps, m) + } + this.Data["primaryOrigins"] = primaryOriginMaps + this.Data["backupOrigins"] = backupOriginMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/init.go b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/init.go new file mode 100644 index 00000000..dfa496c1 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/init.go @@ -0,0 +1,21 @@ +package udpReverseProxy + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Data("teaMenu", "servers"). + Data("teaSubMenu", "group"). + Prefix("/servers/groups/group/settings/udpReverseProxy"). + Get("", new(IndexAction)). + GetPost("/scheduling", new(SchedulingAction)). + GetPost("/setting", new(SettingAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/scheduling.go b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/scheduling.go new file mode 100644 index 00000000..f9a6e1a1 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/scheduling.go @@ -0,0 +1,54 @@ +package udpReverseProxy + +import ( + "encoding/json" + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/schedulingconfigs" +) + +type SchedulingAction struct { + actionutils.ParentAction +} + +func (this *SchedulingAction) Init() { + this.FirstMenu("scheduling") +} + +func (this *SchedulingAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "udpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["family"] = "udp" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupUDPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupUDPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["reverseProxyId"] = reverseProxy.Id + + schedulingCode := reverseProxy.FindSchedulingConfig().Code + schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode) + if schedulingMap == nil { + this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'")) + return + } + this.Data["scheduling"] = schedulingMap + + this.Show() +} diff --git a/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/setting.go b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/setting.go new file mode 100644 index 00000000..41b0f531 --- /dev/null +++ b/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy/setting.go @@ -0,0 +1,102 @@ +package udpReverseProxy + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/types" +) + +type SettingAction struct { + actionutils.ParentAction +} + +func (this *SettingAction) Init() { + this.FirstMenu("setting") +} + +func (this *SettingAction) RunGet(params struct { + GroupId int64 +}) { + _, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "udpReverseProxy") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["family"] = "udp" + + reverseProxyResp, err := this.RPC().ServerGroupRPC().FindAndInitServerGroupUDPReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerGroupUDPReverseProxyConfigRequest{ServerGroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + reverseProxyRef := &serverconfigs.ReverseProxyRef{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef) + if err != nil { + this.ErrorPage(err) + return + } + + reverseProxy := &serverconfigs.ReverseProxyConfig{} + err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["reverseProxyRef"] = reverseProxyRef + this.Data["reverseProxyConfig"] = reverseProxy + + this.Show() +} + +func (this *SettingAction) RunPost(params struct { + GroupId int64 + ReverseProxyRefJSON []byte + ReverseProxyJSON []byte + + Must *actions.Must +}) { + defer this.CreateLogInfo("修改分组 %d 的反向代理设置", params.GroupId) + + // TODO 校验配置 + + reverseProxyConfig := &serverconfigs.ReverseProxyConfig{} + err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + err = reverseProxyConfig.Init() + if err != nil { + this.Fail("配置校验失败:" + err.Error()) + } + + // 设置是否启用 + _, err = this.RPC().ServerGroupRPC().UpdateServerGroupUDPReverseProxy(this.AdminContext(), &pb.UpdateServerGroupUDPReverseProxyRequest{ + ServerGroupId: params.GroupId, + ReverseProxyJSON: params.ReverseProxyRefJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + + // 设置反向代理相关信息 + _, err = this.RPC().ReverseProxyRPC().UpdateReverseProxy(this.AdminContext(), &pb.UpdateReverseProxyRequest{ + ReverseProxyId: reverseProxyConfig.Id, + RequestHostType: types.Int32(reverseProxyConfig.RequestHostType), + RequestHost: reverseProxyConfig.RequestHost, + RequestURI: reverseProxyConfig.RequestURI, + StripPrefix: reverseProxyConfig.StripPrefix, + AutoFlush: reverseProxyConfig.AutoFlush, + AddHeaders: reverseProxyConfig.AddHeaders, + }) + + this.Success() +} diff --git a/internal/web/actions/default/servers/components/groups/updatePopup.go b/internal/web/actions/default/servers/groups/group/update.go similarity index 65% rename from internal/web/actions/default/servers/components/groups/updatePopup.go rename to internal/web/actions/default/servers/groups/group/update.go index 0c803d06..6a03f206 100644 --- a/internal/web/actions/default/servers/components/groups/updatePopup.go +++ b/internal/web/actions/default/servers/groups/group/update.go @@ -1,34 +1,30 @@ -package groups +package group import ( "github.com/TeaOSLab/EdgeAdmin/internal/oplogs" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" ) -type UpdatePopupAction struct { +type UpdateAction struct { actionutils.ParentAction } -func (this *UpdatePopupAction) Init() { - this.Nav("", "", "") +func (this *UpdateAction) Init() { + this.Nav("", "", "group.update") } -func (this *UpdatePopupAction) RunGet(params struct { +func (this *UpdateAction) RunGet(params struct { GroupId int64 }) { - groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroup(this.AdminContext(), &pb.FindEnabledServerGroupRequest{ServerGroupId: params.GroupId}) + group, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "") if err != nil { this.ErrorPage(err) return } - group := groupResp.ServerGroup - if group == nil { - this.NotFound("serverGroup", params.GroupId) - return - } this.Data["group"] = maps.Map{ "id": group.Id, @@ -38,7 +34,7 @@ func (this *UpdatePopupAction) RunGet(params struct { this.Show() } -func (this *UpdatePopupAction) RunPost(params struct { +func (this *UpdateAction) RunPost(params struct { GroupId int64 Name string diff --git a/internal/web/actions/default/servers/components/groups/helper.go b/internal/web/actions/default/servers/groups/helper.go similarity index 100% rename from internal/web/actions/default/servers/components/groups/helper.go rename to internal/web/actions/default/servers/groups/helper.go diff --git a/internal/web/actions/default/servers/components/groups/index.go b/internal/web/actions/default/servers/groups/index.go similarity index 100% rename from internal/web/actions/default/servers/components/groups/index.go rename to internal/web/actions/default/servers/groups/index.go diff --git a/internal/web/actions/default/servers/components/groups/init.go b/internal/web/actions/default/servers/groups/init.go similarity index 65% rename from internal/web/actions/default/servers/components/groups/init.go rename to internal/web/actions/default/servers/groups/init.go index 1a839c57..4cfad300 100644 --- a/internal/web/actions/default/servers/components/groups/init.go +++ b/internal/web/actions/default/servers/groups/init.go @@ -2,6 +2,7 @@ package groups import ( "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group" "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" "github.com/iwind/TeaGo" ) @@ -12,13 +13,17 @@ func init() { Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). Helper(NewHelper()). Data("teaSubMenu", "group"). - Prefix("/servers/components/groups"). + Prefix("/servers/groups"). Get("", new(IndexAction)). GetPost("/createPopup", new(CreatePopupAction)). - GetPost("/updatePopup", new(UpdatePopupAction)). GetPost("/selectPopup", new(SelectPopupAction)). - Post("/delete", new(DeleteAction)). Post("/sort", new(SortAction)). + + // 详情 + Prefix("/servers/groups/group"). + Get("", new(group.IndexAction)). + Post("/delete", new(group.DeleteAction)). + GetPost("/update", new(group.UpdateAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/components/groups/selectPopup.go b/internal/web/actions/default/servers/groups/selectPopup.go similarity index 100% rename from internal/web/actions/default/servers/components/groups/selectPopup.go rename to internal/web/actions/default/servers/groups/selectPopup.go diff --git a/internal/web/actions/default/servers/components/groups/sort.go b/internal/web/actions/default/servers/groups/sort.go similarity index 100% rename from internal/web/actions/default/servers/components/groups/sort.go rename to internal/web/actions/default/servers/groups/sort.go diff --git a/internal/web/actions/default/servers/server/settings/origins/addPopup.go b/internal/web/actions/default/servers/server/settings/origins/addPopup.go index ca07f29c..a44ceea8 100644 --- a/internal/web/actions/default/servers/server/settings/origins/addPopup.go +++ b/internal/web/actions/default/servers/server/settings/origins/addPopup.go @@ -21,18 +21,24 @@ type AddPopupAction struct { func (this *AddPopupAction) RunGet(params struct { ServerId int64 + ServerType string ReverseProxyId int64 OriginType string }) { this.Data["reverseProxyId"] = params.ReverseProxyId this.Data["originType"] = params.OriginType - serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{ServerId: params.ServerId}) - if err != nil { - this.ErrorPage(err) - return + var serverType = "" + if params.ServerId > 0 { + serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + serverType = serverTypeResp.Type + } else { + serverType = params.ServerType } - serverType := serverTypeResp.Type this.Data["serverType"] = serverType // 是否为HTTP diff --git a/internal/web/actions/default/servers/server/settings/origins/updatePopup.go b/internal/web/actions/default/servers/server/settings/origins/updatePopup.go index 0c349405..84cb78ed 100644 --- a/internal/web/actions/default/servers/server/settings/origins/updatePopup.go +++ b/internal/web/actions/default/servers/server/settings/origins/updatePopup.go @@ -26,6 +26,7 @@ func (this *UpdatePopupAction) Init() { func (this *UpdatePopupAction) RunGet(params struct { ServerId int64 + ServerType string ReverseProxyId int64 OriginType string OriginId int64 @@ -34,15 +35,20 @@ func (this *UpdatePopupAction) RunGet(params struct { this.Data["reverseProxyId"] = params.ReverseProxyId this.Data["originId"] = params.OriginId - serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{ - ServerId: params.ServerId, - }) - if err != nil { - this.ErrorPage(err) - return + var serverType = "" + if params.ServerId > 0 { + serverTypeResp, err := this.RPC().ServerRPC().FindEnabledServerType(this.AdminContext(), &pb.FindEnabledServerTypeRequest{ + ServerId: params.ServerId, + }) + if err != nil { + this.ErrorPage(err) + return + } + serverType = serverTypeResp.Type + } else { + serverType = params.ServerType } - this.Data["serverType"] = serverTypeResp.Type - serverType := serverTypeResp.Type + this.Data["serverType"] = serverType // 是否为HTTP this.Data["isHTTP"] = serverType == "httpProxy" || serverType == "httpWeb" diff --git a/internal/web/actions/default/servers/server/settings/reverseProxy/index.go b/internal/web/actions/default/servers/server/settings/reverseProxy/index.go index c5447886..45ab511e 100644 --- a/internal/web/actions/default/servers/server/settings/reverseProxy/index.go +++ b/internal/web/actions/default/servers/server/settings/reverseProxy/index.go @@ -8,7 +8,7 @@ import ( "github.com/iwind/TeaGo/maps" ) -// 源站列表 +// IndexAction 源站列表 type IndexAction struct { actionutils.ParentAction } @@ -27,6 +27,23 @@ func (this *IndexAction) RunGet(params struct { } serverType := serverTypeResp.Type + // 当前是否有分组设置 + groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["hasGroupConfig"] = false + switch serverType { + case serverconfigs.ServerTypeHTTPWeb, serverconfigs.ServerTypeHTTPProxy: + this.Data["hasGroupConfig"] = groupResp.HasHTTPReverseProxy + case serverconfigs.ServerTypeTCPProxy: + this.Data["hasGroupConfig"] = groupResp.HasTCPReverseProxy + case serverconfigs.ServerTypeUDPProxy: + this.Data["hasGroupConfig"] = groupResp.HasUDPReverseProxy + } + + // 当前服务的配置 reverseProxyResp, err := this.RPC().ServerRPC().FindAndInitServerReverseProxyConfig(this.AdminContext(), &pb.FindAndInitServerReverseProxyConfigRequest{ServerId: params.ServerId}) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/servers/server/settings/reverseProxy/updateSchedulingPopup.go b/internal/web/actions/default/servers/server/settings/reverseProxy/updateSchedulingPopup.go index 6b698b24..13947dfb 100644 --- a/internal/web/actions/default/servers/server/settings/reverseProxy/updateSchedulingPopup.go +++ b/internal/web/actions/default/servers/server/settings/reverseProxy/updateSchedulingPopup.go @@ -13,7 +13,7 @@ import ( "github.com/iwind/TeaGo/types" ) -// 修改调度算法 +// UpdateSchedulingPopupAction 修改调度算法 type UpdateSchedulingPopupAction struct { actionutils.ParentAction } @@ -24,17 +24,15 @@ func (this *UpdateSchedulingPopupAction) Init() { func (this *UpdateSchedulingPopupAction) RunGet(params struct { Type string ServerId int64 + GroupId int64 ReverseProxyId int64 + Family string }) { this.Data["dataType"] = params.Type this.Data["serverId"] = params.ServerId + this.Data["groupId"] = params.GroupId this.Data["reverseProxyId"] = params.ReverseProxyId - _, serverConfig, isOk := serverutils.FindServer(this.Parent(), params.ServerId) - if !isOk { - return - } - reverseProxyResp, err := this.RPC().ReverseProxyRPC().FindEnabledReverseProxyConfig(this.AdminContext(), &pb.FindEnabledReverseProxyConfigRequest{ ReverseProxyId: params.ReverseProxyId, }) @@ -62,6 +60,33 @@ func (this *UpdateSchedulingPopupAction) RunGet(params struct { // 调度类型 schedulingTypes := []maps.Map{} + + var isHTTPFamily = false + var isTCPFamily = false + var isUDPFamily = false + var isUnixFamily = false + if params.ServerId > 0 { + _, serverConfig, isOk := serverutils.FindServer(this.Parent(), params.ServerId) + if !isOk { + return + } + isHTTPFamily = serverConfig.IsHTTPFamily() + isTCPFamily = serverConfig.IsTCPFamily() + isUDPFamily = serverConfig.IsUDPFamily() + isUnixFamily = serverConfig.IsUnixFamily() + } else { + switch params.Family { + case "http": + isHTTPFamily = true + case "tcp": + isTCPFamily = true + case "udp": + isUDPFamily = true + case "unix": + isUnixFamily = true + } + } + for _, m := range schedulingconfigs.AllSchedulingTypes() { networks, ok := m["networks"] if !ok { @@ -70,10 +95,10 @@ func (this *UpdateSchedulingPopupAction) RunGet(params struct { if !types.IsSlice(networks) { continue } - if (serverConfig.IsHTTPFamily() && lists.Contains(networks, "http")) || - (serverConfig.IsTCPFamily() && lists.Contains(networks, "tcp")) || - (serverConfig.IsUDPFamily() && lists.Contains(networks, "udp")) || - (serverConfig.IsUnixFamily() && lists.Contains(networks, "unix")) { + if (isHTTPFamily && lists.Contains(networks, "http")) || + (isTCPFamily && lists.Contains(networks, "tcp")) || + (isUDPFamily && lists.Contains(networks, "udp")) || + (isUnixFamily && lists.Contains(networks, "unix")) { schedulingTypes = append(schedulingTypes, m) } } diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index dbd2e9ec..03897fb6 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -180,6 +180,11 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map { "subtitle": "服务列表", "icon": "clone outsize", "subItems": []maps.Map{ + { + "name": "服务分组", + "url": "/servers/groups", + "code": "group", + }, { "name": "证书管理", "url": "/servers/certs", @@ -216,11 +221,6 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map { "url": "/servers/metrics", "code": "metric", }, - { - "name": "服务分组", - "url": "/servers/components/groups", - "code": "group", - }, { "name": "通用设置", "url": "/servers/components", diff --git a/internal/web/import.go b/internal/web/import.go index f4cfb7ab..db4877e3 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -41,9 +41,13 @@ import ( _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/cache" - _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/groups" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/log" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/waf" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/httpReverseProxy" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/index" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/tcpReverseProxy" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/settings/udpReverseProxy" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/logs" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/metrics/charts" diff --git a/web/public/js/components/server/origin-list-box.js b/web/public/js/components/server/origin-list-box.js index e650c1f1..ac61517d 100644 --- a/web/public/js/components/server/origin-list-box.js +++ b/web/public/js/components/server/origin-list-box.js @@ -85,7 +85,7 @@ Vue.component("origin-list-table", {
| 是否启用反向代理 |
diff --git a/web/public/js/components/server/server-group-selector.js b/web/public/js/components/server/server-group-selector.js
index 8c62e974..7af310da 100644
--- a/web/public/js/components/server/server-group-selector.js
+++ b/web/public/js/components/server/server-group-selector.js
@@ -15,7 +15,7 @@ Vue.component("server-group-selector", {
let groupIds = this.groups.map(function (v) {
return v.id.toString()
}).join(",")
- teaweb.popup("/servers/components/groups/selectPopup?selectedGroupIds=" + groupIds, {
+ teaweb.popup("/servers/groups/selectPopup?selectedGroupIds=" + groupIds, {
callback: function (resp) {
that.groups.push(resp.data.group)
}
@@ -23,7 +23,7 @@ Vue.component("server-group-selector", {
},
addGroup: function () {
let that = this
- teaweb.popup("/servers/components/groups/createPopup", {
+ teaweb.popup("/servers/groups/createPopup", {
callback: function (resp) {
that.groups.push(resp.data.group)
}
diff --git a/web/views/@default/@layout.css b/web/views/@default/@layout.css
index 53e0fd82..1d481e01 100644
--- a/web/views/@default/@layout.css
+++ b/web/views/@default/@layout.css
@@ -60,6 +60,9 @@
.left-box.with-menu {
top: 10em;
}
+.left-box.without-menu {
+ top: 6em;
+}
.right-box {
position: fixed;
top: 7.5em;
@@ -86,6 +89,9 @@ body.expanded .right-box {
.right-box.with-menu {
top: 10em;
}
+.right-box.without-menu {
+ top: 6em;
+}
.main.without-footer .left-box {
bottom: 0.2em;
}
@@ -180,6 +186,9 @@ div.margin,
p.margin {
margin-top: 1em;
}
+.opacity-mask {
+ opacity: 0.6;
+}
/** 操作按钮容器 **/
.op.one {
width: 4em;
diff --git a/web/views/@default/@layout.css.map b/web/views/@default/@layout.css.map
index e939e381..b970d9e2 100644
--- a/web/views/@default/@layout.css.map
+++ b/web/views/@default/@layout.css.map
@@ -1 +1 @@
-{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"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","file":"@layout.css"}
\ No newline at end of file
+{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"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","file":"@layout.css"}
\ No newline at end of file
diff --git a/web/views/@default/@layout.less b/web/views/@default/@layout.less
index 6a3932bf..ce408de6 100644
--- a/web/views/@default/@layout.less
+++ b/web/views/@default/@layout.less
@@ -103,6 +103,10 @@ div.margin, p.margin {
margin-top: 1em;
}
+.opacity-mask {
+ opacity: 0.6;
+}
+
/** 操作按钮容器 **/
.op.one {
width: 4em;
@@ -799,4 +803,4 @@ td {
// input
input.error {
border: 1px #e0b4b4 solid !important;
-}
\ No newline at end of file
+}
diff --git a/web/views/@default/@left_menu.less b/web/views/@default/@left_menu.less
index ef4037da..e33bcccb 100644
--- a/web/views/@default/@left_menu.less
+++ b/web/views/@default/@left_menu.less
@@ -83,6 +83,10 @@
top: 10em;
}
+.left-box.without-menu {
+ top: 6em;
+}
+
.right-box {
position: fixed;
top: 7.5em;
@@ -115,6 +119,10 @@ body.expanded .right-box {
top: 10em;
}
+.right-box.without-menu {
+ top: 6em;
+}
+
// main
.main.without-footer .left-box {
bottom: 0.2em;
diff --git a/web/views/@default/@left_menu_without_menu.html b/web/views/@default/@left_menu_without_menu.html
new file mode 100644
index 00000000..9b344742
--- /dev/null
+++ b/web/views/@default/@left_menu_without_menu.html
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/web/views/@default/dns/clusters/cluster.html b/web/views/@default/dns/clusters/cluster.html
index 57723398..040479ce 100644
--- a/web/views/@default/dns/clusters/cluster.html
+++ b/web/views/@default/dns/clusters/cluster.html
@@ -54,7 +54,7 @@
- 正在执行的任务+正在执行的任务网站服务解析记录 ({{servers.length}}个)+网站服务解析记录 ({{servers.length}}个)暂时没有需要设置的DNS记录。
服务+ +暂时还没有服务。 + +
修改分组 |