diff options
| author | James Elliott <james-d-elliott@users.noreply.github.com> | 2025-03-09 01:53:44 +1100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-09 01:53:44 +1100 | 
| commit | 9241731a4dd5592b4a02b5352c903b4d06b6f4ab (patch) | |
| tree | 5184b98751912a261ff70fd8721b9cd4f1c98f1e /internal/commands/root.go | |
| parent | bbcb38ab9ff35e69d5d52a71ab56346749f5e8b1 (diff) | |
feat(embed): make authelia embedable (#8841)
This adds a highly experimental option for developers looking to embed Authelia within another go binary.
Closes #5803
Signed-off-by: James Elliott <james-d-elliott@users.noreply.github.com>
Diffstat (limited to 'internal/commands/root.go')
| -rw-r--r-- | internal/commands/root.go | 102 | 
1 files changed, 12 insertions, 90 deletions
diff --git a/internal/commands/root.go b/internal/commands/root.go index e294cccfd..690779d07 100644 --- a/internal/commands/root.go +++ b/internal/commands/root.go @@ -1,13 +1,15 @@  package commands  import ( +	"errors"  	"fmt"  	"os"  	"github.com/spf13/cobra"  	"github.com/authelia/authelia/v4/internal/logging" -	"github.com/authelia/authelia/v4/internal/model" +	"github.com/authelia/authelia/v4/internal/middlewares" +	"github.com/authelia/authelia/v4/internal/service"  	"github.com/authelia/authelia/v4/internal/utils"  ) @@ -82,102 +84,22 @@ func (ctx *CmdCtx) RootRunE(_ *cobra.Command, _ []string) (err error) {  			ctx.log.Error(err)  		} -		ctx.log.Fatalf("Errors occurred provisioning providers.") +		ctx.log.Fatal("Errors occurred provisioning providers")  	} -	doStartupChecks(ctx) +	if err = ctx.providers.StartupChecks(ctx, true); err != nil { +		var scerr *middlewares.ErrProviderStartupCheck -	ctx.cconfig = nil - -	ctx.log.Trace("Starting Services") - -	servicesRun(ctx) - -	return nil -} - -func doStartupChecks(ctx *CmdCtx) { -	var ( -		failures []string -		err      error -	) - -	ctx.log.WithFields(map[string]any{logFieldProvider: providerNameStorage}).Trace(logMessageStartupCheckPerforming) - -	if err = doStartupCheck(ctx, providerNameStorage, ctx.providers.StorageProvider, false); err != nil { -		ctx.log.WithError(err).WithField(logFieldProvider, providerNameStorage).Error(logMessageStartupCheckError) - -		failures = append(failures, providerNameStorage) -	} else { -		ctx.log.WithFields(map[string]any{logFieldProvider: providerNameStorage}).Trace(logMessageStartupCheckSuccess) -	} - -	ctx.log.WithFields(map[string]any{logFieldProvider: providerNameUser}).Trace(logMessageStartupCheckPerforming) - -	if err = doStartupCheck(ctx, providerNameUser, ctx.providers.UserProvider, false); err != nil { -		ctx.log.WithError(err).WithField(logFieldProvider, providerNameUser).Error(logMessageStartupCheckError) - -		failures = append(failures, providerNameUser) -	} else { -		ctx.log.WithFields(map[string]any{logFieldProvider: providerNameUser}).Trace(logMessageStartupCheckSuccess) -	} - -	ctx.log.WithFields(map[string]any{logFieldProvider: providerNameNotification}).Trace(logMessageStartupCheckPerforming) - -	if err = doStartupCheck(ctx, providerNameNotification, ctx.providers.Notifier, ctx.config.Notifier.DisableStartupCheck); err != nil { -		ctx.log.WithError(err).WithField(logFieldProvider, providerNameNotification).Error(logMessageStartupCheckError) - -		failures = append(failures, providerNameNotification) -	} else { -		ctx.log.WithFields(map[string]any{logFieldProvider: providerNameNotification}).Trace(logMessageStartupCheckSuccess) -	} - -	ctx.log.WithFields(map[string]any{logFieldProvider: providerNameNTP}).Trace(logMessageStartupCheckPerforming) - -	if err = doStartupCheck(ctx, providerNameNTP, ctx.providers.NTP, ctx.config.NTP.DisableStartupCheck); err != nil { -		if !ctx.config.NTP.DisableFailure { -			ctx.log.WithError(err).WithField(logFieldProvider, providerNameNTP).Error(logMessageStartupCheckError) - -			failures = append(failures, providerNameNTP) +		if errors.As(err, &scerr) { +			ctx.GetLogger().WithField("providers", scerr.Failed()).Fatalf("One or more providers had fatal failures performing startup checks, for more details check the error level logs")  		} else { -			ctx.log.WithError(err).WithField(logFieldProvider, providerNameNTP).Warn(logMessageStartupCheckError) +			ctx.log.Fatal("Errors occurred performing startup checks")  		} -	} else { -		ctx.log.WithFields(map[string]any{logFieldProvider: providerNameNTP}).Trace(logMessageStartupCheckSuccess) -	} - -	ctx.log.WithFields(map[string]any{logFieldProvider: providerNameExpressions}).Trace(logMessageStartupCheckPerforming) - -	if err = doStartupCheck(ctx, providerNameExpressions, ctx.providers.UserAttributeResolver, false); err != nil { -		ctx.log.WithError(err).WithField(logFieldProvider, providerNameExpressions).Error(logMessageStartupCheckError) - -		failures = append(failures, providerNameExpressions) -	} else { -		ctx.log.WithFields(map[string]any{logFieldProvider: providerNameExpressions}).Trace(logMessageStartupCheckSuccess) -	} - -	if err = doStartupCheck(ctx, providerNameWebAuthnMetaData, ctx.providers.MetaDataService, !ctx.config.WebAuthn.Metadata.Enabled || ctx.providers.MetaDataService == nil); err != nil { -		ctx.log.WithError(err).WithField(logFieldProvider, providerNameWebAuthnMetaData).Error(logMessageStartupCheckError) - -		failures = append(failures, providerNameWebAuthnMetaData) -	} else { -		ctx.log.WithFields(map[string]any{logFieldProvider: providerNameWebAuthnMetaData}).Trace("Startup Check Completed Successfully")  	} -	if len(failures) != 0 { -		ctx.log.WithField("providers", failures).Fatalf("One or more providers had fatal failures performing startup checks, for more detail check the error level logs") -	} -} - -func doStartupCheck(ctx *CmdCtx, name string, provider model.StartupCheck, disabled bool) error { -	if disabled { -		ctx.log.Debugf("%s provider: startup check skipped as it is disabled", name) -		return nil -	} +	ctx.cconfig = nil -	if provider == nil { -		return fmt.Errorf("unrecognized provider or it is not configured properly") -	} +	ctx.log.Trace("Starting Services") -	return provider.StartupCheck() +	return service.RunAll(ctx)  }  | 
