Files
wireguard-ui/src/functions/backend/setup/manage-wireguard-host.ts
T
2026-09-14 07:56:13 +01:00

54 lines
1.5 KiB
TypeScript

import { AppData } from "@/src/data/app-data";
import grabDirNames from "@/src/utils/grab-dir-names";
import deriveWireguardInterfaceName from "@/src/utils/derive-wireguard-interface-name";
import type { APIResponseObject } from "@moduletrace/bunext/types";
import { execSync } from "node:child_process";
import path from "node:path";
const { WGUI_LIB_HOSTS_CONFIGS_DIR, WGUI_WG_QUICK_MANAGE_SCRIPT } =
grabDirNames();
export type WireguardHostAction = "up" | "down" | "restart";
type Params = {
action: WireguardHostAction;
host_id?: number;
};
export default function manageWireguardHost({
action,
host_id = AppData["WireguardHostID"],
}: Params): APIResponseObject {
const INTERFACE_NAME = deriveWireguardInterfaceName({ host_id });
const HOST_CONFIG_PATH = path.join(
WGUI_LIB_HOSTS_CONFIGS_DIR,
`${INTERFACE_NAME}.conf`,
);
const IS_ROOT =
typeof process.getuid === "function" && process.getuid() === 0;
if (!IS_ROOT) {
return {
success: false,
msg: "wg-ui must run as root to manage wireguard tunnels",
};
}
const MANAGE_COMMAND = `${WGUI_WG_QUICK_MANAGE_SCRIPT} ${action} ${INTERFACE_NAME} ${HOST_CONFIG_PATH}`;
try {
const output = execSync(MANAGE_COMMAND, { encoding: "utf-8" }).trim();
return {
success: true,
msg: output,
};
} catch (error: any) {
return {
success: false,
msg: `Could not ${action} ${INTERFACE_NAME}: ${error.message}`,
};
}
}