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", { - {{origin.addr}} + {{origin.addr}}  
{{origin.name}}
diff --git a/web/public/js/components/server/reverse-proxy-box.js b/web/public/js/components/server/reverse-proxy-box.js index a2203256..27808021 100644 --- a/web/public/js/components/server/reverse-proxy-box.js +++ b/web/public/js/components/server/reverse-proxy-box.js @@ -1,143 +1,146 @@ Vue.component("reverse-proxy-box", { - props: ["v-reverse-proxy-ref", "v-reverse-proxy-config", "v-is-location", "v-family"], - data: function () { - let reverseProxyRef = this.vReverseProxyRef - if (reverseProxyRef == null) { - reverseProxyRef = { - isPrior: false, - isOn: false, - reverseProxyId: 0 - } - } + props: ["v-reverse-proxy-ref", "v-reverse-proxy-config", "v-is-location", "v-is-group", "v-family"], + data: function () { + let reverseProxyRef = this.vReverseProxyRef + if (reverseProxyRef == null) { + reverseProxyRef = { + isPrior: false, + isOn: false, + reverseProxyId: 0 + } + } - let reverseProxyConfig = this.vReverseProxyConfig - if (reverseProxyConfig == null) { - reverseProxyConfig = { - requestPath: "", - stripPrefix: "", - requestURI: "", - requestHost: "", - requestHostType: 0, - addHeaders: [], - connTimeout: {count: 0, unit: "second"}, - readTimeout: {count: 0, unit: "second"}, - idleTimeout: {count: 0, unit: "second"}, - maxConns: 0, - maxIdleConns: 0 - } - } - if (reverseProxyConfig.addHeaders == null) { - reverseProxyConfig.addHeaders = [] - } - if (reverseProxyConfig.connTimeout == null) { - reverseProxyConfig.connTimeout = {count: 0, unit: "second"} - } - if (reverseProxyConfig.readTimeout == null) { - reverseProxyConfig.readTimeout = {count: 0, unit: "second"} - } - if (reverseProxyConfig.idleTimeout == null) { - reverseProxyConfig.idleTimeout = {count: 0, unit: "second"} - } + let reverseProxyConfig = this.vReverseProxyConfig + if (reverseProxyConfig == null) { + reverseProxyConfig = { + requestPath: "", + stripPrefix: "", + requestURI: "", + requestHost: "", + requestHostType: 0, + addHeaders: [], + connTimeout: {count: 0, unit: "second"}, + readTimeout: {count: 0, unit: "second"}, + idleTimeout: {count: 0, unit: "second"}, + maxConns: 0, + maxIdleConns: 0 + } + } + if (reverseProxyConfig.addHeaders == null) { + reverseProxyConfig.addHeaders = [] + } + if (reverseProxyConfig.connTimeout == null) { + reverseProxyConfig.connTimeout = {count: 0, unit: "second"} + } + if (reverseProxyConfig.readTimeout == null) { + reverseProxyConfig.readTimeout = {count: 0, unit: "second"} + } + if (reverseProxyConfig.idleTimeout == null) { + reverseProxyConfig.idleTimeout = {count: 0, unit: "second"} + } - let forwardHeaders = [ - { - name: "X-Real-IP", - isChecked: false - }, - { - name: "X-Forwarded-For", - isChecked: false - }, - { - name: "X-Forwarded-By", - isChecked: false - }, - { - name: "X-Forwarded-Host", - isChecked: false - }, - { - name: "X-Forwarded-Proto", - isChecked: false - } - ] - forwardHeaders.forEach(function (v) { - v.isChecked = reverseProxyConfig.addHeaders.$contains(v.name) - }) + let forwardHeaders = [ + { + name: "X-Real-IP", + isChecked: false + }, + { + name: "X-Forwarded-For", + isChecked: false + }, + { + name: "X-Forwarded-By", + isChecked: false + }, + { + name: "X-Forwarded-Host", + isChecked: false + }, + { + name: "X-Forwarded-Proto", + isChecked: false + } + ] + forwardHeaders.forEach(function (v) { + v.isChecked = reverseProxyConfig.addHeaders.$contains(v.name) + }) - return { - reverseProxyRef: reverseProxyRef, - reverseProxyConfig: reverseProxyConfig, - advancedVisible: false, - family: this.vFamily, - forwardHeaders: forwardHeaders - } - }, - watch: { - "reverseProxyConfig.requestHostType": function (v) { - let requestHostType = parseInt(v) - if (isNaN(requestHostType)) { - requestHostType = 0 - } - this.reverseProxyConfig.requestHostType = requestHostType - }, - "reverseProxyConfig.connTimeout.count": function (v) { - let count = parseInt(v) - if (isNaN(count) || count < 0) { - count = 0 - } - this.reverseProxyConfig.connTimeout.count = count - }, - "reverseProxyConfig.readTimeout.count": function (v) { - let count = parseInt(v) - if (isNaN(count) || count < 0) { - count = 0 - } - this.reverseProxyConfig.readTimeout.count = count - }, - "reverseProxyConfig.idleTimeout.count": function (v) { - let count = parseInt(v) - if (isNaN(count) || count < 0) { - count = 0 - } - this.reverseProxyConfig.idleTimeout.count = count - }, - "reverseProxyConfig.maxConns": function (v) { - let maxConns = parseInt(v) - if (isNaN(maxConns) || maxConns < 0) { - maxConns = 0 - } - this.reverseProxyConfig.maxConns = maxConns - }, - "reverseProxyConfig.maxIdleConns": function (v) { - let maxIdleConns = parseInt(v) - if (isNaN(maxIdleConns) || maxIdleConns < 0) { - maxIdleConns = 0 - } - this.reverseProxyConfig.maxIdleConns = maxIdleConns - }, - }, - methods: { - isOn: function () { - return (!this.vIsLocation || this.reverseProxyRef.isPrior) && this.reverseProxyRef.isOn - }, - changeAdvancedVisible: function (v) { - this.advancedVisible = v - }, - changeAddHeader: function () { - this.reverseProxyConfig.addHeaders = this.forwardHeaders.filter(function (v) { - return v.isChecked - }).map(function (v) { - return v.name - }) - } - }, - template: `
+ return { + reverseProxyRef: reverseProxyRef, + reverseProxyConfig: reverseProxyConfig, + advancedVisible: false, + family: this.vFamily, + forwardHeaders: forwardHeaders + } + }, + watch: { + "reverseProxyConfig.requestHostType": function (v) { + let requestHostType = parseInt(v) + if (isNaN(requestHostType)) { + requestHostType = 0 + } + this.reverseProxyConfig.requestHostType = requestHostType + }, + "reverseProxyConfig.connTimeout.count": function (v) { + let count = parseInt(v) + if (isNaN(count) || count < 0) { + count = 0 + } + this.reverseProxyConfig.connTimeout.count = count + }, + "reverseProxyConfig.readTimeout.count": function (v) { + let count = parseInt(v) + if (isNaN(count) || count < 0) { + count = 0 + } + this.reverseProxyConfig.readTimeout.count = count + }, + "reverseProxyConfig.idleTimeout.count": function (v) { + let count = parseInt(v) + if (isNaN(count) || count < 0) { + count = 0 + } + this.reverseProxyConfig.idleTimeout.count = count + }, + "reverseProxyConfig.maxConns": function (v) { + let maxConns = parseInt(v) + if (isNaN(maxConns) || maxConns < 0) { + maxConns = 0 + } + this.reverseProxyConfig.maxConns = maxConns + }, + "reverseProxyConfig.maxIdleConns": function (v) { + let maxIdleConns = parseInt(v) + if (isNaN(maxIdleConns) || maxIdleConns < 0) { + maxIdleConns = 0 + } + this.reverseProxyConfig.maxIdleConns = maxIdleConns + }, + }, + methods: { + isOn: function () { + if (this.vIsLocation || this.vIsGroup) { + return this.reverseProxyRef.isPrior && this.reverseProxyRef.isOn + } + return this.reverseProxyRef.isOn + }, + changeAdvancedVisible: function (v) { + this.advancedVisible = v + }, + changeAddHeader: function () { + this.reverseProxyConfig.addHeaders = this.forwardHeaders.filter(function (v) { + return v.isChecked + }).map(function (v) { + return v.name + }) + } + }, + template: `
- - + +
是否启用反向代理 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 @@
-

正在执行的任务

+

正在执行的任务

@@ -94,7 +94,7 @@
-

需要修复的问题

+

需要修复的问题

@@ -131,7 +131,7 @@

下面的DNS解析记录也可以手工在DNS服务商提供的管理平台添加。

-

节点DNS解析记录   ({{nodes.length}}个)

+

节点DNS解析记录   ({{nodes.length}}个)

暂时没有需要设置的DNS记录。

@@ -174,7 +174,7 @@
-

网站服务解析记录   ({{servers.length}}个)

+

网站服务解析记录   ({{servers.length}}个)

暂时没有需要设置的DNS记录。

diff --git a/web/views/@default/servers/components/groups/createPopup.html b/web/views/@default/servers/groups/createPopup.html similarity index 100% rename from web/views/@default/servers/components/groups/createPopup.html rename to web/views/@default/servers/groups/createPopup.html diff --git a/web/views/@default/servers/groups/group/@menu.html b/web/views/@default/servers/groups/group/@menu.html new file mode 100644 index 00000000..00ca2073 --- /dev/null +++ b/web/views/@default/servers/groups/group/@menu.html @@ -0,0 +1,7 @@ + + 分组列表 + | + "{{group.name}}"详情 + 全局设置   + 修改 + \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/index.html b/web/views/@default/servers/groups/group/index.html new file mode 100644 index 00000000..43820260 --- /dev/null +++ b/web/views/@default/servers/groups/group/index.html @@ -0,0 +1,84 @@ +{$layout} +{$template "menu"} + +
+ + + + +
分组名称 + {{group.name}} +
+ +

服务

+ +

暂时还没有服务。

+ + + + + + + + + + + + + + + + + + + + + + +
服务名称所属用户部署集群域名端口状态操作
{{server.name}} +
+ {{server.serverTypeName}} +
+
+ {{server.user.fullname}} + - + {{server.cluster.name}} + + {{server.serverNames[0].name}} + {{server.serverNames[0].subNames[0]}} + 等{{server.countServerNames}}个域名 + + - + + + + + + + + - +
+ {{port.portRange}}({{port.protocol}}) +
+
+
+ +
+
+ 停用中 + 正常 + 检查中 + {{server.status.message}} + + +
+
+ 详情   + 设置 +
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/index.js b/web/views/@default/servers/groups/group/index.js new file mode 100644 index 00000000..db30a40e --- /dev/null +++ b/web/views/@default/servers/groups/group/index.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.checkDNS = false +}) \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/httpReverseProxy/@menu.html b/web/views/@default/servers/groups/group/settings/httpReverseProxy/@menu.html new file mode 100644 index 00000000..860904f4 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/httpReverseProxy/@menu.html @@ -0,0 +1,5 @@ + + 源站列表 + 调度算法 + 更多设置 + \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/httpReverseProxy/index.html b/web/views/@default/servers/groups/group/settings/httpReverseProxy/index.html new file mode 100644 index 00000000..06ad9a0e --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/httpReverseProxy/index.html @@ -0,0 +1,19 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + +
+
+ 当前代理服务没有开启,可以通过点击 [更多设置] 开启 。 +
+ +
+ +
+
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/httpReverseProxy/scheduling.html b/web/views/@default/servers/groups/group/settings/httpReverseProxy/scheduling.html new file mode 100644 index 00000000..9f53f947 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/httpReverseProxy/scheduling.html @@ -0,0 +1,9 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + + +
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/httpReverseProxy/setting.html b/web/views/@default/servers/groups/group/settings/httpReverseProxy/setting.html new file mode 100644 index 00000000..e3cace59 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/httpReverseProxy/setting.html @@ -0,0 +1,15 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + +
+
+ + + + +
+
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/httpReverseProxy/setting.js b/web/views/@default/servers/groups/group/settings/httpReverseProxy/setting.js new file mode 100644 index 00000000..295a9aaf --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/httpReverseProxy/setting.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyReloadSuccess("保存成功") +}) \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/tcpReverseProxy/@menu.html b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/@menu.html new file mode 100644 index 00000000..860904f4 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/@menu.html @@ -0,0 +1,5 @@ + + 源站列表 + 调度算法 + 更多设置 + \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/tcpReverseProxy/index.html b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/index.html new file mode 100644 index 00000000..97ecb1c9 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/index.html @@ -0,0 +1,19 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + +
+
+ 当前代理服务没有开启,可以通过点击 [更多设置] 开启 。 +
+ +
+ +
+
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/tcpReverseProxy/scheduling.html b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/scheduling.html new file mode 100644 index 00000000..9f53f947 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/scheduling.html @@ -0,0 +1,9 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + + +
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/tcpReverseProxy/setting.html b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/setting.html new file mode 100644 index 00000000..e3cace59 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/setting.html @@ -0,0 +1,15 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + +
+
+ + + + +
+
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/tcpReverseProxy/setting.js b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/setting.js new file mode 100644 index 00000000..295a9aaf --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/tcpReverseProxy/setting.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyReloadSuccess("保存成功") +}) \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/udpReverseProxy/@menu.html b/web/views/@default/servers/groups/group/settings/udpReverseProxy/@menu.html new file mode 100644 index 00000000..860904f4 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/udpReverseProxy/@menu.html @@ -0,0 +1,5 @@ + + 源站列表 + 调度算法 + 更多设置 + \ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/udpReverseProxy/index.html b/web/views/@default/servers/groups/group/settings/udpReverseProxy/index.html new file mode 100644 index 00000000..97ecb1c9 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/udpReverseProxy/index.html @@ -0,0 +1,19 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + +
+
+ 当前代理服务没有开启,可以通过点击 [更多设置] 开启 。 +
+ +
+ +
+
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/udpReverseProxy/scheduling.html b/web/views/@default/servers/groups/group/settings/udpReverseProxy/scheduling.html new file mode 100644 index 00000000..9f53f947 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/udpReverseProxy/scheduling.html @@ -0,0 +1,9 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + + +
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/udpReverseProxy/setting.html b/web/views/@default/servers/groups/group/settings/udpReverseProxy/setting.html new file mode 100644 index 00000000..e3cace59 --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/udpReverseProxy/setting.html @@ -0,0 +1,15 @@ +{$layout} +{$template "/servers/groups/group/menu"} +{$template "/left_menu_without_menu"} + +
+ {$template "menu"} + +
+
+ + + + +
+
\ No newline at end of file diff --git a/web/views/@default/servers/groups/group/settings/udpReverseProxy/setting.js b/web/views/@default/servers/groups/group/settings/udpReverseProxy/setting.js new file mode 100644 index 00000000..295a9aaf --- /dev/null +++ b/web/views/@default/servers/groups/group/settings/udpReverseProxy/setting.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyReloadSuccess("保存成功") +}) \ No newline at end of file diff --git a/web/views/@default/servers/components/groups/updatePopup.html b/web/views/@default/servers/groups/group/update.html similarity index 89% rename from web/views/@default/servers/components/groups/updatePopup.html rename to web/views/@default/servers/groups/group/update.html index d7621582..459ea962 100644 --- a/web/views/@default/servers/components/groups/updatePopup.html +++ b/web/views/@default/servers/groups/group/update.html @@ -1,6 +1,6 @@ -{$layout "layout_popup"} +{$layout "layout"} +{$template "menu"} -

