Dockersafe rename (#1370)

* add dockerSafeRename function

* replace all rename functions

* add explanation to function
This commit is contained in:
Alex Christoffer Rasmussen
2024-12-10 23:27:51 +01:00
committed by GitHub
parent 7dbf64d100
commit 7915cc822d
3 changed files with 25 additions and 10 deletions
@@ -1,12 +1,13 @@
import { DatabaseModel, LogOrigin, ProjectFileListResponse } from 'ontime-types'; import { DatabaseModel, LogOrigin, ProjectFileListResponse } from 'ontime-types';
import { getErrorMessage } from 'ontime-utils'; import { getErrorMessage } from 'ontime-utils';
import { copyFile, rename } from 'fs/promises'; import { copyFile } from 'fs/promises';
import { logger } from '../../classes/Logger.js'; import { logger } from '../../classes/Logger.js';
import { publicDir } from '../../setup/index.js'; import { publicDir } from '../../setup/index.js';
import { import {
appendToName, appendToName,
dockerSafeRename,
ensureDirectory, ensureDirectory,
generateUniqueFileName, generateUniqueFileName,
getFileNameFromPath, getFileNameFromPath,
@@ -93,7 +94,7 @@ async function handleCorruptedFile(filePath: string, fileName: string): Promise<
// and make a new file with the recovered data // and make a new file with the recovered data
const newPath = appendToName(filePath, '(recovered)'); const newPath = appendToName(filePath, '(recovered)');
await rename(filePath, newPath); await dockerSafeRename(filePath, newPath);
return getFileNameFromPath(newPath); return getFileNameFromPath(newPath);
} }
@@ -231,7 +232,7 @@ export async function renameProjectFile(originalFile: string, newFilename: strin
} }
const pathToRenamed = getPathToProject(newFilename); const pathToRenamed = getPathToProject(newFilename);
await rename(projectFilePath, pathToRenamed); await dockerSafeRename(projectFilePath, pathToRenamed);
// Update the last loaded project config if current loaded project is the one being renamed // Update the last loaded project config if current loaded project is the one being renamed
const isLoaded = await isLastLoadedProject(originalFile); const isLoaded = await isLastLoadedProject(originalFile);
@@ -1,11 +1,16 @@
import { DatabaseModel, MaybeString, ProjectFile } from 'ontime-types'; import { DatabaseModel, MaybeString, ProjectFile } from 'ontime-types';
import { existsSync } from 'fs'; import { existsSync } from 'fs';
import { copyFile, readFile, rename, stat } from 'fs/promises'; import { copyFile, readFile, stat } from 'fs/promises';
import { extname, join } from 'path'; import { extname, join } from 'path';
import { publicDir } from '../../setup/index.js'; import { publicDir } from '../../setup/index.js';
import { ensureDirectory, getFilesFromFolder, removeFileExtension } from '../../utils/fileManagement.js'; import {
dockerSafeRename,
ensureDirectory,
getFilesFromFolder,
removeFileExtension,
} from '../../utils/fileManagement.js';
/** /**
* Handles the upload of a new project file * Handles the upload of a new project file
@@ -14,13 +19,13 @@ import { ensureDirectory, getFilesFromFolder, removeFileExtension } from '../../
*/ */
export async function handleUploaded(filePath: string, name: string) { export async function handleUploaded(filePath: string, name: string) {
const newFilePath = join(publicDir.projectsDir, name); const newFilePath = join(publicDir.projectsDir, name);
await rename(filePath, newFilePath); await dockerSafeRename(filePath, newFilePath);
} }
export async function handleImageUpload(filePath: string, name: string): Promise<string> { export async function handleImageUpload(filePath: string, name: string): Promise<string> {
ensureDirectory(publicDir.logoDir); ensureDirectory(publicDir.logoDir);
const newFilePath = join(publicDir.logoDir, name); const newFilePath = join(publicDir.logoDir, name);
await rename(filePath, newFilePath); await dockerSafeRename(filePath, newFilePath);
return name; return name;
} }
@@ -86,7 +91,7 @@ export async function copyCorruptFile(filePath: string, name: string): Promise<v
*/ */
export async function moveCorruptFile(filePath: string, name: string): Promise<void> { export async function moveCorruptFile(filePath: string, name: string): Promise<void> {
const newPath = join(publicDir.corruptDir, name); const newPath = join(publicDir.corruptDir, name);
return rename(filePath, newPath); return dockerSafeRename(filePath, newPath);
} }
/** /**
+11 -2
View File
@@ -1,5 +1,5 @@
import { existsSync, mkdirSync } from 'fs'; import { existsSync, mkdirSync, PathLike } from 'fs';
import { readdir, copyFile } from 'fs/promises'; import { readdir, copyFile, unlink } from 'fs/promises';
import { basename, extname, join, parse } from 'path'; import { basename, extname, join, parse } from 'path';
/** /**
@@ -105,3 +105,12 @@ export async function copyDirectory(src: string, dest: string) {
} }
} }
} }
/**
* workaround avoids origin errors in docker deployments
* EXDEV cross-device link not permitted
*/
export async function dockerSafeRename(oldPath: PathLike, newPath: PathLike) {
await copyFile(oldPath, newPath);
await unlink(oldPath);
}