package updater import ( "bytes" "encoding/json" "net/http" "github.com/rs/zerolog/log" "github.com/traefik/traefik/v3/pkg/api" "github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/runtime" "github.com/traefik/traefik/v3/pkg/config/static" "github.com/traefik/traefik/v3/pkg/safe" ) type Updater struct { callbackUrls []string } func New(config *static.Configuration) *Updater { updater := &Updater{ callbackUrls: config.Global.UpdaterCallbacks, } return updater } func (u *Updater) HandleConfigUpdate(cfg dynamic.Configuration) { runtimeConfig := runtime.NewConfig(cfg) body := bytes.NewBuffer([]byte{}) result := api.GetRunTimeRepresentation(runtimeConfig) if err := json.NewEncoder(body).Encode(result); err != nil { log.Error().Err(err).Msg("Error while marshalling dynamic configuration data to json") return } for _, url := range u.callbackUrls { safe.Go(func() { resp, err := http.Post(url, "application/json", body) if err != nil { log.Error().Err(err).Str("url", url).Msg("Error while sending configuration data to callback") } else { log.Debug().Str("url", url).Msg("Configuration data sent") resp.Body.Close() } }) } }