This commit is contained in:
unknown
2026-02-04 20:27:13 +08:00
commit 3b042d1dad
9410 changed files with 1488147 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
//go:build !plus
package serverutils
import (
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
)
func (this *ServerHelper) filterMenuItems(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map {
return menuItems
}
func (this *ServerHelper) filterMenuItems2(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map {
return menuItems
}
func (this *ServerHelper) filterMenuItems3(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map {
return menuItems
}

View File

@@ -0,0 +1,98 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
//go:build plus
package serverutils
import (
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/plus"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
plusutils "github.com/TeaOSLab/EdgePlus/pkg/utils"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
)
func (this *ServerHelper) filterMenuItems(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map {
if teaconst.IsPlus {
// 11. 5秒盾 (UAM) - 注意:分隔线已在主函数中添加
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingUAM),
"url": "/servers/server/settings/uam?serverId=" + serverIdString,
"isActive": secondMenuItem == "uam",
"isOn": serverConfig.UAM != nil && serverConfig.UAM.IsOn,
"isImportant": serverConfig.UAM != nil && serverConfig.UAM.IsOn,
"configCode": serverconfigs.ConfigCodeUAM,
})
// 12. CC防护
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingCC),
"url": "/servers/server/settings/cc?serverId=" + serverIdString,
"isActive": secondMenuItem == "cc",
"isOn": serverConfig.Web != nil && serverConfig.Web.CC != nil && serverConfig.Web.CC.IsOn,
"isImportant": serverConfig.Web != nil && serverConfig.Web.CC != nil && serverConfig.Web.CC.IsOn,
"configCode": serverconfigs.ConfigCodeCC,
})
}
return menuItems
}
func (this *ServerHelper) filterMenuItems2(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map {
if teaconst.IsPlus {
// 17. 流量限制 - 在请求限制之后
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingTrafficLimit),
"url": "/servers/server/settings/traffic?serverId=" + serverIdString,
"isActive": secondMenuItem == "traffic",
"isOn": serverConfig.TrafficLimit != nil && serverConfig.TrafficLimit.IsOn,
})
// 32. 边缘脚本 - 在访问IP地址之后
if plus.AllowComponent(plus.ComponentCodeComputing) {
if serverConfig.Web != nil && serverConfig.Web.RequestScripts != nil {
_ = serverConfig.Web.RequestScripts.Init()
}
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingScripts),
"url": "/servers/server/settings/requestScripts?serverId=" + serverIdString,
"isActive": secondMenuItem == "requestScripts",
"isOn": serverConfig.Web != nil && serverConfig.Web.RequestScripts != nil && !serverConfig.Web.RequestScripts.IsEmpty(),
})
}
}
return menuItems
}
func (this *ServerHelper) filterMenuItems3(serverConfig *serverconfigs.ServerConfig, menuItems []maps.Map, serverIdString string, secondMenuItem string, actionPtr actions.ActionWrapper) []maps.Map {
if teaconst.IsPlus {
// 18. 网页动态加密(原网页优化)
var encryptionEnabled = false
if serverConfig.Web != nil && serverConfig.Web.Encryption != nil {
// 确保 Encryption 已初始化Init 是幂等的,可以安全地多次调用)
_ = serverConfig.Web.Encryption.Init()
encryptionEnabled = serverConfig.Web.Encryption.IsEnabled()
}
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingOptimization),
"url": "/servers/server/settings/optimization?serverId=" + serverIdString,
"isActive": secondMenuItem == "optimization",
"isOn": encryptionEnabled,
"isOff": serverConfig.Web != nil && serverConfig.Web.Encryption != nil && !encryptionEnabled,
"configCode": serverconfigs.ConfigCodeOptimization,
})
// 19. 音视频加密
if plusutils.CompareEdition(plus.PlusEdition, plusutils.EditionPro) >= 0 {
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingMultimedia),
"url": "/servers/server/settings/multimedia?serverId=" + serverIdString,
"isActive": secondMenuItem == "multimedia",
"isOn": serverConfig.Web != nil && serverConfig.Web.HLS != nil && !serverConfig.Web.HLS.IsEmpty(),
"configCode": serverconfigs.ConfigCodeMultimedia,
})
}
}
return menuItems
}

