|
|
|
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("定时任务 [cron_garbage_collect] 执行完毕")
|
|
|
|
}
|
|
|
|
|
|
|
|
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("删除过期打包下载临时文件 [%s]", path)
|
|
|
|
// 删除符合条件的文件
|
|
|
|
if err := os.Remove(path); err != nil {
|
|
|
|
util.Log().Debug("临时文件 [%s] 删除失败 , %s", path, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Debug("[定时任务] 无法列取临时打包目录")
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func collectCache(store *cache.MemoStore) {
|
|
|
|
util.Log().Debug("清理内存缓存")
|
|
|
|
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("上传会话所属用户不存在, %s", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
fs, err := filesystem.NewFileSystem(&user)
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Warning("无法初始化文件系统, %s", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if err = fs.Delete(context.Background(), []uint{}, filesIDs, false); err != nil {
|
|
|
|
util.Log().Warning("无法删除上传会话, %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
fs.Recycle()
|
|
|
|
}
|
|
|
|
|
|
|
|
util.Log().Info("定时任务 [cron_recycle_upload_session] 执行完毕")
|
|
|
|
}
|