From 042cac5fedeec8af53080b9666fe043072f3a6be Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 1 Dec 2021 15:50:01 +0800 Subject: Improve install code to avoid low-level mistakes. (#17779) * Improve install code to avoid low-level mistakes. If a user tries to do a re-install in a Gitea database, they gets a warning and double check. When Gitea runs, it never create empty app.ini automatically. Also some small (related) refactoring: * Refactor db.InitEngine related logic make it more clean (especially for the install code) * Move some i18n strings out from setting.go to make the setting.go can be easily maintained. * Show errors in CLI code if an incorrect app.ini is used. * APP_DATA_PATH is created when installing, and checked when starting (no empty directory is created any more). --- cmd/cmd.go | 17 ++++++++++------- cmd/convert.go | 1 - cmd/doctor.go | 2 +- cmd/dump.go | 3 ++- cmd/dump_repo.go | 1 - cmd/embedded.go | 2 +- cmd/mailer.go | 2 +- cmd/migrate.go | 1 - cmd/migrate_storage.go | 1 - cmd/restore_repo.go | 2 +- cmd/serv.go | 2 +- cmd/web.go | 14 +++++++++++++- 12 files changed, 30 insertions(+), 18 deletions(-) (limited to 'cmd') diff --git a/cmd/cmd.go b/cmd/cmd.go index b89dd5d8b8..fd713b9aff 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -16,6 +16,7 @@ import ( "syscall" "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" @@ -57,15 +58,17 @@ func confirm() (bool, error) { } func initDB(ctx context.Context) error { - return initDBDisableConsole(ctx, false) -} - -func initDBDisableConsole(ctx context.Context, disableConsole bool) error { - setting.NewContext() + setting.LoadFromExisting() setting.InitDBConfig() - setting.NewXORMLogService(disableConsole) + setting.NewXORMLogService(false) + + if setting.Database.Type == "" { + log.Fatal(`Database settings are missing from the configuration file: %q. +Ensure you are running in the correct environment or set the correct configuration file with -c. +If this is the intended configuration file complete the [database] section.`, setting.CustomConf) + } if err := db.InitEngine(ctx); err != nil { - return fmt.Errorf("models.SetEngine: %v", err) + return fmt.Errorf("unable to initialise the database using the configuration in %q. Error: %v", setting.CustomConf, err) } return nil } diff --git a/cmd/convert.go b/cmd/convert.go index 0b2e240b32..6d4d99a255 100644 --- a/cmd/convert.go +++ b/cmd/convert.go @@ -35,7 +35,6 @@ func runConvert(ctx *cli.Context) error { log.Info("Custom path: %s", setting.CustomPath) log.Info("Log path: %s", setting.LogRootPath) log.Info("Configuration file: %s", setting.CustomConf) - setting.InitDBConfig() if !setting.Database.UseMySQL { fmt.Println("This command can only be used with a MySQL database") diff --git a/cmd/doctor.go b/cmd/doctor.go index 27f91e41bb..54c18b83dc 100644 --- a/cmd/doctor.go +++ b/cmd/doctor.go @@ -87,7 +87,7 @@ func runRecreateTable(ctx *cli.Context) error { golog.SetPrefix("") golog.SetOutput(log.NewLoggerAsWriter("INFO", log.GetLogger(log.DEFAULT))) - setting.NewContext() + setting.LoadFromExisting() setting.InitDBConfig() setting.EnableXORMLog = ctx.Bool("debug") diff --git a/cmd/dump.go b/cmd/dump.go index efb9397208..c158ee21f1 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -159,7 +159,8 @@ func runDump(ctx *cli.Context) error { fatal("Deleting default logger failed. Can not write to stdout: %v", err) } } - setting.NewContext() + setting.LoadFromExisting() + // make sure we are logging to the console no matter what the configuration tells us do to if _, err := setting.Cfg.Section("log").NewKey("MODE", "console"); err != nil { fatal("Setting logging mode to console failed: %v", err) diff --git a/cmd/dump_repo.go b/cmd/dump_repo.go index 31f4574c2d..1a9344dbe1 100644 --- a/cmd/dump_repo.go +++ b/cmd/dump_repo.go @@ -88,7 +88,6 @@ func runDumpRepository(ctx *cli.Context) error { log.Info("Custom path: %s", setting.CustomPath) log.Info("Log path: %s", setting.LogRootPath) log.Info("Configuration file: %s", setting.CustomConf) - setting.InitDBConfig() var ( serviceType structs.GitServiceType diff --git a/cmd/embedded.go b/cmd/embedded.go index 2aeaba4786..c608667bf8 100644 --- a/cmd/embedded.go +++ b/cmd/embedded.go @@ -115,7 +115,7 @@ func initEmbeddedExtractor(c *cli.Context) error { log.DelNamedLogger(log.DEFAULT) // Read configuration file - setting.NewContext() + setting.LoadAllowEmpty() pats, err := getPatterns(c.Args()) if err != nil { diff --git a/cmd/mailer.go b/cmd/mailer.go index a3d6baaa27..35fcb302f8 100644 --- a/cmd/mailer.go +++ b/cmd/mailer.go @@ -18,7 +18,7 @@ func runSendMail(c *cli.Context) error { ctx, cancel := installSignals() defer cancel() - setting.NewContext() + setting.LoadFromExisting() if err := argsSet(c, "title"); err != nil { return err diff --git a/cmd/migrate.go b/cmd/migrate.go index 054772d9ec..49a13adeb5 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -36,7 +36,6 @@ func runMigrate(ctx *cli.Context) error { log.Info("Custom path: %s", setting.CustomPath) log.Info("Log path: %s", setting.LogRootPath) log.Info("Configuration file: %s", setting.CustomConf) - setting.InitDBConfig() if err := db.InitEngineWithMigration(context.Background(), migrations.Migrate); err != nil { log.Fatal("Failed to initialize ORM engine: %v", err) diff --git a/cmd/migrate_storage.go b/cmd/migrate_storage.go index afb0fc02a3..f8e2378cac 100644 --- a/cmd/migrate_storage.go +++ b/cmd/migrate_storage.go @@ -121,7 +121,6 @@ func runMigrateStorage(ctx *cli.Context) error { log.Info("Custom path: %s", setting.CustomPath) log.Info("Log path: %s", setting.LogRootPath) log.Info("Configuration file: %s", setting.CustomConf) - setting.InitDBConfig() if err := db.InitEngineWithMigration(context.Background(), migrations.Migrate); err != nil { log.Fatal("Failed to initialize ORM engine: %v", err) diff --git a/cmd/restore_repo.go b/cmd/restore_repo.go index 1208796c9b..357bd92c77 100644 --- a/cmd/restore_repo.go +++ b/cmd/restore_repo.go @@ -50,7 +50,7 @@ func runRestoreRepository(c *cli.Context) error { ctx, cancel := installSignals() defer cancel() - setting.NewContext() + setting.LoadFromExisting() statusCode, errStr := private.RestoreRepo( ctx, diff --git a/cmd/serv.go b/cmd/serv.go index e1a1d4cb72..e34e300cbe 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -58,7 +58,7 @@ func setup(logPath string, debug bool) { } else { _ = log.NewLogger(1000, "console", "console", `{"level":"fatal","stacktracelevel":"NONE","stderr":true}`) } - setting.NewContext() + setting.LoadFromExisting() if debug { setting.RunMode = "dev" } diff --git a/cmd/web.go b/cmd/web.go index 4b6dfa71a2..fbd62191a6 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -124,6 +124,10 @@ func runWeb(ctx *cli.Context) error { } c := install.Routes() err := listen(c, false) + if err != nil { + log.Critical("Unable to open listener for installer. Is Gitea already running?") + graceful.GetManager().DoGracefulShutdown() + } select { case <-graceful.GetManager().IsShutdown(): <-graceful.GetManager().Done() @@ -145,7 +149,15 @@ func runWeb(ctx *cli.Context) error { log.Info("Global init") // Perform global initialization - routers.GlobalInit(graceful.GetManager().HammerContext()) + setting.LoadFromExisting() + routers.GlobalInitInstalled(graceful.GetManager().HammerContext()) + + // We check that AppDataPath exists here (it should have been created during installation) + // We can't check it in `GlobalInitInstalled`, because some integration tests + // use cmd -> GlobalInitInstalled, but the AppDataPath doesn't exist during those tests. + if _, err := os.Stat(setting.AppDataPath); err != nil { + log.Fatal("Can not find APP_DATA_PATH '%s'", setting.AppDataPath) + } // Override the provided port number within the configuration if ctx.IsSet("port") { -- cgit v1.2.3