Compare commits
269 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6830af28e | ||
|
|
65973c65ac | ||
|
|
01890aa83d | ||
|
|
34f33a0979 | ||
|
|
dd3b6b0fe8 | ||
|
|
4c7618f623 | ||
|
|
c73a05eceb | ||
|
|
f4a690a5c3 | ||
|
|
866697ddd0 | ||
|
|
22b945ec40 | ||
|
|
d835b36660 | ||
|
|
b375a40340 | ||
|
|
a068ce9a4f | ||
|
|
4379acbeea | ||
|
|
a086496d7c | ||
|
|
7d80c58871 | ||
|
|
0933ae903b | ||
|
|
727ac23e17 | ||
|
|
99acf99a48 | ||
|
|
23db1c4b77 | ||
|
|
d03775957e | ||
|
|
ec166af0c3 | ||
|
|
be29ba72a0 | ||
|
|
ce72dcf4dc | ||
|
|
c024049778 | ||
|
|
0863912e0c | ||
|
|
b19c7f5aa6 | ||
|
|
f5bdf33618 | ||
|
|
c6face62b1 | ||
|
|
d3c8d8fd04 | ||
|
|
16e418447a | ||
|
|
c77724cf9e | ||
|
|
606a73f6dd | ||
|
|
f48a441f23 | ||
|
|
8d55c38459 | ||
|
|
37e045876e | ||
|
|
bd5a1c5eda | ||
|
|
bd4cc6f5f5 | ||
|
|
d417f6f751 | ||
|
|
d48697f4ce | ||
|
|
841a98349d | ||
|
|
24d710d39c | ||
|
|
1ed754f285 | ||
|
|
243ceab3db | ||
|
|
eaca98ee3e | ||
|
|
11b0a12304 | ||
|
|
ce7911c3fe | ||
|
|
44a3952f05 | ||
|
|
a8340b8a8a | ||
|
|
b4f56c044c | ||
|
|
8b2088d498 | ||
|
|
e7bf608552 | ||
|
|
2c06c8932d | ||
|
|
789aeab579 | ||
|
|
a95d202ef0 | ||
|
|
64f54d462e | ||
|
|
52a20b9915 | ||
|
|
69ab70b750 | ||
|
|
890296c88b | ||
|
|
e5ba474419 | ||
|
|
0f7482511e | ||
|
|
ea58e6094c | ||
|
|
4d5fd28f97 | ||
|
|
7a139b43a9 | ||
|
|
0d1108387d | ||
|
|
e67af97487 | ||
|
|
629a2a5a8e | ||
|
|
884776fb85 | ||
|
|
f0e9b5c7e1 | ||
|
|
3849b651af | ||
|
|
4d550577ee | ||
|
|
b3e64f7241 | ||
|
|
f315b7b1d6 | ||
|
|
2de1a8aa4e | ||
|
|
cb3bf14df8 | ||
|
|
1d66029ef0 | ||
|
|
b795f60672 | ||
|
|
76e98174ee | ||
|
|
18765d29f2 | ||
|
|
9a38d40937 | ||
|
|
43ad1ff67e | ||
|
|
9f4e838f1d | ||
|
|
e95909e293 | ||
|
|
759189bca1 | ||
|
|
3dd24dc5e7 | ||
|
|
156172dacf | ||
|
|
b6e0740b27 | ||
|
|
57f3c72058 | ||
|
|
a9789c2f22 | ||
|
|
ca02782ba5 | ||
|
|
1e75f61464 | ||
|
|
e98de100b9 | ||
|
|
387ee8d9c9 | ||
|
|
a5af5e0597 | ||
|
|
9af8721d8d | ||
|
|
0d8c8064bf | ||
|
|
010a9b61d5 | ||
|
|
b277af4ac2 | ||
|
|
b85016d6c9 | ||
|
|
10ea8911bc | ||
|
|
fbfcc8d2c0 | ||
|
|
11c2682f59 | ||
|
|
8a005850db | ||
|
|
a0acc54565 | ||
|
|
8234d0301f | ||
|
|
59de46d34f | ||
|
|
0dcdde06e0 | ||
|
|
b9b7ca4c41 | ||
|
|
5244b53270 | ||
|
|
dd460bc40d | ||
|
|
d9fb6a2c84 | ||
|
|
c05072d12e | ||
|
|
caba96bfeb | ||
|
|
a36344f3bb | ||
|
|
5db4568d7e | ||
|
|
4e219b09e0 | ||
|
|
1d7986289d | ||
|
|
710ec09b14 | ||
|
|
324d24fe5a | ||
|
|
0f060002e3 | ||
|
|
2eb19348cc | ||
|
|
a92d8887e3 | ||
|
|
f914802b06 | ||
|
|
a2f21e8d58 | ||
|
|
cf4b9a49ed | ||
|
|
da02e6df4a | ||
|
|
a092f496dd | ||
|
|
98ad80e1cb | ||
|
|
6ed4e2315f | ||
|
|
55ce6570f8 | ||
|
|
70fa03e93b | ||
|
|
8fe1480d8d | ||
|
|
f796dc5921 | ||
|
|
f725f3bb07 | ||
|
|
f3db0d5b69 | ||
|
|
b6fe3df3d6 | ||
|
|
5c885050fa | ||
|
|
b54c44bfb9 | ||
|
|
78664a9218 | ||
|
|
def814ff5c | ||
|
|
1bf13d381d | ||
|
|
2975ba8701 | ||
|
|
14759c3621 | ||
|
|
5ae65edd0a | ||
|
|
184d6f97bf | ||
|
|
8972acdfd7 | ||
|
|
a957903b98 | ||
|
|
b029c1e95a | ||
|
|
095ff97149 | ||
|
|
d00ebb31aa | ||
|
|
1c7f51c5e0 | ||
|
|
acc70669f1 | ||
|
|
2add42a284 | ||
|
|
225d03a65f | ||
|
|
f851212a55 | ||
|
|
199794a63a | ||
|
|
49129ea227 | ||
|
|
91b865dd23 | ||
|
|
0e311496b6 | ||
|
|
ed0f627ae4 | ||
|
|
569f27918a | ||
|
|
ec02d83ee6 | ||
|
|
debf4a5249 | ||
|
|
4ddc1ac89f | ||
|
|
507457dec1 | ||
|
|
525429bbb0 | ||
|
|
25e33ac1ee | ||
|
|
f428cb2de9 | ||
|
|
86070bc8aa | ||
|
|
afef00b473 | ||
|
|
812e9482af | ||
|
|
fa5dc80426 | ||
|
|
76b6a5c847 | ||
|
|
a19b738d73 | ||
|
|
526d72fd99 | ||
|
|
7ea8189c19 | ||
|
|
c453222774 | ||
|
|
905163880c | ||
|
|
ac106ca4f0 | ||
|
|
262dcf0c8d | ||
|
|
f6b3a0b829 | ||
|
|
ac7ab51dbb | ||
|
|
41ea2d0dda | ||
|
|
a4b68cd21c | ||
|
|
70d864191e | ||
|
|
9fdbaf92cc | ||
|
|
a75e57a8f7 | ||
|
|
9b187dadbe | ||
|
|
3ab783bbd0 | ||
|
|
0e95a5a4bc | ||
|
|
dcec62a1a2 | ||
|
|
9117af3021 | ||
|
|
65095d1290 | ||
|
|
380bf3e1c2 | ||
|
|
0090cf1e30 | ||
|
|
a24cbe43b6 | ||
|
|
0976b35357 | ||
|
|
84f8a7192e | ||
|
|
22479278b9 | ||
|
|
f27a55c2b6 | ||
|
|
106bd2ae87 | ||
|
|
ef4eb23226 | ||
|
|
d9a2284936 | ||
|
|
62027e95b2 | ||
|
|
551cb2f3c1 | ||
|
|
75dcaa7e7e | ||
|
|
c6952e794a | ||
|
|
7ad94bff2f | ||
|
|
20469e0487 | ||
|
|
4834cb2886 | ||
|
|
1f33bcfee7 | ||
|
|
8f8e769ead | ||
|
|
03296c7530 | ||
|
|
fecfb0f888 | ||
|
|
5e277de82b | ||
|
|
de4366bbc3 | ||
|
|
a8d38937e3 | ||
|
|
0ea04c9883 | ||
|
|
85553bf5d9 | ||
|
|
24f8ccb166 | ||
|
|
fb0b1d42ef | ||
|
|
38005406b0 | ||
|
|
6aee09b22b | ||
|
|
8c450a9b43 | ||
|
|
a660815df7 | ||
|
|
2b6d749566 | ||
|
|
dd900700e9 | ||
|
|
032b171025 | ||
|
|
ab005caa4a | ||
|
|
8e91af92ae | ||
|
|
97575e29a1 | ||
|
|
146b57216a | ||
|
|
2cdb0b9758 | ||
|
|
a6355914b2 | ||
|
|
fdcb83cc5f | ||
|
|
57bffa2cda | ||
|
|
e7189948f2 | ||
|
|
59a3a90d99 | ||
|
|
5619d0e026 | ||
|
|
21d58764cc | ||
|
|
2e17fc4368 | ||
|
|
4e921330db | ||
|
|
83423c1450 | ||
|
|
9d011f4982 | ||
|
|
6369458877 | ||
|
|
f855996d53 | ||
|
|
e75248ad6b | ||
|
|
8ccbe99fbc | ||
|
|
977358a3ab | ||
|
|
67154237fb | ||
|
|
d71b545971 | ||
|
|
7908d70750 | ||
|
|
8722c8a34a | ||
|
|
7488d0b334 | ||
|
|
d86f2bc1a4 | ||
|
|
6c1514cad7 | ||
|
|
c132bd9c1e | ||
|
|
f733282b48 | ||
|
|
4396b0fe74 | ||
|
|
04ab37ce23 | ||
|
|
01ca35f6a9 | ||
|
|
1c337ec40e | ||
|
|
aebafacda2 | ||
|
|
59b93bfbe1 | ||
|
|
eccc56369b | ||
|
|
75221eb855 | ||
|
|
b8d45ab42e | ||
|
|
bc2c6a56ed | ||
|
|
1becfdcd67 |
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*_plus.go
|
||||
*_plus_test.go
|
||||
29
LICENSE
Normal file
29
LICENSE
Normal file
@@ -0,0 +1,29 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2020, LiuXiangChao
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -1,3 +1,5 @@
|
||||
GoEdge公共配置项。
|
||||
|
||||
目录结构:
|
||||
~~~
|
||||
pkg/
|
||||
@@ -12,6 +14,7 @@ pkg/
|
||||
userconfigs - 用户相关配置
|
||||
|
||||
configutils/ - 配置公共函数等
|
||||
iplibrary/ - IP库
|
||||
errors/ - 错误处理
|
||||
rpc/ - RPC通讯
|
||||
protos/ RPC数据和接口定义
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "starting ..."
|
||||
|
||||
#rm -f ../pkg/rpc/pb/*.pb.go
|
||||
|
||||
protoc --go_out=plugins=grpc:../pkg/rpc --proto_path=../pkg/rpc/protos ../pkg/rpc/protos/*.proto
|
||||
protoc --go_out=plugins=grpc:../pkg/rpc --proto_path=../pkg/rpc/protos ../pkg/rpc/protos/models/*.proto
|
||||
RESULT=$?
|
||||
if [ "${RESULT}" != "0" ]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
RESULT=`protoc --go_out=plugins=grpc:../pkg/rpc --proto_path=../pkg/rpc/protos ../pkg/rpc/protos/models/*.proto`
|
||||
RESULT=$?
|
||||
if [ "${RESULT}" != "0" ]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
# generate rpc.json
|
||||
./proto-json.sh --quiet
|
||||
|
||||
echo "ok"
|
||||
3
build/proto-json.sh
Executable file
3
build/proto-json.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
go run ../cmd/proto-json/main.go $1
|
||||
22140
build/rpc.json
Normal file
22140
build/rpc.json
Normal file
File diff suppressed because it is too large
Load Diff
448
cmd/proto-json/main.go
Normal file
448
cmd/proto-json/main.go
Normal file
@@ -0,0 +1,448 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
_ "github.com/iwind/TeaGo/bootstrap"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type ServiceInfo struct {
|
||||
Name string `json:"name"`
|
||||
Methods []*MethodInfo `json:"methods"`
|
||||
Filename string `json:"filename"`
|
||||
Doc string `json:"doc"`
|
||||
}
|
||||
|
||||
type MethodInfo struct {
|
||||
Name string `json:"name"`
|
||||
RequestMessageName string `json:"requestMessageName"`
|
||||
ResponseMessageName string `json:"responseMessageName"`
|
||||
Code string `json:"code"`
|
||||
Doc string `json:"doc"`
|
||||
Roles []string `json:"roles"`
|
||||
IsDeprecated bool `json:"isDeprecated"`
|
||||
}
|
||||
|
||||
type MessageInfo struct {
|
||||
Name string `json:"name"`
|
||||
Code string `json:"code"`
|
||||
Doc string `json:"doc"`
|
||||
}
|
||||
|
||||
type LinkInfo struct {
|
||||
Name string `json:"name"`
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
type RPCList struct {
|
||||
Services []*ServiceInfo `json:"services"`
|
||||
Messages []*MessageInfo `json:"messages"`
|
||||
Links []*LinkInfo `json:"links"`
|
||||
}
|
||||
|
||||
func readComments(data []byte) string {
|
||||
var lines = bytes.Split(data, []byte{'\n'})
|
||||
var comments = [][]byte{}
|
||||
for i := len(lines) - 1; i >= 0; i-- {
|
||||
var line = bytes.TrimLeft(lines[i], " \t")
|
||||
if len(line) == 0 {
|
||||
comments = append([][]byte{{' '}}, comments...)
|
||||
continue
|
||||
}
|
||||
|
||||
if bytes.HasPrefix(line, []byte("//")) {
|
||||
line = bytes.TrimSpace(bytes.TrimLeft(line, "/"))
|
||||
comments = append([][]byte{line}, comments...)
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return string(bytes.TrimSpace(bytes.Join(comments, []byte{'\n'})))
|
||||
}
|
||||
|
||||
func removeDuplicates(s []string) []string {
|
||||
if len(s) == 0 {
|
||||
return s
|
||||
}
|
||||
var m = map[string]bool{}
|
||||
var result = []string{}
|
||||
for _, item := range s {
|
||||
_, ok := m[item]
|
||||
if ok {
|
||||
continue
|
||||
}
|
||||
result = append(result, item)
|
||||
m[item] = true
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// 生成JSON格式API列表
|
||||
func main() {
|
||||
var quiet = false
|
||||
flag.BoolVar(&quiet, "quiet", false, "")
|
||||
flag.Parse()
|
||||
|
||||
var methodRolesMap = map[string][]string{} // method => roles
|
||||
{
|
||||
var rootDir = filepath.Clean(Tea.Root + "/../../EdgeAPI/internal/rpc/services")
|
||||
entries, err := os.ReadDir(rootDir)
|
||||
if err != nil {
|
||||
logs.Println("[ERROR]read api services from '" + rootDir + "' failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
var rootDirs = []string{rootDir}
|
||||
|
||||
for _, entry := range entries {
|
||||
if entry.IsDir() {
|
||||
rootDirs = append(rootDirs, rootDir+string(os.PathSeparator)+entry.Name())
|
||||
}
|
||||
}
|
||||
|
||||
// 排序以保证输出内容的稳定性
|
||||
sort.Strings(rootDirs)
|
||||
|
||||
for _, rootDir := range rootDirs {
|
||||
files, err := filepath.Glob(rootDir + "/service_*.go")
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]list service implementation files failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 排序以保证输出内容的稳定性
|
||||
sort.Strings(files)
|
||||
|
||||
var methodNameReg = regexp.MustCompile(`func\s*\(\w+\s+\*\s*(\w+Service)\)\s*(\w+)\s*\(`) // $1: serviceName, $2 methodName
|
||||
for _, file := range files {
|
||||
data, err := os.ReadFile(file)
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]read file '" + file + "' failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
var sourceCode = string(data)
|
||||
|
||||
var locList = methodNameReg.FindAllStringIndex(sourceCode, -1)
|
||||
for index, loc := range locList {
|
||||
var methodSource = ""
|
||||
if index == len(locList)-1 { // last one
|
||||
methodSource = sourceCode[loc[0]:]
|
||||
} else {
|
||||
methodSource = sourceCode[loc[0]:locList[index+1][0]]
|
||||
}
|
||||
|
||||
// 方法名
|
||||
var submatch = methodNameReg.FindStringSubmatch(methodSource)
|
||||
if len(submatch) == 0 {
|
||||
continue
|
||||
}
|
||||
var serviceName = submatch[1]
|
||||
if serviceName == "BaseService" {
|
||||
continue
|
||||
}
|
||||
var methodName = submatch[2]
|
||||
if methodName[0] < 'A' || methodName[0] > 'Z' {
|
||||
continue
|
||||
}
|
||||
var roles = []string{}
|
||||
if strings.Contains(methodSource, ".ValidateNode(") {
|
||||
roles = append(roles, "node")
|
||||
}
|
||||
if strings.Contains(methodSource, ".ValidateUserNode(") {
|
||||
var hasRoles = false
|
||||
var wordIndex = strings.Index(methodSource, ".ValidateUserNode(")
|
||||
if wordIndex > 0 {
|
||||
if len(methodSource[wordIndex:]) > 100 {
|
||||
if strings.Contains(methodSource[wordIndex:wordIndex+100], ".ValidateUserNode(ctx, false)") {
|
||||
hasRoles = true
|
||||
}
|
||||
}
|
||||
if !hasRoles {
|
||||
roles = append(roles, "user")
|
||||
}
|
||||
}
|
||||
}
|
||||
if strings.Contains(methodSource, ".ValidateAdmin(") {
|
||||
roles = append(roles, "admin")
|
||||
}
|
||||
if strings.Contains(methodSource, ".ValidateAdminAndUser(") {
|
||||
var hasRoles = false
|
||||
var wordIndex = strings.Index(methodSource, ".ValidateAdminAndUser(")
|
||||
if wordIndex > 0 {
|
||||
if len(methodSource[wordIndex:]) > 100 {
|
||||
if strings.Contains(methodSource[wordIndex:wordIndex+100], ".ValidateAdminAndUser(ctx, false)") {
|
||||
roles = append(roles, "admin")
|
||||
hasRoles = true
|
||||
}
|
||||
}
|
||||
if !hasRoles {
|
||||
roles = append(roles, "admin", "user")
|
||||
}
|
||||
}
|
||||
}
|
||||
if strings.Contains(methodSource, ".ValidateNSNode(") {
|
||||
roles = append(roles, "dns")
|
||||
}
|
||||
if strings.Contains(methodSource, ".ValidateMonitorNode(") {
|
||||
roles = append(roles, "monitor")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeDNS") {
|
||||
roles = append(roles, "dns")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeUser") {
|
||||
roles = append(roles, "user")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeNode") {
|
||||
roles = append(roles, "node")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeMonitor") {
|
||||
roles = append(roles, "monitor")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeReport") {
|
||||
roles = append(roles, "report")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeCluster") {
|
||||
roles = append(roles, "cluster")
|
||||
}
|
||||
if strings.Contains(methodSource, "rpcutils.UserTypeAdmin") {
|
||||
roles = append(roles, "admin")
|
||||
}
|
||||
|
||||
methodRolesMap[strings.ToLower(methodName)] = removeDuplicates(roles)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var services = []*ServiceInfo{}
|
||||
var messages = []*MessageInfo{}
|
||||
|
||||
{
|
||||
var dirs = []string{Tea.Root + "/../pkg/rpc/protos/", Tea.Root + "/../pkg/rpc/protos/models"}
|
||||
for _, dir := range dirs {
|
||||
func(dir string) {
|
||||
dir = filepath.Clean(dir)
|
||||
|
||||
files, err := filepath.Glob(dir + "/*.proto")
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]list proto files failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 排序以保持稳定性
|
||||
sort.Strings(files)
|
||||
|
||||
for _, path := range files {
|
||||
func(path string) {
|
||||
var filename = filepath.Base(path)
|
||||
if filename == "service_authority_key.proto" || filename == "service_authority_node.proto" {
|
||||
return
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]" + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 先将rpc代码替换成临时代码
|
||||
var methodCodeMap = map[string][]byte{} // code => method
|
||||
var methodIndex = 0
|
||||
var methodReg = regexp.MustCompile(`(?s)rpc\s+(\w+)\s*\(\s*(\w+)\s*\)\s*returns\s*\(\s*(\w+)\s*\)\s*(\{.+})?\s*;`)
|
||||
data = methodReg.ReplaceAllFunc(data, func(methodData []byte) []byte {
|
||||
methodIndex++
|
||||
var code = "METHOD" + types.String(methodIndex)
|
||||
methodCodeMap[code] = methodData
|
||||
return []byte("\n" + code)
|
||||
})
|
||||
|
||||
// 服务列表
|
||||
// TODO 这里需要改进一下,当前实现方法如果方法注释里有括号(}),就会导致部分方法解析不到
|
||||
var serviceNameReg = regexp.MustCompile(`(?sU)\n\s*service\s+(\w+)\s*\{(.+)}`)
|
||||
var serviceMatches = serviceNameReg.FindAllSubmatch(data, -1)
|
||||
var serviceNamePositions = serviceNameReg.FindAllIndex(data, -1)
|
||||
for serviceMatchIndex, serviceMatch := range serviceMatches {
|
||||
var serviceName = string(serviceMatch[1])
|
||||
var serviceNamePosition = serviceNamePositions[serviceMatchIndex][0]
|
||||
var comment = readComments(data[:serviceNamePosition])
|
||||
|
||||
// 方法列表
|
||||
var methods = []*MethodInfo{}
|
||||
var serviceData = serviceMatch[2]
|
||||
var methodCodeReg = regexp.MustCompile(`\b(METHOD\d+)\b`)
|
||||
var methodCodeMatches = methodCodeReg.FindAllSubmatch(serviceData, -1)
|
||||
var methodCodePositions = methodCodeReg.FindAllIndex(serviceData, -1)
|
||||
for methodMatchIndex, methodMatch := range methodCodeMatches {
|
||||
var methodCode = string(methodMatch[1])
|
||||
var methodData = methodCodeMap[methodCode]
|
||||
var methodPieces = methodReg.FindSubmatch(methodData)
|
||||
var methodCodePosition = methodCodePositions[methodMatchIndex]
|
||||
|
||||
var roles = methodRolesMap[strings.ToLower(string(methodPieces[1]))]
|
||||
if roles == nil {
|
||||
roles = []string{}
|
||||
}
|
||||
|
||||
methods = append(methods, &MethodInfo{
|
||||
Name: string(methodPieces[1]),
|
||||
RequestMessageName: string(methodPieces[2]),
|
||||
ResponseMessageName: string(methodPieces[3]),
|
||||
IsDeprecated: strings.Contains(string(methodPieces[4]), "deprecated"),
|
||||
Code: string(methodData),
|
||||
Doc: readComments(serviceData[:methodCodePosition[0]]),
|
||||
Roles: roles,
|
||||
})
|
||||
}
|
||||
|
||||
services = append(services, &ServiceInfo{
|
||||
Name: serviceName,
|
||||
Methods: methods,
|
||||
Filename: filename,
|
||||
Doc: comment,
|
||||
})
|
||||
}
|
||||
|
||||
// 消息列表
|
||||
var topMessageCodeMap = map[string][]byte{} // code => message
|
||||
var allMessageCodeMap = map[string][]byte{}
|
||||
var messageCodeIndex = 0
|
||||
var messagesReg = regexp.MustCompile(`(?sU)\n\s*message\s+(\w+)\s*\{([^{}]+)\n\s*}`)
|
||||
var firstMessagesReg = regexp.MustCompile(`message\s+(\w+)`)
|
||||
var messageCodeREG = regexp.MustCompile(`MESSAGE\d+`)
|
||||
for {
|
||||
var hasMessage = false
|
||||
|
||||
data = messagesReg.ReplaceAllFunc(data, func(messageData []byte) []byte {
|
||||
messageCodeIndex++
|
||||
hasMessage = true
|
||||
|
||||
// 是否包含子Message
|
||||
var subMatches = messageCodeREG.FindAllSubmatch(messageData, -1)
|
||||
for _, subMatch := range subMatches {
|
||||
var subMatchCode = string(subMatch[0])
|
||||
delete(topMessageCodeMap, subMatchCode)
|
||||
}
|
||||
|
||||
var code = "MESSAGE" + types.String(messageCodeIndex)
|
||||
topMessageCodeMap[code] = messageData
|
||||
allMessageCodeMap[code] = messageData
|
||||
return []byte("\n" + code)
|
||||
})
|
||||
if !hasMessage {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
for messageCode, messageData := range topMessageCodeMap {
|
||||
// 替换其中的子Message
|
||||
for {
|
||||
if messageCodeREG.Match(messageData) {
|
||||
messageData = messageCodeREG.ReplaceAllFunc(messageData, func(messageCodeData []byte) []byte {
|
||||
return allMessageCodeMap[string(messageCodeData)]
|
||||
})
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 注释
|
||||
var index = bytes.Index(data, []byte(messageCode))
|
||||
var messageName = string(firstMessagesReg.FindSubmatch(messageData)[1])
|
||||
messages = append(messages, &MessageInfo{
|
||||
Name: messageName,
|
||||
Code: string(bytes.TrimSpace(messageData)),
|
||||
Doc: readComments(data[:index]),
|
||||
})
|
||||
}
|
||||
}(path)
|
||||
}
|
||||
}(dir)
|
||||
}
|
||||
}
|
||||
|
||||
var countServices = len(services)
|
||||
var countMethods = 0
|
||||
var countMessages = len(messages)
|
||||
for _, service := range services {
|
||||
countMethods += len(service.Methods)
|
||||
}
|
||||
|
||||
// 链接
|
||||
var links = []*LinkInfo{}
|
||||
|
||||
// json links
|
||||
{
|
||||
var dirs = []string{Tea.Root + "/../pkg/rpc/jsons"}
|
||||
for _, dir := range dirs {
|
||||
func(dir string) {
|
||||
dir = filepath.Clean(dir)
|
||||
|
||||
files, err := filepath.Glob(dir + "/*.md")
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]list .md files failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 排序以保持稳定性
|
||||
sort.Strings(files)
|
||||
|
||||
for _, path := range files {
|
||||
func(path string) {
|
||||
var name = strings.TrimSuffix(filepath.Base(path), ".md")
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]read '" + path + "' failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
links = append(links, &LinkInfo{
|
||||
Name: "json:" + name,
|
||||
Content: string(data),
|
||||
})
|
||||
}(path)
|
||||
}
|
||||
}(dir)
|
||||
}
|
||||
}
|
||||
|
||||
// 对消息进行排序,以保持稳定性
|
||||
sort.Slice(messages, func(i, j int) bool {
|
||||
return messages[i].Name < messages[j].Name
|
||||
})
|
||||
|
||||
var rpcList = &RPCList{
|
||||
Services: services,
|
||||
Messages: messages,
|
||||
Links: links,
|
||||
}
|
||||
jsonData, err := json.MarshalIndent(rpcList, "", " ")
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]marshal to json failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
var jsonFile = Tea.Root + "/rpc.json"
|
||||
err = os.WriteFile(jsonFile, jsonData, 0666)
|
||||
if err != nil {
|
||||
fmt.Println("[ERROR]write json to file failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if !quiet {
|
||||
fmt.Println("services:", countServices, "methods:", countMethods, "messages:", countMessages)
|
||||
fmt.Println("===")
|
||||
fmt.Println("generated " + filepath.Base(jsonFile) + " successfully")
|
||||
}
|
||||
}
|
||||
13
go.mod
13
go.mod
@@ -1,15 +1,18 @@
|
||||
module github.com/TeaOSLab/EdgeCommon
|
||||
|
||||
go 1.15
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/cespare/xxhash/v2 v2.1.1
|
||||
github.com/golang/protobuf v1.5.2
|
||||
github.com/iwind/TeaGo v0.0.0-20220304043459-0dd944a5b475
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f
|
||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 // indirect
|
||||
google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e // indirect
|
||||
golang.org/x/net v0.2.0
|
||||
google.golang.org/grpc v1.45.0
|
||||
google.golang.org/protobuf v1.27.1
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/sys v0.2.0 // indirect
|
||||
golang.org/x/text v0.4.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e // indirect
|
||||
)
|
||||
|
||||
22
go.sum
22
go.sum
@@ -7,7 +7,6 @@ github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5Db
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
@@ -114,8 +113,8 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
|
||||
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@@ -137,20 +136,15 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs=
|
||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs=
|
||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
@@ -168,8 +162,6 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98
|
||||
google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20220303160752-862486edd9cc h1:fb/ViRpv3ln/LvbqZtTpoOd1YQDNH12gaGZreoSFovE=
|
||||
google.golang.org/genproto v0.0.0-20220303160752-862486edd9cc/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
||||
google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e h1:fNKDNuUyC4WH+inqDMpfXDdfvwfYILbsX+oskGZ8hxg=
|
||||
google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
@@ -179,8 +171,6 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||
google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=
|
||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=
|
||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
|
||||
@@ -50,8 +50,8 @@ func MatchDomain(pattern string, domain string) (isMatched bool) {
|
||||
}
|
||||
|
||||
// 其他匹配
|
||||
patternPieces := strings.Split(pattern, ".")
|
||||
domainPieces := strings.Split(domain, ".")
|
||||
var patternPieces = strings.Split(pattern, ".")
|
||||
var domainPieces = strings.Split(domain, ".")
|
||||
if len(patternPieces) != len(domainPieces) {
|
||||
return
|
||||
}
|
||||
@@ -60,6 +60,15 @@ func MatchDomain(pattern string, domain string) (isMatched bool) {
|
||||
if patternPiece == "" || patternPiece == "*" || patternPiece == domainPieces[index] {
|
||||
continue
|
||||
}
|
||||
if strings.HasSuffix(patternPiece, ":*") {
|
||||
var portIndex = strings.LastIndex(patternPiece, ":*")
|
||||
if portIndex >= 0 {
|
||||
var prefix = patternPiece[:portIndex]
|
||||
if strings.HasPrefix(domainPieces[index], prefix+":") || domainPieces[index] == prefix {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
isMatched = false
|
||||
break
|
||||
}
|
||||
|
||||
@@ -6,86 +6,110 @@ import (
|
||||
)
|
||||
|
||||
func TestMatchDomain(t *testing.T) {
|
||||
a := assert.NewAssertion(t)
|
||||
var a = assert.NewAssertion(t)
|
||||
{
|
||||
ok := MatchDomains([]string{}, "example.com")
|
||||
var ok = MatchDomains([]string{}, "example.com")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"example.com"}, "example.com")
|
||||
var ok = MatchDomains([]string{"example.com"}, "example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"www.example.com"}, "example.com")
|
||||
var ok = MatchDomains([]string{"www.example.com"}, "example.com")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{".example.com"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{".example.com"}, "www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{".example.com"}, "a.www.example.com")
|
||||
var ok = MatchDomains([]string{".example.com"}, "a.www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{".example.com"}, "a.www.example123.com")
|
||||
var ok = MatchDomains([]string{".example.com"}, "a.www.example123.com")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"*.example.com"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{"*.example.com"}, "www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"*.*.com"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{"*.*.com"}, "www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"www.*.com"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{"www.*.com"}, "www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"gallery.*.com"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{"gallery.*.com"}, "www.example.com")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"~\\w+.example.com"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{"~\\w+.example.com"}, "www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"~\\w+.example.com"}, "a.www.example.com")
|
||||
var ok = MatchDomains([]string{"~\\w+.example.com"}, "a.www.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"~^\\d+.example.com$"}, "www.example.com")
|
||||
var ok = MatchDomains([]string{"~^\\d+.example.com$"}, "www.example.com")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
|
||||
{
|
||||
ok := MatchDomains([]string{"~^\\d+.example.com$"}, "123.example.com")
|
||||
var ok = MatchDomains([]string{"~^\\d+.example.com$"}, "123.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
{
|
||||
ok := MatchDomains([]string{"*"}, "example.com")
|
||||
var ok = MatchDomains([]string{"*"}, "example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
|
||||
// port
|
||||
{
|
||||
ok := MatchDomains([]string{"example.com:8001"}, "example.com:8001")
|
||||
var ok = MatchDomains([]string{"example.com:8001"}, "example.com:8001")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
{
|
||||
var ok = MatchDomains([]string{"example.com:8002"}, "example.com:8001")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
{
|
||||
var ok = MatchDomains([]string{"*.example.com:8001"}, "a.example.com:8001")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
{
|
||||
var ok = MatchDomains([]string{"a.example.com:*"}, "a.example.com:8001")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
{
|
||||
var ok = MatchDomains([]string{"a.example.com:*"}, "a.example.com")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
{
|
||||
var ok = MatchDomains([]string{"*.example.com:*"}, "a.example.com:8001")
|
||||
a.IsTrue(ok)
|
||||
}
|
||||
{
|
||||
var ok = MatchDomains([]string{"*.example.com:8002"}, "a.example.com:8001")
|
||||
a.IsFalse(ok)
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsSpecialDomain(t *testing.T) {
|
||||
|
||||
@@ -2,27 +2,71 @@ package configutils
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"github.com/cespare/xxhash/v2"
|
||||
"math"
|
||||
"math/big"
|
||||
"net"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// IP2Long 将IP转换为整型
|
||||
// IPString2Long 将IP转换为整型
|
||||
// 注意IPv6没有顺序
|
||||
func IP2Long(ip string) uint64 {
|
||||
func IPString2Long(ip string) uint64 {
|
||||
if len(ip) == 0 {
|
||||
return 0
|
||||
}
|
||||
s := net.ParseIP(ip)
|
||||
if len(s) == 0 {
|
||||
var netIP = net.ParseIP(ip)
|
||||
if len(netIP) == 0 {
|
||||
return 0
|
||||
}
|
||||
return IP2Long(netIP)
|
||||
}
|
||||
|
||||
// IP2Long 将IP对象转换为整型
|
||||
func IP2Long(netIP net.IP) uint64 {
|
||||
if len(netIP) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
if strings.Contains(ip, ":") {
|
||||
return math.MaxUint32 + xxhash.Sum64(s)
|
||||
var b4 = netIP.To4()
|
||||
if b4 != nil {
|
||||
return uint64(binary.BigEndian.Uint32(b4.To4()))
|
||||
}
|
||||
return uint64(binary.BigEndian.Uint32(s.To4()))
|
||||
|
||||
var i = big.NewInt(0)
|
||||
i.SetBytes(netIP.To16())
|
||||
return i.Uint64()
|
||||
}
|
||||
|
||||
// IsIPv4 检查是否为IPv4
|
||||
func IsIPv4(netIP net.IP) bool {
|
||||
if len(netIP) == 0 {
|
||||
return false
|
||||
}
|
||||
return netIP.To4() != nil
|
||||
}
|
||||
|
||||
// IsIPv6 检查是否为IPv6
|
||||
func IsIPv6(netIP net.IP) bool {
|
||||
if len(netIP) == 0 {
|
||||
return false
|
||||
}
|
||||
return netIP.To4() == nil && netIP.To16() != nil
|
||||
}
|
||||
|
||||
// IPVersion 获取IP版本号
|
||||
func IPVersion(netIP net.IP) int {
|
||||
if len(netIP) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
if netIP.To4() != nil {
|
||||
return 4
|
||||
}
|
||||
|
||||
if netIP.To16() != nil {
|
||||
return 6
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// ParseCIDR 计算CIDR最大值
|
||||
|
||||
@@ -1,11 +1,41 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package configutils
|
||||
package configutils_test
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
||||
"github.com/iwind/TeaGo/assert"
|
||||
"net"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParseCIDR(t *testing.T) {
|
||||
t.Log(ParseCIDR("192.168.1.1/32"))
|
||||
t.Log(ParseCIDR("192.168.1.1/24"))
|
||||
t.Log(ParseCIDR("192.168.1.1/16"))
|
||||
t.Log(configutils.ParseCIDR("192.168.1.1/32"))
|
||||
t.Log(configutils.ParseCIDR("192.168.1.1/24"))
|
||||
t.Log(configutils.ParseCIDR("192.168.1.1/16"))
|
||||
}
|
||||
|
||||
func TestIPString2Long(t *testing.T) {
|
||||
for _, ip := range []string{"127.0.0.1", "192.168.1.100", "::1", "fd00:6868:6868:0:10ac:d056:3bf6:7452", "fd00:6868:6868:0:10ac:d056:3bf6:7453", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", "wrong ip"} {
|
||||
t.Log(fmt.Sprintf("%42s", ip), "=>", configutils.IPString2Long(ip))
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsIPv4(t *testing.T) {
|
||||
t.Log(configutils.IsIPv4(net.ParseIP("192.168.1.100")))
|
||||
t.Log(configutils.IsIPv4(net.ParseIP("::1")))
|
||||
}
|
||||
|
||||
func TestIsIPv6(t *testing.T) {
|
||||
t.Log(configutils.IsIPv6(net.ParseIP("192.168.1.100")))
|
||||
t.Log(configutils.IsIPv6(net.ParseIP("::1")))
|
||||
}
|
||||
|
||||
func TestIPVersion(t *testing.T) {
|
||||
var a = assert.NewAssertion(t)
|
||||
a.IsTrue(configutils.IPVersion(net.ParseIP("192.168.1.100")) == 4)
|
||||
a.IsTrue(configutils.IPVersion(net.ParseIP("1.2.3")) == 0)
|
||||
a.IsTrue(configutils.IPVersion(net.ParseIP("::1")) == 6)
|
||||
a.IsTrue(configutils.IPVersion(net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")) == 6)
|
||||
}
|
||||
|
||||
@@ -14,8 +14,18 @@ var variableMapping = map[string][]interface{}{} // source => [holder1, ...]
|
||||
var variableLocker = sync.RWMutex{}
|
||||
var regexpNamedVariable = regexp.MustCompile(`\${[\w.-]+}`)
|
||||
|
||||
var stringBuilderPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &strings.Builder{}
|
||||
},
|
||||
}
|
||||
|
||||
// ParseVariables 分析变量
|
||||
func ParseVariables(source string, replacer func(varName string) (value string)) string {
|
||||
if len(source) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
variableLocker.RLock()
|
||||
holders, found := variableMapping[source]
|
||||
variableLocker.RUnlock()
|
||||
@@ -42,16 +52,18 @@ func ParseVariables(source string, replacer func(varName string) (value string))
|
||||
}
|
||||
|
||||
// 多个占位时,使用Builder
|
||||
result := strings.Builder{}
|
||||
var builder = stringBuilderPool.Get().(*strings.Builder)
|
||||
builder.Reset()
|
||||
defer stringBuilderPool.Put(builder)
|
||||
for _, h := range holders {
|
||||
holder, ok := h.(VariableHolder)
|
||||
if ok {
|
||||
result.WriteString(replacer(string(holder)))
|
||||
builder.WriteString(replacer(string(holder)))
|
||||
} else {
|
||||
result.Write(h.([]byte))
|
||||
builder.Write(h.([]byte))
|
||||
}
|
||||
}
|
||||
return result.String()
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
// ParseVariablesFromHolders 从占位中分析变量
|
||||
@@ -92,5 +104,8 @@ func ParseHolders(source string) (holders VariableHolders) {
|
||||
|
||||
// HasVariables 判断是否有变量
|
||||
func HasVariables(source string) bool {
|
||||
if len(source) == 0 {
|
||||
return false
|
||||
}
|
||||
return regexpNamedVariable.MatchString(source)
|
||||
}
|
||||
|
||||
@@ -53,11 +53,15 @@ func BenchmarkParseVariables(b *testing.B) {
|
||||
return "Lu"
|
||||
})
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = ParseVariables("hello, ${name}, ${age}, ${gender}, ${home}, world", func(s string) string {
|
||||
return "Lu"
|
||||
})
|
||||
}
|
||||
b.ResetTimer()
|
||||
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
for pb.Next() {
|
||||
_ = ParseVariables("hello, ${name}, ${age}, ${gender}, ${home}, world", func(s string) string {
|
||||
return "Lu"
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkParseVariablesFromHolders(b *testing.B) {
|
||||
@@ -95,3 +99,11 @@ func BenchmarkParseNoVariables(b *testing.B) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkParseEmpty(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = ParseVariables("", func(s string) string {
|
||||
return "Lu"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,11 @@ package configutils
|
||||
|
||||
import (
|
||||
"gopkg.in/yaml.v3"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
)
|
||||
|
||||
func UnmarshalYamlFile(file string, ptr interface{}) error {
|
||||
data, err := ioutil.ReadFile(file)
|
||||
data, err := os.ReadFile(file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
1
pkg/dnsconfigs/.gitignore
vendored
Normal file
1
pkg/dnsconfigs/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
ns_*
|
||||
@@ -2,9 +2,18 @@ package dnsconfigs
|
||||
|
||||
// ClusterDNSConfig 集群的DNS设置
|
||||
type ClusterDNSConfig struct {
|
||||
CNameRecords []string `yaml:"cnameRecords" json:"cnameRecords"` // 自动加入的CNAME
|
||||
TTL int32 `yaml:"ttl" json:"ttl"` // 默认TTL,各个DNS服务商对记录的TTL的限制各有不同
|
||||
CNAMERecords []string `yaml:"cnameRecords" json:"cnameRecords"` // 自动加入的CNAME
|
||||
TTL int32 `yaml:"ttl" json:"ttl"` // 默认TTL,各个DNS服务商对记录的TTL的限制各有不同
|
||||
CNAMEAsDomain bool `yaml:"cnameAsDomain" json:"cnameAsDomain"` // 是否可以像域名一样直接访问CNAME
|
||||
IncludingLnNodes bool `yaml:"includingLnNodes" json:"includingLnNodes"` // 是否包含Ln节点
|
||||
|
||||
NodesAutoSync bool `yaml:"nodesAutoSync" json:"nodesAutoSync"` // 是否自动同步节点状态
|
||||
ServersAutoSync bool `yaml:"serversAutoSync" json:"serversAutoSync"` // 是否自动同步服务状态
|
||||
}
|
||||
|
||||
func DefaultClusterDNSConfig() *ClusterDNSConfig {
|
||||
return &ClusterDNSConfig{
|
||||
CNAMEAsDomain: true,
|
||||
IncludingLnNodes: true,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
type NSAccessLogRef struct {
|
||||
IsPrior bool `yaml:"isPrior" json:"isPrior"` // 是否覆盖
|
||||
IsOn bool `yaml:"isOn" json:"isOn"` // 是否启用
|
||||
LogMissingDomains bool `yaml:"logMissingDomains" json:"logMissingDomains"` // 是否记录找不到的域名
|
||||
}
|
||||
|
||||
func (this *NSAccessLogRef) Init() error {
|
||||
return nil
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
type KeyAlgorithmType = string
|
||||
|
||||
const (
|
||||
KeyAlgorithmTypeHmacSHA1 KeyAlgorithmType = "hmac-sha1."
|
||||
KeyAlgorithmTypeHmacSHA224 KeyAlgorithmType = "hmac-sha224."
|
||||
KeyAlgorithmTypeHmacSHA256 KeyAlgorithmType = "hmac-sha256."
|
||||
KeyAlgorithmTypeHmacSHA384 KeyAlgorithmType = "hmac-sha384."
|
||||
KeyAlgorithmTypeHmacSHA512 KeyAlgorithmType = "hmac-sha512."
|
||||
)
|
||||
|
||||
type KeyAlgorithmDefinition struct {
|
||||
Name string `json:"name"`
|
||||
Code string `json:"code"`
|
||||
}
|
||||
|
||||
func FindAllKeyAlgorithmTypes() []*KeyAlgorithmDefinition {
|
||||
return []*KeyAlgorithmDefinition{
|
||||
{
|
||||
Name: "HmacSHA1",
|
||||
Code: KeyAlgorithmTypeHmacSHA1,
|
||||
},
|
||||
{
|
||||
Name: "HmacSHA224",
|
||||
Code: KeyAlgorithmTypeHmacSHA224,
|
||||
},
|
||||
{
|
||||
Name: "HmacSHA256",
|
||||
Code: KeyAlgorithmTypeHmacSHA256,
|
||||
},
|
||||
{
|
||||
Name: "HmacSHA384",
|
||||
Code: KeyAlgorithmTypeHmacSHA384,
|
||||
},
|
||||
{
|
||||
Name: "HmacSHA512",
|
||||
Code: KeyAlgorithmTypeHmacSHA512,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func FindKeyAlgorithmTypeName(algoType KeyAlgorithmType) string {
|
||||
for _, def := range FindAllKeyAlgorithmTypes() {
|
||||
if def.Code == algoType {
|
||||
return def.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type NSKeySecretType = string
|
||||
|
||||
const (
|
||||
NSKeySecretTypeClear NSKeySecretType = "clear"
|
||||
NSKeySecretTypeBase64 NSKeySecretType = "base64"
|
||||
)
|
||||
|
||||
func FindKeySecretTypeName(secretType NSKeySecretType) string {
|
||||
switch secretType {
|
||||
case NSKeySecretTypeClear:
|
||||
return "明文"
|
||||
case NSKeySecretTypeBase64:
|
||||
return "BASE64"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
import "fmt"
|
||||
|
||||
type NSNodeConfig struct {
|
||||
Id int64 `yaml:"id" json:"id"`
|
||||
NodeId string `yaml:"nodeId" json:"nodeId"`
|
||||
Secret string `yaml:"secret" json:"secret"`
|
||||
ClusterId int64 `yaml:"clusterId" json:"clusterId"`
|
||||
AccessLogRef *NSAccessLogRef `yaml:"accessLogRef" json:"accessLogRef"`
|
||||
RecursionConfig *RecursionConfig `yaml:"recursionConfig" json:"recursionConfig"`
|
||||
|
||||
paddedId string
|
||||
}
|
||||
|
||||
func (this *NSNodeConfig) Init() error {
|
||||
this.paddedId = fmt.Sprintf("%08d", this.Id)
|
||||
|
||||
// accessLog
|
||||
if this.AccessLogRef != nil {
|
||||
err := this.AccessLogRef.Init()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *NSNodeConfig) PaddedId() string {
|
||||
return this.paddedId
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
type NSSetting struct {
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
type RecordTTL struct {
|
||||
Name string `json:"name"`
|
||||
Value int `json:"value"`
|
||||
}
|
||||
|
||||
func FindAllRecordTTL() []*RecordTTL {
|
||||
return []*RecordTTL{
|
||||
{
|
||||
Name: "5秒",
|
||||
Value: 5,
|
||||
},
|
||||
{
|
||||
Name: "10秒",
|
||||
Value: 10,
|
||||
},
|
||||
{
|
||||
Name: "30秒",
|
||||
Value: 30,
|
||||
},
|
||||
{
|
||||
Name: "1分钟",
|
||||
Value: 60,
|
||||
},
|
||||
{
|
||||
Name: "3分钟",
|
||||
Value: 3 * 60,
|
||||
},
|
||||
{
|
||||
Name: "5分钟",
|
||||
Value: 5 * 60,
|
||||
},
|
||||
{
|
||||
Name: "10分钟",
|
||||
Value: 10 * 60,
|
||||
},
|
||||
{
|
||||
Name: "30分钟",
|
||||
Value: 30 * 60,
|
||||
},
|
||||
{
|
||||
Name: "1小时",
|
||||
Value: 3600,
|
||||
},
|
||||
{
|
||||
Name: "12小时",
|
||||
Value: 12 * 3600,
|
||||
},
|
||||
{
|
||||
Name: "1天",
|
||||
Value: 86400,
|
||||
},
|
||||
{
|
||||
Name: "30天",
|
||||
Value: 30 * 86400,
|
||||
},
|
||||
{
|
||||
Name: "一年",
|
||||
Value: 365 * 86400,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -13,11 +13,13 @@ const (
|
||||
RecordTypeSRV RecordType = "SRV"
|
||||
RecordTypeTXT RecordType = "TXT"
|
||||
RecordTypeCAA RecordType = "CAA"
|
||||
RecordTypeSOA RecordType = "SOA"
|
||||
)
|
||||
|
||||
type RecordTypeDefinition struct {
|
||||
Type RecordType `json:"type"`
|
||||
Description string `json:"description"`
|
||||
CanDefine bool `json:"canDefine"` // 用户是否可以自定义
|
||||
}
|
||||
|
||||
func FindAllRecordTypeDefinitions() []*RecordTypeDefinition {
|
||||
@@ -25,34 +27,57 @@ func FindAllRecordTypeDefinitions() []*RecordTypeDefinition {
|
||||
{
|
||||
Type: RecordTypeA,
|
||||
Description: "将域名指向一个IPV4地址",
|
||||
CanDefine: true,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeCNAME,
|
||||
Description: "将域名指向另外一个域名",
|
||||
CanDefine: true,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeAAAA,
|
||||
Description: "将域名指向一个IPV6地址",
|
||||
CanDefine: true,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeNS,
|
||||
Description: "将子域名指定其他DNS服务器解析",
|
||||
CanDefine: false,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeSOA,
|
||||
Description: "起始授权机构记录",
|
||||
CanDefine: false,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeMX,
|
||||
Description: "将域名指向邮件服务器地址",
|
||||
CanDefine: true,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeSRV,
|
||||
Description: "记录提供特定的服务的服务器",
|
||||
CanDefine: true,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeTXT,
|
||||
Description: "文本长度限制512,通常做SPF记录或者校验域名所有者",
|
||||
CanDefine: true,
|
||||
},
|
||||
{
|
||||
Type: RecordTypeCAA,
|
||||
Description: "CA证书颁发机构授权校验",
|
||||
CanDefine: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func FindAllUserRecordTypeDefinitions() []*RecordTypeDefinition {
|
||||
var result = []*RecordTypeDefinition{}
|
||||
for _, r := range FindAllRecordTypeDefinitions() {
|
||||
if r.CanDefine {
|
||||
result = append(result, r)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
type DNSHost struct {
|
||||
Host string `json:"host"`
|
||||
Port int `json:"port"`
|
||||
Protocol string `json:"protocol"`
|
||||
}
|
||||
|
||||
// RecursionConfig 递归DNS设置
|
||||
type RecursionConfig struct {
|
||||
IsOn bool `json:"isOn"`
|
||||
Hosts []*DNSHost `json:"hosts"`
|
||||
UseLocalHosts bool `json:"useLocalHosts"` // 自动从本机读取DNS
|
||||
AllowDomains []string `json:"allowDomains"`
|
||||
DenyDomains []string `json:"denyDomains"`
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
import "github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
||||
|
||||
type RouteRangeType = string
|
||||
|
||||
const (
|
||||
RouteRangeTypeIP RouteRangeType = "ipRange"
|
||||
)
|
||||
|
||||
type RouteRangeInterface interface {
|
||||
Init() error
|
||||
Contains(ip uint64) bool
|
||||
}
|
||||
|
||||
// RouteRangeIPRange IP范围配置
|
||||
type RouteRangeIPRange struct {
|
||||
IPFrom string `json:"ipFrom"`
|
||||
IPTo string `json:"ipTo"`
|
||||
|
||||
ipFromLong uint64
|
||||
ipToLong uint64
|
||||
}
|
||||
|
||||
func (this *RouteRangeIPRange) Init() error {
|
||||
this.ipFromLong = configutils.IP2Long(this.IPFrom)
|
||||
this.ipToLong = configutils.IP2Long(this.IPTo)
|
||||
|
||||
if this.ipFromLong > this.ipToLong {
|
||||
this.ipFromLong, this.ipToLong = this.ipToLong, this.ipFromLong
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *RouteRangeIPRange) Contains(ip uint64) bool {
|
||||
return this.ipFromLong <= ip && this.ipToLong >= ip
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,86 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestRoutes(t *testing.T) {
|
||||
// 检查代号是否有空,或者代号是否重复
|
||||
|
||||
var codeMap = map[string]bool{} // code => true
|
||||
|
||||
for _, routes := range [][]*Route{
|
||||
AllDefaultChinaProvinceRoutes,
|
||||
AllDefaultISPRoutes,
|
||||
AllDefaultWorldRegionRoutes,
|
||||
} {
|
||||
for _, route := range routes {
|
||||
if len(route.Name) == 0 {
|
||||
t.Fatal("route name should not empty:", route)
|
||||
}
|
||||
if len(route.AliasNames) == 0 {
|
||||
t.Fatal("route alias names should not empty:", route)
|
||||
}
|
||||
if len(route.Code) == 0 || route.Code == "world:" {
|
||||
t.Fatal("route code should not empty:", route)
|
||||
}
|
||||
|
||||
_, ok := codeMap[route.Code]
|
||||
if ok {
|
||||
t.Fatal("code duplicated:", route)
|
||||
}
|
||||
|
||||
codeMap[route.Code] = true
|
||||
|
||||
if strings.HasPrefix(route.Code, "world:sp:") || (strings.HasPrefix(route.Code, "world:") && route.Code != "world:UAR" && len(route.Code) != 8) {
|
||||
t.Log("no shorten code:", route)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindDefaultRoute(t *testing.T) {
|
||||
t.Log(FindDefaultRoute("isp:china_unicom"))
|
||||
t.Log(FindDefaultRoute("china:province:beijing"))
|
||||
t.Log(FindDefaultRoute("world:CN"))
|
||||
t.Log(FindDefaultRoute("world:US"))
|
||||
}
|
||||
|
||||
func TestRoutes_Markdown(t *testing.T) {
|
||||
var markdown = ""
|
||||
|
||||
for index, routes := range [][]*Route{
|
||||
AllDefaultRoutes,
|
||||
AllDefaultChinaProvinceRoutes,
|
||||
AllDefaultISPRoutes,
|
||||
AllDefaultWorldRegionRoutes,
|
||||
} {
|
||||
switch index {
|
||||
case 0:
|
||||
markdown += "## 默认线路\n"
|
||||
case 1:
|
||||
markdown += "## 中国地区\n"
|
||||
case 2:
|
||||
markdown += "## 运营商\n"
|
||||
case 3:
|
||||
markdown += "## 全球地区\n"
|
||||
}
|
||||
|
||||
markdown += "| 名称 | 代号 |\n"
|
||||
markdown += "|-----------|-----------|\n"
|
||||
for _, route := range routes {
|
||||
markdown += "| " + route.Name + " | " + route.Code + " |\n"
|
||||
}
|
||||
markdown += "\n"
|
||||
}
|
||||
t.Log(markdown)
|
||||
}
|
||||
|
||||
func BenchmarkFindDefaultRoute(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = FindDefaultRoute("world:CN")
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package dnsconfigs
|
||||
|
||||
// TSIGConfig 配置
|
||||
type TSIGConfig struct {
|
||||
IsOn bool `yaml:"isOn" json:"isOn"`
|
||||
}
|
||||
@@ -29,7 +29,7 @@ func (this *errorObj) Error() string {
|
||||
return s
|
||||
}
|
||||
|
||||
// 新错误
|
||||
// New 新错误
|
||||
func New(errText string) error {
|
||||
ptr, file, line, ok := runtime.Caller(1)
|
||||
funcName := ""
|
||||
@@ -45,7 +45,7 @@ func New(errText string) error {
|
||||
}
|
||||
}
|
||||
|
||||
// 包装已有错误
|
||||
// Wrap 包装已有错误
|
||||
func Wrap(err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
|
||||
1
pkg/iplibrary/.gitignore
vendored
Normal file
1
pkg/iplibrary/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
ip.db
|
||||
86
pkg/iplibrary/default_ip_library.go
Normal file
86
pkg/iplibrary/default_ip_library.go
Normal file
@@ -0,0 +1,86 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
_ "embed"
|
||||
"net"
|
||||
)
|
||||
|
||||
//go:embed internal-ip-library.db
|
||||
var ipLibraryData []byte
|
||||
|
||||
var defaultLibrary = NewIPLibrary()
|
||||
|
||||
func DefaultIPLibraryData() []byte {
|
||||
return ipLibraryData
|
||||
}
|
||||
|
||||
func InitDefault() error {
|
||||
defaultLibrary.reader = nil
|
||||
return defaultLibrary.InitFromData(ipLibraryData)
|
||||
}
|
||||
|
||||
func Lookup(ip net.IP) *QueryResult {
|
||||
return defaultLibrary.Lookup(ip)
|
||||
}
|
||||
|
||||
func LookupIP(ip string) *QueryResult {
|
||||
return defaultLibrary.LookupIP(ip)
|
||||
}
|
||||
|
||||
type IPLibrary struct {
|
||||
reader *Reader
|
||||
}
|
||||
|
||||
func NewIPLibrary() *IPLibrary {
|
||||
return &IPLibrary{}
|
||||
}
|
||||
|
||||
func NewIPLibraryWithReader(reader *Reader) *IPLibrary {
|
||||
return &IPLibrary{reader: reader}
|
||||
}
|
||||
|
||||
func (this *IPLibrary) InitFromData(data []byte) error {
|
||||
if len(data) == 0 || this.reader != nil {
|
||||
return nil
|
||||
}
|
||||
var reader = bytes.NewReader(data)
|
||||
gzipReader, err := gzip.NewReader(reader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = gzipReader.Close()
|
||||
}()
|
||||
|
||||
libReader, err := NewReader(gzipReader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
this.reader = libReader
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *IPLibrary) Lookup(ip net.IP) *QueryResult {
|
||||
if this.reader == nil {
|
||||
return &QueryResult{}
|
||||
}
|
||||
|
||||
var result = this.reader.Lookup(ip)
|
||||
if result == nil {
|
||||
result = &QueryResult{}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func (this *IPLibrary) LookupIP(ip string) *QueryResult {
|
||||
if this.reader == nil {
|
||||
return &QueryResult{}
|
||||
}
|
||||
return this.Lookup(net.ParseIP(ip))
|
||||
}
|
||||
91
pkg/iplibrary/default_ip_library_test.go
Normal file
91
pkg/iplibrary/default_ip_library_test.go
Normal file
@@ -0,0 +1,91 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"net"
|
||||
"runtime"
|
||||
"runtime/debug"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestIPLibrary_Init(t *testing.T) {
|
||||
var lib = iplibrary.NewIPLibrary()
|
||||
|
||||
err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestIPLibrary_Lookup(t *testing.T) {
|
||||
var stat1 = &runtime.MemStats{}
|
||||
runtime.ReadMemStats(stat1)
|
||||
|
||||
var lib = iplibrary.NewIPLibrary()
|
||||
|
||||
var before = time.Now()
|
||||
|
||||
err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var costMs = time.Since(before).Seconds() * 1000
|
||||
runtime.GC()
|
||||
debug.FreeOSMemory()
|
||||
|
||||
var stat2 = &runtime.MemStats{}
|
||||
runtime.ReadMemStats(stat2)
|
||||
|
||||
t.Log((stat2.Alloc-stat1.Alloc)/1024/1024, "M", fmt.Sprintf("%.2f", costMs), "ms")
|
||||
|
||||
for _, ip := range []string{
|
||||
"127.0.0.1",
|
||||
"8.8.8.8",
|
||||
"4.4.4.4",
|
||||
"202.96.0.20",
|
||||
"66.249.66.69",
|
||||
"2222", // wrong ip
|
||||
"2406:8c00:0:3401:133:18:168:70", // ipv6
|
||||
} {
|
||||
var result = lib.Lookup(net.ParseIP(ip))
|
||||
t.Log(ip, "=>", result.IsOk(), "[", result.CountryName(), result.CountryId(), "][", result.ProvinceName(), result.ProvinceId(), "][", result.TownName(), result.TownId(), "][", result.ProviderName(), result.ProviderId(), "]")
|
||||
}
|
||||
}
|
||||
|
||||
func TestIPLibrary_LookupIP(t *testing.T) {
|
||||
var lib = iplibrary.NewIPLibrary()
|
||||
err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, ip := range []string{
|
||||
"66.249.66.69",
|
||||
} {
|
||||
var result = lib.LookupIP(ip)
|
||||
if result.IsOk() {
|
||||
t.Log(ip, "=>", result.IsOk(), "[", result.CountryName(), result.CountryId(), "][", result.ProvinceName(), result.ProvinceId(), "][", result.TownName(), result.TownId(), "][", result.ProviderName(), result.ProviderId(), "]")
|
||||
} else {
|
||||
t.Log(ip, "=>", result.IsOk())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkIPLibrary_Lookup(b *testing.B) {
|
||||
var lib = iplibrary.NewIPLibrary()
|
||||
err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = lib.LookupIP("66.249.66.69")
|
||||
}
|
||||
}
|
||||
BIN
pkg/iplibrary/internal-ip-library.db
Normal file
BIN
pkg/iplibrary/internal-ip-library.db
Normal file
Binary file not shown.
51
pkg/iplibrary/ip_item.go
Normal file
51
pkg/iplibrary/ip_item.go
Normal file
@@ -0,0 +1,51 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
)
|
||||
|
||||
type ipItem struct {
|
||||
IPFrom uint64
|
||||
IPTo uint64
|
||||
|
||||
Region *ipRegion
|
||||
}
|
||||
|
||||
type ipRegion struct {
|
||||
CountryId uint32
|
||||
ProvinceId uint32
|
||||
CityId uint32
|
||||
TownId uint32
|
||||
ProviderId uint32
|
||||
}
|
||||
|
||||
func (this *ipItem) AsBinary() ([]byte, error) {
|
||||
var buf = &bytes.Buffer{}
|
||||
err := binary.Write(buf, binary.BigEndian, this)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
func HashRegion(countryId uint32, provinceId uint32, cityId uint32, townId uint32, providerId uint32) string {
|
||||
var providerHash = ""
|
||||
if providerId > 0 {
|
||||
providerHash = "_" + types.String(providerId)
|
||||
}
|
||||
|
||||
if townId > 0 {
|
||||
return "t" + types.String(townId) + providerHash
|
||||
}
|
||||
if cityId > 0 {
|
||||
return "c" + types.String(cityId) + providerHash
|
||||
}
|
||||
if provinceId > 0 {
|
||||
return "p" + types.String(provinceId) + providerHash
|
||||
}
|
||||
return "a" + types.String(countryId) + providerHash
|
||||
}
|
||||
95
pkg/iplibrary/meta.go
Normal file
95
pkg/iplibrary/meta.go
Normal file
@@ -0,0 +1,95 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
type Country struct {
|
||||
Id uint32 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Codes []string `json:"codes"`
|
||||
}
|
||||
|
||||
type Province struct {
|
||||
Id uint32 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Codes []string `json:"codes"`
|
||||
}
|
||||
|
||||
type City struct {
|
||||
Id uint32 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Codes []string `json:"codes"`
|
||||
}
|
||||
|
||||
type Town struct {
|
||||
Id uint32 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Codes []string `json:"codes"`
|
||||
}
|
||||
|
||||
type Provider struct {
|
||||
Id uint32 `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Codes []string `json:"codes"`
|
||||
}
|
||||
|
||||
type Meta struct {
|
||||
Version int `json:"version"` // IP库版本
|
||||
Code string `json:"code"` // 代号,用来区分不同的IP库
|
||||
Author string `json:"author"`
|
||||
Countries []*Country `json:"countries"`
|
||||
Provinces []*Province `json:"provinces"`
|
||||
Cities []*City `json:"cities"`
|
||||
Towns []*Town `json:"towns"`
|
||||
Providers []*Provider `json:"providers"`
|
||||
CreatedAt int64 `json:"createdAt"`
|
||||
|
||||
countryMap map[uint32]*Country // id => *Country
|
||||
provinceMap map[uint32]*Province // id => *Province
|
||||
cityMap map[uint32]*City // id => *City
|
||||
townMap map[uint32]*Town // id => *Town
|
||||
providerMap map[uint32]*Provider // id => *Provider
|
||||
}
|
||||
|
||||
func (this *Meta) Init() {
|
||||
this.countryMap = map[uint32]*Country{}
|
||||
this.provinceMap = map[uint32]*Province{}
|
||||
this.cityMap = map[uint32]*City{}
|
||||
this.townMap = map[uint32]*Town{}
|
||||
this.providerMap = map[uint32]*Provider{}
|
||||
|
||||
for _, country := range this.Countries {
|
||||
this.countryMap[country.Id] = country
|
||||
}
|
||||
for _, province := range this.Provinces {
|
||||
this.provinceMap[province.Id] = province
|
||||
}
|
||||
for _, city := range this.Cities {
|
||||
this.cityMap[city.Id] = city
|
||||
}
|
||||
for _, town := range this.Towns {
|
||||
this.townMap[town.Id] = town
|
||||
}
|
||||
for _, provider := range this.Providers {
|
||||
this.providerMap[provider.Id] = provider
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Meta) CountryWithId(countryId uint32) *Country {
|
||||
return this.countryMap[countryId]
|
||||
}
|
||||
|
||||
func (this *Meta) ProvinceWithId(provinceId uint32) *Province {
|
||||
return this.provinceMap[provinceId]
|
||||
}
|
||||
|
||||
func (this *Meta) CityWithId(cityId uint32) *City {
|
||||
return this.cityMap[cityId]
|
||||
}
|
||||
|
||||
func (this *Meta) TownWithId(townId uint32) *Town {
|
||||
return this.townMap[townId]
|
||||
}
|
||||
|
||||
func (this *Meta) ProviderWithId(providerId uint32) *Provider {
|
||||
return this.providerMap[providerId]
|
||||
}
|
||||
3
pkg/iplibrary/meta_test.go
Normal file
3
pkg/iplibrary/meta_test.go
Normal file
@@ -0,0 +1,3 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
64
pkg/iplibrary/parser.go
Normal file
64
pkg/iplibrary/parser.go
Normal file
@@ -0,0 +1,64 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
)
|
||||
|
||||
type Parser struct {
|
||||
config *ParserConfig
|
||||
|
||||
data []byte
|
||||
}
|
||||
|
||||
func NewParser(config *ParserConfig) (*Parser, error) {
|
||||
if config == nil {
|
||||
config = &ParserConfig{}
|
||||
}
|
||||
|
||||
if config.Template == nil {
|
||||
return nil, errors.New("template must not be nil")
|
||||
}
|
||||
|
||||
return &Parser{
|
||||
config: config,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (this *Parser) Write(data []byte) {
|
||||
this.data = append(this.data, data...)
|
||||
}
|
||||
|
||||
func (this *Parser) Parse() error {
|
||||
if len(this.data) == 0 {
|
||||
return nil
|
||||
}
|
||||
for {
|
||||
var index = bytes.IndexByte(this.data, '\n')
|
||||
if index >= 0 {
|
||||
var line = this.data[:index+1]
|
||||
values, found := this.config.Template.Extract(string(line), this.config.EmptyValues)
|
||||
if found {
|
||||
if this.config.Iterator != nil {
|
||||
err := this.config.Iterator(values)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 防止错误信息太长
|
||||
if len(line) > 256 {
|
||||
line = line[:256]
|
||||
}
|
||||
return errors.New("invalid line '" + string(line) + "'")
|
||||
}
|
||||
|
||||
this.data = this.data[index+1:]
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
9
pkg/iplibrary/parser_config.go
Normal file
9
pkg/iplibrary/parser_config.go
Normal file
@@ -0,0 +1,9 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
type ParserConfig struct {
|
||||
Template *Template
|
||||
EmptyValues []string
|
||||
Iterator func(values map[string]string) error
|
||||
}
|
||||
54
pkg/iplibrary/parser_reader.go
Normal file
54
pkg/iplibrary/parser_reader.go
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
)
|
||||
|
||||
type ReaderParser struct {
|
||||
reader io.Reader
|
||||
rawParser *Parser
|
||||
}
|
||||
|
||||
func NewReaderParser(reader io.Reader, config *ParserConfig) (*ReaderParser, error) {
|
||||
if config == nil {
|
||||
config = &ParserConfig{}
|
||||
}
|
||||
|
||||
if config.Template == nil {
|
||||
return nil, errors.New("template must not be nil")
|
||||
}
|
||||
|
||||
parser, err := NewParser(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ReaderParser{
|
||||
reader: reader,
|
||||
rawParser: parser,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (this *ReaderParser) Parse() error {
|
||||
var buf = make([]byte, 1024)
|
||||
for {
|
||||
n, err := this.reader.Read(buf)
|
||||
if n > 0 {
|
||||
this.rawParser.Write(buf[:n])
|
||||
parseErr := this.rawParser.Parse()
|
||||
if parseErr != nil {
|
||||
return parseErr
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
return err
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
62
pkg/iplibrary/parser_reader_test.go
Normal file
62
pkg/iplibrary/parser_reader_test.go
Normal file
@@ -0,0 +1,62 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNewReaderParser(t *testing.T) {
|
||||
template, err := iplibrary.NewTemplate("${ipFrom}|${ipTo}|${country}|${any}|${province}|${city}|${provider}")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var buf = &bytes.Buffer{}
|
||||
buf.WriteString(`8.45.160.0|8.45.161.255|美国|0|华盛顿|西雅图|Level3
|
||||
8.45.162.0|8.45.162.255|美国|0|马萨诸塞|0|Level3
|
||||
8.45.163.0|8.45.164.255|美国|0|俄勒冈|0|Level3
|
||||
8.45.165.0|8.45.165.255|美国|0|华盛顿|0|Level3
|
||||
8.45.166.0|8.45.167.255|美国|0|华盛顿|西雅图|Level3
|
||||
8.45.168.0|8.127.255.255|美国|0|0|0|Level3
|
||||
8.128.0.0|8.128.3.255|中国|0|上海|上海市|阿里巴巴
|
||||
8.128.4.0|8.128.255.255|中国|0|0|0|阿里巴巴
|
||||
8.129.0.0|8.129.255.255|中国|0|广东省|深圳市|阿里云
|
||||
8.130.0.0|8.130.55.255|中国|0|北京|北京市|阿里云
|
||||
8.130.56.0|8.131.255.255|中国|0|北京|北京市|阿里巴巴
|
||||
8.132.0.0|8.133.255.255|中国|0|上海|上海市|阿里巴巴
|
||||
8.134.0.0|8.134.20.63|中国|0|0|0|阿里云
|
||||
8.134.20.64|8.134.79.255|中国|0|广东省|深圳市|阿里云
|
||||
8.134.80.0|8.191.255.255|中国|0|0|0|阿里巴巴
|
||||
8.192.0.0|8.192.0.255|美国|0|0|0|Level3
|
||||
8.192.1.0|8.192.1.255|美国|0|马萨诸塞|波士顿|Level3
|
||||
8.192.2.0|8.207.255.255|美国|0|0|0|Level3
|
||||
8.208.0.0|8.208.127.255|英国|0|伦敦|伦敦|阿里云
|
||||
8.208.128.0|8.208.255.255|英国|0|伦敦|伦敦|阿里巴巴
|
||||
8.209.0.0|8.209.15.255|俄罗斯|0|莫斯科|莫斯科|阿里云
|
||||
8.209.16.0|8.209.31.255|俄罗斯|0|莫斯科|莫斯科|阿里巴巴
|
||||
8.209.32.0|8.209.32.15|中国|0|台湾省|台北|阿里云
|
||||
8.209.32.16|8.209.32.255|中国|0|台湾省|台北|阿里巴巴
|
||||
8.209.33.0|8.209.34.255|中国|0|台湾省|台北|阿里云
|
||||
8.209.35.0|8.209.35.255|中国|0|台湾省|台北|阿里巴巴`)
|
||||
|
||||
var count int
|
||||
parser, err := iplibrary.NewReaderParser(buf, &iplibrary.ParserConfig{
|
||||
Template: template,
|
||||
EmptyValues: []string{"0"},
|
||||
Iterator: func(values map[string]string) error {
|
||||
count++
|
||||
t.Log(count, values)
|
||||
return nil
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = parser.Parse()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
44
pkg/iplibrary/parser_test.go
Normal file
44
pkg/iplibrary/parser_test.go
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNewParser(t *testing.T) {
|
||||
template, err := iplibrary.NewTemplate("${ipFrom}|${ipTo}|${country}|${any}|${province}|${city}|${provider}")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
parser, err := iplibrary.NewParser(&iplibrary.ParserConfig{
|
||||
Template: template,
|
||||
EmptyValues: []string{"0"},
|
||||
Iterator: func(values map[string]string) error {
|
||||
t.Log(values)
|
||||
return nil
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
parser.Write([]byte(`0.0.0.0|0.255.255.255|0|0|0|内网IP|内网IP
|
||||
1.0.0.0|1.0.0.255|澳大利亚|0|0|0|0
|
||||
1.0.1.0|1.0.3.255|中国|0|福建省|福州市|电信
|
||||
1.0.4.0|1.0.7.255|澳大利亚|0|维多利亚|墨尔本|0
|
||||
1.0.8.0|1.0.15.255|中国|0|广东省|广州市|电信
|
||||
1.0.16.0|1.0.31.255|日本|0|0|0|0
|
||||
1.0.32.0|1.0.63.255|中国|0|广东省|广州市|电信
|
||||
1.0.64.0|1.0.79.255|日本|0|广岛县|0|0
|
||||
1.0.80.0|1.0.127.255|日本|0|冈山县|0|0
|
||||
1.0.128.0|1.0.128.255|泰国|0|清莱府|0|TOT
|
||||
1.0.129.0|1.0.132.191|泰国|0|曼谷|曼谷|TOT`))
|
||||
|
||||
err = parser.Parse()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
233
pkg/iplibrary/reader.go
Normal file
233
pkg/iplibrary/reader.go
Normal file
@@ -0,0 +1,233 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"io"
|
||||
"net"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Reader struct {
|
||||
meta *Meta
|
||||
|
||||
regionMap map[string]*ipRegion
|
||||
|
||||
ipV4Items []*ipItem
|
||||
ipV6Items []*ipItem
|
||||
}
|
||||
|
||||
func NewReader(reader io.Reader) (*Reader, error) {
|
||||
var libReader = &Reader{
|
||||
regionMap: map[string]*ipRegion{},
|
||||
}
|
||||
err := libReader.load(reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return libReader, nil
|
||||
}
|
||||
|
||||
func (this *Reader) load(reader io.Reader) error {
|
||||
var buf = make([]byte, 1024)
|
||||
var metaLine = []byte{}
|
||||
var metaLineFound = false
|
||||
var dataBuf = []byte{}
|
||||
for {
|
||||
n, err := reader.Read(buf)
|
||||
if n > 0 {
|
||||
var data = buf[:n]
|
||||
dataBuf = append(dataBuf, data...)
|
||||
if metaLineFound {
|
||||
left, err := this.parse(dataBuf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dataBuf = left
|
||||
} else {
|
||||
var index = bytes.IndexByte(dataBuf, '\n')
|
||||
if index > 0 {
|
||||
metaLine = dataBuf[:index]
|
||||
dataBuf = dataBuf[index+1:]
|
||||
metaLineFound = true
|
||||
var meta = &Meta{}
|
||||
err = json.Unmarshal(metaLine, &meta)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
meta.Init()
|
||||
this.meta = meta
|
||||
|
||||
left, err := this.parse(dataBuf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dataBuf = left
|
||||
}
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
return err
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
sort.Slice(this.ipV4Items, func(i, j int) bool {
|
||||
var from0 = this.ipV4Items[i].IPFrom
|
||||
var to0 = this.ipV4Items[i].IPTo
|
||||
var from1 = this.ipV4Items[j].IPFrom
|
||||
var to1 = this.ipV4Items[j].IPTo
|
||||
if from0 == from1 {
|
||||
return to0 < to1
|
||||
}
|
||||
return from0 < from1
|
||||
})
|
||||
|
||||
sort.Slice(this.ipV6Items, func(i, j int) bool {
|
||||
var from0 = this.ipV6Items[i].IPFrom
|
||||
var to0 = this.ipV6Items[i].IPTo
|
||||
var from1 = this.ipV6Items[j].IPFrom
|
||||
var to1 = this.ipV6Items[j].IPTo
|
||||
if from0 == from1 {
|
||||
return to0 < to1
|
||||
}
|
||||
return from0 < from1
|
||||
})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Reader) Lookup(ip net.IP) *QueryResult {
|
||||
if ip == nil {
|
||||
return &QueryResult{}
|
||||
}
|
||||
|
||||
var ipLong = configutils.IP2Long(ip)
|
||||
var isV4 = configutils.IsIPv4(ip)
|
||||
var resultItem *ipItem
|
||||
if isV4 {
|
||||
sort.Search(len(this.ipV4Items), func(i int) bool {
|
||||
var item = this.ipV4Items[i]
|
||||
if item.IPFrom <= ipLong {
|
||||
if item.IPTo >= ipLong {
|
||||
resultItem = item
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
} else {
|
||||
sort.Search(len(this.ipV6Items), func(i int) bool {
|
||||
var item = this.ipV6Items[i]
|
||||
if item.IPFrom <= ipLong {
|
||||
if item.IPTo >= ipLong {
|
||||
resultItem = item
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
return &QueryResult{
|
||||
item: resultItem,
|
||||
meta: this.meta,
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Reader) Meta() *Meta {
|
||||
return this.meta
|
||||
}
|
||||
|
||||
func (this *Reader) IPv4Items() []*ipItem {
|
||||
return this.ipV4Items
|
||||
}
|
||||
|
||||
func (this *Reader) IPv6Items() []*ipItem {
|
||||
return this.ipV6Items
|
||||
}
|
||||
|
||||
func (this *Reader) parse(data []byte) (left []byte, err error) {
|
||||
if len(data) == 0 {
|
||||
return
|
||||
}
|
||||
for {
|
||||
var index = bytes.IndexByte(data, '\n')
|
||||
if index >= 0 {
|
||||
var line = data[:index]
|
||||
var pieces = strings.Split(string(line), "|")
|
||||
if len(pieces) != 8 {
|
||||
return nil, errors.New("invalid ip definition '" + string(line) + "'")
|
||||
}
|
||||
|
||||
var version = pieces[0]
|
||||
if len(version) == 0 {
|
||||
version = "4"
|
||||
}
|
||||
|
||||
if version != "4" && version != "6" {
|
||||
return nil, errors.New("invalid ip version '" + string(line) + "'")
|
||||
}
|
||||
|
||||
var ipFrom uint64
|
||||
var ipTo uint64
|
||||
if len(pieces[2]) == 0 {
|
||||
pieces[2] = pieces[1]
|
||||
ipFrom = types.Uint64(pieces[1])
|
||||
ipTo = types.Uint64(pieces[2])
|
||||
} else {
|
||||
ipFrom = types.Uint64(pieces[1])
|
||||
ipTo = types.Uint64(pieces[2]) + ipFrom
|
||||
}
|
||||
|
||||
var countryId = types.Uint32(pieces[3])
|
||||
var provinceId = types.Uint32(pieces[4])
|
||||
var cityId = types.Uint32(pieces[5])
|
||||
var townId = types.Uint32(pieces[6])
|
||||
var providerId = types.Uint32(pieces[7])
|
||||
var hash = HashRegion(countryId, provinceId, cityId, townId, providerId)
|
||||
|
||||
region, ok := this.regionMap[hash]
|
||||
if !ok {
|
||||
region = &ipRegion{
|
||||
CountryId: countryId,
|
||||
ProvinceId: provinceId,
|
||||
CityId: cityId,
|
||||
TownId: townId,
|
||||
ProviderId: providerId,
|
||||
}
|
||||
this.regionMap[hash] = region
|
||||
}
|
||||
|
||||
if version == "4" {
|
||||
this.ipV4Items = append(this.ipV4Items, &ipItem{
|
||||
IPFrom: ipFrom,
|
||||
IPTo: ipTo,
|
||||
Region: region,
|
||||
})
|
||||
} else {
|
||||
this.ipV6Items = append(this.ipV6Items, &ipItem{
|
||||
IPFrom: ipFrom,
|
||||
IPTo: ipTo,
|
||||
Region: region,
|
||||
})
|
||||
}
|
||||
|
||||
data = data[index+1:]
|
||||
} else {
|
||||
left = data
|
||||
break
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
55
pkg/iplibrary/reader_file.go
Normal file
55
pkg/iplibrary/reader_file.go
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"compress/gzip"
|
||||
"errors"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
)
|
||||
|
||||
type FileReader struct {
|
||||
rawReader *Reader
|
||||
}
|
||||
|
||||
func NewFileReader(path string) (*FileReader, error) {
|
||||
fp, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer func() {
|
||||
_ = fp.Close()
|
||||
}()
|
||||
|
||||
return NewFileDataReader(fp)
|
||||
}
|
||||
|
||||
func NewFileDataReader(dataReader io.Reader) (*FileReader, error) {
|
||||
gzReader, err := gzip.NewReader(dataReader)
|
||||
if err != nil {
|
||||
return nil, errors.New("create gzip reader failed: " + err.Error())
|
||||
}
|
||||
|
||||
reader, err := NewReader(gzReader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &FileReader{
|
||||
rawReader: reader,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (this *FileReader) Meta() *Meta {
|
||||
return this.rawReader.meta
|
||||
}
|
||||
|
||||
func (this *FileReader) Lookup(ip net.IP) *QueryResult {
|
||||
return this.rawReader.Lookup(ip)
|
||||
}
|
||||
|
||||
func (this *FileReader) RawReader() *Reader {
|
||||
return this.rawReader
|
||||
}
|
||||
51
pkg/iplibrary/reader_file_test.go
Normal file
51
pkg/iplibrary/reader_file_test.go
Normal file
@@ -0,0 +1,51 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
"net"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNewFileReader(t *testing.T) {
|
||||
reader, err := iplibrary.NewFileReader("./ip")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, ip := range []string{
|
||||
"127.0.0.1",
|
||||
"192.168.0.1",
|
||||
"192.168.0.150",
|
||||
"8.8.8.8",
|
||||
"111.197.165.199",
|
||||
"175.178.206.125",
|
||||
} {
|
||||
var result = reader.Lookup(net.ParseIP(ip))
|
||||
if result.IsOk() {
|
||||
var data = maps.Map{
|
||||
"countryId": result.CountryId(),
|
||||
"countryName": result.CountryName(),
|
||||
"provinceId": result.ProvinceId(),
|
||||
"provinceName": result.ProvinceName(),
|
||||
"cityId": result.CityId(),
|
||||
"cityName": result.CityName(),
|
||||
"townId": result.TownId(),
|
||||
"townName": result.TownName(),
|
||||
"providerId": result.ProviderId(),
|
||||
"providerName": result.ProviderName(),
|
||||
"summary": result.Summary(),
|
||||
}
|
||||
dataJSON, err := json.MarshalIndent(data, "", " ")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(ip, "=>", string(dataJSON))
|
||||
} else {
|
||||
t.Log(ip+":", "not found")
|
||||
}
|
||||
}
|
||||
}
|
||||
191
pkg/iplibrary/reader_result.go
Normal file
191
pkg/iplibrary/reader_result.go
Normal file
@@ -0,0 +1,191 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"github.com/iwind/TeaGo/lists"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type QueryResult struct {
|
||||
item *ipItem
|
||||
meta *Meta
|
||||
}
|
||||
|
||||
func (this *QueryResult) IsOk() bool {
|
||||
return this.item != nil
|
||||
}
|
||||
|
||||
func (this *QueryResult) CountryId() int64 {
|
||||
if this.item != nil {
|
||||
return int64(this.item.Region.CountryId)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *QueryResult) CountryName() string {
|
||||
if this.item == nil {
|
||||
return ""
|
||||
}
|
||||
if this.item.Region.CountryId > 0 {
|
||||
var country = this.meta.CountryWithId(this.item.Region.CountryId)
|
||||
if country != nil {
|
||||
return country.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (this *QueryResult) CountryCodes() []string {
|
||||
if this.item == nil {
|
||||
return nil
|
||||
}
|
||||
if this.item.Region.CountryId > 0 {
|
||||
var country = this.meta.CountryWithId(this.item.Region.CountryId)
|
||||
if country != nil {
|
||||
return country.Codes
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *QueryResult) ProvinceId() int64 {
|
||||
if this.item != nil {
|
||||
return int64(this.item.Region.ProvinceId)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *QueryResult) ProvinceName() string {
|
||||
if this.item == nil {
|
||||
return ""
|
||||
}
|
||||
if this.item.Region.ProvinceId > 0 {
|
||||
var province = this.meta.ProvinceWithId(this.item.Region.ProvinceId)
|
||||
if province != nil {
|
||||
return province.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (this *QueryResult) ProvinceCodes() []string {
|
||||
if this.item == nil {
|
||||
return nil
|
||||
}
|
||||
if this.item.Region.ProvinceId > 0 {
|
||||
var province = this.meta.ProvinceWithId(this.item.Region.ProvinceId)
|
||||
if province != nil {
|
||||
return province.Codes
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *QueryResult) CityId() int64 {
|
||||
if this.item != nil {
|
||||
return int64(this.item.Region.CityId)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *QueryResult) CityName() string {
|
||||
if this.item == nil {
|
||||
return ""
|
||||
}
|
||||
if this.item.Region.CityId > 0 {
|
||||
var city = this.meta.CityWithId(this.item.Region.CityId)
|
||||
if city != nil {
|
||||
return city.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (this *QueryResult) TownId() int64 {
|
||||
if this.item != nil {
|
||||
return int64(this.item.Region.TownId)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *QueryResult) TownName() string {
|
||||
if this.item == nil {
|
||||
return ""
|
||||
}
|
||||
if this.item.Region.TownId > 0 {
|
||||
var town = this.meta.TownWithId(this.item.Region.TownId)
|
||||
if town != nil {
|
||||
return town.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (this *QueryResult) ProviderId() int64 {
|
||||
if this.item != nil {
|
||||
return int64(this.item.Region.ProviderId)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *QueryResult) ProviderName() string {
|
||||
if this.item == nil {
|
||||
return ""
|
||||
}
|
||||
if this.item.Region.ProviderId > 0 {
|
||||
var provider = this.meta.ProviderWithId(this.item.Region.ProviderId)
|
||||
if provider != nil {
|
||||
return provider.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (this *QueryResult) ProviderCodes() []string {
|
||||
if this.item == nil {
|
||||
return nil
|
||||
}
|
||||
if this.item.Region.ProviderId > 0 {
|
||||
var provider = this.meta.ProviderWithId(this.item.Region.ProviderId)
|
||||
if provider != nil {
|
||||
return provider.Codes
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *QueryResult) Summary() string {
|
||||
if this.item == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
var pieces = []string{}
|
||||
var countryName = this.CountryName()
|
||||
var provinceName = this.ProvinceName()
|
||||
var cityName = this.CityName()
|
||||
var townName = this.TownName()
|
||||
var providerName = this.ProviderName()
|
||||
|
||||
if len(countryName) > 0 {
|
||||
pieces = append(pieces, countryName)
|
||||
}
|
||||
if len(provinceName) > 0 && !lists.ContainsString(pieces, provinceName) {
|
||||
pieces = append(pieces, provinceName)
|
||||
}
|
||||
if len(cityName) > 0 && !lists.ContainsString(pieces, cityName) && !lists.ContainsString(pieces, strings.TrimSuffix(cityName, "市")) {
|
||||
pieces = append(pieces, cityName)
|
||||
}
|
||||
if len(townName) > 0 && !lists.ContainsString(pieces, townName) && !lists.ContainsString(pieces, strings.TrimSuffix(townName, "县")) {
|
||||
pieces = append(pieces, cityName)
|
||||
}
|
||||
|
||||
if len(providerName) > 0 && !lists.ContainsString(pieces, providerName) {
|
||||
if len(pieces) > 0 {
|
||||
pieces = append(pieces, "|")
|
||||
}
|
||||
pieces = append(pieces, providerName)
|
||||
}
|
||||
|
||||
return strings.Join(pieces, " ")
|
||||
}
|
||||
149
pkg/iplibrary/reader_test.go
Normal file
149
pkg/iplibrary/reader_test.go
Normal file
@@ -0,0 +1,149 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"github.com/iwind/TeaGo/rands"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
"net"
|
||||
"runtime"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestNewReader(t *testing.T) {
|
||||
var buf = &bytes.Buffer{}
|
||||
var writer = iplibrary.NewWriter(buf, &iplibrary.Meta{
|
||||
Author: "GoEdge <https://goedge.cn>",
|
||||
})
|
||||
|
||||
err := writer.WriteMeta()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.1.100", "192.168.1.100", 1, 200, 300, 400, 500)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.2.100", "192.168.3.100", 2, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.3.101", "192.168.3.101", 3, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.0.101", "192.168.0.200", 4, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("::1", "::5", 5, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
/**var n = func() string {
|
||||
return types.String(rands.Int(0, 255))
|
||||
}
|
||||
|
||||
for i := 0; i < 1_000_000; i++ {
|
||||
err = writer.Write(n()+"."+n()+"."+n()+"."+n(), n()+"."+n()+"."+n()+"."+n(), int64(i)+100, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}**/
|
||||
|
||||
var stat = &runtime.MemStats{}
|
||||
runtime.ReadMemStats(stat)
|
||||
reader, err := iplibrary.NewReader(buf)
|
||||
|
||||
var stat2 = &runtime.MemStats{}
|
||||
runtime.ReadMemStats(stat2)
|
||||
t.Log((stat2.Alloc-stat.Alloc)/1024/1024, "M")
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("version:", reader.Meta().Version, "author:", reader.Meta().Author, "createdTime:", timeutil.FormatTime("Y-m-d H:i:s", reader.Meta().CreatedAt))
|
||||
|
||||
if len(reader.IPv4Items()) < 10 {
|
||||
t.Log("===")
|
||||
for _, item := range reader.IPv4Items() {
|
||||
t.Logf("%+v", item)
|
||||
}
|
||||
t.Log("===")
|
||||
}
|
||||
if len(reader.IPv6Items()) < 10 {
|
||||
t.Log("===")
|
||||
for _, item := range reader.IPv6Items() {
|
||||
t.Logf("%+v", item)
|
||||
}
|
||||
t.Log("===")
|
||||
}
|
||||
|
||||
var before = time.Now()
|
||||
for _, ip := range []string{
|
||||
"192.168.0.1",
|
||||
"192.168.0.150",
|
||||
"192.168.1.100",
|
||||
"192.168.2.100",
|
||||
"192.168.3.50",
|
||||
"192.168.0.150",
|
||||
"192.168.4.80",
|
||||
"::3",
|
||||
"::8",
|
||||
} {
|
||||
var result = reader.Lookup(net.ParseIP(ip))
|
||||
if result.IsOk() {
|
||||
t.Log(ip+":", "countryId:", result.CountryId())
|
||||
} else {
|
||||
t.Log(ip+":", "not found")
|
||||
}
|
||||
}
|
||||
t.Log(time.Since(before).Seconds()*1000, "ms")
|
||||
}
|
||||
|
||||
func BenchmarkNewReader(b *testing.B) {
|
||||
runtime.GOMAXPROCS(1)
|
||||
|
||||
var buf = &bytes.Buffer{}
|
||||
var writer = iplibrary.NewWriter(buf, &iplibrary.Meta{
|
||||
Author: "GoEdge <https://goedge.cn>",
|
||||
})
|
||||
|
||||
err := writer.WriteMeta()
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
var n = func() string {
|
||||
return types.String(rands.Int(0, 255))
|
||||
}
|
||||
|
||||
for i := 0; i < 1_000_000; i++ {
|
||||
err = writer.Write(n()+"."+n()+"."+n()+"."+n(), n()+"."+n()+"."+n()+"."+n(), int64(i)+100, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
reader, err := iplibrary.NewReader(buf)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
var ip = "192.168.1.100"
|
||||
reader.Lookup(net.ParseIP(ip))
|
||||
}
|
||||
}
|
||||
75
pkg/iplibrary/template.go
Normal file
75
pkg/iplibrary/template.go
Normal file
@@ -0,0 +1,75 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"github.com/iwind/TeaGo/lists"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
type Template struct {
|
||||
templateString string
|
||||
reg *regexp.Regexp
|
||||
}
|
||||
|
||||
func NewTemplate(templateString string) (*Template, error) {
|
||||
var t = &Template{
|
||||
templateString: templateString,
|
||||
}
|
||||
err := t.init()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (this *Template) init() error {
|
||||
var template = regexp.QuoteMeta(this.templateString)
|
||||
var keywordReg = regexp.MustCompile(`\\\$\\{(\w+)\\}`)
|
||||
template = keywordReg.ReplaceAllStringFunc(template, func(keyword string) string {
|
||||
var matches = keywordReg.FindStringSubmatch(keyword)
|
||||
if len(matches) > 1 {
|
||||
switch matches[1] {
|
||||
case "ipFrom", "ipTo", "country", "province", "city", "town", "provider":
|
||||
return "(?P<" + matches[1] + ">.*)"
|
||||
}
|
||||
return ".*"
|
||||
}
|
||||
|
||||
return keyword
|
||||
})
|
||||
reg, err := regexp.Compile(template)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
this.reg = reg
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Template) Extract(text string, emptyValues []string) (values map[string]string, ok bool) {
|
||||
var matches = this.reg.FindStringSubmatch(text)
|
||||
if len(matches) == 0 {
|
||||
return
|
||||
}
|
||||
values = map[string]string{}
|
||||
for index, name := range this.reg.SubexpNames() {
|
||||
if len(name) == 0 {
|
||||
continue
|
||||
}
|
||||
var v = matches[index]
|
||||
if name != "ipFrom" && name != "ipTo" && (v == "0" || v == "无" || v == "空" || lists.ContainsString(emptyValues, v)) {
|
||||
v = ""
|
||||
}
|
||||
values[name] = v
|
||||
}
|
||||
|
||||
for _, keyword := range []string{"ipFrom", "ipTo", "country", "province", "city", "town", "provider"} {
|
||||
_, hasKeyword := values[keyword]
|
||||
if !hasKeyword {
|
||||
values[keyword] = ""
|
||||
}
|
||||
}
|
||||
|
||||
ok = true
|
||||
return
|
||||
}
|
||||
25
pkg/iplibrary/template_test.go
Normal file
25
pkg/iplibrary/template_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNewTemplate(t *testing.T) {
|
||||
template, err := iplibrary.NewTemplate("${ipFrom}|${ipTo}|${country}|${any}|${province}|${city}|${provider}")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, s := range []string{
|
||||
"42.0.32.0|42.0.63.255|中国|0|广东省|广州市|电信",
|
||||
"42.0.32.0|42.0.63.255|中国|0|广东省|广州市|电信\n123",
|
||||
"42.0.32.0|42.0.63.255|中国||广东省|广州市|电信",
|
||||
"42.0.32.0|42.0.63.255|中国|0||广州市|电信",
|
||||
"42.0.32.0|42.0.63.255|中国|0|广东省|广州市",
|
||||
} {
|
||||
values, _ := template.Extract(s, []string{})
|
||||
t.Log(s, "=>\n", values)
|
||||
}
|
||||
}
|
||||
268
pkg/iplibrary/updater.go
Normal file
268
pkg/iplibrary/updater.go
Normal file
@@ -0,0 +1,268 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type UpdaterSource interface {
|
||||
// DataDir 文件目录
|
||||
DataDir() string
|
||||
|
||||
// FindLatestFile 检查最新的IP库文件
|
||||
FindLatestFile() (code string, fileId int64, err error)
|
||||
|
||||
// DownloadFile 下载文件
|
||||
DownloadFile(fileId int64, writer io.Writer) error
|
||||
|
||||
// LogInfo 普通日志
|
||||
LogInfo(message string)
|
||||
|
||||
// LogError 错误日志
|
||||
LogError(err error)
|
||||
}
|
||||
|
||||
type Updater struct {
|
||||
source UpdaterSource
|
||||
|
||||
currentCode string
|
||||
ticker *time.Ticker
|
||||
|
||||
isUpdating bool
|
||||
}
|
||||
|
||||
func NewUpdater(source UpdaterSource, interval time.Duration) *Updater {
|
||||
return &Updater{
|
||||
source: source,
|
||||
ticker: time.NewTicker(interval),
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Updater) Start() {
|
||||
// 初始化
|
||||
err := this.Init()
|
||||
if err != nil {
|
||||
this.source.LogError(err)
|
||||
}
|
||||
|
||||
// 先运行一次
|
||||
err = this.Loop()
|
||||
if err != nil {
|
||||
this.source.LogError(err)
|
||||
}
|
||||
|
||||
// 开始定时运行
|
||||
for range this.ticker.C {
|
||||
err = this.Loop()
|
||||
if err != nil {
|
||||
this.source.LogError(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Updater) Init() error {
|
||||
// 检查当前正在使用的IP库
|
||||
var path = this.source.DataDir() + "/ip-library.db"
|
||||
fp, err := os.Open(path)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("read ip library file failed '" + err.Error() + "'")
|
||||
}
|
||||
defer func() {
|
||||
_ = fp.Close()
|
||||
}()
|
||||
|
||||
return this.loadFile(fp)
|
||||
}
|
||||
|
||||
func (this *Updater) Loop() error {
|
||||
if this.isUpdating {
|
||||
return nil
|
||||
}
|
||||
|
||||
this.isUpdating = true
|
||||
|
||||
defer func() {
|
||||
this.isUpdating = false
|
||||
}()
|
||||
|
||||
code, fileId, err := this.source.FindLatestFile()
|
||||
if err != nil {
|
||||
// 不提示连接错误
|
||||
if this.isConnError(err) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
if len(code) == 0 || fileId <= 0 {
|
||||
// 还原到内置IP库
|
||||
if len(this.currentCode) > 0 {
|
||||
this.currentCode = ""
|
||||
this.source.LogInfo("resetting to default ip library ...")
|
||||
|
||||
var defaultPath = this.source.DataDir() + "/ip-library.db"
|
||||
_, err = os.Stat(defaultPath)
|
||||
if err == nil {
|
||||
err = os.Remove(defaultPath)
|
||||
if err != nil {
|
||||
this.source.LogError(errors.New("can not remove default 'ip-library.db'"))
|
||||
}
|
||||
}
|
||||
|
||||
err = InitDefault()
|
||||
if err != nil {
|
||||
this.source.LogError(errors.New("initialize default ip library failed: " + err.Error()))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 下载
|
||||
if this.currentCode == code {
|
||||
// 不再重复下载
|
||||
return nil
|
||||
}
|
||||
|
||||
// 检查是否存在
|
||||
var dir = this.source.DataDir()
|
||||
var path = dir + "/ip-" + code + ".db"
|
||||
stat, err := os.Stat(path)
|
||||
if err == nil && !stat.IsDir() && stat.Size() > 0 {
|
||||
fp, err := os.Open(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
_ = fp.Close()
|
||||
}()
|
||||
|
||||
err = this.loadFile(fp)
|
||||
if err != nil {
|
||||
// 尝试删除
|
||||
_ = os.Remove(path)
|
||||
} else {
|
||||
this.currentCode = code
|
||||
|
||||
// 拷贝到 ip-library.db
|
||||
err = this.createDefaultFile(path, dir)
|
||||
if err != nil {
|
||||
this.source.LogError(err)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// write to file
|
||||
fp, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
|
||||
if err != nil {
|
||||
return errors.New("create ip library file failed: " + err.Error())
|
||||
}
|
||||
|
||||
var isOk = false
|
||||
defer func() {
|
||||
if !isOk {
|
||||
_ = os.Remove(path)
|
||||
}
|
||||
}()
|
||||
|
||||
err = this.source.DownloadFile(fileId, fp)
|
||||
if err != nil {
|
||||
_ = fp.Close()
|
||||
return err
|
||||
}
|
||||
err = fp.Close()
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// load library from file
|
||||
fp, err = os.Open(path)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
err = this.loadFile(fp)
|
||||
_ = fp.Close()
|
||||
if err != nil {
|
||||
return errors.New("load file failed: " + err.Error())
|
||||
}
|
||||
|
||||
isOk = true
|
||||
this.currentCode = code
|
||||
|
||||
// 拷贝到 ip-library.db
|
||||
err = this.createDefaultFile(path, dir)
|
||||
if err != nil {
|
||||
this.source.LogError(err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Updater) loadFile(fp *os.File) error {
|
||||
this.source.LogInfo("load ip library from '" + fp.Name() + "' ...")
|
||||
|
||||
fileReader, err := NewFileDataReader(fp)
|
||||
if err != nil {
|
||||
return errors.New("load ip library from reader failed: " + err.Error())
|
||||
}
|
||||
|
||||
var reader = fileReader.RawReader()
|
||||
defaultLibrary = NewIPLibraryWithReader(reader)
|
||||
this.currentCode = reader.Meta().Code
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Updater) createDefaultFile(sourcePath string, dir string) error {
|
||||
sourceFp, err := os.Open(sourcePath)
|
||||
if err != nil {
|
||||
return errors.New("prepare to copy file to 'ip-library.db' failed: " + err.Error())
|
||||
}
|
||||
defer func() {
|
||||
_ = sourceFp.Close()
|
||||
}()
|
||||
|
||||
dstFp, err := os.Create(dir + "/ip-library.db")
|
||||
if err != nil {
|
||||
return errors.New("prepare to copy file to 'ip-library.db' failed: " + err.Error())
|
||||
}
|
||||
defer func() {
|
||||
_ = dstFp.Close()
|
||||
}()
|
||||
_, err = io.Copy(dstFp, sourceFp)
|
||||
if err != nil {
|
||||
return errors.New("copy file to 'ip-library.db' failed: " + err.Error())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// isConnError 是否为连接错误
|
||||
func (this *Updater) isConnError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查是否为连接错误
|
||||
statusErr, ok := status.FromError(err)
|
||||
if ok {
|
||||
var errorCode = statusErr.Code()
|
||||
return errorCode == codes.Unavailable || errorCode == codes.Canceled
|
||||
}
|
||||
|
||||
if strings.Contains(err.Error(), "code = Canceled") {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
53
pkg/iplibrary/updater_test.go
Normal file
53
pkg/iplibrary/updater_test.go
Normal file
@@ -0,0 +1,53 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
_ "github.com/iwind/TeaGo/bootstrap"
|
||||
"io"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type updaterSource struct {
|
||||
t *testing.T
|
||||
}
|
||||
|
||||
func (this *updaterSource) DataDir() string {
|
||||
return Tea.Root + "/data"
|
||||
}
|
||||
|
||||
func (this *updaterSource) FindLatestFile() (code string, fileId int64, err error) {
|
||||
return "CODE", 1, nil
|
||||
}
|
||||
|
||||
func (this *updaterSource) DownloadFile(fileId int64, writer io.Writer) error {
|
||||
this.t.Log("downloading file:", fileId, "writer:", writer)
|
||||
_, err := writer.Write(iplibrary.DefaultIPLibraryData())
|
||||
return err
|
||||
}
|
||||
|
||||
func (this *updaterSource) LogInfo(message string) {
|
||||
this.t.Log(message)
|
||||
}
|
||||
|
||||
func (this *updaterSource) LogError(err error) {
|
||||
this.t.Fatal(err)
|
||||
}
|
||||
|
||||
func TestNewUpdater(t *testing.T) {
|
||||
var updater = iplibrary.NewUpdater(&updaterSource{
|
||||
t: t,
|
||||
}, 1*time.Minute)
|
||||
err := updater.Init()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = updater.Loop()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
9
pkg/iplibrary/version.go
Normal file
9
pkg/iplibrary/version.go
Normal file
@@ -0,0 +1,9 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
type Version = int
|
||||
|
||||
const (
|
||||
Version1 Version = 1
|
||||
)
|
||||
161
pkg/iplibrary/writer.go
Normal file
161
pkg/iplibrary/writer.go
Normal file
@@ -0,0 +1,161 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"hash"
|
||||
"io"
|
||||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type hashWriter struct {
|
||||
rawWriter io.Writer
|
||||
hash hash.Hash
|
||||
}
|
||||
|
||||
func newHashWriter(writer io.Writer) *hashWriter {
|
||||
return &hashWriter{
|
||||
rawWriter: writer,
|
||||
hash: md5.New(),
|
||||
}
|
||||
}
|
||||
|
||||
func (this *hashWriter) Write(p []byte) (n int, err error) {
|
||||
n, err = this.rawWriter.Write(p)
|
||||
this.hash.Write(p)
|
||||
return
|
||||
}
|
||||
|
||||
func (this *hashWriter) Sum() string {
|
||||
return fmt.Sprintf("%x", this.hash.Sum(nil))
|
||||
}
|
||||
|
||||
type Writer struct {
|
||||
writer *hashWriter
|
||||
meta *Meta
|
||||
}
|
||||
|
||||
func NewWriter(writer io.Writer, meta *Meta) *Writer {
|
||||
if meta == nil {
|
||||
meta = &Meta{}
|
||||
}
|
||||
meta.Version = Version1
|
||||
meta.CreatedAt = time.Now().Unix()
|
||||
|
||||
var libWriter = &Writer{
|
||||
writer: newHashWriter(writer),
|
||||
meta: meta,
|
||||
}
|
||||
return libWriter
|
||||
}
|
||||
|
||||
func (this *Writer) WriteMeta() error {
|
||||
metaJSON, err := json.Marshal(this.meta)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = this.writer.Write(metaJSON)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = this.writer.Write([]byte("\n"))
|
||||
return err
|
||||
}
|
||||
|
||||
func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceId int64, cityId int64, townId int64, providerId int64) error {
|
||||
// validate IP
|
||||
var fromIP = net.ParseIP(ipFrom)
|
||||
if fromIP == nil {
|
||||
return errors.New("invalid 'ipFrom': '" + ipFrom + "'")
|
||||
}
|
||||
var fromIsIPv4 = configutils.IsIPv4(fromIP)
|
||||
var toIP = net.ParseIP(ipTo)
|
||||
if toIP == nil {
|
||||
return errors.New("invalid 'ipTo': " + ipTo)
|
||||
}
|
||||
var toIsIPv4 = configutils.IsIPv4(toIP)
|
||||
if fromIsIPv4 != toIsIPv4 {
|
||||
return errors.New("'ipFrom(" + ipFrom + ")' and 'ipTo(" + ipTo + ")' should have the same IP version")
|
||||
}
|
||||
|
||||
var pieces = []string{}
|
||||
|
||||
// 0
|
||||
if fromIsIPv4 {
|
||||
pieces = append(pieces, "")
|
||||
} else {
|
||||
pieces = append(pieces, "6")
|
||||
}
|
||||
|
||||
// 1
|
||||
var fromIPLong = configutils.IP2Long(fromIP)
|
||||
var toIPLong = configutils.IP2Long(toIP)
|
||||
|
||||
if toIPLong < fromIPLong {
|
||||
fromIPLong, toIPLong = toIPLong, fromIPLong
|
||||
}
|
||||
|
||||
pieces = append(pieces, types.String(fromIPLong))
|
||||
if ipFrom == ipTo {
|
||||
// 2
|
||||
pieces = append(pieces, "")
|
||||
} else {
|
||||
// 2
|
||||
pieces = append(pieces, types.String(toIPLong-fromIPLong))
|
||||
}
|
||||
|
||||
// 3
|
||||
if countryId > 0 {
|
||||
pieces = append(pieces, types.String(countryId))
|
||||
} else {
|
||||
pieces = append(pieces, "")
|
||||
}
|
||||
|
||||
// 4
|
||||
if provinceId > 0 {
|
||||
pieces = append(pieces, types.String(provinceId))
|
||||
} else {
|
||||
pieces = append(pieces, "")
|
||||
}
|
||||
|
||||
// 5
|
||||
if cityId > 0 {
|
||||
pieces = append(pieces, types.String(cityId))
|
||||
} else {
|
||||
pieces = append(pieces, "")
|
||||
}
|
||||
|
||||
// 6
|
||||
if townId > 0 {
|
||||
pieces = append(pieces, types.String(townId))
|
||||
} else {
|
||||
pieces = append(pieces, "")
|
||||
}
|
||||
|
||||
// 7
|
||||
if providerId > 0 {
|
||||
pieces = append(pieces, types.String(providerId))
|
||||
} else {
|
||||
pieces = append(pieces, "")
|
||||
}
|
||||
|
||||
_, err := this.writer.Write([]byte(strings.Join(pieces, "|")))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = this.writer.Write([]byte("\n"))
|
||||
return err
|
||||
}
|
||||
|
||||
func (this *Writer) Sum() string {
|
||||
return this.writer.Sum()
|
||||
}
|
||||
58
pkg/iplibrary/writer_file.go
Normal file
58
pkg/iplibrary/writer_file.go
Normal file
@@ -0,0 +1,58 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary
|
||||
|
||||
import (
|
||||
"compress/gzip"
|
||||
"os"
|
||||
)
|
||||
|
||||
type FileWriter struct {
|
||||
fp *os.File
|
||||
gzWriter *gzip.Writer
|
||||
|
||||
rawWriter *Writer
|
||||
}
|
||||
|
||||
func NewFileWriter(path string, meta *Meta) (*FileWriter, error) {
|
||||
fp, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
gzWriter, err := gzip.NewWriterLevel(fp, gzip.BestCompression)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var writer = &FileWriter{
|
||||
fp: fp,
|
||||
gzWriter: gzWriter,
|
||||
rawWriter: NewWriter(gzWriter, meta),
|
||||
}
|
||||
return writer, nil
|
||||
}
|
||||
|
||||
func (this *FileWriter) WriteMeta() error {
|
||||
return this.rawWriter.WriteMeta()
|
||||
}
|
||||
|
||||
func (this *FileWriter) Write(ipFrom string, ipTo string, countryId int64, provinceId int64, cityId int64, townId int64, providerId int64) error {
|
||||
return this.rawWriter.Write(ipFrom, ipTo, countryId, provinceId, cityId, townId, providerId)
|
||||
}
|
||||
|
||||
func (this *FileWriter) Sum() string {
|
||||
return this.rawWriter.Sum()
|
||||
}
|
||||
|
||||
func (this *FileWriter) Close() error {
|
||||
err1 := this.gzWriter.Close()
|
||||
err2 := this.fp.Close()
|
||||
if err1 != nil {
|
||||
return err1
|
||||
}
|
||||
if err2 != nil {
|
||||
return err2
|
||||
}
|
||||
return nil
|
||||
}
|
||||
56
pkg/iplibrary/writer_file_test.go
Normal file
56
pkg/iplibrary/writer_file_test.go
Normal file
@@ -0,0 +1,56 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"github.com/iwind/TeaGo/rands"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNewFileWriter(t *testing.T) {
|
||||
writer, err := iplibrary.NewFileWriter("./internal-ip-library.db", &iplibrary.Meta{
|
||||
Author: "GoEdge",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.WriteMeta()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.1.100", "192.168.1.100", 100, 200, 300, 400, 500)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.2.100", "192.168.3.100", 101, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.3.101", "192.168.3.101", 101, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var n = func() string {
|
||||
return types.String(rands.Int(0, 255))
|
||||
}
|
||||
|
||||
for i := 0; i < 1_000_000; i++ {
|
||||
err = writer.Write(n()+"."+n()+"."+n()+"."+n(), n()+"."+n()+"."+n()+"."+n(), int64(i)+100, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
err = writer.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("ok", writer.Sum())
|
||||
}
|
||||
44
pkg/iplibrary/writer_test.go
Normal file
44
pkg/iplibrary/writer_test.go
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package iplibrary_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNewWriter(t *testing.T) {
|
||||
var buf = &bytes.Buffer{}
|
||||
var writer = iplibrary.NewWriter(buf, &iplibrary.Meta{
|
||||
Author: "GoEdge <https://goedge.cn>",
|
||||
})
|
||||
|
||||
err := writer.WriteMeta()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.1.100", "192.168.1.100", 100, 200, 300, 400, 500)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.2.100", "192.168.3.100", 101, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("192.168.3.101", "192.168.3.101", 101, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = writer.Write("::1", "::2", 101, 201, 301, 401, 501)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log(buf.String())
|
||||
t.Log("sum:", writer.Sum())
|
||||
}
|
||||
@@ -7,10 +7,9 @@ const (
|
||||
MessageCodeWriteCache MessageCode = "writeCache" // 写入缓存
|
||||
MessageCodeReadCache MessageCode = "readCache" // 读取缓存
|
||||
MessageCodeStatCache MessageCode = "statCache" // 统计缓存
|
||||
MessageCodePurgeCache MessageCode = "purgeCache" // 删除缓存
|
||||
MessageCodeCleanCache MessageCode = "cleanCache" // 清理缓存
|
||||
MessageCodePreheatCache MessageCode = "preheatCache" // 预热缓存
|
||||
MessageCodeCheckSystemdService MessageCode = "checkSystemdService" // 检查Systemd服务
|
||||
MessageCodeCheckLocalFirewall MessageCode = "checkLocalFirewall" // 检查本地防火墙
|
||||
MessageCodeNewNodeTask MessageCode = "newNodeTask" // 有新的节点任务产生
|
||||
MessageCodeChangeAPINode MessageCode = "changeAPINode" // 改变新的API节点
|
||||
)
|
||||
@@ -45,30 +44,15 @@ type CleanCacheMessage struct {
|
||||
CachePolicyJSON []byte `json:"cachePolicyJSON"`
|
||||
}
|
||||
|
||||
// PurgeCacheMessageType 删除缓存
|
||||
type PurgeCacheMessageType = string
|
||||
|
||||
const (
|
||||
PurgeCacheMessageTypeFile PurgeCacheMessageType = "file"
|
||||
PurgeCacheMessageTypeDir PurgeCacheMessageType = "dir"
|
||||
)
|
||||
|
||||
type PurgeCacheMessage struct {
|
||||
CachePolicyJSON []byte `json:"cachePolicyJSON"`
|
||||
Keys []string `json:"keys"`
|
||||
Type PurgeCacheMessageType `json:"type"` // 清理类型
|
||||
}
|
||||
|
||||
// PreheatCacheMessage 预热缓存
|
||||
type PreheatCacheMessage struct {
|
||||
CachePolicyJSON []byte `json:"cachePolicyJSON"`
|
||||
Keys []string `json:"keys"`
|
||||
}
|
||||
|
||||
// CheckSystemdServiceMessage Systemd服务
|
||||
type CheckSystemdServiceMessage struct {
|
||||
}
|
||||
|
||||
// CheckLocalFirewallMessage 检查本地防火墙
|
||||
type CheckLocalFirewallMessage struct {
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
// NewNodeTaskMessage 有新的节点任务
|
||||
type NewNodeTaskMessage struct {
|
||||
}
|
||||
|
||||
22
pkg/nodeconfigs/clock_config.go
Normal file
22
pkg/nodeconfigs/clock_config.go
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
func DefaultClockConfig() *ClockConfig {
|
||||
return &ClockConfig{
|
||||
AutoSync: true,
|
||||
Server: "",
|
||||
CheckChrony: true,
|
||||
}
|
||||
}
|
||||
|
||||
// ClockConfig 时钟相关配置
|
||||
type ClockConfig struct {
|
||||
AutoSync bool `yaml:"autoSync" json:"autoSync"` // 自动尝试同步时钟
|
||||
Server string `yaml:"server" json:"server"` // 时钟同步服务器
|
||||
CheckChrony bool `yaml:"checkChrony" json:"checkChrony"` // 检查 chronyd 是否在运行
|
||||
}
|
||||
|
||||
func (this *ClockConfig) Init() error {
|
||||
return nil
|
||||
}
|
||||
@@ -2,14 +2,36 @@
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
import "github.com/iwind/TeaGo/maps"
|
||||
|
||||
// 一组系统默认值
|
||||
// 修改单个IP相关限制值时要考虑到NAT中每个IP会代表很多个主机,并非1对1的关系
|
||||
|
||||
const (
|
||||
DefaultMaxThreads = 20000 // 单节点最大线程数
|
||||
DefaultMaxThreadsMin = 1000 // 单节点最大线程数最小值
|
||||
DefaultMaxThreadsMax = 100_000 // 单节点最大线程数最大值
|
||||
|
||||
DefaultTCPMaxConnections = 100_000 // 单节点TCP最大连接数
|
||||
DefaultTCPLinger = 3 // 单节点TCP Linger值
|
||||
DefaultTLSHandshakeTimeout = 3 // TLS握手超时时间
|
||||
DefaultTCPMaxConnections = 100_000 // 单节点TCP最大连接数
|
||||
DefaultTCPMaxConnectionsPerIP = 1000 // 单IP最大连接数
|
||||
DefaultTCPMinConnectionsPerIP = 5 // 单IP最小连接数
|
||||
|
||||
DefaultTCPNewConnectionsMinutelyRate = 500 // 单IP连接速率限制(按分钟)
|
||||
DefaultTCPNewConnectionsMinMinutelyRate = 3 // 单IP最小连接速率
|
||||
|
||||
DefaultTCPNewConnectionsSecondlyRate = 300 // 单IP连接速率限制(按秒)
|
||||
DefaultTCPNewConnectionsMinSecondlyRate = 3 // 单IP最小连接速率
|
||||
|
||||
DefaultTCPLinger = 3 // 单节点TCP Linger值
|
||||
DefaultTLSHandshakeTimeout = 3 // TLS握手超时时间
|
||||
)
|
||||
|
||||
var DefaultConfigs = maps.Map{
|
||||
"tcpMaxConnections": DefaultTCPMaxConnections,
|
||||
"tcpMaxConnectionsPerIP": DefaultTCPMaxConnectionsPerIP,
|
||||
"tcpMinConnectionsPerIP": DefaultTCPMinConnectionsPerIP,
|
||||
"tcpNewConnectionsMinutelyRate": DefaultTCPNewConnectionsMinutelyRate,
|
||||
"tcpNewConnectionsMinMinutelyRate": DefaultTCPNewConnectionsMinMinutelyRate,
|
||||
"tcpNewConnectionsSecondlyRate": DefaultTCPNewConnectionsSecondlyRate,
|
||||
"tcpNewConnectionsMinSecondlyRate": DefaultTCPNewConnectionsMinSecondlyRate,
|
||||
}
|
||||
|
||||
25
pkg/nodeconfigs/dns_resolver.go
Normal file
25
pkg/nodeconfigs/dns_resolver.go
Normal file
@@ -0,0 +1,25 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
type DNSResolverType = string
|
||||
|
||||
const (
|
||||
DNSResolverTypeDefault = "default"
|
||||
DNSResolverTypeGoNative = "goNative"
|
||||
DNSResolverTypeCGO = "cgo"
|
||||
)
|
||||
|
||||
func DefaultDNSResolverConfig() *DNSResolverConfig {
|
||||
return &DNSResolverConfig{
|
||||
Type: DNSResolverTypeDefault,
|
||||
}
|
||||
}
|
||||
|
||||
type DNSResolverConfig struct {
|
||||
Type string `yaml:"type" json:"type"` // 使用Go语言内置的DNS解析器
|
||||
}
|
||||
|
||||
func (this *DNSResolverConfig) Init() error {
|
||||
return nil
|
||||
}
|
||||
46
pkg/nodeconfigs/image_webp_policy.go
Normal file
46
pkg/nodeconfigs/image_webp_policy.go
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
import "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||||
|
||||
func init() {
|
||||
_ = DefaultWebPImagePolicy.Init()
|
||||
}
|
||||
|
||||
var DefaultWebPImagePolicy = &WebPImagePolicy{
|
||||
IsOn: true,
|
||||
RequireCache: true,
|
||||
MinLength: shared.NewSizeCapacity(0, shared.SizeCapacityUnitKB),
|
||||
MaxLength: shared.NewSizeCapacity(128, shared.SizeCapacityUnitMB),
|
||||
}
|
||||
|
||||
// WebPImagePolicy WebP策略
|
||||
type WebPImagePolicy struct {
|
||||
IsOn bool `yaml:"isOn" json:"isOn"` // 是否启用
|
||||
RequireCache bool `yaml:"requireCache" json:"requireCache"` // 需要在缓存条件下进行
|
||||
MinLength *shared.SizeCapacity `yaml:"minLength" json:"minLength"` // 最小压缩对象比如4m, 24k
|
||||
MaxLength *shared.SizeCapacity `yaml:"maxLength" json:"maxLength"` // 最大压缩对象
|
||||
|
||||
minLength int64
|
||||
maxLength int64
|
||||
}
|
||||
|
||||
func (this *WebPImagePolicy) Init() error {
|
||||
if this.MinLength != nil {
|
||||
this.minLength = this.MinLength.Bytes()
|
||||
}
|
||||
if this.MaxLength != nil {
|
||||
this.maxLength = this.MaxLength.Bytes()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *WebPImagePolicy) MinLengthBytes() int64 {
|
||||
return this.minLength
|
||||
}
|
||||
|
||||
func (this *WebPImagePolicy) MaxLengthBytes() int64 {
|
||||
return this.maxLength
|
||||
}
|
||||
@@ -1,17 +1,23 @@
|
||||
package nodeconfigs
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeutils"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ddosconfigs"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var sharedNodeConfig *NodeConfig = nil
|
||||
@@ -35,29 +41,43 @@ type NodeConfig struct {
|
||||
SupportCNAME bool `yaml:"supportCNAME" json:"supportCNAME"`
|
||||
Version int64 `yaml:"version" json:"version"`
|
||||
Name string `yaml:"name" json:"name"`
|
||||
GroupId int64 `yaml:"groupId" json:"groupId"`
|
||||
RegionId int64 `yaml:"regionId" json:"regionId"`
|
||||
OCSPVersion int64 `yaml:"ocspVersion" json:"ocspVersion"`
|
||||
|
||||
// 性能
|
||||
MaxCPU int32 `yaml:"maxCPU" json:"maxCPU"`
|
||||
CacheDiskDir string `yaml:"cacheDiskDir" json:"cacheDiskDir"` // 文件缓存目录
|
||||
MaxCacheDiskCapacity *shared.SizeCapacity `yaml:"maxCacheDiskCapacity" json:"maxCacheDiskCapacity"` // 文件缓存容量
|
||||
MaxCacheMemoryCapacity *shared.SizeCapacity `yaml:"maxCacheMemoryCapacity" json:"maxCacheMemoryCapacity"` // 内容缓存容量
|
||||
MaxThreads int `yaml:"maxThreads" json:"maxThreads"`
|
||||
TCPMaxConnections int `yaml:"tcpMaxConnections" json:"tcpMaxConnections"`
|
||||
MaxCPU int32 `yaml:"maxCPU" json:"maxCPU"`
|
||||
APINodeAddrs []*serverconfigs.NetworkAddressConfig `yaml:"apiNodeAddrs" json:"apiNodeAddrs"`
|
||||
|
||||
CacheDiskDir string `yaml:"cacheDiskDir" json:"cacheDiskDir"` // 文件缓存目录
|
||||
MaxCacheDiskCapacity *shared.SizeCapacity `yaml:"maxCacheDiskCapacity" json:"maxCacheDiskCapacity"` // 文件缓存容量
|
||||
|
||||
CacheDiskSubDirs []*serverconfigs.CacheDir `yaml:"cacheDiskSubDirs" json:"cacheDiskSubDirs"` // 其余缓存目录
|
||||
|
||||
MaxCacheMemoryCapacity *shared.SizeCapacity `yaml:"maxCacheMemoryCapacity" json:"maxCacheMemoryCapacity"` // 内容缓存容量
|
||||
MaxThreads int `yaml:"maxThreads" json:"maxThreads"` // 最大线程数
|
||||
DDoSProtection *ddosconfigs.ProtectionConfig `yaml:"ddosProtection" json:"ddosProtection"` // DDoS防护
|
||||
EnableIPLists bool `yaml:"enableIPLists" json:"enableIPLists"` // 启用IP名单
|
||||
|
||||
// 级别
|
||||
Level int32 `yaml:"level" json:"level"`
|
||||
ParentNodes map[int64][]*ParentNodeConfig `yaml:"parentNodes" json:"parentNodes"` // clusterId => []*ParentNodeConfig
|
||||
|
||||
// 全局配置
|
||||
GlobalConfig *serverconfigs.GlobalConfig `yaml:"globalConfig" json:"globalConfig"` // 全局配置
|
||||
ProductConfig *ProductConfig `yaml:"productConfig" json:"productConfig"`
|
||||
GlobalConfig *serverconfigs.GlobalConfig `yaml:"globalConfig" json:"globalConfig"` // 全局配置
|
||||
GlobalServerConfig *serverconfigs.GlobalServerConfig `yaml:"globalServerConfig" json:"globalServerConfig"` // 服务全局配置,用来替代 GlobalConfig
|
||||
ProductConfig *ProductConfig `yaml:"productConfig" json:"productConfig"`
|
||||
|
||||
// 集群统一配置
|
||||
HTTPFirewallPolicies []*firewallconfigs.HTTPFirewallPolicy `yaml:"httpFirewallPolicies" json:"httpFirewallPolicies"`
|
||||
HTTPCachePolicies []*serverconfigs.HTTPCachePolicy `yaml:"httpCachePolicies" json:"httpCachePolicies"`
|
||||
TOA *TOAConfig `yaml:"toa" json:"toa"`
|
||||
SystemServices map[string]maps.Map `yaml:"systemServices" json:"systemServices"` // 系统服务配置 type => params
|
||||
FirewallActions []*firewallconfigs.FirewallActionConfig `yaml:"firewallActions" json:"firewallActions"`
|
||||
TimeZone string `yaml:"timeZone" json:"timeZone"`
|
||||
AutoOpenPorts bool `yaml:"autoOpenPorts" json:"autoOpenPorts"`
|
||||
SystemServices map[string]maps.Map `yaml:"systemServices" json:"systemServices"` // 系统服务配置 type => params
|
||||
FirewallActions []*firewallconfigs.FirewallActionConfig `yaml:"firewallActions" json:"firewallActions"` // 防火墙动作
|
||||
TimeZone string `yaml:"timeZone" json:"timeZone"` // 自动设置时区
|
||||
AutoOpenPorts bool `yaml:"autoOpenPorts" json:"autoOpenPorts"` // 自动开放所需端口
|
||||
Clock *ClockConfig `yaml:"clock" json:"clock"` // 时钟配置
|
||||
AutoInstallNftables bool `yaml:"autoInstallNftables" json:"autoInstallNftables"` // 自动安装nftables
|
||||
|
||||
// 指标
|
||||
MetricItems []*serverconfigs.MetricItemConfig `yaml:"metricItems" json:"metricItems"`
|
||||
@@ -65,6 +85,18 @@ type NodeConfig struct {
|
||||
// 自动白名单
|
||||
AllowedIPs []string `yaml:"allowedIPs" json:"allowedIPs"`
|
||||
|
||||
// 脚本
|
||||
CommonScripts []*serverconfigs.CommonScript `yaml:"commonScripts" json:"commonScripts"`
|
||||
|
||||
// WebP
|
||||
WebPImagePolicies map[int64]*WebPImagePolicy `yaml:"webpImagePolicies" json:"webpImagePolicies"` // clusterId => *WebPImagePolicy
|
||||
|
||||
// UAM相关配置
|
||||
UAMPolicies map[int64]*UAMPolicy `yaml:"uamPolicies" yaml:"uamPolicies" json:"uamPolicies"` // clusterId => *UAMPolicy
|
||||
|
||||
// DNS
|
||||
DNSResolver *DNSResolverConfig `yaml:"dnsResolver" json:"dnsResolver"`
|
||||
|
||||
paddedId string
|
||||
|
||||
// firewall
|
||||
@@ -81,6 +113,8 @@ type NodeConfig struct {
|
||||
|
||||
// syn flood
|
||||
synFlood *firewallconfigs.SYNFloodConfig
|
||||
|
||||
secretHash string
|
||||
}
|
||||
|
||||
// SharedNodeConfig 取得当前节点配置单例
|
||||
@@ -92,17 +126,50 @@ func SharedNodeConfig() (*NodeConfig, error) {
|
||||
return sharedNodeConfig, nil
|
||||
}
|
||||
|
||||
data, err := ioutil.ReadFile(Tea.ConfigFile("node.json"))
|
||||
// 从本地缓存读取
|
||||
var configFile = Tea.ConfigFile("node.json")
|
||||
var readCacheOk = false
|
||||
defer func() {
|
||||
if !readCacheOk {
|
||||
_ = os.Remove(configFile)
|
||||
}
|
||||
}()
|
||||
|
||||
data, err := os.ReadFile(configFile)
|
||||
if err != nil {
|
||||
return &NodeConfig{}, err
|
||||
}
|
||||
|
||||
config := &NodeConfig{}
|
||||
err = json.Unmarshal(data, &config)
|
||||
encodedNodeInfo, encodedJSONData, found := bytes.Cut(data, []byte("\n"))
|
||||
if !found {
|
||||
// 删除缓存文件
|
||||
return &NodeConfig{}, errors.New("node.json: invalid data format")
|
||||
}
|
||||
|
||||
encodedNodeInfoData, err := base64.StdEncoding.DecodeString(string(encodedNodeInfo))
|
||||
if err != nil {
|
||||
// 删除缓存文件
|
||||
return &NodeConfig{}, err
|
||||
}
|
||||
|
||||
nodeUniqueId, nodeSecret, found := strings.Cut(string(encodedNodeInfoData), "|")
|
||||
if !found {
|
||||
// 删除缓存文件
|
||||
return &NodeConfig{}, errors.New("node.json: node info: invalid data format")
|
||||
}
|
||||
|
||||
jsonData, err := nodeutils.DecryptData(nodeUniqueId, nodeSecret, string(encodedJSONData))
|
||||
if err != nil {
|
||||
return &NodeConfig{}, err
|
||||
}
|
||||
|
||||
var config = &NodeConfig{}
|
||||
err = json.Unmarshal(jsonData, &config)
|
||||
if err != nil {
|
||||
return &NodeConfig{}, err
|
||||
}
|
||||
|
||||
readCacheOk = true
|
||||
sharedNodeConfig = config
|
||||
return config, nil
|
||||
}
|
||||
@@ -143,10 +210,16 @@ func CloneNodeConfig(nodeConfig *NodeConfig) (*NodeConfig, error) {
|
||||
|
||||
// Init 初始化
|
||||
func (this *NodeConfig) Init() (err error, serverErrors []*ServerError) {
|
||||
this.secretHash = fmt.Sprintf("%x", sha256.Sum256([]byte(this.NodeId+"@"+this.Secret)))
|
||||
this.paddedId = fmt.Sprintf("%08d", this.Id)
|
||||
|
||||
// servers
|
||||
for _, server := range this.Servers {
|
||||
// 避免在运行时重新初始化
|
||||
if server.IsInitialized() {
|
||||
continue
|
||||
}
|
||||
|
||||
// 初始化
|
||||
errs := server.Init()
|
||||
if len(errs) > 0 {
|
||||
@@ -281,6 +354,52 @@ func (this *NodeConfig) Init() (err error, serverErrors []*ServerError) {
|
||||
this.allowedIPMap[allowIP] = true
|
||||
}
|
||||
|
||||
// webp image policy
|
||||
if this.WebPImagePolicies != nil {
|
||||
for _, policy := range this.WebPImagePolicies {
|
||||
err = policy.Init()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// uam policy
|
||||
if this.UAMPolicies != nil {
|
||||
for _, policy := range this.UAMPolicies {
|
||||
err = policy.Init()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// dns resolver
|
||||
if this.DNSResolver != nil {
|
||||
err = this.DNSResolver.Init()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 全局服务设置
|
||||
if this.GlobalServerConfig != nil {
|
||||
err = this.GlobalServerConfig.Init()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// api node addrs
|
||||
if len(this.APINodeAddrs) > 0 {
|
||||
for _, addr := range this.APINodeAddrs {
|
||||
err := addr.Init()
|
||||
if err != nil {
|
||||
return err, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -315,7 +434,7 @@ func (this *NodeConfig) RemoveServer(serverId int64) {
|
||||
|
||||
// AvailableGroups 根据网络地址和协议分组
|
||||
func (this *NodeConfig) AvailableGroups() []*serverconfigs.ServerAddressGroup {
|
||||
groupMapping := map[string]*serverconfigs.ServerAddressGroup{} // protocol://addr => Server Group
|
||||
var groupMapping = map[string]*serverconfigs.ServerAddressGroup{} // protocol://addr => Server Group
|
||||
for _, server := range this.Servers {
|
||||
if !server.IsOk() || !server.IsOn {
|
||||
continue
|
||||
@@ -331,7 +450,7 @@ func (this *NodeConfig) AvailableGroups() []*serverconfigs.ServerAddressGroup {
|
||||
groupMapping[addr] = group
|
||||
}
|
||||
}
|
||||
result := []*serverconfigs.ServerAddressGroup{}
|
||||
var result = []*serverconfigs.ServerAddressGroup{}
|
||||
for _, group := range groupMapping {
|
||||
result = append(result, group)
|
||||
}
|
||||
@@ -353,7 +472,14 @@ func (this *NodeConfig) Save() error {
|
||||
return err
|
||||
}
|
||||
|
||||
return ioutil.WriteFile(Tea.ConfigFile("node.json"), data, 0777)
|
||||
var headerData = []byte(base64.StdEncoding.EncodeToString([]byte(this.NodeId+"|"+this.Secret)) + "\n")
|
||||
|
||||
encodedData, err := nodeutils.EncryptData(this.NodeId, this.Secret, data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return os.WriteFile(Tea.ConfigFile("node.json"), append(headerData, encodedData...), 0777)
|
||||
}
|
||||
|
||||
// PaddedId 获取填充后的ID
|
||||
@@ -384,12 +510,25 @@ func (this *NodeConfig) lookupWeb(server *serverconfigs.ServerConfig, web *serve
|
||||
return
|
||||
}
|
||||
if web.FirewallPolicy != nil && web.FirewallPolicy.IsOn {
|
||||
// 复用节点的拦截选项设置
|
||||
if web.FirewallPolicy.BlockOptions == nil && server.HTTPFirewallPolicy != nil && server.HTTPFirewallPolicy.BlockOptions != nil {
|
||||
web.FirewallPolicy.BlockOptions = server.HTTPFirewallPolicy.BlockOptions
|
||||
// 复用节点的选项设置
|
||||
if server.HTTPFirewallPolicy != nil {
|
||||
if (web.FirewallPolicy.BlockOptions == nil || !web.FirewallPolicy.BlockOptions.IsPrior) && server.HTTPFirewallPolicy.BlockOptions != nil {
|
||||
web.FirewallPolicy.BlockOptions = server.HTTPFirewallPolicy.BlockOptions
|
||||
}
|
||||
if (web.FirewallPolicy.CaptchaOptions == nil || !web.FirewallPolicy.CaptchaOptions.IsPrior) && server.HTTPFirewallPolicy.CaptchaOptions != nil {
|
||||
web.FirewallPolicy.CaptchaOptions = server.HTTPFirewallPolicy.CaptchaOptions
|
||||
}
|
||||
if (web.FirewallPolicy.SYNFlood == nil || !web.FirewallPolicy.SYNFlood.IsPrior) && server.HTTPFirewallPolicy.SYNFlood != nil {
|
||||
web.FirewallPolicy.SYNFlood = server.HTTPFirewallPolicy.SYNFlood
|
||||
}
|
||||
if (web.FirewallPolicy.Log == nil || !web.FirewallPolicy.Log.IsPrior) && server.HTTPFirewallPolicy.Log != nil {
|
||||
web.FirewallPolicy.Log = server.HTTPFirewallPolicy.Log
|
||||
}
|
||||
|
||||
web.FirewallPolicy.Mode = server.HTTPFirewallPolicy.Mode
|
||||
web.FirewallPolicy.UseLocalFirewall = server.HTTPFirewallPolicy.UseLocalFirewall
|
||||
}
|
||||
|
||||
this.firewallPolicies = append(this.firewallPolicies, web.FirewallPolicy)
|
||||
}
|
||||
if len(web.Locations) > 0 {
|
||||
@@ -449,3 +588,24 @@ func (this *NodeConfig) UpdateCertOCSP(certId int64, ocsp []byte, expiresAt int6
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FindWebPImagePolicyWithClusterId 使用集群ID查找WebP策略
|
||||
func (this *NodeConfig) FindWebPImagePolicyWithClusterId(clusterId int64) *WebPImagePolicy {
|
||||
if this.WebPImagePolicies == nil {
|
||||
return nil
|
||||
}
|
||||
return this.WebPImagePolicies[clusterId]
|
||||
}
|
||||
|
||||
// FindUAMPolicyWithClusterId 使用集群ID查找UAM策略
|
||||
func (this *NodeConfig) FindUAMPolicyWithClusterId(clusterId int64) *UAMPolicy {
|
||||
if this.UAMPolicies == nil {
|
||||
return nil
|
||||
}
|
||||
return this.UAMPolicies[clusterId]
|
||||
}
|
||||
|
||||
// SecretHash 对Id和Secret的Hash计算
|
||||
func (this *NodeConfig) SecretHash() string {
|
||||
return this.secretHash
|
||||
}
|
||||
|
||||
37
pkg/nodeconfigs/node_levels.go
Normal file
37
pkg/nodeconfigs/node_levels.go
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
type NodeLevel struct {
|
||||
Name string `yaml:"name" json:"name"`
|
||||
Code int `yaml:"code" json:"code"`
|
||||
Description string `yaml:"description" json:"description"`
|
||||
}
|
||||
|
||||
func FindAllNodeLevels() []*NodeLevel {
|
||||
return []*NodeLevel{
|
||||
{
|
||||
Name: "边缘节点",
|
||||
Code: 1,
|
||||
Description: "普通的边缘节点。",
|
||||
},
|
||||
{
|
||||
Name: "L2节点",
|
||||
Code: 2,
|
||||
Description: "特殊的边缘节点,同时负责同组上一级节点的回源。",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func FindNodeLevel(level int) *NodeLevel {
|
||||
level--
|
||||
|
||||
var levels = FindAllNodeLevels()
|
||||
if level < 0 {
|
||||
return levels[0]
|
||||
}
|
||||
if level < len(levels) {
|
||||
return levels[level]
|
||||
}
|
||||
return levels[0]
|
||||
}
|
||||
10
pkg/nodeconfigs/node_parent_config.go
Normal file
10
pkg/nodeconfigs/node_parent_config.go
Normal file
@@ -0,0 +1,10 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
// ParentNodeConfig 父级节点配置
|
||||
type ParentNodeConfig struct {
|
||||
Id int64 `yaml:"id" json:"id"`
|
||||
Addrs []string `yaml:"addrs" json:"addrs"`
|
||||
SecretHash string `yaml:"secretHash" json:"secretHash"`
|
||||
}
|
||||
@@ -20,10 +20,14 @@ type NodeStatus struct {
|
||||
DiskMaxUsagePartition string `json:"diskMaxUsagePartition"`
|
||||
DiskTotal uint64 `json:"diskTotal"`
|
||||
UpdatedAt int64 `json:"updatedAt"`
|
||||
Timestamp int64 `json:"timestamp"` // 当前节点时间戳
|
||||
Load1m float64 `json:"load1m"`
|
||||
Load5m float64 `json:"load5m"`
|
||||
Load15m float64 `json:"load15m"`
|
||||
ConnectionCount int `json:"connectionCount"` // 连接数
|
||||
ConnectionCount int `json:"connectionCount"` // 连接数
|
||||
ExePath string `json:"exePath"` // 可执行文件路径
|
||||
APISuccessPercent float64 `json:"apiSuccessPercent"` // API成功比例
|
||||
APIAvgCostSeconds float64 `json:"apiAvgCostSeconds"` // API平均耗时
|
||||
|
||||
TrafficInBytes uint64 `json:"trafficInBytes"`
|
||||
TrafficOutBytes uint64 `json:"trafficOutBytes"`
|
||||
@@ -31,6 +35,8 @@ type NodeStatus struct {
|
||||
CacheTotalDiskSize int64 `json:"cacheTotalDiskSize"`
|
||||
CacheTotalMemorySize int64 `json:"cacheTotalMemorySize"`
|
||||
|
||||
LocalFirewallName string `json:"localFirewallName"`
|
||||
|
||||
IsActive bool `json:"isActive"`
|
||||
Error string `json:"error"`
|
||||
}
|
||||
|
||||
11
pkg/nodeconfigs/ssh_params.go
Normal file
11
pkg/nodeconfigs/ssh_params.go
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
func DefaultSSHParams() *SSHParams {
|
||||
return &SSHParams{Port: 22}
|
||||
}
|
||||
|
||||
type SSHParams struct {
|
||||
Port int `json:"port"`
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
28
pkg/nodeconfigs/uam_policy.go
Normal file
28
pkg/nodeconfigs/uam_policy.go
Normal file
@@ -0,0 +1,28 @@
|
||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package nodeconfigs
|
||||
|
||||
func init() {
|
||||
_ = DefaultUAMPolicy.Init()
|
||||
}
|
||||
|
||||
var DefaultUAMPolicy = &UAMPolicy{
|
||||
IsOn: true,
|
||||
AllowSearchEngines: true,
|
||||
DenySpiders: true,
|
||||
UITitle: "",
|
||||
UIBody: "",
|
||||
}
|
||||
|
||||
type UAMPolicy struct {
|
||||
IsOn bool `yaml:"isOn" json:"isOn"`
|
||||
AllowSearchEngines bool `yaml:"allowSearchEngines" json:"allowSearchEngines"` // 直接跳过常见搜索引擎
|
||||
DenySpiders bool `yaml:"denySpiders" json:"denySpiders"` // 拦截常见爬虫
|
||||
|
||||
UITitle string `yaml:"uiTitle" json:"uiTitle"` // 页面标题
|
||||
UIBody string `yaml:"uiBody" json:"uiBody"` // 页面内容
|
||||
}
|
||||
|
||||
func (this *UAMPolicy) Init() error {
|
||||
return nil
|
||||
}
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// EncryptData 加密
|
||||
func EncryptData(nodeUniqueId string, nodeSecret string, data maps.Map, timeout int32) (string, error) {
|
||||
// EncryptMap 加密
|
||||
func EncryptMap(nodeUniqueId string, nodeSecret string, data maps.Map, timeout int32) (string, error) {
|
||||
if data == nil {
|
||||
data = maps.Map{}
|
||||
}
|
||||
@@ -42,8 +42,8 @@ func EncryptData(nodeUniqueId string, nodeSecret string, data maps.Map, timeout
|
||||
return base64.StdEncoding.EncodeToString(result), nil
|
||||
}
|
||||
|
||||
// DecryptData 解密
|
||||
func DecryptData(nodeUniqueId string, nodeSecret string, encodedString string) (maps.Map, error) {
|
||||
// DecryptMap 解密
|
||||
func DecryptMap(nodeUniqueId string, nodeSecret string, encodedString string) (maps.Map, error) {
|
||||
var method = &AES256CFBMethod{}
|
||||
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
|
||||
if err != nil {
|
||||
@@ -73,3 +73,42 @@ func DecryptData(nodeUniqueId string, nodeSecret string, encodedString string) (
|
||||
|
||||
return result.GetMap("data"), nil
|
||||
}
|
||||
|
||||
// EncryptData 加密
|
||||
func EncryptData(nodeUniqueId string, nodeSecret string, data []byte) (string, error) {
|
||||
if len(data) == 0 {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
var method = &AES256CFBMethod{}
|
||||
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
result, err := method.Encrypt(data)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return base64.StdEncoding.EncodeToString(result), nil
|
||||
}
|
||||
|
||||
// DecryptData 解密
|
||||
func DecryptData(nodeUniqueId string, nodeSecret string, encodedString string) ([]byte, error) {
|
||||
if len(encodedString) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var method = &AES256CFBMethod{}
|
||||
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
encodedData, err := base64.StdEncoding.DecodeString(encodedString)
|
||||
if err != nil {
|
||||
return nil, errors.New("base64 decode failed: " + err.Error())
|
||||
}
|
||||
|
||||
return method.Decrypt(encodedData)
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestEncryptData(t *testing.T) {
|
||||
e, err := EncryptData("a", "b", maps.Map{
|
||||
func TestEncryptMap(t *testing.T) {
|
||||
e, err := EncryptMap("a", "b", maps.Map{
|
||||
"c": 1,
|
||||
}, 5)
|
||||
if err != nil {
|
||||
@@ -16,16 +16,30 @@ func TestEncryptData(t *testing.T) {
|
||||
}
|
||||
t.Log("e:", e)
|
||||
|
||||
s, err := DecryptData("a", "b", e)
|
||||
s, err := DecryptMap("a", "b", e)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("s:", s)
|
||||
}
|
||||
|
||||
func TestEncryptData(t *testing.T) {
|
||||
encoded, err := EncryptData("a", "b", []byte("Hello, World"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("encoded:", encoded)
|
||||
|
||||
source, err := DecryptData("a", "b", encoded)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("source:", string(source))
|
||||
}
|
||||
|
||||
func BenchmarkEncryptData(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
_, _ = EncryptData("a", "b", maps.Map{
|
||||
_, _ = EncryptMap("a", "b", maps.Map{
|
||||
"c": 1,
|
||||
}, 5)
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@ func (this *IPListDAO) CreateIPListForServerId(ctx context.Context, serverId int
|
||||
Type: listType,
|
||||
Name: "IP名单",
|
||||
Code: listType,
|
||||
ServerId: serverId,
|
||||
TimeoutJSON: nil,
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
@@ -12,7 +12,6 @@ type RPCClient interface {
|
||||
SysSettingRPC() pb.SysSettingServiceClient
|
||||
NodeClusterRPC() pb.NodeClusterServiceClient
|
||||
NodeRegionRPC() pb.NodeRegionServiceClient
|
||||
NodePriceItemRPC() pb.NodePriceItemServiceClient
|
||||
ServerRPC() pb.ServerServiceClient
|
||||
ServerGroupRPC() pb.ServerGroupServiceClient
|
||||
OriginRPC() pb.OriginServiceClient
|
||||
@@ -46,6 +45,4 @@ type RPCClient interface {
|
||||
ACMEUserRPC() pb.ACMEUserServiceClient
|
||||
ACMETaskRPC() pb.ACMETaskServiceClient
|
||||
UserRPC() pb.UserServiceClient
|
||||
UserBillRPC() pb.UserBillServiceClient
|
||||
UserNodeRPC() pb.UserNodeServiceClient
|
||||
}
|
||||
|
||||
@@ -6,27 +6,28 @@ import (
|
||||
"errors"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// HumanError 格式化GRPC相关错误
|
||||
func HumanError(err error) error {
|
||||
func HumanError(err error, endpoints []string, configFile string) (resultErr error, isConnError bool) {
|
||||
if err == nil {
|
||||
return err
|
||||
return err, false
|
||||
}
|
||||
errStatus, ok := status.FromError(err)
|
||||
if !ok {
|
||||
return err
|
||||
return err, false
|
||||
}
|
||||
switch errStatus.Code() {
|
||||
case codes.InvalidArgument:
|
||||
return errors.New("错误的RPC参数:" + err.Error())
|
||||
return errors.New("错误的RPC参数:" + err.Error()), false
|
||||
case codes.DeadlineExceeded:
|
||||
return errors.New("RPC操作超时,请重试:" + err.Error())
|
||||
return errors.New("RPC操作超时,请重试:" + err.Error()), false
|
||||
case codes.Unimplemented:
|
||||
return errors.New("请求的RPC服务或方法不存在,可能是没有升级API节点或者当前节点没有升级:" + err.Error())
|
||||
return errors.New("请求的RPC服务或方法不存在,可能是没有升级API节点或者当前节点没有升级:" + err.Error()), false
|
||||
case codes.Unavailable:
|
||||
return errors.New("RPC当前不可用,1、请确保当前节点的api.yaml配置中的地址填写正确;2、请确保API节点已启动,并检查当前节点和API节点之间的网络连接是正常的。错误信息:" + err.Error())
|
||||
return errors.New("RPC当前不可用:<br/>1、请确认当前节点的api.yaml(<em>" + configFile + "</em>)配置中的地址(<em>" + strings.Join(endpoints, ", ") + "</em>)是否已填写正确;<br/>2、请确保API节点已启动,并检查当前节点和API节点之间的网络连接是正常的。<hr/>错误信息:" + err.Error()), true
|
||||
}
|
||||
|
||||
return err
|
||||
return err, false
|
||||
}
|
||||
|
||||
43
pkg/rpc/jsons/http_access_log_ref.md
Normal file
43
pkg/rpc/jsons/http_access_log_ref.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# 访问日志引用
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": "是否覆盖父级应用",
|
||||
"isOn": "是否启用配置",
|
||||
"fields": ["字段1", "字段2", ...] // 可以留空
|
||||
"status1": "是否启用状态1xx",
|
||||
"status2": "是否启用状态2xx",
|
||||
"status3": "是否启用状态3xx",
|
||||
"status4": "是否启用状态4xx",
|
||||
"status5": "是否启用状态5xx",
|
||||
"enableClientClosed": "是否记录客户端关闭事件",
|
||||
"firewallOnly": "是否只记录防火墙(WAF)相关日志"
|
||||
}
|
||||
~~~
|
||||
|
||||
### 字段值
|
||||
* `1` - 请求Header
|
||||
* `2` - 响应Header
|
||||
* `3` - 请求URL参数
|
||||
* `4` - Cookie
|
||||
* `5` - 扩展信息
|
||||
* `6` - Referer
|
||||
* `7` - UserAgent
|
||||
* `8` - 请求Body
|
||||
* `9` - 响应Body(目前不支持)
|
||||
|
||||
## 示例
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"fields": [],
|
||||
"status1": true,
|
||||
"status2": true,
|
||||
"status3": true,
|
||||
"status4": true,
|
||||
"status5": true,
|
||||
"enableClientClosed": true,
|
||||
"firewallOnly": true
|
||||
}
|
||||
~~~
|
||||
92
pkg/rpc/jsons/http_cache_config.md
Normal file
92
pkg/rpc/jsons/http_cache_config.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# HTTP缓存配置
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": "是否覆盖上级配置",
|
||||
"isOn": "是否启用配置",
|
||||
"addStatusHeader": "是否增加命中状态Header(X-Cache)",
|
||||
"addAgeHeader": "是否增加Age Header",
|
||||
"enableCacheControlMaxAge": "是否支持Cache-Control: max-age=...",
|
||||
"disablePolicyRefs": "是否停用策略中定义的条件",
|
||||
"purgeIsOn": "是否允许使用Purge方法清理",
|
||||
"purgeKey": "Purge时使用的X-Edge-Purge-Key",
|
||||
"stale": "陈旧缓存使用策略",
|
||||
"cacheRefs": ["缓存条件1", "缓存条件2", ...]
|
||||
}
|
||||
~~~
|
||||
其中:
|
||||
* `缓存条件` - 参考 {json:http_cache_ref}
|
||||
|
||||
## 示例
|
||||
### 无缓存条件
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"addStatusHeader": true,
|
||||
"addAgeHeader": true,
|
||||
"enableCacheControlMaxAge": true,
|
||||
"disablePolicyRefs": false,
|
||||
"purgeIsOn": false,
|
||||
"purgeKey": "",
|
||||
"stale": null,
|
||||
"cacheRefs": []
|
||||
}
|
||||
~~~
|
||||
|
||||
### 加入缓存条件
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"addStatusHeader": true,
|
||||
"addAgeHeader": true,
|
||||
"enableCacheControlMaxAge": true,
|
||||
"disablePolicyRefs": false,
|
||||
"purgeIsOn": false,
|
||||
"purgeKey": "",
|
||||
"stale": null,
|
||||
"cacheRefs": [
|
||||
{
|
||||
"id": 0,
|
||||
"isOn": true,
|
||||
"key": "${scheme}://${host}${requestPath}${isArgs}${args}",
|
||||
"life": {"count": 2, "unit": "hour"},
|
||||
"status": [200],
|
||||
"maxSize": {"count": 32, "unit": "mb"},
|
||||
"minSize": {"count": 0, "unit": "kb"},
|
||||
"skipCacheControlValues": ["private", "no-cache", "no-store"],
|
||||
"skipSetCookie": true,
|
||||
"enableRequestCachePragma": false,
|
||||
"conds": {
|
||||
"isOn": true,
|
||||
"connector": "or",
|
||||
"groups": [
|
||||
{
|
||||
"isOn": true,
|
||||
"connector": "and",
|
||||
"conds": [
|
||||
{
|
||||
"type": "url-extension",
|
||||
"isRequest": true,
|
||||
"param": "${requestPathLowerExtension}",
|
||||
"operator": "in",
|
||||
"value": "[\".css\",\".png\",\".js\",\".woff2\"]",
|
||||
"isReverse": false,
|
||||
"isCaseInsensitive": false,
|
||||
"typeName": "URL扩展名"
|
||||
}
|
||||
],
|
||||
"isReverse": false,
|
||||
"description": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"allowChunkedEncoding": true,
|
||||
"allowPartialContent": false,
|
||||
"isReverse": false,
|
||||
"methods": []
|
||||
}
|
||||
]
|
||||
}
|
||||
~~~
|
||||
91
pkg/rpc/jsons/http_cache_ref.md
Normal file
91
pkg/rpc/jsons/http_cache_ref.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# 缓存条件设置
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isOn": "是否启用配置",
|
||||
"key": "每个缓存的Key规则,里面可以有变量",
|
||||
"life": "缓存时长",
|
||||
"expiresTime": "客户端过期时间",
|
||||
"status": ["缓存的状态码1", "缓存的状态码2", ...],
|
||||
"minSize": "能够缓存的最小尺寸",
|
||||
"maxSize": "能够缓存的最大尺寸",
|
||||
"methods": ["支持的请求方法1", "支持的请求方法2", ...],
|
||||
"skipCacheControlValues": "可以跳过的响应的Cache-Control值",
|
||||
"skipSetCookie": "是否跳过响应的Set-Cookie Header",
|
||||
"enableRequestCachePragma": "是否支持客户端的Pragma: no-cache",
|
||||
"allowChunkedEncoding": "是否允许分片内容",
|
||||
"allowPartialContent": "支持分段内容缓存",
|
||||
"conds": "请求条件",
|
||||
"isReverse": "是否为反向条件,反向条件的不缓存"
|
||||
}
|
||||
~~~
|
||||
|
||||
## 示例
|
||||
~~~json
|
||||
{
|
||||
"isOn": true,
|
||||
"key": "${scheme}://${host}${requestURI}",
|
||||
"life": {
|
||||
"count": 1,
|
||||
"unit": "day"
|
||||
},
|
||||
"expiresTime": {
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"overwrite": true,
|
||||
"autoCalculate": false,
|
||||
"duration": {
|
||||
"count": 1,
|
||||
"unit": "day"
|
||||
}
|
||||
},
|
||||
"status": [
|
||||
200
|
||||
],
|
||||
"minSize": {
|
||||
"count": 0,
|
||||
"unit": "kb"
|
||||
},
|
||||
"maxSize": {
|
||||
"count": 32,
|
||||
"unit": "mb"
|
||||
},
|
||||
"methods": [],
|
||||
"skipCacheControlValues": [
|
||||
"private",
|
||||
"no-cache",
|
||||
"no-store"
|
||||
],
|
||||
"skipSetCookie": true,
|
||||
"enableRequestCachePragma": false,
|
||||
"allowChunkedEncoding": true,
|
||||
"allowPartialContent": false,
|
||||
"conds": {
|
||||
"isOn": true,
|
||||
"connector": "or",
|
||||
"groups": [
|
||||
{
|
||||
"isOn": true,
|
||||
"connector": "and",
|
||||
"conds": [
|
||||
{
|
||||
"type": "url-extension",
|
||||
"isRequest": true,
|
||||
"param": "${requestPathLowerExtension}",
|
||||
"operator": "in",
|
||||
"value": "[\".css\",\".png\",\".js\",\".woff2\"]",
|
||||
"isReverse": false,
|
||||
"isCaseInsensitive": false,
|
||||
"typeName": "URL扩展名"
|
||||
}
|
||||
],
|
||||
"isReverse": false,
|
||||
"description": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"cachePolicy": null,
|
||||
"isReverse": false,
|
||||
"id": 1
|
||||
}
|
||||
~~~
|
||||
18
pkg/rpc/jsons/http_firewall_ref.md
Normal file
18
pkg/rpc/jsons/http_firewall_ref.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# HTTP防火墙(即WAF)引用
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": "是否覆盖上级配置",
|
||||
"isOn": "是否启用配置",
|
||||
"firewallPolicyId": "WAF策略ID"
|
||||
}
|
||||
~~~
|
||||
|
||||
## 示例
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"firewallPolicyId": 123
|
||||
}
|
||||
~~~
|
||||
31
pkg/rpc/jsons/http_remote_addr_config.md
Normal file
31
pkg/rpc/jsons/http_remote_addr_config.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# HTTP获取客户端IP地址方式配置
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": "是否覆盖父级应用",
|
||||
"isOn": "是否启用配置",
|
||||
"value": "自定义值变量",
|
||||
"isCustomized": "是否自定义"
|
||||
}
|
||||
~~~
|
||||
|
||||
## 示例
|
||||
### 不启用自定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": false,
|
||||
"isOn": false,
|
||||
"value": "",
|
||||
"isCustomized": false
|
||||
}
|
||||
~~~
|
||||
|
||||
### 启用自定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"value": "${remoteAddr}",
|
||||
"isCustomized": true
|
||||
}
|
||||
~~~
|
||||
16
pkg/rpc/jsons/http_stat_stat_ref.md
Normal file
16
pkg/rpc/jsons/http_stat_stat_ref.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# 统计引用
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": "是否覆盖父级配置",
|
||||
"isOn": "是否启用配置"
|
||||
}
|
||||
~~~
|
||||
|
||||
## 示例
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true
|
||||
}
|
||||
~~~
|
||||
21
pkg/rpc/jsons/http_websocket_ref.md
Normal file
21
pkg/rpc/jsons/http_websocket_ref.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# WebSocket引用
|
||||
|
||||
## 定义
|
||||
~~~json
|
||||
{
|
||||
"isPrior": "是否覆盖上级配置,true|false",
|
||||
"isOn": "是否启用,true|false",
|
||||
"websocketId": "Websocket配置ID"
|
||||
}
|
||||
~~~
|
||||
其中:
|
||||
* `Websocket配置ID` - 需要调用 `HTTPWebsocketService.CreateHTTPWebsocketRequest()` 生成
|
||||
|
||||
## 示例
|
||||
~~~json
|
||||
{
|
||||
"isPrior": true,
|
||||
"isOn": true,
|
||||
"websocketId": 123
|
||||
}
|
||||
~~~
|
||||
9
pkg/rpc/jsons/server_name.md
Normal file
9
pkg/rpc/jsons/server_name.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# 域名信息
|
||||
|
||||
## 示例
|
||||
~~~json
|
||||
{
|
||||
"name": "example.com",
|
||||
"type": "full"
|
||||
}
|
||||
~~~
|
||||
48
pkg/rpc/jsons/server_names.md
Normal file
48
pkg/rpc/jsons/server_names.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# 域名信息列表
|
||||
|
||||
## 定义
|
||||
~~~
|
||||
[ 域名信息1, 域名信息2, ... ]
|
||||
~~~
|
||||
其中 `域名信息N` 等是单个域名信息定义,具体请参考 {json:server_name}
|
||||
|
||||
## 示例
|
||||
### 示例1:单个域名
|
||||
~~~json
|
||||
[
|
||||
{
|
||||
"name": "example.com",
|
||||
"type": "full"
|
||||
}
|
||||
]
|
||||
~~~
|
||||
|
||||
### 示例2:多个域名
|
||||
~~~json
|
||||
[
|
||||
{
|
||||
"name": "example.com",
|
||||
"type": "full"
|
||||
},
|
||||
{
|
||||
"name": "google.com",
|
||||
"type": "full"
|
||||
},
|
||||
{
|
||||
"name": "facebook.com",
|
||||
"type": "full"
|
||||
}
|
||||
]
|
||||
~~~
|
||||
|
||||
### 示例3:域名合集
|
||||
域名合集效果跟多个域名是一样的,只不过在界面上以一个目录的形式呈现。
|
||||
~~~json
|
||||
[
|
||||
{
|
||||
"name": "",
|
||||
"type": "full",
|
||||
"subNames": ["example.com", "google.com", "facebook.com"]
|
||||
}
|
||||
]
|
||||
~~~
|
||||
18
pkg/rpc/jsons/ssl_cert_refs.md
Normal file
18
pkg/rpc/jsons/ssl_cert_refs.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# SSL证书引用
|
||||
|
||||
## 示例
|
||||
~~~
|
||||
[
|
||||
{
|
||||
"isOn": true,
|
||||
"certId": 12345
|
||||
},
|
||||
{
|
||||
"isOn": true,
|
||||
"certId": 12346
|
||||
}
|
||||
]
|
||||
~~~
|
||||
|
||||
其中:
|
||||
* `certId` - 证书的ID
|
||||
176
pkg/rpc/pb/model_ad_network.pb.go
Normal file
176
pkg/rpc/pb/model_ad_network.pb.go
Normal file
@@ -0,0 +1,176 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_ad_network.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
// 高防线路
|
||||
type ADNetwork struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
IsOn bool `protobuf:"varint,2,opt,name=isOn,proto3" json:"isOn,omitempty"`
|
||||
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
|
||||
Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ADNetwork) Reset() {
|
||||
*x = ADNetwork{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_ad_network_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ADNetwork) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ADNetwork) ProtoMessage() {}
|
||||
|
||||
func (x *ADNetwork) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_ad_network_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ADNetwork.ProtoReflect.Descriptor instead.
|
||||
func (*ADNetwork) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_ad_network_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ADNetwork) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADNetwork) GetIsOn() bool {
|
||||
if x != nil {
|
||||
return x.IsOn
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *ADNetwork) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ADNetwork) GetDescription() string {
|
||||
if x != nil {
|
||||
return x.Description
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_models_model_ad_network_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_ad_network_proto_rawDesc = []byte{
|
||||
0x0a, 0x1d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x64, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
|
||||
0x02, 0x70, 0x62, 0x22, 0x65, 0x0a, 0x09, 0x41, 0x44, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
|
||||
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,
|
||||
0x12, 0x12, 0x0a, 0x04, 0x69, 0x73, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04,
|
||||
0x69, 0x73, 0x4f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
|
||||
0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
|
||||
0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f,
|
||||
0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_ad_network_proto_rawDescOnce sync.Once
|
||||
file_models_model_ad_network_proto_rawDescData = file_models_model_ad_network_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_ad_network_proto_rawDescGZIP() []byte {
|
||||
file_models_model_ad_network_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_ad_network_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_ad_network_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_ad_network_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_ad_network_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_ad_network_proto_goTypes = []interface{}{
|
||||
(*ADNetwork)(nil), // 0: pb.ADNetwork
|
||||
}
|
||||
var file_models_model_ad_network_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_ad_network_proto_init() }
|
||||
func file_models_model_ad_network_proto_init() {
|
||||
if File_models_model_ad_network_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_ad_network_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ADNetwork); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_ad_network_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_ad_network_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_ad_network_proto_depIdxs,
|
||||
MessageInfos: file_models_model_ad_network_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_ad_network_proto = out.File
|
||||
file_models_model_ad_network_proto_rawDesc = nil
|
||||
file_models_model_ad_network_proto_goTypes = nil
|
||||
file_models_model_ad_network_proto_depIdxs = nil
|
||||
}
|
||||
250
pkg/rpc/pb/model_ad_package.pb.go
Normal file
250
pkg/rpc/pb/model_ad_package.pb.go
Normal file
@@ -0,0 +1,250 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_ad_package.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
// 高防产品
|
||||
type ADPackage struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
IsOn bool `protobuf:"varint,2,opt,name=isOn,proto3" json:"isOn,omitempty"`
|
||||
AdNetworkId int64 `protobuf:"varint,3,opt,name=adNetworkId,proto3" json:"adNetworkId,omitempty"`
|
||||
ProtectionBandwidthSize int32 `protobuf:"varint,4,opt,name=protectionBandwidthSize,proto3" json:"protectionBandwidthSize,omitempty"`
|
||||
ProtectionBandwidthUnit string `protobuf:"bytes,5,opt,name=protectionBandwidthUnit,proto3" json:"protectionBandwidthUnit,omitempty"`
|
||||
ServerBandwidthSize int32 `protobuf:"varint,6,opt,name=serverBandwidthSize,proto3" json:"serverBandwidthSize,omitempty"`
|
||||
ServerBandwidthUnit string `protobuf:"bytes,7,opt,name=serverBandwidthUnit,proto3" json:"serverBandwidthUnit,omitempty"`
|
||||
AdNetwork *ADNetwork `protobuf:"bytes,30,opt,name=adNetwork,proto3" json:"adNetwork,omitempty"`
|
||||
Summary string `protobuf:"bytes,31,opt,name=summary,proto3" json:"summary,omitempty"` // 概述
|
||||
CountIdleADPackageInstances int64 `protobuf:"varint,32,opt,name=countIdleADPackageInstances,proto3" json:"countIdleADPackageInstances,omitempty"` // 剩余可用的实例数,只有在获取可用高防产品的时候才会返回
|
||||
}
|
||||
|
||||
func (x *ADPackage) Reset() {
|
||||
*x = ADPackage{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_ad_package_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ADPackage) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ADPackage) ProtoMessage() {}
|
||||
|
||||
func (x *ADPackage) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_ad_package_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ADPackage.ProtoReflect.Descriptor instead.
|
||||
func (*ADPackage) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_ad_package_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetIsOn() bool {
|
||||
if x != nil {
|
||||
return x.IsOn
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetAdNetworkId() int64 {
|
||||
if x != nil {
|
||||
return x.AdNetworkId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetProtectionBandwidthSize() int32 {
|
||||
if x != nil {
|
||||
return x.ProtectionBandwidthSize
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetProtectionBandwidthUnit() string {
|
||||
if x != nil {
|
||||
return x.ProtectionBandwidthUnit
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetServerBandwidthSize() int32 {
|
||||
if x != nil {
|
||||
return x.ServerBandwidthSize
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetServerBandwidthUnit() string {
|
||||
if x != nil {
|
||||
return x.ServerBandwidthUnit
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetAdNetwork() *ADNetwork {
|
||||
if x != nil {
|
||||
return x.AdNetwork
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetSummary() string {
|
||||
if x != nil {
|
||||
return x.Summary
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ADPackage) GetCountIdleADPackageInstances() int64 {
|
||||
if x != nil {
|
||||
return x.CountIdleADPackageInstances
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_ad_package_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_ad_package_proto_rawDesc = []byte{
|
||||
0x0a, 0x1d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
|
||||
0x02, 0x70, 0x62, 0x1a, 0x1d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65,
|
||||
0x6c, 0x5f, 0x61, 0x64, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x22, 0xb2, 0x03, 0x0a, 0x09, 0x41, 0x44, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
|
||||
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64,
|
||||
0x12, 0x12, 0x0a, 0x04, 0x69, 0x73, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04,
|
||||
0x69, 0x73, 0x4f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,
|
||||
0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x61, 0x64, 0x4e, 0x65, 0x74,
|
||||
0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x53, 0x69, 0x7a,
|
||||
0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x53, 0x69, 0x7a, 0x65,
|
||||
0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61,
|
||||
0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6e,
|
||||
0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x73, 0x65,
|
||||
0x72, 0x76, 0x65, 0x72, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x53, 0x69, 0x7a,
|
||||
0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42,
|
||||
0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x13,
|
||||
0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x55,
|
||||
0x6e, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65,
|
||||
0x72, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x2b,
|
||||
0x0a, 0x09, 0x61, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x1e, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x44, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
|
||||
0x52, 0x09, 0x61, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x73,
|
||||
0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75,
|
||||
0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x40, 0x0a, 0x1b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64,
|
||||
0x6c, 0x65, 0x41, 0x44, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61,
|
||||
0x6e, 0x63, 0x65, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, 0x63, 0x6f, 0x75, 0x6e,
|
||||
0x74, 0x49, 0x64, 0x6c, 0x65, 0x41, 0x44, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e,
|
||||
0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62,
|
||||
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_ad_package_proto_rawDescOnce sync.Once
|
||||
file_models_model_ad_package_proto_rawDescData = file_models_model_ad_package_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_ad_package_proto_rawDescGZIP() []byte {
|
||||
file_models_model_ad_package_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_ad_package_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_ad_package_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_ad_package_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_ad_package_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_ad_package_proto_goTypes = []interface{}{
|
||||
(*ADPackage)(nil), // 0: pb.ADPackage
|
||||
(*ADNetwork)(nil), // 1: pb.ADNetwork
|
||||
}
|
||||
var file_models_model_ad_package_proto_depIdxs = []int32{
|
||||
1, // 0: pb.ADPackage.adNetwork:type_name -> pb.ADNetwork
|
||||
1, // [1:1] is the sub-list for method output_type
|
||||
1, // [1:1] is the sub-list for method input_type
|
||||
1, // [1:1] is the sub-list for extension type_name
|
||||
1, // [1:1] is the sub-list for extension extendee
|
||||
0, // [0:1] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_ad_package_proto_init() }
|
||||
func file_models_model_ad_package_proto_init() {
|
||||
if File_models_model_ad_package_proto != nil {
|
||||
return
|
||||
}
|
||||
file_models_model_ad_network_proto_init()
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_ad_package_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ADPackage); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_ad_package_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_ad_package_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_ad_package_proto_depIdxs,
|
||||
MessageInfos: file_models_model_ad_package_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_ad_package_proto = out.File
|
||||
file_models_model_ad_package_proto_rawDesc = nil
|
||||
file_models_model_ad_package_proto_goTypes = nil
|
||||
file_models_model_ad_package_proto_depIdxs = nil
|
||||
}
|
||||
274
pkg/rpc/pb/model_ad_package_instance.pb.go
Normal file
274
pkg/rpc/pb/model_ad_package_instance.pb.go
Normal file
@@ -0,0 +1,274 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_ad_package_instance.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
// 高防产品实例
|
||||
type ADPackageInstance struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
IsOn bool `protobuf:"varint,2,opt,name=isOn,proto3" json:"isOn,omitempty"`
|
||||
AdPackageId int64 `protobuf:"varint,3,opt,name=adPackageId,proto3" json:"adPackageId,omitempty"`
|
||||
NodeClusterId int64 `protobuf:"varint,4,opt,name=nodeClusterId,proto3" json:"nodeClusterId,omitempty"`
|
||||
NodeIds []int64 `protobuf:"varint,5,rep,packed,name=nodeIds,proto3" json:"nodeIds,omitempty"`
|
||||
IpAddresses []string `protobuf:"bytes,6,rep,name=ipAddresses,proto3" json:"ipAddresses,omitempty"`
|
||||
UserId int64 `protobuf:"varint,7,opt,name=userId,proto3" json:"userId,omitempty"` // 租用用户ID
|
||||
UserDayTo string `protobuf:"bytes,8,opt,name=userDayTo,proto3" json:"userDayTo,omitempty"` // 租用日期
|
||||
UserInstanceId int64 `protobuf:"varint,9,opt,name=userInstanceId,proto3" json:"userInstanceId,omitempty"` // 当前绑定的用户实例ID
|
||||
NodeCluster *NodeCluster `protobuf:"bytes,30,opt,name=nodeCluster,proto3" json:"nodeCluster,omitempty"`
|
||||
AdPackage *ADPackage `protobuf:"bytes,31,opt,name=adPackage,proto3" json:"adPackage,omitempty"`
|
||||
User *User `protobuf:"bytes,32,opt,name=user,proto3" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) Reset() {
|
||||
*x = ADPackageInstance{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_ad_package_instance_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ADPackageInstance) ProtoMessage() {}
|
||||
|
||||
func (x *ADPackageInstance) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_ad_package_instance_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ADPackageInstance.ProtoReflect.Descriptor instead.
|
||||
func (*ADPackageInstance) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_ad_package_instance_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetIsOn() bool {
|
||||
if x != nil {
|
||||
return x.IsOn
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetAdPackageId() int64 {
|
||||
if x != nil {
|
||||
return x.AdPackageId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetNodeClusterId() int64 {
|
||||
if x != nil {
|
||||
return x.NodeClusterId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetNodeIds() []int64 {
|
||||
if x != nil {
|
||||
return x.NodeIds
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetIpAddresses() []string {
|
||||
if x != nil {
|
||||
return x.IpAddresses
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetUserId() int64 {
|
||||
if x != nil {
|
||||
return x.UserId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetUserDayTo() string {
|
||||
if x != nil {
|
||||
return x.UserDayTo
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetUserInstanceId() int64 {
|
||||
if x != nil {
|
||||
return x.UserInstanceId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetNodeCluster() *NodeCluster {
|
||||
if x != nil {
|
||||
return x.NodeCluster
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetAdPackage() *ADPackage {
|
||||
if x != nil {
|
||||
return x.AdPackage
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ADPackageInstance) GetUser() *User {
|
||||
if x != nil {
|
||||
return x.User
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_models_model_ad_package_instance_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_ad_package_instance_proto_rawDesc = []byte{
|
||||
0x0a, 0x26, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e,
|
||||
0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x1f, 0x6d, 0x6f,
|
||||
0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f,
|
||||
0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x6d,
|
||||
0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61, 0x64, 0x5f, 0x70,
|
||||
0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x6d, 0x6f,
|
||||
0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x2e,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x03, 0x0a, 0x11, 0x41, 0x44, 0x50, 0x61, 0x63, 0x6b,
|
||||
0x61, 0x67, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
|
||||
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69,
|
||||
0x73, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x73, 0x4f, 0x6e, 0x12,
|
||||
0x20, 0x0a, 0x0b, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x18, 0x03,
|
||||
0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49,
|
||||
0x64, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
|
||||
0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c,
|
||||
0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x49,
|
||||
0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64,
|
||||
0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73,
|
||||
0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
|
||||
0x73, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x07, 0x20,
|
||||
0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x75,
|
||||
0x73, 0x65, 0x72, 0x44, 0x61, 0x79, 0x54, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
|
||||
0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x79, 0x54, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x75, 0x73, 0x65,
|
||||
0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49,
|
||||
0x64, 0x12, 0x31, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
|
||||
0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65,
|
||||
0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x75,
|
||||
0x73, 0x74, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67,
|
||||
0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x44, 0x50,
|
||||
0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x09, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67,
|
||||
0x65, 0x12, 0x1c, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||
0x08, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x42,
|
||||
0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_ad_package_instance_proto_rawDescOnce sync.Once
|
||||
file_models_model_ad_package_instance_proto_rawDescData = file_models_model_ad_package_instance_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_ad_package_instance_proto_rawDescGZIP() []byte {
|
||||
file_models_model_ad_package_instance_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_ad_package_instance_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_ad_package_instance_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_ad_package_instance_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_ad_package_instance_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_ad_package_instance_proto_goTypes = []interface{}{
|
||||
(*ADPackageInstance)(nil), // 0: pb.ADPackageInstance
|
||||
(*NodeCluster)(nil), // 1: pb.NodeCluster
|
||||
(*ADPackage)(nil), // 2: pb.ADPackage
|
||||
(*User)(nil), // 3: pb.User
|
||||
}
|
||||
var file_models_model_ad_package_instance_proto_depIdxs = []int32{
|
||||
1, // 0: pb.ADPackageInstance.nodeCluster:type_name -> pb.NodeCluster
|
||||
2, // 1: pb.ADPackageInstance.adPackage:type_name -> pb.ADPackage
|
||||
3, // 2: pb.ADPackageInstance.user:type_name -> pb.User
|
||||
3, // [3:3] is the sub-list for method output_type
|
||||
3, // [3:3] is the sub-list for method input_type
|
||||
3, // [3:3] is the sub-list for extension type_name
|
||||
3, // [3:3] is the sub-list for extension extendee
|
||||
0, // [0:3] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_ad_package_instance_proto_init() }
|
||||
func file_models_model_ad_package_instance_proto_init() {
|
||||
if File_models_model_ad_package_instance_proto != nil {
|
||||
return
|
||||
}
|
||||
file_models_model_node_cluster_proto_init()
|
||||
file_models_model_ad_package_proto_init()
|
||||
file_models_model_user_proto_init()
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_ad_package_instance_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ADPackageInstance); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_ad_package_instance_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_ad_package_instance_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_ad_package_instance_proto_depIdxs,
|
||||
MessageInfos: file_models_model_ad_package_instance_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_ad_package_instance_proto = out.File
|
||||
file_models_model_ad_package_instance_proto_rawDesc = nil
|
||||
file_models_model_ad_package_instance_proto_goTypes = nil
|
||||
file_models_model_ad_package_instance_proto_depIdxs = nil
|
||||
}
|
||||
186
pkg/rpc/pb/model_ad_package_period.pb.go
Normal file
186
pkg/rpc/pb/model_ad_package_period.pb.go
Normal file
@@ -0,0 +1,186 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_ad_package_period.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
// 高防实例有效期
|
||||
type ADPackagePeriod struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
IsOn bool `protobuf:"varint,2,opt,name=isOn,proto3" json:"isOn,omitempty"`
|
||||
Count int32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"`
|
||||
Unit string `protobuf:"bytes,4,opt,name=unit,proto3" json:"unit,omitempty"`
|
||||
Months int32 `protobuf:"varint,5,opt,name=months,proto3" json:"months,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) Reset() {
|
||||
*x = ADPackagePeriod{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_ad_package_period_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ADPackagePeriod) ProtoMessage() {}
|
||||
|
||||
func (x *ADPackagePeriod) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_ad_package_period_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ADPackagePeriod.ProtoReflect.Descriptor instead.
|
||||
func (*ADPackagePeriod) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_ad_package_period_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) GetIsOn() bool {
|
||||
if x != nil {
|
||||
return x.IsOn
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) GetCount() int32 {
|
||||
if x != nil {
|
||||
return x.Count
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) GetUnit() string {
|
||||
if x != nil {
|
||||
return x.Unit
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ADPackagePeriod) GetMonths() int32 {
|
||||
if x != nil {
|
||||
return x.Months
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_ad_package_period_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_ad_package_period_proto_rawDesc = []byte{
|
||||
0x0a, 0x24, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64,
|
||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x77, 0x0a, 0x0f, 0x41, 0x44,
|
||||
0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x0e, 0x0a,
|
||||
0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,
|
||||
0x04, 0x69, 0x73, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x73, 0x4f,
|
||||
0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
|
||||
0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18,
|
||||
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d,
|
||||
0x6f, 0x6e, 0x74, 0x68, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x6f, 0x6e,
|
||||
0x74, 0x68, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_ad_package_period_proto_rawDescOnce sync.Once
|
||||
file_models_model_ad_package_period_proto_rawDescData = file_models_model_ad_package_period_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_ad_package_period_proto_rawDescGZIP() []byte {
|
||||
file_models_model_ad_package_period_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_ad_package_period_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_ad_package_period_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_ad_package_period_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_ad_package_period_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_ad_package_period_proto_goTypes = []interface{}{
|
||||
(*ADPackagePeriod)(nil), // 0: pb.ADPackagePeriod
|
||||
}
|
||||
var file_models_model_ad_package_period_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_ad_package_period_proto_init() }
|
||||
func file_models_model_ad_package_period_proto_init() {
|
||||
if File_models_model_ad_package_period_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_ad_package_period_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ADPackagePeriod); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_ad_package_period_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_ad_package_period_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_ad_package_period_proto_depIdxs,
|
||||
MessageInfos: file_models_model_ad_package_period_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_ad_package_period_proto = out.File
|
||||
file_models_model_ad_package_period_proto_rawDesc = nil
|
||||
file_models_model_ad_package_period_proto_goTypes = nil
|
||||
file_models_model_ad_package_period_proto_depIdxs = nil
|
||||
}
|
||||
170
pkg/rpc/pb/model_ad_package_price.pb.go
Normal file
170
pkg/rpc/pb/model_ad_package_price.pb.go
Normal file
@@ -0,0 +1,170 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_ad_package_price.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
// 高防产品价格定义
|
||||
type ADPackagePrice struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
AdPackageId int64 `protobuf:"varint,1,opt,name=adPackageId,proto3" json:"adPackageId,omitempty"`
|
||||
AdPackagePeriodId int64 `protobuf:"varint,2,opt,name=adPackagePeriodId,proto3" json:"adPackagePeriodId,omitempty"`
|
||||
Price float64 `protobuf:"fixed64,3,opt,name=price,proto3" json:"price,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ADPackagePrice) Reset() {
|
||||
*x = ADPackagePrice{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_ad_package_price_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ADPackagePrice) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ADPackagePrice) ProtoMessage() {}
|
||||
|
||||
func (x *ADPackagePrice) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_ad_package_price_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ADPackagePrice.ProtoReflect.Descriptor instead.
|
||||
func (*ADPackagePrice) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_ad_package_price_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ADPackagePrice) GetAdPackageId() int64 {
|
||||
if x != nil {
|
||||
return x.AdPackageId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackagePrice) GetAdPackagePeriodId() int64 {
|
||||
if x != nil {
|
||||
return x.AdPackagePeriodId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ADPackagePrice) GetPrice() float64 {
|
||||
if x != nil {
|
||||
return x.Price
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_ad_package_price_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_ad_package_price_proto_rawDesc = []byte{
|
||||
0x0a, 0x23, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x76, 0x0a, 0x0e, 0x41, 0x44, 0x50,
|
||||
0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61,
|
||||
0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
|
||||
0x52, 0x0b, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a,
|
||||
0x11, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64,
|
||||
0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b,
|
||||
0x61, 0x67, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70,
|
||||
0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63,
|
||||
0x65, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_ad_package_price_proto_rawDescOnce sync.Once
|
||||
file_models_model_ad_package_price_proto_rawDescData = file_models_model_ad_package_price_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_ad_package_price_proto_rawDescGZIP() []byte {
|
||||
file_models_model_ad_package_price_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_ad_package_price_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_ad_package_price_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_ad_package_price_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_ad_package_price_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_ad_package_price_proto_goTypes = []interface{}{
|
||||
(*ADPackagePrice)(nil), // 0: pb.ADPackagePrice
|
||||
}
|
||||
var file_models_model_ad_package_price_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_ad_package_price_proto_init() }
|
||||
func file_models_model_ad_package_price_proto_init() {
|
||||
if File_models_model_ad_package_price_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_ad_package_price_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ADPackagePrice); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_ad_package_price_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_ad_package_price_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_ad_package_price_proto_depIdxs,
|
||||
MessageInfos: file_models_model_ad_package_price_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_ad_package_price_proto = out.File
|
||||
file_models_model_ad_package_price_proto_rawDesc = nil
|
||||
file_models_model_ad_package_price_proto_goTypes = nil
|
||||
file_models_model_ad_package_price_proto_depIdxs = nil
|
||||
}
|
||||
@@ -45,7 +45,9 @@ type APINode struct {
|
||||
AccessAddrsJSON []byte `protobuf:"bytes,10,opt,name=accessAddrsJSON,proto3" json:"accessAddrsJSON,omitempty"`
|
||||
AccessAddrs []string `protobuf:"bytes,11,rep,name=accessAddrs,proto3" json:"accessAddrs,omitempty"`
|
||||
StatusJSON []byte `protobuf:"bytes,12,opt,name=statusJSON,proto3" json:"statusJSON,omitempty"`
|
||||
IsPrimary bool `protobuf:"varint,16,opt,name=isPrimary,proto3" json:"isPrimary,omitempty"`
|
||||
Debug bool `protobuf:"varint,30,opt,name=debug,proto3" json:"debug,omitempty"`
|
||||
InstanceCode string `protobuf:"bytes,31,opt,name=instanceCode,proto3" json:"instanceCode,omitempty"`
|
||||
}
|
||||
|
||||
func (x *APINode) Reset() {
|
||||
@@ -185,6 +187,13 @@ func (x *APINode) GetStatusJSON() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *APINode) GetIsPrimary() bool {
|
||||
if x != nil {
|
||||
return x.IsPrimary
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *APINode) GetDebug() bool {
|
||||
if x != nil {
|
||||
return x.Debug
|
||||
@@ -192,12 +201,19 @@ func (x *APINode) GetDebug() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *APINode) GetInstanceCode() string {
|
||||
if x != nil {
|
||||
return x.InstanceCode
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_models_model_api_node_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_api_node_proto_rawDesc = []byte{
|
||||
0x0a, 0x1b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x70, 0x69, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70,
|
||||
0x62, 0x22, 0xdf, 0x03, 0x0a, 0x07, 0x41, 0x50, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a,
|
||||
0x62, 0x22, 0xa1, 0x04, 0x0a, 0x07, 0x41, 0x50, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a,
|
||||
0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a,
|
||||
0x04, 0x69, 0x73, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x73, 0x4f,
|
||||
0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
|
||||
@@ -225,10 +241,14 @@ var file_models_model_api_node_proto_rawDesc = []byte{
|
||||
0x63, 0x63, 0x65, 0x73, 0x73, 0x41, 0x64, 0x64, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09,
|
||||
0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x1e, 0x0a,
|
||||
0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0c, 0x20, 0x01, 0x28,
|
||||
0x0c, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x14, 0x0a,
|
||||
0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65,
|
||||
0x62, 0x75, 0x67, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x33,
|
||||
0x0c, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1c, 0x0a,
|
||||
0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08,
|
||||
0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x64,
|
||||
0x65, 0x62, 0x75, 0x67, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75,
|
||||
0x67, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x64,
|
||||
0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
|
||||
0x65, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
@@ -40,6 +40,8 @@ type AuthorityKey struct {
|
||||
Company string `protobuf:"bytes,7,opt,name=company,proto3" json:"company,omitempty"`
|
||||
Nodes int32 `protobuf:"varint,8,opt,name=nodes,proto3" json:"nodes,omitempty"`
|
||||
Components []string `protobuf:"bytes,9,rep,name=components,proto3" json:"components,omitempty"`
|
||||
Edition string `protobuf:"bytes,10,opt,name=edition,proto3" json:"edition,omitempty"`
|
||||
RequestCode string `protobuf:"bytes,11,opt,name=requestCode,proto3" json:"requestCode,omitempty"`
|
||||
}
|
||||
|
||||
func (x *AuthorityKey) Reset() {
|
||||
@@ -137,12 +139,26 @@ func (x *AuthorityKey) GetComponents() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *AuthorityKey) GetEdition() string {
|
||||
if x != nil {
|
||||
return x.Edition
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *AuthorityKey) GetRequestCode() string {
|
||||
if x != nil {
|
||||
return x.RequestCode
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_models_model_authority_key_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_authority_key_proto_rawDesc = []byte{
|
||||
0x0a, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x61,
|
||||
0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x82, 0x02, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x6f,
|
||||
0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xbe, 0x02, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x6f,
|
||||
0x72, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a,
|
||||
0x07, 0x64, 0x61, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
|
||||
@@ -158,8 +174,12 @@ var file_models_model_authority_key_proto_rawDesc = []byte{
|
||||
0x6d, 0x70, 0x61, 0x6e, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x08,
|
||||
0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63,
|
||||
0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52,
|
||||
0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e,
|
||||
0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65,
|
||||
0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x64,
|
||||
0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x43, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62,
|
||||
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
185
pkg/rpc/pb/model_client_agent.pb.go
Normal file
185
pkg/rpc/pb/model_client_agent.pb.go
Normal file
@@ -0,0 +1,185 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_client_agent.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type ClientAgent struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
|
||||
Code string `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"`
|
||||
Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
|
||||
CountIPs int64 `protobuf:"varint,5,opt,name=countIPs,proto3" json:"countIPs,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ClientAgent) Reset() {
|
||||
*x = ClientAgent{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_client_agent_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ClientAgent) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ClientAgent) ProtoMessage() {}
|
||||
|
||||
func (x *ClientAgent) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_client_agent_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ClientAgent.ProtoReflect.Descriptor instead.
|
||||
func (*ClientAgent) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_client_agent_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ClientAgent) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ClientAgent) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ClientAgent) GetCode() string {
|
||||
if x != nil {
|
||||
return x.Code
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ClientAgent) GetDescription() string {
|
||||
if x != nil {
|
||||
return x.Description
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ClientAgent) GetCountIPs() int64 {
|
||||
if x != nil {
|
||||
return x.CountIPs
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_client_agent_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_client_agent_proto_rawDesc = []byte{
|
||||
0x0a, 0x1f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63,
|
||||
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x83, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
|
||||
0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
|
||||
0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a,
|
||||
0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
|
||||
0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x50, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x08, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x50, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e,
|
||||
0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_client_agent_proto_rawDescOnce sync.Once
|
||||
file_models_model_client_agent_proto_rawDescData = file_models_model_client_agent_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_client_agent_proto_rawDescGZIP() []byte {
|
||||
file_models_model_client_agent_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_client_agent_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_client_agent_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_client_agent_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_client_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_client_agent_proto_goTypes = []interface{}{
|
||||
(*ClientAgent)(nil), // 0: pb.ClientAgent
|
||||
}
|
||||
var file_models_model_client_agent_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_client_agent_proto_init() }
|
||||
func file_models_model_client_agent_proto_init() {
|
||||
if File_models_model_client_agent_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_client_agent_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ClientAgent); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_client_agent_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_client_agent_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_client_agent_proto_depIdxs,
|
||||
MessageInfos: file_models_model_client_agent_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_client_agent_proto = out.File
|
||||
file_models_model_client_agent_proto_rawDesc = nil
|
||||
file_models_model_client_agent_proto_goTypes = nil
|
||||
file_models_model_client_agent_proto_depIdxs = nil
|
||||
}
|
||||
181
pkg/rpc/pb/model_client_agent_ip.pb.go
Normal file
181
pkg/rpc/pb/model_client_agent_ip.pb.go
Normal file
@@ -0,0 +1,181 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_client_agent_ip.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type ClientAgentIP struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Ip string `protobuf:"bytes,2,opt,name=ip,proto3" json:"ip,omitempty"`
|
||||
Ptr string `protobuf:"bytes,3,opt,name=ptr,proto3" json:"ptr,omitempty"`
|
||||
ClientAgent *ClientAgent `protobuf:"bytes,30,opt,name=clientAgent,proto3" json:"clientAgent,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ClientAgentIP) Reset() {
|
||||
*x = ClientAgentIP{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_client_agent_ip_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ClientAgentIP) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ClientAgentIP) ProtoMessage() {}
|
||||
|
||||
func (x *ClientAgentIP) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_client_agent_ip_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ClientAgentIP.ProtoReflect.Descriptor instead.
|
||||
func (*ClientAgentIP) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_client_agent_ip_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *ClientAgentIP) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ClientAgentIP) GetIp() string {
|
||||
if x != nil {
|
||||
return x.Ip
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ClientAgentIP) GetPtr() string {
|
||||
if x != nil {
|
||||
return x.Ptr
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *ClientAgentIP) GetClientAgent() *ClientAgent {
|
||||
if x != nil {
|
||||
return x.ClientAgent
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_models_model_client_agent_ip_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_client_agent_ip_proto_rawDesc = []byte{
|
||||
0x0a, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63,
|
||||
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x2e, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x1f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73,
|
||||
0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x67,
|
||||
0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x0d, 0x43, 0x6c, 0x69,
|
||||
0x65, 0x6e, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x74,
|
||||
0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x74, 0x72, 0x12, 0x31, 0x0a, 0x0b,
|
||||
0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x67, 0x65,
|
||||
0x6e, 0x74, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42,
|
||||
0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_client_agent_ip_proto_rawDescOnce sync.Once
|
||||
file_models_model_client_agent_ip_proto_rawDescData = file_models_model_client_agent_ip_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_client_agent_ip_proto_rawDescGZIP() []byte {
|
||||
file_models_model_client_agent_ip_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_client_agent_ip_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_client_agent_ip_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_client_agent_ip_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_client_agent_ip_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_client_agent_ip_proto_goTypes = []interface{}{
|
||||
(*ClientAgentIP)(nil), // 0: pb.ClientAgentIP
|
||||
(*ClientAgent)(nil), // 1: pb.ClientAgent
|
||||
}
|
||||
var file_models_model_client_agent_ip_proto_depIdxs = []int32{
|
||||
1, // 0: pb.ClientAgentIP.clientAgent:type_name -> pb.ClientAgent
|
||||
1, // [1:1] is the sub-list for method output_type
|
||||
1, // [1:1] is the sub-list for method input_type
|
||||
1, // [1:1] is the sub-list for extension type_name
|
||||
1, // [1:1] is the sub-list for extension extendee
|
||||
0, // [0:1] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_client_agent_ip_proto_init() }
|
||||
func file_models_model_client_agent_ip_proto_init() {
|
||||
if File_models_model_client_agent_ip_proto != nil {
|
||||
return
|
||||
}
|
||||
file_models_model_client_agent_proto_init()
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_client_agent_ip_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ClientAgentIP); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_client_agent_ip_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_client_agent_ip_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_client_agent_ip_proto_depIdxs,
|
||||
MessageInfos: file_models_model_client_agent_ip_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_client_agent_ip_proto = out.File
|
||||
file_models_model_client_agent_ip_proto_rawDesc = nil
|
||||
file_models_model_client_agent_ip_proto_goTypes = nil
|
||||
file_models_model_client_agent_ip_proto_depIdxs = nil
|
||||
}
|
||||
@@ -35,6 +35,8 @@ type File struct {
|
||||
Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"`
|
||||
CreatedAt int64 `protobuf:"varint,4,opt,name=createdAt,proto3" json:"createdAt,omitempty"`
|
||||
IsPublic bool `protobuf:"varint,5,opt,name=isPublic,proto3" json:"isPublic,omitempty"`
|
||||
MimeType string `protobuf:"bytes,6,opt,name=mimeType,proto3" json:"mimeType,omitempty"`
|
||||
Type string `protobuf:"bytes,7,opt,name=type,proto3" json:"type,omitempty"`
|
||||
}
|
||||
|
||||
func (x *File) Reset() {
|
||||
@@ -104,11 +106,25 @@ func (x *File) GetIsPublic() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *File) GetMimeType() string {
|
||||
if x != nil {
|
||||
return x.MimeType
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *File) GetType() string {
|
||||
if x != nil {
|
||||
return x.Type
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_models_model_file_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_file_proto_rawDesc = []byte{
|
||||
0x0a, 0x17, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x66,
|
||||
0x69, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x80, 0x01,
|
||||
0x69, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xb0, 0x01,
|
||||
0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61,
|
||||
0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61,
|
||||
@@ -117,6 +133,9 @@ var file_models_model_file_proto_rawDesc = []byte{
|
||||
0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
|
||||
0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
|
||||
0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04,
|
||||
0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,
|
||||
0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
|
||||
185
pkg/rpc/pb/model_formal_client_browser.pb.go
Normal file
185
pkg/rpc/pb/model_formal_client_browser.pb.go
Normal file
@@ -0,0 +1,185 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_formal_client_browser.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type FormalClientBrowser struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
|
||||
Codes []string `protobuf:"bytes,3,rep,name=codes,proto3" json:"codes,omitempty"`
|
||||
DataId string `protobuf:"bytes,4,opt,name=dataId,proto3" json:"dataId,omitempty"`
|
||||
State int32 `protobuf:"varint,5,opt,name=state,proto3" json:"state,omitempty"`
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) Reset() {
|
||||
*x = FormalClientBrowser{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_formal_client_browser_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*FormalClientBrowser) ProtoMessage() {}
|
||||
|
||||
func (x *FormalClientBrowser) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_formal_client_browser_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use FormalClientBrowser.ProtoReflect.Descriptor instead.
|
||||
func (*FormalClientBrowser) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_formal_client_browser_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) GetCodes() []string {
|
||||
if x != nil {
|
||||
return x.Codes
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) GetDataId() string {
|
||||
if x != nil {
|
||||
return x.DataId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *FormalClientBrowser) GetState() int32 {
|
||||
if x != nil {
|
||||
return x.State
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_formal_client_browser_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_formal_client_browser_proto_rawDesc = []byte{
|
||||
0x0a, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x66,
|
||||
0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x72, 0x6f,
|
||||
0x77, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x7d,
|
||||
0x0a, 0x13, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x72,
|
||||
0x6f, 0x77, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x64,
|
||||
0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x12,
|
||||
0x16, 0x0a, 0x06, 0x64, 0x61, 0x74, 0x61, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x06, 0x64, 0x61, 0x74, 0x61, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x06, 0x5a,
|
||||
0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_formal_client_browser_proto_rawDescOnce sync.Once
|
||||
file_models_model_formal_client_browser_proto_rawDescData = file_models_model_formal_client_browser_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_formal_client_browser_proto_rawDescGZIP() []byte {
|
||||
file_models_model_formal_client_browser_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_formal_client_browser_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_formal_client_browser_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_formal_client_browser_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_formal_client_browser_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_formal_client_browser_proto_goTypes = []interface{}{
|
||||
(*FormalClientBrowser)(nil), // 0: pb.FormalClientBrowser
|
||||
}
|
||||
var file_models_model_formal_client_browser_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_formal_client_browser_proto_init() }
|
||||
func file_models_model_formal_client_browser_proto_init() {
|
||||
if File_models_model_formal_client_browser_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_formal_client_browser_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*FormalClientBrowser); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_formal_client_browser_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_formal_client_browser_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_formal_client_browser_proto_depIdxs,
|
||||
MessageInfos: file_models_model_formal_client_browser_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_formal_client_browser_proto = out.File
|
||||
file_models_model_formal_client_browser_proto_rawDesc = nil
|
||||
file_models_model_formal_client_browser_proto_goTypes = nil
|
||||
file_models_model_formal_client_browser_proto_depIdxs = nil
|
||||
}
|
||||
185
pkg/rpc/pb/model_formal_client_system.pb.go
Normal file
185
pkg/rpc/pb/model_formal_client_system.pb.go
Normal file
@@ -0,0 +1,185 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_formal_client_system.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type FormalClientSystem struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
|
||||
Codes []string `protobuf:"bytes,3,rep,name=codes,proto3" json:"codes,omitempty"`
|
||||
DataId string `protobuf:"bytes,4,opt,name=dataId,proto3" json:"dataId,omitempty"`
|
||||
State int32 `protobuf:"varint,5,opt,name=state,proto3" json:"state,omitempty"`
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) Reset() {
|
||||
*x = FormalClientSystem{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_formal_client_system_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*FormalClientSystem) ProtoMessage() {}
|
||||
|
||||
func (x *FormalClientSystem) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_formal_client_system_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use FormalClientSystem.ProtoReflect.Descriptor instead.
|
||||
func (*FormalClientSystem) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_formal_client_system_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) GetCodes() []string {
|
||||
if x != nil {
|
||||
return x.Codes
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) GetDataId() string {
|
||||
if x != nil {
|
||||
return x.DataId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *FormalClientSystem) GetState() int32 {
|
||||
if x != nil {
|
||||
return x.State
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_formal_client_system_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_formal_client_system_proto_rawDesc = []byte{
|
||||
0x0a, 0x27, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x66,
|
||||
0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x79, 0x73,
|
||||
0x74, 0x65, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x7c, 0x0a,
|
||||
0x12, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x79, 0x73,
|
||||
0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||
0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x73,
|
||||
0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x16, 0x0a,
|
||||
0x06, 0x64, 0x61, 0x74, 0x61, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
|
||||
0x61, 0x74, 0x61, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05,
|
||||
0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x2e,
|
||||
0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_formal_client_system_proto_rawDescOnce sync.Once
|
||||
file_models_model_formal_client_system_proto_rawDescData = file_models_model_formal_client_system_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_formal_client_system_proto_rawDescGZIP() []byte {
|
||||
file_models_model_formal_client_system_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_formal_client_system_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_formal_client_system_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_formal_client_system_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_formal_client_system_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_formal_client_system_proto_goTypes = []interface{}{
|
||||
(*FormalClientSystem)(nil), // 0: pb.FormalClientSystem
|
||||
}
|
||||
var file_models_model_formal_client_system_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_formal_client_system_proto_init() }
|
||||
func file_models_model_formal_client_system_proto_init() {
|
||||
if File_models_model_formal_client_system_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_formal_client_system_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*FormalClientSystem); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_formal_client_system_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_formal_client_system_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_formal_client_system_proto_depIdxs,
|
||||
MessageInfos: file_models_model_formal_client_system_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_formal_client_system_proto = out.File
|
||||
file_models_model_formal_client_system_proto_rawDesc = nil
|
||||
file_models_model_formal_client_system_proto_goTypes = nil
|
||||
file_models_model_formal_client_system_proto_depIdxs = nil
|
||||
}
|
||||
@@ -72,8 +72,9 @@ type HTTPAccessLog struct {
|
||||
ServerPort int32 `protobuf:"varint,38,opt,name=serverPort,proto3" json:"serverPort,omitempty"`
|
||||
ServerProtocol string `protobuf:"bytes,39,opt,name=serverProtocol,proto3" json:"serverProtocol,omitempty"`
|
||||
Hostname string `protobuf:"bytes,40,opt,name=hostname,proto3" json:"hostname,omitempty"`
|
||||
// 代理相关
|
||||
// 源站相关
|
||||
OriginAddress string `protobuf:"bytes,41,opt,name=originAddress,proto3" json:"originAddress,omitempty"`
|
||||
OriginStatus int32 `protobuf:"varint,52,opt,name=originStatus,proto3" json:"originStatus,omitempty"`
|
||||
// 错误信息
|
||||
Errors []string `protobuf:"bytes,42,rep,name=errors,proto3" json:"errors,omitempty"`
|
||||
// 扩展
|
||||
@@ -415,6 +416,13 @@ func (x *HTTPAccessLog) GetOriginAddress() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPAccessLog) GetOriginStatus() int32 {
|
||||
if x != nil {
|
||||
return x.OriginStatus
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPAccessLog) GetErrors() []string {
|
||||
if x != nil {
|
||||
return x.Errors
|
||||
@@ -532,7 +540,7 @@ var file_models_model_http_access_log_proto_rawDesc = []byte{
|
||||
0x74, 0x74, 0x70, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x2e, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x17, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73,
|
||||
0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x22, 0xdd, 0x0f, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73,
|
||||
0x6f, 0x22, 0x81, 0x10, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73,
|
||||
0x4c, 0x6f, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64,
|
||||
0x18, 0x30, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,
|
||||
0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20,
|
||||
@@ -619,49 +627,51 @@ var file_models_model_http_access_log_proto_rawDesc = []byte{
|
||||
0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f,
|
||||
0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e,
|
||||
0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f,
|
||||
0x72, 0x69, 0x67, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06,
|
||||
0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x2a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72,
|
||||
0x72, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x2b, 0x20,
|
||||
0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x41, 0x63, 0x63,
|
||||
0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72,
|
||||
0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x65,
|
||||
0x77, 0x61, 0x6c, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x18, 0x2c, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x10, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x50, 0x6f, 0x6c, 0x69,
|
||||
0x63, 0x79, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c,
|
||||
0x52, 0x75, 0x6c, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x13, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x47,
|
||||
0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61,
|
||||
0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x18, 0x2e, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x11, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x53,
|
||||
0x65, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c,
|
||||
0x52, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x66, 0x69,
|
||||
0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f,
|
||||
0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
|
||||
0x31, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x41,
|
||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x32,
|
||||
0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x6f,
|
||||
0x64, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f,
|
||||
0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x1a, 0x4a, 0x0a, 0x0f, 0x53, 0x65, 0x6e, 0x74,
|
||||
0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
|
||||
0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a,
|
||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70,
|
||||
0x62, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
||||
0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x45, 0x6e,
|
||||
0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,
|
||||
0x46, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
|
||||
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
|
||||
0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||
0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x05, 0x76, 0x61,
|
||||
0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x38, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x73,
|
||||
0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
|
||||
0x01, 0x22, 0x21, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06,
|
||||
0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61,
|
||||
0x6c, 0x75, 0x65, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72,
|
||||
0x6f, 0x74, 0x6f, 0x33,
|
||||
0x72, 0x69, 0x67, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x0c,
|
||||
0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x34, 0x20, 0x01,
|
||||
0x28, 0x05, 0x52, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
|
||||
0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x2a, 0x20, 0x03, 0x28, 0x09,
|
||||
0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72,
|
||||
0x73, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54,
|
||||
0x50, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x73,
|
||||
0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x10,
|
||||
0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64,
|
||||
0x18, 0x2c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c,
|
||||
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x65,
|
||||
0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18,
|
||||
0x2d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52,
|
||||
0x75, 0x6c, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69,
|
||||
0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x18,
|
||||
0x2e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52,
|
||||
0x75, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x66, 0x69, 0x72, 0x65,
|
||||
0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x03,
|
||||
0x52, 0x0e, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x49, 0x64,
|
||||
0x12, 0x28, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x41, 0x63, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x73, 0x18, 0x31, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x69, 0x72, 0x65, 0x77,
|
||||
0x61, 0x6c, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61,
|
||||
0x67, 0x73, 0x18, 0x32, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1c,
|
||||
0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70,
|
||||
0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x1a, 0x4a, 0x0a, 0x0f,
|
||||
0x53, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
|
||||
0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
|
||||
0x79, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x05, 0x76,
|
||||
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6f, 0x6b,
|
||||
0x69, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
|
||||
0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
|
||||
0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74,
|
||||
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,
|
||||
0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x38, 0x0a, 0x0a, 0x41,
|
||||
0x74, 0x74, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
|
||||
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
|
||||
0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,
|
||||
0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
|
||||
0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62,
|
||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
@@ -30,13 +30,14 @@ type HTTPAccessLogPolicy struct {
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
|
||||
IsOn bool `protobuf:"varint,3,opt,name=isOn,proto3" json:"isOn,omitempty"`
|
||||
Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`
|
||||
OptionsJSON []byte `protobuf:"bytes,5,opt,name=optionsJSON,proto3" json:"optionsJSON,omitempty"`
|
||||
CondsJSON []byte `protobuf:"bytes,6,opt,name=condsJSON,proto3" json:"condsJSON,omitempty"`
|
||||
IsPublic bool `protobuf:"varint,7,opt,name=isPublic,proto3" json:"isPublic,omitempty"`
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
|
||||
IsOn bool `protobuf:"varint,3,opt,name=isOn,proto3" json:"isOn,omitempty"`
|
||||
Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`
|
||||
OptionsJSON []byte `protobuf:"bytes,5,opt,name=optionsJSON,proto3" json:"optionsJSON,omitempty"`
|
||||
CondsJSON []byte `protobuf:"bytes,6,opt,name=condsJSON,proto3" json:"condsJSON,omitempty"`
|
||||
IsPublic bool `protobuf:"varint,7,opt,name=isPublic,proto3" json:"isPublic,omitempty"`
|
||||
FirewallOnly bool `protobuf:"varint,8,opt,name=firewallOnly,proto3" json:"firewallOnly,omitempty"`
|
||||
}
|
||||
|
||||
func (x *HTTPAccessLogPolicy) Reset() {
|
||||
@@ -120,13 +121,20 @@ func (x *HTTPAccessLogPolicy) GetIsPublic() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *HTTPAccessLogPolicy) GetFirewallOnly() bool {
|
||||
if x != nil {
|
||||
return x.FirewallOnly
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
var File_models_model_http_access_log_policy_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_http_access_log_policy_proto_rawDesc = []byte{
|
||||
0x0a, 0x29, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x68,
|
||||
0x74, 0x74, 0x70, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70,
|
||||
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22,
|
||||
0xbd, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f,
|
||||
0xe1, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f,
|
||||
0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69,
|
||||
@@ -137,8 +145,11 @@ var file_models_model_http_access_log_policy_proto_rawDesc = []byte{
|
||||
0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4a, 0x53,
|
||||
0x4f, 0x4e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4a,
|
||||
0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18,
|
||||
0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x42,
|
||||
0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12,
|
||||
0x22, 0x0a, 0x0c, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x4f, 0x6e, 0x6c, 0x79, 0x18,
|
||||
0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6c, 0x6c, 0x4f,
|
||||
0x6e, 0x6c, 0x79, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
256
pkg/rpc/pb/model_http_cache_task.pb.go
Normal file
256
pkg/rpc/pb/model_http_cache_task.pb.go
Normal file
@@ -0,0 +1,256 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_http_cache_task.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type HTTPCacheTask struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
UserId int64 `protobuf:"varint,2,opt,name=userId,proto3" json:"userId,omitempty"`
|
||||
Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
|
||||
KeyType string `protobuf:"bytes,4,opt,name=keyType,proto3" json:"keyType,omitempty"`
|
||||
CreatedAt int64 `protobuf:"varint,5,opt,name=createdAt,proto3" json:"createdAt,omitempty"`
|
||||
DoneAt int64 `protobuf:"varint,6,opt,name=doneAt,proto3" json:"doneAt,omitempty"`
|
||||
IsDone bool `protobuf:"varint,7,opt,name=isDone,proto3" json:"isDone,omitempty"`
|
||||
IsOk bool `protobuf:"varint,8,opt,name=isOk,proto3" json:"isOk,omitempty"`
|
||||
Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description,omitempty"`
|
||||
User *User `protobuf:"bytes,30,opt,name=user,proto3" json:"user,omitempty"`
|
||||
HttpCacheTaskKeys []*HTTPCacheTaskKey `protobuf:"bytes,31,rep,name=httpCacheTaskKeys,proto3" json:"httpCacheTaskKeys,omitempty"`
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) Reset() {
|
||||
*x = HTTPCacheTask{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_http_cache_task_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*HTTPCacheTask) ProtoMessage() {}
|
||||
|
||||
func (x *HTTPCacheTask) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_http_cache_task_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use HTTPCacheTask.ProtoReflect.Descriptor instead.
|
||||
func (*HTTPCacheTask) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_http_cache_task_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetUserId() int64 {
|
||||
if x != nil {
|
||||
return x.UserId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetType() string {
|
||||
if x != nil {
|
||||
return x.Type
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetKeyType() string {
|
||||
if x != nil {
|
||||
return x.KeyType
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetCreatedAt() int64 {
|
||||
if x != nil {
|
||||
return x.CreatedAt
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetDoneAt() int64 {
|
||||
if x != nil {
|
||||
return x.DoneAt
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetIsDone() bool {
|
||||
if x != nil {
|
||||
return x.IsDone
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetIsOk() bool {
|
||||
if x != nil {
|
||||
return x.IsOk
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetDescription() string {
|
||||
if x != nil {
|
||||
return x.Description
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetUser() *User {
|
||||
if x != nil {
|
||||
return x.User
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTask) GetHttpCacheTaskKeys() []*HTTPCacheTaskKey {
|
||||
if x != nil {
|
||||
return x.HttpCacheTaskKeys
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_models_model_http_cache_task_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_http_cache_task_proto_rawDesc = []byte{
|
||||
0x0a, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x68,
|
||||
0x74, 0x74, 0x70, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x17, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73,
|
||||
0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x1a, 0x26, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f,
|
||||
0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f,
|
||||
0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcb, 0x02, 0x0a, 0x0d, 0x48, 0x54,
|
||||
0x54, 0x50, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69,
|
||||
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75,
|
||||
0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65,
|
||||
0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x54, 0x79,
|
||||
0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x54, 0x79, 0x70,
|
||||
0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05,
|
||||
0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12,
|
||||
0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6e, 0x65, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||
0x06, 0x64, 0x6f, 0x6e, 0x65, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x44, 0x6f, 0x6e,
|
||||
0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x44, 0x6f, 0x6e, 0x65, 0x12,
|
||||
0x12, 0x0a, 0x04, 0x69, 0x73, 0x4f, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69,
|
||||
0x73, 0x4f, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
|
||||
0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x1e, 0x20,
|
||||
0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75,
|
||||
0x73, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x43, 0x61, 0x63, 0x68, 0x65,
|
||||
0x54, 0x61, 0x73, 0x6b, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14,
|
||||
0x2e, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73,
|
||||
0x6b, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54,
|
||||
0x61, 0x73, 0x6b, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62,
|
||||
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_http_cache_task_proto_rawDescOnce sync.Once
|
||||
file_models_model_http_cache_task_proto_rawDescData = file_models_model_http_cache_task_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_http_cache_task_proto_rawDescGZIP() []byte {
|
||||
file_models_model_http_cache_task_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_http_cache_task_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_http_cache_task_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_http_cache_task_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_http_cache_task_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_http_cache_task_proto_goTypes = []interface{}{
|
||||
(*HTTPCacheTask)(nil), // 0: pb.HTTPCacheTask
|
||||
(*User)(nil), // 1: pb.User
|
||||
(*HTTPCacheTaskKey)(nil), // 2: pb.HTTPCacheTaskKey
|
||||
}
|
||||
var file_models_model_http_cache_task_proto_depIdxs = []int32{
|
||||
1, // 0: pb.HTTPCacheTask.user:type_name -> pb.User
|
||||
2, // 1: pb.HTTPCacheTask.httpCacheTaskKeys:type_name -> pb.HTTPCacheTaskKey
|
||||
2, // [2:2] is the sub-list for method output_type
|
||||
2, // [2:2] is the sub-list for method input_type
|
||||
2, // [2:2] is the sub-list for extension type_name
|
||||
2, // [2:2] is the sub-list for extension extendee
|
||||
0, // [0:2] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_http_cache_task_proto_init() }
|
||||
func file_models_model_http_cache_task_proto_init() {
|
||||
if File_models_model_http_cache_task_proto != nil {
|
||||
return
|
||||
}
|
||||
file_models_model_user_proto_init()
|
||||
file_models_model_http_cache_task_key_proto_init()
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_http_cache_task_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*HTTPCacheTask); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_http_cache_task_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_http_cache_task_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_http_cache_task_proto_depIdxs,
|
||||
MessageInfos: file_models_model_http_cache_task_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_http_cache_task_proto = out.File
|
||||
file_models_model_http_cache_task_proto_rawDesc = nil
|
||||
file_models_model_http_cache_task_proto_goTypes = nil
|
||||
file_models_model_http_cache_task_proto_depIdxs = nil
|
||||
}
|
||||
225
pkg/rpc/pb/model_http_cache_task_key.pb.go
Normal file
225
pkg/rpc/pb/model_http_cache_task_key.pb.go
Normal file
@@ -0,0 +1,225 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_http_cache_task_key.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type HTTPCacheTaskKey struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
TaskId int64 `protobuf:"varint,2,opt,name=taskId,proto3" json:"taskId,omitempty"`
|
||||
Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"`
|
||||
Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`
|
||||
KeyType string `protobuf:"bytes,5,opt,name=keyType,proto3" json:"keyType,omitempty"`
|
||||
IsDone bool `protobuf:"varint,6,opt,name=isDone,proto3" json:"isDone,omitempty"` // 是否已完成
|
||||
IsDoing bool `protobuf:"varint,9,opt,name=isDoing,proto3" json:"isDoing,omitempty"` // 是否执行中
|
||||
ErrorsJSON []byte `protobuf:"bytes,7,opt,name=errorsJSON,proto3" json:"errorsJSON,omitempty"`
|
||||
NodeClusterId int64 `protobuf:"varint,8,opt,name=nodeClusterId,proto3" json:"nodeClusterId,omitempty"`
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) Reset() {
|
||||
*x = HTTPCacheTaskKey{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_http_cache_task_key_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*HTTPCacheTaskKey) ProtoMessage() {}
|
||||
|
||||
func (x *HTTPCacheTaskKey) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_http_cache_task_key_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use HTTPCacheTaskKey.ProtoReflect.Descriptor instead.
|
||||
func (*HTTPCacheTaskKey) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_http_cache_task_key_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetTaskId() int64 {
|
||||
if x != nil {
|
||||
return x.TaskId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetKey() string {
|
||||
if x != nil {
|
||||
return x.Key
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetType() string {
|
||||
if x != nil {
|
||||
return x.Type
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetKeyType() string {
|
||||
if x != nil {
|
||||
return x.KeyType
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetIsDone() bool {
|
||||
if x != nil {
|
||||
return x.IsDone
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetIsDoing() bool {
|
||||
if x != nil {
|
||||
return x.IsDoing
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetErrorsJSON() []byte {
|
||||
if x != nil {
|
||||
return x.ErrorsJSON
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *HTTPCacheTaskKey) GetNodeClusterId() int64 {
|
||||
if x != nil {
|
||||
return x.NodeClusterId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
var File_models_model_http_cache_task_key_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_http_cache_task_key_proto_rawDesc = []byte{
|
||||
0x0a, 0x26, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x68,
|
||||
0x74, 0x74, 0x70, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6b,
|
||||
0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xf2, 0x01, 0x0a,
|
||||
0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x4b, 0x65,
|
||||
0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69,
|
||||
0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
|
||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74,
|
||||
0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
|
||||
0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x07, 0x6b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x44,
|
||||
0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x44, 0x6f, 0x6e,
|
||||
0x65, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x44, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01,
|
||||
0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x44, 0x6f, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x65,
|
||||
0x72, 0x72, 0x6f, 0x72, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52,
|
||||
0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x24, 0x0a, 0x0d, 0x6e,
|
||||
0x6f, 0x64, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49,
|
||||
0x64, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_http_cache_task_key_proto_rawDescOnce sync.Once
|
||||
file_models_model_http_cache_task_key_proto_rawDescData = file_models_model_http_cache_task_key_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_http_cache_task_key_proto_rawDescGZIP() []byte {
|
||||
file_models_model_http_cache_task_key_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_http_cache_task_key_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_http_cache_task_key_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_http_cache_task_key_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_http_cache_task_key_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_http_cache_task_key_proto_goTypes = []interface{}{
|
||||
(*HTTPCacheTaskKey)(nil), // 0: pb.HTTPCacheTaskKey
|
||||
}
|
||||
var file_models_model_http_cache_task_key_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_http_cache_task_key_proto_init() }
|
||||
func file_models_model_http_cache_task_key_proto_init() {
|
||||
if File_models_model_http_cache_task_key_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_http_cache_task_key_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*HTTPCacheTaskKey); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_http_cache_task_key_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_http_cache_task_key_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_http_cache_task_key_proto_depIdxs,
|
||||
MessageInfos: file_models_model_http_cache_task_key_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_http_cache_task_key_proto = out.File
|
||||
file_models_model_http_cache_task_key_proto_rawDesc = nil
|
||||
file_models_model_http_cache_task_key_proto_goTypes = nil
|
||||
file_models_model_http_cache_task_key_proto_depIdxs = nil
|
||||
}
|
||||
205
pkg/rpc/pb/model_ip_library_artifact.pb.go
Normal file
205
pkg/rpc/pb/model_ip_library_artifact.pb.go
Normal file
@@ -0,0 +1,205 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.25.0
|
||||
// protoc v3.19.4
|
||||
// source: models/model_ip_library_artifact.proto
|
||||
|
||||
package pb
|
||||
|
||||
import (
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
// This is a compile-time assertion that a sufficiently up-to-date version
|
||||
// of the legacy proto package is being used.
|
||||
const _ = proto.ProtoPackageIsVersion4
|
||||
|
||||
type IPLibraryArtifact struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
FileId int64 `protobuf:"varint,2,opt,name=fileId,proto3" json:"fileId,omitempty"`
|
||||
CreatedAt int64 `protobuf:"varint,3,opt,name=createdAt,proto3" json:"createdAt,omitempty"`
|
||||
MetaJSON []byte `protobuf:"bytes,4,opt,name=metaJSON,proto3" json:"metaJSON,omitempty"`
|
||||
IsPublic bool `protobuf:"varint,5,opt,name=isPublic,proto3" json:"isPublic,omitempty"`
|
||||
Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"`
|
||||
Code string `protobuf:"bytes,7,opt,name=code,proto3" json:"code,omitempty"`
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) Reset() {
|
||||
*x = IPLibraryArtifact{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_models_model_ip_library_artifact_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*IPLibraryArtifact) ProtoMessage() {}
|
||||
|
||||
func (x *IPLibraryArtifact) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_models_model_ip_library_artifact_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use IPLibraryArtifact.ProtoReflect.Descriptor instead.
|
||||
func (*IPLibraryArtifact) Descriptor() ([]byte, []int) {
|
||||
return file_models_model_ip_library_artifact_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetId() int64 {
|
||||
if x != nil {
|
||||
return x.Id
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetFileId() int64 {
|
||||
if x != nil {
|
||||
return x.FileId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetCreatedAt() int64 {
|
||||
if x != nil {
|
||||
return x.CreatedAt
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetMetaJSON() []byte {
|
||||
if x != nil {
|
||||
return x.MetaJSON
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetIsPublic() bool {
|
||||
if x != nil {
|
||||
return x.IsPublic
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *IPLibraryArtifact) GetCode() string {
|
||||
if x != nil {
|
||||
return x.Code
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_models_model_ip_library_artifact_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_models_model_ip_library_artifact_proto_rawDesc = []byte{
|
||||
0x0a, 0x26, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69,
|
||||
0x70, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61,
|
||||
0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xb9, 0x01, 0x0a,
|
||||
0x11, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
|
||||
0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,
|
||||
0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72,
|
||||
0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63,
|
||||
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61,
|
||||
0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
|
||||
0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
|
||||
0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
|
||||
0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62,
|
||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_models_model_ip_library_artifact_proto_rawDescOnce sync.Once
|
||||
file_models_model_ip_library_artifact_proto_rawDescData = file_models_model_ip_library_artifact_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_models_model_ip_library_artifact_proto_rawDescGZIP() []byte {
|
||||
file_models_model_ip_library_artifact_proto_rawDescOnce.Do(func() {
|
||||
file_models_model_ip_library_artifact_proto_rawDescData = protoimpl.X.CompressGZIP(file_models_model_ip_library_artifact_proto_rawDescData)
|
||||
})
|
||||
return file_models_model_ip_library_artifact_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_models_model_ip_library_artifact_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_models_model_ip_library_artifact_proto_goTypes = []interface{}{
|
||||
(*IPLibraryArtifact)(nil), // 0: pb.IPLibraryArtifact
|
||||
}
|
||||
var file_models_model_ip_library_artifact_proto_depIdxs = []int32{
|
||||
0, // [0:0] is the sub-list for method output_type
|
||||
0, // [0:0] is the sub-list for method input_type
|
||||
0, // [0:0] is the sub-list for extension type_name
|
||||
0, // [0:0] is the sub-list for extension extendee
|
||||
0, // [0:0] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_models_model_ip_library_artifact_proto_init() }
|
||||
func file_models_model_ip_library_artifact_proto_init() {
|
||||
if File_models_model_ip_library_artifact_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_models_model_ip_library_artifact_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*IPLibraryArtifact); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_models_model_ip_library_artifact_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_models_model_ip_library_artifact_proto_goTypes,
|
||||
DependencyIndexes: file_models_model_ip_library_artifact_proto_depIdxs,
|
||||
MessageInfos: file_models_model_ip_library_artifact_proto_msgTypes,
|
||||
}.Build()
|
||||
File_models_model_ip_library_artifact_proto = out.File
|
||||
file_models_model_ip_library_artifact_proto_rawDesc = nil
|
||||
file_models_model_ip_library_artifact_proto_goTypes = nil
|
||||
file_models_model_ip_library_artifact_proto_depIdxs = nil
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user