init
This commit is contained in:
commit
b10790c212
40 changed files with 4149 additions and 0 deletions
150
gen/render.go
Normal file
150
gen/render.go
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
package gen
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"caddydash/db"
|
||||
"encoding/gob"
|
||||
"fmt"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
func RenderConfig(site string, cdb *db.ConfigDB) error {
|
||||
// 检索site config
|
||||
paramsEntry, err := cdb.GetParams(site)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var caddycfg CaddyUniConfig
|
||||
err = DecodeGobConfig(paramsEntry.ParamsGOB, &caddycfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 读取模板
|
||||
//tmplEntry, err := cdb.GetTemplate("reverse_proxy")
|
||||
tmplEntry, err := cdb.GetTemplate(caddycfg.Mode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rpTmpl := string(tmplEntry.Content)
|
||||
// 使用caddycfg渲染最终产物
|
||||
parsedTmpl, parseErr := template.New(tmplEntry.Filename).Parse(rpTmpl)
|
||||
if parseErr != nil {
|
||||
return fmt.Errorf("db: failed to parse template content for '%s': %w", tmplEntry.Filename, parseErr)
|
||||
}
|
||||
var renderedContentBuilder bytes.Buffer
|
||||
if err := parsedTmpl.Execute(&renderedContentBuilder, caddycfg); err != nil {
|
||||
return fmt.Errorf("db: failed to render template '%s': %w", tmplEntry.Filename, err)
|
||||
}
|
||||
|
||||
// 保存渲染结果
|
||||
renderedEntry := db.RenderedConfigEntry{
|
||||
Filename: caddycfg.DomainConfig.Domain, // 使用域名作为文件名
|
||||
RenderedContent: renderedContentBuilder.Bytes(),
|
||||
}
|
||||
|
||||
// 保存渲染产物
|
||||
if err := cdb.SaveRenderedConfig(renderedEntry); err != nil {
|
||||
return fmt.Errorf("db: failed to save rendered config for '%s': %w", caddycfg.DomainConfig.Domain, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 把caddycfg内容转为GOB
|
||||
func EncodeGobConfig(caddycfg any) ([]byte, error) {
|
||||
var buf bytes.Buffer
|
||||
enc := gob.NewEncoder(&buf)
|
||||
if err := enc.Encode(caddycfg); err != nil {
|
||||
return nil, fmt.Errorf("db: failed to Encode struct to GOB: %w", err)
|
||||
}
|
||||
return buf.Bytes(), nil // 返回编码后的字节切片.
|
||||
}
|
||||
|
||||
func DecodeGobConfig(data []byte, tmplStruct any) error {
|
||||
buf := bytes.NewBuffer(data)
|
||||
dec := gob.NewDecoder(buf)
|
||||
if err := dec.Decode(tmplStruct); err != nil {
|
||||
return fmt.Errorf("db: failed to Decode GOB to struct: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
/*
|
||||
func RenderConfig(site string, cdb *db.ConfigDB) error {
|
||||
// 检索site config
|
||||
paramsEntry, err := cdb.GetParams(site)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var caddycfg any
|
||||
var specificConfigType interface{}
|
||||
|
||||
if paramsEntry.TemplateType == "reverse_proxy" {
|
||||
specificConfigType = &CaddyReverseProxyConfig{}
|
||||
} else if paramsEntry.TemplateType == "file_server" {
|
||||
specificConfigType = &CaddyFileServerConfig{}
|
||||
} else {
|
||||
return fmt.Errorf("unknown template type: %s", paramsEntry.TemplateType)
|
||||
}
|
||||
|
||||
err = DecodeGobConfig(paramsEntry.ParamsGOB, specificConfigType)
|
||||
if err != nil {
|
||||
log.Printf("decode gob config error: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
caddycfg = specificConfigType
|
||||
|
||||
// 读取模板
|
||||
//tmplEntry, err := cdb.GetTemplate("reverse_proxy")
|
||||
tmplEntry, err := cdb.GetTemplate(paramsEntry.TemplateType)
|
||||
if err != nil {
|
||||
log.Printf("get template error: %v", err)
|
||||
tmplList, err := cdb.RangeTemplates()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Printf("template list: %v, GetName %s", tmplList, paramsEntry.TemplateType)
|
||||
return err
|
||||
}
|
||||
|
||||
rpTmpl := string(tmplEntry.Content)
|
||||
// 使用caddycfg渲染最终产物
|
||||
parsedTmpl, parseErr := template.New(tmplEntry.Filename).Parse(rpTmpl)
|
||||
if parseErr != nil {
|
||||
return fmt.Errorf("db: failed to parse template content for '%s': %w", tmplEntry.Filename, parseErr)
|
||||
}
|
||||
var renderedContentBuilder bytes.Buffer
|
||||
if err := parsedTmpl.Execute(&renderedContentBuilder, caddycfg); err != nil {
|
||||
return fmt.Errorf("db: failed to render template '%s': %w", tmplEntry.Filename, err)
|
||||
}
|
||||
|
||||
// 类型断言获得domain
|
||||
var domain string
|
||||
switch cfg := caddycfg.(type) {
|
||||
case *CaddyReverseProxyConfig:
|
||||
domain = cfg.Domain
|
||||
case *CaddyFileServerConfig:
|
||||
domain = cfg.Domain
|
||||
default:
|
||||
return fmt.Errorf("unknown config type for domain extraction")
|
||||
}
|
||||
|
||||
// 保存渲染结果
|
||||
renderedEntry := db.RenderedConfigEntry{
|
||||
Filename: domain, // 使用域名作为文件名
|
||||
RenderedContent: renderedContentBuilder.Bytes(),
|
||||
}
|
||||
|
||||
// 保存渲染产物
|
||||
if err := cdb.SaveRenderedConfig(renderedEntry); err != nil {
|
||||
return fmt.Errorf("db: failed to save rendered config for '%s': %w", domain, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
*/
|
||||
Loading…
Add table
Add a link
Reference in a new issue