修改分组

diff --git a/web/views/@default/servers/groups/group/update.js b/web/views/@default/servers/groups/group/update.js new file mode 100644 index 00000000..889c1b55 --- /dev/null +++ b/web/views/@default/servers/groups/group/update.js @@ -0,0 +1,5 @@ +Tea.context(function () { + this.success = NotifySuccess("保存成功", ".", { + groupId: this.group.id + }) +}) \ No newline at end of file diff --git a/web/views/@default/servers/components/groups/index.html b/web/views/@default/servers/groups/index.html similarity index 75% rename from web/views/@default/servers/components/groups/index.html rename to web/views/@default/servers/groups/index.html index d2633984..0b46558e 100644 --- a/web/views/@default/servers/components/groups/index.html +++ b/web/views/@default/servers/groups/index.html @@ -1,7 +1,7 @@ {$layout} - 列表 + 列表 | [创建] @@ -21,13 +21,15 @@ - + diff --git a/web/views/@default/servers/components/groups/index.js b/web/views/@default/servers/groups/index.js similarity index 67% rename from web/views/@default/servers/components/groups/index.js rename to web/views/@default/servers/groups/index.js index 1114aea3..b65e00e0 100644 --- a/web/views/@default/servers/components/groups/index.js +++ b/web/views/@default/servers/groups/index.js @@ -6,7 +6,7 @@ Tea.context(function () { document.querySelectorAll("*[data-group-id]").forEach(function (element) { groupIds.push(element.getAttribute("data-group-id")) }) - that.$post("/servers/components/groups/sort") + that.$post("/servers/groups/sort") .params({ groupIds: groupIds }) @@ -17,17 +17,7 @@ Tea.context(function () { }) this.createGroup = function () { - teaweb.popup("/servers/components/groups/createPopup", { - callback: function () { - teaweb.success("保存成功", function () { - teaweb.reload() - }) - } - }) - } - - this.updateGroup = function (groupId) { - teaweb.popup("/servers/components/groups/updatePopup?groupId=" + groupId, { + teaweb.popup("/servers/groups/createPopup", { callback: function () { teaweb.success("保存成功", function () { teaweb.reload() @@ -39,7 +29,7 @@ Tea.context(function () { this.deleteGroup = function (groupId) { let that = this teaweb.confirm("确定要删除这个分组吗?", function () { - that.$post("/servers/components/groups/delete") + that.$post("/servers/groups/group/delete") .params({ groupId: groupId }) diff --git a/web/views/@default/servers/components/groups/selectPopup.html b/web/views/@default/servers/groups/selectPopup.html similarity index 100% rename from web/views/@default/servers/components/groups/selectPopup.html rename to web/views/@default/servers/groups/selectPopup.html diff --git a/web/views/@default/servers/components/groups/selectPopup.js b/web/views/@default/servers/groups/selectPopup.js similarity index 100% rename from web/views/@default/servers/components/groups/selectPopup.js rename to web/views/@default/servers/groups/selectPopup.js diff --git a/web/views/@default/servers/index.html b/web/views/@default/servers/index.html index 40975177..a0f332c9 100644 --- a/web/views/@default/servers/index.html +++ b/web/views/@default/servers/index.html @@ -129,7 +129,8 @@
{{group.name}} + {{group.name}} + {{group.countServers}} 0 - 修改   删除 + 详情   删除
- 详情 + 详情   + 设置
diff --git a/web/views/@default/servers/server/settings/reverseProxy/index.html b/web/views/@default/servers/server/settings/reverseProxy/index.html index e569c4f3..f34569a1 100644 --- a/web/views/@default/servers/server/settings/reverseProxy/index.html +++ b/web/views/@default/servers/server/settings/reverseProxy/index.html @@ -4,12 +4,19 @@
{$template "menu"} -
-
- 当前代理服务没有开启,可以通过点击 [更多设置] 开启 。 -
+
+
+ 由于已经在当前服务分组中进行了对应的配置,在这里的配置将不会生效。 +
- +
+
+
+ 当前代理服务没有开启,可以通过点击 [更多设置] 开启 。 +
+ + +
\ No newline at end of file