51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
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()
|
|
}
|
|
})
|
|
}
|
|
}
|