Compare commits
126 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3674fa2c1 | ||
|
|
a14cbe1319 | ||
|
|
c03c35de88 | ||
|
|
dc6c649af8 | ||
|
|
b0d2bdb0ba | ||
|
|
9239dd9a8b | ||
|
|
07a368a0bd | ||
|
|
b8d6d1c249 | ||
|
|
0f1d6a1ad2 | ||
|
|
37c6928ffc | ||
|
|
7478b6dbe0 | ||
|
|
e3cd6e1441 | ||
|
|
8081d968b6 | ||
|
|
a226eee6ef | ||
|
|
8b5a21e593 | ||
|
|
2c71f6c6be | ||
|
|
1a50b01edf | ||
|
|
05f08eeb4c | ||
|
|
fdc3ebb5c5 | ||
|
|
8f06bccd48 | ||
|
|
16b4eb67d4 | ||
|
|
ffa545cb41 | ||
|
|
f67454d51c | ||
|
|
8ae54c56db | ||
|
|
9a17adcc6f | ||
|
|
4dd6903025 | ||
|
|
085770d0ad | ||
|
|
fbaba7c37d | ||
|
|
d5cea208d2 | ||
|
|
36397adca4 | ||
|
|
4971e25d44 | ||
|
|
150357441d | ||
|
|
c4ee663285 | ||
|
|
8c95b4a9b9 | ||
|
|
32ba919851 | ||
|
|
eb37345e85 | ||
|
|
681e454917 | ||
|
|
7c7b82dee4 | ||
|
|
2ae47af8f0 | ||
|
|
b72d91d0d4 | ||
|
|
56010e7203 | ||
|
|
f658698f7b | ||
|
|
b708b9c6df | ||
|
|
c2908e17fa | ||
|
|
302daab824 | ||
|
|
ec49f238d6 | ||
|
|
3e43a5d866 | ||
|
|
a99d5e68e9 | ||
|
|
28514276ec | ||
|
|
b611427c17 | ||
|
|
ce7a4ead04 | ||
|
|
5fe15a85fd | ||
|
|
ae412909f6 | ||
|
|
c6ed579797 | ||
|
|
b2a525268e | ||
|
|
eb78b4881c | ||
|
|
4ce6e5a9f6 | ||
|
|
15d7e75555 | ||
|
|
6453cc6ccc | ||
|
|
d882a2eb63 | ||
|
|
065ac4aa25 | ||
|
|
dea54fc55e | ||
|
|
8f425bd9c7 | ||
|
|
9d909d73b8 | ||
|
|
b417d50a28 | ||
|
|
aa93a2f702 | ||
|
|
ba7125e773 | ||
|
|
46a7eaa4bb | ||
|
|
887439a6fe | ||
|
|
0e2b07d06d | ||
|
|
b7d4bde11b | ||
|
|
9707360948 | ||
|
|
103a8eb092 | ||
|
|
dcba4f9376 | ||
|
|
12aaa6fcb1 | ||
|
|
d8393481a4 | ||
|
|
70d3202a2c | ||
|
|
c7f1bbc03d | ||
|
|
61a55cb3f4 | ||
|
|
6a484af775 | ||
|
|
3074d41cf2 | ||
|
|
54199058e3 | ||
|
|
87a533791b | ||
|
|
c3109bb2c6 | ||
|
|
031cb836d2 | ||
|
|
aa0a9134cb | ||
|
|
749eac74fe | ||
|
|
ac39908737 | ||
|
|
bb8f4bf488 | ||
|
|
db0d157a74 | ||
|
|
bd8e1bbe71 | ||
|
|
7aba898cf5 | ||
|
|
baf039755f | ||
|
|
70977f7d80 | ||
|
|
884342d6af | ||
|
|
411b0fb4c2 | ||
|
|
8053fb2399 | ||
|
|
ed42dcab9c | ||
|
|
866b5b0f2f | ||
|
|
5834a1a0fa | ||
|
|
8c6d845603 | ||
|
|
667f363f3c | ||
|
|
e209ff38d9 | ||
|
|
ea915993b6 | ||
|
|
72d0468c6a | ||
|
|
35ae13b1c3 | ||
|
|
1d9460f565 | ||
|
|
e9a3ed71b4 | ||
|
|
e344e5b7e6 | ||
|
|
e814064403 | ||
|
|
f5aeb5cbcd | ||
|
|
f41164b892 | ||
|
|
03073c8364 | ||
|
|
a359bff531 | ||
|
|
3789ac6433 | ||
|
|
9f53f59f18 | ||
|
|
521bd746e3 | ||
|
|
3d8e43a42b | ||
|
|
9452e1852d | ||
|
|
3920d24af6 | ||
|
|
3af11e6ba8 | ||
|
|
7bcde46d49 | ||
|
|
0b73041718 | ||
|
|
dcdc0cb8c1 | ||
|
|
ad6ac1aad6 | ||
|
|
249dc6accd |
@@ -20,6 +20,18 @@ function build() {
|
|||||||
TAG="community"
|
TAG="community"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# checking environment
|
||||||
|
echo "checking required commands ..."
|
||||||
|
commands=("zip" "unzip" "go" "find" "sed")
|
||||||
|
for cmd in "${commands[@]}"; do
|
||||||
|
if [ `which ${cmd}` ]; then
|
||||||
|
echo "checking ${cmd}: ok"
|
||||||
|
else
|
||||||
|
echo "checking ${cmd}: not found"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
VERSION=$(lookup-version $ROOT/../internal/const/const.go)
|
VERSION=$(lookup-version $ROOT/../internal/const/const.go)
|
||||||
ZIP="${NAME}-${OS}-${ARCH}-${TAG}-v${VERSION}.zip"
|
ZIP="${NAME}-${OS}-${ARCH}-${TAG}-v${VERSION}.zip"
|
||||||
|
|
||||||
@@ -38,6 +50,10 @@ function build() {
|
|||||||
echo "=============================="
|
echo "=============================="
|
||||||
cd -
|
cd -
|
||||||
|
|
||||||
|
# generate files
|
||||||
|
echo "generating files ..."
|
||||||
|
go run -tags $TAG $ROOT/../cmd/edge-admin/main.go generate
|
||||||
|
|
||||||
# create dir & copy files
|
# create dir & copy files
|
||||||
echo "copying ..."
|
echo "copying ..."
|
||||||
if [ ! -d $DIST ]; then
|
if [ ! -d $DIST ]; then
|
||||||
@@ -51,6 +67,19 @@ function build() {
|
|||||||
rm -f $DIST/web/tmp/*
|
rm -f $DIST/web/tmp/*
|
||||||
cp $ROOT/configs/server.template.yaml $DIST/configs/
|
cp $ROOT/configs/server.template.yaml $DIST/configs/
|
||||||
|
|
||||||
|
# change _plus.[ext] to .[ext]
|
||||||
|
if [ "${TAG}" = "plus" ]; then
|
||||||
|
echo "converting filenames ..."
|
||||||
|
exts=("html" "js" "css")
|
||||||
|
for ext in "${exts[@]}"; do
|
||||||
|
pattern="*_plus."${ext}
|
||||||
|
find $DIST/web/views -type f -name $pattern | \
|
||||||
|
while read filename; do
|
||||||
|
mv ${filename} "${filename/_plus."${ext}"/."${ext}"}"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
EDGE_API_ZIP_FILE=$ROOT"/../../EdgeAPI/dist/edge-api-${OS}-${ARCH}-${TAG}-v${APINodeVersion}.zip"
|
EDGE_API_ZIP_FILE=$ROOT"/../../EdgeAPI/dist/edge-api-${OS}-${ARCH}-${TAG}-v${APINodeVersion}.zip"
|
||||||
cp $EDGE_API_ZIP_FILE $DIST/
|
cp $EDGE_API_ZIP_FILE $DIST/
|
||||||
cd $DIST/
|
cd $DIST/
|
||||||
@@ -67,6 +96,7 @@ function build() {
|
|||||||
find $DIST -name ".gitignore" -delete
|
find $DIST -name ".gitignore" -delete
|
||||||
find $DIST -name "*.less" -delete
|
find $DIST -name "*.less" -delete
|
||||||
find $DIST -name "*.css.map" -delete
|
find $DIST -name "*.css.map" -delete
|
||||||
|
find $DIST -name "*.js.map" -delete
|
||||||
|
|
||||||
# zip
|
# zip
|
||||||
echo "zip files ..."
|
echo "zip files ..."
|
||||||
|
|||||||
3
build/generate.sh
Executable file
3
build/generate.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
go run -tags=community ../cmd/edge-admin/main.go generate
|
||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeAdmin/internal/apps"
|
"github.com/TeaOSLab/EdgeAdmin/internal/apps"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configs"
|
"github.com/TeaOSLab/EdgeAdmin/internal/configs"
|
||||||
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/gen"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/nodes"
|
"github.com/TeaOSLab/EdgeAdmin/internal/nodes"
|
||||||
_ "github.com/TeaOSLab/EdgeAdmin/internal/web"
|
_ "github.com/TeaOSLab/EdgeAdmin/internal/web"
|
||||||
_ "github.com/iwind/TeaGo/bootstrap"
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
@@ -70,6 +71,13 @@ func main() {
|
|||||||
}
|
}
|
||||||
fmt.Println("change demo mode successfully")
|
fmt.Println("change demo mode successfully")
|
||||||
})
|
})
|
||||||
|
app.On("generate", func() {
|
||||||
|
err := gen.Generate()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("generate failed: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
app.Run(func() {
|
app.Run(func() {
|
||||||
adminNode := nodes.NewAdminNode()
|
adminNode := nodes.NewAdminNode()
|
||||||
adminNode.Run()
|
adminNode.Run()
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -11,7 +11,7 @@ require (
|
|||||||
github.com/go-yaml/yaml v2.1.0+incompatible
|
github.com/go-yaml/yaml v2.1.0+incompatible
|
||||||
github.com/google/go-cmp v0.5.6 // indirect
|
github.com/google/go-cmp v0.5.6 // indirect
|
||||||
github.com/iwind/TeaGo v0.0.0-20211026123858-7de7a21cad24
|
github.com/iwind/TeaGo v0.0.0-20211026123858-7de7a21cad24
|
||||||
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3
|
github.com/iwind/gosock v0.0.0-20211103081026-ee4652210ca4
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/miekg/dns v1.1.35
|
github.com/miekg/dns v1.1.35
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -68,6 +68,8 @@ github.com/iwind/TeaGo v0.0.0-20211026123858-7de7a21cad24 h1:1cGulkD2SNJJRok5OKw
|
|||||||
github.com/iwind/TeaGo v0.0.0-20211026123858-7de7a21cad24/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
|
github.com/iwind/TeaGo v0.0.0-20211026123858-7de7a21cad24/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
|
||||||
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3 h1:aBSonas7vFcgTj9u96/bWGILGv1ZbUSTLiOzcI1ZT6c=
|
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3 h1:aBSonas7vFcgTj9u96/bWGILGv1ZbUSTLiOzcI1ZT6c=
|
||||||
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3/go.mod h1:H5Q7SXwbx3a97ecJkaS2sD77gspzE7HFUafBO0peEyA=
|
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3/go.mod h1:H5Q7SXwbx3a97ecJkaS2sD77gspzE7HFUafBO0peEyA=
|
||||||
|
github.com/iwind/gosock v0.0.0-20211103081026-ee4652210ca4 h1:VWGsCqTzObdlbf7UUE3oceIpcEKi4C/YBUszQXk118A=
|
||||||
|
github.com/iwind/gosock v0.0.0-20211103081026-ee4652210ca4/go.mod h1:H5Q7SXwbx3a97ecJkaS2sD77gspzE7HFUafBO0peEyA=
|
||||||
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
|
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
|
||||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import (
|
|||||||
var plusConfigFile = "plus.cache.json"
|
var plusConfigFile = "plus.cache.json"
|
||||||
|
|
||||||
type PlusConfig struct {
|
type PlusConfig struct {
|
||||||
IsPlus bool `json:"isPlus"`
|
IsPlus bool `json:"isPlus"`
|
||||||
|
Components []string `json:"components"`
|
||||||
|
DayTo string `json:"dayTo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadPlusConfig() *PlusConfig {
|
func ReadPlusConfig() *PlusConfig {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package teaconst
|
package teaconst
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version = "0.3.3"
|
Version = "0.3.7"
|
||||||
|
|
||||||
APINodeVersion = "0.3.3"
|
APINodeVersion = "0.3.7"
|
||||||
|
|
||||||
ProductName = "Edge Admin"
|
ProductName = "Edge Admin"
|
||||||
ProcessName = "edge-admin"
|
ProcessName = "edge-admin"
|
||||||
@@ -18,4 +18,5 @@ const (
|
|||||||
CookieSID = "edgesid"
|
CookieSID = "edgesid"
|
||||||
|
|
||||||
SystemdServiceName = "edge-admin"
|
SystemdServiceName = "edge-admin"
|
||||||
|
UpdatesURL = "https://goedge.cn/api/boot/versions?os=${os}&arch=${arch}"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
//go:build community
|
||||||
|
// +build community
|
||||||
|
|
||||||
package teaconst
|
package teaconst
|
||||||
|
|
||||||
// IsPlus 是否为企业版
|
|
||||||
var IsPlus = false
|
var IsPlus = false
|
||||||
|
|||||||
129
internal/gen/generate.go
Normal file
129
internal/gen/generate.go
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package gen
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/conds/condutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||||||
|
"github.com/iwind/TeaGo/Tea"
|
||||||
|
"github.com/iwind/TeaGo/files"
|
||||||
|
"github.com/iwind/TeaGo/logs"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Generate() error {
|
||||||
|
err := generateComponentsJSFile()
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("generate 'components.js' failed: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成Javascript文件
|
||||||
|
func generateComponentsJSFile() error {
|
||||||
|
var buffer = bytes.NewBuffer([]byte{})
|
||||||
|
|
||||||
|
var webRoot string
|
||||||
|
if Tea.IsTesting() {
|
||||||
|
webRoot = Tea.Root + "/../web/public/js/components/"
|
||||||
|
} else {
|
||||||
|
webRoot = Tea.Root + "/web/public/js/components/"
|
||||||
|
}
|
||||||
|
f := files.NewFile(webRoot)
|
||||||
|
|
||||||
|
f.Range(func(file *files.File) {
|
||||||
|
if !file.IsFile() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if file.Ext() != ".js" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data, err := file.ReadAll()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
buffer.Write(data)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 条件组件
|
||||||
|
typesJSON, err := json.Marshal(condutils.ReadAllAvailableCondTypes())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal request cond types failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.REQUEST_COND_COMPONENTS = ")
|
||||||
|
buffer.Write(typesJSON)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 条件操作符
|
||||||
|
requestOperatorsJSON, err := json.Marshal(shared.AllRequestOperators())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal request operators failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.REQUEST_COND_OPERATORS = ")
|
||||||
|
buffer.Write(requestOperatorsJSON)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求变量
|
||||||
|
requestVariablesJSON, err := json.Marshal(shared.DefaultRequestVariables())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal request variables failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.REQUEST_VARIABLES = ")
|
||||||
|
buffer.Write(requestVariablesJSON)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 指标
|
||||||
|
metricHTTPKeysJSON, err := json.Marshal(serverconfigs.FindAllMetricKeyDefinitions(serverconfigs.MetricItemCategoryHTTP))
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal metric http keys failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.METRIC_HTTP_KEYS = ")
|
||||||
|
buffer.Write(metricHTTPKeysJSON)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP地址阈值项目
|
||||||
|
ipAddrThresholdItemsJSON, err := json.Marshal(nodeconfigs.FindAllIPAddressThresholdItems())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal ip addr threshold items failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.IP_ADDR_THRESHOLD_ITEMS = ")
|
||||||
|
buffer.Write(ipAddrThresholdItemsJSON)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP地址阈值动作
|
||||||
|
ipAddrThresholdActionsJSON, err := json.Marshal(nodeconfigs.FindAllIPAddressThresholdActions())
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("ComponentsAction marshal ip addr threshold actions failed: " + err.Error())
|
||||||
|
} else {
|
||||||
|
buffer.WriteString("window.IP_ADDR_THRESHOLD_ACTIONS = ")
|
||||||
|
buffer.Write(ipAddrThresholdActionsJSON)
|
||||||
|
buffer.Write([]byte{'\n', '\n'})
|
||||||
|
}
|
||||||
|
|
||||||
|
fp, err := os.OpenFile(filepath.Clean(Tea.PublicFile("/js/components.js")), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.Copy(fp, buffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
13
internal/gen/generate_test.go
Normal file
13
internal/gen/generate_test.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package gen
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestGenerate(t *testing.T) {
|
||||||
|
err := Generate()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("ok")
|
||||||
|
}
|
||||||
@@ -326,6 +326,16 @@ func (this *AdminNode) listenSock() error {
|
|||||||
case "demo":
|
case "demo":
|
||||||
teaconst.IsDemoMode = !teaconst.IsDemoMode
|
teaconst.IsDemoMode = !teaconst.IsDemoMode
|
||||||
_ = cmd.ReplyOk()
|
_ = cmd.ReplyOk()
|
||||||
|
case "info":
|
||||||
|
exePath, _ := os.Executable()
|
||||||
|
_ = cmd.Reply(&gosock.Command{
|
||||||
|
Code: "info",
|
||||||
|
Params: map[string]interface{}{
|
||||||
|
"pid": os.Getpid(),
|
||||||
|
"version": teaconst.Version,
|
||||||
|
"path": exePath,
|
||||||
|
},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ type RPCClient struct {
|
|||||||
apiConfig *configs.APIConfig
|
apiConfig *configs.APIConfig
|
||||||
conns []*grpc.ClientConn
|
conns []*grpc.ClientConn
|
||||||
|
|
||||||
locker sync.Mutex
|
locker sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRPCClient 构造新的RPC客户端
|
// NewRPCClient 构造新的RPC客户端
|
||||||
func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) {
|
func NewRPCClient(apiConfig *configs.APIConfig, isPrimary bool) (*RPCClient, error) {
|
||||||
if apiConfig == nil {
|
if apiConfig == nil {
|
||||||
return nil, errors.New("api config should not be nil")
|
return nil, errors.New("api config should not be nil")
|
||||||
}
|
}
|
||||||
@@ -46,7 +46,9 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 设置RPC
|
// 设置RPC
|
||||||
dao.SetRPC(client)
|
if isPrimary {
|
||||||
|
dao.SetRPC(client)
|
||||||
|
}
|
||||||
|
|
||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
@@ -380,6 +382,18 @@ func (this *RPCClient) UserBillRPC() pb.UserBillServiceClient {
|
|||||||
return pb.NewUserBillServiceClient(this.pickConn())
|
return pb.NewUserBillServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *RPCClient) UserAccountRPC() pb.UserAccountServiceClient {
|
||||||
|
return pb.NewUserAccountServiceClient(this.pickConn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *RPCClient) UserAccountLogRPC() pb.UserAccountLogServiceClient {
|
||||||
|
return pb.NewUserAccountLogServiceClient(this.pickConn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *RPCClient) UserAccountDailyStatRPC() pb.UserAccountDailyStatServiceClient {
|
||||||
|
return pb.NewUserAccountDailyStatServiceClient(this.pickConn())
|
||||||
|
}
|
||||||
|
|
||||||
func (this *RPCClient) UserAccessKeyRPC() pb.UserAccessKeyServiceClient {
|
func (this *RPCClient) UserAccessKeyRPC() pb.UserAccessKeyServiceClient {
|
||||||
return pb.NewUserAccessKeyServiceClient(this.pickConn())
|
return pb.NewUserAccessKeyServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
@@ -521,7 +535,11 @@ func (this *RPCClient) APIContext(apiNodeId int64) context.Context {
|
|||||||
// UpdateConfig 修改配置
|
// UpdateConfig 修改配置
|
||||||
func (this *RPCClient) UpdateConfig(config *configs.APIConfig) error {
|
func (this *RPCClient) UpdateConfig(config *configs.APIConfig) error {
|
||||||
this.apiConfig = config
|
this.apiConfig = config
|
||||||
return this.init()
|
|
||||||
|
this.locker.Lock()
|
||||||
|
err := this.init()
|
||||||
|
this.locker.Unlock()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
@@ -599,3 +617,20 @@ func (this *RPCClient) pickConn() *grpc.ClientConn {
|
|||||||
|
|
||||||
return this.conns[rands.Int(0, len(this.conns)-1)]
|
return this.conns[rands.Int(0, len(this.conns)-1)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close 关闭
|
||||||
|
func (this *RPCClient) Close() error {
|
||||||
|
this.locker.Lock()
|
||||||
|
defer this.locker.Unlock()
|
||||||
|
|
||||||
|
var lastErr error
|
||||||
|
for _, conn := range this.conns {
|
||||||
|
var err = conn.Close()
|
||||||
|
if err != nil {
|
||||||
|
lastErr = err
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastErr
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func TestRPCClient_NodeRPC(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
rpc, err := NewRPCClient(config)
|
rpc, err := NewRPCClient(config, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,7 @@ func TestRPC_Dial_HTTP(t *testing.T) {
|
|||||||
},
|
},
|
||||||
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
|
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
|
||||||
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
|
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
|
||||||
})
|
}, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -62,7 +62,7 @@ func TestRPC_Dial_HTTP_2(t *testing.T) {
|
|||||||
},
|
},
|
||||||
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
|
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
|
||||||
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
|
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
|
||||||
})
|
}, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ func TestRPC_Dial_HTTPS(t *testing.T) {
|
|||||||
},
|
},
|
||||||
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
|
NodeId: "a7e55782dab39bce0901058a1e14a0e6",
|
||||||
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
|
Secret: "lvyPobI3BszkJopz5nPTocOs0OLkEJ7y",
|
||||||
})
|
}, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func SharedRPC() (*RPCClient, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
client, err := NewRPCClient(config)
|
client, err := NewRPCClient(config, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package setup
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configs"
|
"github.com/TeaOSLab/EdgeAdmin/internal/configs"
|
||||||
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
var isConfigured bool
|
var isConfigured bool
|
||||||
@@ -16,3 +18,16 @@ func IsConfigured() bool {
|
|||||||
isConfigured = err == nil
|
isConfigured = err == nil
|
||||||
return isConfigured
|
return isConfigured
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsNewInstalled IsNew 检查是否新安装
|
||||||
|
func IsNewInstalled() bool {
|
||||||
|
homeDir, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, err = os.Stat(homeDir + "/." + teaconst.ProcessName + "/api.yaml")
|
||||||
|
if err != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ func (this *SyncAPINodesTask) Loop() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
newEndpoints := []string{}
|
newEndpoints := []string{}
|
||||||
for _, node := range resp.Nodes {
|
for _, node := range resp.ApiNodes {
|
||||||
if !node.IsOn {
|
if !node.IsOn {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ func (this *SyncClusterTask) loop() error {
|
|||||||
}
|
}
|
||||||
ctx := rpcClient.Context(0)
|
ctx := rpcClient.Context(0)
|
||||||
|
|
||||||
tasksResp, err := rpcClient.NodeTaskRPC().FindNotifyingNodeTasks(ctx, &pb.FindNotifyingNodeTasksRequest{Size: 100})
|
tasksResp, err := rpcClient.NodeTaskRPC().FindNotifyingNodeTasks(ctx, &pb.FindNotifyingNodeTasksRequest{Size: 500})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
"math/big"
|
"math/big"
|
||||||
"net"
|
"net"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 将IP转换为整型
|
// IP2Long 将IP转换为整型
|
||||||
func IP2Long(ip string) uint64 {
|
func IP2Long(ip string) uint64 {
|
||||||
s := net.ParseIP(ip)
|
s := net.ParseIP(ip)
|
||||||
if len(s) != 16 {
|
if len(s) != 16 {
|
||||||
@@ -23,7 +26,7 @@ func IP2Long(ip string) uint64 {
|
|||||||
return uint64(binary.BigEndian.Uint32(s.To4()))
|
return uint64(binary.BigEndian.Uint32(s.To4()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否为IPv4
|
// IsIPv4 判断是否为IPv4
|
||||||
func IsIPv4(ip string) bool {
|
func IsIPv4(ip string) bool {
|
||||||
if !regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`).MatchString(ip) {
|
if !regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`).MatchString(ip) {
|
||||||
return false
|
return false
|
||||||
@@ -34,10 +37,100 @@ func IsIPv4(ip string) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否为IPv6
|
// IsIPv6 判断是否为IPv6
|
||||||
func IsIPv6(ip string) bool {
|
func IsIPv6(ip string) bool {
|
||||||
if !strings.Contains(ip, ":") {
|
if !strings.Contains(ip, ":") {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return len(net.ParseIP(ip)) == net.IPv6len
|
return len(net.ParseIP(ip)) == net.IPv6len
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExtractIP 分解IP
|
||||||
|
// 只支持D段掩码的CIDR
|
||||||
|
// 最多只记录255个值
|
||||||
|
func ExtractIP(ipStrings string) ([]string, error) {
|
||||||
|
ipStrings = strings.ReplaceAll(ipStrings, " ", "")
|
||||||
|
|
||||||
|
// CIDR
|
||||||
|
if strings.Contains(ipStrings, "/") {
|
||||||
|
_, cidrNet, err := net.ParseCIDR(ipStrings)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = strings.Index(ipStrings, "/")
|
||||||
|
var ipFrom = ipStrings[:index]
|
||||||
|
var bits = types.Int(ipStrings[index+1:])
|
||||||
|
if bits < 24 {
|
||||||
|
return nil, errors.New("CIDR bits should be greater than 24")
|
||||||
|
}
|
||||||
|
|
||||||
|
var ipv4 = net.ParseIP(ipFrom).To4()
|
||||||
|
if len(ipv4) == 0 {
|
||||||
|
return nil, errors.New("support IPv4 only")
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = []string{}
|
||||||
|
ipv4[3] = 0 // 从0开始
|
||||||
|
for i := 0; i <= 255; i++ {
|
||||||
|
if cidrNet.Contains(ipv4) {
|
||||||
|
result = append(result, ipv4.String())
|
||||||
|
}
|
||||||
|
ipv4 = NextIP(ipv4)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP Range
|
||||||
|
if strings.Contains(ipStrings, "-") {
|
||||||
|
var index = strings.Index(ipStrings, "-")
|
||||||
|
var ipFromString = ipStrings[:index]
|
||||||
|
var ipToString = ipStrings[index+1:]
|
||||||
|
|
||||||
|
var ipFrom = net.ParseIP(ipFromString).To4()
|
||||||
|
if len(ipFrom) == 0 {
|
||||||
|
return nil, errors.New("invalid ip '" + ipFromString + "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
var ipTo = net.ParseIP(ipToString).To4()
|
||||||
|
if len(ipTo) == 0 {
|
||||||
|
return nil, errors.New("invalid ip '" + ipToString + "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.Compare(ipFrom, ipTo) > 0 {
|
||||||
|
ipFrom, ipTo = ipTo, ipFrom
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = []string{}
|
||||||
|
for i := 0; i < 255; i++ {
|
||||||
|
if bytes.Compare(ipFrom, ipTo) > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
result = append(result, ipFrom.String())
|
||||||
|
ipFrom = NextIP(ipFrom)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return []string{ipStrings}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NextIP IP增加1
|
||||||
|
func NextIP(prevIP net.IP) net.IP {
|
||||||
|
var ip = make(net.IP, len(prevIP))
|
||||||
|
copy(ip, prevIP)
|
||||||
|
var index = len(ip) - 1
|
||||||
|
for {
|
||||||
|
if ip[index] == 255 {
|
||||||
|
ip[index] = 0
|
||||||
|
index--
|
||||||
|
if index < 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ip[index]++
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -83,3 +84,27 @@ func TestIsIPv6(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExtractIP(t *testing.T) {
|
||||||
|
t.Log(ExtractIP("192.168.1.100"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExtractIP_CIDR(t *testing.T) {
|
||||||
|
t.Log(ExtractIP("192.168.2.100/24"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExtractIP_Range(t *testing.T) {
|
||||||
|
t.Log(ExtractIP("192.168.2.100 - 192.168.4.2"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNextIP(t *testing.T) {
|
||||||
|
for _, ip := range []string{"192.168.1.1", "0.0.0.0", "255.255.255.255", "192.168.2.255", "192.168.255.255"} {
|
||||||
|
t.Log(ip+":", NextIP(net.ParseIP(ip).To4()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNextIP_Copy(t *testing.T) {
|
||||||
|
var ip = net.ParseIP("192.168.1.100")
|
||||||
|
var nextIP = NextIP(ip)
|
||||||
|
t.Log(ip, nextIP)
|
||||||
|
}
|
||||||
@@ -13,38 +13,30 @@ func FormatInt(value int) string {
|
|||||||
return strconv.Itoa(value)
|
return strconv.Itoa(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func FormatBytes(bytes int64) string {
|
func Pow1024(n int) int64 {
|
||||||
if bytes < 1024 {
|
if n <= 0 {
|
||||||
return FormatInt64(bytes) + "B"
|
return 1
|
||||||
} else if bytes < 1024*1024 {
|
|
||||||
return fmt.Sprintf("%.2fKB", float64(bytes)/1024)
|
|
||||||
} else if bytes < 1024*1024*1024 {
|
|
||||||
return fmt.Sprintf("%.2fMB", float64(bytes)/1024/1024)
|
|
||||||
} else if bytes < 1024*1024*1024*1024 {
|
|
||||||
return fmt.Sprintf("%.2fGB", float64(bytes)/1024/1024/1024)
|
|
||||||
} else if bytes < 1024*1024*1024*1024*1024 {
|
|
||||||
return fmt.Sprintf("%.2fTB", float64(bytes)/1024/1024/1024/1024)
|
|
||||||
} else if bytes < 1024*1024*1024*1024*1024*1024 {
|
|
||||||
return fmt.Sprintf("%.2fPB", float64(bytes)/1024/1024/1024/1024/1024)
|
|
||||||
} else {
|
|
||||||
return fmt.Sprintf("%.2fEB", float64(bytes)/1024/1024/1024/1024/1024/1024)
|
|
||||||
}
|
}
|
||||||
|
if n == 1 {
|
||||||
|
return 1024
|
||||||
|
}
|
||||||
|
return Pow1024(n-1) * 1024
|
||||||
}
|
}
|
||||||
|
|
||||||
func FormatBits(bits int64) string {
|
func FormatBytes(bytes int64) string {
|
||||||
if bits < 1000 {
|
if bytes < Pow1024(1) {
|
||||||
return FormatInt64(bits) + "B"
|
return FormatInt64(bytes) + "B"
|
||||||
} else if bits < 1000*1000 {
|
} else if bytes < Pow1024(2) {
|
||||||
return fmt.Sprintf("%.2fKB", float64(bits)/1000)
|
return fmt.Sprintf("%.2fKB", float64(bytes)/float64(Pow1024(1)))
|
||||||
} else if bits < 1000*1000*1000 {
|
} else if bytes < Pow1024(3) {
|
||||||
return fmt.Sprintf("%.2fMB", float64(bits)/1000/1000)
|
return fmt.Sprintf("%.2fMB", float64(bytes)/float64(Pow1024(2)))
|
||||||
} else if bits < 1000*1000*1000*1000 {
|
} else if bytes < Pow1024(4) {
|
||||||
return fmt.Sprintf("%.2fGB", float64(bits)/1000/1000/1000)
|
return fmt.Sprintf("%.2fGB", float64(bytes)/float64(Pow1024(3)))
|
||||||
} else if bits < 1000*1000*1000*1000*1000 {
|
} else if bytes < Pow1024(5) {
|
||||||
return fmt.Sprintf("%.2fTB", float64(bits)/1000/1000/1000/1000)
|
return fmt.Sprintf("%.2fTB", float64(bytes)/float64(Pow1024(4)))
|
||||||
} else if bits < 1000*1000*1000*1000*1000*1000 {
|
} else if bytes < Pow1024(6) {
|
||||||
return fmt.Sprintf("%.2fPB", float64(bits)/1000/1000/1000/1000/1000)
|
return fmt.Sprintf("%.2fPB", float64(bytes)/float64(Pow1024(5)))
|
||||||
} else {
|
} else {
|
||||||
return fmt.Sprintf("%.2fEB", float64(bits)/1000/1000/1000/1000/1000/1000)
|
return fmt.Sprintf("%.2fEB", float64(bytes)/float64(Pow1024(6)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
16
internal/utils/numberutils/utils_test.go
Normal file
16
internal/utils/numberutils/utils_test.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package numberutils
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestFormatBytes(t *testing.T) {
|
||||||
|
t.Log(FormatBytes(1))
|
||||||
|
t.Log(FormatBytes(1000))
|
||||||
|
t.Log(FormatBytes(1_000_000))
|
||||||
|
t.Log(FormatBytes(1_000_000_000))
|
||||||
|
t.Log(FormatBytes(1_000_000_000_000))
|
||||||
|
t.Log(FormatBytes(1_000_000_000_000_000))
|
||||||
|
t.Log(FormatBytes(1_000_000_000_000_000_000))
|
||||||
|
t.Log(FormatBytes(9_000_000_000_000_000_000))
|
||||||
|
}
|
||||||
@@ -13,16 +13,35 @@ type DeleteAction struct {
|
|||||||
func (this *DeleteAction) RunPost(params struct {
|
func (this *DeleteAction) RunPost(params struct {
|
||||||
NodeId int64
|
NodeId int64
|
||||||
}) {
|
}) {
|
||||||
// TODO 检查权限
|
// 创建日志
|
||||||
|
defer this.CreateLog(oplogs.LevelInfo, "删除API节点 %d", params.NodeId)
|
||||||
|
|
||||||
_, err := this.RPC().APINodeRPC().DeleteAPINode(this.AdminContext(), &pb.DeleteAPINodeRequest{NodeId: params.NodeId})
|
// 检查是否是唯一的节点
|
||||||
|
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{ApiNodeId: params.NodeId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var apiNode = nodeResp.ApiNode
|
||||||
|
if apiNode == nil {
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
|
if apiNode.IsOn {
|
||||||
|
countResp, err := this.RPC().APINodeRPC().CountAllEnabledAndOnAPINodes(this.AdminContext(), &pb.CountAllEnabledAndOnAPINodesRequest{})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if countResp.Count == 1 {
|
||||||
|
this.Fail("无法删除此节点:必须保留至少一个可用的API节点")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = this.RPC().APINodeRPC().DeleteAPINode(this.AdminContext(), &pb.DeleteAPINodeRequest{ApiNodeId: params.NodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建日志
|
|
||||||
defer this.CreateLog(oplogs.LevelInfo, "删除API节点 %d", params.NodeId)
|
|
||||||
|
|
||||||
this.Success()
|
this.Success()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ func (this *IndexAction) RunGet(params struct{}) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, node := range nodesResp.Nodes {
|
for _, node := range nodesResp.ApiNodes {
|
||||||
// 状态
|
// 状态
|
||||||
status := &nodeconfigs.NodeStatus{}
|
status := &nodeconfigs.NodeStatus{}
|
||||||
if len(node.StatusJSON) > 0 {
|
if len(node.StatusJSON) > 0 {
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建日志
|
// 创建日志
|
||||||
defer this.CreateLog(oplogs.LevelInfo, "创建API节点 %d", createResp.NodeId)
|
defer this.CreateLog(oplogs.LevelInfo, "创建API节点 %d", createResp.ApiNodeId)
|
||||||
|
|
||||||
this.Success()
|
this.Success()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ func (this *IndexAction) Init() {
|
|||||||
func (this *IndexAction) RunGet(params struct {
|
func (this *IndexAction) RunGet(params struct {
|
||||||
NodeId int64
|
NodeId int64
|
||||||
}) {
|
}) {
|
||||||
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{ApiNodeId: params.NodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
node := nodeResp.Node
|
node := nodeResp.ApiNode
|
||||||
if node == nil {
|
if node == nil {
|
||||||
this.NotFound("apiNode", params.NodeId)
|
this.NotFound("apiNode", params.NodeId)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -21,12 +21,12 @@ func (this *InstallAction) RunGet(params struct {
|
|||||||
NodeId int64
|
NodeId int64
|
||||||
}) {
|
}) {
|
||||||
// API节点信息
|
// API节点信息
|
||||||
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{ApiNodeId: params.NodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
node := nodeResp.Node
|
node := nodeResp.ApiNode
|
||||||
if node == nil {
|
if node == nil {
|
||||||
this.NotFound("apiNode", params.NodeId)
|
this.NotFound("apiNode", params.NodeId)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ func (this *LogsAction) RunGet(params struct {
|
|||||||
this.Data["keyword"] = params.Keyword
|
this.Data["keyword"] = params.Keyword
|
||||||
this.Data["level"] = params.Level
|
this.Data["level"] = params.Level
|
||||||
|
|
||||||
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId})
|
apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{ApiNodeId: params.NodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
apiNode := apiNodeResp.Node
|
apiNode := apiNodeResp.ApiNode
|
||||||
if apiNode == nil {
|
if apiNode == nil {
|
||||||
this.NotFound("apiNode", params.NodeId)
|
this.NotFound("apiNode", params.NodeId)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -23,13 +23,13 @@ func (this *UpdateAction) RunGet(params struct {
|
|||||||
NodeId int64
|
NodeId int64
|
||||||
}) {
|
}) {
|
||||||
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{
|
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{
|
||||||
NodeId: params.NodeId,
|
ApiNodeId: params.NodeId,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
node := nodeResp.Node
|
node := nodeResp.ApiNode
|
||||||
if node == nil {
|
if node == nil {
|
||||||
this.WriteString("要操作的节点不存在")
|
this.WriteString("要操作的节点不存在")
|
||||||
return
|
return
|
||||||
@@ -281,7 +281,7 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().APINodeRPC().UpdateAPINode(this.AdminContext(), &pb.UpdateAPINodeRequest{
|
_, err = this.RPC().APINodeRPC().UpdateAPINode(this.AdminContext(), &pb.UpdateAPINodeRequest{
|
||||||
NodeId: params.NodeId,
|
ApiNodeId: params.NodeId,
|
||||||
Name: params.Name,
|
Name: params.Name,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
HttpJSON: httpJSON,
|
HttpJSON: httpJSON,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package cluster
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
|
"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/grants/grantutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/grants/grantutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
@@ -75,7 +76,7 @@ func (this *CreateNodeAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
apiNodes := apiNodesResp.Nodes
|
apiNodes := apiNodesResp.ApiNodes
|
||||||
apiEndpoints := []string{}
|
apiEndpoints := []string{}
|
||||||
for _, apiNode := range apiNodes {
|
for _, apiNode := range apiNodes {
|
||||||
if !apiNode.IsOn {
|
if !apiNode.IsOn {
|
||||||
@@ -167,9 +168,13 @@ func (this *CreateNodeAction) RunPost(params struct {
|
|||||||
nodeId := createResp.NodeId
|
nodeId := createResp.NodeId
|
||||||
|
|
||||||
// IP地址
|
// IP地址
|
||||||
|
var resultIPAddresses = []string{}
|
||||||
for _, addr := range ipAddresses {
|
for _, addr := range ipAddresses {
|
||||||
|
var resultAddrIds = []int64{}
|
||||||
|
|
||||||
addrId := addr.GetInt64("id")
|
addrId := addr.GetInt64("id")
|
||||||
if addrId > 0 {
|
if addrId > 0 {
|
||||||
|
resultAddrIds = append(resultAddrIds, addrId)
|
||||||
_, err = this.RPC().NodeIPAddressRPC().UpdateNodeIPAddressNodeId(this.AdminContext(), &pb.UpdateNodeIPAddressNodeIdRequest{
|
_, err = this.RPC().NodeIPAddressRPC().UpdateNodeIPAddressNodeId(this.AdminContext(), &pb.UpdateNodeIPAddressNodeIdRequest{
|
||||||
NodeIPAddressId: addrId,
|
NodeIPAddressId: addrId,
|
||||||
NodeId: nodeId,
|
NodeId: nodeId,
|
||||||
@@ -178,20 +183,50 @@ func (this *CreateNodeAction) RunPost(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resultIPAddresses = append(resultIPAddresses, addr.GetString("ip"))
|
||||||
} else {
|
} else {
|
||||||
createResp, err := this.RPC().NodeIPAddressRPC().CreateNodeIPAddress(this.AdminContext(), &pb.CreateNodeIPAddressRequest{
|
var ipStrings = addr.GetString("ip")
|
||||||
NodeId: nodeId,
|
result, err := utils.ExtractIP(ipStrings)
|
||||||
Role: nodeconfigs.NodeRoleNode,
|
|
||||||
Name: addr.GetString("name"),
|
|
||||||
Ip: addr.GetString("ip"),
|
|
||||||
CanAccess: addr.GetBool("canAccess"),
|
|
||||||
IsUp: addr.GetBool("isUp"),
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.Fail("节点创建成功,但是保存IP失败:" + err.Error())
|
||||||
return
|
}
|
||||||
|
|
||||||
|
resultIPAddresses = append(resultIPAddresses, result...)
|
||||||
|
|
||||||
|
if len(result) == 1 {
|
||||||
|
// 单个创建
|
||||||
|
createResp, err := this.RPC().NodeIPAddressRPC().CreateNodeIPAddress(this.AdminContext(), &pb.CreateNodeIPAddressRequest{
|
||||||
|
NodeId: nodeId,
|
||||||
|
Role: nodeconfigs.NodeRoleNode,
|
||||||
|
Name: addr.GetString("name"),
|
||||||
|
Ip: result[0],
|
||||||
|
CanAccess: addr.GetBool("canAccess"),
|
||||||
|
IsUp: addr.GetBool("isUp"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
addrId = createResp.NodeIPAddressId
|
||||||
|
resultAddrIds = append(resultAddrIds, addrId)
|
||||||
|
} else if len(result) > 1 {
|
||||||
|
// 批量创建
|
||||||
|
createResp, err := this.RPC().NodeIPAddressRPC().CreateNodeIPAddresses(this.AdminContext(), &pb.CreateNodeIPAddressesRequest{
|
||||||
|
NodeId: nodeId,
|
||||||
|
Role: nodeconfigs.NodeRoleNode,
|
||||||
|
Name: addr.GetString("name"),
|
||||||
|
IpList: result,
|
||||||
|
CanAccess: addr.GetBool("canAccess"),
|
||||||
|
IsUp: addr.GetBool("isUp"),
|
||||||
|
GroupValue: ipStrings,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resultAddrIds = append(resultAddrIds, createResp.NodeIPAddressIds...)
|
||||||
}
|
}
|
||||||
addrId = createResp.NodeIPAddressId
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 阈值
|
// 阈值
|
||||||
@@ -202,13 +237,16 @@ func (this *CreateNodeAction) RunPost(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().NodeIPAddressThresholdRPC().UpdateAllNodeIPAddressThresholds(this.AdminContext(), &pb.UpdateAllNodeIPAddressThresholdsRequest{
|
|
||||||
NodeIPAddressId: addrId,
|
for _, addrId := range resultAddrIds {
|
||||||
NodeIPAddressThresholdsJSON: thresholdsJSON,
|
_, err = this.RPC().NodeIPAddressThresholdRPC().UpdateAllNodeIPAddressThresholds(this.AdminContext(), &pb.UpdateAllNodeIPAddressThresholdsRequest{
|
||||||
})
|
NodeIPAddressId: addrId,
|
||||||
if err != nil {
|
NodeIPAddressThresholdsJSON: thresholdsJSON,
|
||||||
this.ErrorPage(err)
|
})
|
||||||
return
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,11 +262,6 @@ func (this *CreateNodeAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if nodeResp.Node != nil {
|
if nodeResp.Node != nil {
|
||||||
var addresses = []string{}
|
|
||||||
for _, addrMap := range ipAddresses {
|
|
||||||
addresses = append(addresses, addrMap.GetString("ip"))
|
|
||||||
}
|
|
||||||
|
|
||||||
var grantMap maps.Map = nil
|
var grantMap maps.Map = nil
|
||||||
grantId := params.GrantId
|
grantId := params.GrantId
|
||||||
if grantId > 0 {
|
if grantId > 0 {
|
||||||
@@ -253,7 +286,7 @@ func (this *CreateNodeAction) RunPost(params struct {
|
|||||||
"name": nodeResp.Node.Name,
|
"name": nodeResp.Node.Name,
|
||||||
"uniqueId": nodeResp.Node.UniqueId,
|
"uniqueId": nodeResp.Node.UniqueId,
|
||||||
"secret": nodeResp.Node.Secret,
|
"secret": nodeResp.Node.Secret,
|
||||||
"addresses": addresses,
|
"addresses": resultIPAddresses,
|
||||||
"login": maps.Map{
|
"login": maps.Map{
|
||||||
"id": 0,
|
"id": 0,
|
||||||
"name": "SSH",
|
"name": "SSH",
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ func (this *InstallNodesAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, apiNode := range apiNodesResp.Nodes {
|
for _, apiNode := range apiNodesResp.ApiNodes {
|
||||||
if !apiNode.IsOn {
|
if !apiNode.IsOn {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,9 +86,16 @@ func (this *DetailAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 是否有备用IP
|
||||||
|
var originIP = addr.Ip
|
||||||
|
if len(addr.BackupIP) > 0 {
|
||||||
|
addr.Ip = addr.BackupIP
|
||||||
|
}
|
||||||
|
|
||||||
ipAddressMaps = append(ipAddressMaps, maps.Map{
|
ipAddressMaps = append(ipAddressMaps, maps.Map{
|
||||||
"id": addr.Id,
|
"id": addr.Id,
|
||||||
"name": addr.Name,
|
"name": addr.Name,
|
||||||
|
"originIP": originIP,
|
||||||
"ip": addr.Ip,
|
"ip": addr.Ip,
|
||||||
"canAccess": addr.CanAccess,
|
"canAccess": addr.CanAccess,
|
||||||
"isOn": addr.IsOn,
|
"isOn": addr.IsOn,
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ func (this *InstallAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
apiNodes := apiNodesResp.Nodes
|
apiNodes := apiNodesResp.ApiNodes
|
||||||
apiEndpoints := []string{}
|
apiEndpoints := []string{}
|
||||||
for _, apiNode := range apiNodes {
|
for _, apiNode := range apiNodes {
|
||||||
if !apiNode.IsOn {
|
if !apiNode.IsOn {
|
||||||
|
|||||||
@@ -69,6 +69,20 @@ func (this *LogsAction) RunGet(params struct {
|
|||||||
|
|
||||||
logs := []maps.Map{}
|
logs := []maps.Map{}
|
||||||
for _, log := range logsResp.NodeLogs {
|
for _, log := range logsResp.NodeLogs {
|
||||||
|
// 服务信息
|
||||||
|
var serverMap = maps.Map{"id": 0}
|
||||||
|
if log.ServerId > 0 {
|
||||||
|
serverResp, err := this.RPC().ServerRPC().FindEnabledUserServerBasic(this.AdminContext(), &pb.FindEnabledUserServerBasicRequest{ServerId: log.ServerId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var server = serverResp.Server
|
||||||
|
if server != nil {
|
||||||
|
serverMap = maps.Map{"id": server.Id, "name": server.Name}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logs = append(logs, maps.Map{
|
logs = append(logs, maps.Map{
|
||||||
"tag": log.Tag,
|
"tag": log.Tag,
|
||||||
"description": log.Description,
|
"description": log.Description,
|
||||||
@@ -76,6 +90,7 @@ func (this *LogsAction) RunGet(params struct {
|
|||||||
"level": log.Level,
|
"level": log.Level,
|
||||||
"isToday": timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"),
|
"isToday": timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"),
|
||||||
"count": log.Count,
|
"count": log.Count,
|
||||||
|
"server": serverMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["logs"] = logs
|
this.Data["logs"] = logs
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type IndexAction struct {
|
type IndexAction struct {
|
||||||
@@ -65,22 +66,32 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
this.Data["timeZoneLocation"] = nodeconfigs.FindTimeZoneLocation(cluster.TimeZone)
|
this.Data["timeZoneLocation"] = nodeconfigs.FindTimeZoneLocation(cluster.TimeZone)
|
||||||
|
|
||||||
this.Data["cluster"] = maps.Map{
|
this.Data["cluster"] = maps.Map{
|
||||||
"id": cluster.Id,
|
"id": cluster.Id,
|
||||||
"name": cluster.Name,
|
"name": cluster.Name,
|
||||||
"installDir": cluster.InstallDir,
|
"installDir": cluster.InstallDir,
|
||||||
"timeZone": cluster.TimeZone,
|
"timeZone": cluster.TimeZone,
|
||||||
|
"nodeMaxThreads": cluster.NodeMaxThreads,
|
||||||
|
"nodeTCPMaxConnections": cluster.NodeTCPMaxConnections,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 默认值
|
||||||
|
this.Data["defaultNodeMaxThreads"] = nodeconfigs.DefaultMaxThreads
|
||||||
|
this.Data["defaultNodeMaxThreadsMin"] = nodeconfigs.DefaultMaxThreadsMin
|
||||||
|
this.Data["defaultNodeMaxThreadsMax"] = nodeconfigs.DefaultMaxThreadsMax
|
||||||
|
this.Data["defaultNodeTCPMaxConnections"] = nodeconfigs.DefaultTCPMaxConnections
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
|
|
||||||
// RunPost 保存设置
|
// RunPost 保存设置
|
||||||
func (this *IndexAction) RunPost(params struct {
|
func (this *IndexAction) RunPost(params struct {
|
||||||
ClusterId int64
|
ClusterId int64
|
||||||
Name string
|
Name string
|
||||||
GrantId int64
|
GrantId int64
|
||||||
InstallDir string
|
InstallDir string
|
||||||
TimeZone string
|
TimeZone string
|
||||||
|
NodeMaxThreads int32
|
||||||
|
NodeTCPMaxConnections int32
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -91,12 +102,21 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
Field("name", params.Name).
|
Field("name", params.Name).
|
||||||
Require("请输入集群名称")
|
Require("请输入集群名称")
|
||||||
|
|
||||||
|
if params.NodeMaxThreads > 0 {
|
||||||
|
params.Must.
|
||||||
|
Field("nodeMaxThreads", params.NodeMaxThreads).
|
||||||
|
Gte(int64(nodeconfigs.DefaultMaxThreadsMin), "单节点最大线程数最小值不能小于"+types.String(nodeconfigs.DefaultMaxThreadsMin)).
|
||||||
|
Lte(int64(nodeconfigs.DefaultMaxThreadsMax), "单节点最大线程数最大值不能大于"+types.String(nodeconfigs.DefaultMaxThreadsMax))
|
||||||
|
}
|
||||||
|
|
||||||
_, err := this.RPC().NodeClusterRPC().UpdateNodeCluster(this.AdminContext(), &pb.UpdateNodeClusterRequest{
|
_, err := this.RPC().NodeClusterRPC().UpdateNodeCluster(this.AdminContext(), &pb.UpdateNodeClusterRequest{
|
||||||
NodeClusterId: params.ClusterId,
|
NodeClusterId: params.ClusterId,
|
||||||
Name: params.Name,
|
Name: params.Name,
|
||||||
NodeGrantId: params.GrantId,
|
NodeGrantId: params.GrantId,
|
||||||
InstallDir: params.InstallDir,
|
InstallDir: params.InstallDir,
|
||||||
TimeZone: params.TimeZone,
|
TimeZone: params.TimeZone,
|
||||||
|
NodeMaxThreads: params.NodeMaxThreads,
|
||||||
|
NodeTCPMaxConnections: params.NodeTCPMaxConnections,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
Username string
|
Username string
|
||||||
Password string
|
Password string
|
||||||
PrivateKey string
|
PrivateKey string
|
||||||
|
Passphrase string
|
||||||
Description string
|
Description string
|
||||||
|
Su bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -58,7 +60,9 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
Username: params.Username,
|
Username: params.Username,
|
||||||
Password: params.Password,
|
Password: params.Password,
|
||||||
PrivateKey: params.PrivateKey,
|
PrivateKey: params.PrivateKey,
|
||||||
|
Passphrase: params.Passphrase,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
|
Su: params.Su,
|
||||||
NodeId: 0,
|
NodeId: 0,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
Username string
|
Username string
|
||||||
Password string
|
Password string
|
||||||
PrivateKey string
|
PrivateKey string
|
||||||
|
Passphrase string
|
||||||
Description string
|
Description string
|
||||||
|
Su bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -59,7 +61,9 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
Username: params.Username,
|
Username: params.Username,
|
||||||
Password: params.Password,
|
Password: params.Password,
|
||||||
PrivateKey: params.PrivateKey,
|
PrivateKey: params.PrivateKey,
|
||||||
|
Passphrase: params.Passphrase,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
|
Su: params.Su,
|
||||||
NodeId: 0,
|
NodeId: 0,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -72,6 +76,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
"name": params.Name,
|
"name": params.Name,
|
||||||
"method": params.Method,
|
"method": params.Method,
|
||||||
"methodName": grantutils.FindGrantMethodName(params.Method),
|
"methodName": grantutils.FindGrantMethodName(params.Method),
|
||||||
|
"username": params.Username,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建日志
|
// 创建日志
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ func (this *GrantAction) RunGet(params struct {
|
|||||||
"username": grant.Username,
|
"username": grant.Username,
|
||||||
"password": strings.Repeat("*", len(grant.Password)),
|
"password": strings.Repeat("*", len(grant.Password)),
|
||||||
"privateKey": grant.PrivateKey,
|
"privateKey": grant.PrivateKey,
|
||||||
|
"passphrase": strings.Repeat("*", len(grant.Passphrase)),
|
||||||
"description": grant.Description,
|
"description": grant.Description,
|
||||||
"su": grant.Su,
|
"su": grant.Su,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ func (this *UpdateAction) RunGet(params struct {
|
|||||||
"username": grant.Username,
|
"username": grant.Username,
|
||||||
"password": grant.Password,
|
"password": grant.Password,
|
||||||
"privateKey": grant.PrivateKey,
|
"privateKey": grant.PrivateKey,
|
||||||
|
"passphrase": grant.Passphrase,
|
||||||
"description": grant.Description,
|
"description": grant.Description,
|
||||||
"su": grant.Su,
|
"su": grant.Su,
|
||||||
}
|
}
|
||||||
@@ -57,7 +58,9 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
Username string
|
Username string
|
||||||
Password string
|
Password string
|
||||||
PrivateKey string
|
PrivateKey string
|
||||||
|
Passphrase string
|
||||||
Description string
|
Description string
|
||||||
|
Su bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -93,7 +96,9 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
Username: params.Username,
|
Username: params.Username,
|
||||||
Password: params.Password,
|
Password: params.Password,
|
||||||
PrivateKey: params.PrivateKey,
|
PrivateKey: params.PrivateKey,
|
||||||
|
Passphrase: params.Passphrase,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
|
Su: params.Su,
|
||||||
NodeId: 0,
|
NodeId: 0,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ func (this *UpdatePopupAction) RunGet(params struct {
|
|||||||
"password": grant.Password,
|
"password": grant.Password,
|
||||||
"description": grant.Description,
|
"description": grant.Description,
|
||||||
"privateKey": grant.PrivateKey,
|
"privateKey": grant.PrivateKey,
|
||||||
|
"passphrase": grant.Passphrase,
|
||||||
|
"su": grant.Su,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
@@ -56,7 +58,9 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
Username string
|
Username string
|
||||||
Password string
|
Password string
|
||||||
PrivateKey string
|
PrivateKey string
|
||||||
|
Passphrase string
|
||||||
Description string
|
Description string
|
||||||
|
Su bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -91,8 +95,10 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
Username: params.Username,
|
Username: params.Username,
|
||||||
Password: params.Password,
|
Password: params.Password,
|
||||||
PrivateKey: params.PrivateKey,
|
PrivateKey: params.PrivateKey,
|
||||||
|
Passphrase: params.Passphrase,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
|
Su: params.Su,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -105,6 +111,7 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
"name": params.Name,
|
"name": params.Name,
|
||||||
"method": params.Method,
|
"method": params.Method,
|
||||||
"methodName": grantutils.FindGrantMethodName(params.Method),
|
"methodName": grantutils.FindGrantMethodName(params.Method),
|
||||||
|
"username": params.Username,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Success()
|
this.Success()
|
||||||
|
|||||||
@@ -90,6 +90,20 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 服务信息
|
||||||
|
var serverMap = maps.Map{"id": 0}
|
||||||
|
if log.ServerId > 0 {
|
||||||
|
serverResp, err := this.RPC().ServerRPC().FindEnabledUserServerBasic(this.AdminContext(), &pb.FindEnabledUserServerBasicRequest{ServerId: log.ServerId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var server = serverResp.Server
|
||||||
|
if server != nil {
|
||||||
|
serverMap = maps.Map{"id": server.Id, "name": server.Name}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logs = append(logs, maps.Map{
|
logs = append(logs, maps.Map{
|
||||||
"id": log.Id,
|
"id": log.Id,
|
||||||
"tag": log.Tag,
|
"tag": log.Tag,
|
||||||
@@ -107,6 +121,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
},
|
},
|
||||||
"name": node.Name,
|
"name": node.Name,
|
||||||
},
|
},
|
||||||
|
"server": serverMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["logs"] = logs
|
this.Data["logs"] = logs
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ func init() {
|
|||||||
Prefix("/clusters/logs").
|
Prefix("/clusters/logs").
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
Post("/readLogs", new(ReadLogsAction)).
|
Post("/readLogs", new(ReadLogsAction)).
|
||||||
|
Post("/readAllLogs", new(ReadAllLogsAction)).
|
||||||
EndAll()
|
EndAll()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
24
internal/web/actions/default/clusters/logs/readAllLogs.go
Normal file
24
internal/web/actions/default/clusters/logs/readAllLogs.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package logs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ReadAllLogsAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ReadAllLogsAction) RunPost(params struct {
|
||||||
|
LogIds []int64
|
||||||
|
}) {
|
||||||
|
_, err := this.RPC().NodeLogRPC().UpdateAllNodeLogsRead(this.AdminContext(), &pb.UpdateAllNodeLogsReadRequest{})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -10,7 +10,9 @@ type CheckAction struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *CheckAction) RunPost(params struct{}) {
|
func (this *CheckAction) RunPost(params struct{}) {
|
||||||
resp, err := this.RPC().NodeTaskRPC().ExistsNodeTasks(this.AdminContext(), &pb.ExistsNodeTasksRequest{})
|
resp, err := this.RPC().NodeTaskRPC().ExistsNodeTasks(this.AdminContext(), &pb.ExistsNodeTasksRequest{
|
||||||
|
ExcludeTypes: []string{"ipItemChanged"},
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 域名列表选项
|
// DomainOptionsAction 域名列表选项
|
||||||
type DomainOptionsAction struct {
|
type DomainOptionsAction struct {
|
||||||
actionutils.ParentAction
|
actionutils.ParentAction
|
||||||
}
|
}
|
||||||
@@ -23,8 +23,8 @@ func (this *DomainOptionsAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
domainMaps := []maps.Map{}
|
domainMaps := []maps.Map{}
|
||||||
for _, domain := range domainsResp.DnsDomains {
|
for _, domain := range domainsResp.DnsDomains {
|
||||||
// 未开启的先跳过
|
// 未开启或者已删除的先跳过
|
||||||
if !domain.IsOn {
|
if !domain.IsOn || domain.IsDeleted {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
27
internal/web/actions/default/dns/domains/recover.go
Normal file
27
internal/web/actions/default/dns/domains/recover.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package domains
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RecoverAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *RecoverAction) RunPost(params struct {
|
||||||
|
DomainId int64
|
||||||
|
}) {
|
||||||
|
// 记录日志
|
||||||
|
defer this.CreateLog(oplogs.LevelInfo, "从DNS服务商中恢复域名 %d", params.DomainId)
|
||||||
|
|
||||||
|
// 执行恢复
|
||||||
|
_, err := this.RPC().DNSDomainRPC().RecoverDNSDomain(this.AdminContext(), &pb.RecoverDNSDomainRequest{DnsDomainId: params.DomainId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -52,7 +52,7 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
// TODO 检查DomainId
|
// TODO 检查DomainId
|
||||||
|
|
||||||
// 记录日志
|
// 记录日志
|
||||||
defer this.CreateLog(oplogs.LevelInfo, "修改管理域名到DNS服务商 %d", params.DomainId)
|
defer this.CreateLog(oplogs.LevelInfo, "修改DNS服务商域名 %d", params.DomainId)
|
||||||
|
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("name", params.Name).
|
Field("name", params.Name).
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ func init() {
|
|||||||
GetPost("/createPopup", new(domains.CreatePopupAction)).
|
GetPost("/createPopup", new(domains.CreatePopupAction)).
|
||||||
GetPost("/updatePopup", new(domains.UpdatePopupAction)).
|
GetPost("/updatePopup", new(domains.UpdatePopupAction)).
|
||||||
Post("/delete", new(domains.DeleteAction)).
|
Post("/delete", new(domains.DeleteAction)).
|
||||||
|
Post("/recover", new(domains.RecoverAction)).
|
||||||
Post("/sync", new(domains.SyncAction)).
|
Post("/sync", new(domains.SyncAction)).
|
||||||
Get("/routesPopup", new(domains.RoutesPopupAction)).
|
Get("/routesPopup", new(domains.RoutesPopupAction)).
|
||||||
GetPost("/selectPopup", new(domains.SelectPopupAction)).
|
GetPost("/selectPopup", new(domains.SelectPopupAction)).
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ func (this *ProviderAction) RunGet(params struct {
|
|||||||
"name": domain.Name,
|
"name": domain.Name,
|
||||||
"isOn": domain.IsOn,
|
"isOn": domain.IsOn,
|
||||||
"isUp": domain.IsUp,
|
"isUp": domain.IsUp,
|
||||||
|
"isDeleted": domain.IsDeleted,
|
||||||
"dataUpdatedTime": dataUpdatedTime,
|
"dataUpdatedTime": dataUpdatedTime,
|
||||||
"countRoutes": len(domain.Routes),
|
"countRoutes": len(domain.Routes),
|
||||||
"countServerRecords": domain.CountServerRecords,
|
"countServerRecords": domain.CountServerRecords,
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//// 是否新安装
|
||||||
|
if setup.IsNewInstalled() {
|
||||||
|
this.RedirectURL("/setup/confirm")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 已登录跳转到dashboard
|
// 已登录跳转到dashboard
|
||||||
if params.Auth.IsUser() {
|
if params.Auth.IsUser() {
|
||||||
this.RedirectURL("/dashboard")
|
this.RedirectURL("/dashboard")
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package ipAddresses
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
@@ -39,9 +40,15 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
Field("ip", params.IP).
|
Field("ip", params.IP).
|
||||||
Require("请输入IP地址")
|
Require("请输入IP地址")
|
||||||
|
|
||||||
ip := net.ParseIP(params.IP)
|
result, err := utils.ExtractIP(params.IP)
|
||||||
if len(ip) == 0 {
|
if err != nil {
|
||||||
this.FailField("ip", "请输入正确的IP")
|
this.Fail("IP格式错误'" + params.IP + "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ip := range result {
|
||||||
|
if len(net.ParseIP(ip)) == 0 {
|
||||||
|
this.FailField("ip", "请输入正确的IP")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 阈值设置
|
// 阈值设置
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package ipaddressutils
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"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"
|
||||||
@@ -16,8 +17,11 @@ func UpdateNodeIPAddresses(parentAction *actionutils.ParentAction, nodeId int64,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, addr := range addresses {
|
for _, addr := range addresses {
|
||||||
|
var resultAddrIds = []int64{}
|
||||||
addrId := addr.GetInt64("id")
|
addrId := addr.GetInt64("id")
|
||||||
if addrId > 0 {
|
if addrId > 0 {
|
||||||
|
resultAddrIds = append(resultAddrIds, addrId)
|
||||||
|
|
||||||
var isOn = false
|
var isOn = false
|
||||||
if !addr.Has("isOn") { // 兼容老版本
|
if !addr.Has("isOn") { // 兼容老版本
|
||||||
isOn = true
|
isOn = true
|
||||||
@@ -37,18 +41,40 @@ func UpdateNodeIPAddresses(parentAction *actionutils.ParentAction, nodeId int64,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
createResp, err := parentAction.RPC().NodeIPAddressRPC().CreateNodeIPAddress(parentAction.AdminContext(), &pb.CreateNodeIPAddressRequest{
|
var ipStrings = addr.GetString("ip")
|
||||||
NodeId: nodeId,
|
result, _ := utils.ExtractIP(ipStrings)
|
||||||
Role: role,
|
|
||||||
Name: addr.GetString("name"),
|
if len(result) == 1 {
|
||||||
Ip: addr.GetString("ip"),
|
// 单个创建
|
||||||
CanAccess: addr.GetBool("canAccess"),
|
createResp, err := parentAction.RPC().NodeIPAddressRPC().CreateNodeIPAddress(parentAction.AdminContext(), &pb.CreateNodeIPAddressRequest{
|
||||||
IsUp: addr.GetBool("isUp"),
|
NodeId: nodeId,
|
||||||
})
|
Role: role,
|
||||||
if err != nil {
|
Name: addr.GetString("name"),
|
||||||
return err
|
Ip: result[0],
|
||||||
|
CanAccess: addr.GetBool("canAccess"),
|
||||||
|
IsUp: addr.GetBool("isUp"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
addrId = createResp.NodeIPAddressId
|
||||||
|
resultAddrIds = append(resultAddrIds, addrId)
|
||||||
|
} else if len(result) > 1 {
|
||||||
|
// 批量创建
|
||||||
|
createResp, err := parentAction.RPC().NodeIPAddressRPC().CreateNodeIPAddresses(parentAction.AdminContext(), &pb.CreateNodeIPAddressesRequest{
|
||||||
|
NodeId: nodeId,
|
||||||
|
Role: role,
|
||||||
|
Name: addr.GetString("name"),
|
||||||
|
IpList: result,
|
||||||
|
CanAccess: addr.GetBool("canAccess"),
|
||||||
|
IsUp: addr.GetBool("isUp"),
|
||||||
|
GroupValue: ipStrings,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
resultAddrIds = append(resultAddrIds, createResp.NodeIPAddressIds...)
|
||||||
}
|
}
|
||||||
addrId = createResp.NodeIPAddressId
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存阈值
|
// 保存阈值
|
||||||
@@ -58,12 +84,25 @@ func UpdateNodeIPAddresses(parentAction *actionutils.ParentAction, nodeId int64,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = parentAction.RPC().NodeIPAddressThresholdRPC().UpdateAllNodeIPAddressThresholds(parentAction.AdminContext(), &pb.UpdateAllNodeIPAddressThresholdsRequest{
|
|
||||||
NodeIPAddressId: addrId,
|
for _, addrId := range resultAddrIds {
|
||||||
NodeIPAddressThresholdsJSON: thresholdsJSON,
|
_, err = parentAction.RPC().NodeIPAddressThresholdRPC().UpdateAllNodeIPAddressThresholds(parentAction.AdminContext(), &pb.UpdateAllNodeIPAddressThresholdsRequest{
|
||||||
})
|
NodeIPAddressId: addrId,
|
||||||
if err != nil {
|
NodeIPAddressThresholdsJSON: thresholdsJSON,
|
||||||
return err
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, addrId := range resultAddrIds {
|
||||||
|
_, err = parentAction.RPC().NodeIPAddressThresholdRPC().UpdateAllNodeIPAddressThresholds(parentAction.AdminContext(), &pb.UpdateAllNodeIPAddressThresholdsRequest{
|
||||||
|
NodeIPAddressId: addrId,
|
||||||
|
NodeIPAddressThresholdsJSON: []byte("[]"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package ipAddresses
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"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"
|
||||||
@@ -57,9 +58,22 @@ func (this *UpdatePopupAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ip := net.ParseIP(params.IP)
|
if params.AddressId > 0 {
|
||||||
if len(ip) == 0 {
|
ip := net.ParseIP(params.IP)
|
||||||
this.Fail("请输入正确的IP")
|
if len(ip) == 0 {
|
||||||
|
this.Fail("请输入正确的IP")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result, err := utils.ExtractIP(params.IP)
|
||||||
|
if err != nil {
|
||||||
|
this.Fail("IP格式错误'" + params.IP + "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ip := range result {
|
||||||
|
if len(net.ParseIP(ip)) == 0 {
|
||||||
|
this.FailField("ip", "请输入正确的IP")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var thresholds = []*nodeconfigs.IPAddressThresholdConfig{}
|
var thresholds = []*nodeconfigs.IPAddressThresholdConfig{}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ func SendMessageToCluster(ctx context.Context, clusterId int64, code string, msg
|
|||||||
|
|
||||||
wg := &sync.WaitGroup{}
|
wg := &sync.WaitGroup{}
|
||||||
wg.Add(len(nodes))
|
wg.Add(len(nodes))
|
||||||
|
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
// TODO 检查是否在线
|
// TODO 检查是否在线
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ func SendMessageToCluster(ctx context.Context, clusterId int64, code string, msg
|
|||||||
apiNodeId := node.ConnectedAPINodeIds[0]
|
apiNodeId := node.ConnectedAPINodeIds[0]
|
||||||
rpcClient, ok := rpcMap[apiNodeId]
|
rpcClient, ok := rpcMap[apiNodeId]
|
||||||
if !ok {
|
if !ok {
|
||||||
apiNodeResp, err := defaultRPCClient.APINodeRPC().FindEnabledAPINode(ctx, &pb.FindEnabledAPINodeRequest{NodeId: apiNodeId})
|
apiNodeResp, err := defaultRPCClient.APINodeRPC().FindEnabledAPINode(ctx, &pb.FindEnabledAPINodeRequest{ApiNodeId: apiNodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
results = append(results, &MessageResult{
|
results = append(results, &MessageResult{
|
||||||
@@ -82,7 +83,7 @@ func SendMessageToCluster(ctx context.Context, clusterId int64, code string, msg
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if apiNodeResp.Node == nil {
|
if apiNodeResp.ApiNode == nil {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
results = append(results, &MessageResult{
|
results = append(results, &MessageResult{
|
||||||
NodeId: node.Id,
|
NodeId: node.Id,
|
||||||
@@ -94,7 +95,7 @@ func SendMessageToCluster(ctx context.Context, clusterId int64, code string, msg
|
|||||||
wg.Done()
|
wg.Done()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
apiNode := apiNodeResp.Node
|
apiNode := apiNodeResp.ApiNode
|
||||||
|
|
||||||
apiRPCClient, err := rpc.NewRPCClient(&configs.APIConfig{
|
apiRPCClient, err := rpc.NewRPCClient(&configs.APIConfig{
|
||||||
RPC: struct {
|
RPC: struct {
|
||||||
@@ -104,7 +105,7 @@ func SendMessageToCluster(ctx context.Context, clusterId int64, code string, msg
|
|||||||
},
|
},
|
||||||
NodeId: apiNode.UniqueId,
|
NodeId: apiNode.UniqueId,
|
||||||
Secret: apiNode.Secret,
|
Secret: apiNode.Secret,
|
||||||
})
|
}, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
results = append(results, &MessageResult{
|
results = append(results, &MessageResult{
|
||||||
@@ -162,6 +163,11 @@ func SendMessageToCluster(ctx context.Context, clusterId int64, code string, msg
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 关闭RPC
|
||||||
|
for _, rpcClient := range rpcMap {
|
||||||
|
_ = rpcClient.Close()
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,7 +249,7 @@ func SendMessageToNodeIds(ctx context.Context, nodeIds []int64, code string, msg
|
|||||||
apiNodeId := node.ConnectedAPINodeIds[0]
|
apiNodeId := node.ConnectedAPINodeIds[0]
|
||||||
rpcClient, ok := rpcMap[apiNodeId]
|
rpcClient, ok := rpcMap[apiNodeId]
|
||||||
if !ok {
|
if !ok {
|
||||||
apiNodeResp, err := defaultRPCClient.APINodeRPC().FindEnabledAPINode(ctx, &pb.FindEnabledAPINodeRequest{NodeId: apiNodeId})
|
apiNodeResp, err := defaultRPCClient.APINodeRPC().FindEnabledAPINode(ctx, &pb.FindEnabledAPINodeRequest{ApiNodeId: apiNodeId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
results = append(results, &MessageResult{
|
results = append(results, &MessageResult{
|
||||||
@@ -257,7 +263,7 @@ func SendMessageToNodeIds(ctx context.Context, nodeIds []int64, code string, msg
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if apiNodeResp.Node == nil {
|
if apiNodeResp.ApiNode == nil {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
results = append(results, &MessageResult{
|
results = append(results, &MessageResult{
|
||||||
NodeId: node.Id,
|
NodeId: node.Id,
|
||||||
@@ -269,7 +275,7 @@ func SendMessageToNodeIds(ctx context.Context, nodeIds []int64, code string, msg
|
|||||||
wg.Done()
|
wg.Done()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
apiNode := apiNodeResp.Node
|
apiNode := apiNodeResp.ApiNode
|
||||||
|
|
||||||
apiRPCClient, err := rpc.NewRPCClient(&configs.APIConfig{
|
apiRPCClient, err := rpc.NewRPCClient(&configs.APIConfig{
|
||||||
RPC: struct {
|
RPC: struct {
|
||||||
@@ -279,7 +285,7 @@ func SendMessageToNodeIds(ctx context.Context, nodeIds []int64, code string, msg
|
|||||||
},
|
},
|
||||||
NodeId: apiNode.UniqueId,
|
NodeId: apiNode.UniqueId,
|
||||||
Secret: apiNode.Secret,
|
Secret: apiNode.Secret,
|
||||||
})
|
}, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
results = append(results, &MessageResult{
|
results = append(results, &MessageResult{
|
||||||
@@ -337,5 +343,10 @@ func SendMessageToNodeIds(ctx context.Context, nodeIds []int64, code string, msg
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 关闭RPC
|
||||||
|
for _, rpcClient := range rpcMap {
|
||||||
|
_ = rpcClient.Close()
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package cluster
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
|
"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"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"
|
||||||
@@ -87,14 +88,31 @@ func (this *CreateNodeAction) RunPost(params struct {
|
|||||||
NodeId: nodeId,
|
NodeId: nodeId,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
_, err = this.RPC().NodeIPAddressRPC().CreateNodeIPAddress(this.AdminContext(), &pb.CreateNodeIPAddressRequest{
|
var ipStrings = addrMap.GetString("ip")
|
||||||
NodeId: nodeId,
|
result, _ := utils.ExtractIP(ipStrings)
|
||||||
Role: nodeconfigs.NodeRoleDNS,
|
|
||||||
Name: addrMap.GetString("name"),
|
if len(result) == 1 {
|
||||||
Ip: addrMap.GetString("ip"),
|
// 单个创建
|
||||||
CanAccess: addrMap.GetBool("canAccess"),
|
_, err = this.RPC().NodeIPAddressRPC().CreateNodeIPAddress(this.AdminContext(), &pb.CreateNodeIPAddressRequest{
|
||||||
IsUp: addrMap.GetBool("isUp"),
|
NodeId: nodeId,
|
||||||
})
|
Role: nodeconfigs.NodeRoleDNS,
|
||||||
|
Name: addrMap.GetString("name"),
|
||||||
|
Ip: result[0],
|
||||||
|
CanAccess: addrMap.GetBool("canAccess"),
|
||||||
|
IsUp: addrMap.GetBool("isUp"),
|
||||||
|
})
|
||||||
|
} else if len(result) > 1 {
|
||||||
|
// 批量创建
|
||||||
|
_, err = this.RPC().NodeIPAddressRPC().CreateNodeIPAddresses(this.AdminContext(), &pb.CreateNodeIPAddressesRequest{
|
||||||
|
NodeId: nodeId,
|
||||||
|
Role: nodeconfigs.NodeRoleDNS,
|
||||||
|
Name: addrMap.GetString("name"),
|
||||||
|
IpList: result,
|
||||||
|
CanAccess: addrMap.GetBool("canAccess"),
|
||||||
|
IsUp: addrMap.GetBool("isUp"),
|
||||||
|
GroupValue: ipStrings,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ func (this *InstallAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
apiNodes := apiNodesResp.Nodes
|
apiNodes := apiNodesResp.ApiNodes
|
||||||
apiEndpoints := []string{}
|
apiEndpoints := []string{}
|
||||||
for _, apiNode := range apiNodes {
|
for _, apiNode := range apiNodes {
|
||||||
if !apiNode.IsOn {
|
if !apiNode.IsOn {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ func (this *UpdateHostsAction) RunPost(params struct {
|
|||||||
},
|
},
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
Secret: params.NodeSecret,
|
Secret: params.NodeSecret,
|
||||||
})
|
}, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.FailField("host", "测试API节点时出错,请检查配置,错误信息:"+err.Error())
|
this.FailField("host", "测试API节点时出错,请检查配置,错误信息:"+err.Error())
|
||||||
}
|
}
|
||||||
@@ -51,6 +51,10 @@ func (this *UpdateHostsAction) RunPost(params struct {
|
|||||||
this.FailField("host", "无法连接此API节点,错误信息:"+err.Error())
|
this.FailField("host", "无法连接此API节点,错误信息:"+err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = client.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
// 获取管理员节点信息
|
// 获取管理员节点信息
|
||||||
apiTokensResp, err := client.APITokenRPC().FindAllEnabledAPITokens(client.APIContext(0), &pb.FindAllEnabledAPITokensRequest{Role: "admin"})
|
apiTokensResp, err := client.APITokenRPC().FindAllEnabledAPITokens(client.APIContext(0), &pb.FindAllEnabledAPITokensRequest{Role: "admin"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -69,7 +73,7 @@ func (this *UpdateHostsAction) RunPost(params struct {
|
|||||||
this.Fail("获取API节点列表失败,错误信息:" + err.Error())
|
this.Fail("获取API节点列表失败,错误信息:" + err.Error())
|
||||||
}
|
}
|
||||||
var endpoints = []string{}
|
var endpoints = []string{}
|
||||||
for _, node := range nodesResp.Nodes {
|
for _, node := range nodesResp.ApiNodes {
|
||||||
if !node.IsOn {
|
if !node.IsOn {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -144,7 +148,7 @@ func (this *UpdateHostsAction) RunPost(params struct {
|
|||||||
|
|
||||||
// 保存
|
// 保存
|
||||||
_, err = client.APINodeRPC().UpdateAPINode(client.Context(0), &pb.UpdateAPINodeRequest{
|
_, err = client.APINodeRPC().UpdateAPINode(client.Context(0), &pb.UpdateAPINodeRequest{
|
||||||
NodeId: node.Id,
|
ApiNodeId: node.Id,
|
||||||
Name: node.Name,
|
Name: node.Name,
|
||||||
Description: node.Description,
|
Description: node.Description,
|
||||||
HttpJSON: node.HttpJSON,
|
HttpJSON: node.HttpJSON,
|
||||||
|
|||||||
@@ -49,10 +49,15 @@ func (this *ValidateApiAction) RunPost(params struct {
|
|||||||
},
|
},
|
||||||
NodeId: params.NodeId,
|
NodeId: params.NodeId,
|
||||||
Secret: params.NodeSecret,
|
Secret: params.NodeSecret,
|
||||||
})
|
}, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.FailField("host", "测试API节点时出错,请检查配置,错误信息:"+err.Error())
|
this.FailField("host", "测试API节点时出错,请检查配置,错误信息:"+err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = client.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
_, err = client.APINodeRPC().FindCurrentAPINodeVersion(client.APIContext(0), &pb.FindCurrentAPINodeVersionRequest{})
|
_, err = client.APINodeRPC().FindCurrentAPINodeVersion(client.APIContext(0), &pb.FindCurrentAPINodeVersionRequest{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.FailField("host", "无法连接此API节点,错误信息:"+err.Error())
|
this.FailField("host", "无法连接此API节点,错误信息:"+err.Error())
|
||||||
@@ -64,7 +69,7 @@ func (this *ValidateApiAction) RunPost(params struct {
|
|||||||
this.Fail("获取API节点列表失败,错误信息:" + err.Error())
|
this.Fail("获取API节点列表失败,错误信息:" + err.Error())
|
||||||
}
|
}
|
||||||
var hosts = []string{}
|
var hosts = []string{}
|
||||||
for _, node := range nodesResp.Nodes {
|
for _, node := range nodesResp.ApiNodes {
|
||||||
if !node.IsOn {
|
if !node.IsOn {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func (this *DeleteAction) RunPost(params struct {
|
|||||||
// 创建日志
|
// 创建日志
|
||||||
defer this.CreateLog(oplogs.LevelInfo, "删除SSL证书 %d", params.CertId)
|
defer this.CreateLog(oplogs.LevelInfo, "删除SSL证书 %d", params.CertId)
|
||||||
|
|
||||||
// 是否正在被使用
|
// 是否正在被服务使用
|
||||||
countResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledServersWithSSLCertIdRequest{SslCertId: params.CertId})
|
countResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledServersWithSSLCertIdRequest{SslCertId: params.CertId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -26,6 +26,26 @@ func (this *DeleteAction) RunPost(params struct {
|
|||||||
this.Fail("此证书正在被某些服务引用,请先修改服务后再删除。")
|
this.Fail("此证书正在被某些服务引用,请先修改服务后再删除。")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 是否正在被API节点使用
|
||||||
|
countResp, err = this.RPC().APINodeRPC().CountAllEnabledAPINodesWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledAPINodesWithSSLCertIdRequest{SslCertId: params.CertId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if countResp.Count > 0 {
|
||||||
|
this.Fail("此证书正在被某些API节点引用,请先修改API节点后再删除")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 是否正在被用户节点使用
|
||||||
|
countResp, err = this.RPC().UserNodeRPC().CountAllEnabledUserNodesWithSSLCertId(this.AdminContext(), &pb.CountAllEnabledUserNodesWithSSLCertIdRequest{SslCertId: params.CertId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if countResp.Count > 0 {
|
||||||
|
this.Fail("此证书正在被某些用户节点引用,请先修改用户节点后再删除")
|
||||||
|
}
|
||||||
|
|
||||||
_, err = this.RPC().SSLCertRPC().DeleteSSLCert(this.AdminContext(), &pb.DeleteSSLCertRequest{SslCertId: params.CertId})
|
_, err = this.RPC().SSLCertRPC().DeleteSSLCert(this.AdminContext(), &pb.DeleteSSLCertRequest{SslCertId: params.CertId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func (this *IndexAction) RunGet(params struct{}) {
|
|||||||
globalConfig := &serverconfigs.GlobalConfig{}
|
globalConfig := &serverconfigs.GlobalConfig{}
|
||||||
|
|
||||||
// 默认值
|
// 默认值
|
||||||
globalConfig.HTTPAll.DomainAuditingIsOn = true
|
globalConfig.HTTPAll.DomainAuditingIsOn = false
|
||||||
|
|
||||||
if len(valueJSON) > 0 {
|
if len(valueJSON) > 0 {
|
||||||
err = json.Unmarshal(valueJSON, globalConfig)
|
err = json.Unmarshal(valueJSON, globalConfig)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ func (this *CreateGroupPopupAction) RunPost(params struct {
|
|||||||
Type string
|
Type string
|
||||||
|
|
||||||
Name string
|
Name string
|
||||||
|
Code string
|
||||||
Description string
|
Description string
|
||||||
IsOn bool
|
IsOn bool
|
||||||
|
|
||||||
@@ -52,6 +53,7 @@ func (this *CreateGroupPopupAction) RunPost(params struct {
|
|||||||
createResp, err := this.RPC().HTTPFirewallRuleGroupRPC().CreateHTTPFirewallRuleGroup(this.AdminContext(), &pb.CreateHTTPFirewallRuleGroupRequest{
|
createResp, err := this.RPC().HTTPFirewallRuleGroupRPC().CreateHTTPFirewallRuleGroup(this.AdminContext(), &pb.CreateHTTPFirewallRuleGroupRequest{
|
||||||
IsOn: params.IsOn,
|
IsOn: params.IsOn,
|
||||||
Name: params.Name,
|
Name: params.Name,
|
||||||
|
Code: params.Code,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ func (this *CreateSetPopupAction) RunPost(params struct {
|
|||||||
RulesJSON []byte
|
RulesJSON []byte
|
||||||
Connector string
|
Connector string
|
||||||
ActionsJSON []byte
|
ActionsJSON []byte
|
||||||
|
IgnoreLocal bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -124,6 +125,7 @@ func (this *CreateSetPopupAction) RunPost(params struct {
|
|||||||
RuleRefs: nil,
|
RuleRefs: nil,
|
||||||
Rules: rules,
|
Rules: rules,
|
||||||
Actions: actionConfigs,
|
Actions: actionConfigs,
|
||||||
|
IgnoreLocal: params.IgnoreLocal,
|
||||||
}
|
}
|
||||||
|
|
||||||
setConfigJSON, err := json.Marshal(setConfig)
|
setConfigJSON, err := json.Marshal(setConfig)
|
||||||
|
|||||||
@@ -32,24 +32,36 @@ func (this *ExportAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
inboundGroups := []*firewallconfigs.HTTPFirewallRuleGroup{}
|
enabledInboundGroups := []*firewallconfigs.HTTPFirewallRuleGroup{}
|
||||||
outboundGroups := []*firewallconfigs.HTTPFirewallRuleGroup{}
|
enabledOutboundGroups := []*firewallconfigs.HTTPFirewallRuleGroup{}
|
||||||
|
|
||||||
|
disabledInboundGroups := []*firewallconfigs.HTTPFirewallRuleGroup{}
|
||||||
|
disabledOutboundGroups := []*firewallconfigs.HTTPFirewallRuleGroup{}
|
||||||
|
|
||||||
if policy.Inbound != nil {
|
if policy.Inbound != nil {
|
||||||
for _, g := range policy.Inbound.Groups {
|
for _, g := range policy.Inbound.Groups {
|
||||||
if g.IsOn {
|
if g.IsOn {
|
||||||
inboundGroups = append(inboundGroups, g)
|
enabledInboundGroups = append(enabledInboundGroups, g)
|
||||||
|
} else {
|
||||||
|
disabledInboundGroups = append(disabledInboundGroups, g)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if policy.Outbound != nil {
|
if policy.Outbound != nil {
|
||||||
for _, g := range policy.Outbound.Groups {
|
for _, g := range policy.Outbound.Groups {
|
||||||
if g.IsOn {
|
if g.IsOn {
|
||||||
outboundGroups = append(outboundGroups, g)
|
enabledOutboundGroups = append(enabledOutboundGroups, g)
|
||||||
|
} else {
|
||||||
|
disabledOutboundGroups = append(disabledOutboundGroups, g)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.Data["inboundGroups"] = inboundGroups
|
|
||||||
this.Data["outboundGroups"] = outboundGroups
|
this.Data["enabledInboundGroups"] = enabledInboundGroups
|
||||||
|
this.Data["enabledOutboundGroups"] = enabledOutboundGroups
|
||||||
|
|
||||||
|
this.Data["disabledInboundGroups"] = disabledInboundGroups
|
||||||
|
this.Data["disabledOutboundGroups"] = disabledOutboundGroups
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
@@ -116,5 +128,6 @@ func (this *ExportAction) RunPost(params struct {
|
|||||||
ttlcache.DefaultCache.Write(key, configJSON, time.Now().Unix()+600)
|
ttlcache.DefaultCache.Write(key, configJSON, time.Now().Unix()+600)
|
||||||
|
|
||||||
this.Data["key"] = key
|
this.Data["key"] = key
|
||||||
|
this.Data["id"] = params.FirewallPolicyId
|
||||||
this.Success()
|
this.Success()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package waf
|
|||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/ttlcache"
|
"github.com/TeaOSLab/EdgeAdmin/internal/ttlcache"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,7 +16,8 @@ func (this *ExportDownloadAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *ExportDownloadAction) RunGet(params struct {
|
func (this *ExportDownloadAction) RunGet(params struct {
|
||||||
Key string
|
Key string
|
||||||
|
PolicyId int64
|
||||||
}) {
|
}) {
|
||||||
item := ttlcache.DefaultCache.Read(params.Key)
|
item := ttlcache.DefaultCache.Read(params.Key)
|
||||||
if item == nil || item.Value == nil {
|
if item == nil || item.Value == nil {
|
||||||
@@ -27,7 +29,7 @@ func (this *ExportDownloadAction) RunGet(params struct {
|
|||||||
|
|
||||||
data, ok := item.Value.([]byte)
|
data, ok := item.Value.([]byte)
|
||||||
if ok {
|
if ok {
|
||||||
this.AddHeader("Content-Disposition", "attachment; filename=\"WAF.json\";")
|
this.AddHeader("Content-Disposition", "attachment; filename=\"WAF-"+types.String(params.PolicyId)+".json\";")
|
||||||
this.AddHeader("Content-Length", strconv.Itoa(len(data)))
|
this.AddHeader("Content-Length", strconv.Itoa(len(data)))
|
||||||
this.Write(data)
|
this.Write(data)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ func (this *GroupsAction) RunGet(params struct {
|
|||||||
"isOn": g.IsOn,
|
"isOn": g.IsOn,
|
||||||
"description": g.Description,
|
"description": g.Description,
|
||||||
"countSets": len(g.Sets),
|
"countSets": len(g.Sets),
|
||||||
"canDelete": len(g.Code) == 0,
|
"isTemplate": g.IsTemplate,
|
||||||
|
"canDelete": !g.IsTemplate,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -60,7 +61,8 @@ func (this *GroupsAction) RunGet(params struct {
|
|||||||
"isOn": g.IsOn,
|
"isOn": g.IsOn,
|
||||||
"description": g.Description,
|
"description": g.Description,
|
||||||
"countSets": len(g.Sets),
|
"countSets": len(g.Sets),
|
||||||
"canDelete": len(g.Code) == 0,
|
"isTemplate": g.IsTemplate,
|
||||||
|
"canDelete": !g.IsTemplate,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ func init() {
|
|||||||
GetPost("/updateSetPopup", new(UpdateSetPopupAction)).
|
GetPost("/updateSetPopup", new(UpdateSetPopupAction)).
|
||||||
Post("/count", new(CountAction)).
|
Post("/count", new(CountAction)).
|
||||||
Get("/selectPopup", new(SelectPopupAction)).
|
Get("/selectPopup", new(SelectPopupAction)).
|
||||||
|
Post("/testRegexp", new(TestRegexpAction)).
|
||||||
|
|
||||||
// IP管理
|
// IP管理
|
||||||
GetPost("/ipadmin", new(ipadmin.IndexAction)).
|
GetPost("/ipadmin", new(ipadmin.IndexAction)).
|
||||||
|
|||||||
@@ -59,14 +59,56 @@ func (this *ListsAction) RunGet(params struct {
|
|||||||
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// policy
|
||||||
|
var sourcePolicyMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallPolicy != nil {
|
||||||
|
sourcePolicyMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallPolicy.Id,
|
||||||
|
"name": item.SourceHTTPFirewallPolicy.Name,
|
||||||
|
"serverId": item.SourceHTTPFirewallPolicy.ServerId,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// group
|
||||||
|
var sourceGroupMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleGroup != nil {
|
||||||
|
sourceGroupMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleGroup.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleGroup.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set
|
||||||
|
var sourceSetMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleSet != nil {
|
||||||
|
sourceSetMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleSet.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleSet.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// server
|
||||||
|
var sourceServerMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceServer != nil {
|
||||||
|
sourceServerMap = maps.Map{
|
||||||
|
"id": item.SourceServer.Id,
|
||||||
|
"name": item.SourceServer.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
itemMaps = append(itemMaps, maps.Map{
|
itemMaps = append(itemMaps, maps.Map{
|
||||||
"id": item.Id,
|
"id": item.Id,
|
||||||
"ipFrom": item.IpFrom,
|
"ipFrom": item.IpFrom,
|
||||||
"ipTo": item.IpTo,
|
"ipTo": item.IpTo,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt),
|
||||||
"expiredTime": expiredTime,
|
"expiredTime": expiredTime,
|
||||||
"reason": item.Reason,
|
"reason": item.Reason,
|
||||||
"type": item.Type,
|
"type": item.Type,
|
||||||
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
||||||
|
"sourcePolicy": sourcePolicyMap,
|
||||||
|
"sourceGroup": sourceGroupMap,
|
||||||
|
"sourceSet": sourceSetMap,
|
||||||
|
"sourceServer": sourceServerMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["items"] = itemMaps
|
this.Data["items"] = itemMaps
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ func (this *TestAction) RunPost(params struct {
|
|||||||
"ipFrom": resp.IpItem.IpFrom,
|
"ipFrom": resp.IpItem.IpFrom,
|
||||||
"ipTo": resp.IpItem.IpTo,
|
"ipTo": resp.IpItem.IpTo,
|
||||||
"reason": resp.IpItem.Reason,
|
"reason": resp.IpItem.Reason,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d", resp.IpItem.CreatedAt),
|
||||||
"expiredAt": resp.IpItem.ExpiredAt,
|
"expiredAt": resp.IpItem.ExpiredAt,
|
||||||
"expiredTime": timeutil.FormatTime("Y-m-d H:i:s", resp.IpItem.ExpiredAt),
|
"expiredTime": timeutil.FormatTime("Y-m-d H:i:s", resp.IpItem.ExpiredAt),
|
||||||
"type": resp.IpItem.Type,
|
"type": resp.IpItem.Type,
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package waf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestRegexpAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *TestRegexpAction) RunPost(params struct {
|
||||||
|
Regexp string
|
||||||
|
IsCaseInsensitive bool
|
||||||
|
Body string
|
||||||
|
}) {
|
||||||
|
var exp = params.Regexp
|
||||||
|
if params.IsCaseInsensitive && !strings.HasPrefix(params.Regexp, "(?i)") {
|
||||||
|
exp = "(?i)" + exp
|
||||||
|
}
|
||||||
|
reg, err := regexp.Compile(exp)
|
||||||
|
if err != nil {
|
||||||
|
this.Data["result"] = maps.Map{
|
||||||
|
"isOk": false,
|
||||||
|
"message": "解析正则出错:" + err.Error(),
|
||||||
|
}
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
|
|
||||||
|
if reg.MatchString(params.Body) {
|
||||||
|
this.Data["result"] = maps.Map{
|
||||||
|
"isOk": true,
|
||||||
|
"message": "匹配成功",
|
||||||
|
}
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["result"] = maps.Map{
|
||||||
|
"isOk": false,
|
||||||
|
"message": "匹配失败",
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -35,6 +35,7 @@ func (this *UpdateGroupPopupAction) RunGet(params struct {
|
|||||||
"name": groupConfig.Name,
|
"name": groupConfig.Name,
|
||||||
"description": groupConfig.Description,
|
"description": groupConfig.Description,
|
||||||
"isOn": groupConfig.IsOn,
|
"isOn": groupConfig.IsOn,
|
||||||
|
"code": groupConfig.Code,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
@@ -43,6 +44,7 @@ func (this *UpdateGroupPopupAction) RunGet(params struct {
|
|||||||
func (this *UpdateGroupPopupAction) RunPost(params struct {
|
func (this *UpdateGroupPopupAction) RunPost(params struct {
|
||||||
GroupId int64
|
GroupId int64
|
||||||
Name string
|
Name string
|
||||||
|
Code string
|
||||||
Description string
|
Description string
|
||||||
IsOn bool
|
IsOn bool
|
||||||
|
|
||||||
@@ -59,6 +61,7 @@ func (this *UpdateGroupPopupAction) RunPost(params struct {
|
|||||||
FirewallRuleGroupId: params.GroupId,
|
FirewallRuleGroupId: params.GroupId,
|
||||||
IsOn: params.IsOn,
|
IsOn: params.IsOn,
|
||||||
Name: params.Name,
|
Name: params.Name,
|
||||||
|
Code: params.Code,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ func (this *UpdateSetPopupAction) RunPost(params struct {
|
|||||||
RulesJSON []byte
|
RulesJSON []byte
|
||||||
Connector string
|
Connector string
|
||||||
ActionsJSON []byte
|
ActionsJSON []byte
|
||||||
|
IgnoreLocal bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
}) {
|
}) {
|
||||||
@@ -144,6 +145,7 @@ func (this *UpdateSetPopupAction) RunPost(params struct {
|
|||||||
setConfig.Connector = params.Connector
|
setConfig.Connector = params.Connector
|
||||||
setConfig.Rules = rules
|
setConfig.Rules = rules
|
||||||
setConfig.Actions = actionConfigs
|
setConfig.Actions = actionConfigs
|
||||||
|
setConfig.IgnoreLocal = params.IgnoreLocal
|
||||||
|
|
||||||
setConfigJSON, err := json.Marshal(setConfig)
|
setConfigJSON, err := json.Marshal(setConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -57,14 +57,26 @@ func (this *CreateAction) RunGet(params struct{}) {
|
|||||||
// 服务类型
|
// 服务类型
|
||||||
this.Data["serverTypes"] = serverconfigs.AllServerTypes()
|
this.Data["serverTypes"] = serverconfigs.AllServerTypes()
|
||||||
|
|
||||||
|
// 检查是否有用户
|
||||||
|
countUsersResp, err := this.RPC().UserRPC().CountAllEnabledUsers(this.AdminContext(), &pb.CountAllEnabledUsersRequest{})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.Data["hasUsers"] = countUsersResp.Count > 0
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *CreateAction) RunPost(params struct {
|
func (this *CreateAction) RunPost(params struct {
|
||||||
Name string
|
Name string
|
||||||
Description string
|
Description string
|
||||||
ClusterId int64
|
|
||||||
GroupIds []int64
|
UserId int64
|
||||||
|
UserPlanId int64
|
||||||
|
ClusterId int64
|
||||||
|
|
||||||
|
GroupIds []int64
|
||||||
|
|
||||||
ServerType string
|
ServerType string
|
||||||
Addresses string
|
Addresses string
|
||||||
@@ -77,6 +89,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
CacheIsOn bool
|
CacheIsOn bool
|
||||||
WafIsOn bool
|
WafIsOn bool
|
||||||
RemoteAddrIsOn bool
|
RemoteAddrIsOn bool
|
||||||
|
StatIsOn bool
|
||||||
|
|
||||||
WebRoot string
|
WebRoot string
|
||||||
|
|
||||||
@@ -86,11 +99,24 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
Field("name", params.Name).
|
Field("name", params.Name).
|
||||||
Require("请输入服务名称")
|
Require("请输入服务名称")
|
||||||
|
|
||||||
if params.ClusterId <= 0 {
|
var clusterId = params.ClusterId
|
||||||
this.Fail("请选择部署的集群")
|
|
||||||
|
// 用户
|
||||||
|
var userId = params.UserId
|
||||||
|
if userId > 0 {
|
||||||
|
clusterIdResp, err := this.RPC().UserRPC().FindUserNodeClusterId(this.AdminContext(), &pb.FindUserNodeClusterIdRequest{UserId: userId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
clusterId = clusterIdResp.NodeClusterId
|
||||||
|
if clusterId <= 0 {
|
||||||
|
this.Fail("请选择部署的集群")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO 验证集群ID
|
// 套餐
|
||||||
|
var userPlanId = params.UserPlanId
|
||||||
|
|
||||||
// 端口地址
|
// 端口地址
|
||||||
var httpConfig *serverconfigs.HTTPProtocolConfig = nil
|
var httpConfig *serverconfigs.HTTPProtocolConfig = nil
|
||||||
@@ -260,7 +286,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
if len(allServerNames) > 0 {
|
if len(allServerNames) > 0 {
|
||||||
dupResp, err := this.RPC().ServerRPC().CheckServerNameDuplicationInNodeCluster(this.AdminContext(), &pb.CheckServerNameDuplicationInNodeClusterRequest{
|
dupResp, err := this.RPC().ServerRPC().CheckServerNameDuplicationInNodeCluster(this.AdminContext(), &pb.CheckServerNameDuplicationInNodeClusterRequest{
|
||||||
ServerNames: allServerNames,
|
ServerNames: allServerNames,
|
||||||
NodeClusterId: params.ClusterId,
|
NodeClusterId: clusterId,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
@@ -339,7 +365,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
webId = webResp.WebId
|
webId = webResp.HttpWebId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 包含条件
|
// 包含条件
|
||||||
@@ -359,13 +385,14 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
req := &pb.CreateServerRequest{
|
req := &pb.CreateServerRequest{
|
||||||
UserId: 0,
|
UserId: userId,
|
||||||
|
UserPlanId: userPlanId,
|
||||||
AdminId: this.AdminId(),
|
AdminId: this.AdminId(),
|
||||||
Type: params.ServerType,
|
Type: params.ServerType,
|
||||||
Name: params.Name,
|
Name: params.Name,
|
||||||
ServerNamesJON: []byte(params.ServerNames),
|
ServerNamesJON: []byte(params.ServerNames),
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
NodeClusterId: params.ClusterId,
|
NodeClusterId: clusterId,
|
||||||
IncludeNodesJSON: includeNodesJSON,
|
IncludeNodesJSON: includeNodesJSON,
|
||||||
ExcludeNodesJSON: excludeNodesJSON,
|
ExcludeNodesJSON: excludeNodesJSON,
|
||||||
WebId: webId,
|
WebId: webId,
|
||||||
@@ -436,11 +463,11 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
// 访问日志
|
// 访问日志
|
||||||
if params.AccessLogIsOn {
|
if params.AccessLogIsOn {
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebAccessLog(this.AdminContext(), &pb.UpdateHTTPWebAccessLogRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebAccessLog(this.AdminContext(), &pb.UpdateHTTPWebAccessLogRequest{
|
||||||
WebId: webConfig.Id,
|
HttpWebId: webConfig.Id,
|
||||||
AccessLogJSON: []byte(`{
|
AccessLogJSON: []byte(`{
|
||||||
"isPrior": false,
|
"isPrior": false,
|
||||||
"isOn": true,
|
"isOn": true,
|
||||||
"fields": [],
|
"fields": [1, 2, 6, 7],
|
||||||
"status1": true,
|
"status1": true,
|
||||||
"status2": true,
|
"status2": true,
|
||||||
"status3": true,
|
"status3": true,
|
||||||
@@ -475,7 +502,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
} else {
|
} else {
|
||||||
websocketId := createWebSocketResp.WebsocketId
|
websocketId := createWebSocketResp.WebsocketId
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebWebsocket(this.AdminContext(), &pb.UpdateHTTPWebWebsocketRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebWebsocket(this.AdminContext(), &pb.UpdateHTTPWebWebsocketRequest{
|
||||||
WebId: webConfig.Id,
|
HttpWebId: webConfig.Id,
|
||||||
WebsocketJSON: []byte(` {
|
WebsocketJSON: []byte(` {
|
||||||
"isPrior": false,
|
"isPrior": false,
|
||||||
"isOn": true,
|
"isOn": true,
|
||||||
@@ -496,7 +523,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
AddStatusHeader: true,
|
AddStatusHeader: true,
|
||||||
PurgeIsOn: false,
|
PurgeIsOn: false,
|
||||||
PurgeKey: "",
|
PurgeKey: "",
|
||||||
CacheRefs: nil,
|
CacheRefs: []*serverconfigs.HTTPCacheRef{},
|
||||||
}
|
}
|
||||||
cacheConfigJSON, err := json.Marshal(cacheConfig)
|
cacheConfigJSON, err := json.Marshal(cacheConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -504,7 +531,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCache(this.AdminContext(), &pb.UpdateHTTPWebCacheRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCache(this.AdminContext(), &pb.UpdateHTTPWebCacheRequest{
|
||||||
WebId: webConfig.Id,
|
HttpWebId: webConfig.Id,
|
||||||
CacheJSON: cacheConfigJSON,
|
CacheJSON: cacheConfigJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -526,7 +553,7 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebFirewall(this.AdminContext(), &pb.UpdateHTTPWebFirewallRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebFirewall(this.AdminContext(), &pb.UpdateHTTPWebFirewallRequest{
|
||||||
WebId: webConfig.Id,
|
HttpWebId: webConfig.Id,
|
||||||
FirewallJSON: firewallRefJSON,
|
FirewallJSON: firewallRefJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -549,13 +576,34 @@ func (this *CreateAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRemoteAddr(this.AdminContext(), &pb.UpdateHTTPWebRemoteAddrRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRemoteAddr(this.AdminContext(), &pb.UpdateHTTPWebRemoteAddrRequest{
|
||||||
WebId: webConfig.Id,
|
HttpWebId: webConfig.Id,
|
||||||
RemoteAddrJSON: remoteAddrConfigJSON,
|
RemoteAddrJSON: remoteAddrConfigJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 统计
|
||||||
|
if params.StatIsOn {
|
||||||
|
var statConfig = &serverconfigs.HTTPStatRef{
|
||||||
|
IsPrior: false,
|
||||||
|
IsOn: true,
|
||||||
|
}
|
||||||
|
statJSON, err := json.Marshal(statConfig)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebStat(this.AdminContext(), &pb.UpdateHTTPWebStatRequest{
|
||||||
|
HttpWebId: webConfig.Id,
|
||||||
|
StatJSON: statJSON,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ type FixLogAction struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *FixLogAction) RunPost(params struct {
|
func (this *FixLogAction) RunPost(params struct {
|
||||||
LogId int64
|
LogIds []int64
|
||||||
}) {
|
}) {
|
||||||
_, err := this.RPC().NodeLogRPC().FixNodeLog(this.AdminContext(), &pb.FixNodeLogRequest{NodeLogId: params.LogId})
|
_, err := this.RPC().NodeLogRPC().FixNodeLogs(this.AdminContext(), &pb.FixNodeLogsRequest{NodeLogIds: params.LogIds})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -144,6 +144,15 @@ func InitGroup(parent *actionutils.ParentAction, groupId int64, menuItem string)
|
|||||||
"isActive": menuItem == "remoteAddr",
|
"isActive": menuItem == "remoteAddr",
|
||||||
"isOn": configInfoResp.HasRemoteAddrConfig,
|
"isOn": configInfoResp.HasRemoteAddrConfig,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if teaconst.IsPlus {
|
||||||
|
leftMenuItems = append(leftMenuItems, maps.Map{
|
||||||
|
"name": "请求限制",
|
||||||
|
"url": urlPrefix + "/requestLimit?groupId=" + types.String(groupId),
|
||||||
|
"isActive": menuItem == "requestLimit",
|
||||||
|
"isOn": configInfoResp.HasRequestLimitConfig,
|
||||||
|
})
|
||||||
|
}
|
||||||
parent.Data["leftMenuItems"] = leftMenuItems
|
parent.Data["leftMenuItems"] = leftMenuItems
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
// TODO 检查参数
|
// TODO 检查参数
|
||||||
|
|
||||||
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebAccessLog(this.AdminContext(), &pb.UpdateHTTPWebAccessLogRequest{
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebAccessLog(this.AdminContext(), &pb.UpdateHTTPWebAccessLogRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
AccessLogJSON: params.AccessLogJSON,
|
AccessLogJSON: params.AccessLogJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCache(this.AdminContext(), &pb.UpdateHTTPWebCacheRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCache(this.AdminContext(), &pb.UpdateHTTPWebCacheRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
CacheJSON: cacheJSON,
|
CacheJSON: cacheJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
defer this.CreateLog(oplogs.LevelInfo, "修改Web %d 的字符集设置", params.WebId)
|
defer this.CreateLog(oplogs.LevelInfo, "修改Web %d 的字符集设置", params.WebId)
|
||||||
|
|
||||||
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebCharset(this.AdminContext(), &pb.UpdateHTTPWebCharsetRequest{
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebCharset(this.AdminContext(), &pb.UpdateHTTPWebCharsetRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
CharsetJSON: params.CharsetJSON,
|
CharsetJSON: params.CharsetJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCompression(this.AdminContext(), &pb.UpdateHTTPWebCompressionRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCompression(this.AdminContext(), &pb.UpdateHTTPWebCompressionRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
CompressionJSON: params.CompressionJSON,
|
CompressionJSON: params.CompressionJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRequestHeader(this.AdminContext(), &pb.UpdateHTTPWebRequestHeaderRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRequestHeader(this.AdminContext(), &pb.UpdateHTTPWebRequestHeaderRequest{
|
||||||
WebId: webId,
|
HttpWebId: webId,
|
||||||
HeaderJSON: refJSON,
|
HeaderJSON: refJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -82,7 +82,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebResponseHeader(this.AdminContext(), &pb.UpdateHTTPWebResponseHeaderRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebResponseHeader(this.AdminContext(), &pb.UpdateHTTPWebResponseHeaderRequest{
|
||||||
WebId: webId,
|
HttpWebId: webId,
|
||||||
HeaderJSON: refJSON,
|
HeaderJSON: refJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -129,7 +129,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRequestHeader(this.AdminContext(), &pb.UpdateHTTPWebRequestHeaderRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRequestHeader(this.AdminContext(), &pb.UpdateHTTPWebRequestHeaderRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
HeaderJSON: params.RequestHeaderJSON,
|
HeaderJSON: params.RequestHeaderJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -145,7 +145,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebResponseHeader(this.AdminContext(), &pb.UpdateHTTPWebResponseHeaderRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebResponseHeader(this.AdminContext(), &pb.UpdateHTTPWebResponseHeaderRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
HeaderJSON: params.ResponseHeaderJSON,
|
HeaderJSON: params.ResponseHeaderJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
// TODO 检查配置
|
// TODO 检查配置
|
||||||
|
|
||||||
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebPages(this.AdminContext(), &pb.UpdateHTTPWebPagesRequest{
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebPages(this.AdminContext(), &pb.UpdateHTTPWebPagesRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
PagesJSON: []byte(params.PagesJSON),
|
PagesJSON: []byte(params.PagesJSON),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -61,7 +61,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebShutdown(this.AdminContext(), &pb.UpdateHTTPWebShutdownRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebShutdown(this.AdminContext(), &pb.UpdateHTTPWebShutdownRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
ShutdownJSON: []byte(params.ShutdownJSON),
|
ShutdownJSON: []byte(params.ShutdownJSON),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRemoteAddr(this.AdminContext(), &pb.UpdateHTTPWebRemoteAddrRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRemoteAddr(this.AdminContext(), &pb.UpdateHTTPWebRemoteAddrRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
RemoteAddrJSON: params.RemoteAddrJSON,
|
RemoteAddrJSON: params.RemoteAddrJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package requestlimit
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/groups/group/servergrouputils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
"github.com/iwind/TeaGo/actions"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IndexAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *IndexAction) Init() {
|
||||||
|
this.Nav("", "setting", "index")
|
||||||
|
this.SecondMenu("requestLimit")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *IndexAction) RunGet(params struct {
|
||||||
|
GroupId int64
|
||||||
|
}) {
|
||||||
|
_, err := servergrouputils.InitGroup(this.Parent(), params.GroupId, "requestLimit")
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
webConfig, err := dao.SharedHTTPWebDAO.FindWebConfigWithServerGroupId(this.AdminContext(), params.GroupId)
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Data["webId"] = webConfig.Id
|
||||||
|
this.Data["requestLimitConfig"] = webConfig.RequestLimit
|
||||||
|
|
||||||
|
this.Show()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *IndexAction) RunPost(params struct {
|
||||||
|
WebId int64
|
||||||
|
RequestLimitJSON []byte
|
||||||
|
|
||||||
|
Must *actions.Must
|
||||||
|
CSRF *actionutils.CSRF
|
||||||
|
}) {
|
||||||
|
defer this.CreateLogInfo("修改Web %d 请求限制", params.WebId)
|
||||||
|
|
||||||
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebRequestLimit(this.AdminContext(), &pb.UpdateHTTPWebRequestLimitRequest{
|
||||||
|
HttpWebId: params.WebId,
|
||||||
|
RequestLimitJSON: params.RequestLimitJSON,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package requestlimit
|
||||||
|
|
||||||
|
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", "group").
|
||||||
|
Prefix("/servers/groups/group/settings/requestLimit").
|
||||||
|
GetPost("", new(IndexAction)).
|
||||||
|
EndAll()
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -49,8 +49,8 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
// TODO 校验配置
|
// TODO 校验配置
|
||||||
|
|
||||||
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebStat(this.AdminContext(), &pb.UpdateHTTPWebStatRequest{
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebStat(this.AdminContext(), &pb.UpdateHTTPWebStatRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
StatJSON: params.StatJSON,
|
StatJSON: params.StatJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
// TODO 检查配置
|
// TODO 检查配置
|
||||||
|
|
||||||
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebFirewall(this.AdminContext(), &pb.UpdateHTTPWebFirewallRequest{
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWebFirewall(this.AdminContext(), &pb.UpdateHTTPWebFirewallRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
FirewallJSON: params.FirewallJSON,
|
FirewallJSON: params.FirewallJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -70,15 +70,57 @@ func (this *AllowListAction) RunGet(params struct {
|
|||||||
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// policy
|
||||||
|
var sourcePolicyMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallPolicy != nil {
|
||||||
|
sourcePolicyMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallPolicy.Id,
|
||||||
|
"name": item.SourceHTTPFirewallPolicy.Name,
|
||||||
|
"serverId": item.SourceHTTPFirewallPolicy.ServerId,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// group
|
||||||
|
var sourceGroupMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleGroup != nil {
|
||||||
|
sourceGroupMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleGroup.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleGroup.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set
|
||||||
|
var sourceSetMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleSet != nil {
|
||||||
|
sourceSetMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleSet.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleSet.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// server
|
||||||
|
var sourceServerMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceServer != nil {
|
||||||
|
sourceServerMap = maps.Map{
|
||||||
|
"id": item.SourceServer.Id,
|
||||||
|
"name": item.SourceServer.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
itemMaps = append(itemMaps, maps.Map{
|
itemMaps = append(itemMaps, maps.Map{
|
||||||
"id": item.Id,
|
"id": item.Id,
|
||||||
"ipFrom": item.IpFrom,
|
"ipFrom": item.IpFrom,
|
||||||
"ipTo": item.IpTo,
|
"ipTo": item.IpTo,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt),
|
||||||
"expiredTime": expiredTime,
|
"expiredTime": expiredTime,
|
||||||
"reason": item.Reason,
|
"reason": item.Reason,
|
||||||
"type": item.Type,
|
"type": item.Type,
|
||||||
"isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(),
|
"isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(),
|
||||||
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
||||||
|
"sourcePolicy": sourcePolicyMap,
|
||||||
|
"sourceGroup": sourceGroupMap,
|
||||||
|
"sourceSet": sourceSetMap,
|
||||||
|
"sourceServer": sourceServerMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["items"] = itemMaps
|
this.Data["items"] = itemMaps
|
||||||
|
|||||||
@@ -70,15 +70,57 @@ func (this *DenyListAction) RunGet(params struct {
|
|||||||
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// policy
|
||||||
|
var sourcePolicyMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallPolicy != nil {
|
||||||
|
sourcePolicyMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallPolicy.Id,
|
||||||
|
"name": item.SourceHTTPFirewallPolicy.Name,
|
||||||
|
"serverId": item.SourceHTTPFirewallPolicy.ServerId,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// group
|
||||||
|
var sourceGroupMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleGroup != nil {
|
||||||
|
sourceGroupMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleGroup.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleGroup.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set
|
||||||
|
var sourceSetMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleSet != nil {
|
||||||
|
sourceSetMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleSet.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleSet.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// server
|
||||||
|
var sourceServerMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceServer != nil {
|
||||||
|
sourceServerMap = maps.Map{
|
||||||
|
"id": item.SourceServer.Id,
|
||||||
|
"name": item.SourceServer.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
itemMaps = append(itemMaps, maps.Map{
|
itemMaps = append(itemMaps, maps.Map{
|
||||||
"id": item.Id,
|
"id": item.Id,
|
||||||
"ipFrom": item.IpFrom,
|
"ipFrom": item.IpFrom,
|
||||||
"ipTo": item.IpTo,
|
"ipTo": item.IpTo,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt),
|
||||||
"expiredTime": expiredTime,
|
"expiredTime": expiredTime,
|
||||||
"reason": item.Reason,
|
"reason": item.Reason,
|
||||||
"type": item.Type,
|
"type": item.Type,
|
||||||
"isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(),
|
"isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(),
|
||||||
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
||||||
|
"sourcePolicy": sourcePolicyMap,
|
||||||
|
"sourceGroup": sourceGroupMap,
|
||||||
|
"sourceSet": sourceSetMap,
|
||||||
|
"sourceServer": sourceServerMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["items"] = itemMaps
|
this.Data["items"] = itemMaps
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ func (this *TestAction) RunPost(params struct {
|
|||||||
"ipTo": resp.IpItem.IpTo,
|
"ipTo": resp.IpItem.IpTo,
|
||||||
"reason": resp.IpItem.Reason,
|
"reason": resp.IpItem.Reason,
|
||||||
"expiredAt": resp.IpItem.ExpiredAt,
|
"expiredAt": resp.IpItem.ExpiredAt,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d", resp.IpItem.CreatedAt),
|
||||||
"expiredTime": timeutil.FormatTime("Y-m-d H:i:s", resp.IpItem.ExpiredAt),
|
"expiredTime": timeutil.FormatTime("Y-m-d H:i:s", resp.IpItem.ExpiredAt),
|
||||||
"type": resp.IpItem.Type,
|
"type": resp.IpItem.Type,
|
||||||
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(resp.IpItem.EventLevel),
|
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(resp.IpItem.EventLevel),
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
defer this.CreateLogInfo("修改Web %d 的首页文件名", params.WebId)
|
defer this.CreateLogInfo("修改Web %d 的首页文件名", params.WebId)
|
||||||
|
|
||||||
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWeb(this.AdminContext(), &pb.UpdateHTTPWebRequest{
|
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWeb(this.AdminContext(), &pb.UpdateHTTPWebRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
RootJSON: params.RootJSON,
|
RootJSON: params.RootJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebWebP(this.AdminContext(), &pb.UpdateHTTPWebWebPRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebWebP(this.AdminContext(), &pb.UpdateHTTPWebWebPRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
WebpJSON: params.WebpJSON,
|
WebpJSON: params.WebpJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ func (this *IndexAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebWebsocket(this.AdminContext(), &pb.UpdateHTTPWebWebsocketRequest{
|
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebWebsocket(this.AdminContext(), &pb.UpdateHTTPWebWebsocketRequest{
|
||||||
WebId: params.WebId,
|
HttpWebId: params.WebId,
|
||||||
WebsocketJSON: websocketRefJSON,
|
WebsocketJSON: websocketRefJSON,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -199,6 +199,12 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 提交审核时间
|
||||||
|
var auditingTime = ""
|
||||||
|
if server.AuditingAt > 0 {
|
||||||
|
auditingTime = timeutil.FormatTime("Y-m-d", server.AuditingAt)
|
||||||
|
}
|
||||||
|
|
||||||
serverMaps = append(serverMaps, maps.Map{
|
serverMaps = append(serverMaps, maps.Map{
|
||||||
"id": server.Id,
|
"id": server.Id,
|
||||||
"isOn": server.IsOn,
|
"isOn": server.IsOn,
|
||||||
@@ -215,6 +221,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
"isAuditing": server.IsAuditing,
|
"isAuditing": server.IsAuditing,
|
||||||
"auditingIsOk": auditingIsOk,
|
"auditingIsOk": auditingIsOk,
|
||||||
"user": userMap,
|
"user": userMap,
|
||||||
|
"auditingTime": auditingTime,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["servers"] = serverMaps
|
this.Data["servers"] = serverMaps
|
||||||
@@ -258,7 +265,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
NodeId: 0,
|
NodeId: 0,
|
||||||
Role: nodeconfigs.NodeRoleNode,
|
Role: nodeconfigs.NodeRoleNode,
|
||||||
Offset: 0,
|
Offset: 0,
|
||||||
Size: 10,
|
Size: 20,
|
||||||
Level: "",
|
Level: "",
|
||||||
FixedState: int32(configutils.BoolStateNo),
|
FixedState: int32(configutils.BoolStateNo),
|
||||||
AllServers: true,
|
AllServers: true,
|
||||||
@@ -279,7 +286,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
var server = serverResp.Server
|
var server = serverResp.Server
|
||||||
if server == nil {
|
if server == nil {
|
||||||
// 设置为已修复
|
// 设置为已修复
|
||||||
_, err = this.RPC().NodeLogRPC().FixNodeLog(this.AdminContext(), &pb.FixNodeLogRequest{NodeLogId: errorLog.Id})
|
_, err = this.RPC().NodeLogRPC().FixNodeLogs(this.AdminContext(), &pb.FixNodeLogsRequest{NodeLogIds: []int64{errorLog.Id}})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
@@ -297,7 +304,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
var node = nodeResp.Node
|
var node = nodeResp.Node
|
||||||
if node == nil || node.NodeCluster == nil {
|
if node == nil || node.NodeCluster == nil {
|
||||||
// 设置为已修复
|
// 设置为已修复
|
||||||
_, err = this.RPC().NodeLogRPC().FixNodeLog(this.AdminContext(), &pb.FixNodeLogRequest{NodeLogId: errorLog.Id})
|
_, err = this.RPC().NodeLogRPC().FixNodeLogs(this.AdminContext(), &pb.FixNodeLogsRequest{NodeLogIds: []int64{errorLog.Id}})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package servers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/users"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
|
||||||
"github.com/iwind/TeaGo"
|
"github.com/iwind/TeaGo"
|
||||||
)
|
)
|
||||||
@@ -24,6 +25,12 @@ func init() {
|
|||||||
GetPost("/addOriginPopup", new(AddOriginPopupAction)).
|
GetPost("/addOriginPopup", new(AddOriginPopupAction)).
|
||||||
Get("/serverNamesPopup", new(ServerNamesPopupAction)).
|
Get("/serverNamesPopup", new(ServerNamesPopupAction)).
|
||||||
Post("/status", new(StatusAction)).
|
Post("/status", new(StatusAction)).
|
||||||
|
|
||||||
|
//
|
||||||
|
Post("/users/options", new(users.OptionsAction)).
|
||||||
|
Post("/users/plans", new(users.PlansAction)).
|
||||||
|
|
||||||
|
//
|
||||||
EndAll()
|
EndAll()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,19 +14,30 @@ type AddIPAction struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *AddIPAction) RunPost(params struct {
|
func (this *AddIPAction) RunPost(params struct {
|
||||||
ListId int64
|
ListId int64
|
||||||
Ip string
|
Ip string
|
||||||
|
ExpiredAt int64
|
||||||
}) {
|
}) {
|
||||||
|
var itemId int64 = 0
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
this.CreateLogInfo("在名单 %d 中创建IP %d", params.ListId, itemId)
|
||||||
|
}()
|
||||||
|
|
||||||
var ipType = "ipv4"
|
var ipType = "ipv4"
|
||||||
if strings.Contains(params.Ip, ":") {
|
if strings.Contains(params.Ip, ":") {
|
||||||
ipType = "ipv6"
|
ipType = "ipv6"
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := this.RPC().IPItemRPC().CreateIPItem(this.AdminContext(), &pb.CreateIPItemRequest{
|
if params.ExpiredAt <= 0 {
|
||||||
|
params.ExpiredAt = time.Now().Unix() + 86400
|
||||||
|
}
|
||||||
|
|
||||||
|
createResp, err := this.RPC().IPItemRPC().CreateIPItem(this.AdminContext(), &pb.CreateIPItemRequest{
|
||||||
IpListId: params.ListId,
|
IpListId: params.ListId,
|
||||||
IpFrom: params.Ip,
|
IpFrom: params.Ip,
|
||||||
IpTo: "",
|
IpTo: "",
|
||||||
ExpiredAt: time.Now().Unix() + 86400, // TODO 可以自定义时间
|
ExpiredAt: params.ExpiredAt,
|
||||||
Reason: "从IPBox中加入名单",
|
Reason: "从IPBox中加入名单",
|
||||||
Type: ipType,
|
Type: ipType,
|
||||||
EventLevel: "critical",
|
EventLevel: "critical",
|
||||||
@@ -36,5 +47,7 @@ func (this *AddIPAction) RunPost(params struct {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
itemId = createResp.IpItemId
|
||||||
|
|
||||||
this.Success()
|
this.Success()
|
||||||
}
|
}
|
||||||
|
|||||||
27
internal/web/actions/default/servers/ipbox/deleteFromList.go
Normal file
27
internal/web/actions/default/servers/ipbox/deleteFromList.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package ipbox
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteFromListAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *DeleteFromListAction) RunPost(params struct {
|
||||||
|
ListId int64
|
||||||
|
ItemId int64
|
||||||
|
}) {
|
||||||
|
defer this.CreateLogInfo("从IP名单 %d 中删除IP %d", params.ListId, params.ItemId)
|
||||||
|
|
||||||
|
_, err := this.RPC().IPItemRPC().DeleteIPItem(this.AdminContext(), &pb.DeleteIPItemRequest{IpItemId: params.ItemId})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -37,17 +37,44 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
this.Data["isp"] = regionResp.IpRegion.Isp
|
this.Data["isp"] = regionResp.IpRegion.Isp
|
||||||
|
|
||||||
// IP列表
|
// IP列表
|
||||||
ipListResp, err := this.RPC().IPListRPC().FindEnabledIPListContainsIP(this.AdminContext(), &pb.FindEnabledIPListContainsIPRequest{Ip: params.Ip})
|
ipListResp, err := this.RPC().IPListRPC().FindEnabledIPListContainsIP(this.AdminContext(), &pb.FindEnabledIPListContainsIPRequest{
|
||||||
|
Ip: params.Ip,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var ipListMaps = []maps.Map{}
|
var ipListMaps = []maps.Map{}
|
||||||
for _, ipList := range ipListResp.IpLists {
|
for _, ipList := range ipListResp.IpLists {
|
||||||
|
itemsResp, err := this.RPC().IPItemRPC().ListIPItemsWithListId(this.AdminContext(), &pb.ListIPItemsWithListIdRequest{
|
||||||
|
IpListId: ipList.Id,
|
||||||
|
Keyword: "",
|
||||||
|
IpFrom: params.Ip,
|
||||||
|
IpTo: "",
|
||||||
|
Offset: 0,
|
||||||
|
Size: 1,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var items = itemsResp.IpItems
|
||||||
|
if len(items) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var item = items[0]
|
||||||
|
|
||||||
|
var expiredTime = ""
|
||||||
|
if item.ExpiredAt > 0 {
|
||||||
|
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
||||||
|
}
|
||||||
|
|
||||||
ipListMaps = append(ipListMaps, maps.Map{
|
ipListMaps = append(ipListMaps, maps.Map{
|
||||||
"id": ipList.Id,
|
"id": ipList.Id,
|
||||||
"name": ipList.Name,
|
"name": ipList.Name,
|
||||||
"type": ipList.Type,
|
"type": ipList.Type,
|
||||||
|
"itemExpiredTime": expiredTime,
|
||||||
|
"itemId": item.Id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["ipLists"] = ipListMaps
|
this.Data["ipLists"] = ipListMaps
|
||||||
@@ -58,7 +85,7 @@ func (this *IndexAction) RunGet(params struct {
|
|||||||
IsPublic: true,
|
IsPublic: true,
|
||||||
Keyword: "",
|
Keyword: "",
|
||||||
Offset: 0,
|
Offset: 0,
|
||||||
Size: 10, // TODO 将来考虑到支持更多的黑名单
|
Size: 20, // TODO 将来考虑到支持更多的黑名单
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ func init() {
|
|||||||
Prefix("/servers/ipbox").
|
Prefix("/servers/ipbox").
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
Post("/addIP", new(AddIPAction)).
|
Post("/addIP", new(AddIPAction)).
|
||||||
|
Post("/deleteFromList", new(DeleteFromListAction)).
|
||||||
EndAll()
|
EndAll()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
Name string
|
Name string
|
||||||
Type string
|
Type string
|
||||||
Description string
|
Description string
|
||||||
|
IsGlobal bool
|
||||||
|
|
||||||
Must *actions.Must
|
Must *actions.Must
|
||||||
CSRF *actionutils.CSRF
|
CSRF *actionutils.CSRF
|
||||||
@@ -49,6 +50,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
TimeoutJSON: nil,
|
TimeoutJSON: nil,
|
||||||
IsPublic: true,
|
IsPublic: true,
|
||||||
Description: params.Description,
|
Description: params.Description,
|
||||||
|
IsGlobal: params.IsGlobal,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
|
|||||||
37
internal/web/actions/default/servers/iplists/deleteItems.go
Normal file
37
internal/web/actions/default/servers/iplists/deleteItems.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
|
||||||
|
package iplists
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeleteItemsAction struct {
|
||||||
|
actionutils.ParentAction
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *DeleteItemsAction) RunPost(params struct {
|
||||||
|
ItemIds []int64
|
||||||
|
}) {
|
||||||
|
if len(params.ItemIds) == 0 {
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
|
|
||||||
|
var itemIdStrings = []string{}
|
||||||
|
for _, itemId := range params.ItemIds {
|
||||||
|
itemIdStrings = append(itemIdStrings, types.String(itemId))
|
||||||
|
}
|
||||||
|
|
||||||
|
defer this.CreateLogInfo("批量删除IP名单中的IP:" + strings.Join(itemIdStrings, ", "))
|
||||||
|
|
||||||
|
_, err := this.RPC().IPItemRPC().DeleteIPItems(this.AdminContext(), &pb.DeleteIPItemsRequest{IpItemIds: params.ItemIds})
|
||||||
|
if err != nil {
|
||||||
|
this.ErrorPage(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Success()
|
||||||
|
}
|
||||||
@@ -5,8 +5,10 @@ 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/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ipconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type IndexAction struct {
|
type IndexAction struct {
|
||||||
@@ -18,59 +20,123 @@ func (this *IndexAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *IndexAction) RunGet(params struct {
|
func (this *IndexAction) RunGet(params struct {
|
||||||
Type string
|
Ip string
|
||||||
Keyword string
|
GlobalOnly bool
|
||||||
}) {
|
}) {
|
||||||
if len(params.Type) == 0 {
|
this.Data["type"] = ""
|
||||||
params.Type = ipconfigs.IPListTypeBlack
|
this.Data["ip"] = params.Ip
|
||||||
}
|
this.Data["globalOnly"] = params.GlobalOnly
|
||||||
this.Data["type"] = params.Type
|
|
||||||
this.Data["keyword"] = params.Keyword
|
|
||||||
|
|
||||||
countResp, err := this.RPC().IPListRPC().CountAllEnabledIPLists(this.AdminContext(), &pb.CountAllEnabledIPListsRequest{
|
countResp, err := this.RPC().IPItemRPC().CountAllEnabledIPItems(this.AdminContext(), &pb.CountAllEnabledIPItemsRequest{
|
||||||
Type: params.Type,
|
Ip: params.Ip,
|
||||||
IsPublic: true,
|
GlobalOnly: params.GlobalOnly,
|
||||||
Keyword: params.Keyword,
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
count := countResp.Count
|
var count = countResp.Count
|
||||||
page := this.NewPage(count)
|
var page = this.NewPage(count)
|
||||||
this.Data["page"] = page.AsHTML()
|
this.Data["page"] = page.AsHTML()
|
||||||
|
|
||||||
listsResp, err := this.RPC().IPListRPC().ListEnabledIPLists(this.AdminContext(), &pb.ListEnabledIPListsRequest{
|
itemsResp, err := this.RPC().IPItemRPC().ListAllEnabledIPItems(this.AdminContext(), &pb.ListAllEnabledIPItemsRequest{
|
||||||
Type: params.Type,
|
Ip: params.Ip,
|
||||||
IsPublic: true,
|
GlobalOnly: params.GlobalOnly,
|
||||||
Keyword: params.Keyword,
|
Offset: page.Offset,
|
||||||
Offset: page.Offset,
|
Size: page.Size,
|
||||||
Size: page.Size,
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var listMaps = []maps.Map{}
|
|
||||||
for _, list := range listsResp.IpLists {
|
|
||||||
// 包含的IP数量
|
|
||||||
countItemsResp, err := this.RPC().IPItemRPC().CountIPItemsWithListId(this.AdminContext(), &pb.CountIPItemsWithListIdRequest{IpListId: list.Id})
|
|
||||||
if err != nil {
|
|
||||||
this.ErrorPage(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var countItems = countItemsResp.Count
|
|
||||||
|
|
||||||
listMaps = append(listMaps, maps.Map{
|
var itemMaps = []maps.Map{}
|
||||||
"id": list.Id,
|
for _, result := range itemsResp.Results {
|
||||||
"isOn": list.IsOn,
|
var item = result.IpItem
|
||||||
"name": list.Name,
|
expiredTime := ""
|
||||||
"description": list.Description,
|
if item.ExpiredAt > 0 {
|
||||||
"countItems": countItems,
|
expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt)
|
||||||
"type": list.Type,
|
}
|
||||||
|
|
||||||
|
// policy
|
||||||
|
var sourcePolicyMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallPolicy != nil {
|
||||||
|
sourcePolicyMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallPolicy.Id,
|
||||||
|
"name": item.SourceHTTPFirewallPolicy.Name,
|
||||||
|
"serverId": item.SourceHTTPFirewallPolicy.ServerId,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// group
|
||||||
|
var sourceGroupMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleGroup != nil {
|
||||||
|
sourceGroupMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleGroup.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleGroup.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set
|
||||||
|
var sourceSetMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceHTTPFirewallRuleSet != nil {
|
||||||
|
sourceSetMap = maps.Map{
|
||||||
|
"id": item.SourceHTTPFirewallRuleSet.Id,
|
||||||
|
"name": item.SourceHTTPFirewallRuleSet.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// server
|
||||||
|
var sourceServerMap = maps.Map{"id": 0}
|
||||||
|
if item.SourceServer != nil {
|
||||||
|
sourceServerMap = maps.Map{
|
||||||
|
"id": item.SourceServer.Id,
|
||||||
|
"name": item.SourceServer.Name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IP名单
|
||||||
|
var listMap = maps.Map{"id": 0}
|
||||||
|
if result.IpList != nil {
|
||||||
|
listMap = maps.Map{
|
||||||
|
"id": result.IpList.Id,
|
||||||
|
"name": result.IpList.Name,
|
||||||
|
"type": result.IpList.Type,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// policy
|
||||||
|
var policyMap = maps.Map{"id": 0}
|
||||||
|
if result.HttpFirewallPolicy != nil {
|
||||||
|
policyMap = maps.Map{
|
||||||
|
"id": result.HttpFirewallPolicy.Id,
|
||||||
|
"name": result.HttpFirewallPolicy.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.Server != nil {
|
||||||
|
policyMap["server"] = maps.Map{"id": result.Server.Id, "name": result.Server.Name}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
itemMaps = append(itemMaps, maps.Map{
|
||||||
|
"id": item.Id,
|
||||||
|
"ipFrom": item.IpFrom,
|
||||||
|
"ipTo": item.IpTo,
|
||||||
|
"createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt),
|
||||||
|
"isExpired": item.ExpiredAt < time.Now().Unix(),
|
||||||
|
"expiredTime": expiredTime,
|
||||||
|
"reason": item.Reason,
|
||||||
|
"type": item.Type,
|
||||||
|
"eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel),
|
||||||
|
"sourcePolicy": sourcePolicyMap,
|
||||||
|
"sourceGroup": sourceGroupMap,
|
||||||
|
"sourceSet": sourceSetMap,
|
||||||
|
"sourceServer": sourceServerMap,
|
||||||
|
"list": listMap,
|
||||||
|
"policy": policyMap,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.Data["lists"] = listMaps
|
this.Data["items"] = itemMaps
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,14 @@ func init() {
|
|||||||
Data("teaSubMenu", "iplist").
|
Data("teaSubMenu", "iplist").
|
||||||
Prefix("/servers/iplists").
|
Prefix("/servers/iplists").
|
||||||
Get("", new(IndexAction)).
|
Get("", new(IndexAction)).
|
||||||
|
Get("/lists", new(ListsAction)).
|
||||||
GetPost("/createPopup", new(CreatePopupAction)).
|
GetPost("/createPopup", new(CreatePopupAction)).
|
||||||
Get("/list", new(ListAction)).
|
Get("/list", new(ListAction)).
|
||||||
GetPost("/import", new(ImportAction)).
|
GetPost("/import", new(ImportAction)).
|
||||||
GetPost("/export", new(ExportAction)).
|
GetPost("/export", new(ExportAction)).
|
||||||
Get("/exportData", new(ExportDataAction)).
|
Get("/exportData", new(ExportDataAction)).
|
||||||
Post("/delete", new(DeleteAction)).
|
Post("/delete", new(DeleteAction)).
|
||||||
|
Post("/deleteItems", new(DeleteItemsAction)).
|
||||||
GetPost("/test", new(TestAction)).
|
GetPost("/test", new(TestAction)).
|
||||||
GetPost("/update", new(UpdateAction)).
|
GetPost("/update", new(UpdateAction)).
|
||||||
Get("/items", new(ItemsAction)).
|
Get("/items", new(ItemsAction)).
|
||||||
@@ -38,7 +40,6 @@ func init() {
|
|||||||
|
|
||||||
// 选项数据
|
// 选项数据
|
||||||
Post("/levelOptions", new(LevelOptionsAction)).
|
Post("/levelOptions", new(LevelOptionsAction)).
|
||||||
|
|
||||||
EndAll()
|
EndAll()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user