caddydash/api/config.go
2025-06-30 15:31:14 +08:00

136 lines
3.3 KiB
Go

package api
import (
"caddydash/config"
"caddydash/db"
"caddydash/gen"
"fmt"
"os"
"github.com/infinite-iroha/touka"
)
func GetConfig(cdb *db.ConfigDB) touka.HandlerFunc {
return func(c *touka.Context) {
filename := c.Param("filename")
params, err := cdb.GetParams(filename)
if err != nil {
c.JSON(500, touka.H{"error": err.Error()})
return
}
// 解码[]byte的gob数据
var config gen.CaddyUniConfig
err = gen.DecodeGobConfig(params.ParamsOrigin, &config)
if err != nil {
c.JSON(500, touka.H{"error": err.Error()})
return
}
c.JSON(200, config)
}
}
func PutConfig(cdb *db.ConfigDB, cfg *config.Config) touka.HandlerFunc {
return func(c *touka.Context) {
filename := c.Param("filename")
var config gen.CaddyUniConfig
err := c.ShouldBindJSON(&config)
if err != nil {
c.JSON(400, touka.H{"error": err.Error()})
return
}
var paramsGOB []byte
var paramsOrigin []byte
// Mode标识符固定为uni, 模板已被统合为只有uni
paramsGOB, err = gen.EncodeGobConfig(config)
if err != nil {
c.Warnf("encode gob config error: %v", err)
c.JSON(500, touka.H{"error": err.Error()})
return
}
// 把json变为gob []byte
paramsOrigin, err = gen.EncodeGobConfig(config)
if err != nil {
c.Warnf("encode origin config error: %v", err)
c.JSON(500, touka.H{"error": err.Error()})
return
}
paramsEntry := db.ParamsEntry{
Filename: filename,
TemplateType: config.Mode,
ParamsGOB: paramsGOB,
ParamsOrigin: paramsOrigin,
}
err = WriteConfig(cdb, paramsEntry, cfg, filename)
if err != nil {
c.Warnf("write config error: %v", err)
c.JSON(500, touka.H{"error": err.Error()})
return
}
c.JSON(200, touka.H{"message": "config saved and rendered"})
return
}
}
// 渲染并写入配置
func WriteConfig(cdb *db.ConfigDB, paramsEntry db.ParamsEntry, cfg *config.Config, filename string) error {
var err error
err = cdb.SaveParams(paramsEntry)
if err != nil {
err = fmt.Errorf("save params error: %w", err)
return err
}
err = gen.RenderConfig(filename, cdb)
if err != nil {
err = fmt.Errorf("render config error: %w", err)
return err
}
// 写入文件
renderedEntry, err := cdb.GetRenderedConfig(filename)
if err != nil {
err = fmt.Errorf("get rendered config error: %w", err)
return err
}
err = os.WriteFile(cfg.Server.CaddyDir+"config.d/"+filename, renderedEntry.RenderedContent, 0644)
if err != nil {
err = fmt.Errorf("write rendered config file error: %w", err)
return err
}
return nil
}
func DeleteConfig(cdb *db.ConfigDB, cfg *config.Config) touka.HandlerFunc {
return func(c *touka.Context) {
filename := c.Param("filename")
err := cdb.DeleteParams(filename)
if err != nil {
c.JSON(500, touka.H{"error": err.Error()})
return
}
// 删除文件
err = os.Remove(cfg.Server.CaddyDir + "config.d/" + filename)
if err != nil {
c.Warnf("delete rendered config file error: %v", err)
}
c.JSON(200, touka.H{"message": "config deleted"})
}
}
func GetHeadersPreset() touka.HandlerFunc {
return func(c *touka.Context) {
presetName := c.Param("name")
if presetName == "" {
c.JSON(400, touka.H{"error": "presetName is required"})
return
}
preset, found := GetHeaderSetByID(presetName)
if !found {
c.JSON(404, touka.H{"error": "preset not found"})
return
}
c.JSON(200, preset)
}
}