From 6b3c7ac34c232427634cb6aa4dd8376832bc53db Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sat, 4 Sep 2021 10:17:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=83=A8=E5=88=86=E4=B8=8D?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=9A=84=E6=96=87=E4=BB=B6/=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E6=80=A7=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/rpc_client.go | 4 + .../default/clusters/cluster/boards/index.go | 188 ---------------- .../clusters/cluster/node/boards/data.go | 41 ---- .../clusters/cluster/node/boards/index.go | 211 ------------------ .../default/clusters/ip-addrs/addr/delete.go | 26 --- .../default/clusters/ip-addrs/addr/index.go | 66 ------ .../default/clusters/ip-addrs/addr/logs.go | 75 ------- .../default/clusters/ip-addrs/addr/update.go | 92 -------- .../default/clusters/ip-addrs/index.go | 94 -------- .../actions/default/clusters/ip-addrs/init.go | 28 --- .../actions/default/clusters/ip-addrs/logs.go | 78 ------- internal/web/actions/default/ns/index.go | 127 ----------- internal/web/actions/default/ns/init.go | 52 ----- internal/web/helpers/user_must_auth.go | 2 +- web/views/@default/@layout.css | 3 + web/views/@default/@layout.css.map | 2 +- web/views/@default/@layout.html | 2 +- web/views/@default/@left_menu.less | 4 + .../@default/clusters/monitors/@menu.html | 5 + .../@default/clusters/monitors/index.html | 2 + .../@default/clusters/monitors/logs.html | 2 + .../monitors/reporters/@reporter_menu.html | 0 .../monitors/reporters/createPopup.html | 41 ++++ .../clusters/monitors/reporters/index.html | 6 + .../clusters/monitors/reporters/index.js | 9 + 25 files changed, 79 insertions(+), 1081 deletions(-) delete mode 100644 internal/web/actions/default/clusters/cluster/boards/index.go delete mode 100644 internal/web/actions/default/clusters/cluster/node/boards/data.go delete mode 100644 internal/web/actions/default/clusters/cluster/node/boards/index.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/addr/delete.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/addr/index.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/addr/logs.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/addr/update.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/index.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/init.go delete mode 100644 internal/web/actions/default/clusters/ip-addrs/logs.go delete mode 100644 internal/web/actions/default/ns/index.go delete mode 100644 internal/web/actions/default/ns/init.go create mode 100644 web/views/@default/clusters/monitors/@menu.html create mode 100644 web/views/@default/clusters/monitors/index.html create mode 100644 web/views/@default/clusters/monitors/logs.html create mode 100644 web/views/@default/clusters/monitors/reporters/@reporter_menu.html create mode 100644 web/views/@default/clusters/monitors/reporters/createPopup.html create mode 100644 web/views/@default/clusters/monitors/reporters/index.html create mode 100644 web/views/@default/clusters/monitors/reporters/index.js diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 9b8a6e21..1f5cf002 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -300,6 +300,10 @@ func (this *RPCClient) IPListRPC() pb.IPListServiceClient { return pb.NewIPListServiceClient(this.pickConn()) } +func (this *RPCClient) ReporterRPC() pb.ReporterServiceClient { + return pb.NewReporterServiceClient(this.pickConn()) +} + func (this *RPCClient) IPItemRPC() pb.IPItemServiceClient { return pb.NewIPItemServiceClient(this.pickConn()) } diff --git a/internal/web/actions/default/clusters/cluster/boards/index.go b/internal/web/actions/default/clusters/cluster/boards/index.go deleted file mode 100644 index 5758c6f0..00000000 --- a/internal/web/actions/default/clusters/cluster/boards/index.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package boards - -import ( - teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" - "github.com/iwind/TeaGo/maps" - "github.com/iwind/TeaGo/types" - timeutil "github.com/iwind/TeaGo/utils/time" -) - -type IndexAction struct { - actionutils.ParentAction -} - -func (this *IndexAction) Init() { - this.Nav("", "board", "") -} - -func (this *IndexAction) RunGet(params struct { - ClusterId int64 -}) { - this.Data["clusterId"] = params.ClusterId - - this.Show() -} - -func (this *IndexAction) RunPost(params struct { - ClusterId int64 -}) { - if !teaconst.IsPlus { - this.Fail("only for commercial users") - } - - resp, err := this.RPC().ServerStatBoardRPC().ComposeServerStatNodeClusterBoard(this.AdminContext(), &pb.ComposeServerStatNodeClusterBoardRequest{NodeClusterId: params.ClusterId}) - if err != nil { - this.ErrorPage(err) - return - } - this.Data["board"] = maps.Map{ - "countUsers": resp.CountUsers, - "countActiveNodes": resp.CountActiveNodes, - "countInactiveNodes": resp.CountInactiveNodes, - "countServers": resp.CountServers, - } - - // 24小时流量趋势 - { - var statMaps = []maps.Map{} - for _, stat := range resp.HourlyTrafficStats { - statMaps = append(statMaps, maps.Map{ - "bytes": stat.Bytes, - "cachedBytes": stat.CachedBytes, - "countRequests": stat.CountRequests, - "countCachedRequests": stat.CountCachedRequests, - "countAttackRequests": stat.CountAttackRequests, - "attackBytes": stat.AttackBytes, - "day": stat.Hour[4:6] + "月" + stat.Hour[6:8] + "日", - "hour": stat.Hour[8:], - }) - } - this.Data["hourlyStats"] = statMaps - } - - // 15天流量趋势 - { - var statMaps = []maps.Map{} - for _, stat := range resp.DailyTrafficStats { - statMaps = append(statMaps, maps.Map{ - "bytes": stat.Bytes, - "cachedBytes": stat.CachedBytes, - "countRequests": stat.CountRequests, - "countCachedRequests": stat.CountCachedRequests, - "countAttackRequests": stat.CountAttackRequests, - "attackBytes": stat.AttackBytes, - "day": stat.Day[4:6] + "月" + stat.Day[6:] + "日", - }) - } - this.Data["dailyStats"] = statMaps - } - - // 节点排行 - { - var statMaps = []maps.Map{} - for _, stat := range resp.TopNodeStats { - statMaps = append(statMaps, maps.Map{ - "nodeId": stat.NodeId, - "nodeName": stat.NodeName, - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["topNodeStats"] = statMaps - } - - // 域名排行 - { - var statMaps = []maps.Map{} - for _, stat := range resp.TopDomainStats { - statMaps = append(statMaps, maps.Map{ - "serverId": stat.ServerId, - "domain": stat.Domain, - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["topDomainStats"] = statMaps - } - - // CPU - { - var statMaps = []maps.Map{} - for _, stat := range resp.CpuNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["cpuValues"] = statMaps - } - - // Memory - { - var statMaps = []maps.Map{} - for _, stat := range resp.MemoryNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["memoryValues"] = statMaps - } - - // Load - { - var statMaps = []maps.Map{} - for _, stat := range resp.LoadNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["loadValues"] = statMaps - } - - // 指标 - { - var chartMaps = []maps.Map{} - for _, chart := range resp.MetricDataCharts { - var statMaps = []maps.Map{} - for _, stat := range chart.MetricStats { - statMaps = append(statMaps, maps.Map{ - "keys": stat.Keys, - "time": stat.Time, - "value": stat.Value, - "count": stat.SumCount, - "total": stat.SumTotal, - }) - } - chartMaps = append(chartMaps, maps.Map{ - "chart": maps.Map{ - "id": chart.MetricChart.Id, - "name": chart.MetricChart.Name, - "widthDiv": chart.MetricChart.WidthDiv, - "isOn": chart.MetricChart.IsOn, - "maxItems": chart.MetricChart.MaxItems, - "type": chart.MetricChart.Type, - }, - "item": maps.Map{ - "id": chart.MetricChart.MetricItem.Id, - "name": chart.MetricChart.MetricItem.Name, - "period": chart.MetricChart.MetricItem.Period, - "periodUnit": chart.MetricChart.MetricItem.PeriodUnit, - "valueType": serverconfigs.FindMetricValueType(chart.MetricChart.MetricItem.Category, chart.MetricChart.MetricItem.Value), - "valueTypeName": serverconfigs.FindMetricValueName(chart.MetricChart.MetricItem.Category, chart.MetricChart.MetricItem.Value), - "keys": chart.MetricChart.MetricItem.Keys, - }, - "stats": statMaps, - }) - } - this.Data["metricCharts"] = chartMaps - } - - this.Success() -} diff --git a/internal/web/actions/default/clusters/cluster/node/boards/data.go b/internal/web/actions/default/clusters/cluster/node/boards/data.go deleted file mode 100644 index 154bb0d3..00000000 --- a/internal/web/actions/default/clusters/cluster/node/boards/data.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package boards - -import ( - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/iwind/TeaGo/maps" -) - -type DataAction struct { - actionutils.ParentAction -} - -func (this *DataAction) RunPost(params struct { - ClusterId int64 - NodeId int64 -}) { - resp, err := this.RPC().ServerStatBoardRPC().ComposeServerStatNodeBoard(this.AdminContext(), &pb.ComposeServerStatNodeBoardRequest{NodeId: params.NodeId}) - if err != nil { - this.ErrorPage(err) - return - } - - this.Data["board"] = maps.Map{ - "isActive": resp.IsActive, - "trafficInBytes": resp.TrafficInBytes, - "trafficOutBytes": resp.TrafficOutBytes, - "countConnections": resp.CountConnections, - "countRequests": resp.CountRequests, - "countAttackRequests": resp.CountAttackRequests, - "cpuUsage": resp.CpuUsage, - "memoryUsage": resp.MemoryUsage, - "memoryTotalSize": resp.MemoryTotalSize, - "load": resp.Load, - "cacheDiskSize": resp.CacheDiskSize, - "cacheMemorySize": resp.CacheMemorySize, - } - - this.Success() -} diff --git a/internal/web/actions/default/clusters/cluster/node/boards/index.go b/internal/web/actions/default/clusters/cluster/node/boards/index.go deleted file mode 100644 index 617b00b3..00000000 --- a/internal/web/actions/default/clusters/cluster/node/boards/index.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package boards - -import ( - "encoding/json" - teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/node/nodeutils" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" - "github.com/iwind/TeaGo/maps" - "github.com/iwind/TeaGo/types" - timeutil "github.com/iwind/TeaGo/utils/time" - "strconv" -) - -type IndexAction struct { - actionutils.ParentAction -} - -func (this *IndexAction) Init() { - this.Nav("", "node", "board") - this.SecondMenu("nodes") -} - -func (this *IndexAction) RunGet(params struct { - ClusterId int64 - NodeId int64 -}) { - err := nodeutils.InitNodeInfo(this, params.NodeId) - if err != nil { - this.ErrorPage(err) - return - } - - if !teaconst.IsPlus { - this.RedirectURL("/clusters/cluster/node?clusterId=" + strconv.FormatInt(params.ClusterId, 10) + "&nodeId=" + strconv.FormatInt(params.NodeId, 10)) - return - } - - this.Show() -} - -func (this *IndexAction) RunPost(params struct { - ClusterId int64 - NodeId int64 -}) { - resp, err := this.RPC().ServerStatBoardRPC().ComposeServerStatNodeBoard(this.AdminContext(), &pb.ComposeServerStatNodeBoardRequest{NodeId: params.NodeId}) - if err != nil { - this.ErrorPage(err) - return - } - - this.Data["board"] = maps.Map{ - "isActive": resp.IsActive, - "trafficInBytes": resp.TrafficInBytes, - "trafficOutBytes": resp.TrafficOutBytes, - "countConnections": resp.CountConnections, - "countRequests": resp.CountRequests, - "countAttackRequests": resp.CountAttackRequests, - "cpuUsage": resp.CpuUsage, - "memoryUsage": resp.MemoryUsage, - "memoryTotalSize": resp.MemoryTotalSize, - "load": resp.Load, - "cacheDiskSize": resp.CacheDiskSize, - "cacheMemorySize": resp.CacheMemorySize, - } - - // 24小时流量趋势 - { - var statMaps = []maps.Map{} - for _, stat := range resp.HourlyTrafficStats { - statMaps = append(statMaps, maps.Map{ - "bytes": stat.Bytes, - "cachedBytes": stat.CachedBytes, - "countRequests": stat.CountRequests, - "countCachedRequests": stat.CountCachedRequests, - "countAttackRequests": stat.CountAttackRequests, - "attackBytes": stat.AttackBytes, - "day": stat.Hour[4:6] + "月" + stat.Hour[6:8] + "日", - "hour": stat.Hour[8:], - }) - } - this.Data["hourlyStats"] = statMaps - } - - // 15天流量趋势 - { - var statMaps = []maps.Map{} - for _, stat := range resp.DailyTrafficStats { - statMaps = append(statMaps, maps.Map{ - "bytes": stat.Bytes, - "cachedBytes": stat.CachedBytes, - "countRequests": stat.CountRequests, - "countCachedRequests": stat.CountCachedRequests, - "countAttackRequests": stat.CountAttackRequests, - "attackBytes": stat.AttackBytes, - "day": stat.Day[4:6] + "月" + stat.Day[6:] + "日", - }) - } - this.Data["dailyStats"] = statMaps - } - - // 域名排行 - { - var statMaps = []maps.Map{} - for _, stat := range resp.TopDomainStats { - statMaps = append(statMaps, maps.Map{ - "serverId": stat.ServerId, - "domain": stat.Domain, - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["topDomainStats"] = statMaps - } - - // CPU - { - var statMaps = []maps.Map{} - for _, stat := range resp.CpuNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["cpuValues"] = statMaps - } - - // Memory - { - var statMaps = []maps.Map{} - for _, stat := range resp.MemoryNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["memoryValues"] = statMaps - } - - // Load - { - var statMaps = []maps.Map{} - for _, stat := range resp.LoadNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["loadValues"] = statMaps - } - - // CacheDirs - { - var statMaps = []maps.Map{} - for _, stat := range resp.CacheDirsValues { - var m = maps.Map{} - err = json.Unmarshal(stat.ValueJSON, &m) - if err != nil { - continue - } - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": m, - }) - } - this.Data["cacheDirValues"] = statMaps - } - - // 指标 - { - var chartMaps = []maps.Map{} - for _, chart := range resp.MetricDataCharts { - var statMaps = []maps.Map{} - for _, stat := range chart.MetricStats { - statMaps = append(statMaps, maps.Map{ - "keys": stat.Keys, - "time": stat.Time, - "value": stat.Value, - "count": stat.SumCount, - "total": stat.SumTotal, - }) - } - chartMaps = append(chartMaps, maps.Map{ - "chart": maps.Map{ - "id": chart.MetricChart.Id, - "name": chart.MetricChart.Name, - "widthDiv": chart.MetricChart.WidthDiv, - "isOn": chart.MetricChart.IsOn, - "maxItems": chart.MetricChart.MaxItems, - "type": chart.MetricChart.Type, - }, - "item": maps.Map{ - "id": chart.MetricChart.MetricItem.Id, - "name": chart.MetricChart.MetricItem.Name, - "period": chart.MetricChart.MetricItem.Period, - "periodUnit": chart.MetricChart.MetricItem.PeriodUnit, - "valueType": serverconfigs.FindMetricValueType(chart.MetricChart.MetricItem.Category, chart.MetricChart.MetricItem.Value), - "valueTypeName": serverconfigs.FindMetricValueName(chart.MetricChart.MetricItem.Category, chart.MetricChart.MetricItem.Value), - "keys": chart.MetricChart.MetricItem.Keys, - }, - "stats": statMaps, - }) - } - this.Data["metricCharts"] = chartMaps - } - - this.Success() -} diff --git a/internal/web/actions/default/clusters/ip-addrs/addr/delete.go b/internal/web/actions/default/clusters/ip-addrs/addr/delete.go deleted file mode 100644 index bec1c3ce..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/addr/delete.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package addr - -import ( - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" -) - -type DeleteAction struct { - actionutils.ParentAction -} - -func (this *DeleteAction) RunPost(params struct { - AddrId int64 -}) { - defer this.CreateLogInfo("删除IP地址 %d", params.AddrId) - - _, err := this.RPC().NodeIPAddressRPC().DisableNodeIPAddress(this.AdminContext(), &pb.DisableNodeIPAddressRequest{NodeIPAddressId: params.AddrId}) - if err != nil { - this.ErrorPage(err) - return - } - - this.Success() -} diff --git a/internal/web/actions/default/clusters/ip-addrs/addr/index.go b/internal/web/actions/default/clusters/ip-addrs/addr/index.go deleted file mode 100644 index bbb6dd52..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/addr/index.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package addr - -import ( - "encoding/json" - "errors" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/ip-addrs/ipaddrutils" - "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/iwind/TeaGo/maps" -) - -type IndexAction struct { - actionutils.ParentAction -} - -func (this *IndexAction) Init() { - this.Nav("", "", "addr") -} - -func (this *IndexAction) RunGet(params struct { - AddrId int64 -}) { - addr, err := ipaddrutils.InitIPAddr(this.Parent(), params.AddrId) - if err != nil { - this.ErrorPage(err) - return - } - - var thresholds = []*nodeconfigs.NodeValueThresholdConfig{} - if len(addr.ThresholdsJSON) > 0 { - err = json.Unmarshal(addr.ThresholdsJSON, &thresholds) - if err != nil { - this.ErrorPage(err) - return - } - } - - nodeResp, err := this.RPC().NodeRPC().FindEnabledBasicNode(this.AdminContext(), &pb.FindEnabledBasicNodeRequest{NodeId: addr.NodeId}) - if err != nil { - this.ErrorPage(err) - return - } - var node = nodeResp.Node - if node == nil || node.NodeCluster == nil { - this.ErrorPage(errors.New("node or cluster is not available")) - return - } - - this.Data["addr"] = maps.Map{ - "id": addr.Id, - "name": addr.Name, - "description": addr.Description, - "ip": addr.Ip, - "canAccess": addr.CanAccess, - "isOn": addr.IsOn, - "isUp": addr.IsUp, - "thresholds": thresholds, - "node": maps.Map{"id": node.Id, "name": node.Name}, - "cluster": maps.Map{"id": node.NodeCluster.Id, "name": node.NodeCluster.Name}, - } - - this.Show() -} diff --git a/internal/web/actions/default/clusters/ip-addrs/addr/logs.go b/internal/web/actions/default/clusters/ip-addrs/addr/logs.go deleted file mode 100644 index 4648a253..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/addr/logs.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package addr - -import ( - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/ip-addrs/ipaddrutils" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/iwind/TeaGo/maps" - timeutil "github.com/iwind/TeaGo/utils/time" -) - -type LogsAction struct { - actionutils.ParentAction -} - -func (this *LogsAction) Init() { - this.Nav("", "", "log") -} - -func (this *LogsAction) RunGet(params struct { - AddrId int64 -}) { - _, err := ipaddrutils.InitIPAddr(this.Parent(), params.AddrId) - if err != nil { - this.ErrorPage(err) - return - } - - countResp, err := this.RPC().NodeIPAddressLogRPC().CountAllNodeIPAddressLogs(this.AdminContext(), &pb.CountAllNodeIPAddressLogsRequest{NodeIPAddressId: params.AddrId}) - if err != nil { - this.ErrorPage(err) - return - } - var page = this.NewPage(countResp.Count) - this.Data["page"] = page.AsHTML() - - logsResp, err := this.RPC().NodeIPAddressLogRPC().ListNodeIPAddressLogs(this.AdminContext(), &pb.ListNodeIPAddressLogsRequest{ - NodeIPAddressId: params.AddrId, - Offset: page.Offset, - Size: page.Size, - }) - if err != nil { - this.ErrorPage(err) - return - } - var logMaps = []maps.Map{} - for _, log := range logsResp.NodeIPAddressLogs { - var adminMap maps.Map - if log.Admin != nil { - adminMap = maps.Map{ - "id": log.Admin.Id, - "name": log.Admin.Fullname, - } - } else { - adminMap = maps.Map{ - "id": 0, - "name": "[系统]", - } - } - - logMaps = append(logMaps, maps.Map{ - "id": log.Id, - "description": log.Description, - "createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt), - "isUp": log.IsUp, - "isOn": log.IsOn, - "canAccess": log.CanAccess, - "admin": adminMap, - }) - } - this.Data["logs"] = logMaps - - this.Show() -} diff --git a/internal/web/actions/default/clusters/ip-addrs/addr/update.go b/internal/web/actions/default/clusters/ip-addrs/addr/update.go deleted file mode 100644 index a48f0a3c..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/addr/update.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package addr - -import ( - "encoding/json" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/ip-addrs/ipaddrutils" - "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/iwind/TeaGo/actions" - "github.com/iwind/TeaGo/maps" - "net" -) - -type UpdateAction struct { - actionutils.ParentAction -} - -func (this *UpdateAction) Init() { - this.Nav("", "", "update") -} - -func (this *UpdateAction) RunGet(params struct { - AddrId int64 -}) { - addr, err := ipaddrutils.InitIPAddr(this.Parent(), params.AddrId) - if err != nil { - this.ErrorPage(err) - return - } - - var thresholds = []*nodeconfigs.NodeValueThresholdConfig{} - if len(addr.ThresholdsJSON) > 0 { - err = json.Unmarshal(addr.ThresholdsJSON, &thresholds) - if err != nil { - this.ErrorPage(err) - return - } - } - - this.Data["supportThresholds"] = true - - this.Data["addr"] = maps.Map{ - "id": addr.Id, - "name": addr.Name, - "description": addr.Description, - "ip": addr.Ip, - "canAccess": addr.CanAccess, - "isOn": addr.IsOn, - "isUp": addr.IsUp, - "thresholds": thresholds, - } - - this.Show() -} - -func (this *UpdateAction) RunPost(params struct { - AddrId int64 - IP string `alias:"ip"` - Name string - CanAccess bool - IsOn bool - ThresholdsJSON []byte - - Must *actions.Must - CSRF *actionutils.CSRF -}) { - params.Must. - Field("ip", params.IP). - Require("请输入IP地址") - - ip := net.ParseIP(params.IP) - if len(ip) == 0 { - this.Fail("请输入正确的IP") - } - - _, err := this.RPC().NodeIPAddressRPC().UpdateNodeIPAddress(this.AdminContext(), &pb.UpdateNodeIPAddressRequest{ - NodeIPAddressId: params.AddrId, - Name: params.Name, - Ip: params.IP, - CanAccess: params.CanAccess, - IsOn: params.IsOn, - ThresholdsJSON: params.ThresholdsJSON, - }) - if err != nil { - this.ErrorPage(err) - return - } - - this.Success() -} diff --git a/internal/web/actions/default/clusters/ip-addrs/index.go b/internal/web/actions/default/clusters/ip-addrs/index.go deleted file mode 100644 index b37d45bf..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/index.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package ipaddrs - -import ( - "encoding/json" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/iwind/TeaGo/maps" -) - -type IndexAction struct { - actionutils.ParentAction -} - -func (this *IndexAction) Init() { - this.Nav("", "", "index") -} - -func (this *IndexAction) RunGet(params struct { - ClusterId int64 - UpState int8 - Keyword string -}) { - this.Data["clusterId"] = params.ClusterId - this.Data["upState"] = params.UpState - this.Data["keyword"] = params.Keyword - - countResp, err := this.RPC().NodeIPAddressRPC().CountAllEnabledIPAddresses(this.AdminContext(), &pb.CountAllEnabledIPAddressesRequest{ - NodeClusterId: params.ClusterId, - Role: nodeconfigs.NodeRoleNode, - UpState: int32(params.UpState), - Keyword: params.Keyword, - }) - if err != nil { - this.ErrorPage(err) - return - } - - var count = countResp.Count - var page = this.NewPage(count) - this.Data["page"] = page.AsHTML() - - addrsResp, err := this.RPC().NodeIPAddressRPC().ListEnabledIPAddresses(this.AdminContext(), &pb.ListEnabledIPAddressesRequest{ - NodeClusterId: params.ClusterId, - Role: nodeconfigs.NodeRoleNode, - UpState: int32(params.UpState), - Keyword: params.Keyword, - Offset: page.Offset, - Size: page.Size, - }) - if err != nil { - this.ErrorPage(err) - return - } - var addrMaps = []maps.Map{} - for _, addr := range addrsResp.NodeIPAddresses { - var thresholds = []*nodeconfigs.NodeValueThresholdConfig{} - if len(addr.ThresholdsJSON) > 0 { - err = json.Unmarshal(addr.ThresholdsJSON, &thresholds) - if err != nil { - this.ErrorPage(err) - return - } - } - - nodeResp, err := this.RPC().NodeRPC().FindEnabledBasicNode(this.AdminContext(), &pb.FindEnabledBasicNodeRequest{NodeId: addr.NodeId}) - if err != nil { - this.ErrorPage(err) - return - } - var node = nodeResp.Node - if node == nil || node.NodeCluster == nil { - continue - } - - addrMaps = append(addrMaps, maps.Map{ - "id": addr.Id, - "name": addr.Name, - "description": addr.Description, - "ip": addr.Ip, - "canAccess": addr.CanAccess, - "isOn": addr.IsOn, - "isUp": addr.IsUp, - "hasThresholds": len(thresholds) > 0, - "node": maps.Map{"id": node.Id, "name": node.Name}, - "cluster": maps.Map{"id": node.NodeCluster.Id, "name": node.NodeCluster.Name}, - }) - } - this.Data["addrs"] = addrMaps - - this.Show() -} diff --git a/internal/web/actions/default/clusters/ip-addrs/init.go b/internal/web/actions/default/clusters/ip-addrs/init.go deleted file mode 100644 index 8fa6a5e8..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/init.go +++ /dev/null @@ -1,28 +0,0 @@ -package ipaddrs - -import ( - "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/clusterutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/ip-addrs/addr" - "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" - "github.com/iwind/TeaGo" -) - -func init() { - TeaGo.BeforeStart(func(server *TeaGo.Server) { - server. - Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeNode)). - Helper(clusterutils.NewClustersHelper()). - Data("teaSubMenu", "ipAddr"). - Prefix("/clusters/ip-addrs"). - Get("", new(IndexAction)). - Get("/logs", new(LogsAction)). - - // 单个地址操作 - Post("/addr/delete", new(addr.DeleteAction)). - Get("/addr", new(addr.IndexAction)). - GetPost("/addr/update", new(addr.UpdateAction)). - Get("/addr/logs", new(addr.LogsAction)). - EndAll() - }) -} diff --git a/internal/web/actions/default/clusters/ip-addrs/logs.go b/internal/web/actions/default/clusters/ip-addrs/logs.go deleted file mode 100644 index 42086e1e..00000000 --- a/internal/web/actions/default/clusters/ip-addrs/logs.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package ipaddrs - -import ( - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" - "github.com/iwind/TeaGo/maps" - timeutil "github.com/iwind/TeaGo/utils/time" -) - -type LogsAction struct { - actionutils.ParentAction -} - -func (this *LogsAction) Init() { - this.Nav("", "", "log") -} - -func (this *LogsAction) RunGet(params struct { -}) { - countResp, err := this.RPC().NodeIPAddressLogRPC().CountAllNodeIPAddressLogs(this.AdminContext(), &pb.CountAllNodeIPAddressLogsRequest{}) - if err != nil { - this.ErrorPage(err) - return - } - var page = this.NewPage(countResp.Count) - this.Data["page"] = page.AsHTML() - - logsResp, err := this.RPC().NodeIPAddressLogRPC().ListNodeIPAddressLogs(this.AdminContext(), &pb.ListNodeIPAddressLogsRequest{ - Offset: page.Offset, - Size: page.Size, - }) - if err != nil { - this.ErrorPage(err) - return - } - var logMaps = []maps.Map{} - for _, log := range logsResp.NodeIPAddressLogs { - var adminMap maps.Map - if log.Admin != nil { - adminMap = maps.Map{ - "id": log.Admin.Id, - "name": log.Admin.Fullname, - } - } else { - adminMap = maps.Map{ - "id": 0, - "name": "[系统]", - } - } - - var addrMap maps.Map - if log.NodeIPAddress != nil { - var addr = log.NodeIPAddress - if addr != nil { - addrMap = maps.Map{ - "id": addr.Id, - "ip": addr.Ip, - } - } - } - - logMaps = append(logMaps, maps.Map{ - "id": log.Id, - "description": log.Description, - "createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt), - "isUp": log.IsUp, - "isOn": log.IsOn, - "canAccess": log.CanAccess, - "admin": adminMap, - "addr": addrMap, - }) - } - this.Data["logs"] = logMaps - - this.Show() -} diff --git a/internal/web/actions/default/ns/index.go b/internal/web/actions/default/ns/index.go deleted file mode 100644 index 35f25ee3..00000000 --- a/internal/web/actions/default/ns/index.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. - -package ns - -import ( - "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" - timeutil "github.com/iwind/TeaGo/utils/time" -) - -type IndexAction struct { - actionutils.ParentAction -} - -func (this *IndexAction) Init() { - this.Nav("", "", "dns") -} - -func (this *IndexAction) RunGet(params struct{}) { - resp, err := this.RPC().NSRPC().ComposeNSBoard(this.AdminContext(), &pb.ComposeNSBoardRequest{}) - if err != nil { - this.ErrorPage(err) - return - } - this.Data["board"] = maps.Map{ - "countDomains": resp.CountNSDomains, - "countRecords": resp.CountNSRecords, - "countClusters": resp.CountNSClusters, - "countNodes": resp.CountNSNodes, - "countOfflineNodes": resp.CountOfflineNSNodes, - } - - // 流量排行 - { - var statMaps = []maps.Map{} - for _, stat := range resp.HourlyTrafficStats { - statMaps = append(statMaps, maps.Map{ - "day": stat.Hour[4:6] + "月" + stat.Hour[6:8] + "日", - "hour": stat.Hour[8:], - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["hourlyStats"] = statMaps - } - - { - var statMaps = []maps.Map{} - for _, stat := range resp.DailyTrafficStats { - statMaps = append(statMaps, maps.Map{ - "day": stat.Day[4:6] + "月" + stat.Day[6:] + "日", - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["dailyStats"] = statMaps - } - - // 域名排行 - { - var statMaps = []maps.Map{} - for _, stat := range resp.TopNSDomainStats { - statMaps = append(statMaps, maps.Map{ - "domainId": stat.NsDomainId, - "domainName": stat.NsDomainName, - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["topDomainStats"] = statMaps - } - - // 节点排行 - { - var statMaps = []maps.Map{} - for _, stat := range resp.TopNSNodeStats { - statMaps = append(statMaps, maps.Map{ - "clusterId": stat.NsClusterId, - "nodeId": stat.NsNodeId, - "nodeName": stat.NsNodeName, - "countRequests": stat.CountRequests, - "bytes": stat.Bytes, - }) - } - this.Data["topNodeStats"] = statMaps - } - - // CPU - { - var statMaps = []maps.Map{} - for _, stat := range resp.CpuNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["cpuValues"] = statMaps - } - - // Memory - { - var statMaps = []maps.Map{} - for _, stat := range resp.MemoryNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["memoryValues"] = statMaps - } - - // Load - { - var statMaps = []maps.Map{} - for _, stat := range resp.LoadNodeValues { - statMaps = append(statMaps, maps.Map{ - "time": timeutil.FormatTime("H:i", stat.CreatedAt), - "value": types.Float32(string(stat.ValueJSON)), - }) - } - this.Data["loadValues"] = statMaps - } - - this.Show() -} diff --git a/internal/web/actions/default/ns/init.go b/internal/web/actions/default/ns/init.go deleted file mode 100644 index 07d7b8b6..00000000 --- a/internal/web/actions/default/ns/init.go +++ /dev/null @@ -1,52 +0,0 @@ -package ns - -import ( - "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/domains" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/domains/keys" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/domains/records" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/settings" - "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" - "github.com/iwind/TeaGo" -) - -func init() { - TeaGo.BeforeStart(func(server *TeaGo.Server) { - server. - Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeNS)). - Data("teaMenu", "ns"). - Prefix("/ns"). - Get("", new(IndexAction)). - - // 域名相关 - Prefix("/ns/domains"). - Data("teaSubMenu", "domain"). - Get("", new(domains.IndexAction)). - GetPost("/create", new(domains.CreateAction)). - Post("/delete", new(domains.DeleteAction)). - Get("/domain", new(domains.DomainAction)). - GetPost("/update", new(domains.UpdateAction)). - GetPost("/tsig", new(domains.TsigAction)). - - // 域名密钥 - Prefix("/ns/domains/keys"). - Data("teaSubMenu", "domain"). - Get("", new(keys.IndexAction)). - GetPost("/createPopup", new(keys.CreatePopupAction)). - GetPost("/updatePopup", new(keys.UpdatePopupAction)). - Post("/delete", new(keys.DeleteAction)). - Post("/generateSecret", new(keys.GenerateSecretAction)). - - // 记录相关 - Prefix("/ns/domains/records"). - Get("", new(records.IndexAction)). - GetPost("/createPopup", new(records.CreatePopupAction)). - GetPost("/updatePopup", new(records.UpdatePopupAction)). - Post("/delete", new(records.DeleteAction)). - - // 设置 - Prefix("/ns/settings"). - Get("", new(settings.IndexAction)). - EndAll() - }) -} diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index ba55659a..9db6bad3 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -247,7 +247,7 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map { "isOn": teaconst.IsPlus, }, /**{ - "name": "监控", + "name": "区域监控", "url": "/clusters/monitors", "code": "monitor", "isOn": teaconst.IsPlus, diff --git a/web/views/@default/@layout.css b/web/views/@default/@layout.css index 52e0a869..7bda7ce5 100644 --- a/web/views/@default/@layout.css +++ b/web/views/@default/@layout.css @@ -67,6 +67,9 @@ padding-bottom: 2em; overflow-y: auto; } +body.expanded .right-box { + left: 10em; +} .right-box.tiny { top: 10.4em; left: 26.5em; diff --git a/web/views/@default/@layout.css.map b/web/views/@default/@layout.css.map index c3f5bcb0..fface964 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.html b/web/views/@default/@layout.html index 80282012..1c5c8981 100644 --- a/web/views/@default/@layout.html +++ b/web/views/@default/@layout.html @@ -110,7 +110,7 @@