Files
frps-console/toml_parser.go
T

81 lines
1.6 KiB
Go

package main
import (
"fmt"
"strconv"
"strings"
)
// FrpsToml 对应 frps.toml 结构
type FrpsToml struct {
BindPort int `json:"bindPort"`
Auth struct {
Token string `json:"token"`
} `json:"auth"`
Log struct {
Level string `json:"level"`
MaxDays int `json:"maxDays"`
} `json:"log"`
Transport struct {
TcpMux bool `json:"tcpMux"`
} `json:"transport"`
}
func ParseToml(content string) (*FrpsToml, error) {
lines := strings.Split(content, "\n")
result := &FrpsToml{
Transport: struct {
TcpMux bool `json:"tcpMux"`
}{
TcpMux: true,
},
}
for _, rawLine := range lines {
line := strings.TrimSpace(rawLine)
if line == "" || strings.HasPrefix(line, "#") {
continue
}
if strings.HasPrefix(line, "[") {
continue
}
if !strings.Contains(line, "=") {
continue
}
parts := strings.SplitN(line, "=", 2)
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
value = strings.Trim(value, `"`)
switch key {
case "bindPort":
result.BindPort, _ = strconv.Atoi(value)
case "token":
result.Auth.Token = value
case "level":
result.Log.Level = value
case "maxDays":
result.Log.MaxDays, _ = strconv.Atoi(value)
case "tcpMux":
result.Transport.TcpMux = value == "true"
}
}
if result.BindPort == 0 {
return nil, fmt.Errorf("未找到 bindPort 字段")
}
return result, nil
}
func (f *FrpsToml) ToGlobalConfig() *GlobalConfig {
return &GlobalConfig{
BindPort: f.BindPort,
Token: f.Auth.Token,
LogLevel: f.Log.Level,
LogMaxDays: f.Log.MaxDays,
TcpMux: f.Transport.TcpMux,
}
}