feat: callbacks
This commit is contained in:
parent
9e1e49f16f
commit
585158380f
9 changed files with 1918 additions and 0 deletions
|
|
@ -49,6 +49,7 @@ import (
|
|||
"github.com/traefik/traefik/v3/pkg/tcp"
|
||||
traefiktls "github.com/traefik/traefik/v3/pkg/tls"
|
||||
"github.com/traefik/traefik/v3/pkg/version"
|
||||
"github.com/traefik/traefik/v3/pkg/updater"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
|
@ -199,6 +200,8 @@ func setupServer(staticConfiguration *static.Configuration) (*server.Server, err
|
|||
|
||||
tsProviders := initTailscaleProviders(staticConfiguration, providerAggregator)
|
||||
|
||||
updaterProvider := updater.New(staticConfiguration);
|
||||
|
||||
// Observability
|
||||
|
||||
metricRegistries := registerMetricClients(staticConfiguration.Metrics)
|
||||
|
|
@ -388,6 +391,9 @@ func setupServer(staticConfiguration *static.Configuration) (*server.Server, err
|
|||
}
|
||||
})
|
||||
|
||||
// Updater
|
||||
watcher.AddListener(updaterProvider.HandleConfigUpdate)
|
||||
|
||||
return server.NewServer(routinesPool, serverEntryPointsTCP, serverEntryPointsUDP, watcher, observabilityMgr), nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ THIS FILE MUST NOT BE EDITED BY HAND
|
|||
| <a id="opt-experimental-plugins-name-version" href="#opt-experimental-plugins-name-version" title="#opt-experimental-plugins-name-version">experimental.plugins._name_.version</a> | plugin's version. | |
|
||||
| <a id="opt-global-checknewversion" href="#opt-global-checknewversion" title="#opt-global-checknewversion">global.checknewversion</a> | Periodically check if a new version has been released. | true |
|
||||
| <a id="opt-global-sendanonymoususage" href="#opt-global-sendanonymoususage" title="#opt-global-sendanonymoususage">global.sendanonymoususage</a> | Periodically send anonymous usage statistics. If the option is not specified, it will be disabled by default. | false |
|
||||
| <a id="opt-global-updatercallbacks" href="#opt-global-updatercallbacks" title="#opt-global-updatercallbacks">global.updatercallbacks</a> | Callback urls for updater script (example: https://localhost:8080/callback) | |
|
||||
| <a id="opt-hostresolver" href="#opt-hostresolver" title="#opt-hostresolver">hostresolver</a> | Enable CNAME Flattening. | false |
|
||||
| <a id="opt-hostresolver-cnameflattening" href="#opt-hostresolver-cnameflattening" title="#opt-hostresolver-cnameflattening">hostresolver.cnameflattening</a> | A flag to enable/disable CNAME flattening | false |
|
||||
| <a id="opt-hostresolver-resolvconfig" href="#opt-hostresolver-resolvconfig" title="#opt-hostresolver-resolvconfig">hostresolver.resolvconfig</a> | resolv.conf used for DNS resolving | /etc/resolv.conf |
|
||||
|
|
|
|||
|
|
@ -390,6 +390,9 @@ Periodically check if a new version has been released. (Default: ```true```)
|
|||
`--global.sendanonymoususage`:
|
||||
Periodically send anonymous usage statistics. If the option is not specified, it will be disabled by default. (Default: ```false```)
|
||||
|
||||
`--global.updatercallbacks`:
|
||||
Callback urls for updater script (example: https://localhost:8080/callback)
|
||||
|
||||
`--hostresolver`:
|
||||
Enable CNAME Flattening. (Default: ```false```)
|
||||
|
||||
|
|
|
|||
|
|
@ -390,6 +390,9 @@ Periodically check if a new version has been released. (Default: ```true```)
|
|||
`TRAEFIK_GLOBAL_SENDANONYMOUSUSAGE`:
|
||||
Periodically send anonymous usage statistics. If the option is not specified, it will be disabled by default. (Default: ```false```)
|
||||
|
||||
`TRAEFIK_GLOBAL_UPDATERCALLBACKS`:
|
||||
Callback urls for updater script (example: https://localhost:8080/callback)
|
||||
|
||||
`TRAEFIK_HOSTRESOLVER`:
|
||||
Enable CNAME Flattening. (Default: ```false```)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
[global]
|
||||
checkNewVersion = true
|
||||
sendAnonymousUsage = true
|
||||
updaterCallbacks = ["foobar", "foobar"]
|
||||
|
||||
[serversTransport]
|
||||
insecureSkipVerify = true
|
||||
|
|
|
|||
|
|
@ -3,6 +3,9 @@
|
|||
global:
|
||||
checkNewVersion: true
|
||||
sendAnonymousUsage: true
|
||||
updaterCallbacks:
|
||||
- foobar
|
||||
- foobar
|
||||
serversTransport:
|
||||
insecureSkipVerify: true
|
||||
rootCAs:
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ type CertificateResolver struct {
|
|||
type Global struct {
|
||||
CheckNewVersion bool `description:"Periodically check if a new version has been released." json:"checkNewVersion,omitempty" toml:"checkNewVersion,omitempty" yaml:"checkNewVersion,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||
SendAnonymousUsage bool `description:"Periodically send anonymous usage statistics. If the option is not specified, it will be disabled by default." json:"sendAnonymousUsage,omitempty" toml:"sendAnonymousUsage,omitempty" yaml:"sendAnonymousUsage,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||
UpdaterCallbacks []string `description:"Callback urls for updater script (example: https://localhost:8080/callback)" json:"updaterCallbacks,omitempty" toml:"updaterCallbacks,omitempty" yaml:"updaterCallbacks,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||
}
|
||||
|
||||
// ServersTransport options to configure communication between Traefik and the servers.
|
||||
|
|
|
|||
49
pkg/updater/provider.go
Normal file
49
pkg/updater/provider.go
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package updater
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/traefik/traefik/v3/pkg/config/dynamic"
|
||||
"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) {
|
||||
body, err := json.Marshal(cfg)
|
||||
|
||||
if err != nil {
|
||||
// should never happen?
|
||||
log.Error().Err(err).Msg("Error while marshalling dynamic configuration data to json")
|
||||
return
|
||||
}
|
||||
|
||||
requestBody := bytes.NewBuffer(body)
|
||||
|
||||
for _, url := range u.callbackUrls {
|
||||
safe.Go(func() {
|
||||
resp, err := http.Post(url, "application/json", requestBody)
|
||||
|
||||
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()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
1851
schema.json
Normal file
1851
schema.json
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue