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