Compare commits

...

10 Commits

Author SHA1 Message Date
刘祥超
05f77f7a0d 修复go.mod 2023-11-24 10:21:07 +08:00
刘祥超
4334b6f148 修复若干测试用例 2023-11-24 09:13:18 +08:00
刘祥超
72955759d7 更新go.sum 2023-11-24 08:53:40 +08:00
刘祥超
18dc52996d 更新Dockerfile中版本 2023-11-23 17:40:28 +08:00
刘祥超
0b16d09330 版本号修改为1.3.1 2023-11-23 17:26:24 +08:00
刘祥超
027d81a8cd 优化SSH认证sudo设置 2023-11-23 16:12:41 +08:00
刘祥超
d833158784 DNSPod改名为腾讯云DNSPod/DNSPod 支持腾讯云API密钥 2023-11-23 15:14:34 +08:00
刘祥超
75024c9364 优化X-Cache报头设置文字提示 2023-11-22 19:02:18 +08:00
刘祥超
1dd5db3c42 优化第三方域名解析azure dns提示文字 2023-11-22 10:30:29 +08:00
刘祥超
faba80e315 GRPC增加Keepalive参数 2023-11-20 09:56:35 +08:00
22 changed files with 280 additions and 147 deletions

View File

@@ -1,7 +1,7 @@
FROM --platform=linux/amd64 alpine:latest
LABEL maintainer="goedge.cdn@gmail.com"
ENV TZ "Asia/Shanghai"
ENV VERSION 1.3.0
ENV VERSION 1.3.1
ENV ROOT_DIR /usr/local/goedge
ENV TAR_FILE edge-admin-linux-amd64-plus-v${VERSION}.zip

20
go.mod
View File

