X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=scripts%2Fprune-storage.ts;h=4953a74399eb47a7239646bc5fee59b798149cca;hb=210feb6cc484a6c5c63c98f770de34e223f944cb;hp=b00f2093426ddcfac3f909afe9a8f5bdffc9606d;hpb=627621c1e8d37c33f7b3dd59f4c8907b12c630bc;p=github%2FChocobozzz%2FPeerTube.git diff --git a/scripts/prune-storage.ts b/scripts/prune-storage.ts index b00f20934..4953a7439 100755 --- a/scripts/prune-storage.ts +++ b/scripts/prune-storage.ts @@ -1,9 +1,11 @@ import * as prompt from 'prompt' import { join } from 'path' -import { CONFIG } from '../server/initializers/constants' +import { CONFIG } from '../server/initializers/config' import { VideoModel } from '../server/models/video/video' import { initDatabaseModels } from '../server/initializers' import { remove, readdir } from 'fs-extra' +import { VideoRedundancyModel } from '../server/models/redundancy/video-redundancy' +import { getUUIDFromFilename } from '../server/helpers/utils' run() .then(() => process.exit(0)) @@ -15,18 +17,29 @@ run() async function run () { await initDatabaseModels(true) - const storageToPrune = [ + const storageOnlyOwnedToPrune = [ CONFIG.STORAGE.VIDEOS_DIR, + CONFIG.STORAGE.TORRENTS_DIR, + CONFIG.STORAGE.REDUNDANCY_DIR + ] + + const storageForAllToPrune = [ CONFIG.STORAGE.PREVIEWS_DIR, - CONFIG.STORAGE.THUMBNAILS_DIR, - CONFIG.STORAGE.TORRENTS_DIR + CONFIG.STORAGE.THUMBNAILS_DIR ] let toDelete: string[] = [] - for (const directory of storageToPrune) { - toDelete = toDelete.concat(await pruneDirectory(directory)) + for (const directory of storageOnlyOwnedToPrune) { + toDelete = toDelete.concat(await pruneDirectory(directory, true)) + } + + for (const directory of storageForAllToPrune) { + toDelete = toDelete.concat(await pruneDirectory(directory, false)) } + const tmpFiles = await readdir(CONFIG.STORAGE.TMP_DIR) + toDelete = toDelete.concat(tmpFiles.map(t => join(CONFIG.STORAGE.TMP_DIR, t))) + if (toDelete.length === 0) { console.log('No files to delete.') return @@ -48,31 +61,32 @@ async function run () { } } -async function pruneDirectory (directory: string) { +async function pruneDirectory (directory: string, onlyOwned = false) { const files = await readdir(directory) const toDelete: string[] = [] for (const file of files) { const uuid = getUUIDFromFilename(file) let video: VideoModel + let localRedundancy: boolean - if (uuid) video = await VideoModel.loadByUUIDWithFile(uuid) + if (uuid) { + video = await VideoModel.loadByUUIDWithFile(uuid) + localRedundancy = await VideoRedundancyModel.isLocalByVideoUUIDExists(uuid) + } - if (!uuid || !video) toDelete.push(join(directory, file)) + if ( + !uuid || + !video || + (onlyOwned === true && (video.isOwned() === false && localRedundancy === false)) + ) { + toDelete.push(join(directory, file)) + } } return toDelete } -function getUUIDFromFilename (filename: string) { - const regex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ - const result = filename.match(regex) - - if (!result || Array.isArray(result) === false) return null - - return result[0] -} - async function askConfirmation () { return new Promise((res, rej) => { prompt.start() @@ -80,7 +94,9 @@ async function askConfirmation () { properties: { confirm: { type: 'string', - description: 'Are you sure you want to delete these files? Please check carefully', + description: 'These following unused files can be deleted, but please check your backups first (bugs happen).' + + ' Notice PeerTube must have been stopped when your ran this script.' + + ' Can we delete these files?', default: 'n', required: true }