Files
CaddyProxyManager/backend/internal/caddy/moduleconfig.go
Pacerino b4509d12e7 [Backend][Frontend] Add host plugins with module config and schema-driven UI
Introduce per-host plugin support: Caddy module discovery, module
config endpoints, plugin schemas (basicauth, cloudflare) and the
host plugins API. On the frontend, add the Plugins page, plugin/host
plugin dialogs and schema-driven form fields.
2026-06-15 14:17:34 +02:00

50 lines
1.4 KiB
Go

package caddy
import (
"encoding/json"
"github.com/Pacerino/CaddyProxyManager/internal/database"
)
// ApplyModuleConfig patches a module configuration fragment into the live
// Caddy config via the admin API. When the fragment is disabled it is removed
// instead. Only supported in API mode (callers must use APIProvider).
func (p *APIProvider) ApplyModuleConfig(mc database.ModuleConfig) error {
if !mc.Enabled {
return p.RemoveModuleConfig(mc)
}
var body any
if len(mc.Config) > 0 {
if err := json.Unmarshal(mc.Config, &body); err != nil {
return err
}
}
return p.PatchConfig(mc.Path, body)
}
// RemoveModuleConfig removes a module configuration fragment from the live
// config. Caddy returns an error for a missing path; that is treated as
// already-removed and ignored.
func (p *APIProvider) RemoveModuleConfig(mc database.ModuleConfig) error {
exists, err := p.configExists("/config/" + trimConfigPrefix(mc.Path))
if err != nil {
return err
}
if !exists {
return nil
}
return p.do("DELETE", "/config/"+trimConfigPrefix(mc.Path), nil, nil)
}
// trimConfigPrefix normalises a stored path so it can be appended to /config/.
func trimConfigPrefix(path string) string {
for len(path) > 0 && path[0] == '/' {
path = path[1:]
}
const prefix = "config/"
if len(path) >= len(prefix) && path[:len(prefix)] == prefix {
path = path[len(prefix):]
}
return path
}