@@ -11,13 +11,13 @@ require (
github.com/iwind/TeaGo v0.0.0-20230623080147-cd1e53b4915f
github.com/iwind/gosock v0.0.0-20211103081026-ee4652210ca4
github.com/miekg/dns v1.1.43
github.com/quic-go/quic-go v0.36.0
github.com/quic-go/quic-go v0.37.4
github.com/shirou/gopsutil/v3 v3.22.5
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/tealeg/xlsx/v3 v3.2.3
github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119
golang.org/x/crypto v0.10.0
golang.org/x/sys v0.9.0
golang.org/x/crypto v0.12.0
golang.org/x/sys v0.11.0
google.golang.org/grpc v1.45.0
gopkg.in/yaml.v3 v3.0.1
)
@@ -30,7 +30,7 @@ require (
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/btree v1.0.0 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect
github.com/google/pprof v0.0.0-20230808223545-4887780b67fb // indirect
github.com/kr/pretty v0.2.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/onsi/ginkgo/v2 v2.11.0 // indirect
@@ -38,17 +38,17 @@ require (
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
github.com/quic-go/qtls-go1-20 v0.3.2 // indirect
github.com/rogpeppe/fastuuid v1.2.0 // indirect
github.com/shabbyrobe/xmlwriter v0.0.0-20200208144257-9fca06d00ffa // indirect
github.com/tdewolff/minify/v2 v2.12.7 // indirect
github.com/tdewolff/parse/v2 v2.6.6 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect
golang.org/x/mod v0.11.0 // indirect
golang.org/x/net v0.11.0 // indirect
golang.org/x/text v0.10.0 // indirect
golang.org/x/tools v0.10.0 // indirect
golang.org/x/exp v0.0.0-20230809150735-7b3493d9a819 // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/net v0.14.0 // indirect
golang.org/x/text v0.12.0 // indirect
golang.org/x/tools v0.12.0 // indirect
google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect

34
go.sum
View File

@@ -84,6 +84,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs=
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
github.com/google/pprof v0.0.0-20230808223545-4887780b67fb h1:oqpb3Cwpc7EOml5PVGMYbSGmwNui2R7i8IW83gs4W0c=
github.com/google/pprof v0.0.0-20230808223545-4887780b67fb/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
@@ -132,10 +134,14 @@ github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
github.com/quic-go/qtls-go1-20 v0.3.2 h1:rRgN3WfnKbyik4dBV8A6girlJVxGand/d+jVKbQq5GI=
github.com/quic-go/qtls-go1-20 v0.3.2/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
github.com/quic-go/quic-go v0.36.0 h1:JIrO7p7Ug6hssFcARjWDiqS2RAKJHCiwPxBAA989rbI=
github.com/quic-go/quic-go v0.36.0/go.mod h1:zPetvwDlILVxt15n3hr3Gf/I3mDf7LpLKPhR4Ez0AZQ=
github.com/quic-go/quic-go v0.37.3 h1:pkHH3xaMNUNAh6OtgEV/0K6Fz+YIJXhPzgd/ShiRDm4=
github.com/quic-go/quic-go v0.37.3/go.mod h1:YsbH1r4mSHPJcLF4k4zruUkLBqctEMBDR6VPvcYjIsU=
github.com/quic-go/quic-go v0.37.4 h1:ke8B73yMCWGq9MfrCCAw0Uzdm7GaViC3i39dsIdDlH4=
github.com/quic-go/quic-go v0.37.4/go.mod h1:YsbH1r4mSHPJcLF4k4zruUkLBqctEMBDR6VPvcYjIsU=
github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/shabbyrobe/xmlwriter v0.0.0-20200208144257-9fca06d00ffa h1:2cO3RojjYl3hVTbEvJVqrMaFmORhL6O06qdW42toftk=
@@ -175,13 +181,17 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/exp v0.0.0-20230807204917-050eac23e9de h1:l5Za6utMv/HsBWWqzt4S8X17j+kt1uVETUX5UFhn2rE=
golang.org/x/exp v0.0.0-20230807204917-050eac23e9de/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/exp v0.0.0-20230809150735-7b3493d9a819 h1:EDuYyU/MkFXllv9QF9819VlI9a4tzGuCbhG0ExK9o1U=
golang.org/x/exp v0.0.0-20230809150735-7b3493d9a819/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -193,6 +203,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -208,6 +220,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -237,16 +251,16 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -257,6 +271,8 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg=
golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM=
golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss=
golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@@ -1,9 +1,9 @@
package teaconst
const (
Version = "1.3.0"
Version = "1.3.1"
APINodeVersion = "1.3.0"
APINodeVersion = "1.3.1"
ProductName = "Edge Admin"
ProcessName = "edge-admin"

View File

@@ -20,6 +20,7 @@ import (
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/encoding/gzip"
"google.golang.org/grpc/keepalive"
"google.golang.org/grpc/metadata"
"net"
"net/url"
@@ -514,12 +515,15 @@ func (this *RPCClient) init() error {
grpc.MaxCallSendMsgSize(128<<20),
grpc.UseCompressor(gzip.Name),
)
var keepaliveParams = grpc.WithKeepaliveParams(keepalive.ClientParameters{
Time: 30 * time.Second,
})
if u.Scheme == "http" {
conn, err = grpc.Dial(apiHost, grpc.WithTransportCredentials(insecure.NewCredentials()), callOptions)
conn, err = grpc.Dial(apiHost, grpc.WithTransportCredentials(insecure.NewCredentials()), callOptions, keepaliveParams)
} else if u.Scheme == "https" {
conn, err = grpc.Dial(apiHost, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{
InsecureSkipVerify: true,
})), callOptions)
})), callOptions, keepaliveParams)
} else {
return errors.New("parse endpoint failed: invalid scheme '" + u.Scheme + "'")
}

View File

