mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-19 17:10:24 +08:00
健康检查支持UserAgent和是否基础请求设置
This commit is contained in:
@@ -5,6 +5,7 @@ pkg/
|
|||||||
messageconfigs - 消息通知相关配置
|
messageconfigs - 消息通知相关配置
|
||||||
monitorconfigs - 监控相关配置
|
monitorconfigs - 监控相关配置
|
||||||
nodeconfigs - 边缘节点相关配置
|
nodeconfigs - 边缘节点相关配置
|
||||||
|
nodeutils - 边缘节点相关函数
|
||||||
serverconfigs - 网站服务相关配置
|
serverconfigs - 网站服务相关配置
|
||||||
systemconfigs - 系统全局配置
|
systemconfigs - 系统全局配置
|
||||||
reporterconfigs - 区域监控终端配置
|
reporterconfigs - 区域监控终端配置
|
||||||
|
|||||||
72
pkg/nodeutils/aes_256.go
Normal file
72
pkg/nodeutils/aes_256.go
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package nodeutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/aes"
|
||||||
|
"crypto/cipher"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AES256CFBMethod struct {
|
||||||
|
block cipher.Block
|
||||||
|
iv []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES256CFBMethod) Init(key, iv []byte) error {
|
||||||
|
// 判断key是否为32长度
|
||||||
|
l := len(key)
|
||||||
|
if l > 32 {
|
||||||
|
key = key[:32]
|
||||||
|
} else if l < 32 {
|
||||||
|
key = append(key, bytes.Repeat([]byte{' '}, 32-l)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
block, err := aes.NewCipher(key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
this.block = block
|
||||||
|
|
||||||
|
// 判断iv长度
|
||||||
|
l2 := len(iv)
|
||||||
|
if l2 > aes.BlockSize {
|
||||||
|
iv = iv[:aes.BlockSize]
|
||||||
|
} else if l2 < aes.BlockSize {
|
||||||
|
iv = append(iv, bytes.Repeat([]byte{' '}, aes.BlockSize-l2)...)
|
||||||
|
}
|
||||||
|
this.iv = iv
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES256CFBMethod) Encrypt(src []byte) (dst []byte, err error) {
|
||||||
|
if len(src) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = recover()
|
||||||
|
}()
|
||||||
|
|
||||||
|
dst = make([]byte, len(src))
|
||||||
|
|
||||||
|
encrypter := cipher.NewCFBEncrypter(this.block, this.iv)
|
||||||
|
encrypter.XORKeyStream(dst, src)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES256CFBMethod) Decrypt(dst []byte) (src []byte, err error) {
|
||||||
|
if len(dst) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = recover()
|
||||||
|
}()
|
||||||
|
|
||||||
|
src = make([]byte, len(dst))
|
||||||
|
decrypter := cipher.NewCFBDecrypter(this.block, this.iv)
|
||||||
|
decrypter.XORKeyStream(src, dst)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
75
pkg/nodeutils/aes_utils.go
Normal file
75
pkg/nodeutils/aes_utils.go
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package nodeutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EncryptData 加密
|
||||||
|
func EncryptData(nodeUniqueId string, nodeSecret string, data maps.Map, timeout int32) (string, error) {
|
||||||
|
if data == nil {
|
||||||
|
data = maps.Map{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var expiresAt int64
|
||||||
|
if timeout > 0 {
|
||||||
|
expiresAt = time.Now().Unix() + int64(timeout)
|
||||||
|
}
|
||||||
|
|
||||||
|
dataJSON, err := json.Marshal(maps.Map{
|
||||||
|
"expiresAt": expiresAt,
|
||||||
|
"data": data,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", errors.New("marshal data to json failed: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var method = &AES256CFBMethod{}
|
||||||
|
err = method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
result, err := method.Encrypt(dataJSON)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return base64.StdEncoding.EncodeToString(result), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecryptData 解密
|
||||||
|
func DecryptData(nodeUniqueId string, nodeSecret string, encodedString string) (maps.Map, error) {
|
||||||
|
var method = &AES256CFBMethod{}
|
||||||
|
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
encodedData, err := base64.StdEncoding.DecodeString(encodedString)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("base64 decode failed: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
dataJSON, err := method.Decrypt(encodedData)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = maps.Map{}
|
||||||
|
err = json.Unmarshal(dataJSON, &result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("unmarshal data failed: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var expiresAt = result.GetInt64("expiresAt")
|
||||||
|
if expiresAt > 0 && expiresAt < time.Now().Unix() {
|
||||||
|
return nil, errors.New("data is expired")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.GetMap("data"), nil
|
||||||
|
}
|
||||||
32
pkg/nodeutils/aes_utils_test.go
Normal file
32
pkg/nodeutils/aes_utils_test.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package nodeutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEncryptData(t *testing.T) {
|
||||||
|
e, err := EncryptData("a", "b", maps.Map{
|
||||||
|
"c": 1,
|
||||||
|
}, 5)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("e:", e)
|
||||||
|
|
||||||
|
s, err := DecryptData("a", "b", e)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("s:", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkEncryptData(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
_, _ = EncryptData("a", "b", maps.Map{
|
||||||
|
"c": 1,
|
||||||
|
}, 5)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,20 +5,24 @@ import (
|
|||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const HealthCheckHeaderName = "Edge-Health-Check-Key"
|
||||||
|
|
||||||
// HealthCheckConfig 健康检查设置
|
// HealthCheckConfig 健康检查设置
|
||||||
type HealthCheckConfig struct {
|
type HealthCheckConfig struct {
|
||||||
IsOn bool `yaml:"isOn" json:"isOn"` // 是否开启
|
IsOn bool `yaml:"isOn" json:"isOn"` // 是否开启
|
||||||
URL string `yaml:"url" json:"url"` // 读取的URL
|
URL string `yaml:"url" json:"url"` // 读取的URL
|
||||||
Interval *shared.TimeDuration `yaml:"interval" json:"interval"` // 检测周期
|
Interval *shared.TimeDuration `yaml:"interval" json:"interval"` // 检测周期
|
||||||
StatusCodes []int `yaml:"statusCodes" json:"statusCodes"` // 返回的状态码要求
|
StatusCodes []int `yaml:"statusCodes" json:"statusCodes"` // 返回的状态码要求
|
||||||
Timeout *shared.TimeDuration `yaml:"timeout" json:"timeout"` // 超时时间
|
Timeout *shared.TimeDuration `yaml:"timeout" json:"timeout"` // 超时时间
|
||||||
CountTries int64 `yaml:"countTries" json:"countTries"` // 尝试次数
|
CountTries int64 `yaml:"countTries" json:"countTries"` // 尝试次数
|
||||||
TryDelay *shared.TimeDuration `yaml:"tryDelay" json:"tryDelay"` // 尝试间隔
|
TryDelay *shared.TimeDuration `yaml:"tryDelay" json:"tryDelay"` // 尝试间隔
|
||||||
FailActions []maps.Map `yaml:"failActions" json:"failActions"` // 失败采取的动作 TODO
|
FailActions []maps.Map `yaml:"failActions" json:"failActions"` // 失败采取的动作 TODO
|
||||||
RecoverActions []maps.Map `yaml:"recoverActions" json:"recoverActions"` // 恢复采取的动作 TODO
|
RecoverActions []maps.Map `yaml:"recoverActions" json:"recoverActions"` // 恢复采取的动作 TODO
|
||||||
AutoDown bool `yaml:"autoDown" json:"autoDown"` // 是否自动下线
|
AutoDown bool `yaml:"autoDown" json:"autoDown"` // 是否自动下线
|
||||||
CountUp int `yaml:"countUp" json:"countUp"` // 连续在线认定次数
|
CountUp int `yaml:"countUp" json:"countUp"` // 连续在线认定次数
|
||||||
CountDown int `yaml:"countDown" json:"countDown"` // 连续离线认定次数
|
CountDown int `yaml:"countDown" json:"countDown"` // 连续离线认定次数
|
||||||
|
UserAgent string `yaml:"userAgent" json:"userAgent"` // 发起请求用的UserAgent
|
||||||
|
OnlyBasicRequest bool `yaml:"onlyBasicRequest" json:"onlyBasicRequest"` // 只做基础的请求,不处理WAF、反向代理等
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init 初始化
|
// Init 初始化
|
||||||
|
|||||||
Reference in New Issue
Block a user