mirror of
https://github.com/seriousm4x/UpSnap.git
synced 2026-04-05 08:54:03 -04:00
feat: add "wake group" button
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
1984
frontend/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -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} />
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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 :",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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": "メールアドレスまたはユーザー名:",
|
||||
|
||||
@@ -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": "이메일 또는 사용자명",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -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": "邮箱/用户名:",
|
||||
|
||||
@@ -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": "電子郵件/使用者名稱:",
|
||||
|
||||
Reference in New Issue
Block a user