88 lines
1.6 KiB
Go
88 lines
1.6 KiB
Go
package frp
|
||
|
||
import (
|
||
"bytes"
|
||
_ "embed"
|
||
"os"
|
||
"text/template"
|
||
|
||
"frpc-console/internal/db"
|
||
)
|
||
|
||
//go:embed frpc.tmpl
|
||
var FrpcTemplateContent string
|
||
|
||
// ConfigData frpc.toml 模板渲染数据
|
||
type ConfigData struct {
|
||
*db.GlobalConfig
|
||
Proxies []db.Proxy
|
||
WireProtocolLine string
|
||
}
|
||
|
||
// ConfigData 中已包含 *db.GlobalConfig,AdminPort 会自动传递到模板
|
||
// 不需要额外修改,但模板 frpc.tmpl 需要支持 admin_port 输出
|
||
|
||
// 在 frpc.tmpl 中添加:
|
||
// {{- if .AdminPort }}
|
||
// admin_port = {{ .AdminPort }}
|
||
// {{- end }}
|
||
|
||
// GenerateConfig 生成 frpc.toml 配置文件
|
||
func GenerateConfig() error {
|
||
cfg, err := db.GetGlobalConfig()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
proxies, err := db.GetProxies()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
var activeProxies []db.Proxy
|
||
for _, p := range proxies {
|
||
if p.Enabled {
|
||
activeProxies = append(activeProxies, p)
|
||
}
|
||
}
|
||
|
||
data := ConfigData{
|
||
GlobalConfig: cfg,
|
||
Proxies: activeProxies,
|
||
}
|
||
|
||
if cfg.WireProtocolV2 {
|
||
data.WireProtocolLine = `wireProtocol = "v2"`
|
||
} else {
|
||
data.WireProtocolLine = ""
|
||
}
|
||
|
||
var tmplContent string
|
||
if _, err := os.Stat("frpc.tmpl"); err == nil {
|
||
content, readErr := os.ReadFile("frpc.tmpl")
|
||
if readErr == nil {
|
||
tmplContent = string(content)
|
||
} else {
|
||
tmplContent = FrpcTemplateContent
|
||
}
|
||
} else {
|
||
tmplContent = FrpcTemplateContent
|
||
}
|
||
|
||
tmpl, err := template.New("frpc").Parse(tmplContent)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
var buf bytes.Buffer
|
||
if err := tmpl.Execute(&buf, data); err != nil {
|
||
return err
|
||
}
|
||
|
||
if err := os.MkdirAll("./data", 0755); err != nil {
|
||
return err
|
||
}
|
||
|
||
return os.WriteFile("./data/frpc.toml", buf.Bytes(), 0644)
|
||
}
|