package crontab import ( "context" "os" "path/filepath" "strings" "time" model "github.com/cloudreve/Cloudreve/v3/models" "github.com/cloudreve/Cloudreve/v3/pkg/cache" "github.com/cloudreve/Cloudreve/v3/pkg/filesystem" "github.com/cloudreve/Cloudreve/v3/pkg/util" ) func garbageCollect() { // 清理打包下载产生的临时文件 collectArchiveFile() // 清理过期的内置内存缓存 if store, ok := cache.Store.(*cache.MemoStore); ok { collectCache(store) } util.Log().Info("Crontab job \"cron_garbage_collect\" complete.") } func collectArchiveFile() { // 读取有效期、目录设置 tempPath := util.RelativePath(model.GetSettingByName("temp_path")) expires := model.GetIntSetting("download_timeout", 30) // 列出文件 root := filepath.Join(tempPath, "archive") err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err == nil && !info.IsDir() && strings.HasPrefix(filepath.Base(path), "archive_") && time.Now().Sub(info.ModTime()).Seconds() > float64(expires) { util.Log().Debug("Delete expired batch download temp file %q.", path) // 删除符合条件的文件 if err := os.Remove(path); err != nil { util.Log().Debug("Failed to delete temp file %q: %s", path, err) } } return nil }) if err != nil { util.Log().Debug("Crontab job cannot list temp batch download folder: %s", err) } } func collectCache(store *cache.MemoStore) { util.Log().Debug("Cleanup memory cache.") store.GarbageCollect() } func uploadSessionCollect() { placeholders := model.GetUploadPlaceholderFiles(0) // 将过期的上传会话按照用户分组 userToFiles := make(map[uint][]uint) for _, file := range placeholders { _, sessionExist := cache.Get(filesystem.UploadSessionCachePrefix + *file.UploadSessionID) if sessionExist { continue } if _, ok := userToFiles[file.UserID]; !ok { userToFiles[file.UserID] = make([]uint, 0) } userToFiles[file.UserID] = append(userToFiles[file.UserID], file.ID) } // 删除过期的会话 for uid, filesIDs := range userToFiles { user, err := model.GetUserByID(uid) if err != nil { util.Log().Warning("Owner of the upload session cannot be found: %s", err) continue } fs, err := filesystem.NewFileSystem(&user) if err != nil { util.Log().Warning("Failed to initialize filesystem: %s", err) continue } if err = fs.Delete(context.Background(), []uint{}, filesIDs, false, false); err != nil { util.Log().Warning("Failed to delete upload session: %s", err) } fs.Recycle() } util.Log().Info("Crontab job \"cron_recycle_upload_session\" complete.") }