View File

@@ -0,0 +1,536 @@
package serverutils
import (
"encoding/json"
"errors"
"net/http"
"strconv"
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
)
type ServerHelper struct {
helpers.LangHelper
}
func NewServerHelper() *ServerHelper {
return &ServerHelper{}
}
func (this *ServerHelper) BeforeAction(action *actions.ActionObject) {
if action.Request.Method != http.MethodGet {
return
}
action.Data["teaMenu"] = "servers"
// 左侧菜单
this.createLeftMenu(action)
}
func (this *ServerHelper) createLeftMenu(action *actions.ActionObject) {
// 初始化
if !action.Data.Has("leftMenuItemIsDisabled") {
action.Data["leftMenuItemIsDisabled"] = false
}
action.Data["leftMenuItems"] = []maps.Map{}
var mainTab = action.Data["mainTab"]
var secondMenuItem = action.Data["secondMenuItem"]
serverId := action.ParamInt64("serverId")
if serverId == 0 {
return
}
var serverIdString = strconv.FormatInt(serverId, 10)
action.Data["serverId"] = serverId
// 读取server信息
rpcClient, err := rpc.SharedRPC()
if err != nil {
logs.Error(err)
return
}
serverResp, err := rpcClient.ServerRPC().FindEnabledServer(rpcClient.Context(action.Context.GetInt64(teaconst.SessionAdminId)), &pb.FindEnabledServerRequest{
ServerId: serverId,
IgnoreSSLCerts: true,
})
if err != nil {
logs.Error(err)
return
}
var server = serverResp.Server
if server == nil {
logs.Error(errors.New("can not find the server"))
return
}
// 初始化数据
if !action.Data.Has("server") {
if server.NodeCluster == nil {
server.NodeCluster = &pb.NodeCluster{Id: 0}
}
action.Data["server"] = maps.Map{
"id": server.Id,
"name": server.Name,
"clusterId": server.NodeCluster.Id,
}
}
// 服务管理
var serverConfig = &serverconfigs.ServerConfig{}
err = json.Unmarshal(server.Config, serverConfig)
if err != nil {
logs.Error(err)
return
}
// 协议簇
var family = ""
if serverConfig.IsHTTPFamily() {
family = "http"
} else if serverConfig.IsTCPFamily() {
family = "tcp"
} else if serverConfig.IsUDPFamily() {
family = "udp"
}
action.Data["serverFamily"] = family
// TABBAR
var selectedTabbar = action.Data["mainTab"]
var tabbar = actionutils.NewTabbar()
tabbar.Add("", "", "/servers", "left arrow", false)
if len(serverConfig.Name) > 0 {
var item = tabbar.Add(serverConfig.Name, "", "/servers/server?serverId="+serverIdString, "angle right", true)
item.IsTitle = true
}
if teaconst.IsPlus {
tabbar.Add(this.Lang(action, codes.Server_TabDashboard), "", "/servers/server/boards?serverId="+serverIdString, "dashboard", selectedTabbar == "board")
}
if family == "http" {
tabbar.Add(this.Lang(action, codes.Server_TabStat), "", "/servers/server/stat?serverId="+serverIdString, "chart area", selectedTabbar == "stat")
}
if family == "http" {
tabbar.Add(this.Lang(action, codes.Server_TabAccessLogs), "", "/servers/server/log?serverId="+serverIdString, "history", selectedTabbar == "log")
}
tabbar.Add(this.Lang(action, codes.Server_TabSettings), "", "/servers/server/settings?serverId="+serverIdString, "setting", selectedTabbar == "setting")
tabbar.Add(this.Lang(action, codes.Server_TabDelete), "", "/servers/server/delete?serverId="+serverIdString, "trash", selectedTabbar == "delete")
actionutils.SetTabbar(action, tabbar)
// 左侧操作子菜单
switch types.String(mainTab) {
case "board":
action.Data["leftMenuItems"] = this.createBoardMenu(types.String(secondMenuItem), serverIdString, serverConfig, action)
case "log":
action.Data["leftMenuItems"] = this.createLogMenu(types.String(secondMenuItem), serverIdString, serverConfig, action)
case "stat":
action.Data["leftMenuItems"] = this.createStatMenu(types.String(secondMenuItem), serverIdString, serverConfig, action)
case "setting":
var menuItems = this.createSettingsMenu(types.String(secondMenuItem), serverIdString, serverConfig, action)
action.Data["leftMenuItems"] = menuItems
// 当前菜单
action.Data["leftMenuActiveItem"] = nil
for _, item := range menuItems {
if item.GetBool("isActive") {
action.Data["leftMenuActiveItem"] = item
break
}
}
case "delete":
action.Data["leftMenuItems"] = this.createDeleteMenu(types.String(secondMenuItem), serverIdString, serverConfig, action)
}
}
// 看板菜单
func (this *ServerHelper) createBoardMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map {
menuItems := []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuDashboard),
"url": "/servers/server/board?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
return menuItems
}
// 日志菜单
func (this *ServerHelper) createLogMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map {
menuItems := []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuAccesslogRealtime),
"url": "/servers/server/log?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuAccesslogToday),
"url": "/servers/server/log/today?serverId=" + serverIdString,
"isActive": secondMenuItem == "today",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuAccesslogHistory),
"url": "/servers/server/log/history?serverId=" + serverIdString,
"isActive": secondMenuItem == "history",
})
return menuItems
}
// 统计菜单
func (this *ServerHelper) createStatMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map {
var menuItems = []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuStatTraffic),
"url": "/servers/server/stat?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuStatRegions),
"url": "/servers/server/stat/regions?serverId=" + serverIdString,
"isActive": secondMenuItem == "region",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuStatProviders),
"url": "/servers/server/stat/providers?serverId=" + serverIdString,
"isActive": secondMenuItem == "provider",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuStatClients),
"url": "/servers/server/stat/clients?serverId=" + serverIdString,
"isActive": secondMenuItem == "client",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuStatWAF),
"url": "/servers/server/stat/waf?serverId=" + serverIdString,
"isActive": secondMenuItem == "waf",
})
return menuItems
}
// 设置菜单
func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) (items []maps.Map) {
var menuItems = []maps.Map{
{
"name": this.Lang(actionPtr, codes.Server_MenuSettingBasic),
"url": "/servers/server/settings?serverId=" + serverIdString,
"isActive": secondMenuItem == "basic",
"isOff": !serverConfig.IsOn,
},
}
// HTTP
if serverConfig.IsHTTPFamily() {
// 1. 基本信息 (已在上面定义)
// 2. 域名
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingDomains),
"url": "/servers/server/settings/serverNames?serverId=" + serverIdString,
"isActive": secondMenuItem == "serverName",
"isOn": len(serverConfig.ServerNames) > 0,
})
// 3. DNS
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingDNS),
"url": "/servers/server/settings/dns?serverId=" + serverIdString,
"isActive": secondMenuItem == "dns",
})
// 4. HTTP
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingHTTP),
"url": "/servers/server/settings/http?serverId=" + serverIdString,
"isActive": secondMenuItem == "http",
"isOn": (serverConfig.HTTP != nil && serverConfig.HTTP.IsOn && len(serverConfig.HTTP.Listen) > 0) || (serverConfig.Web != nil && serverConfig.Web.RedirectToHttps != nil && serverConfig.Web.RedirectToHttps.IsOn),
"isOff": serverConfig.HTTP != nil && !serverConfig.HTTP.IsOn,
})
// 5. HTTPS
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingHTTPS),
"url": "/servers/server/settings/https?serverId=" + serverIdString,
"isActive": secondMenuItem == "https",
"isOn": serverConfig.HTTPS != nil && serverConfig.HTTPS.IsOn && len(serverConfig.HTTPS.Listen) > 0,
"isOff": serverConfig.HTTPS != nil && !serverConfig.HTTPS.IsOn,
})
// 6. Websocket
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingWebsocket),
"url": "/servers/server/settings/websocket?serverId=" + serverIdString,
"isActive": secondMenuItem == "websocket",
"isOn": serverConfig.Web != nil && serverConfig.Web.WebsocketRef != nil && serverConfig.Web.WebsocketRef.IsOn,
"configCode": serverconfigs.ConfigCodeWebsocket,
})
// 7. 源站
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingOrigins),
"url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString,
"isActive": secondMenuItem == "reverseProxy",
"isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn,
"configCode": serverconfigs.ConfigCodeReverseProxy,
})
// 8. 访问日志
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingAccessLog),
"url": "/servers/server/settings/accessLog?serverId=" + serverIdString,
"isActive": secondMenuItem == "accessLog",
"isOn": serverConfig.Web != nil && serverConfig.Web.AccessLogRef != nil && serverConfig.Web.AccessLogRef.IsOn,
"configCode": serverconfigs.ConfigCodeAccessLog,
})
// 9. 统计
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingStat),
"url": "/servers/server/settings/stat?serverId=" + serverIdString,
"isActive": secondMenuItem == "stat",
"isOn": serverConfig.Web != nil && serverConfig.Web.StatRef != nil && serverConfig.Web.StatRef.IsOn,
"configCode": serverconfigs.ConfigCodeStat,
})
// 分隔线
menuItems = append(menuItems, maps.Map{
"name": "-",
"url": "",
"isActive": false,
})
// 10. WAF
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingWAF),
"url": "/servers/server/settings/waf?serverId=" + serverIdString,
"isActive": secondMenuItem == "waf",
"isOn": serverConfig.Web != nil && serverConfig.Web.FirewallRef != nil && serverConfig.Web.FirewallRef.IsOn,
"configCode": serverconfigs.ConfigCodeWAF,
})
// 11. 5秒盾 (UAM) 和 12. CC防护 - 通过 filterMenuItems 添加
menuItems = this.filterMenuItems(serverConfig, menuItems, serverIdString, secondMenuItem, actionPtr)
// 13. 访问鉴权
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingAuth),
"url": "/servers/server/settings/access?serverId=" + serverIdString,
"isActive": secondMenuItem == "access",
"isOn": serverConfig.Web != nil && serverConfig.Web.Auth != nil && serverConfig.Web.Auth.IsOn,
"configCode": serverconfigs.ConfigCodeAuth,
})
// 14. 防盗链
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingReferers),
"url": "/servers/server/settings/referers?serverId=" + serverIdString,
"isActive": secondMenuItem == "referer",
"isOn": serverConfig.Web != nil && serverConfig.Web.Referers != nil && serverConfig.Web.Referers.IsOn,
"configCode": serverconfigs.ConfigCodeReferers,
})
// 15. UA名单
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingUserAgents),
"url": "/servers/server/settings/userAgent?serverId=" + serverIdString,
"isActive": secondMenuItem == "userAgent",
"isOn": serverConfig.Web != nil && serverConfig.Web.UserAgent != nil && serverConfig.Web.UserAgent.IsOn,
"configCode": serverconfigs.ConfigCodeUserAgent,
})
// 16. 请求限制
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingRequestLimit),
"url": "/servers/server/settings/requestLimit?serverId=" + serverIdString,
"isActive": secondMenuItem == "requestLimit",
"isOn": serverConfig.Web != nil && serverConfig.Web.RequestLimit != nil && serverConfig.Web.RequestLimit.IsOn,
"configCode": serverconfigs.ConfigCodeRequestLimit,
})
// 17. 流量限制 - 通过 filterMenuItems2 添加(在请求限制之后)
// 18. 网页动态加密(原网页优化)和 19. 音视频加密 - 通过 filterMenuItems3 添加
menuItems = this.filterMenuItems3(serverConfig, menuItems, serverIdString, secondMenuItem, actionPtr)
// 分隔线
menuItems = append(menuItems, maps.Map{
"name": "-",
"url": "",
"isActive": false,
})
// 20. URL调整
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingRedirects),
"url": "/servers/server/settings/redirects?serverId=" + serverIdString,
"isActive": secondMenuItem == "redirects",
"isOn": serverConfig.Web != nil && len(serverConfig.Web.HostRedirects) > 0,
"configCode": serverconfigs.ConfigCodeHostRedirects,
})
// 21. 路由规则
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingLocations),
"url": "/servers/server/settings/locations?serverId=" + serverIdString,
"isActive": secondMenuItem == "locations",
"isOn": serverConfig.Web != nil && len(serverConfig.Web.Locations) > 0,
})
// 22. 重写规则
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingRewriteRules),
"url": "/servers/server/settings/rewrite?serverId=" + serverIdString,
"isActive": secondMenuItem == "rewrite",
"isOn": serverConfig.Web != nil && len(serverConfig.Web.RewriteRefs) > 0,
})
// 23. 缓存
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingCache),
"url": "/servers/server/settings/cache?serverId=" + serverIdString,
"isActive": secondMenuItem == "cache",
"isOn": serverConfig.Web != nil && serverConfig.Web.Cache != nil && serverConfig.Web.Cache.IsOn,
"configCode": serverconfigs.ConfigCodeCache,
})
// 24. 内容压缩
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingCompression),
"url": "/servers/server/settings/compression?serverId=" + serverIdString,
"isActive": secondMenuItem == "compression",
"isOn": serverConfig.Web != nil && serverConfig.Web.Compression != nil && serverConfig.Web.Compression.IsOn,
"configCode": serverconfigs.ConfigCodeCompression,
})
// 25. WebP
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingWebP),
"url": "/servers/server/settings/webp?serverId=" + serverIdString,
"isActive": secondMenuItem == "webp",
"isOn": serverConfig.Web != nil && serverConfig.Web.WebP != nil && serverConfig.Web.WebP.IsOn,
"configCode": serverconfigs.ConfigCodeWebp,
})
// 26. 自定义页面
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingPages),
"url": "/servers/server/settings/pages?serverId=" + serverIdString,
"isActive": secondMenuItem == "pages",
"isOn": serverConfig.Web != nil && (len(serverConfig.Web.Pages) > 0 || (serverConfig.Web.Shutdown != nil && serverConfig.Web.Shutdown.IsOn)),
"configCode": serverconfigs.ConfigCodePages,
})
// 27. HTTP报头
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingHTTPHeaders),
"url": "/servers/server/settings/headers?serverId=" + serverIdString,
"isActive": secondMenuItem == "header",
"isOn": this.hasHTTPHeaders(serverConfig.Web),
})
// 28. 字符编码
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingCharset),
"url": "/servers/server/settings/charset?serverId=" + serverIdString,
"isActive": secondMenuItem == "charset",
"isOn": serverConfig.Web != nil && serverConfig.Web.Charset != nil && serverConfig.Web.Charset.IsOn,
"configCode": serverconfigs.ConfigCodeCharset,
})
// 29. 静态分发
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingRoot),
"url": "/servers/server/settings/web?serverId=" + serverIdString,
"isActive": secondMenuItem == "web",
"isOn": serverConfig.Web != nil && serverConfig.Web.Root != nil && serverConfig.Web.Root.IsOn,
"configCode": serverconfigs.ConfigCodeRoot,
})
// 30. Fastcgi
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingFastcgi),
"url": "/servers/server/settings/fastcgi?serverId=" + serverIdString,
"isActive": secondMenuItem == "fastcgi",
"isOn": serverConfig.Web != nil && serverConfig.Web.FastcgiRef != nil && serverConfig.Web.FastcgiRef.IsOn,
})
// 31. 访问IP地址
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingClientIP),
"url": "/servers/server/settings/remoteAddr?serverId=" + serverIdString,
"isActive": secondMenuItem == "remoteAddr",
"isOn": serverConfig.Web != nil && serverConfig.Web.RemoteAddr != nil && serverConfig.Web.RemoteAddr.IsOn,
"configCode": serverconfigs.ConfigCodeRemoteAddr,
})
// 32. 边缘脚本 - 通过 filterMenuItems2 添加在访问IP地址之后
menuItems = this.filterMenuItems2(serverConfig, menuItems, serverIdString, secondMenuItem, actionPtr)
// 33. 其他设置
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingOthers),
"url": "/servers/server/settings/common?serverId=" + serverIdString,
"isActive": secondMenuItem == "common",
"isOn": serverConfig.Web != nil && serverConfig.Web.MergeSlashes,
})
} else if serverConfig.IsTCPFamily() {
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingDNS),
"url": "/servers/server/settings/dns?serverId=" + serverIdString,
"isActive": secondMenuItem == "dns",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingTCP),
"url": "/servers/server/settings/tcp?serverId=" + serverIdString,
"isActive": secondMenuItem == "tcp",
"isOn": serverConfig.TCP != nil && serverConfig.TCP.IsOn && len(serverConfig.TCP.Listen) > 0,
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingTLS),
"url": "/servers/server/settings/tls?serverId=" + serverIdString,
"isActive": secondMenuItem == "tls",
"isOn": serverConfig.TLS != nil && serverConfig.TLS.IsOn && len(serverConfig.TLS.Listen) > 0,
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingOrigins),
"url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString,
"isActive": secondMenuItem == "reverseProxy",
"isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn,
})
} else if serverConfig.IsUDPFamily() {
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingDNS),
"url": "/servers/server/settings/dns?serverId=" + serverIdString,
"isActive": secondMenuItem == "dns",
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingUDP),
"url": "/servers/server/settings/udp?serverId=" + serverIdString,
"isActive": secondMenuItem == "udp",
"isOn": serverConfig.UDP != nil && serverConfig.UDP.IsOn && len(serverConfig.UDP.Listen) > 0,
})
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingOrigins),
"url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString,
"isActive": secondMenuItem == "reverseProxy",
"isOn": serverConfig.ReverseProxyRef != nil && serverConfig.ReverseProxyRef.IsOn,
})
}
return menuItems
}
// 删除菜单
func (this *ServerHelper) createDeleteMenu(secondMenuItem string, serverIdString string, serverConfig *serverconfigs.ServerConfig, actionPtr actions.ActionWrapper) []maps.Map {
menuItems := []maps.Map{}
menuItems = append(menuItems, maps.Map{
"name": this.Lang(actionPtr, codes.Server_MenuSettingDelete),
"url": "/servers/server/delete?serverId=" + serverIdString,
"isActive": secondMenuItem == "index",
})
return menuItems
}
// 检查是否已设置Header
func (this *ServerHelper) hasHTTPHeaders(web *serverconfigs.HTTPWebConfig) bool {
if web == nil {
return false
}
if web.RequestHeaderPolicyRef != nil {
if web.RequestHeaderPolicyRef.IsOn && web.RequestHeaderPolicy != nil && !web.RequestHeaderPolicy.IsEmpty() {
return true
}
}
if web.ResponseHeaderPolicyRef != nil {
if web.ResponseHeaderPolicyRef.IsOn && web.ResponseHeaderPolicy != nil && !web.ResponseHeaderPolicy.IsEmpty() {
return true
}
}
return false
}

View File

@@ -0,0 +1,33 @@
package serverutils
import (
"errors"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"strconv"
)
// FindServer 查找服务信息
func FindServer(p *actionutils.ParentAction, serverId int64) (*pb.Server, *serverconfigs.ServerConfig, bool) {
serverResp, err := p.RPC().ServerRPC().FindEnabledServer(p.AdminContext(), &pb.FindEnabledServerRequest{
ServerId: serverId,
IgnoreSSLCerts: true,
})
if err != nil {
p.ErrorPage(err)
return nil, nil, false
}
var server = serverResp.Server
if server == nil {
p.ErrorPage(errors.New("not found server with id '" + strconv.FormatInt(serverId, 10) + "'"))
return nil, nil, false
}
config, err := serverconfigs.NewServerConfigFromJSON(server.Config)
if err != nil {
p.ErrorPage(err)
return nil, nil, false
}
return server, config, true
}