You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

admin.go 5.4 kB

8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2016 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package cmd
  6. import (
  7. "fmt"
  8. "code.gitea.io/git"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "github.com/urfave/cli"
  13. )
  14. var (
  15. // CmdAdmin represents the available admin sub-command.
  16. CmdAdmin = cli.Command{
  17. Name: "admin",
  18. Usage: "Perform admin operations on command line",
  19. Description: `Allow using internal logic of Gitea without hacking into the source code
  20. to make automatic initialization process more smoothly`,
  21. Subcommands: []cli.Command{
  22. subcmdCreateUser,
  23. subcmdChangePassword,
  24. subcmdRepoSyncReleases,
  25. },
  26. }
  27. subcmdCreateUser = cli.Command{
  28. Name: "create-user",
  29. Usage: "Create a new user in database",
  30. Action: runCreateUser,
  31. Flags: []cli.Flag{
  32. cli.StringFlag{
  33. Name: "name",
  34. Value: "",
  35. Usage: "Username",
  36. },
  37. cli.StringFlag{
  38. Name: "password",
  39. Value: "",
  40. Usage: "User password",
  41. },
  42. cli.StringFlag{
  43. Name: "email",
  44. Value: "",
  45. Usage: "User email address",
  46. },
  47. cli.BoolFlag{
  48. Name: "admin",
  49. Usage: "User is an admin",
  50. },
  51. cli.StringFlag{
  52. Name: "config, c",
  53. Value: "custom/conf/app.ini",
  54. Usage: "Custom configuration file path",
  55. },
  56. },
  57. }
  58. subcmdChangePassword = cli.Command{
  59. Name: "change-password",
  60. Usage: "Change a user's password",
  61. Action: runChangePassword,
  62. Flags: []cli.Flag{
  63. cli.StringFlag{
  64. Name: "username,u",
  65. Value: "",
  66. Usage: "The user to change password for",
  67. },
  68. cli.StringFlag{
  69. Name: "password,p",
  70. Value: "",
  71. Usage: "New password to set for user",
  72. },
  73. },
  74. }
  75. subcmdRepoSyncReleases = cli.Command{
  76. Name: "repo-sync-releases",
  77. Usage: "Synchronize repository releases with tags",
  78. Action: runRepoSyncReleases,
  79. }
  80. )
  81. func runChangePassword(c *cli.Context) error {
  82. if !c.IsSet("password") {
  83. return fmt.Errorf("Password is not specified")
  84. } else if !c.IsSet("username") {
  85. return fmt.Errorf("Username is not specified")
  86. }
  87. setting.NewContext()
  88. models.LoadConfigs()
  89. setting.NewXORMLogService(false)
  90. if err := models.SetEngine(); err != nil {
  91. return fmt.Errorf("models.SetEngine: %v", err)
  92. }
  93. uname := c.String("username")
  94. user, err := models.GetUserByName(uname)
  95. if err != nil {
  96. return fmt.Errorf("%v", err)
  97. }
  98. if user.Salt, err = models.GetUserSalt(); err != nil {
  99. return fmt.Errorf("%v", err)
  100. }
  101. user.HashPassword(c.String("password"))
  102. if err := models.UpdateUserCols(user, "passwd", "salt"); err != nil {
  103. return fmt.Errorf("%v", err)
  104. }
  105. fmt.Printf("User '%s' password has been successfully updated!\n", uname)
  106. return nil
  107. }
  108. func runCreateUser(c *cli.Context) error {
  109. if !c.IsSet("name") {
  110. return fmt.Errorf("Username is not specified")
  111. } else if !c.IsSet("password") {
  112. return fmt.Errorf("Password is not specified")
  113. } else if !c.IsSet("email") {
  114. return fmt.Errorf("Email is not specified")
  115. }
  116. if c.IsSet("config") {
  117. setting.CustomConf = c.String("config")
  118. }
  119. setting.NewContext()
  120. models.LoadConfigs()
  121. setting.NewXORMLogService(false)
  122. if err := models.SetEngine(); err != nil {
  123. return fmt.Errorf("models.SetEngine: %v", err)
  124. }
  125. if err := models.CreateUser(&models.User{
  126. Name: c.String("name"),
  127. Email: c.String("email"),
  128. Passwd: c.String("password"),
  129. IsActive: true,
  130. IsAdmin: c.Bool("admin"),
  131. }); err != nil {
  132. return fmt.Errorf("CreateUser: %v", err)
  133. }
  134. fmt.Printf("New user '%s' has been successfully created!\n", c.String("name"))
  135. return nil
  136. }
  137. func runRepoSyncReleases(c *cli.Context) error {
  138. setting.NewContext()
  139. models.LoadConfigs()
  140. setting.NewXORMLogService(false)
  141. if err := models.SetEngine(); err != nil {
  142. return fmt.Errorf("models.SetEngine: %v", err)
  143. }
  144. log.Trace("Synchronizing repository releases (this may take a while)")
  145. for page := 1; ; page++ {
  146. repos, count, err := models.SearchRepositoryByName(&models.SearchRepoOptions{
  147. Page: page,
  148. PageSize: models.RepositoryListDefaultPageSize,
  149. Private: true,
  150. })
  151. if err != nil {
  152. log.Fatal(4, "SearchRepositoryByName: %v", err)
  153. return err
  154. }
  155. if len(repos) == 0 {
  156. break
  157. }
  158. log.Trace("Processing next %d repos of %d", len(repos), count)
  159. for _, repo := range repos {
  160. log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RepoPath())
  161. gitRepo, err := git.OpenRepository(repo.RepoPath())
  162. if err != nil {
  163. log.Warn("OpenRepository: %v", err)
  164. continue
  165. }
  166. oldnum, err := models.GetReleaseCountByRepoID(repo.ID,
  167. models.FindReleasesOptions{
  168. IncludeDrafts: false,
  169. IncludeTags: true,
  170. })
  171. if err != nil {
  172. log.Warn(" GetReleaseCountByRepoID: %v", err)
  173. }
  174. log.Trace(" currentNumReleases is %d, running SyncReleasesWithTags", oldnum)
  175. if err = models.SyncReleasesWithTags(repo, gitRepo); err != nil {
  176. log.Warn(" SyncReleasesWithTags: %v", err)
  177. continue
  178. }
  179. count, err = models.GetReleaseCountByRepoID(repo.ID,
  180. models.FindReleasesOptions{
  181. IncludeDrafts: false,
  182. IncludeTags: true,
  183. })
  184. if err != nil {
  185. log.Warn(" GetReleaseCountByRepoID: %v", err)
  186. continue
  187. }
  188. log.Trace(" repo %s releases synchronized to tags: from %d to %d",
  189. repo.FullName(), oldnum, count)
  190. }
  191. }
  192. return nil
  193. }