Files
-Fonu/internal/frp-1.0.2/generate.go
T

71 lines
2.1 KiB
Go
Raw Normal View History

2026-09-23 09:40:59 +08:00
package frp
import (
"fmt"
"path/filepath"
"strings"
"github.com/fonu/fonu/internal/config"
)
func Generate(cfg config.Config, frpCfg Config, authToken string, httpPort, httpsPort int) (string, error) {
if strings.TrimSpace(frpCfg.ServerAddr) == "" {
return "", fmt.Errorf("FRP 服务器地址未配置")
}
if strings.TrimSpace(authToken) == "" {
return "", fmt.Errorf("FRP 认证 Token 未配置")
}
domains := normalizeDomains(frpCfg.CustomDomains)
if len(domains) == 0 {
return "", fmt.Errorf("请至少填写一个穿透域名")
}
if httpPort <= 0 || httpsPort <= 0 {
return "", fmt.Errorf("Nginx 端口未配置")
}
var b strings.Builder
b.WriteString(fmt.Sprintf("serverAddr = %q\n", frpCfg.ServerAddr))
b.WriteString(fmt.Sprintf("serverPort = %d\n\n", frpCfg.ServerPort))
b.WriteString(fmt.Sprintf("log.to = %q\n", tomlPath(cfg.FrpLogPath())))
b.WriteString("log.level = \"info\"\n\n")
b.WriteString("auth.method = \"token\"\n")
b.WriteString(fmt.Sprintf("auth.token = %q\n\n", authToken))
if frpCfg.TLSEnabled {
b.WriteString("transport.tls.enable = true\n\n")
} else {
b.WriteString("transport.tls.enable = false\n\n")
}
b.WriteString("[[proxies]]\n")
b.WriteString("name = \"fonu-nginx-http\"\n")
b.WriteString("type = \"http\"\n")
b.WriteString("localIP = \"127.0.0.1\"\n")
b.WriteString(fmt.Sprintf("localPort = %d\n", httpPort))
b.WriteString(fmt.Sprintf("customDomains = %s\n\n", formatTOMLStringArray(domains)))
b.WriteString("[[proxies]]\n")
b.WriteString("name = \"fonu-nginx-https\"\n")
b.WriteString("type = \"https\"\n")
b.WriteString(fmt.Sprintf("customDomains = %s\n", formatTOMLStringArray(domains)))
b.WriteString("[proxies.plugin]\n")
b.WriteString("type = \"https2https\"\n")
b.WriteString(fmt.Sprintf("localAddr = \"127.0.0.1:%d\"\n", httpsPort))
return b.String(), nil
}
func tomlPath(path string) string {
return filepath.ToSlash(filepath.Clean(path))
}
func formatTOMLStringArray(items []string) string {
parts := make([]string, 0, len(items))
for _, item := range items {
parts = append(parts, fmt.Sprintf("%q", item))
}
return "[" + strings.Join(parts, ", ") + "]"
}