mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-03 12:20:28 +08:00
优化域名服务相关功能
This commit is contained in:
1
go.sum
1
go.sum
@@ -9,6 +9,7 @@ github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU
|
|||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
|||||||
@@ -1,26 +1,38 @@
|
|||||||
package domainutils
|
package domainutils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/lists"
|
"github.com/iwind/TeaGo/lists"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"net"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 校验域名格式
|
// ValidateDomainFormat 校验域名格式
|
||||||
func ValidateDomainFormat(domain string) bool {
|
func ValidateDomainFormat(domain string) bool {
|
||||||
pieces := strings.Split(domain, ".")
|
pieces := strings.Split(domain, ".")
|
||||||
for _, piece := range pieces {
|
for _, piece := range pieces {
|
||||||
if !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) {
|
if piece == "-" ||
|
||||||
|
strings.HasPrefix(piece, "-") ||
|
||||||
|
strings.HasSuffix(piece, "-") ||
|
||||||
|
strings.Contains(piece, "--") ||
|
||||||
|
len(piece) > 63 ||
|
||||||
|
!regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 最后一段不能是全数字
|
||||||
|
if regexp.MustCompile(`^(\d+)$`).MatchString(pieces[len(pieces)-1]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转换线路列表
|
// ConvertRoutesToMaps 转换线路列表
|
||||||
func ConvertRoutesToMaps(routes []*pb.DNSRoute) []maps.Map {
|
func ConvertRoutesToMaps(routes []*pb.DNSRoute) []maps.Map {
|
||||||
result := []maps.Map{}
|
result := []maps.Map{}
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
@@ -32,7 +44,7 @@ func ConvertRoutesToMaps(routes []*pb.DNSRoute) []maps.Map {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// 筛选线路
|
// FilterRoutes 筛选线路
|
||||||
func FilterRoutes(routes []*pb.DNSRoute, allRoutes []*pb.DNSRoute) []*pb.DNSRoute {
|
func FilterRoutes(routes []*pb.DNSRoute, allRoutes []*pb.DNSRoute) []*pb.DNSRoute {
|
||||||
routeCodes := []string{}
|
routeCodes := []string{}
|
||||||
for _, route := range allRoutes {
|
for _, route := range allRoutes {
|
||||||
@@ -46,3 +58,84 @@ func FilterRoutes(routes []*pb.DNSRoute, allRoutes []*pb.DNSRoute) []*pb.DNSRout
|
|||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ValidateRecordName 校验记录名
|
||||||
|
func ValidateRecordName(name string) bool {
|
||||||
|
if name == "*" || name == "@" || len(name) == 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
pieces := strings.Split(name, ".")
|
||||||
|
for _, piece := range pieces {
|
||||||
|
if piece == "-" ||
|
||||||
|
strings.HasPrefix(piece, "-") ||
|
||||||
|
strings.HasSuffix(piece, "-") ||
|
||||||
|
strings.Contains(piece, "--") ||
|
||||||
|
len(piece) > 63 ||
|
||||||
|
!regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateRecordValue 校验记录值
|
||||||
|
func ValidateRecordValue(recordType dnsconfigs.RecordType, value string) (message string, ok bool) {
|
||||||
|
switch recordType {
|
||||||
|
case dnsconfigs.RecordTypeA:
|
||||||
|
if !regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`).MatchString(value) {
|
||||||
|
message = "请输入正确格式的IP"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if net.ParseIP(value) == nil {
|
||||||
|
message = "请输入正确格式的IP"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case dnsconfigs.RecordTypeCNAME:
|
||||||
|
if strings.HasSuffix(value, ".") {
|
||||||
|
value = value[:len(value)-1]
|
||||||
|
}
|
||||||
|
if !strings.Contains(value, ".") || !ValidateDomainFormat(value) {
|
||||||
|
message = "请输入正确的域名"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case dnsconfigs.RecordTypeAAAA:
|
||||||
|
if !strings.Contains(value, ":") {
|
||||||
|
message = "请输入正确格式的IPv6地址"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if net.ParseIP(value) == nil {
|
||||||
|
message = "请输入正确格式的IPv6地址"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case dnsconfigs.RecordTypeNS:
|
||||||
|
if strings.HasSuffix(value, ".") {
|
||||||
|
value = value[:len(value)-1]
|
||||||
|
}
|
||||||
|
if !strings.Contains(value, ".") || !ValidateDomainFormat(value) {
|
||||||
|
message = "请输入正确的DNS服务器域名"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case dnsconfigs.RecordTypeMX:
|
||||||
|
if strings.HasSuffix(value, ".") {
|
||||||
|
value = value[:len(value)-1]
|
||||||
|
}
|
||||||
|
if !strings.Contains(value, ".") || !ValidateDomainFormat(value) {
|
||||||
|
message = "请输入正确的邮件服务器域名"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case dnsconfigs.RecordTypeTXT:
|
||||||
|
if len(value) > 512 {
|
||||||
|
message = "文本长度不能超出512字节"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(value) > 512 {
|
||||||
|
message = "记录值长度不能超出512字节"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ok = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package domainutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
||||||
|
"github.com/iwind/TeaGo/assert"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestValidateRecordValue(t *testing.T) {
|
||||||
|
a := assert.NewAssertion(t)
|
||||||
|
|
||||||
|
// A
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeA, "1.2")
|
||||||
|
a.IsFalse(ok)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeA, "1.2.3.400")
|
||||||
|
a.IsFalse(ok)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeA, "1.2.3.4")
|
||||||
|
a.IsTrue(ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CNAME
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeCNAME, "example.com")
|
||||||
|
a.IsTrue(ok)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeCNAME, "example.com.")
|
||||||
|
a.IsTrue(ok)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeCNAME, "hello, world")
|
||||||
|
a.IsFalse(ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AAAA
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeAAAA, "1.2.3.4")
|
||||||
|
a.IsFalse(ok)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeAAAA, "2001:0db8:85a3:0000:0000:8a2e:0370:7334")
|
||||||
|
a.IsTrue(ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NS
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeNS, "1.2.3.4")
|
||||||
|
a.IsFalse(ok)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
_, ok := ValidateRecordValue(dnsconfigs.RecordTypeNS, "example.com")
|
||||||
|
a.IsTrue(ok)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateAction struct {
|
type CreateAction struct {
|
||||||
@@ -34,6 +35,8 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
this.CreateLogInfo("创建域名 %d", domainId)
|
this.CreateLogInfo("创建域名 %d", domainId)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
params.Name = strings.ToLower(params.Name)
|
||||||
|
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("name", params.Name).
|
Field("name", params.Name).
|
||||||
Require("请输入域名").
|
Require("请输入域名").
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package records
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
@@ -63,6 +64,17 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
this.CreateLogInfo("创建域名记录 %d", recordId)
|
this.CreateLogInfo("创建域名记录 %d", recordId)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// 校验记录名
|
||||||
|
if !domainutils.ValidateRecordName(params.Name) {
|
||||||
|
this.FailField("name", "请输入正确的记录名")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验记录值
|
||||||
|
message, ok := domainutils.ValidateRecordValue(params.Type, params.Value)
|
||||||
|
if !ok {
|
||||||
|
this.FailField("value", "记录值错误:"+message)
|
||||||
|
}
|
||||||
|
|
||||||
createResp, err := this.RPC().NSRecordRPC().CreateNSRecord(this.AdminContext(), &pb.CreateNSRecordRequest{
|
createResp, err := this.RPC().NSRecordRPC().CreateNSRecord(this.AdminContext(), &pb.CreateNSRecordRequest{
|
||||||
NsDomainId: params.DomainId,
|
NsDomainId: params.DomainId,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package records
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
@@ -87,6 +88,17 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
}) {
|
}) {
|
||||||
this.CreateLogInfo("修改域名记录 %d", params.RecordId)
|
this.CreateLogInfo("修改域名记录 %d", params.RecordId)
|
||||||
|
|
||||||
|
// 校验记录名
|
||||||
|
if !domainutils.ValidateRecordName(params.Name) {
|
||||||
|
this.FailField("name", "请输入正确的记录名")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验记录值
|
||||||
|
message, ok := domainutils.ValidateRecordValue(params.Type, params.Value)
|
||||||
|
if !ok {
|
||||||
|
this.FailField("value", "记录值错误:"+message)
|
||||||
|
}
|
||||||
|
|
||||||
_, err := this.RPC().NSRecordRPC().UpdateNSRecord(this.AdminContext(), &pb.UpdateNSRecordRequest{
|
_, err := this.RPC().NSRecordRPC().UpdateNSRecord(this.AdminContext(), &pb.UpdateNSRecordRequest{
|
||||||
NsRecordId: params.RecordId,
|
NsRecordId: params.RecordId,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ package domains
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
@@ -57,7 +56,6 @@ func (this *UpdateAction) RunGet(params struct {
|
|||||||
|
|
||||||
func (this *UpdateAction) RunPost(params struct {
|
func (this *UpdateAction) RunPost(params struct {
|
||||||
DomainId int64
|
DomainId int64
|
||||||
Name string
|
|
||||||
ClusterId int64
|
ClusterId int64
|
||||||
UserId int64
|
UserId int64
|
||||||
IsOn bool
|
IsOn bool
|
||||||
@@ -68,15 +66,6 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
this.CreateLogInfo("修改域名 %d", params.DomainId)
|
this.CreateLogInfo("修改域名 %d", params.DomainId)
|
||||||
|
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("name", params.Name).
|
|
||||||
Require("请输入域名").
|
|
||||||
Expect(func() (message string, success bool) {
|
|
||||||
success = domainutils.ValidateDomainFormat(params.Name)
|
|
||||||
if !success {
|
|
||||||
message = "请输入正确的域名"
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}).
|
|
||||||
Field("clusterId", params.ClusterId).
|
Field("clusterId", params.ClusterId).
|
||||||
Gt(0, "请选择所属集群")
|
Gt(0, "请选择所属集群")
|
||||||
|
|
||||||
@@ -84,7 +73,6 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
NsDomainId: params.DomainId,
|
NsDomainId: params.DomainId,
|
||||||
NsClusterId: params.ClusterId,
|
NsClusterId: params.ClusterId,
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Name: params.Name,
|
|
||||||
IsOn: params.IsOn,
|
IsOn: params.IsOn,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -51,8 +51,10 @@ Vue.component("ns-route-ranges-box", {
|
|||||||
|
|
||||||
this.ranges.push({
|
this.ranges.push({
|
||||||
type: "ipRange",
|
type: "ipRange",
|
||||||
ipFrom: this.ipRangeFrom,
|
params: {
|
||||||
ipTo: this.ipRangeTo
|
ipFrom: this.ipRangeFrom,
|
||||||
|
ipTo: this.ipRangeTo
|
||||||
|
}
|
||||||
})
|
})
|
||||||
this.cancelIPRange()
|
this.cancelIPRange()
|
||||||
},
|
},
|
||||||
@@ -76,7 +78,7 @@ Vue.component("ns-route-ranges-box", {
|
|||||||
<div v-if="ranges.length > 0">
|
<div v-if="ranges.length > 0">
|
||||||
<div class="ui label tiny basic" v-for="(range, index) in ranges">
|
<div class="ui label tiny basic" v-for="(range, index) in ranges">
|
||||||
<span v-if="range.type == 'ipRange'">IP范围:</span>
|
<span v-if="range.type == 'ipRange'">IP范围:</span>
|
||||||
{{range.ipFrom}} - {{range.ipTo}} <a href="" title="删除" @click.prevent="remove(index)"><i class="icon remove small"></i></a>
|
{{range.params.ipFrom}} - {{range.params.ipTo}} <a href="" title="删除" @click.prevent="remove(index)"><i class="icon remove small"></i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui divider"></div>
|
<div class="ui divider"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{$layout}
|
{$layout}
|
||||||
{$template "../menu"}
|
{$template "menu"}
|
||||||
|
|
||||||
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
|
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
|
||||||
<input type="hidden" name="clusterId" :value="clusterId"/>
|
<input type="hidden" name="clusterId" :value="clusterId"/>
|
||||||
@@ -17,11 +17,6 @@
|
|||||||
<p class="comment">用于访问节点和域名解析等。</p>
|
<p class="comment">用于访问节点和域名解析等。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td colspan="2">
|
|
||||||
<more-options-indicator></more-options-indicator>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
<submit-btn></submit-btn>
|
<submit-btn></submit-btn>
|
||||||
</form>
|
</form>
|
||||||
@@ -39,12 +39,12 @@
|
|||||||
<td>
|
<td>
|
||||||
<div v-if="node.status.isActive">
|
<div v-if="node.status.isActive">
|
||||||
<span class="green">运行中</span>
|
<span class="green">运行中</span>
|
||||||
<a href="" @click.prevent="stopNode()" v-if="!isStopping"><span>[通过SSH停止]</span></a>
|
<!--<a href="" @click.prevent="stopNode()" v-if="!isStopping"><span>[通过SSH停止]</span></a>-->
|
||||||
<span v-if="isStopping">[停止中...]</span>
|
<span v-if="isStopping">[停止中...]</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<span class="red">已断开</span>
|
<span class="red">已断开</span>
|
||||||
<a href="" @click.prevent="startNode()" v-if="node.isInstalled && !isStarting"><span>[通过SSH启动]</span></a>
|
<!--<a href="" @click.prevent="startNode()" v-if="node.isInstalled && !isStarting"><span>[通过SSH启动]</span></a>-->
|
||||||
<span v-if="node.isInstalled && isStarting">[启动中...]</span>
|
<span v-if="node.isInstalled && isStarting">[启动中...]</span>
|
||||||
<a v-if="!node.isInstalled" :href="'/ns/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + node.id" ><span>去安装></span></a>
|
<a v-if="!node.isInstalled" :href="'/ns/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + node.id" ><span>去安装></span></a>
|
||||||
</div>
|
</div>
|
||||||
@@ -59,20 +59,10 @@
|
|||||||
<td>内存用量</td>
|
<td>内存用量</td>
|
||||||
<td>{{node.status.memUsageText}}</td>
|
<td>{{node.status.memUsageText}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td>连接数</td>
|
|
||||||
<td>{{node.status.connectionCount}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>负载</td>
|
<td>负载</td>
|
||||||
<td>{{node.status.load1m}} {{node.status.load5m}} {{node.status.load15m}} <tip-icon content="三个数字分别代表1分钟、5分钟、15分钟平均负载"></tip-icon></td>
|
<td>{{node.status.load1m}} {{node.status.load5m}} {{node.status.load15m}} <tip-icon content="三个数字分别代表1分钟、5分钟、15分钟平均负载"></tip-icon></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td>缓存用量</td>
|
|
||||||
<td>
|
|
||||||
磁盘:{{node.status.cacheTotalDiskSize}} 内存:{{node.status.cacheTotalMemorySize}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>版本</td>
|
<td>版本</td>
|
||||||
<td>v{{node.status.buildVersion}}
|
<td>v{{node.status.buildVersion}}
|
||||||
@@ -105,7 +95,7 @@
|
|||||||
<td>是否已安装</td>
|
<td>是否已安装</td>
|
||||||
<td>
|
<td>
|
||||||
<span v-if="node.isInstalled" class="green">已安装</span>
|
<span v-if="node.isInstalled" class="green">已安装</span>
|
||||||
<a v-else :href="'/ns/clusters/cluster/installNode?clusterId=' + clusterId + '&nodeId=' + nodeId" class="underline" title="点击进入安装界面"><span class="red">未安装</span></a>
|
<a v-else :href="'/ns/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + nodeId" class="underline" title="点击进入安装界面"><span class="red">未安装</span></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@@ -14,12 +14,14 @@
|
|||||||
<td class="title">所属集群 *</td>
|
<td class="title">所属集群 *</td>
|
||||||
<td>
|
<td>
|
||||||
<ns-cluster-selector></ns-cluster-selector>
|
<ns-cluster-selector></ns-cluster-selector>
|
||||||
|
<p class="comment">需要部署域名服务的集群。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>所属用户</td>
|
<td>所属用户</td>
|
||||||
<td>
|
<td>
|
||||||
<ns-user-selector></ns-user-selector>
|
<ns-user-selector></ns-user-selector>
|
||||||
|
<p class="comment">当前域名所属的平台用户。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>记录值</td>
|
<td>记录值</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="value" maxlength="1024"/>
|
<input type="text" name="value" maxlength="512"/>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
Tea.context(function () {
|
Tea.context(function () {
|
||||||
this.createRecord = function () {
|
this.createRecord = function () {
|
||||||
teaweb.popup("/ns/domains/records/createPopup?domainId=" + this.domain.id, {
|
teaweb.popup("/ns/domains/records/createPopup?domainId=" + this.domain.id, {
|
||||||
|
height: "32em",
|
||||||
callback: function () {
|
callback: function () {
|
||||||
teaweb.success("保存成功", function () {
|
teaweb.success("保存成功", function () {
|
||||||
teaweb.reload()
|
teaweb.reload()
|
||||||
@@ -11,6 +12,7 @@ Tea.context(function () {
|
|||||||
|
|
||||||
this.updateRecord = function (recordId) {
|
this.updateRecord = function (recordId) {
|
||||||
teaweb.popup("/ns/domains/records/updatePopup?recordId=" + recordId, {
|
teaweb.popup("/ns/domains/records/updatePopup?recordId=" + recordId, {
|
||||||
|
height: "32em",
|
||||||
callback: function () {
|
callback: function () {
|
||||||
teaweb.success("保存成功", function () {
|
teaweb.success("保存成功", function () {
|
||||||
teaweb.reload()
|
teaweb.reload()
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>记录值</td>
|
<td>记录值</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="value" maxlength="1024" v-model="record.value"/>
|
<input type="text" name="value" maxlength="512" v-model="record.value"/>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -8,19 +8,21 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>域名 *</td>
|
<td>域名 *</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="name" maxlength="255" ref="focus" v-model="domain.name"/>
|
{{domain.name}}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="title">所属集群 *</td>
|
<td class="title">所属集群 *</td>
|
||||||
<td>
|
<td>
|
||||||
<ns-cluster-selector :v-cluster-id="domain.clusterId"></ns-cluster-selector>
|
<ns-cluster-selector :v-cluster-id="domain.clusterId"></ns-cluster-selector>
|
||||||
|
<p class="comment">需要部署域名服务的集群。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>所属用户</td>
|
<td>所属用户</td>
|
||||||
<td>
|
<td>
|
||||||
<ns-user-selector :v-user-id="domain.userId"></ns-user-selector>
|
<ns-user-selector :v-user-id="domain.userId"></ns-user-selector>
|
||||||
|
<p class="comment">当前域名所属的平台用户。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user