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

tasks_extended.go 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package cron
  4. import (
  5. "context"
  6. "time"
  7. activities_model "code.gitea.io/gitea/models/activities"
  8. asymkey_model "code.gitea.io/gitea/models/asymkey"
  9. "code.gitea.io/gitea/models/db"
  10. "code.gitea.io/gitea/models/system"
  11. user_model "code.gitea.io/gitea/models/user"
  12. "code.gitea.io/gitea/modules/git"
  13. "code.gitea.io/gitea/modules/setting"
  14. "code.gitea.io/gitea/modules/updatechecker"
  15. repo_service "code.gitea.io/gitea/services/repository"
  16. archiver_service "code.gitea.io/gitea/services/repository/archiver"
  17. user_service "code.gitea.io/gitea/services/user"
  18. )
  19. func registerDeleteInactiveUsers() {
  20. RegisterTaskFatal("delete_inactive_accounts", &OlderThanConfig{
  21. BaseConfig: BaseConfig{
  22. Enabled: false,
  23. RunAtStart: false,
  24. Schedule: "@annually",
  25. },
  26. OlderThan: time.Minute * time.Duration(setting.Service.ActiveCodeLives),
  27. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  28. olderThanConfig := config.(*OlderThanConfig)
  29. return user_service.DeleteInactiveUsers(ctx, olderThanConfig.OlderThan)
  30. })
  31. }
  32. func registerDeleteRepositoryArchives() {
  33. RegisterTaskFatal("delete_repo_archives", &BaseConfig{
  34. Enabled: false,
  35. RunAtStart: false,
  36. Schedule: "@annually",
  37. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  38. return archiver_service.DeleteRepositoryArchives(ctx)
  39. })
  40. }
  41. func registerGarbageCollectRepositories() {
  42. type RepoHealthCheckConfig struct {
  43. BaseConfig
  44. Timeout time.Duration
  45. Args []string `delim:" "`
  46. }
  47. RegisterTaskFatal("git_gc_repos", &RepoHealthCheckConfig{
  48. BaseConfig: BaseConfig{
  49. Enabled: false,
  50. RunAtStart: false,
  51. Schedule: "@every 72h",
  52. },
  53. Timeout: time.Duration(setting.Git.Timeout.GC) * time.Second,
  54. Args: setting.Git.GCArgs,
  55. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  56. rhcConfig := config.(*RepoHealthCheckConfig)
  57. // the git args are set by config, they can be safe to be trusted
  58. args := make([]git.CmdArg, 0, len(rhcConfig.Args))
  59. for _, arg := range rhcConfig.Args {
  60. args = append(args, git.CmdArg(arg))
  61. }
  62. return repo_service.GitGcRepos(ctx, rhcConfig.Timeout, args...)
  63. })
  64. }
  65. func registerRewriteAllPublicKeys() {
  66. RegisterTaskFatal("resync_all_sshkeys", &BaseConfig{
  67. Enabled: false,
  68. RunAtStart: false,
  69. Schedule: "@every 72h",
  70. }, func(_ context.Context, _ *user_model.User, _ Config) error {
  71. return asymkey_model.RewriteAllPublicKeys()
  72. })
  73. }
  74. func registerRewriteAllPrincipalKeys() {
  75. RegisterTaskFatal("resync_all_sshprincipals", &BaseConfig{
  76. Enabled: false,
  77. RunAtStart: false,
  78. Schedule: "@every 72h",
  79. }, func(_ context.Context, _ *user_model.User, _ Config) error {
  80. return asymkey_model.RewriteAllPrincipalKeys(db.DefaultContext)
  81. })
  82. }
  83. func registerRepositoryUpdateHook() {
  84. RegisterTaskFatal("resync_all_hooks", &BaseConfig{
  85. Enabled: false,
  86. RunAtStart: false,
  87. Schedule: "@every 72h",
  88. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  89. return repo_service.SyncRepositoryHooks(ctx)
  90. })
  91. }
  92. func registerReinitMissingRepositories() {
  93. RegisterTaskFatal("reinit_missing_repos", &BaseConfig{
  94. Enabled: false,
  95. RunAtStart: false,
  96. Schedule: "@every 72h",
  97. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  98. return repo_service.ReinitMissingRepositories(ctx)
  99. })
  100. }
  101. func registerDeleteMissingRepositories() {
  102. RegisterTaskFatal("delete_missing_repos", &BaseConfig{
  103. Enabled: false,
  104. RunAtStart: false,
  105. Schedule: "@every 72h",
  106. }, func(ctx context.Context, user *user_model.User, _ Config) error {
  107. return repo_service.DeleteMissingRepositories(ctx, user)
  108. })
  109. }
  110. func registerRemoveRandomAvatars() {
  111. RegisterTaskFatal("delete_generated_repository_avatars", &BaseConfig{
  112. Enabled: false,
  113. RunAtStart: false,
  114. Schedule: "@every 72h",
  115. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  116. return repo_service.RemoveRandomAvatars(ctx)
  117. })
  118. }
  119. func registerDeleteOldActions() {
  120. RegisterTaskFatal("delete_old_actions", &OlderThanConfig{
  121. BaseConfig: BaseConfig{
  122. Enabled: false,
  123. RunAtStart: false,
  124. Schedule: "@every 168h",
  125. },
  126. OlderThan: 365 * 24 * time.Hour,
  127. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  128. olderThanConfig := config.(*OlderThanConfig)
  129. return activities_model.DeleteOldActions(olderThanConfig.OlderThan)
  130. })
  131. }
  132. func registerUpdateGiteaChecker() {
  133. type UpdateCheckerConfig struct {
  134. BaseConfig
  135. HTTPEndpoint string
  136. }
  137. RegisterTaskFatal("update_checker", &UpdateCheckerConfig{
  138. BaseConfig: BaseConfig{
  139. Enabled: true,
  140. RunAtStart: false,
  141. Schedule: "@every 168h",
  142. },
  143. HTTPEndpoint: "https://dl.gitea.io/gitea/version.json",
  144. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  145. updateCheckerConfig := config.(*UpdateCheckerConfig)
  146. return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint)
  147. })
  148. }
  149. func registerDeleteOldSystemNotices() {
  150. RegisterTaskFatal("delete_old_system_notices", &OlderThanConfig{
  151. BaseConfig: BaseConfig{
  152. Enabled: false,
  153. RunAtStart: false,
  154. Schedule: "@every 168h",
  155. },
  156. OlderThan: 365 * 24 * time.Hour,
  157. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  158. olderThanConfig := config.(*OlderThanConfig)
  159. return system.DeleteOldSystemNotices(olderThanConfig.OlderThan)
  160. })
  161. }
  162. func registerGCLFS() {
  163. if !setting.LFS.StartServer {
  164. return
  165. }
  166. type GCLFSConfig struct {
  167. OlderThanConfig
  168. LastUpdatedMoreThanAgo time.Duration
  169. NumberToCheckPerRepo int64
  170. ProportionToCheckPerRepo float64
  171. }
  172. RegisterTaskFatal("gc_lfs", &GCLFSConfig{
  173. OlderThanConfig: OlderThanConfig{
  174. BaseConfig: BaseConfig{
  175. Enabled: false,
  176. RunAtStart: false,
  177. Schedule: "@every 24h",
  178. },
  179. // Only attempt to garbage collect lfs meta objects older than a week as the order of git lfs upload
  180. // and git object upload is not necessarily guaranteed. It's possible to imagine a situation whereby
  181. // an LFS object is uploaded but the git branch is not uploaded immediately, or there are some rapid
  182. // changes in new branches that might lead to lfs objects becoming temporarily unassociated with git
  183. // objects.
  184. //
  185. // It is likely that a week is potentially excessive but it should definitely be enough that any
  186. // unassociated LFS object is genuinely unassociated.
  187. OlderThan: 24 * time.Hour * 7,
  188. },
  189. // Only GC things that haven't been looked at in the past 3 days
  190. LastUpdatedMoreThanAgo: 24 * time.Hour * 3,
  191. NumberToCheckPerRepo: 100,
  192. ProportionToCheckPerRepo: 0.6,
  193. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  194. gcLFSConfig := config.(*GCLFSConfig)
  195. return repo_service.GarbageCollectLFSMetaObjects(ctx, repo_service.GarbageCollectLFSMetaObjectsOptions{
  196. AutoFix: true,
  197. OlderThan: time.Now().Add(-gcLFSConfig.OlderThan),
  198. UpdatedLessRecentlyThan: time.Now().Add(-gcLFSConfig.LastUpdatedMoreThanAgo),
  199. })
  200. })
  201. }
  202. func initExtendedTasks() {
  203. registerDeleteInactiveUsers()
  204. registerDeleteRepositoryArchives()
  205. registerGarbageCollectRepositories()
  206. registerRewriteAllPublicKeys()
  207. registerRewriteAllPrincipalKeys()
  208. registerRepositoryUpdateHook()
  209. registerReinitMissingRepositories()
  210. registerDeleteMissingRepositories()
  211. registerRemoveRandomAvatars()
  212. registerDeleteOldActions()
  213. registerUpdateGiteaChecker()
  214. registerDeleteOldSystemNotices()
  215. registerGCLFS()
  216. }