Path: blob/master/src/packages/file-server/btrfs/util.ts
1539 views
import {1type ExecuteCodeOptions,2type ExecuteCodeOutput,3} from "@cocalc/util/types/execute-code";4import { executeCode } from "@cocalc/backend/execute-code";5import getLogger from "@cocalc/backend/logger";6import { stat } from "node:fs/promises";78const logger = getLogger("file-server:storage:util");910const DEFAULT_EXEC_TIMEOUT_MS = 60 * 1000;1112export async function mkdirp(paths: string[]) {13if (paths.length == 0) return;14await sudo({ command: "mkdir", args: ["-p", ...paths] });15}1617export async function sudo(18opts: ExecuteCodeOptions & { desc?: string },19): Promise<ExecuteCodeOutput> {20if (opts.verbose !== false && opts.desc) {21logger.debug("exec", opts.desc);22}23let command, args;24if (opts.bash) {25command = `sudo ${opts.command}`;26args = undefined;27} else {28command = "sudo";29args = [opts.command, ...(opts.args ?? [])];30}31return await executeCode({32verbose: true,33timeout: DEFAULT_EXEC_TIMEOUT_MS / 1000,34...opts,35command,36args,37});38}3940export async function btrfs(41opts: Partial<ExecuteCodeOptions & { desc?: string }>,42) {43return await sudo({ ...opts, command: "btrfs" });44}4546export async function isdir(path: string) {47return (await stat(path)).isDirectory();48}4950export function parseBupTime(s: string): Date {51const [year, month, day, time] = s.split("-");52const hours = time.slice(0, 2);53const minutes = time.slice(2, 4);54const seconds = time.slice(4, 6);5556return new Date(57Number(year),58Number(month) - 1, // JS months are 0-based59Number(day),60Number(hours),61Number(minutes),62Number(seconds),63);64}656667