Files
wireguard-ui/src/functions/backend/setup/delete-wireguard-host.ts
T

134 lines
3.8 KiB
TypeScript

import type {
BUN_SQLITE_WGUI_CLIENTS,
BUN_SQLITE_WGUI_CLIENT_RULES,
BUN_SQLITE_WGUI_HOSTS,
} from "@/db/types/db";
import BunSQLite from "@moduletrace/bun-sqlite";
import type { APIResponseObject } from "@moduletrace/bunext/types";
import type { TableType, User } from "@/src/types";
import manageWireguardHost from "./manage-wireguard-host";
import grabHostDirnames from "./grab-host-dir-names";
import grabClientDirnames from "./grab-client-dir-names";
import removeSubnetFirewallRules from "../firewall/remove-subnet-firewall-rules";
import { AppData } from "@/src/data/app-data";
import { execSync } from "node:child_process";
type Params = {
host_id: number;
user: User;
};
export default async function deleteWireguardHost({
host_id,
user,
}: Params): Promise<APIResponseObject> {
try {
const host_clients_res = await BunSQLite.select<
BUN_SQLITE_WGUI_CLIENTS,
TableType
>({
table: "clients",
query: {
query: {
host_id: { value: String(host_id) },
},
},
});
const clients = host_clients_res.payload || [];
for (let i = 0; i < clients.length; i++) {
const client = clients[i];
if (!client?.id) continue;
await BunSQLite.delete<BUN_SQLITE_WGUI_CLIENT_RULES, TableType>({
table: "client_rules",
query: {
query: {
client_id: { value: String(client.id) },
},
},
});
const { CLIENT_DIR } = grabClientDirnames({
client,
host_id,
});
try {
execSync(`rm -rf ${CLIENT_DIR}`, { encoding: "utf-8" });
} catch {}
await BunSQLite.delete<BUN_SQLITE_WGUI_CLIENTS, TableType>({
table: "clients",
targetId: client.id,
});
}
const { HOST_CONFIG_DIR, INTERFACE_NAME } = grabHostDirnames({
host: { id: host_id },
});
try {
manageWireguardHost({
action: "down",
host_id,
});
} catch {}
try {
const host_res = await BunSQLite.select<
BUN_SQLITE_WGUI_HOSTS,
TableType
>({
table: "hosts",
targetId: host_id,
});
const host = host_res.singleRes;
if (host?.wg_ip_address) {
const host_subnet = `${host.wg_ip_address
.split(".")
.slice(0, 3)
.join(".")}.0/24`;
const firewall_res = await removeSubnetFirewallRules({
subnet: host_subnet,
listen_port:
host.listen_port || AppData["DefaultWGListenPort"],
});
if (!firewall_res.success) {
console.log(
`Warning removing firewall rules for host ${host_id} => ${firewall_res.msg}`,
);
}
}
} catch (error: any) {
console.log(
`Warning removing firewall rules for host ${host_id} => ${error.message}`,
);
}
try {
execSync(`rm -rf ${HOST_CONFIG_DIR}`, { encoding: "utf-8" });
} catch {}
const del_host = await BunSQLite.sql({
sql: `DELETE FROM HOSTS WHERE id=?`,
values: [host_id],
});
return {
success: true,
msg: `Host ${host_id} deleted`,
};
} catch (error: any) {
return {
success: false,
msg: error.message,
};
}
}