diff options
author | zeripath <art27@cantab.net> | 2020-12-02 04:56:04 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-02 06:56:04 +0200 |
commit | 4569339a4b8ead2b9bb110f4b7fc393ef6b3b4ba (patch) | |
tree | 263a871fdaedcb45bc7fb29c59d83126c46fc563 /modules/doctor/doctor.go | |
parent | 253add883d378ec706f09a44136bc20b4ece1bf5 (diff) | |
download | gitea-4569339a4b8ead2b9bb110f4b7fc393ef6b3b4ba.tar.gz gitea-4569339a4b8ead2b9bb110f4b7fc393ef6b3b4ba.zip |
Refactor doctor (#12264)
* Refactor Logger
Refactor Logger to make a logger interface and make it possible to
wrap loggers for specific purposes.
* Refactor Doctor
Move the gitea doctor functions into its own module.
Use a logger for its messages instead of returning a results string[]
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Update modules/doctor/misc.go
Co-authored-by: 6543 <6543@obermui.de>
* Update modules/doctor/misc.go
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'modules/doctor/doctor.go')
-rw-r--r-- | modules/doctor/doctor.go | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/modules/doctor/doctor.go b/modules/doctor/doctor.go new file mode 100644 index 0000000000..8c0d467304 --- /dev/null +++ b/modules/doctor/doctor.go @@ -0,0 +1,105 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package doctor + +import ( + "fmt" + "sort" + "strings" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +// Check represents a Doctor check +type Check struct { + Title string + Name string + IsDefault bool + Run func(logger log.Logger, autofix bool) error + AbortIfFailed bool + SkipDatabaseInitialization bool + Priority int +} + +type wrappedLevelLogger struct { + log.LevelLogger +} + +func (w *wrappedLevelLogger) Log(skip int, level log.Level, format string, v ...interface{}) error { + return w.LevelLogger.Log( + skip+1, + level, + " - %s "+format, + append( + []interface{}{ + log.NewColoredValueBytes( + fmt.Sprintf("[%s]", strings.ToUpper(level.String()[0:1])), + level.Color()), + }, v...)...) +} + +func initDBDisableConsole(disableConsole bool) error { + setting.NewContext() + setting.InitDBConfig() + + setting.NewXORMLogService(disableConsole) + if err := models.SetEngine(); err != nil { + return fmt.Errorf("models.SetEngine: %v", err) + } + return nil +} + +// Checks is the list of available commands +var Checks []*Check + +// RunChecks runs the doctor checks for the provided list +func RunChecks(logger log.Logger, autofix bool, checks []*Check) error { + wrappedLogger := log.LevelLoggerLogger{ + LevelLogger: &wrappedLevelLogger{logger}, + } + + dbIsInit := false + for i, check := range checks { + if !dbIsInit && !check.SkipDatabaseInitialization { + // Only open database after the most basic configuration check + setting.EnableXORMLog = false + if err := initDBDisableConsole(true); err != nil { + logger.Error("Error whilst initializing the database: %v", err) + logger.Error("Check if you are using the right config file. You can use a --config directive to specify one.") + return nil + } + dbIsInit = true + } + logger.Info("[%d] %s", log.NewColoredIDValue(i+1), check.Title) + logger.Flush() + if err := check.Run(&wrappedLogger, autofix); err != nil { + if check.AbortIfFailed { + logger.Critical("FAIL") + return err + } + logger.Error("ERROR") + } else { + logger.Info("OK") + logger.Flush() + } + } + return nil +} + +// Register registers a command with the list +func Register(command *Check) { + Checks = append(Checks, command) + sort.SliceStable(Checks, func(i, j int) bool { + if Checks[i].Priority == Checks[j].Priority { + return Checks[i].Name < Checks[j].Name + } + if Checks[i].Priority == 0 { + return false + } + return Checks[i].Priority < Checks[j].Priority + }) +} |