From 96d2696e17e31e9245ad19db7d93d9bfe53d497a Mon Sep 17 00:00:00 2001 From: axel Date: Sat, 19 Apr 2025 21:54:58 +0200 Subject: [PATCH] feat: sending wake packets, closes #10 --- src/lib/v2/toast/Notification.svelte | 2 +- src/lib/v2/ui/ResCard.svelte | 20 +++++---- src/routes/dash/devices/+page.server.ts | 45 +++++++++++++++++++- src/routes/dash/devices/+page.svelte | 24 ++++++++++- src/routes/dash/devices/[id]/+page.server.ts | 26 +---------- 5 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/lib/v2/toast/Notification.svelte b/src/lib/v2/toast/Notification.svelte index af54f46..32f9f13 100644 --- a/src/lib/v2/toast/Notification.svelte +++ b/src/lib/v2/toast/Notification.svelte @@ -34,7 +34,7 @@ }} > {#if data.Icon} - + {/if}

{data.content}

{#if data.dismissable} diff --git a/src/lib/v2/ui/ResCard.svelte b/src/lib/v2/ui/ResCard.svelte index 601c923..248a536 100644 --- a/src/lib/v2/ui/ResCard.svelte +++ b/src/lib/v2/ui/ResCard.svelte @@ -1,9 +1,10 @@
{/if} - {#if wakePost} - - - + {#if wakeId} +
+ + + + +
{/if}
diff --git a/src/routes/dash/devices/+page.server.ts b/src/routes/dash/devices/+page.server.ts index 4cf44c6..e61757a 100644 --- a/src/routes/dash/devices/+page.server.ts +++ b/src/routes/dash/devices/+page.server.ts @@ -1,5 +1,7 @@ +import { FORBIDDEN, SUCCESS } from '$lib/server/commonResponses'; import { users } from '$lib/server/db'; -import type { ServerLoad } from '@sveltejs/kit'; +import { fail, type Actions, type ServerLoad } from '@sveltejs/kit'; +import { wake } from 'wake_on_lan'; export const load: ServerLoad = async ({ locals: { guard } }) => { const user = guard.requiresAuth().orRedirects().getUser(); @@ -7,3 +9,44 @@ export const load: ServerLoad = async ({ locals: { guard } }) => { devices: await users.fetchDevices(user.id), }; }; + +export const actions = { + wake: async ({ locals: { guard }, request }) => { + guard = guard.requiresAuth(); + if (guard.isFailed()) return FORBIDDEN; + + const deviceId = (await request.formData()).get('id'); + const device = (await users.fetchDevices(guard.getUser().id)).find((d) => d.id === deviceId); + + if (!device) { + return fail(404, { error: 'Could not find device.' }); + } + + console.log( + `Sending WOL packets to ${device.name} (${device.mac}) on ${guard.getUser().name}'s request.`, + ); + + const err = await new Promise((resolve) => { + wake( + device.mac, + { + address: device.broadcast, + port: device.port, + num_packets: device.packets, + }, + (err: any) => { + resolve(err); + }, + ); + }); + + if (err) { + console.error(err); + return fail(500, { + error: 'An error occured while trying to wake the device. Please see logs.', + }); + } + + return { ...SUCCESS, deviceName: device.name }; + }, +} satisfies Actions; diff --git a/src/routes/dash/devices/+page.svelte b/src/routes/dash/devices/+page.svelte index 96cc5b0..cb293dd 100644 --- a/src/routes/dash/devices/+page.svelte +++ b/src/routes/dash/devices/+page.svelte @@ -1,11 +1,31 @@ @@ -15,7 +35,7 @@ title={device.name} subtitle={device.mac} editHref={data.user.admin ? `/dash/devices/${device.id}` : null} - wakePost={`/dash/devices/${device.id}/wake`} + wakeId={device.id} /> {/each} diff --git a/src/routes/dash/devices/[id]/+page.server.ts b/src/routes/dash/devices/[id]/+page.server.ts index 894fd6e..0f15407 100644 --- a/src/routes/dash/devices/[id]/+page.server.ts +++ b/src/routes/dash/devices/[id]/+page.server.ts @@ -1,9 +1,8 @@ import { FORBIDDEN, PARSE_ERROR, SUCCESS } from '$lib/server/commonResponses'; -import { devices, users } from '$lib/server/db/index.js'; -import { fail, redirect, type Actions, type ServerLoad } from '@sveltejs/kit'; +import { devices } from '$lib/server/db/index.js'; +import { redirect, type Actions, type ServerLoad } from '@sveltejs/kit'; import { decode } from 'decode-formdata'; import validator from 'validator'; -import { wake } from 'wake_on_lan'; import { z } from 'zod'; export const load: ServerLoad = async ({ locals: { guard }, params }) => { @@ -65,25 +64,4 @@ export const actions = { const err = await devices.delete(params.id ?? ''); return err ? err.toFail() : SUCCESS; }, - - wake: async ({ params, locals: { guard } }) => { - guard = guard.requiresAuth(); - if (guard.isFailed()) return FORBIDDEN; - - const device = (await users.fetchDevices(guard.getUser().id)).find((d) => d.id === params.id); - - if (!device) { - return fail(404); - } - - console.log('Trying to wake ' + device.name); - - wake(device.mac, { - address: device.broadcast, - port: device.port, - num_packets: device.packets, - }); - - return SUCCESS; - }, } satisfies Actions;