// Copyright 2015 - Present, The Gogs Authors. All rights reserved. // Copyright 2018 - Present, Gitote. All rights reserved. // // This source code is licensed under the MIT license found in the // LICENSE file in the root directory of this source tree. package cmd import ( "fmt" "gitote/gitote/models" "gitote/gitote/pkg/setting" "reflect" "runtime" raven "github.com/getsentry/raven-go" "github.com/urfave/cli" ) var ( // Admin Initialize admin CLI Admin = cli.Command{ Name: "admin", Usage: "Perform admin operations on command line", Description: "Perform admin operations on command line", Subcommands: []cli.Command{ subcmdCreateUser, subcmdDeleteRepositoryArchives, subcmdDeleteMissingRepositories, subcmdGitGcRepos, subcmdRewriteAuthorizedKeys, subcmdSyncRepositoryHooks, subcmdReinitMissingRepositories, }, } subcmdCreateUser = cli.Command{ Name: "create-user", Usage: "Create a new user in database", Action: runCreateUser, Flags: []cli.Flag{ stringFlag("name", "", "Username"), stringFlag("password", "", "User password"), stringFlag("email", "", "User email address"), boolFlag("admin", "User is an admin"), stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } subcmdDeleteRepositoryArchives = cli.Command{ Name: "delete-repository-archives", Usage: "Delete all repositories archives", Action: adminDashboardOperation( models.DeleteRepositoryArchives, "All repositories archives have been deleted successfully", ), Flags: []cli.Flag{ stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } subcmdDeleteMissingRepositories = cli.Command{ Name: "delete-missing-repositories", Usage: "Delete all repository records that lost Git files", Action: adminDashboardOperation( models.DeleteMissingRepositories, "All repositories archives have been deleted successfully", ), Flags: []cli.Flag{ stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } subcmdGitGcRepos = cli.Command{ Name: "collect-garbage", Usage: "Do garbage collection on repositories", Action: adminDashboardOperation( models.GitGcRepos, "All repositories have done garbage collection successfully", ), Flags: []cli.Flag{ stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } subcmdRewriteAuthorizedKeys = cli.Command{ Name: "rewrite-authorized-keys", Usage: "Rewrite '.ssh/authorized_keys' file (caution: non-Gitote keys will be lost)", Action: adminDashboardOperation( models.RewriteAuthorizedKeys, "All public keys have been rewritten successfully", ), Flags: []cli.Flag{ stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } subcmdSyncRepositoryHooks = cli.Command{ Name: "resync-hooks", Usage: "Resync pre-receive, update and post-receive hooks", Action: adminDashboardOperation( models.SyncRepositoryHooks, "All repositories' pre-receive, update and post-receive hooks have been resynced successfully", ), Flags: []cli.Flag{ stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } subcmdReinitMissingRepositories = cli.Command{ Name: "reinit-missing-repositories", Usage: "Reinitialize all repository records that lost Git files", Action: adminDashboardOperation( models.ReinitMissingRepositories, "All repository records that lost Git files have been reinitialized successfully", ), Flags: []cli.Flag{ stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), }, } ) func runCreateUser(c *cli.Context) error { if !c.IsSet("name") { return fmt.Errorf("Username is not specified") } else if !c.IsSet("password") { return fmt.Errorf("Password is not specified") } else if !c.IsSet("email") { return fmt.Errorf("Email is not specified") } if c.IsSet("config") { setting.CustomConf = c.String("config") } setting.NewContext() models.LoadConfigs() models.SetEngine() if err := models.CreateUser(&models.User{ Name: c.String("name"), Email: c.String("email"), Passwd: c.String("password"), ThemeColor: "#161616", IsActive: true, IsAdmin: c.Bool("admin"), }); err != nil { raven.CaptureErrorAndWait(err, nil) return fmt.Errorf("CreateUser: %v", err) } fmt.Printf("New user '%s' has been successfully created!\n", c.String("name")) return nil } func adminDashboardOperation(operation func() error, successMessage string) func(*cli.Context) error { return func(c *cli.Context) error { if c.IsSet("config") { setting.CustomConf = c.String("config") } setting.NewContext() models.LoadConfigs() models.SetEngine() if err := operation(); err != nil { functionName := runtime.FuncForPC(reflect.ValueOf(operation).Pointer()).Name() return fmt.Errorf("%s: %v", functionName, err) } fmt.Printf("%s\n", successMessage) return nil } }