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.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. "code.gitea.io/gitea/models/system"
  9. user_model "code.gitea.io/gitea/models/user"
  10. "code.gitea.io/gitea/modules/git"
  11. issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/updatechecker"
  14. asymkey_service "code.gitea.io/gitea/services/asymkey"
  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. return repo_service.GitGcRepos(ctx, rhcConfig.Timeout, git.ToTrustedCmdArgs(rhcConfig.Args))
  59. })
  60. }
  61. func registerRewriteAllPublicKeys() {
  62. RegisterTaskFatal("resync_all_sshkeys", &BaseConfig{
  63. Enabled: false,
  64. RunAtStart: false,
  65. Schedule: "@every 72h",
  66. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  67. return asymkey_service.RewriteAllPublicKeys(ctx)
  68. })
  69. }
  70. func registerRewriteAllPrincipalKeys() {
  71. RegisterTaskFatal("resync_all_sshprincipals", &BaseConfig{
  72. Enabled: false,
  73. RunAtStart: false,
  74. Schedule: "@every 72h",
  75. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  76. return asymkey_service.RewriteAllPrincipalKeys(ctx)
  77. })
  78. }
  79. func registerRepositoryUpdateHook() {
  80. RegisterTaskFatal("resync_all_hooks", &BaseConfig{
  81. Enabled: false,
  82. RunAtStart: false,
  83. Schedule: "@every 72h",
  84. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  85. return repo_service.SyncRepositoryHooks(ctx)
  86. })
  87. }
  88. func registerReinitMissingRepositories() {
  89. RegisterTaskFatal("reinit_missing_repos", &BaseConfig{
  90. Enabled: false,
  91. RunAtStart: false,
  92. Schedule: "@every 72h",
  93. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  94. return repo_service.ReinitMissingRepositories(ctx)
  95. })
  96. }
  97. func registerDeleteMissingRepositories() {
  98. RegisterTaskFatal("delete_missing_repos", &BaseConfig{
  99. Enabled: false,
  100. RunAtStart: false,
  101. Schedule: "@every 72h",
  102. }, func(ctx context.Context, user *user_model.User, _ Config) error {
  103. return repo_service.DeleteMissingRepositories(ctx, user)
  104. })
  105. }
  106. func registerRemoveRandomAvatars() {
  107. RegisterTaskFatal("delete_generated_repository_avatars", &BaseConfig{
  108. Enabled: false,
  109. RunAtStart: false,
  110. Schedule: "@every 72h",
  111. }, func(ctx context.Context, _ *user_model.User, _ Config) error {
  112. return repo_service.RemoveRandomAvatars(ctx)
  113. })
  114. }
  115. func registerDeleteOldActions() {
  116. RegisterTaskFatal("delete_old_actions", &OlderThanConfig{
  117. BaseConfig: BaseConfig{
  118. Enabled: false,
  119. RunAtStart: false,
  120. Schedule: "@every 168h",
  121. },
  122. OlderThan: 365 * 24 * time.Hour,
  123. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  124. olderThanConfig := config.(*OlderThanConfig)
  125. return activities_model.DeleteOldActions(ctx, olderThanConfig.OlderThan)
  126. })
  127. }
  128. func registerUpdateGiteaChecker() {
  129. type UpdateCheckerConfig struct {
  130. BaseConfig
  131. HTTPEndpoint string
  132. }
  133. RegisterTaskFatal("update_checker", &UpdateCheckerConfig{
  134. BaseConfig: BaseConfig{
  135. Enabled: true,
  136. RunAtStart: false,
  137. Schedule: "@every 168h",
  138. },
  139. HTTPEndpoint: "https://dl.gitea.com/gitea/version.json",
  140. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  141. updateCheckerConfig := config.(*UpdateCheckerConfig)
  142. return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint)
  143. })
  144. }
  145. func registerDeleteOldSystemNotices() {
  146. RegisterTaskFatal("delete_old_system_notices", &OlderThanConfig{
  147. BaseConfig: BaseConfig{
  148. Enabled: false,
  149. RunAtStart: false,
  150. Schedule: "@every 168h",
  151. },
  152. OlderThan: 365 * 24 * time.Hour,
  153. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  154. olderThanConfig := config.(*OlderThanConfig)
  155. return system.DeleteOldSystemNotices(ctx, olderThanConfig.OlderThan)
  156. })
  157. }
  158. func registerGCLFS() {
  159. if !setting.LFS.StartServer {
  160. return
  161. }
  162. type GCLFSConfig struct {
  163. OlderThanConfig
  164. LastUpdatedMoreThanAgo time.Duration
  165. NumberToCheckPerRepo int64
  166. ProportionToCheckPerRepo float64
  167. }
  168. RegisterTaskFatal("gc_lfs", &GCLFSConfig{
  169. OlderThanConfig: OlderThanConfig{
  170. BaseConfig: BaseConfig{
  171. Enabled: false,
  172. RunAtStart: false,
  173. Schedule: "@every 24h",
  174. },
  175. // Only attempt to garbage collect lfs meta objects older than a week as the order of git lfs upload
  176. // and git object upload is not necessarily guaranteed. It's possible to imagine a situation whereby
  177. // an LFS object is uploaded but the git branch is not uploaded immediately, or there are some rapid
  178. // changes in new branches that might lead to lfs objects becoming temporarily unassociated with git
  179. // objects.
  180. //
  181. // It is likely that a week is potentially excessive but it should definitely be enough that any
  182. // unassociated LFS object is genuinely unassociated.
  183. OlderThan: 24 * time.Hour * 7,
  184. },
  185. // Only GC things that haven't been looked at in the past 3 days
  186. LastUpdatedMoreThanAgo: 24 * time.Hour * 3,
  187. NumberToCheckPerRepo: 100,
  188. ProportionToCheckPerRepo: 0.6,
  189. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  190. gcLFSConfig := config.(*GCLFSConfig)
  191. return repo_service.GarbageCollectLFSMetaObjects(ctx, repo_service.GarbageCollectLFSMetaObjectsOptions{
  192. AutoFix: true,
  193. OlderThan: time.Now().Add(-gcLFSConfig.OlderThan),
  194. UpdatedLessRecentlyThan: time.Now().Add(-gcLFSConfig.LastUpdatedMoreThanAgo),
  195. })
  196. })
  197. }
  198. func registerRebuildIssueIndexer() {
  199. RegisterTaskFatal("rebuild_issue_indexer", &BaseConfig{
  200. Enabled: false,
  201. RunAtStart: false,
  202. Schedule: "@annually",
  203. }, func(ctx context.Context, _ *user_model.User, config Config) error {
  204. return issue_indexer.PopulateIssueIndexer(ctx)
  205. })
  206. }
  207. func initExtendedTasks() {
  208. registerDeleteInactiveUsers()
  209. registerDeleteRepositoryArchives()
  210. registerGarbageCollectRepositories()
  211. registerRewriteAllPublicKeys()
  212. registerRewriteAllPrincipalKeys()
  213. registerRepositoryUpdateHook()
  214. registerReinitMissingRepositories()
  215. registerDeleteMissingRepositories()
  216. registerRemoveRandomAvatars()
  217. registerDeleteOldActions()
  218. registerUpdateGiteaChecker()
  219. registerDeleteOldSystemNotices()
  220. registerGCLFS()
  221. registerRebuildIssueIndexer()
  222. }