diff --git a/apps/client/app/modules/repositories/tabs/snapshots.tsx b/apps/client/app/modules/repositories/tabs/snapshots.tsx index 2d397dd..0f9e571 100644 --- a/apps/client/app/modules/repositories/tabs/snapshots.tsx +++ b/apps/client/app/modules/repositories/tabs/snapshots.tsx @@ -33,7 +33,7 @@ export const formatSnapshotDuration = (seconds: number) => { export const RepositorySnapshotsTabContent = ({ repository }: Props) => { const [searchQuery, setSearchQuery] = useState(""); - const { data, isLoading, error } = useQuery({ + const { data, isLoading, failureReason } = useQuery({ ...listSnapshotsOptions({ path: { name: repository.name } }), refetchInterval: 10000, refetchOnWindowFocus: true, @@ -72,23 +72,23 @@ export const RepositorySnapshotsTabContent = ({ repository }: Props) => { ); } - if (isLoading && !data && !error) { + if (isLoading && !data && !failureReason) { return ( -

Loading snapshots...

+

Loading snapshots yo...

); } - if (error) { + if (failureReason) { return (

Failed to Load Snapshots

-

{error.message}

+

{failureReason.message}

); diff --git a/apps/server/src/modules/backends/utils/backend-utils.ts b/apps/server/src/modules/backends/utils/backend-utils.ts index 9cb6e28..abdb98b 100644 --- a/apps/server/src/modules/backends/utils/backend-utils.ts +++ b/apps/server/src/modules/backends/utils/backend-utils.ts @@ -5,14 +5,27 @@ import { promisify } from "node:util"; import { OPERATION_TIMEOUT } from "../../../core/constants"; import { toMessage } from "../../../utils/errors"; import { logger } from "../../../utils/logger"; +import { access, constants } from "node:fs/promises"; const execFile = promisify(execFileCb); export const executeMount = async (args: string[]): Promise => { - const { stderr } = await execFile("nsenter", ["--mount=/host/proc/1/ns/mnt", "mount", ...args], { - timeout: OPERATION_TIMEOUT, - maxBuffer: 1024 * 1024, - }); + let stderr: string | undefined; + + try { + await access("/host/proc", constants.F_OK); + const result = await execFile("nsenter", ["--mount=/host/proc/1/ns/mnt", "mount", ...args], { + timeout: OPERATION_TIMEOUT, + maxBuffer: 1024 * 1024, + }); + stderr = result.stderr; + } catch (_) { + const result = await execFile("mount", args, { + timeout: OPERATION_TIMEOUT, + maxBuffer: 1024 * 1024, + }); + stderr = result.stderr; + } if (stderr?.trim()) { logger.warn(stderr.trim()); @@ -20,10 +33,22 @@ export const executeMount = async (args: string[]): Promise => { }; export const executeUnmount = async (path: string): Promise => { - const { stderr } = await execFile("nsenter", ["--mount=/host/proc/1/ns/mnt", "umount", "-l", "-f", path], { - timeout: OPERATION_TIMEOUT, - maxBuffer: 1024 * 1024, - }); + let stderr: string | undefined; + + try { + await access("/host/proc", constants.F_OK); + const result = await execFile("nsenter", ["--mount=/host/proc/1/ns/mnt", "umount", "-l", "-f", path], { + timeout: OPERATION_TIMEOUT, + maxBuffer: 1024 * 1024, + }); + stderr = result.stderr; + } catch (_) { + const result = await execFile("umount", ["-l", "-f", path], { + timeout: OPERATION_TIMEOUT, + maxBuffer: 1024 * 1024, + }); + stderr = result.stderr; + } if (stderr?.trim()) { logger.warn(stderr.trim());