mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	删除部分不需要的文件/阶段性提交
This commit is contained in:
		@@ -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())
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -110,7 +110,7 @@
 | 
			
		||||
 | 
			
		||||
	<!-- 底部 -->
 | 
			
		||||
	<div id="footer" class="ui menu inverted light-blue borderless small" v-if="teaShowOpenSourceInfo">
 | 
			
		||||
		<a  href="/settings/upgrade" class="item" title="点击进入检查版本更新页面">{{teaName}} v{{teaVersion}}</a>
 | 
			
		||||
		<a  href="/settings/upgrade" class="item" title="点击进入检查版本更新页面">{{teaName}} <span v-if="teaIsPlus"> Plus </span> v{{teaVersion}}</a>
 | 
			
		||||
		<a href="https://github.com/TeaOSLab/EdgeAdmin" target="_blank" class="item">GitHub</a>
 | 
			
		||||
		<!--<a href="http://teaos.cn" target="_blank" class="item">官网</a>
 | 
			
		||||
		<a href="http://teaos.cn/doc" target="_blank" class="item">文档</a>-->
 | 
			
		||||
 
 | 
			
		||||
@@ -90,6 +90,10 @@
 | 
			
		||||
	overflow-y: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.expanded .right-box {
 | 
			
		||||
	left: 10em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.right-box.tiny {
 | 
			
		||||
	top: 10.4em;
 | 
			
		||||
	left: 26.5em;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								web/views/@default/clusters/monitors/@menu.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								web/views/@default/clusters/monitors/@menu.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
<first-menu>
 | 
			
		||||
    <menu-item href="/clusters/monitors" code="index">任务</menu-item>
 | 
			
		||||
    <menu-item href="/clusters/monitors/logs" code="log">日志</menu-item>
 | 
			
		||||
    <menu-item href="/clusters/monitors/reporters" code="reporter">终端</menu-item>
 | 
			
		||||
</first-menu>
 | 
			
		||||
							
								
								
									
										2
									
								
								web/views/@default/clusters/monitors/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								web/views/@default/clusters/monitors/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "menu"}
 | 
			
		||||
							
								
								
									
										2
									
								
								web/views/@default/clusters/monitors/logs.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								web/views/@default/clusters/monitors/logs.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "menu"}
 | 
			
		||||
@@ -0,0 +1,41 @@
 | 
			
		||||
{$layout "layout_popup"}
 | 
			
		||||
 | 
			
		||||
<h3>添加终端</h3>
 | 
			
		||||
<form class="ui form" data-tea-success="success" data-tea-action="$">
 | 
			
		||||
    <csrf-token></csrf-token>
 | 
			
		||||
    <table class="ui table definition selectable">
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td class="title">名称 *</td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <input type="text" name="name" maxlength="50" ref="focus"/>
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td colspan="2"><more-options-indicator></more-options-indicator></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tbody v-show="moreOptionsVisible">
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td>地域</td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <input type="text" name="location" maxlength="50"/>
 | 
			
		||||
                    <p class="comment">终端所在地域。</p>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td>网络提供商</td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <input type="text" name="isp" maxlength="50"/>
 | 
			
		||||
                    <p class="comment">终端所属网络供应商。</p>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td>允许的终端IP</td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <values-box name="allowIPs"></values-box>
 | 
			
		||||
                    <p class="comment">如果不为空,则只有这些IP才能连接API。支持单个IP、CIDR格式的IP段和IP1-IP2这样的IP段。</p>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
        </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
    <submit-btn></submit-btn>
 | 
			
		||||
</form>
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
{$layout}
 | 
			
		||||
{$template "../menu"}
 | 
			
		||||
 | 
			
		||||
<second-menu>
 | 
			
		||||
    <menu-item @click.prevent="createReporter">[添加终端]</menu-item>
 | 
			
		||||
</second-menu>
 | 
			
		||||
							
								
								
									
										9
									
								
								web/views/@default/clusters/monitors/reporters/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								web/views/@default/clusters/monitors/reporters/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.createReporter = function () {
 | 
			
		||||
		teaweb.popup(".createPopup", function () {
 | 
			
		||||
			teaweb.success("保存成功", function () {
 | 
			
		||||
				teaweb.reload()
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user