自动启动代理服务器
This commit is contained in:
@@ -1,136 +1 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// Config 结构体用于解析yaml配置文件
|
||||
type Config struct {
|
||||
Host string `yaml:"Host"`
|
||||
Port int `yaml:"Port"`
|
||||
}
|
||||
|
||||
// Result 结构体用于存储解析结果
|
||||
type Result struct {
|
||||
FolderName string
|
||||
Host string
|
||||
Port int
|
||||
PrefixRoute map[string]bool
|
||||
}
|
||||
|
||||
// GetZeroInfo 遍历指定目录,并解析相关信息
|
||||
func GetZeroInfo(rootDir string) (results []*Result) {
|
||||
entries, err := ioutil.ReadDir(rootDir)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
for _, entry := range entries {
|
||||
// 只处理目录类型
|
||||
if entry.IsDir() {
|
||||
result, err := findFoldersAndExtractInfo(rootDir, entry)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
results = append(results, result)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// findFoldersAndExtractInfo 查找目录并提取信息
|
||||
func findFoldersAndExtractInfo(rootDir string, entry os.FileInfo) (*Result, error) {
|
||||
var result *Result
|
||||
|
||||
folderName := entry.Name()
|
||||
path := filepath.Join(rootDir, folderName)
|
||||
|
||||
err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 跳过非目录类型
|
||||
if !info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
|
||||
relPath, err := filepath.Rel(path, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 跳过非当前目录的子目录
|
||||
if strings.Contains(relPath, string(os.PathSeparator)) {
|
||||
return filepath.SkipDir
|
||||
}
|
||||
|
||||
// 读取配置文件
|
||||
configPath := filepath.Join(path, "etc", folderName+".yaml")
|
||||
routesPath := filepath.Join(path, "internal", "handler", "routes.go")
|
||||
|
||||
configContent, err := ioutil.ReadFile(configPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var config Config
|
||||
err = yaml.Unmarshal(configContent, &config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 读取路由文件
|
||||
routesContent, err := ioutil.ReadFile(routesPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
PrefixRoute := extractPrefixRouteValues(string(routesContent))
|
||||
|
||||
// 构建结果
|
||||
result = &Result{
|
||||
FolderName: folderName,
|
||||
Host: config.Host,
|
||||
Port: config.Port,
|
||||
PrefixRoute: PrefixRoute,
|
||||
}
|
||||
|
||||
return filepath.SkipDir
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// extractPrefixRouteValues 提取路由前缀
|
||||
func extractPrefixRouteValues(content string) map[string]bool {
|
||||
lines := strings.Split(content, "\n")
|
||||
var prefixPath map[string]bool = make(map[string]bool)
|
||||
|
||||
for _, line := range lines {
|
||||
// 查找包含 "Path:" 的行
|
||||
if strings.Contains(line, "Path:") {
|
||||
path := strings.TrimSpace(strings.TrimPrefix(line, "Path:"))
|
||||
paths := strings.Split(strings.Trim(path, `"`), "/")
|
||||
path1 := "/" + paths[1] + "/" + paths[2]
|
||||
|
||||
if _, ok := prefixPath[path1]; !ok {
|
||||
prefixPath[path1] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return prefixPath
|
||||
}
|
||||
|
||||
@@ -3,14 +3,19 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// Backend结构体
|
||||
@@ -125,8 +130,8 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
|
||||
client := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
DialContext: (&net.Dialer{
|
||||
Timeout: 30 * time.Second,
|
||||
KeepAlive: 30 * time.Second,
|
||||
Timeout: 60 * time.Second,
|
||||
KeepAlive: 60 * time.Second,
|
||||
}).DialContext,
|
||||
ForceAttemptHTTP2: true,
|
||||
MaxIdleConns: 100,
|
||||
@@ -202,3 +207,130 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
|
||||
// 返回后端服务对象
|
||||
return backend
|
||||
}
|
||||
|
||||
// get_zero_info.go
|
||||
|
||||
// Config 结构体用于解析yaml配置文件
|
||||
type Config struct {
|
||||
Host string `yaml:"Host"`
|
||||
Port int `yaml:"Port"`
|
||||
}
|
||||
|
||||
// Result 结构体用于存储解析结果
|
||||
type Result struct {
|
||||
FolderName string
|
||||
Host string
|
||||
Port int
|
||||
PrefixRoute map[string]bool
|
||||
}
|
||||
|
||||
// GetZeroInfo 遍历指定目录,并解析相关信息
|
||||
func GetZeroInfo(rootDir string) (results []*Result) {
|
||||
entries, err := ioutil.ReadDir(rootDir)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
for _, entry := range entries {
|
||||
// 只处理目录类型
|
||||
if entry.IsDir() {
|
||||
result, err := findFoldersAndExtractInfo(rootDir, entry)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
results = append(results, result)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// findFoldersAndExtractInfo 查找目录并提取信息
|
||||
func findFoldersAndExtractInfo(rootDir string, entry os.FileInfo) (*Result, error) {
|
||||
var result *Result
|
||||
|
||||
folderName := entry.Name()
|
||||
path := filepath.Join(rootDir, folderName)
|
||||
|
||||
err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 跳过非目录类型
|
||||
if !info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
|
||||
relPath, err := filepath.Rel(path, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 跳过非当前目录的子目录
|
||||
if strings.Contains(relPath, string(os.PathSeparator)) {
|
||||
return filepath.SkipDir
|
||||
}
|
||||
|
||||
// 读取配置文件
|
||||
configPath := filepath.Join(path, "etc", folderName+".yaml")
|
||||
routesPath := filepath.Join(path, "internal", "handler", "routes.go")
|
||||
|
||||
configContent, err := ioutil.ReadFile(configPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var config Config
|
||||
err = yaml.Unmarshal(configContent, &config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 读取路由文件
|
||||
routesContent, err := ioutil.ReadFile(routesPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
PrefixRoute := extractPrefixRouteValues(string(routesContent))
|
||||
|
||||
// 构建结果
|
||||
result = &Result{
|
||||
FolderName: folderName,
|
||||
Host: config.Host,
|
||||
Port: config.Port,
|
||||
PrefixRoute: PrefixRoute,
|
||||
}
|
||||
|
||||
return filepath.SkipDir
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// extractPrefixRouteValues 提取路由前缀
|
||||
func extractPrefixRouteValues(content string) map[string]bool {
|
||||
lines := strings.Split(content, "\n")
|
||||
var prefixPath map[string]bool = make(map[string]bool)
|
||||
|
||||
for _, line := range lines {
|
||||
// 查找包含 "Path:" 的行
|
||||
if strings.Contains(line, "Path:") {
|
||||
path := strings.TrimSpace(strings.TrimPrefix(line, "Path:"))
|
||||
paths := strings.Split(strings.Trim(path, `"`), "/")
|
||||
path1 := "/" + paths[1] + "/" + paths[2]
|
||||
|
||||
if _, ok := prefixPath[path1]; !ok {
|
||||
prefixPath[path1] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return prefixPath
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user