summaryrefslogtreecommitdiff
path: root/admin.go
diff options
context:
space:
mode:
authorFrancis Lavoie <lavofr@gmail.com>2022-03-02 13:08:36 -0500
committerGitHub <noreply@github.com>2022-03-02 11:08:36 -0700
commitbbad6931e30a2e74b3f53fff797d1115cc9dd491 (patch)
tree4db78522ec9b352b2f27f2f3a11dfa1a314ee902 /admin.go
parent5bd96a6ac22849cd9fbbaae5285f0161e272b8e4 (diff)
pki: Implement API endpoints for certs and `caddy trust` (#4443)
* admin: Implement /pki/certificates/<id> API * pki: Lower "skip_install_trust" log level to INFO See https://github.com/caddyserver/caddy/issues/4058#issuecomment-976132935 It's not necessary to warn about this, because this was an option explicitly configured by the user. Still useful to log, but we don't need to be so loud about it. * cmd: Export functions needed for PKI app, return API response to caller * pki: Rewrite `caddy trust` command to use new admin endpoint instead * pki: Rewrite `caddy untrust` command to support using admin endpoint * Refactor cmd and pki packages for determining admin API endpoint
Diffstat (limited to 'admin.go')
-rw-r--r--admin.go50
1 files changed, 35 insertions, 15 deletions
diff --git a/admin.go b/admin.go
index 891f818..11efc68 100644
--- a/admin.go
+++ b/admin.go
@@ -92,6 +92,10 @@ type AdminConfig struct {
//
// EXPERIMENTAL: This feature is subject to change.
Remote *RemoteAdmin `json:"remote,omitempty"`
+
+ // Holds onto the routers so that we can later provision them
+ // if they require provisioning.
+ routers []AdminRouter
}
// ConfigSettings configures the management of configuration.
@@ -190,7 +194,7 @@ type AdminPermissions struct {
// newAdminHandler reads admin's config and returns an http.Handler suitable
// for use in an admin endpoint server, which will be listening on listenAddr.
-func (admin AdminConfig) newAdminHandler(addr NetworkAddress, remote bool) adminHandler {
+func (admin *AdminConfig) newAdminHandler(addr NetworkAddress, remote bool) adminHandler {
muxWrap := adminHandler{mux: http.NewServeMux()}
// secure the local or remote endpoint respectively
@@ -250,11 +254,32 @@ func (admin AdminConfig) newAdminHandler(addr NetworkAddress, remote bool) admin
for _, route := range router.Routes() {
addRoute(route.Pattern, handlerLabel, route.Handler)
}
+ admin.routers = append(admin.routers, router)
}
return muxWrap
}
+// provisionAdminRouters provisions all the router modules
+// in the admin.api namespace that need provisioning.
+func (admin AdminConfig) provisionAdminRouters(ctx Context) error {
+ for _, router := range admin.routers {
+ provisioner, ok := router.(Provisioner)
+ if !ok {
+ continue
+ }
+
+ err := provisioner.Provision(ctx)
+ if err != nil {
+ return err
+ }
+ }
+
+ // We no longer need the routers once provisioned, allow for GC
+ admin.routers = nil
+ return nil
+}
+
// allowedOrigins returns a list of origins that are allowed.
// If admin.Origins is nil (null), the provided listen address
// will be used as the default origin. If admin.Origins is
@@ -332,25 +357,26 @@ func replaceLocalAdminServer(cfg *Config) error {
}
}()
- // always get a valid admin config
- adminConfig := DefaultAdminConfig
- if cfg != nil && cfg.Admin != nil {
- adminConfig = cfg.Admin
+ // set a default if admin wasn't otherwise configured
+ if cfg.Admin == nil {
+ cfg.Admin = &AdminConfig{
+ Listen: DefaultAdminListen,
+ }
}
// if new admin endpoint is to be disabled, we're done
- if adminConfig.Disabled {
+ if cfg.Admin.Disabled {
Log().Named("admin").Warn("admin endpoint disabled")
return nil
}
// extract a singular listener address
- addr, err := parseAdminListenAddr(adminConfig.Listen, DefaultAdminListen)
+ addr, err := parseAdminListenAddr(cfg.Admin.Listen, DefaultAdminListen)
if err != nil {
return err
}
- handler := adminConfig.newAdminHandler(addr, false)
+ handler := cfg.Admin.newAdminHandler(addr, false)
ln, err := Listen(addr.Network, addr.JoinHostPort(0))
if err != nil {
@@ -380,7 +406,7 @@ func replaceLocalAdminServer(cfg *Config) error {
adminLogger.Info("admin endpoint started",
zap.String("address", addr.String()),
- zap.Bool("enforce_origin", adminConfig.EnforceOrigin),
+ zap.Bool("enforce_origin", cfg.Admin.EnforceOrigin),
zap.Array("origins", loggableURLArray(handler.allowedOrigins)))
if !handler.enforceHost {
@@ -1244,12 +1270,6 @@ var (
// (TLS-authenticated) admin listener, if enabled and not
// specified otherwise.
DefaultRemoteAdminListen = ":2021"
-
- // DefaultAdminConfig is the default configuration
- // for the local administration endpoint.
- DefaultAdminConfig = &AdminConfig{
- Listen: DefaultAdminListen,
- }
)
// PIDFile writes a pidfile to the file at filename. It