feat: add posibility to use token file in hetzner config
This commit is contained in:
@@ -106,9 +106,10 @@ func NewRouter(cfg *config.Config) *gin.Engine {
|
||||
c.JSON(http.StatusForbidden, gin.H{"status": "error", "message": "host not authorized"})
|
||||
return
|
||||
}
|
||||
prov, ok := selectProvider(cfg)
|
||||
if !ok {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"status": "error", "message": "provider not configured"})
|
||||
prov, err := selectProvider(cfg)
|
||||
if err != nil {
|
||||
logger.Error("provider selection failed", zap.Error(err))
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"status": "error", "message": "provider configuration error"})
|
||||
return
|
||||
}
|
||||
if err := prov.UpdateRecord(c.Request.Context(), req.Host, ip); err != nil {
|
||||
@@ -126,12 +127,12 @@ func NewRouter(cfg *config.Config) *gin.Engine {
|
||||
|
||||
// StartServer initializes Provider and starts the HTTP server.
|
||||
func StartServer(cfg *config.Config) error {
|
||||
prov, ok := selectProvider(cfg)
|
||||
if !ok {
|
||||
return fmt.Errorf("unsupported provider: %s", cfg.Upstream.Provider)
|
||||
// Provider selection happens within the request handler now to handle potential config errors per request
|
||||
// We could pre-validate the provider config here, but deferring allows checking file existence/permissions closer to use.
|
||||
// A simple check that the provider *name* is supported is still useful.
|
||||
if _, supported := configToProviderName(cfg.Upstream.Provider); !supported {
|
||||
return fmt.Errorf("unsupported provider name in config: %q", cfg.Upstream.Provider)
|
||||
}
|
||||
// drop unused to avoid compile error
|
||||
_ = prov
|
||||
|
||||
router := NewRouter(cfg)
|
||||
if cfg.Server.TLS.Enabled {
|
||||
@@ -140,12 +141,33 @@ func StartServer(cfg *config.Config) error {
|
||||
return router.Run(cfg.Server.BindAddress)
|
||||
}
|
||||
|
||||
// selectProvider returns the configured Provider or false if unsupported.
|
||||
func selectProvider(cfg *config.Config) (pvd.Provider, bool) {
|
||||
switch cfg.Upstream.Provider {
|
||||
// configToProviderName checks if a provider name from the config is known.
|
||||
// This is a simple check before attempting full provider initialization.
|
||||
func configToProviderName(providerName string) (string, bool) {
|
||||
switch providerName {
|
||||
case "hetzner":
|
||||
return hetzner.NewProvider(cfg.Upstream.Hetzner.APIToken), true
|
||||
return "hetzner", true
|
||||
default:
|
||||
return nil, false
|
||||
return "", false
|
||||
}
|
||||
}
|
||||
|
||||
// selectProvider returns the configured Provider or an error if initialization fails.
|
||||
func selectProvider(cfg *config.Config) (pvd.Provider, error) {
|
||||
providerName, supported := configToProviderName(cfg.Upstream.Provider)
|
||||
if !supported {
|
||||
return nil, fmt.Errorf("unsupported provider: %s", cfg.Upstream.Provider)
|
||||
}
|
||||
|
||||
switch providerName {
|
||||
case "hetzner":
|
||||
prov, err := hetzner.NewProvider(cfg.Upstream.Hetzner)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("initializing hetzner provider: %w", err)
|
||||
}
|
||||
return prov, nil
|
||||
default:
|
||||
// This case should technically be unreachable due to the check above
|
||||
return nil, fmt.Errorf("internal error: unsupported provider %s passed initial check", providerName)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user