Compare commits
116 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b7dc8eb96 | ||
|
|
7c0af45dd0 | ||
|
|
daea270132 | ||
|
|
a42e3ac4a6 | ||
|
|
c94c526b43 | ||
|
|
e531787773 | ||
|
|
0eda84a99a | ||
|
|
89b791448a | ||
|
|
2239328b2e | ||
|
|
e440a46080 | ||
|
|
4a0fec6e35 | ||
|
|
a9b46987bc | ||
|
|
6771afead5 | ||
|
|
553fca2981 | ||
|
|
8ef1e36b8b | ||
|
|
9e6c49b67c | ||
|
|
170632ddbc | ||
|
|
4a74488cac | ||
|
|
5fd6a08988 | ||
|
|
c86b91ead6 | ||
|
|
aeebb763c1 | ||
|
|
b05630e3e0 | ||
|
|
51905a0ee3 | ||
|
|
869ebd59d1 | ||
|
|
8a6aedca16 | ||
|
|
cf98c3453a | ||
|
|
1b6f234f39 | ||
|
|
26c7f0f566 | ||
|
|
617ad9b16e | ||
|
|
04a6792dbf | ||
|
|
f2bf8f2dbf | ||
|
|
3aba0abd24 | ||
|
|
b56ccc7cef | ||
|
|
aeebf55e60 | ||
|
|
9a9e0d25f3 | ||
|
|
6b3033e240 | ||
|
|
2859a59340 | ||
|
|
45367dd579 | ||
|
|
fee3fd743f | ||
|
|
ba4cfea47c | ||
|
|
5c11f07f8e | ||
|
|
ffac080611 | ||
|
|
f7a1e60735 | ||
|
|
f22651821c | ||
|
|
b2a5a9ac9b | ||
|
|
245af2bd77 | ||
|
|
9dd2b1d35c | ||
|
|
bdbfd3e055 | ||
|
|
1518c03d2b | ||
|
|
45920d4df2 | ||
|
|
1c106ac6eb | ||
|
|
9f4a32b4ac | ||
|
|
2565b10491 | ||
|
|
34d632a401 | ||
|
|
a9df27c0e1 | ||
|
|
313011a168 | ||
|
|
5c595aad83 | ||
|
|
2c67eac63c | ||
|
|
d20c20cb33 | ||
|
|
fa76f032be | ||
|
|
3f74910640 | ||
|
|
22bd2a57e9 | ||
|
|
e45a1d0367 | ||
|
|
ee7acdc6a0 | ||
|
|
32264f2700 | ||
|
|
249ea32973 | ||
|
|
9c31b69a58 | ||
|
|
6e985cf6cc | ||
|
|
0f35b45704 | ||
|
|
ba9245e724 | ||
|
|
6e806f2822 | ||
|
|
7c6842a859 | ||
|
|
39f9fa0e6b | ||
|
|
0c8ae8960d | ||
|
|
ffd6a20829 | ||
|
|
2ee3e2782c | ||
|
|
61324c28c6 | ||
|
|
e9f70ecb90 | ||
|
|
cc3b802575 | ||
|
|
9b780ff4a3 | ||
|
|
deb1a33e78 | ||
|
|
5021350aa0 | ||
|
|
41b3dab135 | ||
|
|
ecf94170c8 | ||
|
|
56acdf3ce3 | ||
|
|
5d6d970d49 | ||
|
|
b501cf3c88 | ||
|
|
deac2baa18 | ||
|
|
b1e3f54055 | ||
|
|
8ebf79ffbe | ||
|
|
8d7307cddf | ||
|
|
c547837ae3 | ||
|
|
b408996e72 | ||
|
|
6b5866524d | ||
|
|
4994dfb488 | ||
|
|
5d5040651e | ||
|
|
5252188a68 | ||
|
|
3f664882d5 | ||
|
|
15f2a2d517 | ||
|
|
6637b0fb8f | ||
|
|
a06eeb9129 | ||
|
|
a24fce2c22 | ||
|
|
ddbdb64fc4 | ||
|
|
38c6d545ec | ||
|
|
fe880abbb0 | ||
|
|
081ed76c39 | ||
|
|
613a00686f | ||
|
|
11739ee671 | ||
|
|
d06951e3b5 | ||
|
|
63bbacd4d8 | ||
|
|
6ba130b62c | ||
|
|
5529d644ac | ||
|
|
7e5e6fb5b4 | ||
|
|
f5fb1911f7 | ||
|
|
e26e129a63 | ||
|
|
280cedad8d |
@@ -46,7 +46,7 @@
|
|||||||
* [开发者指南](https://goedge.cn/docs/Developer/Build.md)
|
* [开发者指南](https://goedge.cn/docs/Developer/Build.md)
|
||||||
|
|
||||||
## 架构
|
## 架构
|
||||||

|

|
||||||
|
|
||||||
其中的组件源码地址如下:
|
其中的组件源码地址如下:
|
||||||
* [边缘节点](https://github.com/TeaOSLab/EdgeNode)
|
* [边缘节点](https://github.com/TeaOSLab/EdgeNode)
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 72 KiB |
BIN
doc/architect-zh.png
Normal file
BIN
doc/architect-zh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 MiB |
@@ -1,11 +1,15 @@
|
|||||||
FROM alpine:latest
|
FROM --platform=linux/amd64 alpine:latest
|
||||||
LABEL maintainer="goedge.cdn@gmail.com"
|
LABEL maintainer="goedge.cdn@gmail.com"
|
||||||
ENV TZ "Asia/Shanghai"
|
ENV TZ "Asia/Shanghai"
|
||||||
ENV VERSION 1.2.7
|
ENV VERSION 1.3.0
|
||||||
ENV ROOT_DIR /usr/local/goedge
|
ENV ROOT_DIR /usr/local/goedge
|
||||||
ENV TAR_FILE edge-admin-linux-amd64-plus-v${VERSION}.zip
|
ENV TAR_FILE edge-admin-linux-amd64-plus-v${VERSION}.zip
|
||||||
|
|
||||||
|
# remote official repository
|
||||||
ENV TAR_URL "https://dl.goedge.cn/edge/v${VERSION}/edge-admin-linux-amd64-plus-v${VERSION}.zip"
|
ENV TAR_URL "https://dl.goedge.cn/edge/v${VERSION}/edge-admin-linux-amd64-plus-v${VERSION}.zip"
|
||||||
#ENV TAR_URL "http://192.168.2.61:8080/edge-admin-linux-amd64-plus-v${VERSION}.zip" # your local repository
|
|
||||||
|
# your local repository
|
||||||
|
#ENV TAR_URL "http://192.168.2.61:8080/edge-admin-linux-amd64-plus-v${VERSION}.zip"
|
||||||
|
|
||||||
RUN apk add --no-cache tzdata
|
RUN apk add --no-cache tzdata
|
||||||
|
|
||||||
|
|||||||
@@ -41,12 +41,17 @@ func LoadAPIConfig() (*APIConfig, error) {
|
|||||||
|
|
||||||
var data []byte
|
var data []byte
|
||||||
var err error
|
var err error
|
||||||
|
var isFromOld = false
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
data, err = os.ReadFile(path)
|
data, err = os.ReadFile(path)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if path == realFile || path == oldRealFile {
|
if path == realFile || path == oldRealFile {
|
||||||
isFromLocal = true
|
isFromLocal = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动生成新的配置文件
|
||||||
|
isFromOld = path == oldRealFile
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -70,6 +75,12 @@ func LoadAPIConfig() (*APIConfig, error) {
|
|||||||
_ = os.WriteFile(realFile, data, 0666)
|
_ = os.WriteFile(realFile, data, 0666)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动生成新配置文件
|
||||||
|
if isFromOld {
|
||||||
|
config.OldRPC.Endpoints = nil
|
||||||
|
_ = config.WriteFile(Tea.ConfigFile(ConfigFileName))
|
||||||
|
}
|
||||||
|
|
||||||
return config, nil
|
return config, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package teaconst
|
package teaconst
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version = "1.2.7"
|
Version = "1.3.0"
|
||||||
|
|
||||||
APINodeVersion = "1.2.7"
|
APINodeVersion = "1.3.0"
|
||||||
|
|
||||||
ProductName = "Edge Admin"
|
ProductName = "Edge Admin"
|
||||||
ProcessName = "edge-admin"
|
ProcessName = "edge-admin"
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.REQUEST_COND_COMPONENTS = ")
|
buffer.WriteString("window.REQUEST_COND_COMPONENTS = ")
|
||||||
buffer.Write(typesJSON)
|
buffer.Write(typesJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 条件操作符
|
// 条件操作符
|
||||||
@@ -73,7 +73,7 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.REQUEST_COND_OPERATORS = ")
|
buffer.WriteString("window.REQUEST_COND_OPERATORS = ")
|
||||||
buffer.Write(requestOperatorsJSON)
|
buffer.Write(requestOperatorsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 请求变量
|
// 请求变量
|
||||||
@@ -83,7 +83,7 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.REQUEST_VARIABLES = ")
|
buffer.WriteString("window.REQUEST_VARIABLES = ")
|
||||||
buffer.Write(requestVariablesJSON)
|
buffer.Write(requestVariablesJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 指标
|
// 指标
|
||||||
@@ -93,7 +93,7 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.METRIC_HTTP_KEYS = ")
|
buffer.WriteString("window.METRIC_HTTP_KEYS = ")
|
||||||
buffer.Write(metricHTTPKeysJSON)
|
buffer.Write(metricHTTPKeysJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IP地址阈值项目
|
// IP地址阈值项目
|
||||||
@@ -103,7 +103,7 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.IP_ADDR_THRESHOLD_ITEMS = ")
|
buffer.WriteString("window.IP_ADDR_THRESHOLD_ITEMS = ")
|
||||||
buffer.Write(ipAddrThresholdItemsJSON)
|
buffer.Write(ipAddrThresholdItemsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IP地址阈值动作
|
// IP地址阈值动作
|
||||||
@@ -113,7 +113,7 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.IP_ADDR_THRESHOLD_ACTIONS = ")
|
buffer.WriteString("window.IP_ADDR_THRESHOLD_ACTIONS = ")
|
||||||
buffer.Write(ipAddrThresholdActionsJSON)
|
buffer.Write(ipAddrThresholdActionsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WAF操作符
|
// WAF操作符
|
||||||
@@ -123,7 +123,17 @@ func generateComponentsJSFile() error {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.WAF_RULE_OPERATORS = ")
|
buffer.WriteString("window.WAF_RULE_OPERATORS = ")
|
||||||
buffer.Write(wafOperatorsJSON)
|
buffer.Write(wafOperatorsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WAF验证码类型
|
||||||
|
captchaTypesJSON, err := json.Marshal(firewallconfigs.FindAllCaptchaTypes())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal captcha types failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.WAF_CAPTCHA_TYPES = ")
|
||||||
|
buffer.Write(captchaTypesJSON)
|
||||||
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
fp, err := os.OpenFile(filepath.Clean(Tea.PublicFile("/js/components.src.js")), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
|
fp, err := os.OpenFile(filepath.Clean(Tea.PublicFile("/js/components.src.js")), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
|
||||||
|
|||||||
@@ -280,34 +280,6 @@ func (this *RPCClient) MessageRPC() pb.MessageServiceClient {
|
|||||||
return pb.NewMessageServiceClient(this.pickConn())
|
return pb.NewMessageServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *RPCClient) MessageRecipientGroupRPC() pb.MessageRecipientGroupServiceClient {
|
|
||||||
return pb.NewMessageRecipientGroupServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) MessageRecipientRPC() pb.MessageRecipientServiceClient {
|
|
||||||
return pb.NewMessageRecipientServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) MessageMediaRPC() pb.MessageMediaServiceClient {
|
|
||||||
return pb.NewMessageMediaServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) MessageMediaInstanceRPC() pb.MessageMediaInstanceServiceClient {
|
|
||||||
return pb.NewMessageMediaInstanceServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) MessageTaskRPC() pb.MessageTaskServiceClient {
|
|
||||||
return pb.NewMessageTaskServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) MessageTaskLogRPC() pb.MessageTaskLogServiceClient {
|
|
||||||
return pb.NewMessageTaskLogServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) MessageReceiverRPC() pb.MessageReceiverServiceClient {
|
|
||||||
return pb.NewMessageReceiverServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) IPLibraryRPC() pb.IPLibraryServiceClient {
|
func (this *RPCClient) IPLibraryRPC() pb.IPLibraryServiceClient {
|
||||||
return pb.NewIPLibraryServiceClient(this.pickConn())
|
return pb.NewIPLibraryServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
@@ -416,14 +388,6 @@ func (this *RPCClient) NodeTaskRPC() pb.NodeTaskServiceClient {
|
|||||||
return pb.NewNodeTaskServiceClient(this.pickConn())
|
return pb.NewNodeTaskServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *RPCClient) AuthorityKeyRPC() pb.AuthorityKeyServiceClient {
|
|
||||||
return pb.NewAuthorityKeyServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) AuthorityNodeRPC() pb.AuthorityNodeServiceClient {
|
|
||||||
return pb.NewAuthorityNodeServiceClient(this.pickConn())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RPCClient) LatestItemRPC() pb.LatestItemServiceClient {
|
func (this *RPCClient) LatestItemRPC() pb.LatestItemServiceClient {
|
||||||
return pb.NewLatestItemServiceClient(this.pickConn())
|
return pb.NewLatestItemServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
|
|||||||
95
internal/utils/unzip.go
Normal file
95
internal/utils/unzip.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/zip"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Unzip struct {
|
||||||
|
zipFile string
|
||||||
|
targetDir string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUnzip(zipFile string, targetDir string) *Unzip {
|
||||||
|
return &Unzip{
|
||||||
|
zipFile: zipFile,
|
||||||
|
targetDir: targetDir,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Unzip) Run() error {
|
||||||
|
if len(this.zipFile) == 0 {
|
||||||
|
return errors.New("zip file should not be empty")
|
||||||
|
}
|
||||||
|
if len(this.targetDir) == 0 {
|
||||||
|
return errors.New("target dir should not be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
reader, err := zip.OpenReader(this.zipFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = reader.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
for _, file := range reader.File {
|
||||||
|
var info = file.FileInfo()
|
||||||
|
var target = this.targetDir + "/" + file.Name
|
||||||
|
|
||||||
|
// 目录
|
||||||
|
if info.IsDir() {
|
||||||
|
stat, err := os.Stat(target)
|
||||||
|
if err != nil {
|
||||||
|
if !os.IsNotExist(err) {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
err = os.MkdirAll(target, info.Mode())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if !stat.IsDir() {
|
||||||
|
err = os.MkdirAll(target, info.Mode())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 文件
|
||||||
|
err = func(file *zip.File, target string) error {
|
||||||
|
fileReader, err := file.Open()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = fileReader.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
// remove old
|
||||||
|
_ = os.Remove(target)
|
||||||
|
|
||||||
|
// create new
|
||||||
|
fileWriter, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, file.FileInfo().Mode())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = fileWriter.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
_, err = io.Copy(fileWriter, fileReader)
|
||||||
|
return err
|
||||||
|
}(file, target)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -88,10 +88,6 @@ func (this *UpgradeManager) Start() error {
|
|||||||
|
|
||||||
// 检查unzip
|
// 检查unzip
|
||||||
unzipExe, _ := exec.LookPath("unzip")
|
unzipExe, _ := exec.LookPath("unzip")
|
||||||
if len(unzipExe) == 0 {
|
|
||||||
// TODO install unzip automatically or pack with a static 'unzip' file
|
|
||||||
return errors.New("can not find 'unzip' command")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查cp
|
// 检查cp
|
||||||
cpExe, _ := exec.LookPath("cp")
|
cpExe, _ := exec.LookPath("cp")
|
||||||
@@ -232,12 +228,24 @@ func (this *UpgradeManager) Start() error {
|
|||||||
return fmt.Errorf("remove old dir '%s' failed: %w", unzipDir, err)
|
return fmt.Errorf("remove old dir '%s' failed: %w", unzipDir, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var unzipCmd = exec.Command(unzipExe, "-q", "-o", destFile, "-d", unzipDir)
|
|
||||||
var unzipStderr = &bytes.Buffer{}
|
if len(unzipExe) > 0 {
|
||||||
unzipCmd.Stderr = unzipStderr
|
var unzipCmd = exec.Command(unzipExe, "-q", "-o", destFile, "-d", unzipDir)
|
||||||
err = unzipCmd.Run()
|
var unzipStderr = &bytes.Buffer{}
|
||||||
if err != nil {
|
unzipCmd.Stderr = unzipStderr
|
||||||
return fmt.Errorf("unzip installation file failed: %w: %s", err, unzipStderr.String())
|
err = unzipCmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unzip installation file failed: %w: %s", err, unzipStderr.String())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var unzipCmd = &Unzip{
|
||||||
|
zipFile: destFile,
|
||||||
|
targetDir: unzipDir,
|
||||||
|
}
|
||||||
|
err = unzipCmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unzip installation file failed: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
installationFiles, err := filepath.Glob(unzipDir + "/edge-" + this.component + "/*")
|
installationFiles, err := filepath.Glob(unzipDir + "/edge-" + this.component + "/*")
|
||||||
|
|||||||
@@ -1,82 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"regexp"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CreatePopupAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) Init() {
|
|
||||||
this.Nav("", "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunGet(params struct{}) {
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunPost(params struct {
|
|
||||||
AdminId int64
|
|
||||||
InstanceId int64
|
|
||||||
User string
|
|
||||||
|
|
||||||
TelegramToken string
|
|
||||||
|
|
||||||
GroupIds string
|
|
||||||
Description string
|
|
||||||
|
|
||||||
TimeFromHour string
|
|
||||||
TimeFromMinute string
|
|
||||||
TimeFromSecond string
|
|
||||||
|
|
||||||
TimeToHour string
|
|
||||||
TimeToMinute string
|
|
||||||
TimeToSecond string
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
params.Must.
|
|
||||||
Field("adminId", params.AdminId).
|
|
||||||
Gt(0, "请选择系统用户").
|
|
||||||
Field("instanceId", params.InstanceId).
|
|
||||||
Gt(0, "请选择媒介")
|
|
||||||
|
|
||||||
groupIds := utils.SplitNumbers(params.GroupIds)
|
|
||||||
|
|
||||||
var digitReg = regexp.MustCompile(`^\d+$`)
|
|
||||||
|
|
||||||
var timeFrom = ""
|
|
||||||
if digitReg.MatchString(params.TimeFromHour) && digitReg.MatchString(params.TimeFromMinute) && digitReg.MatchString(params.TimeFromSecond) {
|
|
||||||
timeFrom = params.TimeFromHour + ":" + params.TimeFromMinute + ":" + params.TimeFromSecond
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeTo = ""
|
|
||||||
if digitReg.MatchString(params.TimeToHour) && digitReg.MatchString(params.TimeToMinute) && digitReg.MatchString(params.TimeToSecond) {
|
|
||||||
timeTo = params.TimeToHour + ":" + params.TimeToMinute + ":" + params.TimeToSecond
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := this.RPC().MessageRecipientRPC().CreateMessageRecipient(this.AdminContext(), &pb.CreateMessageRecipientRequest{
|
|
||||||
AdminId: params.AdminId,
|
|
||||||
MessageMediaInstanceId: params.InstanceId,
|
|
||||||
User: params.User,
|
|
||||||
MessageRecipientGroupIds: groupIds,
|
|
||||||
Description: params.Description,
|
|
||||||
TimeFrom: timeFrom,
|
|
||||||
TimeTo: timeTo,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer this.CreateLogInfo(codes.MessageRecipient_LogCreateMessageRecipient, resp.MessageRecipientId)
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DeleteAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *DeleteAction) RunPost(params struct {
|
|
||||||
RecipientId int64
|
|
||||||
}) {
|
|
||||||
defer this.CreateLogInfo(codes.MessageRecipient_LogDeleteMessageRecipient, params.RecipientId)
|
|
||||||
|
|
||||||
_, err := this.RPC().MessageRecipientRPC().DeleteMessageRecipient(this.AdminContext(), &pb.DeleteMessageRecipientRequest{MessageRecipientId: params.RecipientId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package groups
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CreatePopupAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) Init() {
|
|
||||||
this.Nav("", "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunGet(params struct{}) {
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunPost(params struct {
|
|
||||||
Name string
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
params.Must.
|
|
||||||
Field("name", params.Name).
|
|
||||||
Require("请输入分组名称")
|
|
||||||
|
|
||||||
_, err := this.RPC().MessageRecipientGroupRPC().CreateMessageRecipientGroup(this.AdminContext(), &pb.CreateMessageRecipientGroupRequest{Name: params.Name})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
package groups
|
|
||||||
|
|
||||||
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 {
|
|
||||||
GroupId int64
|
|
||||||
}) {
|
|
||||||
_, err := this.RPC().MessageRecipientGroupRPC().DeleteMessageRecipientGroup(this.AdminContext(), &pb.DeleteMessageRecipientGroupRequest{MessageRecipientGroupId: params.GroupId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
package groups
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "", "group")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct{}) {
|
|
||||||
groupsResp, err := this.RPC().MessageRecipientGroupRPC().FindAllEnabledMessageRecipientGroups(this.AdminContext(), &pb.FindAllEnabledMessageRecipientGroupsRequest{})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
groupMaps := []maps.Map{}
|
|
||||||
for _, group := range groupsResp.MessageRecipientGroups {
|
|
||||||
groupMaps = append(groupMaps, maps.Map{
|
|
||||||
"id": group.Id,
|
|
||||||
"name": group.Name,
|
|
||||||
"isOn": group.IsOn,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["groups"] = groupMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package groups
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
|
||||||
"github.com/iwind/TeaGo"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
TeaGo.BeforeStart(func(server *TeaGo.Server) {
|
|
||||||
server.
|
|
||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
|
|
||||||
Data("teaMenu", "admins").
|
|
||||||
Data("teaSubMenu", "recipients").
|
|
||||||
Prefix("/admins/recipients/groups").
|
|
||||||
Get("", new(IndexAction)).
|
|
||||||
GetPost("/createPopup", new(CreatePopupAction)).
|
|
||||||
GetPost("/updatePopup", new(UpdatePopupAction)).
|
|
||||||
Post("/delete", new(DeleteAction)).
|
|
||||||
Get("/selectPopup", new(SelectPopupAction)).
|
|
||||||
EndAll()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
package groups
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/lists"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SelectPopupAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *SelectPopupAction) RunGet(params struct {
|
|
||||||
GroupIds string
|
|
||||||
}) {
|
|
||||||
selectedGroupIds := utils.SplitNumbers(params.GroupIds)
|
|
||||||
|
|
||||||
groupsResp, err := this.RPC().MessageRecipientGroupRPC().FindAllEnabledMessageRecipientGroups(this.AdminContext(), &pb.FindAllEnabledMessageRecipientGroupsRequest{})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
groupMaps := []maps.Map{}
|
|
||||||
for _, group := range groupsResp.MessageRecipientGroups {
|
|
||||||
if lists.ContainsInt64(selectedGroupIds, group.Id) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
groupMaps = append(groupMaps, maps.Map{
|
|
||||||
"id": group.Id,
|
|
||||||
"name": group.Name,
|
|
||||||
"isOn": group.IsOn,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["groups"] = groupMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
package groups
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UpdatePopupAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdatePopupAction) Init() {
|
|
||||||
this.Nav("", "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdatePopupAction) RunGet(params struct {
|
|
||||||
GroupId int64
|
|
||||||
}) {
|
|
||||||
groupResp, err := this.RPC().MessageRecipientGroupRPC().FindEnabledMessageRecipientGroup(this.AdminContext(), &pb.FindEnabledMessageRecipientGroupRequest{MessageRecipientGroupId: params.GroupId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
group := groupResp.MessageRecipientGroup
|
|
||||||
if group == nil {
|
|
||||||
this.NotFound("messageRecipientGroup", params.GroupId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["group"] = maps.Map{
|
|
||||||
"id": group.Id,
|
|
||||||
"name": group.Name,
|
|
||||||
"isOn": group.IsOn,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdatePopupAction) RunPost(params struct {
|
|
||||||
GroupId int64
|
|
||||||
Name string
|
|
||||||
IsOn bool
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
params.Must.
|
|
||||||
Field("name", params.Name).
|
|
||||||
Require("请输入分组名称")
|
|
||||||
|
|
||||||
_, err := this.RPC().MessageRecipientGroupRPC().UpdateMessageRecipientGroup(this.AdminContext(), &pb.UpdateMessageRecipientGroupRequest{
|
|
||||||
MessageRecipientGroupId: params.GroupId,
|
|
||||||
Name: params.Name,
|
|
||||||
IsOn: params.IsOn,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "", "recipient")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
|
||||||
}) {
|
|
||||||
// TODO 增加系统用户、媒介类型等条件搜索
|
|
||||||
countResp, err := this.RPC().MessageRecipientRPC().CountAllEnabledMessageRecipients(this.AdminContext(), &pb.CountAllEnabledMessageRecipientsRequest{
|
|
||||||
AdminId: 0,
|
|
||||||
MediaType: "",
|
|
||||||
MessageRecipientGroupId: 0,
|
|
||||||
Keyword: "",
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
count := countResp.Count
|
|
||||||
page := this.NewPage(count)
|
|
||||||
this.Data["page"] = page.AsHTML()
|
|
||||||
|
|
||||||
recipientsResp, err := this.RPC().MessageRecipientRPC().ListEnabledMessageRecipients(this.AdminContext(), &pb.ListEnabledMessageRecipientsRequest{
|
|
||||||
AdminId: 0,
|
|
||||||
MediaType: "",
|
|
||||||
MessageRecipientGroupId: 0,
|
|
||||||
Keyword: "",
|
|
||||||
Offset: page.Offset,
|
|
||||||
Size: page.Size,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
recipientMaps := []maps.Map{}
|
|
||||||
for _, recipient := range recipientsResp.MessageRecipients {
|
|
||||||
if recipient.Admin == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if recipient.MessageMediaInstance == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
recipientMaps = append(recipientMaps, maps.Map{
|
|
||||||
"id": recipient.Id,
|
|
||||||
"admin": maps.Map{
|
|
||||||
"id": recipient.Admin.Id,
|
|
||||||
"fullname": recipient.Admin.Fullname,
|
|
||||||
"username": recipient.Admin.Username,
|
|
||||||
},
|
|
||||||
"groups": recipient.MessageRecipientGroups,
|
|
||||||
"isOn": recipient.IsOn,
|
|
||||||
"instance": maps.Map{
|
|
||||||
"name": recipient.MessageMediaInstance.Name,
|
|
||||||
},
|
|
||||||
"user": recipient.User,
|
|
||||||
"description": recipient.Description,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["recipients"] = recipientMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
|
||||||
"github.com/iwind/TeaGo"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
TeaGo.BeforeStart(func(server *TeaGo.Server) {
|
|
||||||
server.
|
|
||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
|
|
||||||
Data("teaMenu", "admins").
|
|
||||||
Data("teaSubMenu", "recipients").
|
|
||||||
Prefix("/admins/recipients").
|
|
||||||
Get("", new(IndexAction)).
|
|
||||||
GetPost("/createPopup", new(CreatePopupAction)).
|
|
||||||
GetPost("/update", new(UpdateAction)).
|
|
||||||
Post("/delete", new(DeleteAction)).
|
|
||||||
Post("/mediaOptions", new(MediaOptionsAction)).
|
|
||||||
Get("/recipient", new(RecipientAction)).
|
|
||||||
GetPost("/test", new(TestAction)).
|
|
||||||
EndAll()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,267 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/monitorconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CreatePopupAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) Init() {
|
|
||||||
this.Nav("", "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunGet(params struct{}) {
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunPost(params struct {
|
|
||||||
Name string
|
|
||||||
MediaType string
|
|
||||||
|
|
||||||
EmailSmtp string
|
|
||||||
EmailUsername string
|
|
||||||
EmailPassword string
|
|
||||||
EmailFrom string
|
|
||||||
|
|
||||||
WebHookURL string
|
|
||||||
WebHookMethod string
|
|
||||||
WebHookHeaderNames []string
|
|
||||||
WebHookHeaderValues []string
|
|
||||||
WebHookContentType string
|
|
||||||
WebHookParamNames []string
|
|
||||||
WebHookParamValues []string
|
|
||||||
WebHookBody string
|
|
||||||
|
|
||||||
ScriptType string
|
|
||||||
ScriptPath string
|
|
||||||
ScriptLang string
|
|
||||||
ScriptCode string
|
|
||||||
ScriptCwd string
|
|
||||||
ScriptEnvNames []string
|
|
||||||
ScriptEnvValues []string
|
|
||||||
|
|
||||||
DingTalkWebHookURL string
|
|
||||||
|
|
||||||
QyWeixinCorporateId string
|
|
||||||
QyWeixinAgentId string
|
|
||||||
QyWeixinAppSecret string
|
|
||||||
QyWeixinTextFormat string
|
|
||||||
|
|
||||||
QyWeixinRobotWebHookURL string
|
|
||||||
QyWeixinRobotTextFormat string
|
|
||||||
|
|
||||||
AliyunSmsSign string
|
|
||||||
AliyunSmsTemplateCode string
|
|
||||||
AliyunSmsTemplateVarNames []string
|
|
||||||
AliyunSmsTemplateVarValues []string
|
|
||||||
AliyunSmsAccessKeyId string
|
|
||||||
AliyunSmsAccessKeySecret string
|
|
||||||
|
|
||||||
TelegramToken string
|
|
||||||
|
|
||||||
RateMinutes int32
|
|
||||||
RateCount int32
|
|
||||||
|
|
||||||
HashLife int32
|
|
||||||
|
|
||||||
Description string
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
params.Must.
|
|
||||||
Field("name", params.Name).
|
|
||||||
Require("请输入媒介名称").
|
|
||||||
Field("mediaType", params.MediaType).
|
|
||||||
Require("请选择媒介类型")
|
|
||||||
|
|
||||||
options := maps.Map{}
|
|
||||||
|
|
||||||
switch params.MediaType {
|
|
||||||
case "email":
|
|
||||||
params.Must.
|
|
||||||
Field("emailSmtp", params.EmailSmtp).
|
|
||||||
Require("请输入SMTP地址").
|
|
||||||
Field("emailUsername", params.EmailUsername).
|
|
||||||
Require("请输入邮箱账号").
|
|
||||||
Field("emailPassword", params.EmailPassword).
|
|
||||||
Require("请输入密码或授权码")
|
|
||||||
|
|
||||||
options["smtp"] = params.EmailSmtp
|
|
||||||
options["username"] = params.EmailUsername
|
|
||||||
options["password"] = params.EmailPassword
|
|
||||||
options["from"] = params.EmailFrom
|
|
||||||
case "webHook":
|
|
||||||
params.Must.
|
|
||||||
Field("webHookURL", params.WebHookURL).
|
|
||||||
Require("请输入URL地址").
|
|
||||||
Match("(?i)^(http|https)://", "URL地址必须以http或https开头").
|
|
||||||
Field("webHookMethod", params.WebHookMethod).
|
|
||||||
Require("请选择请求方法")
|
|
||||||
|
|
||||||
options["url"] = params.WebHookURL
|
|
||||||
options["method"] = params.WebHookMethod
|
|
||||||
options["contentType"] = params.WebHookContentType
|
|
||||||
|
|
||||||
headers := []maps.Map{}
|
|
||||||
if len(params.WebHookHeaderNames) > 0 {
|
|
||||||
for index, name := range params.WebHookHeaderNames {
|
|
||||||
if index < len(params.WebHookHeaderValues) {
|
|
||||||
headers = append(headers, maps.Map{
|
|
||||||
"name": name,
|
|
||||||
"value": params.WebHookHeaderValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["headers"] = headers
|
|
||||||
|
|
||||||
if params.WebHookContentType == "params" {
|
|
||||||
webHookParams := []maps.Map{}
|
|
||||||
for index, name := range params.WebHookParamNames {
|
|
||||||
if index < len(params.WebHookParamValues) {
|
|
||||||
webHookParams = append(webHookParams, maps.Map{
|
|
||||||
"name": name,
|
|
||||||
"value": params.WebHookParamValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["params"] = webHookParams
|
|
||||||
} else if params.WebHookContentType == "body" {
|
|
||||||
options["body"] = params.WebHookBody
|
|
||||||
}
|
|
||||||
case "script":
|
|
||||||
if params.ScriptType == "path" {
|
|
||||||
params.Must.
|
|
||||||
Field("scriptPath", params.ScriptPath).
|
|
||||||
Require("请输入脚本路径")
|
|
||||||
} else if params.ScriptType == "code" {
|
|
||||||
params.Must.
|
|
||||||
Field("scriptCode", params.ScriptCode).
|
|
||||||
Require("请输入脚本代码")
|
|
||||||
} else {
|
|
||||||
params.Must.
|
|
||||||
Field("scriptPath", params.ScriptPath).
|
|
||||||
Require("请输入脚本路径")
|
|
||||||
}
|
|
||||||
|
|
||||||
options["scriptType"] = params.ScriptType
|
|
||||||
options["path"] = params.ScriptPath
|
|
||||||
options["scriptLang"] = params.ScriptLang
|
|
||||||
options["script"] = params.ScriptCode
|
|
||||||
options["cwd"] = params.ScriptCwd
|
|
||||||
|
|
||||||
env := []maps.Map{}
|
|
||||||
for index, envName := range params.ScriptEnvNames {
|
|
||||||
if index < len(params.ScriptEnvValues) {
|
|
||||||
env = append(env, maps.Map{
|
|
||||||
"name": envName,
|
|
||||||
"value": params.ScriptEnvValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["env"] = env
|
|
||||||
case "dingTalk":
|
|
||||||
params.Must.
|
|
||||||
Field("dingTalkWebHookURL", params.DingTalkWebHookURL).
|
|
||||||
Require("请输入Hook地址").
|
|
||||||
Match("^https:", "Hook地址必须以https://开头")
|
|
||||||
|
|
||||||
options["webHookURL"] = params.DingTalkWebHookURL
|
|
||||||
case "qyWeixin":
|
|
||||||
params.Must.
|
|
||||||
Field("qyWeixinCorporateId", params.QyWeixinCorporateId).
|
|
||||||
Require("请输入企业ID").
|
|
||||||
Field("qyWeixinAgentId", params.QyWeixinAgentId).
|
|
||||||
Require("请输入应用AgentId").
|
|
||||||
Field("qyWeixinSecret", params.QyWeixinAppSecret).
|
|
||||||
Require("请输入应用Secret")
|
|
||||||
|
|
||||||
options["corporateId"] = params.QyWeixinCorporateId
|
|
||||||
options["agentId"] = params.QyWeixinAgentId
|
|
||||||
options["appSecret"] = params.QyWeixinAppSecret
|
|
||||||
options["textFormat"] = params.QyWeixinTextFormat
|
|
||||||
case "qyWeixinRobot":
|
|
||||||
params.Must.
|
|
||||||
Field("qyWeixinRobotWebHookURL", params.QyWeixinRobotWebHookURL).
|
|
||||||
Require("请输入WebHook地址").
|
|
||||||
Match("^https:", "WebHook地址必须以https://开头")
|
|
||||||
|
|
||||||
options["webHookURL"] = params.QyWeixinRobotWebHookURL
|
|
||||||
options["textFormat"] = params.QyWeixinRobotTextFormat
|
|
||||||
case "aliyunSms":
|
|
||||||
params.Must.
|
|
||||||
Field("aliyunSmsSign", params.AliyunSmsSign).
|
|
||||||
Require("请输入签名名称").
|
|
||||||
Field("aliyunSmsTemplateCode", params.AliyunSmsTemplateCode).
|
|
||||||
Require("请输入模板CODE").
|
|
||||||
Field("aliyunSmsAccessKeyId", params.AliyunSmsAccessKeyId).
|
|
||||||
Require("请输入AccessKey ID").
|
|
||||||
Field("aliyunSmsAccessKeySecret", params.AliyunSmsAccessKeySecret).
|
|
||||||
Require("请输入AccessKey Secret")
|
|
||||||
|
|
||||||
options["sign"] = params.AliyunSmsSign
|
|
||||||
options["templateCode"] = params.AliyunSmsTemplateCode
|
|
||||||
options["accessKeyId"] = params.AliyunSmsAccessKeyId
|
|
||||||
options["accessKeySecret"] = params.AliyunSmsAccessKeySecret
|
|
||||||
|
|
||||||
variables := []maps.Map{}
|
|
||||||
for index, name := range params.AliyunSmsTemplateVarNames {
|
|
||||||
if index < len(params.AliyunSmsTemplateVarValues) {
|
|
||||||
variables = append(variables, maps.Map{
|
|
||||||
"name": name,
|
|
||||||
"value": params.AliyunSmsTemplateVarValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["variables"] = variables
|
|
||||||
case "telegram":
|
|
||||||
params.Must.
|
|
||||||
Field("telegramToken", params.TelegramToken).
|
|
||||||
Require("请输入机器人Token")
|
|
||||||
options["token"] = params.TelegramToken
|
|
||||||
default:
|
|
||||||
this.Fail("错误的媒介类型")
|
|
||||||
}
|
|
||||||
|
|
||||||
optionsJSON, err := json.Marshal(options)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var rateConfig = &monitorconfigs.RateConfig{
|
|
||||||
Minutes: params.RateMinutes,
|
|
||||||
Count: params.RateCount,
|
|
||||||
}
|
|
||||||
rateJSON, err := json.Marshal(rateConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := this.RPC().MessageMediaInstanceRPC().CreateMessageMediaInstance(this.AdminContext(), &pb.CreateMessageMediaInstanceRequest{
|
|
||||||
Name: params.Name,
|
|
||||||
MediaType: params.MediaType,
|
|
||||||
ParamsJSON: optionsJSON,
|
|
||||||
Description: params.Description,
|
|
||||||
RateJSON: rateJSON,
|
|
||||||
HashLife: params.HashLife,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer this.CreateLogInfo(codes.MessageMediaInstance_LogCreateMessageMediaInstance, resp.MessageMediaInstanceId)
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DeleteAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *DeleteAction) RunPost(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
}) {
|
|
||||||
defer this.CreateLogInfo(codes.MessageMediaInstance_LogDeleteMessageMediaInstance, params.InstanceId)
|
|
||||||
|
|
||||||
_, err := this.RPC().MessageMediaInstanceRPC().DeleteMessageMediaInstance(this.AdminContext(), &pb.DeleteMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "", "instance")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
|
||||||
}) {
|
|
||||||
// TODO 增加系统用户、媒介类型等条件搜索
|
|
||||||
countResp, err := this.RPC().MessageMediaInstanceRPC().CountAllEnabledMessageMediaInstances(this.AdminContext(), &pb.CountAllEnabledMessageMediaInstancesRequest{
|
|
||||||
MediaType: "",
|
|
||||||
Keyword: "",
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
count := countResp.Count
|
|
||||||
page := this.NewPage(count)
|
|
||||||
this.Data["page"] = page.AsHTML()
|
|
||||||
|
|
||||||
instancesResp, err := this.RPC().MessageMediaInstanceRPC().ListEnabledMessageMediaInstances(this.AdminContext(), &pb.ListEnabledMessageMediaInstancesRequest{
|
|
||||||
MediaType: "",
|
|
||||||
Keyword: "",
|
|
||||||
Offset: page.Offset,
|
|
||||||
Size: page.Size,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
instanceMaps := []maps.Map{}
|
|
||||||
for _, instance := range instancesResp.MessageMediaInstances {
|
|
||||||
if instance.MessageMedia == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
instanceMaps = append(instanceMaps, maps.Map{
|
|
||||||
"id": instance.Id,
|
|
||||||
"name": instance.Name,
|
|
||||||
"isOn": instance.IsOn,
|
|
||||||
"media": maps.Map{
|
|
||||||
"name": instance.MessageMedia.Name,
|
|
||||||
},
|
|
||||||
"description": instance.Description,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["instances"] = instanceMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
|
||||||
"github.com/iwind/TeaGo"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
TeaGo.BeforeStart(func(server *TeaGo.Server) {
|
|
||||||
server.
|
|
||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
|
|
||||||
Data("teaMenu", "admins").
|
|
||||||
Data("teaSubMenu", "instances").
|
|
||||||
Prefix("/admins/recipients/instances").
|
|
||||||
Get("", new(IndexAction)).
|
|
||||||
GetPost("/createPopup", new(CreatePopupAction)).
|
|
||||||
GetPost("/update", new(UpdateAction)).
|
|
||||||
Post("/delete", new(DeleteAction)).
|
|
||||||
Get("/instance", new(InstanceAction)).
|
|
||||||
GetPost("/test", new(TestAction)).
|
|
||||||
Post("/options", new(OptionsAction)).
|
|
||||||
EndAll()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/monitorconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type InstanceAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *InstanceAction) Init() {
|
|
||||||
this.Nav("", "", "instance")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *InstanceAction) RunGet(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
}) {
|
|
||||||
instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
instance := instanceResp.MessageMediaInstance
|
|
||||||
if instance == nil || instance.MessageMedia == nil {
|
|
||||||
this.NotFound("messageMediaInstance", params.InstanceId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaParams := maps.Map{}
|
|
||||||
if len(instance.ParamsJSON) > 0 {
|
|
||||||
err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 频率
|
|
||||||
var rateConfig = &monitorconfigs.RateConfig{}
|
|
||||||
if len(instance.RateJSON) > 0 {
|
|
||||||
err = json.Unmarshal(instance.RateJSON, rateConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["instance"] = maps.Map{
|
|
||||||
"id": instance.Id,
|
|
||||||
"name": instance.Name,
|
|
||||||
"isOn": instance.IsOn,
|
|
||||||
"media": maps.Map{
|
|
||||||
"type": instance.MessageMedia.Type,
|
|
||||||
"name": instance.MessageMedia.Name,
|
|
||||||
},
|
|
||||||
"description": instance.Description,
|
|
||||||
"params": mediaParams,
|
|
||||||
"rate": rateConfig,
|
|
||||||
"hashLife": instance.HashLife,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 媒介类型选项
|
|
||||||
type OptionsAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *OptionsAction) RunPost(params struct{}) {
|
|
||||||
resp, err := this.RPC().MessageMediaInstanceRPC().ListEnabledMessageMediaInstances(this.AdminContext(), &pb.ListEnabledMessageMediaInstancesRequest{
|
|
||||||
Offset: 0,
|
|
||||||
Size: 1000,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
instanceMaps := []maps.Map{}
|
|
||||||
for _, instance := range resp.MessageMediaInstances {
|
|
||||||
instanceMaps = append(instanceMaps, maps.Map{
|
|
||||||
"id": instance.Id,
|
|
||||||
"name": instance.Name,
|
|
||||||
"description": instance.Description,
|
|
||||||
"media": maps.Map{
|
|
||||||
"type": instance.MessageMedia.Type,
|
|
||||||
"name": instance.MessageMedia.Name,
|
|
||||||
"userDescription": instance.MessageMedia.UserDescription,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["instances"] = instanceMaps
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type TestAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TestAction) Init() {
|
|
||||||
this.Nav("", "", "test")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TestAction) RunGet(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
}) {
|
|
||||||
instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
instance := instanceResp.MessageMediaInstance
|
|
||||||
if instance == nil || instance.MessageMedia == nil {
|
|
||||||
this.NotFound("messageMediaInstance", params.InstanceId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaParams := maps.Map{}
|
|
||||||
if len(instance.ParamsJSON) > 0 {
|
|
||||||
err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["instance"] = maps.Map{
|
|
||||||
"id": instance.Id,
|
|
||||||
"isOn": instance.IsOn,
|
|
||||||
"media": maps.Map{
|
|
||||||
"type": instance.MessageMedia.Type,
|
|
||||||
"name": instance.MessageMedia.Name,
|
|
||||||
"userDescription": instance.MessageMedia.UserDescription,
|
|
||||||
},
|
|
||||||
"description": instance.Description,
|
|
||||||
"params": mediaParams,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TestAction) RunPost(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
Subject string
|
|
||||||
Body string
|
|
||||||
User string
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
params.Must.
|
|
||||||
Field("instanceId", params.InstanceId).
|
|
||||||
Gt(0, "请选择正确的媒介")
|
|
||||||
|
|
||||||
resp, err := this.RPC().MessageTaskRPC().CreateMessageTask(this.AdminContext(), &pb.CreateMessageTaskRequest{
|
|
||||||
RecipientId: 0,
|
|
||||||
InstanceId: params.InstanceId,
|
|
||||||
User: params.User,
|
|
||||||
Subject: params.Subject,
|
|
||||||
Body: params.Body,
|
|
||||||
IsPrimary: true,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.Data["taskId"] = resp.MessageTaskId
|
|
||||||
|
|
||||||
defer this.CreateLogInfo(codes.MessageTask_LogCreateTestingMessageTask, resp.MessageTaskId)
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,317 +0,0 @@
|
|||||||
package instances
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/monitorconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UpdateAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdateAction) Init() {
|
|
||||||
this.Nav("", "", "update")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdateAction) RunGet(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
}) {
|
|
||||||
instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: params.InstanceId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
instance := instanceResp.MessageMediaInstance
|
|
||||||
if instance == nil || instance.MessageMedia == nil {
|
|
||||||
this.NotFound("messageMediaInstance", params.InstanceId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaParams := maps.Map{}
|
|
||||||
if len(instance.ParamsJSON) > 0 {
|
|
||||||
err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var rateConfig = &monitorconfigs.RateConfig{}
|
|
||||||
if len(instance.RateJSON) > 0 {
|
|
||||||
err = json.Unmarshal(instance.RateJSON, rateConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["instance"] = maps.Map{
|
|
||||||
"id": instance.Id,
|
|
||||||
"name": instance.Name,
|
|
||||||
"isOn": instance.IsOn,
|
|
||||||
"media": maps.Map{
|
|
||||||
"type": instance.MessageMedia.Type,
|
|
||||||
"name": instance.MessageMedia.Name,
|
|
||||||
},
|
|
||||||
"description": instance.Description,
|
|
||||||
"params": mediaParams,
|
|
||||||
"rate": rateConfig,
|
|
||||||
"hashLife": instance.HashLife,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdateAction) RunPost(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
Name string
|
|
||||||
MediaType string
|
|
||||||
|
|
||||||
EmailSmtp string
|
|
||||||
EmailUsername string
|
|
||||||
EmailPassword string
|
|
||||||
EmailFrom string
|
|
||||||
|
|
||||||
WebHookURL string
|
|
||||||
WebHookMethod string
|
|
||||||
WebHookHeaderNames []string
|
|
||||||
WebHookHeaderValues []string
|
|
||||||
WebHookContentType string
|
|
||||||
WebHookParamNames []string
|
|
||||||
WebHookParamValues []string
|
|
||||||
WebHookBody string
|
|
||||||
|
|
||||||
ScriptType string
|
|
||||||
ScriptPath string
|
|
||||||
ScriptLang string
|
|
||||||
ScriptCode string
|
|
||||||
ScriptCwd string
|
|
||||||
ScriptEnvNames []string
|
|
||||||
ScriptEnvValues []string
|
|
||||||
|
|
||||||
DingTalkWebHookURL string
|
|
||||||
|
|
||||||
QyWeixinCorporateId string
|
|
||||||
QyWeixinAgentId string
|
|
||||||
QyWeixinAppSecret string
|
|
||||||
QyWeixinTextFormat string
|
|
||||||
|
|
||||||
QyWeixinRobotWebHookURL string
|
|
||||||
QyWeixinRobotTextFormat string
|
|
||||||
|
|
||||||
AliyunSmsSign string
|
|
||||||
AliyunSmsTemplateCode string
|
|
||||||
AliyunSmsTemplateVarNames []string
|
|
||||||
AliyunSmsTemplateVarValues []string
|
|
||||||
AliyunSmsAccessKeyId string
|
|
||||||
AliyunSmsAccessKeySecret string
|
|
||||||
|
|
||||||
TelegramToken string
|
|
||||||
|
|
||||||
GroupIds string
|
|
||||||
Description string
|
|
||||||
IsOn bool
|
|
||||||
|
|
||||||
RateMinutes int32
|
|
||||||
RateCount int32
|
|
||||||
|
|
||||||
HashLife int32
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
defer this.CreateLogInfo(codes.MessageMediaInstance_LogUpdateMessageMediaInstance, params.InstanceId)
|
|
||||||
|
|
||||||
params.Must.
|
|
||||||
Field("name", params.Name).
|
|
||||||
Require("请输入媒介名称").
|
|
||||||
Field("mediaType", params.MediaType).
|
|
||||||
Require("请选择媒介类型")
|
|
||||||
|
|
||||||
options := maps.Map{}
|
|
||||||
|
|
||||||
switch params.MediaType {
|
|
||||||
case "email":
|
|
||||||
params.Must.
|
|
||||||
Field("emailSmtp", params.EmailSmtp).
|
|
||||||
Require("请输入SMTP地址").
|
|
||||||
Field("emailUsername", params.EmailUsername).
|
|
||||||
Require("请输入邮箱账号").
|
|
||||||
Field("emailPassword", params.EmailPassword).
|
|
||||||
Require("请输入密码或授权码")
|
|
||||||
|
|
||||||
options["smtp"] = params.EmailSmtp
|
|
||||||
options["username"] = params.EmailUsername
|
|
||||||
options["password"] = params.EmailPassword
|
|
||||||
options["from"] = params.EmailFrom
|
|
||||||
case "webHook":
|
|
||||||
params.Must.
|
|
||||||
Field("webHookURL", params.WebHookURL).
|
|
||||||
Require("请输入URL地址").
|
|
||||||
Match("(?i)^(http|https)://", "URL地址必须以http或https开头").
|
|
||||||
Field("webHookMethod", params.WebHookMethod).
|
|
||||||
Require("请选择请求方法")
|
|
||||||
|
|
||||||
options["url"] = params.WebHookURL
|
|
||||||
options["method"] = params.WebHookMethod
|
|
||||||
options["contentType"] = params.WebHookContentType
|
|
||||||
|
|
||||||
headers := []maps.Map{}
|
|
||||||
if len(params.WebHookHeaderNames) > 0 {
|
|
||||||
for index, name := range params.WebHookHeaderNames {
|
|
||||||
if index < len(params.WebHookHeaderValues) {
|
|
||||||
headers = append(headers, maps.Map{
|
|
||||||
"name": name,
|
|
||||||
"value": params.WebHookHeaderValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["headers"] = headers
|
|
||||||
|
|
||||||
if params.WebHookContentType == "params" {
|
|
||||||
webHookParams := []maps.Map{}
|
|
||||||
for index, name := range params.WebHookParamNames {
|
|
||||||
if index < len(params.WebHookParamValues) {
|
|
||||||
webHookParams = append(webHookParams, maps.Map{
|
|
||||||
"name": name,
|
|
||||||
"value": params.WebHookParamValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["params"] = webHookParams
|
|
||||||
} else if params.WebHookContentType == "body" {
|
|
||||||
options["body"] = params.WebHookBody
|
|
||||||
}
|
|
||||||
case "script":
|
|
||||||
if params.ScriptType == "path" {
|
|
||||||
params.Must.
|
|
||||||
Field("scriptPath", params.ScriptPath).
|
|
||||||
Require("请输入脚本路径")
|
|
||||||
} else if params.ScriptType == "code" {
|
|
||||||
params.Must.
|
|
||||||
Field("scriptCode", params.ScriptCode).
|
|
||||||
Require("请输入脚本代码")
|
|
||||||
} else {
|
|
||||||
params.Must.
|
|
||||||
Field("scriptPath", params.ScriptPath).
|
|
||||||
Require("请输入脚本路径")
|
|
||||||
}
|
|
||||||
|
|
||||||
options["scriptType"] = params.ScriptType
|
|
||||||
options["path"] = params.ScriptPath
|
|
||||||
options["scriptLang"] = params.ScriptLang
|
|
||||||
options["script"] = params.ScriptCode
|
|
||||||
options["cwd"] = params.ScriptCwd
|
|
||||||
|
|
||||||
env := []maps.Map{}
|
|
||||||
for index, envName := range params.ScriptEnvNames {
|
|
||||||
if index < len(params.ScriptEnvValues) {
|
|
||||||
env = append(env, maps.Map{
|
|
||||||
"name": envName,
|
|
||||||
"value": params.ScriptEnvValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["env"] = env
|
|
||||||
case "dingTalk":
|
|
||||||
params.Must.
|
|
||||||
Field("dingTalkWebHookURL", params.DingTalkWebHookURL).
|
|
||||||
Require("请输入Hook地址").
|
|
||||||
Match("^https:", "Hook地址必须以https://开头")
|
|
||||||
|
|
||||||
options["webHookURL"] = params.DingTalkWebHookURL
|
|
||||||
case "qyWeixin":
|
|
||||||
params.Must.
|
|
||||||
Field("qyWeixinCorporateId", params.QyWeixinCorporateId).
|
|
||||||
Require("请输入企业ID").
|
|
||||||
Field("qyWeixinAgentId", params.QyWeixinAgentId).
|
|
||||||
Require("请输入应用AgentId").
|
|
||||||
Field("qyWeixinSecret", params.QyWeixinAppSecret).
|
|
||||||
Require("请输入应用Secret")
|
|
||||||
|
|
||||||
options["corporateId"] = params.QyWeixinCorporateId
|
|
||||||
options["agentId"] = params.QyWeixinAgentId
|
|
||||||
options["appSecret"] = params.QyWeixinAppSecret
|
|
||||||
options["textFormat"] = params.QyWeixinTextFormat
|
|
||||||
case "qyWeixinRobot":
|
|
||||||
params.Must.
|
|
||||||
Field("qyWeixinRobotWebHookURL", params.QyWeixinRobotWebHookURL).
|
|
||||||
Require("请输入WebHook地址").
|
|
||||||
Match("^https:", "WebHook地址必须以https://开头")
|
|
||||||
|
|
||||||
options["webHookURL"] = params.QyWeixinRobotWebHookURL
|
|
||||||
options["textFormat"] = params.QyWeixinRobotTextFormat
|
|
||||||
case "aliyunSms":
|
|
||||||
params.Must.
|
|
||||||
Field("aliyunSmsSign", params.AliyunSmsSign).
|
|
||||||
Require("请输入签名名称").
|
|
||||||
Field("aliyunSmsTemplateCode", params.AliyunSmsTemplateCode).
|
|
||||||
Require("请输入模板CODE").
|
|
||||||
Field("aliyunSmsAccessKeyId", params.AliyunSmsAccessKeyId).
|
|
||||||
Require("请输入AccessKey ID").
|
|
||||||
Field("aliyunSmsAccessKeySecret", params.AliyunSmsAccessKeySecret).
|
|
||||||
Require("请输入AccessKey Secret")
|
|
||||||
|
|
||||||
options["sign"] = params.AliyunSmsSign
|
|
||||||
options["templateCode"] = params.AliyunSmsTemplateCode
|
|
||||||
options["accessKeyId"] = params.AliyunSmsAccessKeyId
|
|
||||||
options["accessKeySecret"] = params.AliyunSmsAccessKeySecret
|
|
||||||
|
|
||||||
variables := []maps.Map{}
|
|
||||||
for index, name := range params.AliyunSmsTemplateVarNames {
|
|
||||||
if index < len(params.AliyunSmsTemplateVarValues) {
|
|
||||||
variables = append(variables, maps.Map{
|
|
||||||
"name": name,
|
|
||||||
"value": params.AliyunSmsTemplateVarValues[index],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options["variables"] = variables
|
|
||||||
case "telegram":
|
|
||||||
params.Must.
|
|
||||||
Field("telegramToken", params.TelegramToken).
|
|
||||||
Require("请输入机器人Token")
|
|
||||||
options["token"] = params.TelegramToken
|
|
||||||
default:
|
|
||||||
this.Fail("错误的媒介类型")
|
|
||||||
}
|
|
||||||
|
|
||||||
optionsJSON, err := json.Marshal(options)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var rateConfig = &monitorconfigs.RateConfig{
|
|
||||||
Minutes: params.RateMinutes,
|
|
||||||
Count: params.RateCount,
|
|
||||||
}
|
|
||||||
rateJSON, err := json.Marshal(rateConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = this.RPC().MessageMediaInstanceRPC().UpdateMessageMediaInstance(this.AdminContext(), &pb.UpdateMessageMediaInstanceRequest{
|
|
||||||
MessageMediaInstanceId: params.InstanceId,
|
|
||||||
Name: params.Name,
|
|
||||||
MediaType: params.MediaType,
|
|
||||||
ParamsJSON: optionsJSON,
|
|
||||||
Description: params.Description,
|
|
||||||
RateJSON: rateJSON,
|
|
||||||
HashLife: params.HashLife,
|
|
||||||
IsOn: params.IsOn,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
package logs
|
|
||||||
|
|
||||||
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 IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "", "log")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct{}) {
|
|
||||||
countResp, err := this.RPC().MessageTaskLogRPC().CountMessageTaskLogs(this.AdminContext(), &pb.CountMessageTaskLogsRequest{})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
page := this.NewPage(countResp.Count)
|
|
||||||
this.Data["page"] = page.AsHTML()
|
|
||||||
|
|
||||||
logsResp, err := this.RPC().MessageTaskLogRPC().ListMessageTaskLogs(this.AdminContext(), &pb.ListMessageTaskLogsRequest{
|
|
||||||
Offset: page.Offset,
|
|
||||||
Size: page.Size,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
logMaps := []maps.Map{}
|
|
||||||
for _, log := range logsResp.MessageTaskLogs {
|
|
||||||
if log.MessageTask.MessageRecipient != nil {
|
|
||||||
log.MessageTask.User = log.MessageTask.MessageRecipient.User
|
|
||||||
}
|
|
||||||
logMaps = append(logMaps, maps.Map{
|
|
||||||
"task": maps.Map{
|
|
||||||
"id": log.MessageTask.Id,
|
|
||||||
"user": log.MessageTask.User,
|
|
||||||
"subject": log.MessageTask.Subject,
|
|
||||||
"body": log.MessageTask.Body,
|
|
||||||
"instance": maps.Map{
|
|
||||||
"id": log.MessageTask.MessageMediaInstance.Id,
|
|
||||||
"name": log.MessageTask.MessageMediaInstance.Name,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"isOk": log.IsOk,
|
|
||||||
"error": log.Error,
|
|
||||||
"response": log.Response,
|
|
||||||
"createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["logs"] = logMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
package logs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
|
||||||
"github.com/iwind/TeaGo"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
TeaGo.BeforeStart(func(server *TeaGo.Server) {
|
|
||||||
server.
|
|
||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
|
|
||||||
Data("teaMenu", "admins").
|
|
||||||
Data("teaSubMenu", "recipients").
|
|
||||||
Prefix("/admins/recipients/logs").
|
|
||||||
Get("", new(IndexAction)).
|
|
||||||
EndAll()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 媒介类型选项
|
|
||||||
type MediaOptionsAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *MediaOptionsAction) RunPost(params struct{}) {
|
|
||||||
resp, err := this.RPC().MessageMediaRPC().FindAllMessageMedias(this.AdminContext(), &pb.FindAllMessageMediasRequest{})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
mediaMaps := []maps.Map{}
|
|
||||||
for _, media := range resp.MessageMedias {
|
|
||||||
mediaMaps = append(mediaMaps, maps.Map{
|
|
||||||
"id": media.Id,
|
|
||||||
"type": media.Type,
|
|
||||||
"name": media.Name,
|
|
||||||
"description": media.Description,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["medias"] = mediaMaps
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RecipientAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RecipientAction) Init() {
|
|
||||||
this.Nav("", "", "recipient")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *RecipientAction) RunGet(params struct {
|
|
||||||
RecipientId int64
|
|
||||||
}) {
|
|
||||||
recipientResp, err := this.RPC().MessageRecipientRPC().FindEnabledMessageRecipient(this.AdminContext(), &pb.FindEnabledMessageRecipientRequest{MessageRecipientId: params.RecipientId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
recipient := recipientResp.MessageRecipient
|
|
||||||
if recipient == nil || recipient.Admin == nil || recipient.MessageMediaInstance == nil {
|
|
||||||
this.NotFound("messageRecipient", params.RecipientId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["recipient"] = maps.Map{
|
|
||||||
"id": recipient.Id,
|
|
||||||
"admin": maps.Map{
|
|
||||||
"id": recipient.Admin.Id,
|
|
||||||
"fullname": recipient.Admin.Fullname,
|
|
||||||
"username": recipient.Admin.Username,
|
|
||||||
},
|
|
||||||
"groups": recipient.MessageRecipientGroups,
|
|
||||||
"isOn": recipient.IsOn,
|
|
||||||
"instance": maps.Map{
|
|
||||||
"id": recipient.MessageMediaInstance.Id,
|
|
||||||
"name": recipient.MessageMediaInstance.Name,
|
|
||||||
"description": recipient.MessageMediaInstance.Description,
|
|
||||||
},
|
|
||||||
"user": recipient.User,
|
|
||||||
"description": recipient.Description,
|
|
||||||
"timeFrom": recipient.TimeFrom,
|
|
||||||
"timeTo": recipient.TimeTo,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package tasks
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DeleteAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *DeleteAction) RunPost(params struct {
|
|
||||||
TaskId int64
|
|
||||||
}) {
|
|
||||||
defer this.CreateLogInfo(codes.MessageTask_LogDeleteMessageTask, params.TaskId)
|
|
||||||
|
|
||||||
_, err := this.RPC().MessageTaskRPC().DeleteMessageTask(this.AdminContext(), &pb.DeleteMessageTaskRequest{MessageTaskId: params.TaskId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package tasks
|
|
||||||
|
|
||||||
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 IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "", "task")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
|
||||||
Status int32
|
|
||||||
}) {
|
|
||||||
this.Data["status"] = params.Status
|
|
||||||
if params.Status > 3 {
|
|
||||||
params.Status = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
countWaitingResp, err := this.RPC().MessageTaskRPC().CountMessageTasksWithStatus(this.AdminContext(), &pb.CountMessageTasksWithStatusRequest{Status: pb.CountMessageTasksWithStatusRequest_MessageTaskStatusNone})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var countWaiting = countWaitingResp.Count
|
|
||||||
this.Data["countWaiting"] = countWaiting
|
|
||||||
|
|
||||||
countFailedResp, err := this.RPC().MessageTaskRPC().CountMessageTasksWithStatus(this.AdminContext(), &pb.CountMessageTasksWithStatusRequest{Status: pb.CountMessageTasksWithStatusRequest_MessageTaskStatusFailed})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var countFailed = countFailedResp.Count
|
|
||||||
this.Data["countFailed"] = countFailed
|
|
||||||
|
|
||||||
// 列表
|
|
||||||
var total = int64(0)
|
|
||||||
switch params.Status {
|
|
||||||
case 0:
|
|
||||||
total = countWaiting
|
|
||||||
case 3:
|
|
||||||
total = countFailed
|
|
||||||
}
|
|
||||||
page := this.NewPage(total)
|
|
||||||
this.Data["page"] = page.AsHTML()
|
|
||||||
|
|
||||||
var taskMaps = []maps.Map{}
|
|
||||||
tasksResp, err := this.RPC().MessageTaskRPC().ListMessageTasksWithStatus(this.AdminContext(), &pb.ListMessageTasksWithStatusRequest{
|
|
||||||
Status: pb.ListMessageTasksWithStatusRequest_Status(params.Status),
|
|
||||||
Offset: page.Offset,
|
|
||||||
Size: page.Size,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, task := range tasksResp.MessageTasks {
|
|
||||||
var resultMap = maps.Map{}
|
|
||||||
var result = task.Result
|
|
||||||
if result != nil {
|
|
||||||
resultMap = maps.Map{
|
|
||||||
"isOk": result.IsOk,
|
|
||||||
"error": result.Error,
|
|
||||||
"response": result.Response,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//var recipients = []string{}
|
|
||||||
var user = ""
|
|
||||||
var instanceMap maps.Map
|
|
||||||
if task.MessageRecipient != nil {
|
|
||||||
user = task.MessageRecipient.User
|
|
||||||
if task.MessageRecipient.MessageMediaInstance != nil {
|
|
||||||
instanceMap = maps.Map{
|
|
||||||
"id": task.MessageRecipient.MessageMediaInstance.Id,
|
|
||||||
"name": task.MessageRecipient.MessageMediaInstance.Name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
taskMaps = append(taskMaps, maps.Map{
|
|
||||||
"id": task.Id,
|
|
||||||
"subject": task.Subject,
|
|
||||||
"body": task.Body,
|
|
||||||
"createdTime": timeutil.FormatTime("Y-m-d H:i:s", task.CreatedAt),
|
|
||||||
"result": resultMap,
|
|
||||||
"status": task.Status,
|
|
||||||
"user": user,
|
|
||||||
"instance": instanceMap,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["tasks"] = taskMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package tasks
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
|
||||||
"github.com/iwind/TeaGo"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
TeaGo.BeforeStart(func(server *TeaGo.Server) {
|
|
||||||
server.
|
|
||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeAdmin)).
|
|
||||||
Data("teaMenu", "admins").
|
|
||||||
Data("teaSubMenu", "recipients").
|
|
||||||
Prefix("/admins/recipients/tasks").
|
|
||||||
Get("", new(IndexAction)).
|
|
||||||
Post("/taskInfo", new(TaskInfoAction)).
|
|
||||||
Post("/delete", new(DeleteAction)).
|
|
||||||
EndAll()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package tasks
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type TaskInfoAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TaskInfoAction) Init() {
|
|
||||||
this.Nav("", "", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TaskInfoAction) RunPost(params struct {
|
|
||||||
TaskId int64
|
|
||||||
}) {
|
|
||||||
resp, err := this.RPC().MessageTaskRPC().FindEnabledMessageTask(this.AdminContext(), &pb.FindEnabledMessageTaskRequest{MessageTaskId: params.TaskId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp.MessageTask == nil {
|
|
||||||
this.NotFound("messageTask", params.TaskId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
result := resp.MessageTask.Result
|
|
||||||
this.Data["status"] = resp.MessageTask.Status
|
|
||||||
this.Data["result"] = maps.Map{
|
|
||||||
"isOk": result.IsOk,
|
|
||||||
"response": result.Response,
|
|
||||||
"error": result.Error,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type TestAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TestAction) Init() {
|
|
||||||
this.Nav("", "", "test")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TestAction) RunGet(params struct {
|
|
||||||
RecipientId int64
|
|
||||||
}) {
|
|
||||||
recipientResp, err := this.RPC().MessageRecipientRPC().FindEnabledMessageRecipient(this.AdminContext(), &pb.FindEnabledMessageRecipientRequest{MessageRecipientId: params.RecipientId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
recipient := recipientResp.MessageRecipient
|
|
||||||
if recipient == nil || recipient.Admin == nil || recipient.MessageMediaInstance == nil {
|
|
||||||
this.NotFound("messageRecipient", params.RecipientId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["recipient"] = maps.Map{
|
|
||||||
"id": recipient.Id,
|
|
||||||
"admin": maps.Map{
|
|
||||||
"id": recipient.Admin.Id,
|
|
||||||
"fullname": recipient.Admin.Fullname,
|
|
||||||
"username": recipient.Admin.Username,
|
|
||||||
},
|
|
||||||
"instance": maps.Map{
|
|
||||||
"id": recipient.MessageMediaInstance.Id,
|
|
||||||
"name": recipient.MessageMediaInstance.Name,
|
|
||||||
"description": recipient.MessageMediaInstance.Description,
|
|
||||||
},
|
|
||||||
"user": recipient.User,
|
|
||||||
}
|
|
||||||
|
|
||||||
instanceResp, err := this.RPC().MessageMediaInstanceRPC().FindEnabledMessageMediaInstance(this.AdminContext(), &pb.FindEnabledMessageMediaInstanceRequest{MessageMediaInstanceId: recipient.MessageMediaInstance.Id})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
instance := instanceResp.MessageMediaInstance
|
|
||||||
if instance == nil || instance.MessageMedia == nil {
|
|
||||||
this.NotFound("messageMediaInstance", recipient.MessageMediaInstance.Id)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaParams := maps.Map{}
|
|
||||||
if len(instance.ParamsJSON) > 0 {
|
|
||||||
err = json.Unmarshal(instance.ParamsJSON, &mediaParams)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["instance"] = maps.Map{
|
|
||||||
"id": instance.Id,
|
|
||||||
"isOn": instance.IsOn,
|
|
||||||
"media": maps.Map{
|
|
||||||
"type": instance.MessageMedia.Type,
|
|
||||||
"name": instance.MessageMedia.Name,
|
|
||||||
"userDescription": instance.MessageMedia.UserDescription,
|
|
||||||
},
|
|
||||||
"description": instance.Description,
|
|
||||||
"params": mediaParams,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *TestAction) RunPost(params struct {
|
|
||||||
InstanceId int64
|
|
||||||
Subject string
|
|
||||||
Body string
|
|
||||||
User string
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
params.Must.
|
|
||||||
Field("instanceId", params.InstanceId).
|
|
||||||
Gt(0, "请选择正确的媒介")
|
|
||||||
|
|
||||||
resp, err := this.RPC().MessageTaskRPC().CreateMessageTask(this.AdminContext(), &pb.CreateMessageTaskRequest{
|
|
||||||
RecipientId: 0,
|
|
||||||
InstanceId: params.InstanceId,
|
|
||||||
User: params.User,
|
|
||||||
Subject: params.Subject,
|
|
||||||
Body: params.Body,
|
|
||||||
IsPrimary: true,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.Data["taskId"] = resp.MessageTaskId
|
|
||||||
|
|
||||||
defer this.CreateLogInfo(codes.MessageTask_LogCreateTestingMessageTask, resp.MessageTaskId)
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
package recipients
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UpdateAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdateAction) Init() {
|
|
||||||
this.Nav("", "", "update")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdateAction) RunGet(params struct {
|
|
||||||
RecipientId int64
|
|
||||||
}) {
|
|
||||||
recipientResp, err := this.RPC().MessageRecipientRPC().FindEnabledMessageRecipient(this.AdminContext(), &pb.FindEnabledMessageRecipientRequest{MessageRecipientId: params.RecipientId})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
recipient := recipientResp.MessageRecipient
|
|
||||||
if recipient == nil || recipient.Admin == nil || recipient.MessageMediaInstance == nil {
|
|
||||||
this.NotFound("messageRecipient", params.RecipientId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeFromHour = ""
|
|
||||||
var timeFromMinute = ""
|
|
||||||
var timeFromSecond = ""
|
|
||||||
|
|
||||||
if len(recipient.TimeFrom) > 0 {
|
|
||||||
var pieces = strings.Split(recipient.TimeFrom, ":")
|
|
||||||
timeFromHour = pieces[0]
|
|
||||||
timeFromMinute = pieces[1]
|
|
||||||
timeFromSecond = pieces[2]
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeToHour = ""
|
|
||||||
var timeToMinute = ""
|
|
||||||
var timeToSecond = ""
|
|
||||||
if len(recipient.TimeTo) > 0 {
|
|
||||||
var pieces = strings.Split(recipient.TimeTo, ":")
|
|
||||||
timeToHour = pieces[0]
|
|
||||||
timeToMinute = pieces[1]
|
|
||||||
timeToSecond = pieces[2]
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["recipient"] = maps.Map{
|
|
||||||
"id": recipient.Id,
|
|
||||||
"admin": maps.Map{
|
|
||||||
"id": recipient.Admin.Id,
|
|
||||||
"fullname": recipient.Admin.Fullname,
|
|
||||||
"username": recipient.Admin.Username,
|
|
||||||
},
|
|
||||||
"groups": recipient.MessageRecipientGroups,
|
|
||||||
"isOn": recipient.IsOn,
|
|
||||||
"instance": maps.Map{
|
|
||||||
"id": recipient.MessageMediaInstance.Id,
|
|
||||||
"name": recipient.MessageMediaInstance.Name,
|
|
||||||
},
|
|
||||||
"user": recipient.User,
|
|
||||||
"description": recipient.Description,
|
|
||||||
"timeFromHour": timeFromHour,
|
|
||||||
"timeFromMinute": timeFromMinute,
|
|
||||||
"timeFromSecond": timeFromSecond,
|
|
||||||
"timeToHour": timeToHour,
|
|
||||||
"timeToMinute": timeToMinute,
|
|
||||||
"timeToSecond": timeToSecond,
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *UpdateAction) RunPost(params struct {
|
|
||||||
RecipientId int64
|
|
||||||
|
|
||||||
AdminId int64
|
|
||||||
User string
|
|
||||||
InstanceId int64
|
|
||||||
|
|
||||||
GroupIds string
|
|
||||||
Description string
|
|
||||||
IsOn bool
|
|
||||||
|
|
||||||
TimeFromHour string
|
|
||||||
TimeFromMinute string
|
|
||||||
TimeFromSecond string
|
|
||||||
|
|
||||||
TimeToHour string
|
|
||||||
TimeToMinute string
|
|
||||||
TimeToSecond string
|
|
||||||
|
|
||||||
Must *actions.Must
|
|
||||||
CSRF *actionutils.CSRF
|
|
||||||
}) {
|
|
||||||
defer this.CreateLogInfo(codes.MessageRecipient_LogUpdateMessageRecipient, params.RecipientId)
|
|
||||||
|
|
||||||
params.Must.
|
|
||||||
Field("adminId", params.AdminId).
|
|
||||||
Gt(0, "请选择系统用户").
|
|
||||||
Field("instanceId", params.InstanceId).
|
|
||||||
Gt(0, "请选择媒介")
|
|
||||||
|
|
||||||
groupIds := utils.SplitNumbers(params.GroupIds)
|
|
||||||
|
|
||||||
var digitReg = regexp.MustCompile(`^\d+$`)
|
|
||||||
|
|
||||||
var timeFrom = ""
|
|
||||||
if digitReg.MatchString(params.TimeFromHour) && digitReg.MatchString(params.TimeFromMinute) && digitReg.MatchString(params.TimeFromSecond) {
|
|
||||||
timeFrom = params.TimeFromHour + ":" + params.TimeFromMinute + ":" + params.TimeFromSecond
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeTo = ""
|
|
||||||
if digitReg.MatchString(params.TimeToHour) && digitReg.MatchString(params.TimeToMinute) && digitReg.MatchString(params.TimeToSecond) {
|
|
||||||
timeTo = params.TimeToHour + ":" + params.TimeToMinute + ":" + params.TimeToSecond
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := this.RPC().MessageRecipientRPC().UpdateMessageRecipient(this.AdminContext(), &pb.UpdateMessageRecipientRequest{
|
|
||||||
MessageRecipientId: params.RecipientId,
|
|
||||||
AdminId: params.AdminId,
|
|
||||||
MessageMediaInstanceId: params.InstanceId,
|
|
||||||
User: params.User,
|
|
||||||
MessageRecipientGroupIds: groupIds,
|
|
||||||
Description: params.Description,
|
|
||||||
IsOn: params.IsOn,
|
|
||||||
TimeFrom: timeFrom,
|
|
||||||
TimeTo: timeTo,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
||||||
"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/lists"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
clusters = append(clusters, node.SecondaryNodeClusters...)
|
clusters = append(clusters, node.SecondaryNodeClusters...)
|
||||||
var allDNSRouteMaps = map[int64][]maps.Map{} // domain id => routes
|
var allDNSRouteMaps = map[int64][]maps.Map{} // domain id => routes
|
||||||
var routeMaps = map[int64][]maps.Map{} // domain id => routes
|
var routeMaps = map[int64][]maps.Map{} // domain id => routes
|
||||||
|
var domainIds = []int64{}
|
||||||
for _, cluster := range clusters {
|
for _, cluster := range clusters {
|
||||||
dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{
|
dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
@@ -49,6 +51,13 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
var domainId = dnsInfo.DnsDomainId
|
var domainId = dnsInfo.DnsDomainId
|
||||||
|
|
||||||
|
// remove same domain
|
||||||
|
if lists.ContainsInt64(domainIds, domainId) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
domainIds = append(domainIds, domainId)
|
||||||
|
|
||||||
var domainName = dnsInfo.DnsDomainName
|
var domainName = dnsInfo.DnsDomainName
|
||||||
if len(dnsInfo.Routes) > 0 {
|
if len(dnsInfo.Routes) > 0 {
|
||||||
for _, route := range dnsInfo.Routes {
|
for _, route := range dnsInfo.Routes {
|
||||||
@@ -102,15 +111,23 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}) {
|
}) {
|
||||||
defer this.CreateLogInfo(codes.NodeDNS_LogUpdateNodeDNS, params.NodeId)
|
defer this.CreateLogInfo(codes.NodeDNS_LogUpdateNodeDNS, params.NodeId)
|
||||||
|
|
||||||
dnsRouteCodes := []string{}
|
var rawRouteCodes = []string{}
|
||||||
if len(params.DnsRoutesJSON) > 0 {
|
if len(params.DnsRoutesJSON) > 0 {
|
||||||
err := json.Unmarshal(params.DnsRoutesJSON, &dnsRouteCodes)
|
err := json.Unmarshal(params.DnsRoutesJSON, &rawRouteCodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove duplications
|
||||||
|
var dnsRouteCodes = []string{}
|
||||||
|
for _, routeCode := range rawRouteCodes {
|
||||||
|
if !lists.ContainsString(dnsRouteCodes, routeCode) {
|
||||||
|
dnsRouteCodes = append(dnsRouteCodes, routeCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_, err := this.RPC().NodeRPC().UpdateNodeDNS(this.AdminContext(), &pb.UpdateNodeDNSRequest{
|
_, err := this.RPC().NodeRPC().UpdateNodeDNS(this.AdminContext(), &pb.UpdateNodeDNSRequest{
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
IpAddr: "",
|
IpAddr: "",
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package thresholds
|
|
||||||
|
|
||||||
import (
|
|
||||||
"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/nodeconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
type IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "node", "update")
|
|
||||||
this.SecondMenu("threshold")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
|
||||||
ClusterId int64
|
|
||||||
NodeId int64
|
|
||||||
}) {
|
|
||||||
_, err := nodeutils.InitNodeInfo(this.Parent(), params.NodeId)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["nodeId"] = params.NodeId
|
|
||||||
|
|
||||||
// 列出所有阈值
|
|
||||||
thresholdsResp, err := this.RPC().NodeThresholdRPC().FindAllEnabledNodeThresholds(this.AdminContext(), &pb.FindAllEnabledNodeThresholdsRequest{
|
|
||||||
Role: "node",
|
|
||||||
NodeClusterId: params.ClusterId,
|
|
||||||
NodeId: params.NodeId,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
thresholdMaps := []maps.Map{}
|
|
||||||
for _, threshold := range thresholdsResp.NodeThresholds {
|
|
||||||
thresholdMaps = append(thresholdMaps, maps.Map{
|
|
||||||
"id": threshold.Id,
|
|
||||||
"itemName": nodeconfigs.FindNodeValueItemName(threshold.Item),
|
|
||||||
"paramName": nodeconfigs.FindNodeValueItemParamName(threshold.Item, threshold.Param),
|
|
||||||
"operatorName": nodeconfigs.FindNodeValueOperatorName(threshold.Operator),
|
|
||||||
"value": nodeconfigs.UnmarshalNodeValue(threshold.ValueJSON),
|
|
||||||
"sumMethodName": nodeconfigs.FindNodeValueSumMethodName(threshold.SumMethod),
|
|
||||||
"duration": threshold.Duration,
|
|
||||||
"durationUnitName": nodeconfigs.FindNodeValueDurationUnitName(threshold.DurationUnit),
|
|
||||||
"isOn": threshold.IsOn,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.Data["thresholds"] = thresholdMaps
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,7 @@ type IndexAction struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
func (this *IndexAction) Init() {
|
||||||
this.Nav("", "setting", "")
|
this.Nav("", "setting", "index")
|
||||||
this.SecondMenu("dns")
|
this.SecondMenu("dns")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,303 @@
|
|||||||
|
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||||
|
|
||||||
|
package dns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
|
"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 RecordsAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *RecordsAction) Init() {
|
||||||
|
this.Nav("", "setting", "records")
|
||||||
|
this.SecondMenu("dns")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *RecordsAction) RunGet(params struct {
|
||||||
|
ClusterId int64
|
||||||
|
}) {
|
||||||
|
// 集群信息
|
||||||
|
clusterResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeCluster(this.AdminContext(), &pb.FindEnabledNodeClusterRequest{NodeClusterId: params.ClusterId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var cluster = clusterResp.NodeCluster
|
||||||
|
if cluster == nil {
|
||||||
|
this.NotFound("nodeCluster", params.ClusterId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.Data["cluster"] = maps.Map{
|
||||||
|
"id": cluster.Id,
|
||||||
|
"name": cluster.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
// DNS信息
|
||||||
|
dnsResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var defaultRoute = dnsResp.DefaultRoute
|
||||||
|
var domainName = ""
|
||||||
|
var dnsMap = maps.Map{
|
||||||
|
"dnsName": dnsResp.Name,
|
||||||
|
"domainId": 0,
|
||||||
|
"domainName": "",
|
||||||
|
"providerId": 0,
|
||||||
|
"providerName": "",
|
||||||
|
"providerTypeName": "",
|
||||||
|
}
|
||||||
|
if dnsResp.Domain != nil {
|
||||||
|
domainName = dnsResp.Domain.Name
|
||||||
|
dnsMap["domainId"] = dnsResp.Domain.Id
|
||||||
|
dnsMap["domainName"] = dnsResp.Domain.Name
|
||||||
|
}
|
||||||
|
if dnsResp.Provider != nil {
|
||||||
|
dnsMap["providerId"] = dnsResp.Provider.Id
|
||||||
|
dnsMap["providerName"] = dnsResp.Provider.Name
|
||||||
|
dnsMap["providerTypeName"] = dnsResp.Provider.TypeName
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(dnsResp.CnameRecords) > 0 {
|
||||||
|
dnsMap["cnameRecords"] = dnsResp.CnameRecords
|
||||||
|
} else {
|
||||||
|
dnsMap["cnameRecords"] = []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["dnsInfo"] = dnsMap
|
||||||
|
|
||||||
|
// 未安装的节点
|
||||||
|
notInstalledNodesResp, err := this.RPC().NodeRPC().FindAllEnabledNodesDNSWithNodeClusterId(this.AdminContext(), &pb.FindAllEnabledNodesDNSWithNodeClusterIdRequest{
|
||||||
|
NodeClusterId: params.ClusterId,
|
||||||
|
IsInstalled: false,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var allNodes = notInstalledNodesResp.Nodes
|
||||||
|
|
||||||
|
// 节点DNS解析记录
|
||||||
|
nodesResp, err := this.RPC().NodeRPC().FindAllEnabledNodesDNSWithNodeClusterId(this.AdminContext(), &pb.FindAllEnabledNodesDNSWithNodeClusterIdRequest{
|
||||||
|
NodeClusterId: params.ClusterId,
|
||||||
|
IsInstalled: true,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var installedNodeIdsMap = map[int64]bool{}
|
||||||
|
for _, node := range nodesResp.Nodes {
|
||||||
|
installedNodeIdsMap[node.Id] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
allNodes = append(allNodes, nodesResp.Nodes...)
|
||||||
|
|
||||||
|
var nodeMaps = []maps.Map{}
|
||||||
|
for _, node := range allNodes {
|
||||||
|
var isInstalled = installedNodeIdsMap[node.Id]
|
||||||
|
|
||||||
|
if len(node.Routes) > 0 {
|
||||||
|
for _, route := range node.Routes {
|
||||||
|
// 检查是否已解析
|
||||||
|
var isResolved = false
|
||||||
|
if isInstalled && cluster.DnsDomainId > 0 && len(cluster.DnsName) > 0 && len(node.IpAddr) > 0 {
|
||||||
|
var recordType = "A"
|
||||||
|
if utils.IsIPv6(node.IpAddr) {
|
||||||
|
recordType = "AAAA"
|
||||||
|
}
|
||||||
|
checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{
|
||||||
|
DnsDomainId: cluster.DnsDomainId,
|
||||||
|
Name: cluster.DnsName,
|
||||||
|
Type: recordType,
|
||||||
|
Route: route.Code,
|
||||||
|
Value: node.IpAddr,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
isResolved = checkResp.IsOk
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeMaps = append(nodeMaps, maps.Map{
|
||||||
|
"id": node.Id,
|
||||||
|
"name": node.Name,
|
||||||
|
"ipAddr": node.IpAddr,
|
||||||
|
"ipAddrId": node.NodeIPAddressId,
|
||||||
|
"route": maps.Map{
|
||||||
|
"name": route.Name,
|
||||||
|
"code": route.Code,
|
||||||
|
},
|
||||||
|
"clusterId": node.NodeClusterId,
|
||||||
|
"isResolved": isResolved,
|
||||||
|
"isInstalled": isInstalled,
|
||||||
|
"isBackup": node.IsBackupForCluster || node.IsBackupForGroup,
|
||||||
|
"isOffline": node.IsOffline,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 默认线路
|
||||||
|
var isResolved = false
|
||||||
|
if isInstalled && len(defaultRoute) > 0 {
|
||||||
|
var recordType = "A"
|
||||||
|
if utils.IsIPv6(node.IpAddr) {
|
||||||
|
recordType = "AAAA"
|
||||||
|
}
|
||||||
|
checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{
|
||||||
|
DnsDomainId: cluster.DnsDomainId,
|
||||||
|
Name: cluster.DnsName,
|
||||||
|
Type: recordType,
|
||||||
|
Route: defaultRoute,
|
||||||
|
Value: node.IpAddr,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
isResolved = checkResp.IsOk
|
||||||
|
}
|
||||||
|
nodeMaps = append(nodeMaps, maps.Map{
|
||||||
|
"id": node.Id,
|
||||||
|
"name": node.Name,
|
||||||
|
"ipAddr": node.IpAddr,
|
||||||
|
"ipAddrId": node.NodeIPAddressId,
|
||||||
|
"route": maps.Map{
|
||||||
|
"name": "",
|
||||||
|
"code": "",
|
||||||
|
},
|
||||||
|
"clusterId": node.NodeClusterId,
|
||||||
|
"isResolved": isResolved,
|
||||||
|
"isInstalled": isInstalled,
|
||||||
|
"isBackup": node.IsBackupForCluster || node.IsBackupForGroup,
|
||||||
|
"isOffline": node.IsOffline,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.Data["nodes"] = nodeMaps
|
||||||
|
|
||||||
|
// 代理服务解析记录
|
||||||
|
serversResp, err := this.RPC().ServerRPC().FindAllEnabledServersDNSWithNodeClusterId(this.AdminContext(), &pb.FindAllEnabledServersDNSWithNodeClusterIdRequest{NodeClusterId: params.ClusterId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var serverMaps = []maps.Map{}
|
||||||
|
for _, server := range serversResp.Servers {
|
||||||
|
// 检查是否已解析
|
||||||
|
isResolved := false
|
||||||
|
if cluster.DnsDomainId > 0 && len(cluster.DnsName) > 0 && len(server.DnsName) > 0 && len(domainName) > 0 {
|
||||||
|
checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{
|
||||||
|
DnsDomainId: cluster.DnsDomainId,
|
||||||
|
Name: server.DnsName,
|
||||||
|
Type: "CNAME",
|
||||||
|
Value: cluster.DnsName + "." + domainName,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
isResolved = checkResp.IsOk
|
||||||
|
}
|
||||||
|
|
||||||
|
serverMaps = append(serverMaps, maps.Map{
|
||||||
|
"id": server.Id,
|
||||||
|
"name": server.Name,
|
||||||
|
"dnsName": server.DnsName,
|
||||||
|
"isResolved": isResolved,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.Data["servers"] = serverMaps
|
||||||
|
|
||||||
|
// 检查解析记录是否有变化
|
||||||
|
checkChangesResp, err := this.RPC().NodeClusterRPC().CheckNodeClusterDNSChanges(this.AdminContext(), &pb.CheckNodeClusterDNSChangesRequest{NodeClusterId: params.ClusterId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.Data["dnsHasChanges"] = checkChangesResp.IsChanged
|
||||||
|
|
||||||
|
// 需要解决的问题
|
||||||
|
issuesResp, err := this.RPC().DNSRPC().FindAllDNSIssues(this.AdminContext(), &pb.FindAllDNSIssuesRequest{
|
||||||
|
NodeClusterId: params.ClusterId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var issueMaps = []maps.Map{}
|
||||||
|
for _, issue := range issuesResp.Issues {
|
||||||
|
issueMaps = append(issueMaps, maps.Map{
|
||||||
|
"target": issue.Target,
|
||||||
|
"targetId": issue.TargetId,
|
||||||
|
"type": issue.Type,
|
||||||
|
"description": issue.Description,
|
||||||
|
"params": issue.Params,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.Data["issues"] = issueMaps
|
||||||
|
|
||||||
|
// 当前正在执行的任务
|
||||||
|
resp, err := this.RPC().DNSTaskRPC().FindAllDoingDNSTasks(this.AdminContext(), &pb.FindAllDoingDNSTasksRequest{
|
||||||
|
NodeClusterId: params.ClusterId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var taskMaps = []maps.Map{}
|
||||||
|
for _, task := range resp.DnsTasks {
|
||||||
|
var clusterMap maps.Map = nil
|
||||||
|
var nodeMap maps.Map = nil
|
||||||
|
var serverMap maps.Map = nil
|
||||||
|
var domainMap maps.Map = nil
|
||||||
|
|
||||||
|
if task.NodeCluster != nil {
|
||||||
|
clusterMap = maps.Map{
|
||||||
|
"id": task.NodeCluster.Id,
|
||||||
|
"name": task.NodeCluster.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if task.Node != nil {
|
||||||
|
nodeMap = maps.Map{
|
||||||
|
"id": task.Node.Id,
|
||||||
|
"name": task.Node.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if task.Server != nil {
|
||||||
|
serverMap = maps.Map{
|
||||||
|
"id": task.Server.Id,
|
||||||
|
"name": task.Server.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if task.DnsDomain != nil {
|
||||||
|
domainMap = maps.Map{
|
||||||
|
"id": task.DnsDomain.Id,
|
||||||
|
"name": task.DnsDomain.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taskMaps = append(taskMaps, maps.Map{
|
||||||
|
"id": task.Id,
|
||||||
|
"type": task.Type,
|
||||||
|
"isDone": task.IsDone,
|
||||||
|
"isOk": task.IsOk,
|
||||||
|
"error": task.Error,
|
||||||
|
"updatedTime": timeutil.FormatTime("Y-m-d H:i:s", task.UpdatedAt),
|
||||||
|
"cluster": clusterMap,
|
||||||
|
"node": nodeMap,
|
||||||
|
"server": serverMap,
|
||||||
|
"domain": domainMap,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.Data["tasks"] = taskMaps
|
||||||
|
|
||||||
|
this.Show()
|
||||||
|
}
|
||||||
@@ -43,13 +43,19 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["config"] = config
|
this.Data["config"] = config
|
||||||
|
|
||||||
|
var httpAllDomainMismatchActionCode = serverconfigs.DomainMismatchActionPage
|
||||||
var httpAllDomainMismatchActionContentHTML string
|
var httpAllDomainMismatchActionContentHTML string
|
||||||
var httpAllDomainMismatchActionStatusCode = "404"
|
var httpAllDomainMismatchActionStatusCode = "404"
|
||||||
if config.HTTPAll.DomainMismatchAction != nil && config.HTTPAll.DomainMismatchAction.Options != nil {
|
if config.HTTPAll.DomainMismatchAction != nil {
|
||||||
httpAllDomainMismatchActionContentHTML = config.HTTPAll.DomainMismatchAction.Options.GetString("contentHTML")
|
httpAllDomainMismatchActionCode = config.HTTPAll.DomainMismatchAction.Code
|
||||||
var statusCode = config.HTTPAll.DomainMismatchAction.Options.GetInt("statusCode")
|
|
||||||
if statusCode > 0 {
|
if config.HTTPAll.DomainMismatchAction.Options != nil {
|
||||||
httpAllDomainMismatchActionStatusCode = types.String(statusCode)
|
// 即使是非 page 处理动作,也读取这些内容,以便于在切换到 page 时,可以顺利读取到先前的设置
|
||||||
|
httpAllDomainMismatchActionContentHTML = config.HTTPAll.DomainMismatchAction.Options.GetString("contentHTML")
|
||||||
|
var statusCode = config.HTTPAll.DomainMismatchAction.Options.GetInt("statusCode")
|
||||||
|
if statusCode > 0 {
|
||||||
|
httpAllDomainMismatchActionStatusCode = types.String(statusCode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
httpAllDomainMismatchActionContentHTML = `<!DOCTYPE html>
|
httpAllDomainMismatchActionContentHTML = `<!DOCTYPE html>
|
||||||
@@ -73,6 +79,7 @@ p { color: grey; }
|
|||||||
</html>`
|
</html>`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.Data["httpAllDomainMismatchActionCode"] = httpAllDomainMismatchActionCode
|
||||||
this.Data["httpAllDomainMismatchActionContentHTML"] = httpAllDomainMismatchActionContentHTML
|
this.Data["httpAllDomainMismatchActionContentHTML"] = httpAllDomainMismatchActionContentHTML
|
||||||
this.Data["httpAllDomainMismatchActionStatusCode"] = httpAllDomainMismatchActionStatusCode
|
this.Data["httpAllDomainMismatchActionStatusCode"] = httpAllDomainMismatchActionStatusCode
|
||||||
|
|
||||||
@@ -83,6 +90,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
ClusterId int64
|
ClusterId int64
|
||||||
|
|
||||||
HttpAllMatchDomainStrictly bool
|
HttpAllMatchDomainStrictly bool
|
||||||
|
HttpAllDomainMismatchActionCode string
|
||||||
HttpAllDomainMismatchActionContentHTML string
|
HttpAllDomainMismatchActionContentHTML string
|
||||||
HttpAllDomainMismatchActionStatusCode string
|
HttpAllDomainMismatchActionStatusCode string
|
||||||
HttpAllAllowMismatchDomainsJSON []byte
|
HttpAllAllowMismatchDomainsJSON []byte
|
||||||
@@ -90,11 +98,16 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
HttpAllDefaultDomain string
|
HttpAllDefaultDomain string
|
||||||
HttpAllNodeIPPageHTML string
|
HttpAllNodeIPPageHTML string
|
||||||
HttpAllNodeIPShowPage bool
|
HttpAllNodeIPShowPage bool
|
||||||
|
HttpAllEnableServerAddrVariable bool
|
||||||
|
|
||||||
HttpAllServerName string
|
HttpAllDomainAuditingIsOn bool
|
||||||
HttpAllSupportsLowVersionHTTP bool
|
HttpAllDomainAuditingPrompt string
|
||||||
HttpAllMatchCertFromAllServers bool
|
|
||||||
HttpAllForceLnRequest bool
|
HttpAllServerName string
|
||||||
|
HttpAllSupportsLowVersionHTTP bool
|
||||||
|
HttpAllMatchCertFromAllServers bool
|
||||||
|
HttpAllForceLnRequest bool
|
||||||
|
HttpAllLnRequestSchedulingMethod string
|
||||||
|
|
||||||
HttpAccessLogIsOn bool
|
HttpAccessLogIsOn bool
|
||||||
HttpAccessLogEnableRequestHeaders bool
|
HttpAccessLogEnableRequestHeaders bool
|
||||||
@@ -109,6 +122,11 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
PerformanceAutoWriteTimeout bool
|
PerformanceAutoWriteTimeout bool
|
||||||
PerformanceDebug bool
|
PerformanceDebug bool
|
||||||
|
|
||||||
|
// TCP端口设置
|
||||||
|
TcpAllPortRangeMin int
|
||||||
|
TcpAllPortRangeMax int
|
||||||
|
TcpAllDenyPorts []int
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
CSRF *actionutils.CSRF
|
CSRF *actionutils.CSRF
|
||||||
}) {
|
}) {
|
||||||
@@ -139,7 +157,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
|
|
||||||
config.HTTPAll.MatchDomainStrictly = params.HttpAllMatchDomainStrictly
|
config.HTTPAll.MatchDomainStrictly = params.HttpAllMatchDomainStrictly
|
||||||
config.HTTPAll.DomainMismatchAction = &serverconfigs.DomainMismatchAction{
|
config.HTTPAll.DomainMismatchAction = &serverconfigs.DomainMismatchAction{
|
||||||
Code: serverconfigs.DomainMismatchActionPage,
|
Code: params.HttpAllDomainMismatchActionCode,
|
||||||
Options: maps.Map{
|
Options: maps.Map{
|
||||||
"statusCode": domainMisMatchStatusCode,
|
"statusCode": domainMisMatchStatusCode,
|
||||||
"contentHTML": params.HttpAllDomainMismatchActionContentHTML,
|
"contentHTML": params.HttpAllDomainMismatchActionContentHTML,
|
||||||
@@ -162,11 +180,16 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
config.HTTPAll.NodeIPShowPage = params.HttpAllNodeIPShowPage
|
config.HTTPAll.NodeIPShowPage = params.HttpAllNodeIPShowPage
|
||||||
config.HTTPAll.NodeIPPageHTML = params.HttpAllNodeIPPageHTML
|
config.HTTPAll.NodeIPPageHTML = params.HttpAllNodeIPPageHTML
|
||||||
|
|
||||||
|
config.HTTPAll.DomainAuditingIsOn = params.HttpAllDomainAuditingIsOn
|
||||||
|
config.HTTPAll.DomainAuditingPrompt = params.HttpAllDomainAuditingPrompt
|
||||||
|
|
||||||
// HTTP All
|
// HTTP All
|
||||||
config.HTTPAll.ServerName = params.HttpAllServerName
|
config.HTTPAll.ServerName = params.HttpAllServerName
|
||||||
config.HTTPAll.SupportsLowVersionHTTP = params.HttpAllSupportsLowVersionHTTP
|
config.HTTPAll.SupportsLowVersionHTTP = params.HttpAllSupportsLowVersionHTTP
|
||||||
config.HTTPAll.MatchCertFromAllServers = params.HttpAllMatchCertFromAllServers
|
config.HTTPAll.MatchCertFromAllServers = params.HttpAllMatchCertFromAllServers
|
||||||
config.HTTPAll.ForceLnRequest = params.HttpAllForceLnRequest
|
config.HTTPAll.ForceLnRequest = params.HttpAllForceLnRequest
|
||||||
|
config.HTTPAll.LnRequestSchedulingMethod = params.HttpAllLnRequestSchedulingMethod
|
||||||
|
config.HTTPAll.EnableServerAddrVariable = params.HttpAllEnableServerAddrVariable
|
||||||
|
|
||||||
// 访问日志
|
// 访问日志
|
||||||
config.HTTPAccessLog.IsOn = params.HttpAccessLogIsOn
|
config.HTTPAccessLog.IsOn = params.HttpAccessLogIsOn
|
||||||
@@ -179,6 +202,23 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
// 日志
|
// 日志
|
||||||
config.Log.RecordServerError = params.LogRecordServerError
|
config.Log.RecordServerError = params.LogRecordServerError
|
||||||
|
|
||||||
|
// TCP
|
||||||
|
if params.TcpAllPortRangeMin < 1024 {
|
||||||
|
params.TcpAllPortRangeMin = 1024
|
||||||
|
}
|
||||||
|
if params.TcpAllPortRangeMax > 65534 {
|
||||||
|
params.TcpAllPortRangeMax = 65534
|
||||||
|
} else if params.TcpAllPortRangeMax < 1024 {
|
||||||
|
params.TcpAllPortRangeMax = 1024
|
||||||
|
}
|
||||||
|
if params.TcpAllPortRangeMin > params.TcpAllPortRangeMax {
|
||||||
|
params.TcpAllPortRangeMin, params.TcpAllPortRangeMax = params.TcpAllPortRangeMax, params.TcpAllPortRangeMin
|
||||||
|
}
|
||||||
|
|
||||||
|
config.TCPAll.DenyPorts = params.TcpAllDenyPorts
|
||||||
|
config.TCPAll.PortRangeMin = params.TcpAllPortRangeMin
|
||||||
|
config.TCPAll.PortRangeMax = params.TcpAllPortRangeMax
|
||||||
|
|
||||||
// 性能
|
// 性能
|
||||||
config.Performance.AutoReadTimeout = params.PerformanceAutoReadTimeout
|
config.Performance.AutoReadTimeout = params.PerformanceAutoReadTimeout
|
||||||
config.Performance.AutoWriteTimeout = params.PerformanceAutoWriteTimeout
|
config.Performance.AutoWriteTimeout = params.PerformanceAutoWriteTimeout
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
"clock": clockConfig,
|
"clock": clockConfig,
|
||||||
"autoRemoteStart": cluster.AutoRemoteStart,
|
"autoRemoteStart": cluster.AutoRemoteStart,
|
||||||
"autoInstallNftables": cluster.AutoInstallNftables,
|
"autoInstallNftables": cluster.AutoInstallNftables,
|
||||||
|
"autoSystemTuning": cluster.AutoSystemTuning,
|
||||||
"sshParams": sshParams,
|
"sshParams": sshParams,
|
||||||
"domainName": fullDomainName,
|
"domainName": fullDomainName,
|
||||||
}
|
}
|
||||||
@@ -139,6 +140,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
ClockCheckChrony bool
|
ClockCheckChrony bool
|
||||||
AutoRemoteStart bool
|
AutoRemoteStart bool
|
||||||
AutoInstallNftables bool
|
AutoInstallNftables bool
|
||||||
|
AutoSystemTuning bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -193,6 +195,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
ClockJSON: clockConfigJSON,
|
ClockJSON: clockConfigJSON,
|
||||||
AutoRemoteStart: params.AutoRemoteStart,
|
AutoRemoteStart: params.AutoRemoteStart,
|
||||||
AutoInstallNftables: params.AutoInstallNftables,
|
AutoInstallNftables: params.AutoInstallNftables,
|
||||||
|
AutoSystemTuning: params.AutoSystemTuning,
|
||||||
SshParamsJSON: sshParamsJSON,
|
SshParamsJSON: sshParamsJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ func init() {
|
|||||||
// DNS
|
// DNS
|
||||||
Prefix("/clusters/cluster/settings/dns").
|
Prefix("/clusters/cluster/settings/dns").
|
||||||
GetPost("", new(dns.IndexAction)).
|
GetPost("", new(dns.IndexAction)).
|
||||||
|
Get("/records", new(dns.RecordsAction)).
|
||||||
Post("/randomName", new(dns.RandomNameAction)).
|
Post("/randomName", new(dns.RandomNameAction)).
|
||||||
|
|
||||||
// 系统服务设置
|
// 系统服务设置
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
InstallDir string
|
InstallDir string
|
||||||
SystemdServiceIsOn bool
|
SystemdServiceIsOn bool
|
||||||
AutoInstallNftables bool
|
AutoInstallNftables bool
|
||||||
|
AutoSystemTuning bool
|
||||||
|
|
||||||
// DNS相关
|
// DNS相关
|
||||||
DnsDomainId int64
|
DnsDomainId int64
|
||||||
@@ -132,6 +133,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
SystemServicesJSON: systemServicesJSON,
|
SystemServicesJSON: systemServicesJSON,
|
||||||
GlobalServerConfigJSON: globalServerConfigJSON,
|
GlobalServerConfigJSON: globalServerConfigJSON,
|
||||||
AutoInstallNftables: params.AutoInstallNftables,
|
AutoInstallNftables: params.AutoInstallNftables,
|
||||||
|
AutoSystemTuning: params.AutoSystemTuning,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
|
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils/sizes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/lists"
|
"github.com/iwind/TeaGo/lists"
|
||||||
@@ -19,6 +18,7 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CheckDiskPartitions 检查服务器磁盘空间
|
// CheckDiskPartitions 检查服务器磁盘空间
|
||||||
@@ -47,9 +47,17 @@ func CheckDiskPartitions(thresholdPercent float64) (path string, usage uint64, u
|
|||||||
if p.Fstype != rootFS {
|
if p.Fstype != rootFS {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// skip some specified partitions on macOS
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
|
if strings.Contains(p.Mountpoint, "/Developer/") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stat, _ := disk.Usage(p.Mountpoint)
|
stat, _ := disk.Usage(p.Mountpoint)
|
||||||
if stat != nil {
|
if stat != nil {
|
||||||
if stat.Used < 2*uint64(sizes.G) {
|
if stat.Used < (5<<30) || stat.Free > (100<<30) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if stat.UsedPercent > thresholdPercent {
|
if stat.UsedPercent > thresholdPercent {
|
||||||
|
|||||||
@@ -154,17 +154,6 @@ func (this *IndexAction) RunPost(params struct{}) {
|
|||||||
"version": "",
|
"version": "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if resp.MonitorNodeUpgradeInfo != nil {
|
|
||||||
this.Data["monitorNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": resp.MonitorNodeUpgradeInfo.CountNodes,
|
|
||||||
"version": resp.MonitorNodeUpgradeInfo.NewVersion,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.Data["monitorNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": 0,
|
|
||||||
"version": "",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resp.ApiNodeUpgradeInfo != nil {
|
if resp.ApiNodeUpgradeInfo != nil {
|
||||||
this.Data["apiNodeUpgradeInfo"] = maps.Map{
|
this.Data["apiNodeUpgradeInfo"] = maps.Map{
|
||||||
"count": resp.ApiNodeUpgradeInfo.CountNodes,
|
"count": resp.ApiNodeUpgradeInfo.CountNodes,
|
||||||
@@ -176,39 +165,6 @@ func (this *IndexAction) RunPost(params struct{}) {
|
|||||||
"version": "",
|
"version": "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if resp.UserNodeUpgradeInfo != nil {
|
|
||||||
this.Data["userNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": resp.UserNodeUpgradeInfo.CountNodes,
|
|
||||||
"version": resp.UserNodeUpgradeInfo.NewVersion,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.Data["userNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": 0,
|
|
||||||
"version": 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resp.AuthorityNodeUpgradeInfo != nil {
|
|
||||||
this.Data["authorityNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": resp.AuthorityNodeUpgradeInfo.CountNodes,
|
|
||||||
"version": resp.AuthorityNodeUpgradeInfo.NewVersion,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.Data["authorityNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": 0,
|
|
||||||
"version": "",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resp.NsNodeUpgradeInfo != nil {
|
|
||||||
this.Data["nsNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": resp.NsNodeUpgradeInfo.CountNodes,
|
|
||||||
"version": resp.NsNodeUpgradeInfo.NewVersion,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.Data["nsNodeUpgradeInfo"] = maps.Map{
|
|
||||||
"count": 0,
|
|
||||||
"version": "",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 域名排行
|
// 域名排行
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ package log
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
"github.com/tealeg/xlsx/v3"
|
"github.com/tealeg/xlsx/v3"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ExportExcelAction struct {
|
type ExportExcelAction struct {
|
||||||
@@ -65,23 +65,11 @@ func (this *ExportExcelAction) RunGet(params struct {
|
|||||||
for _, log := range logsResp.Logs {
|
for _, log := range logsResp.Logs {
|
||||||
var regionName = ""
|
var regionName = ""
|
||||||
var ispName = ""
|
var ispName = ""
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: log.Ip})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if regionResp.IpRegion != nil {
|
|
||||||
regionName = regionResp.IpRegion.Summary
|
|
||||||
|
|
||||||
// remove isp from regionName
|
var ipRegion = iplibrary.LookupIP(log.Ip)
|
||||||
var index = strings.LastIndex(regionName, "|")
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
if index > 0 {
|
regionName = ipRegion.RegionSummary()
|
||||||
regionName = regionName[:index]
|
ispName = ipRegion.ProviderName()
|
||||||
}
|
|
||||||
|
|
||||||
if len(regionResp.IpRegion.Isp) > 0 {
|
|
||||||
ispName = regionResp.IpRegion.Isp
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var row = sheet.AddRow()
|
var row = sheet.AddRow()
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package log
|
|||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
@@ -84,14 +85,10 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
var logMaps = []maps.Map{}
|
var logMaps = []maps.Map{}
|
||||||
for _, log := range logsResp.Logs {
|
for _, log := range logsResp.Logs {
|
||||||
regionName := ""
|
var regionName = ""
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: log.Ip})
|
var ipRegion = iplibrary.LookupIP(log.Ip)
|
||||||
if err != nil {
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
this.ErrorPage(err)
|
regionName = ipRegion.Summary()
|
||||||
return
|
|
||||||
}
|
|
||||||
if regionResp.IpRegion != nil {
|
|
||||||
regionName = regionResp.IpRegion.Summary
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logMaps = append(logMaps, maps.Map{
|
logMaps = append(logMaps, maps.Map{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -43,6 +44,14 @@ func (this *AddServerNamePopupAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 去除端口
|
||||||
|
if regexp.MustCompile(`:\d+$`).MatchString(serverName) {
|
||||||
|
host, _, err := net.SplitHostPort(serverName)
|
||||||
|
if err == nil && len(host) > 0 {
|
||||||
|
serverName = host
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("serverName", serverName).
|
Field("serverName", serverName).
|
||||||
Require("请输入域名")
|
Require("请输入域名")
|
||||||
@@ -72,6 +81,14 @@ func (this *AddServerNamePopupAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 去除端口
|
||||||
|
if regexp.MustCompile(`:\d+$`).MatchString(serverName) {
|
||||||
|
host, _, err := net.SplitHostPort(serverName)
|
||||||
|
if err == nil && len(host) > 0 {
|
||||||
|
serverName = host
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 转成小写
|
// 转成小写
|
||||||
serverName = strings.ToLower(serverName)
|
serverName = strings.ToLower(serverName)
|
||||||
|
|
||||||
|
|||||||
@@ -17,12 +17,16 @@ func (this *IndexAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
func (this *IndexAction) RunGet(params struct {
|
||||||
UserId int64
|
UserId int64
|
||||||
Type string
|
Type string
|
||||||
Keyword string
|
Keyword string
|
||||||
|
UserType string
|
||||||
}) {
|
}) {
|
||||||
this.Data["type"] = params.Type
|
this.Data["type"] = params.Type
|
||||||
this.Data["keyword"] = params.Keyword
|
this.Data["keyword"] = params.Keyword
|
||||||
|
this.Data["userType"] = params.UserType
|
||||||
|
|
||||||
|
var userOnly = params.UserId > 0 || params.UserType == "user"
|
||||||
|
|
||||||
// 当前用户
|
// 当前用户
|
||||||
this.Data["searchingUserId"] = params.UserId
|
this.Data["searchingUserId"] = params.UserId
|
||||||
@@ -58,8 +62,9 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
{
|
{
|
||||||
// all
|
// all
|
||||||
resp, err := this.RPC().ACMETaskRPC().CountAllEnabledACMETasks(this.AdminContext(), &pb.CountAllEnabledACMETasksRequest{
|
resp, err := this.RPC().ACMETaskRPC().CountAllEnabledACMETasks(this.AdminContext(), &pb.CountAllEnabledACMETasksRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -72,6 +77,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
IsAvailable: true,
|
IsAvailable: true,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -84,6 +90,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
IsExpired: true,
|
IsExpired: true,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -96,6 +103,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
ExpiringDays: 7,
|
ExpiringDays: 7,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -108,6 +116,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
ExpiringDays: 30,
|
ExpiringDays: 30,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -130,10 +139,11 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
case "":
|
case "":
|
||||||
page = this.NewPage(countAll)
|
page = this.NewPage(countAll)
|
||||||
tasksResp, err = this.RPC().ACMETaskRPC().ListEnabledACMETasks(this.AdminContext(), &pb.ListEnabledACMETasksRequest{
|
tasksResp, err = this.RPC().ACMETaskRPC().ListEnabledACMETasks(this.AdminContext(), &pb.ListEnabledACMETasksRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "available":
|
case "available":
|
||||||
page = this.NewPage(countAvailable)
|
page = this.NewPage(countAvailable)
|
||||||
@@ -143,6 +153,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "expired":
|
case "expired":
|
||||||
page = this.NewPage(countExpired)
|
page = this.NewPage(countExpired)
|
||||||
@@ -152,6 +163,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "7days":
|
case "7days":
|
||||||
page = this.NewPage(count7Days)
|
page = this.NewPage(count7Days)
|
||||||
@@ -161,6 +173,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "30days":
|
case "30days":
|
||||||
page = this.NewPage(count30Days)
|
page = this.NewPage(count30Days)
|
||||||
@@ -170,14 +183,16 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
page = this.NewPage(countAll)
|
page = this.NewPage(countAll)
|
||||||
tasksResp, err = this.RPC().ACMETaskRPC().ListEnabledACMETasks(this.AdminContext(), &pb.ListEnabledACMETasksRequest{
|
tasksResp, err = this.RPC().ACMETaskRPC().ListEnabledACMETasks(this.AdminContext(), &pb.ListEnabledACMETasksRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
Offset: page.Offset,
|
UserOnly: userOnly,
|
||||||
Size: page.Size,
|
Offset: page.Offset,
|
||||||
|
Size: page.Size,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -242,6 +257,23 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// user
|
||||||
|
userResp, err := this.RPC().ACMETaskRPC().FindACMETaskUser(this.AdminContext(), &pb.FindACMETaskUserRequest{AcmeTaskId: task.Id})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var taskUserMap = maps.Map{
|
||||||
|
"id": 0,
|
||||||
|
}
|
||||||
|
if userResp.User != nil {
|
||||||
|
taskUserMap = maps.Map{
|
||||||
|
"id": userResp.User.Id,
|
||||||
|
"username": userResp.User.Username,
|
||||||
|
"fullname": userResp.User.Fullname,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
taskMaps = append(taskMaps, maps.Map{
|
taskMaps = append(taskMaps, maps.Map{
|
||||||
"id": task.Id,
|
"id": task.Id,
|
||||||
"authType": task.AuthType,
|
"authType": task.AuthType,
|
||||||
@@ -257,6 +289,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
"autoRenew": task.AutoRenew,
|
"autoRenew": task.AutoRenew,
|
||||||
"cert": certMap,
|
"cert": certMap,
|
||||||
"log": logMap,
|
"log": logMap,
|
||||||
|
"user": taskUserMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["tasks"] = taskMaps
|
this.Data["tasks"] = taskMaps
|
||||||
|
|||||||
@@ -19,13 +19,19 @@ func (this *IndexAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
func (this *IndexAction) RunGet(params struct {
|
||||||
UserId int64
|
UserId int64
|
||||||
Type string
|
Type string // [empty] | ca | 7days | ...
|
||||||
Keyword string
|
Keyword string
|
||||||
|
UserType string
|
||||||
}) {
|
}) {
|
||||||
this.Data["type"] = params.Type
|
this.Data["type"] = params.Type
|
||||||
this.Data["keyword"] = params.Keyword
|
this.Data["keyword"] = params.Keyword
|
||||||
|
|
||||||
|
if params.UserId > 0 {
|
||||||
|
params.UserType = "user"
|
||||||
|
}
|
||||||
|
this.Data["userType"] = params.UserType
|
||||||
|
|
||||||
// 当前用户
|
// 当前用户
|
||||||
this.Data["searchingUserId"] = params.UserId
|
this.Data["searchingUserId"] = params.UserId
|
||||||
var userMap = maps.Map{
|
var userMap = maps.Map{
|
||||||
@@ -57,12 +63,15 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
var count7Days int64
|
var count7Days int64
|
||||||
var count30Days int64
|
var count30Days int64
|
||||||
|
|
||||||
|
var userOnly = params.UserType == "user" || params.UserId > 0
|
||||||
|
|
||||||
// 计算数量
|
// 计算数量
|
||||||
{
|
{
|
||||||
// all
|
// all
|
||||||
resp, err := this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
resp, err := this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -72,9 +81,10 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
|
|
||||||
// CA
|
// CA
|
||||||
resp, err = this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
resp, err = this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
IsCA: true,
|
IsCA: true,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -87,6 +97,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
IsAvailable: true,
|
IsAvailable: true,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -99,6 +110,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
IsExpired: true,
|
IsExpired: true,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -111,6 +123,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
ExpiringDays: 7,
|
ExpiringDays: 7,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -123,6 +136,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
ExpiringDays: 30,
|
ExpiringDays: 30,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -146,19 +160,21 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
case "":
|
case "":
|
||||||
page = this.NewPage(countAll)
|
page = this.NewPage(countAll)
|
||||||
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "ca":
|
case "ca":
|
||||||
page = this.NewPage(countCA)
|
page = this.NewPage(countCA)
|
||||||
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
IsCA: true,
|
IsCA: true,
|
||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "available":
|
case "available":
|
||||||
page = this.NewPage(countAvailable)
|
page = this.NewPage(countAvailable)
|
||||||
@@ -168,6 +184,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "expired":
|
case "expired":
|
||||||
page = this.NewPage(countExpired)
|
page = this.NewPage(countExpired)
|
||||||
@@ -177,6 +194,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
case "7days":
|
case "7days":
|
||||||
page = this.NewPage(count7Days)
|
page = this.NewPage(count7Days)
|
||||||
@@ -195,14 +213,16 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
Offset: page.Offset,
|
Offset: page.Offset,
|
||||||
Size: page.Size,
|
Size: page.Size,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
|
UserOnly: userOnly,
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
page = this.NewPage(countAll)
|
page = this.NewPage(countAll)
|
||||||
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
listResp, err = this.RPC().SSLCertRPC().ListSSLCerts(this.AdminContext(), &pb.ListSSLCertsRequest{
|
||||||
UserId: params.UserId,
|
UserId: params.UserId,
|
||||||
Keyword: params.Keyword,
|
Keyword: params.Keyword,
|
||||||
Offset: page.Offset,
|
UserOnly: userOnly,
|
||||||
Size: page.Size,
|
Offset: page.Offset,
|
||||||
|
Size: page.Size,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -221,6 +241,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
var certMaps = []maps.Map{}
|
var certMaps = []maps.Map{}
|
||||||
var nowTime = time.Now().Unix()
|
var nowTime = time.Now().Unix()
|
||||||
for _, certConfig := range certConfigs {
|
for _, certConfig := range certConfigs {
|
||||||
|
// count servers
|
||||||
countServersResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledServersWithSSLCertIdRequest{
|
countServersResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledServersWithSSLCertIdRequest{
|
||||||
SslCertId: certConfig.Id,
|
SslCertId: certConfig.Id,
|
||||||
})
|
})
|
||||||
@@ -229,6 +250,23 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// user
|
||||||
|
userResp, err := this.RPC().SSLCertRPC().FindSSLCertUser(this.AdminContext(), &pb.FindSSLCertUserRequest{SslCertId: certConfig.Id})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var certUserMap = maps.Map{
|
||||||
|
"id": 0,
|
||||||
|
}
|
||||||
|
if userResp.User != nil {
|
||||||
|
certUserMap = maps.Map{
|
||||||
|
"id": userResp.User.Id,
|
||||||
|
"username": userResp.User.Username,
|
||||||
|
"fullname": userResp.User.Fullname,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
certMaps = append(certMaps, maps.Map{
|
certMaps = append(certMaps, maps.Map{
|
||||||
"isOn": certConfig.IsOn,
|
"isOn": certConfig.IsOn,
|
||||||
"beginDay": timeutil.FormatTime("Y-m-d", certConfig.TimeBeginAt),
|
"beginDay": timeutil.FormatTime("Y-m-d", certConfig.TimeBeginAt),
|
||||||
@@ -236,6 +274,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
"isExpired": nowTime > certConfig.TimeEndAt,
|
"isExpired": nowTime > certConfig.TimeEndAt,
|
||||||
"isAvailable": nowTime <= certConfig.TimeEndAt,
|
"isAvailable": nowTime <= certConfig.TimeEndAt,
|
||||||
"countServers": countServersResp.Count,
|
"countServers": countServersResp.Count,
|
||||||
|
"user": certUserMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["certInfos"] = certMaps
|
this.Data["certInfos"] = certMaps
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
package components
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Helper struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHelper() *Helper {
|
|
||||||
return &Helper{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Helper) BeforeAction(action *actions.ActionObject) {
|
|
||||||
action.Data["teaMenu"] = "servers"
|
|
||||||
}
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
package components
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
SettingCodeServerGlobalConfig = "serverGlobalConfig"
|
|
||||||
)
|
|
||||||
|
|
||||||
type IndexAction struct {
|
|
||||||
actionutils.ParentAction
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) Init() {
|
|
||||||
this.Nav("", "component", "index")
|
|
||||||
this.SecondMenu("global")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct{}) {
|
|
||||||
valueJSONResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: SettingCodeServerGlobalConfig})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
valueJSON := valueJSONResp.ValueJSON
|
|
||||||
globalConfig := &serverconfigs.GlobalConfig{}
|
|
||||||
|
|
||||||
// 默认值
|
|
||||||
globalConfig.HTTPAll.DomainAuditingIsOn = false
|
|
||||||
|
|
||||||
if len(valueJSON) > 0 {
|
|
||||||
err = json.Unmarshal(valueJSON, globalConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.Data["globalConfig"] = globalConfig
|
|
||||||
|
|
||||||
this.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IndexAction) RunPost(params struct {
|
|
||||||
GlobalConfigJSON []byte
|
|
||||||
Must *actions.Must
|
|
||||||
|
|
||||||
// 不匹配域名相关
|
|
||||||
AllowMismatchDomains []string
|
|
||||||
DomainMismatchAction string
|
|
||||||
DomainMismatchActionPageStatusCode int
|
|
||||||
DomainMismatchActionPageContentHTML string
|
|
||||||
|
|
||||||
// TCP端口设置
|
|
||||||
TcpAllPortRangeMin int
|
|
||||||
TcpAllPortRangeMax int
|
|
||||||
TcpAllDenyPorts []int
|
|
||||||
|
|
||||||
DefaultDomain string
|
|
||||||
}) {
|
|
||||||
// 创建日志
|
|
||||||
defer this.CreateLogInfo(codes.Server_LogUpdateGlobalSettings)
|
|
||||||
|
|
||||||
if len(params.GlobalConfigJSON) == 0 {
|
|
||||||
this.Fail("错误的配置信息,请刷新当前页面后重试")
|
|
||||||
}
|
|
||||||
|
|
||||||
globalConfig := &serverconfigs.GlobalConfig{}
|
|
||||||
err := json.Unmarshal(params.GlobalConfigJSON, globalConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.Fail("配置校验失败:" + err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
// TCP端口范围
|
|
||||||
if params.TcpAllPortRangeMin < 1024 {
|
|
||||||
params.TcpAllPortRangeMin = 1024
|
|
||||||
}
|
|
||||||
if params.TcpAllPortRangeMax > 65534 {
|
|
||||||
params.TcpAllPortRangeMax = 65534
|
|
||||||
} else if params.TcpAllPortRangeMax < 1024 {
|
|
||||||
params.TcpAllPortRangeMax = 1024
|
|
||||||
}
|
|
||||||
if params.TcpAllPortRangeMin > params.TcpAllPortRangeMax {
|
|
||||||
params.TcpAllPortRangeMin, params.TcpAllPortRangeMax = params.TcpAllPortRangeMax, params.TcpAllPortRangeMin
|
|
||||||
}
|
|
||||||
globalConfig.TCPAll.DenyPorts = params.TcpAllDenyPorts
|
|
||||||
globalConfig.TCPAll.PortRangeMin = params.TcpAllPortRangeMin
|
|
||||||
globalConfig.TCPAll.PortRangeMax = params.TcpAllPortRangeMax
|
|
||||||
|
|
||||||
// 修改配置
|
|
||||||
globalConfigJSON, err := json.Marshal(globalConfig)
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{
|
|
||||||
Code: SettingCodeServerGlobalConfig,
|
|
||||||
ValueJSON: globalConfigJSON,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 通知更新
|
|
||||||
_, err = this.RPC().ServerRPC().NotifyServersChange(this.AdminContext(), &pb.NotifyServersChangeRequest{})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package components
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
|
||||||
"github.com/iwind/TeaGo"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
TeaGo.BeforeStart(func(server *TeaGo.Server) {
|
|
||||||
server.
|
|
||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)).
|
|
||||||
Data("teaMenu", "servers").
|
|
||||||
Data("teaSubMenu", "global").
|
|
||||||
Helper(NewHelper()).
|
|
||||||
Prefix("/servers/components").
|
|
||||||
GetPost("", new(IndexAction)).
|
|
||||||
EndAll()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -71,7 +71,13 @@ func (this *CreateRulePopupAction) RunPost(params struct {
|
|||||||
Field("prefix", params.Prefix).
|
Field("prefix", params.Prefix).
|
||||||
Require("请选择参数")
|
Require("请选择参数")
|
||||||
|
|
||||||
rule := &firewallconfigs.HTTPFirewallRule{
|
|
||||||
|
if len(params.Value) > 4096 {
|
||||||
|
this.FailField("value", "对比值内容长度不能超过4096个字符")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var rule = &firewallconfigs.HTTPFirewallRule{
|
||||||
Id: params.RuleId,
|
Id: params.RuleId,
|
||||||
IsOn: true,
|
IsOn: true,
|
||||||
}
|
}
|
||||||
@@ -81,7 +87,7 @@ func (this *CreateRulePopupAction) RunPost(params struct {
|
|||||||
rule.Param = "${" + params.Prefix + "}"
|
rule.Param = "${" + params.Prefix + "}"
|
||||||
}
|
}
|
||||||
|
|
||||||
paramFilters := []*firewallconfigs.ParamFilter{}
|
var paramFilters = []*firewallconfigs.ParamFilter{}
|
||||||
if len(params.ParamFiltersJSON) > 0 {
|
if len(params.ParamFiltersJSON) > 0 {
|
||||||
err := json.Unmarshal(params.ParamFiltersJSON, ¶mFilters)
|
err := json.Unmarshal(params.ParamFiltersJSON, ¶mFilters)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package waf
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
||||||
"github.com/iwind/TeaGo/lists"
|
"github.com/iwind/TeaGo/lists"
|
||||||
@@ -141,20 +142,7 @@ func (this *LogAction) RunGet(params struct {
|
|||||||
this.Data["groups"] = groupMaps
|
this.Data["groups"] = groupMaps
|
||||||
|
|
||||||
// 根据IP查询区域
|
// 根据IP查询区域
|
||||||
regionMap := map[string]string{} // ip => region
|
this.Data["regions"] = iplibrary.LookupIPSummaries(ipList)
|
||||||
if len(ipList) > 0 {
|
|
||||||
resp, err := this.RPC().IPLibraryRPC().LookupIPRegions(this.AdminContext(), &pb.LookupIPRegionsRequest{IpList: ipList})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.IpRegionMap != nil {
|
|
||||||
for ip, region := range resp.IpRegionMap {
|
|
||||||
regionMap[ip] = region.Summary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.Data["regions"] = regionMap
|
|
||||||
|
|
||||||
// WAF相关
|
// WAF相关
|
||||||
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
||||||
|
|||||||
@@ -564,9 +564,11 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
var remoteAddrConfig = &serverconfigs.HTTPRemoteAddrConfig{
|
var remoteAddrConfig = &serverconfigs.HTTPRemoteAddrConfig{
|
||||||
IsOn: true,
|
IsOn: true,
|
||||||
Value: "${rawRemoteAddr}",
|
Value: "${rawRemoteAddr}",
|
||||||
|
Type: serverconfigs.HTTPRemoteAddrTypeDefault,
|
||||||
}
|
}
|
||||||
if params.RemoteAddrIsOn {
|
if params.RemoteAddrIsOn {
|
||||||
remoteAddrConfig.Value = "${remoteAddr}"
|
remoteAddrConfig.Value = "${remoteAddr}"
|
||||||
|
remoteAddrConfig.Type = serverconfigs.HTTPRemoteAddrTypeProxy
|
||||||
}
|
}
|
||||||
remoteAddrConfigJSON, err := json.Marshal(remoteAddrConfig)
|
remoteAddrConfigJSON, err := json.Marshal(remoteAddrConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyRef"] = reverseProxyRef
|
this.Data["reverseProxyRef"] = reverseProxyRef
|
||||||
|
|
||||||
var reverseProxy = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
reverseProxy := serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -36,14 +36,14 @@ func (this *SettingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxyRef := &serverconfigs.ReverseProxyRef{}
|
var reverseProxyRef = &serverconfigs.ReverseProxyRef{}
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -67,7 +67,7 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
|
|
||||||
// TODO 校验配置
|
// TODO 校验配置
|
||||||
|
|
||||||
var reverseProxyConfig = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxyConfig = serverconfigs.NewReverseProxyConfig()
|
||||||
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -110,6 +110,8 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
AddHeaders: reverseProxyConfig.AddHeaders,
|
AddHeaders: reverseProxyConfig.AddHeaders,
|
||||||
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
||||||
ProxyProtocolJSON: proxyProtocolJSON,
|
ProxyProtocolJSON: proxyProtocolJSON,
|
||||||
|
Retry50X: reverseProxyConfig.Retry50X,
|
||||||
|
Retry40X: reverseProxyConfig.Retry40X,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -54,9 +55,29 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
err := json.Unmarshal(params.RemoteAddrJSON, remoteAddrConfig)
|
err := json.Unmarshal(params.RemoteAddrJSON, remoteAddrConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.Fail("参数校验失败:" + err.Error())
|
this.Fail("参数校验失败:" + err.Error())
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteAddrConfig.Value = strings.TrimSpace(remoteAddrConfig.Value)
|
remoteAddrConfig.Value = strings.TrimSpace(remoteAddrConfig.Value)
|
||||||
|
|
||||||
|
switch remoteAddrConfig.Type {
|
||||||
|
case serverconfigs.HTTPRemoteAddrTypeRequestHeader:
|
||||||
|
if len(remoteAddrConfig.RequestHeaderName) == 0 {
|
||||||
|
this.FailField("requestHeaderName", "请输入请求报头")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !regexp.MustCompile(`^[\w-_,]+$`).MatchString(remoteAddrConfig.RequestHeaderName) {
|
||||||
|
this.FailField("requestHeaderName", "请求报头中只能含有数字、英文字母、下划线、中划线")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
remoteAddrConfig.Value = "${header." + remoteAddrConfig.RequestHeaderName + "}"
|
||||||
|
case serverconfigs.HTTPRemoteAddrTypeVariable:
|
||||||
|
if len(remoteAddrConfig.Value) == 0 {
|
||||||
|
this.FailField("value", "请输入自定义变量")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = remoteAddrConfig.Init()
|
err = remoteAddrConfig.Init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.Fail("配置校验失败:" + err.Error())
|
this.Fail("配置校验失败:" + err.Error())
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyRef"] = reverseProxyRef
|
this.Data["reverseProxyRef"] = reverseProxyRef
|
||||||
|
|
||||||
var reverseProxy = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -42,8 +42,8 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyId"] = reverseProxy.Id
|
this.Data["reverseProxyId"] = reverseProxy.Id
|
||||||
|
|
||||||
schedulingCode := reverseProxy.FindSchedulingConfig().Code
|
var schedulingCode = reverseProxy.FindSchedulingConfig().Code
|
||||||
schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode)
|
var schedulingMap = schedulingconfigs.FindSchedulingType(schedulingCode)
|
||||||
if schedulingMap == nil {
|
if schedulingMap == nil {
|
||||||
this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
|
this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -36,14 +36,14 @@ func (this *SettingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxyRef := &serverconfigs.ReverseProxyRef{}
|
var reverseProxyRef = &serverconfigs.ReverseProxyRef{}
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -67,7 +67,7 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
|
|
||||||
// TODO 校验配置
|
// TODO 校验配置
|
||||||
|
|
||||||
var reverseProxyConfig = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxyConfig = serverconfigs.NewReverseProxyConfig()
|
||||||
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -110,6 +110,8 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
AddHeaders: reverseProxyConfig.AddHeaders,
|
AddHeaders: reverseProxyConfig.AddHeaders,
|
||||||
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
||||||
ProxyProtocolJSON: proxyProtocolJSON,
|
ProxyProtocolJSON: proxyProtocolJSON,
|
||||||
|
Retry50X: reverseProxyConfig.Retry50X,
|
||||||
|
Retry40X: reverseProxyConfig.Retry40X,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyRef"] = reverseProxyRef
|
this.Data["reverseProxyRef"] = reverseProxyRef
|
||||||
|
|
||||||
var reverseProxy = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ func (this *SettingAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -67,7 +67,7 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
|
|
||||||
// TODO 校验配置
|
// TODO 校验配置
|
||||||
|
|
||||||
reverseProxyConfig := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxyConfig = serverconfigs.NewReverseProxyConfig()
|
||||||
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ package ipbox
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -25,24 +25,15 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
this.Data["ip"] = params.Ip
|
this.Data["ip"] = params.Ip
|
||||||
|
|
||||||
// IP信息
|
// IP信息
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: params.Ip})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Data["regions"] = ""
|
this.Data["regions"] = ""
|
||||||
this.Data["isp"] = ""
|
this.Data["isp"] = ""
|
||||||
if regionResp.IpRegion != nil {
|
|
||||||
var regionName = regionResp.IpRegion.Summary
|
|
||||||
|
|
||||||
// remove isp from regionName
|
var ipRegion = iplibrary.LookupIP(params.Ip)
|
||||||
var index = strings.LastIndex(regionName, "|")
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
if index > 0 {
|
this.Data["regions"] = ipRegion.RegionSummary()
|
||||||
regionName = regionName[:index]
|
this.Data["isp"] = ipRegion.ProviderName()
|
||||||
}
|
|
||||||
this.Data["regions"] = regionName
|
|
||||||
this.Data["isp"] = regionResp.IpRegion.Isp
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IP列表
|
// IP列表
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ package iplists
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -162,22 +162,10 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
var region = ""
|
var region = ""
|
||||||
var isp = ""
|
var isp = ""
|
||||||
if len(item.IpFrom) > 0 && len(item.IpTo) == 0 {
|
if len(item.IpFrom) > 0 && len(item.IpTo) == 0 {
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: item.IpFrom})
|
var ipRegion = iplibrary.LookupIP(item.IpFrom)
|
||||||
if err != nil {
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
this.ErrorPage(err)
|
region = ipRegion.RegionSummary()
|
||||||
return
|
isp = ipRegion.ProviderName()
|
||||||
}
|
|
||||||
var ipRegion = regionResp.IpRegion
|
|
||||||
if ipRegion != nil {
|
|
||||||
region = ipRegion.Summary
|
|
||||||
|
|
||||||
// remove isp from regionName
|
|
||||||
var index = strings.LastIndex(region, "|")
|
|
||||||
if index > 0 {
|
|
||||||
region = region[:index]
|
|
||||||
}
|
|
||||||
|
|
||||||
isp = ipRegion.Isp
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ package iplists
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -109,22 +109,10 @@ func (this *ItemsAction) RunGet(params struct {
|
|||||||
var region = ""
|
var region = ""
|
||||||
var isp = ""
|
var isp = ""
|
||||||
if len(item.IpFrom) > 0 && len(item.IpTo) == 0 {
|
if len(item.IpFrom) > 0 && len(item.IpTo) == 0 {
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: item.IpFrom})
|
var ipRegion = iplibrary.LookupIP(item.IpFrom)
|
||||||
if err != nil {
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
this.ErrorPage(err)
|
region = ipRegion.RegionSummary()
|
||||||
return
|
isp = ipRegion.ProviderName()
|
||||||
}
|
|
||||||
var ipRegion = regionResp.IpRegion
|
|
||||||
if ipRegion != nil {
|
|
||||||
region = ipRegion.Summary
|
|
||||||
|
|
||||||
// remove isp from regionName
|
|
||||||
var index = strings.LastIndex(region, "|")
|
|
||||||
if index > 0 {
|
|
||||||
region = region[:index]
|
|
||||||
}
|
|
||||||
|
|
||||||
isp = ipRegion.Isp
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ package logs
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"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"
|
||||||
@@ -169,20 +170,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据IP查询区域
|
// 根据IP查询区域
|
||||||
var regionMap = map[string]string{} // ip => region
|
this.Data["regions"] = iplibrary.LookupIPSummaries(ipList)
|
||||||
if len(ipList) > 0 {
|
|
||||||
resp, err := this.RPC().IPLibraryRPC().LookupIPRegions(this.AdminContext(), &pb.LookupIPRegionsRequest{IpList: ipList})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.IpRegionMap != nil {
|
|
||||||
for ip, region := range resp.IpRegionMap {
|
|
||||||
regionMap[ip] = region.Summary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.Data["regions"] = regionMap
|
|
||||||
|
|
||||||
// WAF相关
|
// WAF相关
|
||||||
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
||||||
"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"
|
||||||
@@ -60,6 +62,27 @@ func (this *HistoryAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查当前网站有无开启访问日志
|
||||||
|
this.Data["serverAccessLogIsOn"] = true
|
||||||
|
|
||||||
|
groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{
|
||||||
|
ServerId: params.ServerId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !groupResp.HasAccessLogConfig {
|
||||||
|
webConfig, err := dao.SharedHTTPWebDAO.FindWebConfigWithServerId(this.AdminContext(), params.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if webConfig != nil && webConfig.AccessLogRef != nil && !webConfig.AccessLogRef.IsOn {
|
||||||
|
this.Data["serverAccessLogIsOn"] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var day = params.Day
|
var day = params.Day
|
||||||
var ipList = []string{}
|
var ipList = []string{}
|
||||||
var wafMaps = []maps.Map{}
|
var wafMaps = []maps.Map{}
|
||||||
@@ -160,20 +183,7 @@ func (this *HistoryAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据IP查询区域
|
// 根据IP查询区域
|
||||||
var regionMap = map[string]string{} // ip => region
|
this.Data["regions"] = iplibrary.LookupIPSummaries(ipList)
|
||||||
if len(ipList) > 0 {
|
|
||||||
resp, err := this.RPC().IPLibraryRPC().LookupIPRegions(this.AdminContext(), &pb.LookupIPRegionsRequest{IpList: ipList})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.IpRegionMap != nil {
|
|
||||||
for ip, region := range resp.IpRegionMap {
|
|
||||||
regionMap[ip] = region.Summary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.Data["regions"] = regionMap
|
|
||||||
|
|
||||||
// WAF相关
|
// WAF相关
|
||||||
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
||||||
"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/lists"
|
"github.com/iwind/TeaGo/lists"
|
||||||
@@ -40,8 +42,29 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查当前网站有无开启访问日志
|
||||||
|
this.Data["serverAccessLogIsOn"] = true
|
||||||
|
|
||||||
|
groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{
|
||||||
|
ServerId: params.ServerId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !groupResp.HasAccessLogConfig {
|
||||||
|
webConfig, err := dao.SharedHTTPWebDAO.FindWebConfigWithServerId(this.AdminContext(), params.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if webConfig != nil && webConfig.AccessLogRef != nil && !webConfig.AccessLogRef.IsOn {
|
||||||
|
this.Data["serverAccessLogIsOn"] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 记录最近使用
|
// 记录最近使用
|
||||||
_, err := this.RPC().LatestItemRPC().IncreaseLatestItem(this.AdminContext(), &pb.IncreaseLatestItemRequest{
|
_, err = this.RPC().LatestItemRPC().IncreaseLatestItem(this.AdminContext(), &pb.IncreaseLatestItemRequest{
|
||||||
ItemType: "server",
|
ItemType: "server",
|
||||||
ItemId: params.ServerId,
|
ItemId: params.ServerId,
|
||||||
})
|
})
|
||||||
@@ -129,20 +152,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
this.Data["hasMore"] = accessLogsResp.HasMore
|
this.Data["hasMore"] = accessLogsResp.HasMore
|
||||||
|
|
||||||
// 根据IP查询区域
|
// 根据IP查询区域
|
||||||
var regionMap = map[string]string{} // ip => region
|
this.Data["regions"] = iplibrary.LookupIPSummaries(ipList)
|
||||||
if len(ipList) > 0 {
|
|
||||||
resp, err := this.RPC().IPLibraryRPC().LookupIPRegions(this.AdminContext(), &pb.LookupIPRegionsRequest{IpList: ipList})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.IpRegionMap != nil {
|
|
||||||
for ip, region := range resp.IpRegionMap {
|
|
||||||
regionMap[ip] = region.Summary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.Data["regions"] = regionMap
|
|
||||||
|
|
||||||
// WAF相关
|
// WAF相关
|
||||||
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
||||||
"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"
|
||||||
@@ -54,6 +56,27 @@ func (this *TodayAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查当前网站有无开启访问日志
|
||||||
|
this.Data["serverAccessLogIsOn"] = true
|
||||||
|
|
||||||
|
groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{
|
||||||
|
ServerId: params.ServerId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !groupResp.HasAccessLogConfig {
|
||||||
|
webConfig, err := dao.SharedHTTPWebDAO.FindWebConfigWithServerId(this.AdminContext(), params.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if webConfig != nil && webConfig.AccessLogRef != nil && !webConfig.AccessLogRef.IsOn {
|
||||||
|
this.Data["serverAccessLogIsOn"] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{
|
resp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{
|
||||||
Partition: params.Partition,
|
Partition: params.Partition,
|
||||||
RequestId: params.RequestId,
|
RequestId: params.RequestId,
|
||||||
@@ -141,20 +164,7 @@ func (this *TodayAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据IP查询区域
|
// 根据IP查询区域
|
||||||
var regionMap = map[string]string{} // ip => region
|
this.Data["regions"] = iplibrary.LookupIPSummaries(ipList)
|
||||||
if len(ipList) > 0 {
|
|
||||||
resp, err := this.RPC().IPLibraryRPC().LookupIPRegions(this.AdminContext(), &pb.LookupIPRegionsRequest{IpList: ipList})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if resp.IpRegionMap != nil {
|
|
||||||
for ip, region := range resp.IpRegionMap {
|
|
||||||
regionMap[ip] = region.Summary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.Data["regions"] = regionMap
|
|
||||||
|
|
||||||
// WAF相关
|
// WAF相关
|
||||||
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
var wafInfos = map[int64]maps.Map{} // set id => WAF Map
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package log
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -86,24 +87,11 @@ func (this *ViewPopupAction) RunGet(params struct {
|
|||||||
|
|
||||||
// 地域相关
|
// 地域相关
|
||||||
var regionMap maps.Map = nil
|
var regionMap maps.Map = nil
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: accessLog.RemoteAddr})
|
var ipRegion = iplibrary.LookupIP(accessLog.RemoteAddr)
|
||||||
if err != nil {
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
region := regionResp.IpRegion
|
|
||||||
if region != nil {
|
|
||||||
var regionName = region.Summary
|
|
||||||
|
|
||||||
// remove isp from regionName
|
|
||||||
var index = strings.LastIndex(regionName, "|")
|
|
||||||
if index > 0 {
|
|
||||||
regionName = regionName[:index]
|
|
||||||
}
|
|
||||||
|
|
||||||
regionMap = maps.Map{
|
regionMap = maps.Map{
|
||||||
"full": regionName,
|
"full": ipRegion.RegionSummary(),
|
||||||
"isp": region.Isp,
|
"isp": ipRegion.ProviderName(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.Data["region"] = regionMap
|
this.Data["region"] = regionMap
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ func (this *IndexAction) Init() {
|
|||||||
func (this *IndexAction) RunGet(params struct {
|
func (this *IndexAction) RunGet(params struct {
|
||||||
ServerId int64
|
ServerId int64
|
||||||
}) {
|
}) {
|
||||||
// 服务分组设置
|
// 网站分组设置
|
||||||
groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{
|
groupResp, err := this.RPC().ServerGroupRPC().FindEnabledServerGroupConfigInfo(this.AdminContext(), &pb.FindEnabledServerGroupConfigInfoRequest{
|
||||||
ServerId: params.ServerId,
|
ServerId: params.ServerId,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,9 +47,29 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
err := json.Unmarshal(params.RemoteAddrJSON, remoteAddrConfig)
|
err := json.Unmarshal(params.RemoteAddrJSON, remoteAddrConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.Fail("参数校验失败:" + err.Error())
|
this.Fail("参数校验失败:" + err.Error())
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteAddrConfig.Value = strings.TrimSpace(remoteAddrConfig.Value)
|
remoteAddrConfig.Value = strings.TrimSpace(remoteAddrConfig.Value)
|
||||||
|
|
||||||
|
switch remoteAddrConfig.Type {
|
||||||
|
case serverconfigs.HTTPRemoteAddrTypeRequestHeader:
|
||||||
|
if len(remoteAddrConfig.RequestHeaderName) == 0 {
|
||||||
|
this.FailField("requestHeaderName", "请输入请求报头")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !regexp.MustCompile(`^[\w-_,]+$`).MatchString(remoteAddrConfig.RequestHeaderName) {
|
||||||
|
this.FailField("requestHeaderName", "请求报头中只能含有数字、英文字母、下划线、中划线")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
remoteAddrConfig.Value = "${header." + remoteAddrConfig.RequestHeaderName + "}"
|
||||||
|
case serverconfigs.HTTPRemoteAddrTypeVariable:
|
||||||
|
if len(remoteAddrConfig.Value) == 0 {
|
||||||
|
this.FailField("value", "请输入自定义变量")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = remoteAddrConfig.Init()
|
err = remoteAddrConfig.Init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.Fail("配置校验失败:" + err.Error())
|
this.Fail("配置校验失败:" + err.Error())
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyRef"] = reverseProxyRef
|
this.Data["reverseProxyRef"] = reverseProxyRef
|
||||||
|
|
||||||
var reverseProxy = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func (this *SchedulingAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *SchedulingAction) RunGet(params struct {
|
func (this *SchedulingAction) RunGet(params struct {
|
||||||
ServerId int64
|
ServerId int64
|
||||||
LocationId int64
|
LocationId int64
|
||||||
}) {
|
}) {
|
||||||
reverseProxyResp, err := this.RPC().HTTPLocationRPC().FindAndInitHTTPLocationReverseProxyConfig(this.AdminContext(), &pb.FindAndInitHTTPLocationReverseProxyConfigRequest{LocationId: params.LocationId})
|
reverseProxyResp, err := this.RPC().HTTPLocationRPC().FindAndInitHTTPLocationReverseProxyConfig(this.AdminContext(), &pb.FindAndInitHTTPLocationReverseProxyConfigRequest{LocationId: params.LocationId})
|
||||||
@@ -26,7 +26,7 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -34,8 +34,8 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyId"] = reverseProxy.Id
|
this.Data["reverseProxyId"] = reverseProxy.Id
|
||||||
|
|
||||||
schedulingCode := reverseProxy.FindSchedulingConfig().Code
|
var schedulingCode = reverseProxy.FindSchedulingConfig().Code
|
||||||
schedulingMap := schedulingconfigs.FindSchedulingType(schedulingCode)
|
var schedulingMap = schedulingconfigs.FindSchedulingType(schedulingCode)
|
||||||
if schedulingMap == nil {
|
if schedulingMap == nil {
|
||||||
this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
|
this.ErrorPage(errors.New("invalid scheduling code '" + schedulingCode + "'"))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (this *SettingAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -58,7 +58,7 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
|
|
||||||
// TODO 校验配置
|
// TODO 校验配置
|
||||||
|
|
||||||
var reverseProxyConfig = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxyConfig = serverconfigs.NewReverseProxyConfig()
|
||||||
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -101,6 +101,8 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
AddHeaders: reverseProxyConfig.AddHeaders,
|
AddHeaders: reverseProxyConfig.AddHeaders,
|
||||||
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
||||||
ProxyProtocolJSON: proxyProtocolJSON,
|
ProxyProtocolJSON: proxyProtocolJSON,
|
||||||
|
Retry50X: reverseProxyConfig.Retry50X,
|
||||||
|
Retry40X: reverseProxyConfig.Retry40X,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func (this *CreatePopupAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *CreatePopupAction) RunGet(params struct{}) {
|
func (this *CreatePopupAction) RunGet(params struct{}) {
|
||||||
this.Data["bodyTypes"] = shared.FindAllBodyTypes()
|
this.Data["bodyTypes"] = serverconfigs.FindAllHTTPPageBodyTypes()
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
@@ -32,22 +32,33 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
URL string `alias:"url"`
|
URL string `alias:"url"`
|
||||||
Body string
|
Body string
|
||||||
|
|
||||||
|
ExceptURLPatternsJSON []byte
|
||||||
|
OnlyURLPatternsJSON []byte
|
||||||
|
|
||||||
NewStatus int
|
NewStatus int
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
// TODO 对状态码进行更多校验
|
|
||||||
|
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("status", params.Status).
|
Field("status", params.Status).
|
||||||
Require("请输入响应状态码")
|
Require("请输入响应状态码")
|
||||||
|
|
||||||
|
if len(params.Status) != 3 {
|
||||||
|
this.FailField("status", "状态码长度必须为3位")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
switch params.BodyType {
|
switch params.BodyType {
|
||||||
case shared.BodyTypeURL:
|
case serverconfigs.HTTPPageBodyTypeURL:
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("url", params.URL).
|
Field("url", params.URL).
|
||||||
Require("请输入要显示的URL").
|
Require("请输入要显示的URL").
|
||||||
Match( `^(?i)(http|https)://`, "请输入正确的URL")
|
Match(`^(?i)(http|https)://`, "请输入正确的URL")
|
||||||
case shared.BodyTypeHTML:
|
case serverconfigs.HTTPPageBodyTypeRedirectURL:
|
||||||
|
params.Must.
|
||||||
|
Field("url", params.URL).
|
||||||
|
Require("请输入要跳转的URL").
|
||||||
|
Match(`^(?i)(http|https)://`, "请输入正确的URL")
|
||||||
|
case serverconfigs.HTTPPageBodyTypeHTML:
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("body", params.Body).
|
Field("body", params.Body).
|
||||||
Require("请输入要显示的HTML内容")
|
Require("请输入要显示的HTML内容")
|
||||||
@@ -58,12 +69,32 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var exceptURLPatterns = []*shared.URLPattern{}
|
||||||
|
if len(params.ExceptURLPatternsJSON) > 0 {
|
||||||
|
err := json.Unmarshal(params.ExceptURLPatternsJSON, &exceptURLPatterns)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var onlyURLPatterns = []*shared.URLPattern{}
|
||||||
|
if len(params.OnlyURLPatternsJSON) > 0 {
|
||||||
|
err := json.Unmarshal(params.OnlyURLPatternsJSON, &onlyURLPatterns)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
createResp, err := this.RPC().HTTPPageRPC().CreateHTTPPage(this.AdminContext(), &pb.CreateHTTPPageRequest{
|
createResp, err := this.RPC().HTTPPageRPC().CreateHTTPPage(this.AdminContext(), &pb.CreateHTTPPageRequest{
|
||||||
StatusList: []string{params.Status},
|
StatusList: []string{params.Status},
|
||||||
BodyType: params.BodyType,
|
BodyType: params.BodyType,
|
||||||
Url: params.URL,
|
Url: params.URL,
|
||||||
Body: params.Body,
|
Body: params.Body,
|
||||||
NewStatus: types.Int32(params.NewStatus),
|
NewStatus: types.Int32(params.NewStatus),
|
||||||
|
ExceptURLPatternsJSON: params.ExceptURLPatternsJSON,
|
||||||
|
OnlyURLPatternsJSON: params.OnlyURLPatternsJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
"github.com/iwind/TeaGo/types"
|
"github.com/iwind/TeaGo/types"
|
||||||
"regexp"
|
"regexp"
|
||||||
@@ -77,7 +76,11 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check url
|
// check url
|
||||||
if page.BodyType == shared.BodyTypeURL && !urlReg.MatchString(page.URL) {
|
if page.BodyType == serverconfigs.HTTPPageBodyTypeURL && !urlReg.MatchString(page.URL) {
|
||||||
|
this.Fail("自定义页面中 '" + page.URL + "' 不是一个正确的URL,请进行修改")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if page.BodyType == serverconfigs.HTTPPageBodyTypeRedirectURL && !urlReg.MatchString(page.URL) {
|
||||||
this.Fail("自定义页面中 '" + page.URL + "' 不是一个正确的URL,请进行修改")
|
this.Fail("自定义页面中 '" + page.URL + "' 不是一个正确的URL,请进行修改")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -99,7 +102,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if shutdownConfig.BodyType == shared.BodyTypeURL {
|
if shutdownConfig.BodyType == serverconfigs.HTTPPageBodyTypeURL {
|
||||||
if len(shutdownConfig.URL) > 512 {
|
if len(shutdownConfig.URL) > 512 {
|
||||||
this.Fail("临时关闭页面中URL过长,不能超过512字节")
|
this.Fail("临时关闭页面中URL过长,不能超过512字节")
|
||||||
return
|
return
|
||||||
@@ -109,7 +112,17 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
this.Fail("临时关闭页面中 '" + shutdownConfig.URL + "' 不是一个正确的URL,请进行修改")
|
this.Fail("临时关闭页面中 '" + shutdownConfig.URL + "' 不是一个正确的URL,请进行修改")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else if shutdownConfig.Body == shared.BodyTypeHTML {
|
} else if shutdownConfig.BodyType == serverconfigs.HTTPPageBodyTypeRedirectURL {
|
||||||
|
if len(shutdownConfig.URL) > 512 {
|
||||||
|
this.Fail("临时关闭页面中URL过长,不能超过512字节")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if shutdownConfig.IsOn /** 只有启用的时候才校验 **/ && !urlReg.MatchString(shutdownConfig.URL) {
|
||||||
|
this.Fail("临时关闭页面中 '" + shutdownConfig.URL + "' 不是一个正确的URL,请进行修改")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if shutdownConfig.Body == serverconfigs.HTTPPageBodyTypeHTML {
|
||||||
if len(shutdownConfig.Body) > 32*1024 {
|
if len(shutdownConfig.Body) > 32*1024 {
|
||||||
this.Fail("临时关闭页面中HTML内容长度不能超过32K")
|
this.Fail("临时关闭页面中HTML内容长度不能超过32K")
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func (this *UpdatePopupAction) Init() {
|
|||||||
func (this *UpdatePopupAction) RunGet(params struct {
|
func (this *UpdatePopupAction) RunGet(params struct {
|
||||||
PageId int64
|
PageId int64
|
||||||
}) {
|
}) {
|
||||||
this.Data["bodyTypes"] = shared.FindAllBodyTypes()
|
this.Data["bodyTypes"] = serverconfigs.FindAllHTTPPageBodyTypes()
|
||||||
|
|
||||||
configResp, err := this.RPC().HTTPPageRPC().FindEnabledHTTPPageConfig(this.AdminContext(), &pb.FindEnabledHTTPPageConfigRequest{HttpPageId: params.PageId})
|
configResp, err := this.RPC().HTTPPageRPC().FindEnabledHTTPPageConfig(this.AdminContext(), &pb.FindEnabledHTTPPageConfigRequest{HttpPageId: params.PageId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -30,12 +30,18 @@ func (this *UpdatePopupAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
pageConfig := &serverconfigs.HTTPPageConfig{}
|
var pageConfig = &serverconfigs.HTTPPageConfig{}
|
||||||
err = json.Unmarshal(configResp.PageJSON, pageConfig)
|
err = json.Unmarshal(configResp.PageJSON, pageConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if pageConfig.ExceptURLPatterns == nil {
|
||||||
|
pageConfig.ExceptURLPatterns = []*shared.URLPattern{}
|
||||||
|
}
|
||||||
|
if pageConfig.OnlyURLPatterns == nil {
|
||||||
|
pageConfig.OnlyURLPatterns = []*shared.URLPattern{}
|
||||||
|
}
|
||||||
this.Data["pageConfig"] = pageConfig
|
this.Data["pageConfig"] = pageConfig
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
@@ -50,6 +56,9 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
URL string `alias:"url"`
|
URL string `alias:"url"`
|
||||||
Body string
|
Body string
|
||||||
|
|
||||||
|
ExceptURLPatternsJSON []byte
|
||||||
|
OnlyURLPatternsJSON []byte
|
||||||
|
|
||||||
NewStatus int
|
NewStatus int
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
@@ -61,13 +70,23 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
Field("status", params.Status).
|
Field("status", params.Status).
|
||||||
Require("请输入响应状态码")
|
Require("请输入响应状态码")
|
||||||
|
|
||||||
|
if len(params.Status) != 3 {
|
||||||
|
this.FailField("status", "状态码长度必须为3位")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
switch params.BodyType {
|
switch params.BodyType {
|
||||||
case shared.BodyTypeURL:
|
case serverconfigs.HTTPPageBodyTypeURL:
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("url", params.URL).
|
Field("url", params.URL).
|
||||||
Require("请输入要显示的URL").
|
Require("请输入要显示的URL").
|
||||||
Match( `^(?i)(http|https)://`, "请输入正确的URL")
|
Match(`^(?i)(http|https)://`, "请输入正确的URL")
|
||||||
case shared.BodyTypeHTML:
|
case serverconfigs.HTTPPageBodyTypeRedirectURL:
|
||||||
|
params.Must.
|
||||||
|
Field("url", params.URL).
|
||||||
|
Require("请输入要跳转的URL").
|
||||||
|
Match(`^(?i)(http|https)://`, "请输入正确的URL")
|
||||||
|
case serverconfigs.HTTPPageBodyTypeHTML:
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("body", params.Body).
|
Field("body", params.Body).
|
||||||
Require("请输入要显示的HTML内容")
|
Require("请输入要显示的HTML内容")
|
||||||
@@ -78,13 +97,33 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var exceptURLPatterns = []*shared.URLPattern{}
|
||||||
|
if len(params.ExceptURLPatternsJSON) > 0 {
|
||||||
|
err := json.Unmarshal(params.ExceptURLPatternsJSON, &exceptURLPatterns)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var onlyURLPatterns = []*shared.URLPattern{}
|
||||||
|
if len(params.OnlyURLPatternsJSON) > 0 {
|
||||||
|
err := json.Unmarshal(params.OnlyURLPatternsJSON, &onlyURLPatterns)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_, err := this.RPC().HTTPPageRPC().UpdateHTTPPage(this.AdminContext(), &pb.UpdateHTTPPageRequest{
|
_, err := this.RPC().HTTPPageRPC().UpdateHTTPPage(this.AdminContext(), &pb.UpdateHTTPPageRequest{
|
||||||
HttpPageId: params.PageId,
|
HttpPageId: params.PageId,
|
||||||
StatusList: []string{params.Status},
|
StatusList: []string{params.Status},
|
||||||
BodyType: params.BodyType,
|
BodyType: params.BodyType,
|
||||||
Url: params.URL,
|
Url: params.URL,
|
||||||
Body: params.Body,
|
Body: params.Body,
|
||||||
NewStatus: types.Int32(params.NewStatus),
|
NewStatus: types.Int32(params.NewStatus),
|
||||||
|
ExceptURLPatternsJSON: params.ExceptURLPatternsJSON,
|
||||||
|
OnlyURLPatternsJSON: params.OnlyURLPatternsJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -52,7 +52,11 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
PortAfter int
|
PortAfter int
|
||||||
PortAfterScheme string
|
PortAfterScheme string
|
||||||
|
|
||||||
Status int
|
Status int
|
||||||
|
|
||||||
|
ExceptDomainsJSON []byte
|
||||||
|
OnlyDomainsJSON []byte
|
||||||
|
|
||||||
CondsJSON []byte
|
CondsJSON []byte
|
||||||
IsOn bool
|
IsOn bool
|
||||||
|
|
||||||
@@ -186,6 +190,27 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
Field("status", params.Status).
|
Field("status", params.Status).
|
||||||
Gte(0, "请选择正确的跳转状态码")
|
Gte(0, "请选择正确的跳转状态码")
|
||||||
|
|
||||||
|
// 域名
|
||||||
|
if len(params.ExceptDomainsJSON) > 0 {
|
||||||
|
var exceptDomains = []string{}
|
||||||
|
err := json.Unmarshal(params.ExceptDomainsJSON, &exceptDomains)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
config.ExceptDomains = exceptDomains
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(params.OnlyDomainsJSON) > 0 {
|
||||||
|
var onlyDomains = []string{}
|
||||||
|
err := json.Unmarshal(params.OnlyDomainsJSON, &onlyDomains)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
config.OnlyDomains = onlyDomains
|
||||||
|
}
|
||||||
|
|
||||||
// 校验匹配条件
|
// 校验匹配条件
|
||||||
var conds *shared.HTTPRequestCondsConfig
|
var conds *shared.HTTPRequestCondsConfig
|
||||||
if len(params.CondsJSON) > 0 {
|
if len(params.CondsJSON) > 0 {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
"github.com/iwind/TeaGo/types"
|
"github.com/iwind/TeaGo/types"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -63,6 +64,25 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
remoteAddrConfig.Value = strings.TrimSpace(remoteAddrConfig.Value)
|
remoteAddrConfig.Value = strings.TrimSpace(remoteAddrConfig.Value)
|
||||||
|
|
||||||
|
switch remoteAddrConfig.Type {
|
||||||
|
case serverconfigs.HTTPRemoteAddrTypeRequestHeader:
|
||||||
|
if len(remoteAddrConfig.RequestHeaderName) == 0 {
|
||||||
|
this.FailField("requestHeaderName", "请输入请求报头")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !regexp.MustCompile(`^[\w-_,]+$`).MatchString(remoteAddrConfig.RequestHeaderName) {
|
||||||
|
this.FailField("requestHeaderName", "请求报头中只能含有数字、英文字母、下划线、中划线")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
remoteAddrConfig.Value = "${header." + remoteAddrConfig.RequestHeaderName + "}"
|
||||||
|
case serverconfigs.HTTPRemoteAddrTypeVariable:
|
||||||
|
if len(remoteAddrConfig.Value) == 0 {
|
||||||
|
this.FailField("value", "请输入自定义变量")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = remoteAddrConfig.Init()
|
err = remoteAddrConfig.Init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.Fail("配置校验失败:" + err.Error())
|
this.Fail("配置校验失败:" + err.Error())
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["reverseProxyRef"] = reverseProxyRef
|
this.Data["reverseProxyRef"] = reverseProxyRef
|
||||||
|
|
||||||
var reverseProxy = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ func (this *SchedulingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ func (this *SettingAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reverseProxyRef := &serverconfigs.ReverseProxyRef{}
|
var reverseProxyRef = &serverconfigs.ReverseProxyRef{}
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyRefJSON, reverseProxyRef)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
err = json.Unmarshal(reverseProxyResp.ReverseProxyJSON, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -57,7 +57,7 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
}) {
|
}) {
|
||||||
defer this.CreateLogInfo(codes.ServerReverseProxy_LogUpdateServerReverseProxySettings, params.ServerId)
|
defer this.CreateLogInfo(codes.ServerReverseProxy_LogUpdateServerReverseProxySettings, params.ServerId)
|
||||||
|
|
||||||
var reverseProxyConfig = &serverconfigs.ReverseProxyConfig{}
|
var reverseProxyConfig = serverconfigs.NewReverseProxyConfig()
|
||||||
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
err := json.Unmarshal(params.ReverseProxyJSON, reverseProxyConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -133,6 +133,8 @@ func (this *SettingAction) RunPost(params struct {
|
|||||||
ProxyProtocolJSON: proxyProtocolJSON,
|
ProxyProtocolJSON: proxyProtocolJSON,
|
||||||
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
FollowRedirects: reverseProxyConfig.FollowRedirects,
|
||||||
RequestHostExcludingPort: reverseProxyConfig.RequestHostExcludingPort,
|
RequestHostExcludingPort: reverseProxyConfig.RequestHostExcludingPort,
|
||||||
|
Retry50X: reverseProxyConfig.Retry50X,
|
||||||
|
Retry40X: reverseProxyConfig.Retry40X,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ func (this *UpdateSchedulingPopupAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
configData := reverseProxyResp.ReverseProxyJSON
|
configData := reverseProxyResp.ReverseProxyJSON
|
||||||
|
|
||||||
reverseProxyConfig := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxyConfig = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(configData, reverseProxyConfig)
|
err = json.Unmarshal(configData, reverseProxyConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -126,8 +126,8 @@ func (this *UpdateSchedulingPopupAction) RunPost(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
configData := reverseProxyResp.ReverseProxyJSON
|
var configData = reverseProxyResp.ReverseProxyJSON
|
||||||
reverseProxy := &serverconfigs.ReverseProxyConfig{}
|
var reverseProxy = serverconfigs.NewReverseProxyConfig()
|
||||||
err = json.Unmarshal(configData, reverseProxy)
|
err = json.Unmarshal(configData, reverseProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ func (this *CountriesAction) RunGet(params struct {
|
|||||||
this.NotFound("firewallPolicy", params.FirewallPolicyId)
|
this.NotFound("firewallPolicy", params.FirewallPolicyId)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var deniedCountryIds = []int64{}
|
var deniedCountryIds = []int64{}
|
||||||
var allowedCountryIds = []int64{}
|
var allowedCountryIds = []int64{}
|
||||||
var countryHTML = ""
|
var countryHTML = ""
|
||||||
@@ -95,6 +96,24 @@ func (this *CountriesAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["wafIsOn"] = webConfig.FirewallRef != nil && webConfig.FirewallRef.IsOn
|
this.Data["wafIsOn"] = webConfig.FirewallRef != nil && webConfig.FirewallRef.IsOn
|
||||||
|
|
||||||
|
// 获取当前服务所在集群的WAF设置
|
||||||
|
clusterFirewallPolicy, err := dao.SharedHTTPFirewallPolicyDAO.FindEnabledHTTPFirewallPolicyWithServerId(this.AdminContext(), params.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if clusterFirewallPolicy != nil {
|
||||||
|
this.Data["clusterFirewallPolicy"] = maps.Map{
|
||||||
|
"id": clusterFirewallPolicy.Id,
|
||||||
|
"name": clusterFirewallPolicy.Name,
|
||||||
|
"isOn": clusterFirewallPolicy.IsOn,
|
||||||
|
"mode": clusterFirewallPolicy.Mode,
|
||||||
|
"modeInfo": firewallconfigs.FindFirewallMode(clusterFirewallPolicy.Mode),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.Data["clusterFirewallPolicy"] = nil
|
||||||
|
}
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,6 +96,24 @@ func (this *ProvincesAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["wafIsOn"] = webConfig.FirewallRef != nil && webConfig.FirewallRef.IsOn
|
this.Data["wafIsOn"] = webConfig.FirewallRef != nil && webConfig.FirewallRef.IsOn
|
||||||
|
|
||||||
|
// 获取当前服务所在集群的WAF设置
|
||||||
|
clusterFirewallPolicy, err := dao.SharedHTTPFirewallPolicyDAO.FindEnabledHTTPFirewallPolicyWithServerId(this.AdminContext(), params.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if clusterFirewallPolicy != nil {
|
||||||
|
this.Data["clusterFirewallPolicy"] = maps.Map{
|
||||||
|
"id": clusterFirewallPolicy.Id,
|
||||||
|
"name": clusterFirewallPolicy.Name,
|
||||||
|
"isOn": clusterFirewallPolicy.IsOn,
|
||||||
|
"mode": clusterFirewallPolicy.Mode,
|
||||||
|
"modeInfo": firewallconfigs.FindFirewallMode(clusterFirewallPolicy.Mode),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.Data["clusterFirewallPolicy"] = nil
|
||||||
|
}
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -291,10 +291,11 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri
|
|||||||
"isOn": serverConfig.Web != nil && len(serverConfig.Web.RewriteRefs) > 0,
|
"isOn": serverConfig.Web != nil && len(serverConfig.Web.RewriteRefs) > 0,
|
||||||
})
|
})
|
||||||
menuItems = append(menuItems, maps.Map{
|
menuItems = append(menuItems, maps.Map{
|
||||||
"name": this.Lang(actionPtr, codes.Server_MenuSettingWAF),
|
"name": this.Lang(actionPtr, codes.Server_MenuSettingWAF),
|
||||||
"url": "/servers/server/settings/waf?serverId=" + serverIdString,
|
"url": "/servers/server/settings/waf?serverId=" + serverIdString,
|
||||||
"isActive": secondMenuItem == "waf",
|
"isActive": secondMenuItem == "waf",
|
||||||
"isOn": serverConfig.Web != nil && serverConfig.Web.FirewallRef != nil && serverConfig.Web.FirewallRef.IsOn,
|
"isOn": serverConfig.Web != nil && serverConfig.Web.FirewallRef != nil && serverConfig.Web.FirewallRef.IsOn,
|
||||||
|
"configCode": serverconfigs.ConfigCodeWAF,
|
||||||
})
|
})
|
||||||
menuItems = append(menuItems, maps.Map{
|
menuItems = append(menuItems, maps.Map{
|
||||||
"name": this.Lang(actionPtr, codes.Server_MenuSettingCache),
|
"name": this.Lang(actionPtr, codes.Server_MenuSettingCache),
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
@@ -28,17 +27,7 @@ func (this *StatusAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 读取全局配置
|
// 读取全局配置
|
||||||
globalConfig, err := dao.SharedSysSettingDAO.ReadGlobalConfig(this.AdminContext())
|
var wg = sync.WaitGroup{}
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
auditingPrompt := ""
|
|
||||||
if globalConfig != nil {
|
|
||||||
auditingPrompt = globalConfig.HTTPAll.DomainAuditingPrompt
|
|
||||||
}
|
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
|
||||||
wg.Add(len(params.ServerIds))
|
wg.Add(len(params.ServerIds))
|
||||||
|
|
||||||
for _, serverId := range params.ServerIds {
|
for _, serverId := range params.ServerIds {
|
||||||
@@ -98,6 +87,17 @@ func (this *StatusAction) RunPost(params struct {
|
|||||||
if serverNamesResp.IsAuditing {
|
if serverNamesResp.IsAuditing {
|
||||||
m["type"] = "auditing"
|
m["type"] = "auditing"
|
||||||
m["message"] = "审核中"
|
m["message"] = "审核中"
|
||||||
|
|
||||||
|
auditingPromptResp, err := this.RPC().ServerRPC().FindServerAuditingPrompt(this.AdminContext(), &pb.FindServerAuditingPromptRequest{ServerId: serverId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
m["type"] = "serverErr"
|
||||||
|
m["message"] = "服务器错误"
|
||||||
|
m["todo"] = "错误信息:FindServerNames(): " + err.Error() + ",请联系管理员修复此问题"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var auditingPrompt = auditingPromptResp.PromptText
|
||||||
if len(auditingPrompt) > 0 {
|
if len(auditingPrompt) > 0 {
|
||||||
m["todo"] = auditingPrompt
|
m["todo"] = auditingPrompt
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ func (this *CleanSettingAction) RunPost(params struct {
|
|||||||
ServerAccessLogCleanDays int
|
ServerAccessLogCleanDays int
|
||||||
ServerBandwidthStatCleanDays int
|
ServerBandwidthStatCleanDays int
|
||||||
UserBandwidthStatCleanDays int
|
UserBandwidthStatCleanDays int
|
||||||
|
UserPlanBandwidthStatCleanDays int
|
||||||
ServerDailyStatCleanDays int
|
ServerDailyStatCleanDays int
|
||||||
ServerDomainHourlyStatCleanDays int
|
ServerDomainHourlyStatCleanDays int
|
||||||
TrafficDailyStatCleanDays int
|
TrafficDailyStatCleanDays int
|
||||||
@@ -85,6 +86,11 @@ func (this *CleanSettingAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
config.UserBandwidthStat.Clean.Days = params.UserBandwidthStatCleanDays
|
config.UserBandwidthStat.Clean.Days = params.UserBandwidthStatCleanDays
|
||||||
|
|
||||||
|
if params.UserPlanBandwidthStatCleanDays < 0 {
|
||||||
|
params.UserPlanBandwidthStatCleanDays = 0
|
||||||
|
}
|
||||||
|
config.UserPlanBandwidthStat.Clean.Days = params.UserPlanBandwidthStatCleanDays
|
||||||
|
|
||||||
if params.ServerDailyStatCleanDays < 0 {
|
if params.ServerDailyStatCleanDays < 0 {
|
||||||
params.ServerDailyStatCleanDays = 0
|
params.ServerDailyStatCleanDays = 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ func (this *MySQLInstaller) InstallFromFile(xzFilePath string, targetDir string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// waiting for startup
|
// waiting for startup
|
||||||
for i := 0; i < 5; i++ {
|
for i := 0; i < 30; i++ {
|
||||||
_, err = net.Dial("tcp", "127.0.0.1:3306")
|
_, err = net.Dial("tcp", "127.0.0.1:3306")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
@@ -362,7 +362,7 @@ func (this *MySQLInstaller) InstallFromFile(xzFilePath string, targetDir string)
|
|||||||
this.log("changing mysql password ...")
|
this.log("changing mysql password ...")
|
||||||
var passwordSQL = "ALTER USER 'root'@'localhost' IDENTIFIED BY '" + newPassword + "';"
|
var passwordSQL = "ALTER USER 'root'@'localhost' IDENTIFIED BY '" + newPassword + "';"
|
||||||
{
|
{
|
||||||
var cmd = utils.NewCmd("sh", "-c", baseDir+"/bin/mysql --user=root --password=\""+generatedPassword+"\" --execute=\""+passwordSQL+"\" --connect-expired-password")
|
var cmd = utils.NewCmd("sh", "-c", baseDir+"/bin/mysql --host=\"127.0.0.1\" --user=root --password=\""+generatedPassword+"\" --execute=\""+passwordSQL+"\" --connect-expired-password")
|
||||||
cmd.WithStderr()
|
cmd.WithStderr()
|
||||||
err = cmd.Run()
|
err = cmd.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -408,7 +408,8 @@ func (this *MySQLInstaller) Download() (path string, err error) {
|
|||||||
|
|
||||||
// check latest version
|
// check latest version
|
||||||
this.log("checking mysql latest version ...")
|
this.log("checking mysql latest version ...")
|
||||||
var latestVersion = "8.1.0" // default version
|
var latestVersion = "8.2.0" // default version
|
||||||
|
var majorVersion = "8.2"
|
||||||
{
|
{
|
||||||
req, err := http.NewRequest(http.MethodGet, "https://dev.mysql.com/downloads/mysql/", nil)
|
req, err := http.NewRequest(http.MethodGet, "https://dev.mysql.com/downloads/mysql/", nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -434,6 +435,10 @@ func (this *MySQLInstaller) Download() (path string, err error) {
|
|||||||
var matches = reg.FindSubmatch(data)
|
var matches = reg.FindSubmatch(data)
|
||||||
if len(matches) > 0 {
|
if len(matches) > 0 {
|
||||||
latestVersion = string(matches[1])
|
latestVersion = string(matches[1])
|
||||||
|
var matchPieces = strings.Split(latestVersion, ".")
|
||||||
|
if len(matchPieces) >= 2 {
|
||||||
|
majorVersion = strings.Join(matchPieces[:2], ".")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -441,7 +446,7 @@ func (this *MySQLInstaller) Download() (path string, err error) {
|
|||||||
|
|
||||||
// download
|
// download
|
||||||
this.log("start downloading ...")
|
this.log("start downloading ...")
|
||||||
var downloadURL = "https://cdn.mysql.com/Downloads/MySQL-8.1/mysql-" + latestVersion + "-linux-glibc2.17-x86_64-minimal.tar.xz"
|
var downloadURL = "https://cdn.mysql.com/Downloads/MySQL-" + majorVersion + "/mysql-" + latestVersion + "-linux-glibc2.17-x86_64-minimal.tar.xz"
|
||||||
|
|
||||||
{
|
{
|
||||||
this.log("downloading from url '" + downloadURL + "' ...")
|
this.log("downloading from url '" + downloadURL + "' ...")
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.REQUEST_COND_COMPONENTS = ")
|
buffer.WriteString("window.REQUEST_COND_COMPONENTS = ")
|
||||||
buffer.Write(typesJSON)
|
buffer.Write(typesJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 条件操作符
|
// 条件操作符
|
||||||
@@ -81,7 +81,7 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.REQUEST_COND_OPERATORS = ")
|
buffer.WriteString("window.REQUEST_COND_OPERATORS = ")
|
||||||
buffer.Write(requestOperatorsJSON)
|
buffer.Write(requestOperatorsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 请求变量
|
// 请求变量
|
||||||
@@ -91,7 +91,7 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.REQUEST_VARIABLES = ")
|
buffer.WriteString("window.REQUEST_VARIABLES = ")
|
||||||
buffer.Write(requestVariablesJSON)
|
buffer.Write(requestVariablesJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 指标
|
// 指标
|
||||||
@@ -101,7 +101,7 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.METRIC_HTTP_KEYS = ")
|
buffer.WriteString("window.METRIC_HTTP_KEYS = ")
|
||||||
buffer.Write(metricHTTPKeysJSON)
|
buffer.Write(metricHTTPKeysJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IP地址阈值项目
|
// IP地址阈值项目
|
||||||
@@ -111,7 +111,7 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.IP_ADDR_THRESHOLD_ITEMS = ")
|
buffer.WriteString("window.IP_ADDR_THRESHOLD_ITEMS = ")
|
||||||
buffer.Write(ipAddrThresholdItemsJSON)
|
buffer.Write(ipAddrThresholdItemsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IP地址阈值动作
|
// IP地址阈值动作
|
||||||
@@ -121,7 +121,7 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.IP_ADDR_THRESHOLD_ACTIONS = ")
|
buffer.WriteString("window.IP_ADDR_THRESHOLD_ACTIONS = ")
|
||||||
buffer.Write(ipAddrThresholdActionsJSON)
|
buffer.Write(ipAddrThresholdActionsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WAF操作符
|
// WAF操作符
|
||||||
@@ -131,7 +131,17 @@ func (this *ComponentsAction) RunGet(params struct{}) {
|
|||||||
} else {
|
} else {
|
||||||
buffer.WriteString("window.WAF_RULE_OPERATORS = ")
|
buffer.WriteString("window.WAF_RULE_OPERATORS = ")
|
||||||
buffer.Write(wafOperatorsJSON)
|
buffer.Write(wafOperatorsJSON)
|
||||||
buffer.Write([]byte{'\n', '\n'})
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WAF验证码类型
|
||||||
|
captchaTypesJSON, err := json.Marshal(firewallconfigs.FindAllCaptchaTypes())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal captcha types failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.WAF_CAPTCHA_TYPES = ")
|
||||||
|
buffer.Write(captchaTypesJSON)
|
||||||
|
buffer.Write([]byte{';', '\n', '\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
componentsData = buffer.Bytes()
|
componentsData = buffer.Bytes()
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ func init() {
|
|||||||
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeUser)).
|
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeUser)).
|
||||||
Data("teaMenu", "users").
|
Data("teaMenu", "users").
|
||||||
Prefix("/users").
|
Prefix("/users").
|
||||||
|
Data("teaSubMenu", "users").
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
GetPost("/createPopup", new(CreatePopupAction)).
|
GetPost("/createPopup", new(CreatePopupAction)).
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/users/userutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/users/userutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
)
|
)
|
||||||
@@ -60,13 +61,9 @@ func (this *UserAction) RunGet(params struct {
|
|||||||
// IP地址
|
// IP地址
|
||||||
var registeredRegion = ""
|
var registeredRegion = ""
|
||||||
if len(user.RegisteredIP) > 0 {
|
if len(user.RegisteredIP) > 0 {
|
||||||
regionResp, err := this.RPC().IPLibraryRPC().LookupIPRegion(this.AdminContext(), &pb.LookupIPRegionRequest{Ip: user.RegisteredIP})
|
var ipRegion = iplibrary.LookupIP(user.RegisteredIP)
|
||||||
if err != nil {
|
if ipRegion != nil && ipRegion.IsOk() {
|
||||||
this.ErrorPage(err)
|
registeredRegion = ipRegion.Summary()
|
||||||
return
|
|
||||||
}
|
|
||||||
if regionResp.IpRegion != nil {
|
|
||||||
registeredRegion = regionResp.IpRegion.Summary
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user