@@ -34,14 +34,9 @@ func TestRPCClient_NodeRPC(t *testing.T) {
func TestRPC_Dial_HTTP(t *testing.T) {
client, err := NewRPCClient(&configs.APIConfig{
RPC: struct {
Endpoints []string `yaml:"endpoints"`
DisableUpdate bool `yaml:"disableUpdate"`
}{
Endpoints: []string{"http://127.0.0.1:8004"},
},
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
RPCEndpoints: []string{"https://127.0.0.1:8003"},
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
}, true)
if err != nil {
t.Fatal(err)
@@ -56,14 +51,9 @@ func TestRPC_Dial_HTTP(t *testing.T) {
func TestRPC_Dial_HTTP_2(t *testing.T) {
client, err := NewRPCClient(&configs.APIConfig{
RPC: struct {
Endpoints []string `yaml:"endpoints"`
DisableUpdate bool `yaml:"disableUpdate"`
}{
Endpoints: []string{"https://127.0.0.1:8003"},
},
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
RPCEndpoints: []string{"https://127.0.0.1:8003"},
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
}, true)
if err != nil {
t.Fatal(err)
@@ -78,14 +68,9 @@ func TestRPC_Dial_HTTP_2(t *testing.T) {
func TestRPC_Dial_HTTPS(t *testing.T) {
client, err := NewRPCClient(&configs.APIConfig{
RPC: struct {
Endpoints []string `yaml:"endpoints"`
DisableUpdate bool `yaml:"disableUpdate"`
}{
Endpoints: []string{"https://127.0.0.1:8004"},
},
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
RPCEndpoints: []string{"https://127.0.0.1:8004"},
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
}, true)
if err != nil {
t.Fatal(err)

View File

@@ -52,9 +52,13 @@ func (this *CreatePopupAction) RunPost(params struct {
Type string
// DNSPod
ParamId string
ParamToken string
ParamRegion string
ParamDNSPodId string
ParamDNSPodToken string
ParamDNSPodRegion string
ParamDNSPodAPIType string
ParamDNSPodAccessKeyId string
ParamDNSPodAccessKeySecret string
// AliDNS
ParamAliDNSAccessKeyId string
@@ -89,18 +93,31 @@ func (this *CreatePopupAction) RunPost(params struct {
Field("type", params.Type).
Require("请选择服务商厂家")
apiParams := maps.Map{}
var apiParams = maps.Map{}
switch params.Type {
case "dnspod":
params.Must.
Field("paramId", params.ParamId).
Require("请输入密钥ID").
Field("paramToken", params.ParamToken).
Require("请输入密钥Token")
apiParams["apiType"] = params.ParamDNSPodAPIType
switch params.ParamDNSPodAPIType {
case "tencentDNS":
params.Must.
Field("paramDNSPodAccessKeyId", params.ParamDNSPodAccessKeyId).
Require("请输入SecretId").
Field("paramDNSPodAccessKeySecret", params.ParamDNSPodAccessKeySecret).
Require("请输入SecretKey")
apiParams["accessKeyId"] = params.ParamDNSPodAccessKeyId
apiParams["accessKeySecret"] = params.ParamDNSPodAccessKeySecret
apiParams["region"] = params.ParamDNSPodRegion
default:
params.Must.
Field("paramId", params.ParamDNSPodId).
Require("请输入密钥ID").
Field("paramToken", params.ParamDNSPodToken).
Require("请输入密钥Token")
apiParams["id"] = params.ParamId
apiParams["token"] = params.ParamToken
apiParams["region"] = params.ParamRegion
apiParams["id"] = params.ParamDNSPodId
apiParams["token"] = params.ParamDNSPodToken
apiParams["region"] = params.ParamDNSPodRegion
}
case "alidns":
params.Must.
Field("paramAliDNSAccessKeyId", params.ParamAliDNSAccessKeyId).

View File

@@ -79,9 +79,13 @@ func (this *UpdatePopupAction) RunPost(params struct {
Type string
// DNSPod
ParamId string
ParamToken string
ParamRegion string
ParamDNSPodId string
ParamDNSPodToken string
ParamDNSPodRegion string
ParamDNSPodAPIType string
ParamDNSPodAccessKeyId string
ParamDNSPodAccessKeySecret string
// AliDNS
ParamAliDNSAccessKeyId string
@@ -118,18 +122,31 @@ func (this *UpdatePopupAction) RunPost(params struct {
Field("type", params.Type).
Require("请选择服务商厂家")
apiParams := maps.Map{}
var apiParams = maps.Map{}
switch params.Type {
case "dnspod":
params.Must.
Field("paramId", params.ParamId).
Require("请输入密钥ID").
Field("paramToken", params.ParamToken).
Require("请输入密钥Token")
apiParams["apiType"] = params.ParamDNSPodAPIType
switch params.ParamDNSPodAPIType {
case "tencentDNS":
params.Must.
Field("paramDNSPodAccessKeyId", params.ParamDNSPodAccessKeyId).
Require("请输入SecretId").
Field("paramDNSPodAccessKeySecret", params.ParamDNSPodAccessKeySecret).
Require("请输入SecretKey")
apiParams["accessKeyId"] = params.ParamDNSPodAccessKeyId
apiParams["accessKeySecret"] = params.ParamDNSPodAccessKeySecret
apiParams["region"] = params.ParamDNSPodRegion
default:
params.Must.
Field("paramId", params.ParamDNSPodId).
Require("请输入密钥ID").
Field("paramToken", params.ParamDNSPodToken).
Require("请输入密钥Token")
apiParams["id"] = params.ParamId
apiParams["token"] = params.ParamToken
apiParams["region"] = params.ParamRegion
apiParams["id"] = params.ParamDNSPodId
apiParams["token"] = params.ParamDNSPodToken
apiParams["region"] = params.ParamDNSPodRegion
}
case "alidns":
params.Must.
Field("paramAliDNSAccessKeyId", params.ParamAliDNSAccessKeyId).

View File

@@ -2218,10 +2218,10 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio
</td>
</tr>
<tr>
<td>添加X-Cache Header</td>
<td>添加X-Cache报头</td>
<td>
<checkbox v-model="cacheConfig.addStatusHeader"></checkbox>
<p class="comment">选中后自动在响应Header中增加<code-label>X-Cache: BYPASS|MISS|HIT|PURGE</code-label>。</p>
<p class="comment">选中后自动在响应Header中增加<code-label>X-Cache: BYPASS|MISS|HIT|PURGE</code-label>在浏览器端查看X-Cache值时请先禁用浏览器缓存避免影响观察。</p>
</td>
</tr>
<tr>

View File

@@ -6293,10 +6293,10 @@ Vue.component("http-cache-config-box", {
</td>
</tr>
<tr>
<td>添加X-Cache Header</td>
<td>添加X-Cache报头</td>
<td>
<checkbox v-model="cacheConfig.addStatusHeader"></checkbox>
<p class="comment">选中后自动在响应Header中增加<code-label>X-Cache: BYPASS|MISS|HIT|PURGE</code-label>。</p>
<p class="comment">选中后自动在响应Header中增加<code-label>X-Cache: BYPASS|MISS|HIT|PURGE</code-label>在浏览器端查看X-Cache值时请先禁用浏览器缓存避免影响观察。</p>
</td>
</tr>
<tr>

View File

@@ -122,10 +122,10 @@ Vue.component("http-cache-config-box", {
</td>
</tr>
<tr>
<td>添加X-Cache Header</td>
<td>添加X-Cache报头</td>
<td>
<checkbox v-model="cacheConfig.addStatusHeader"></checkbox>
<p class="comment">选中后自动在响应Header中增加<code-label>X-Cache: BYPASS|MISS|HIT|PURGE</code-label>。</p>
<p class="comment">选中后自动在响应Header中增加<code-label>X-Cache: BYPASS|MISS|HIT|PURGE</code-label>在浏览器端查看X-Cache值时请先禁用浏览器缓存避免影响观察。</p>
</td>
</tr>
<tr>

View File

@@ -8,7 +8,7 @@
<td>名称 *</td>
<td>
<input type="text" name="name" maxlength="100" ref="focus"/>
<p class="comment">起一个容易识别的名称。</p>
<p class="comment">为当前认证信息起一个容易识别的名称。</p>
</td>
</tr>
@@ -26,7 +26,7 @@
<tr>
<td>SSH用户名 *</td>
<td>
<input type="text" name="username" maxlength="100" value="root"/>
<input type="text" name="username" maxlength="100" value="root" v-model="username"/>
<p class="comment">SSH登录用户名。</p>
</td>
</tr>
@@ -42,7 +42,7 @@
<tr>
<td>SSH用户名 *</td>
<td>
<input type="text" name="username" maxlength="100" value="root"/>
<input type="text" name="username" maxlength="100" value="root" v-model="username"/>
<p class="comment">SSH登录用户名。</p>
</td>
</tr>
@@ -62,17 +62,18 @@
</tr>
</tbody>
<tr v-if="username != 'root'">
<td>执行sudo</td>
<td>
<checkbox name="su" checked="checked"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令请确保当前用户已经加入到sudo分组中。</p>
</td>
</tr>
<tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr>
<tbody v-show="moreOptionsVisible">
<tr>
<td>执行sudo</td>
<td>
<checkbox name="su"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令。</p>
</td>
</tr>
<tr>
<td>备注</td>
<td>

View File

@@ -1,5 +1,6 @@
Tea.context(function () {
this.method = "user";
this.username = "root"
this.success = NotifySuccess("保存成功", "/clusters/grants");
});

View File

@@ -7,6 +7,7 @@
<td>名称 *</td>
<td>
<input type="text" name="name" maxlength="100" ref="focus" value=""/>
<p class="comment">为当前认证信息起一个容易识别的名称。</p>
</td>
</tr>
@@ -24,7 +25,7 @@
<tr>
<td>SSH用户名 *</td>
<td>
<input type="text" name="username" maxlength="100" value="root"/>
<input type="text" name="username" maxlength="100" value="root" v-model="username"/>
<p class="comment">SSH登录用户名。</p>
</td>
</tr>
@@ -40,7 +41,7 @@
<tr>
<td>SSH用户名 *</td>
<td>
<input type="text" name="username" maxlength="100" value="root"/>
<input type="text" name="username" maxlength="100" value="root" v-model="username"/>
<p class="comment">SSH登录用户名。</p>
</td>
</tr>
@@ -60,18 +61,19 @@
</tr>
</tbody>
<tr v-if="username != 'root'">
<td>执行sudo</td>
<td>
<checkbox name="su" checked="checked"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令请确保当前用户已经加入到sudo分组中。</p>
</td>
</tr>
<tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr>
<tbody v-show="moreOptionsVisible">
<tr>
<td>执行sudo</td>
<td>
<checkbox name="su"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令。</p>
</td>
</tr>
<tr>
<td>备注</td>
<td>

View File

@@ -1,5 +1,6 @@
Tea.context(function () {
this.method = "user";
this.username = "root"
this.success = NotifyPopup;
});

View File

@@ -9,7 +9,7 @@
<td>名称 *</td>
<td>
<input type="text" name="name" maxlength="100" ref="focus" v-model="grant.name"/>
<p class="comment">起一个容易识别的名称。</p>
<p class="comment">为当前认证信息起一个容易识别的名称。</p>
</td>
</tr>
@@ -62,11 +62,11 @@
</td>
</tr>
</tbody>
<tr>
<tr v-if="grant.username != 'root'">
<td>执行sudo</td>
<td>
<checkbox name="su" v-model="grant.su"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令。</p>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令请确保当前用户已经加入到sudo分组中</p>
</td>
</tr>
<tr>

View File

@@ -9,6 +9,7 @@
<td>名称 *</td>
<td>
<input type="text" name="name" maxlength="100" ref="focus" value="" v-model="grant.name"/>
<p class="comment">为当前认证信息起一个容易识别的名称。</p>
</td>
</tr>
@@ -61,19 +62,19 @@
</td>
</tr>
</tbody>
<tr v-if="grant.username != 'root'">
<td>执行sudo</td>
<td>
<checkbox name="su" v-model="grant.su"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令请确保当前用户已经加入到sudo分组中。</p>
</td>
</tr>
<tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr>
<tbody v-show="moreOptionsVisible">
<tr>
<td>执行sudo</td>
<td>
<checkbox name="su" v-model="grant.su"></checkbox>
<p class="comment">非root的用户可以使用<code-label>sudo</code-label>获得更高权限来执行命令。</p>
</td>
</tr>
<tr>
<td>备注</td>
<td>

View File

@@ -27,24 +27,47 @@
<!-- DNSPod -->
<tbody v-if="type == 'dnspod'">
<tr>
<tr>
<td>密钥类型 *</td>
<td>
<select class="ui dropdown auto-width" name="paramDNSPodAPIType" v-model="paramDNSPodAPIType">
<option value="tencentDNS">腾讯云API密钥</option>
<option value="dnsPodToken">DNSPod Token</option>
</select>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'tencentDNS'">
<td>SecretId *</td>
<td>
<input type="text" name="paramDNSPodAccessKeyId" maxlength="100"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。</p>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'tencentDNS'">
<td>SecretKey *</td>
<td>
<input type="text" name="paramDNSPodAccessKeySecret" maxlength="100"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。</p>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'dnsPodToken'">
<td>密钥ID *</td>
<td>
<input type="text" name="paramId" maxlength="100" spellcheck="false"/>
<p class="comment">获取方法参考:<a href="https://docs.dnspod.cn/account/5f2d466de8320f1a740d9ff3/" target="_blank">文档</a> </p>
<input type="text" name="paramDNSPodId" maxlength="100" spellcheck="false"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。</p>
</td>
</tr>
<tr>
<tr v-show="paramDNSPodAPIType == 'dnsPodToken'">
<td>密钥Token *</td>
<td>
<input type="text" name="paramToken" maxlength="100" spellcheck="false"/>
<p class="comment">获取方法参考:<a href="https://docs.dnspod.cn/account/5f2d466de8320f1a740d9ff3/" target="_blank">文档</a> </p>
<input type="text" name="paramDNSPodToken" maxlength="100" spellcheck="false"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。</p>
</td>
</tr>
<tr>
<tr v-if="paramDNSPodAPIType == 'dnsPodToken'">
<td>区域</td>
<td>
<select class="ui dropdown auto-width" name="paramRegion">
<select class="ui dropdown auto-width" name="paramDNSPodRegion">
<option value="">中国站</option>
<option value="international">国际站</option>
</select>
@@ -241,28 +264,37 @@
<!-- Microsoft Azure DNS -->
<tbody v-if="type == 'azureDNS'">
<tr>
<td>Subscription ID *</td>
<td>订阅ID <br/><em>(Subscription ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSSubscriptionId" maxlength="100" spellcheck="false"/>
<p class="comment">可以在订阅Subscriptions服务中查看。</p>
</td>
</tr>
<tr>
<td>Tenant ID *</td>
<td>目录(租户) ID <br/><em>(Directory Tenant ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSTenantId" maxlength="100" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用概述Overview中查看。</p>
</td>
</tr>
<tr>
<td>Client ID *</td>
<td><input type="text" name="paramAzureDNSClientId" maxlength="100" spellcheck="false"/></td>
<td>应用程序(客户端) ID <br/><em>(Client ID)</em> *</td>
<td><input type="text" name="paramAzureDNSClientId" maxlength="100" spellcheck="false"/>
<p class="comment">需要在应用注册App registrations中新注册应用程序获得。</p>
</td>
</tr>
<tr>
<td>Client Secret Value *</td>
<td><input type="text" name="paramAzureDNSClientSecret" maxlength="100" spellcheck="false"/></td>
<td>客户端密码值 <br/><em>(Client Secret Value)</em> *</td>
<td><input type="text" name="paramAzureDNSClientSecret" maxlength="100" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用的“证书和密码Certificates &amp; secrets”--“客户端密码Client secrets”中创建和查看。</p>
</td>
</tr>
<tr>
<td>Resource Group Name *</td>
<td><input type="text" name="paramAzureDNSResourceGroupName" maxlength="100" spellcheck="false"/></td>
<td>资源组 <br/><em>(Resource Group Name)</em> *</td>
<td>
<input type="text" name="paramAzureDNSResourceGroupName" maxlength="100" spellcheck="false"/>
<p class="comment">权限设置帮助你需要在对应资源组Resource group-- 访问控制Access control (IAM)-- 角色分配Role assignments中添加一个角色分配Role assignment其中作业职能角色Job function roles为"DNS 区域参与者(DNS Zone Contributor)"成员Members为应用注册App registrations中的应用程序application有时需要在选择成员select members界面搜索应用程序application名称才能看到</p>
</td>
</tr>
</tbody>

View File

@@ -14,4 +14,7 @@ Tea.context(function () {
this.typeDescription = ""
}
}
// DNSPod
this.paramDNSPodAPIType = "tencentDNS"
})

View File

@@ -21,15 +21,30 @@
<!-- DNSPod -->
<tbody v-if="provider.type == 'dnspod'">
<tr>
<tr>
<td class="color-border">密钥类型</td>
<td>
<span v-if="provider.apiParams.apiType == 'tencentDNS'">腾讯云API密钥</span>
<span v-else>DNSPod Token</span>
</td>
</tr>
<tr v-if="provider.apiParams.apiType == 'tencentDNS'">
<td class="color-border">SecretId</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr v-if="provider.apiParams.apiType == 'tencentDNS'">
<td class="color-border">SecretKey</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
<tr v-if="provider.apiParams.apiType != 'tencentDNS'">
<td class="color-border">密钥ID</td>
<td>{{provider.apiParams.id}}</td>
</tr>
<tr>
<tr v-if="provider.apiParams.apiType != 'tencentDNS'">
<td class="color-border">密钥Token</td>
<td>{{provider.apiParams.token}}</td>
</tr>
<tr>
<tr v-if="provider.apiParams.apiType != 'tencentDNS'">
<td class="color-border">区域</td>
<td>
<span v-if="provider.apiParams.region == 'international'">国际站</span>
@@ -178,31 +193,31 @@
<tbody v-if="provider.type == 'azureDNS'">
<tr>
<td class="color-border">Subscription ID</td>
<td class="color-border">订阅ID <br/><em>(Subscription ID)</em></td>
<td>
{{provider.apiParams.subscriptionId}}
</td>
</tr>
<tr>
<td class="color-border">Tenant ID</td>
<td class="color-border">目录(租户) ID <br/><em>(Directory Tenant ID)</em></td>
<td>
{{provider.apiParams.tenantId}}
</td>
</tr>
<tr>
<td class="color-border">Client ID</td>
<td class="color-border">应用程序(客户端) ID <br/><em>(Client ID)</em></td>
<td>
{{provider.apiParams.clientId}}
</td>
</tr>
<tr>
<td class="color-border">Client Secret Value</td>
<td class="color-border">客户端密码值 <br/><em>(Client Secret Value)</em></td>
<td>
{{provider.apiParams.clientSecret}}
</td>
</tr>
<tr>
<td class="color-border">Resource Group Name</td>
<td class="color-border">资源组 <br/><em>(Resource Group Name)</em></td>
<td>
{{provider.apiParams.resourceGroupName}}
</td>

View File

@@ -26,24 +26,47 @@
<!-- DNSPod -->
<tbody v-if="provider.type == 'dnspod'">
<tr>
<tr>
<td>密钥类型 *</td>
<td>
<select class="ui dropdown auto-width" name="paramDNSPodAPIType" v-model="provider.params.apiType">
<option value="tencentDNS">腾讯云API密钥</option>
<option value="dnsPodToken">DNSPod Token</option>
</select>
</td>
</tr>
<tr v-show="provider.params.apiType == 'tencentDNS'">
<td>SecretId *</td>
<td>
<input type="text" name="paramDNSPodAccessKeyId" maxlength="100" v-model="provider.params.accessKeyId"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。</p>
</td>
</tr>
<tr v-show="provider.params.apiType == 'tencentDNS'">
<td>SecretKey *</td>
<td>
<input type="text" name="paramDNSPodAccessKeySecret" maxlength="100" v-model="provider.params.accessKeySecret"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。</p>
</td>
</tr>
<tr v-show="provider.params.apiType == null || provider.params.apiType.length == 0 || provider.params.apiType == 'dnsPodToken'">
<td>密钥ID *</td>
<td>
<input type="text" name="paramId" maxlength="100" v-model="provider.params.id"/>
<p class="comment">获取方法参考:<a href="https://docs.dnspod.cn/account/5f2d466de8320f1a740d9ff3/" target="_blank">文档</a> </p>
<input type="text" name="paramDNSPodId" maxlength="100" v-model="provider.params.id"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。</p>
</td>
</tr>
<tr>
<tr v-show="provider.params.apiType == null || provider.params.apiType.length == 0 || provider.params.apiType == 'dnsPodToken'">
<td>密钥Token *</td>
<td>
<input type="text" name="paramToken" maxlength="100" v-model="provider.params.token" spellcheck="false"/>
<p class="comment">获取方法参考:<a href="https://docs.dnspod.cn/account/5f2d466de8320f1a740d9ff3/" target="_blank">文档</a> </p>
<input type="text" name="paramDNSPodToken" maxlength="100" v-model="provider.params.token" spellcheck="false"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。</p>
</td>
</tr>
<tr>
<tr v-if="provider.params.apiType == null || provider.params.apiType.length == 0 || provider.params.apiType == 'dnsPodToken'">
<td>区域</td>
<td>
<select class="ui dropdown auto-width" name="paramRegion" v-model="provider.params.region">
<select class="ui dropdown auto-width" name="paramDNSPodRegion" v-model="provider.params.region">
<option value="">中国站</option>
<option value="international">国际站</option>
</select>
@@ -241,28 +264,38 @@
<!-- Microsoft Azure DNS -->
<tbody v-if="provider.type == 'azureDNS'">
<tr>
<td>Subscription ID *</td>
<td>订阅ID <br/><em>(Subscription ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSSubscriptionId" maxlength="100" v-model="provider.params.subscriptionId" spellcheck="false"/>
<p class="comment">可以在订阅Subscriptions服务中查看。</p>
</td>
</tr>
<tr>
<td>Tenant ID *</td>
<td>目录(租户) ID <br/><em>(Directory Tenant ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSTenantId" maxlength="100" v-model="provider.params.tenantId" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用概述Overview中查看。</p>
</td>
</tr>
<tr>
<td>Client ID *</td>
<td><input type="text" name="paramAzureDNSClientId" maxlength="100" v-model="provider.params.clientId" spellcheck="false"/></td>
<td>应用程序(客户端) ID <br/><em>(Client ID)</em> *</td>
<td><input type="text" name="paramAzureDNSClientId" maxlength="100" v-model="provider.params.clientId" spellcheck="false"/>
<p class="comment">需要在应用注册App registrations中新注册应用程序获得。</p>
</td>
</tr>
<tr>
<td>Client Secret Value *</td>
<td><input type="text" name="paramAzureDNSClientSecret" maxlength="100" v-model="provider.params.clientSecret" spellcheck="false"/></td>
<td>客户端密码值 <br/><em>(Client Secret Value)</em> *</td>
<td>
<input type="text" name="paramAzureDNSClientSecret" maxlength="100" v-model="provider.params.clientSecret" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用的“证书和密码Certificates &amp; secrets”--“客户端密码Client secrets”中创建和查看。</p>
</td>
</tr>
<tr>
<td>Resource Group Name *</td>
<td><input type="text" name="paramAzureDNSResourceGroupName" maxlength="100" v-model="provider.params.resourceGroupName" spellcheck="false"/></td>
<td>资源组 <br/><em>(Resource Group Name)</em> *</td>
<td>
<input type="text" name="paramAzureDNSResourceGroupName" maxlength="100" v-model="provider.params.resourceGroupName" spellcheck="false"/>
<p class="comment">权限设置帮助你需要在对应资源组Resource group-- 访问控制Access control (IAM)-- 角色分配Role assignments中添加一个角色分配Role assignment其中作业职能角色Job function roles为"DNS 区域参与者(DNS Zone Contributor)"成员Members为应用注册App registrations中的应用程序application有时需要在选择成员select members界面搜索应用程序application名称才能看到</p>
</td>
</tr>
</tbody>

View File

@@ -7,4 +7,9 @@ Tea.context(function () {
that.typeDescription = v.description
}
})
// DNSPod
if (this.provider.type == "dnspod" && this.provider.params != null && (this.provider.params.apiType == null || this.provider.params.apiType.length == 0)) {
this.provider.params.apiType = "dnsPodToken"
}
})