mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
refactor(utils): use nsenter only if /host/proc is mounted
This commit is contained in:
@@ -33,7 +33,7 @@ export const formatSnapshotDuration = (seconds: number) => {
|
|||||||
export const RepositorySnapshotsTabContent = ({ repository }: Props) => {
|
export const RepositorySnapshotsTabContent = ({ repository }: Props) => {
|
||||||
const [searchQuery, setSearchQuery] = useState("");
|
const [searchQuery, setSearchQuery] = useState("");
|
||||||
|
|
||||||
const { data, isLoading, error } = useQuery({
|
const { data, isLoading, failureReason } = useQuery({
|
||||||
...listSnapshotsOptions({ path: { name: repository.name } }),
|
...listSnapshotsOptions({ path: { name: repository.name } }),
|
||||||
refetchInterval: 10000,
|
refetchInterval: 10000,
|
||||||
refetchOnWindowFocus: true,
|
refetchOnWindowFocus: true,
|
||||||
@@ -72,23 +72,23 @@ export const RepositorySnapshotsTabContent = ({ repository }: Props) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLoading && !data && !error) {
|
if (isLoading && !data && !failureReason) {
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<CardContent className="flex items-center justify-center py-12">
|
<CardContent className="flex items-center justify-center py-12">
|
||||||
<p className="text-muted-foreground">Loading snapshots...</p>
|
<p className="text-muted-foreground">Loading snapshots yo...</p>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error) {
|
if (failureReason) {
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<CardContent className="flex flex-col items-center justify-center text-center py-12">
|
<CardContent className="flex flex-col items-center justify-center text-center py-12">
|
||||||
<Database className="mb-4 h-12 w-12 text-destructive" />
|
<Database className="mb-4 h-12 w-12 text-destructive" />
|
||||||
<p className="text-destructive font-semibold">Failed to Load Snapshots</p>
|
<p className="text-destructive font-semibold">Failed to Load Snapshots</p>
|
||||||
<p className="text-sm text-muted-foreground mt-2">{error.message}</p>
|
<p className="text-sm text-muted-foreground mt-2">{failureReason.message}</p>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,14 +5,27 @@ import { promisify } from "node:util";
|
|||||||
import { OPERATION_TIMEOUT } from "../../../core/constants";
|
import { OPERATION_TIMEOUT } from "../../../core/constants";
|
||||||
import { toMessage } from "../../../utils/errors";
|
import { toMessage } from "../../../utils/errors";
|
||||||
import { logger } from "../../../utils/logger";
|
import { logger } from "../../../utils/logger";
|
||||||
|
import { access, constants } from "node:fs/promises";
|
||||||
|
|
||||||
const execFile = promisify(execFileCb);
|
const execFile = promisify(execFileCb);
|
||||||
|
|
||||||
export const executeMount = async (args: string[]): Promise<void> => {
|
export const executeMount = async (args: string[]): Promise<void> => {
|
||||||
const { stderr } = await execFile("nsenter", ["--mount=/host/proc/1/ns/mnt", "mount", ...args], {
|
let stderr: string | undefined;
|
||||||
timeout: OPERATION_TIMEOUT,
|
|
||||||
maxBuffer: 1024 * 1024,
|
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()) {
|
if (stderr?.trim()) {
|
||||||
logger.warn(stderr.trim());
|
logger.warn(stderr.trim());
|
||||||
@@ -20,10 +33,22 @@ export const executeMount = async (args: string[]): Promise<void> => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const executeUnmount = async (path: string): Promise<void> => {
|
export const executeUnmount = async (path: string): Promise<void> => {
|
||||||
const { stderr } = await execFile("nsenter", ["--mount=/host/proc/1/ns/mnt", "umount", "-l", "-f", path], {
|
let stderr: string | undefined;
|
||||||
timeout: OPERATION_TIMEOUT,
|
|
||||||
maxBuffer: 1024 * 1024,
|
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()) {
|
if (stderr?.trim()) {
|
||||||
logger.warn(stderr.trim());
|
logger.warn(stderr.trim());
|
||||||
|
|||||||
Reference in New Issue
Block a user