feat: add "wake group" button

This commit is contained in:
Maxi Quoß
2025-05-21 23:34:45 +02:00
parent 2ae595ad13
commit c05ea6266f
17 changed files with 1526 additions and 530 deletions

View File

@@ -10,6 +10,7 @@ import (
"strings"
"time"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/router"
@@ -169,6 +170,40 @@ func HandlerShutdown(e *core.RequestEvent) error {
return e.JSON(http.StatusOK, record)
}
func HandlerWakeGroup(e *core.RequestEvent) error {
records, err := e.App.FindRecordsByFilter("devices", "groups.id = {:grpId} && status = 'offline'", "", 0, 0,
dbx.Params{"grpId": e.Request.PathValue("id")},
)
if err != nil {
return apis.NewNotFoundError("No devices in group", err)
}
for _, record := range records {
go func() {
record.Set("status", "pending")
if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err)
}
if err := networking.WakeDevice(record); err != nil {
logger.Error.Println(err)
record.Set("status", "offline")
if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err)
}
return
}
record.Set("status", "online")
if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err)
}
}()
}
return e.JSON(http.StatusOK, records)
}
type Nmaprun struct {
Host []struct {
Address []struct {

View File

@@ -63,6 +63,7 @@ func StartPocketBase(distDirFS fs.FS) {
se.Router.GET("/{path...}", apis.Static(distDirFS, true))
se.Router.GET("/api/upsnap/wake/{id}", HandlerWake).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/wakegroup/{id}", HandlerWakeGroup).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/sleep/{id}", HandlerSleep).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/reboot/{id}", HandlerReboot).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/shutdown/{id}", HandlerShutdown).Bind(RequireUpSnapPermission())

1984
frontend/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,12 +4,13 @@
import PageLoading from '$lib/components/PageLoading.svelte';
import { m } from '$lib/paraglide/messages';
import { localeStore } from '$lib/stores/locale';
import { permission, pocketbase } from '$lib/stores/pocketbase';
import { backendUrl, permission, pocketbase } from '$lib/stores/pocketbase';
import type { Device, Group } from '$lib/types/device';
import {
faChevronCircleLeft,
faChevronCircleRight,
faPlus,
faPowerOff,
faWarning
} from '@fortawesome/free-solid-svg-icons';
import { onMount } from 'svelte';
@@ -56,7 +57,7 @@
return filteredDevices().reduce(
(groups, dev) => {
dev.expand?.groups?.forEach((group: Group) => {
groups[group.name] = [...(groups[group.name] || []), dev];
groups[group.id] = [...(groups[group.id] || []), dev];
});
return groups;
},
@@ -80,6 +81,16 @@
}
}
function wakeGroup(group: string) {
fetch(`${backendUrl}api/upsnap/wakegroup/${group}`, {
headers: {
Authorization: $pocketbase.authStore.token
}
}).catch((err) => {
toast.error(err.message);
});
}
onMount(() => {
orderBy = (localStorage.getItem('orderBy') as 'name' | 'ip') || 'name';
orderByGroups = localStorage.getItem('orderByGroups') !== 'false';
@@ -161,7 +172,13 @@
{/if}
{#each Object.entries(devicesWithGroup()).sort( ([a], [b]) => a.localeCompare( b, $localeStore, { numeric: true } ) ) as [group, groupDevices]}
<div>
<h1 class="mb-3 text-2xl font-bold">{group}</h1>
<h1 class="mb-3 text-2xl font-bold">
{groupDevices[0].expand.groups.find((grp) => grp.id === group)?.name ||
'Unknown group name'}
<button class="btn btn-sm btn-success btn-soft" on:click={() => wakeGroup(group)}
><Fa icon={faPowerOff} /> {m.home_wake_group()}</button
>
</h1>
<div class={gridClass}>
{#each groupDevices.sort( (a, b) => a[orderBy].localeCompare( b[orderBy], $localeStore, { numeric: true } ) ) as device}
<DeviceCard {device} />

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Sortieren",
"home_page_title": "Home",
"home_search_placeholder": "Suche nach Geräten",
"home_wake_group": "Gruppe wecken",
"login_btn_login": "Login",
"login_btn_more": "Mehr",
"login_email_label": "Email oder Nutzername:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Order",
"home_page_title": "Home",
"home_search_placeholder": "Search for devices",
"home_wake_group": "Wake group",
"login_btn_login": "Login",
"login_btn_more": "More",
"login_email_label": "Email or Username:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Orden",
"home_page_title": "Inicio",
"home_search_placeholder": "Buscar dispositivos",
"home_wake_group": "Grupo Wake",
"login_btn_login": "Entrar",
"login_btn_more": "Más",
"login_email_label": "Email o Nombre de usuario:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Tri",
"home_page_title": "Accueil",
"home_search_placeholder": "Recherche de dispositifs",
"home_wake_group": "Groupe de réveil",
"login_btn_login": "Connexion",
"login_btn_more": "Plus",
"login_email_label": "Courriel ou nom d'utilisateur :",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Urutan",
"home_page_title": "Beranda",
"home_search_placeholder": "Mencari perangkat",
"home_wake_group": "Kelompok bangun",
"login_btn_login": "Masuk",
"login_btn_more": "Lainnya",
"login_email_label": "Email atau Nama Pengguna:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Ordine",
"home_page_title": "Home",
"home_search_placeholder": "Ricerca di dispositivi",
"home_wake_group": "Gruppo Wake",
"login_btn_login": "Login",
"login_btn_more": "Di più...",
"login_email_label": "Email o nome utente:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "順序",
"home_page_title": "ホーム",
"home_search_placeholder": "デバイスの検索",
"home_wake_group": "ウェークグループ",
"login_btn_login": "ログイン",
"login_btn_more": "詳細",
"login_email_label": "メールアドレスまたはユーザー名:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "정렬",
"home_page_title": "홈",
"home_search_placeholder": "기기 검색",
"home_wake_group": "깨우기 그룹",
"login_btn_login": "로그인",
"login_btn_more": "더보기",
"login_email_label": "이메일 또는 사용자명",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Sorteren",
"home_page_title": "Home",
"home_search_placeholder": "Apparaten zoeken",
"home_wake_group": "Wake groep",
"login_btn_login": "Inloggen",
"login_btn_more": "Meer",
"login_email_label": "E-mail of gebruikersnaam:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Kolejność",
"home_page_title": "Strona Główna",
"home_search_placeholder": "Wyszukiwanie urządzeń",
"home_wake_group": "Grupa Wake",
"login_btn_login": "Zaloguj",
"login_btn_more": "Więcej",
"login_email_label": "Email lub nazwa użytkownika:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "Ordem",
"home_page_title": "Início",
"home_search_placeholder": "Procurar dispositivos",
"home_wake_group": "Grupo de despertar",
"login_btn_login": "Entrar",
"login_btn_more": "Mais",
"login_email_label": "Email ou Utilizador:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "排序",
"home_page_title": "首页",
"home_search_placeholder": "搜索设备",
"home_wake_group": "唤醒小组",
"login_btn_login": "登录",
"login_btn_more": "更多",
"login_email_label": "邮箱/用户名:",

View File

@@ -116,6 +116,7 @@
"home_order_tooltip": "排序",
"home_page_title": "首頁",
"home_search_placeholder": "搜尋設備",
"home_wake_group": "群組喚醒",
"login_btn_login": "登入",
"login_btn_more": "更多",
"login_email_label": "電子郵件/使用者名稱:",