From 523cc04105fe54f1f14e5a0662a3eef67b920b95 Mon Sep 17 00:00:00 2001 From: Shahrad Elahi Date: Thu, 21 Dec 2023 15:42:26 +0330 Subject: [PATCH] fix the issue with `healthcheck` and silence the annoying warning form `sveltekit-superforms` --- web/src/lib/wireguard/index.ts | 33 ++++++++++++++++++++++++++++ web/src/routes/api/health/+server.ts | 18 +++++++++------ web/src/routes/login/+page.svelte | 3 +++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/web/src/lib/wireguard/index.ts b/web/src/lib/wireguard/index.ts index b4942cf..2c69fcf 100644 --- a/web/src/lib/wireguard/index.ts +++ b/web/src/lib/wireguard/index.ts @@ -131,6 +131,32 @@ export class WGServer { await this.update({ confHash: getConfigHash(wg.confId) }); } + async hasInterface(): Promise { + const server = await this.get(); + return await Network.checkInterfaceExists(`wg${server.confId}`); + } + + async getUsage(): Promise { + const server = await this.get(); + const hasInterface = await this.hasInterface(); + if (!hasInterface) { + logger.error('GetUsage: interface does not exists'); + return new Map(); + } + + const res = await Shell.exec(`wg show wg${server.confId} transfer`); + const lines = res.split('\n'); + + const usages: WgUsage = new Map(); + for (const line of lines) { + const [peer, rx, tx] = line.split('\t'); + if (!peer) continue; + usages.set(peer, { rx: Number(rx), tx: Number(tx) }); + } + + return usages; + } + static async getFreePeerIp(serverId: string): Promise { const server = await findServer(serverId); if (!server) { @@ -154,6 +180,13 @@ export class WGServer { } } +export type WgUsage = Map; + +export type PeerUsage = { + rx: number; + tx: number; +}; + class WGPeers { private readonly server: WGServer; diff --git a/web/src/routes/api/health/+server.ts b/web/src/routes/api/health/+server.ts index 5d7d8e8..6be0a2e 100644 --- a/web/src/routes/api/health/+server.ts +++ b/web/src/routes/api/health/+server.ts @@ -1,18 +1,22 @@ import type { RequestHandler } from '@sveltejs/kit'; -import { getConfigHash, getServers, WGServer } from '$lib/wireguard'; +import { getServers, WGServer } from '$lib/wireguard'; import logger from '$lib/logger'; export const GET: RequestHandler = async () => { try { - const servers = await getServers(); + for (const { id } of await getServers()) { + const wg = new WGServer(id); + const server = await wg.get(); + const hasInterface = await wg.hasInterface(); - for (const s of servers) { - const wg = new WGServer(s.id); - - // Start server - if (s.status === 'up') { + // If the server is up and the interface doesn't exist, start it + if (server.status === 'up' && !hasInterface) { await wg.start(); } + + if (server.status === 'down' && hasInterface) { + await wg.stop(); + } } } catch (e) { logger.error('APIFailed: HealthCheck:', e); diff --git a/web/src/routes/login/+page.svelte b/web/src/routes/login/+page.svelte index 425f107..de41adb 100644 --- a/web/src/routes/login/+page.svelte +++ b/web/src/routes/login/+page.svelte @@ -18,6 +18,9 @@ const options: FormOptions = { validators: formSchema, + warnings: { + noValidationAndConstraints: false, + }, onResult: ({ result }) => { if (result.type === 'success') { goto('/');