From 2e64e85d4b5a857804790a2b320c98a427b3fc84 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maxi=20Quo=C3=9F?=
Date: Thu, 6 Mar 2025 00:49:24 +0100
Subject: [PATCH] feat: custom timeouts for wake and shutdown
---
.../migrations/1741216171_updated_devices.go | 43 ++++
.../migrations/1741216190_updated_devices.go | 43 ++++
backend/networking/shutdown.go | 11 +-
backend/networking/shutdown_other.go | 2 +-
backend/networking/wake.go | 18 +-
frontend/messages/de.json | 2 +
frontend/messages/en.json | 2 +
frontend/messages/es.json | 2 +
frontend/messages/fr.json | 2 +
frontend/messages/id.json | 2 +
frontend/messages/it.json | 2 +
frontend/messages/ja.json | 2 +
frontend/messages/nl.json | 2 +
frontend/messages/pl.json | 2 +
frontend/messages/pt.json | 2 +
frontend/messages/zh-TW.json | 2 +
frontend/messages/zh.json | 2 +
.../src/lib/components/DeviceCardNic.svelte | 16 +-
frontend/src/lib/components/DeviceForm.svelte | 219 ++++++++++--------
frontend/src/lib/types/device.ts | 2 +
20 files changed, 265 insertions(+), 113 deletions(-)
create mode 100644 backend/migrations/1741216171_updated_devices.go
create mode 100644 backend/migrations/1741216190_updated_devices.go
diff --git a/backend/migrations/1741216171_updated_devices.go b/backend/migrations/1741216171_updated_devices.go
new file mode 100644
index 00000000..bd244e20
--- /dev/null
+++ b/backend/migrations/1741216171_updated_devices.go
@@ -0,0 +1,43 @@
+package migrations
+
+import (
+ "github.com/pocketbase/pocketbase/core"
+ m "github.com/pocketbase/pocketbase/migrations"
+)
+
+func init() {
+ m.Register(func(app core.App) error {
+ collection, err := app.FindCollectionByNameOrId("z5lghx2r3tm45n1")
+ if err != nil {
+ return err
+ }
+
+ // add field
+ if err := collection.Fields.AddMarshaledJSONAt(11, []byte(`{
+ "hidden": false,
+ "id": "number361076486",
+ "max": null,
+ "min": 1,
+ "name": "wake_timeout",
+ "onlyInt": true,
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "number"
+ }`)); err != nil {
+ return err
+ }
+
+ return app.Save(collection)
+ }, func(app core.App) error {
+ collection, err := app.FindCollectionByNameOrId("z5lghx2r3tm45n1")
+ if err != nil {
+ return err
+ }
+
+ // remove field
+ collection.Fields.RemoveById("number361076486")
+
+ return app.Save(collection)
+ })
+}
diff --git a/backend/migrations/1741216190_updated_devices.go b/backend/migrations/1741216190_updated_devices.go
new file mode 100644
index 00000000..33aabdaa
--- /dev/null
+++ b/backend/migrations/1741216190_updated_devices.go
@@ -0,0 +1,43 @@
+package migrations
+
+import (
+ "github.com/pocketbase/pocketbase/core"
+ m "github.com/pocketbase/pocketbase/migrations"
+)
+
+func init() {
+ m.Register(func(app core.App) error {
+ collection, err := app.FindCollectionByNameOrId("z5lghx2r3tm45n1")
+ if err != nil {
+ return err
+ }
+
+ // add field
+ if err := collection.Fields.AddMarshaledJSONAt(15, []byte(`{
+ "hidden": false,
+ "id": "number2068100152",
+ "max": null,
+ "min": 1,
+ "name": "shutdown_timeout",
+ "onlyInt": true,
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "number"
+ }`)); err != nil {
+ return err
+ }
+
+ return app.Save(collection)
+ }, func(app core.App) error {
+ collection, err := app.FindCollectionByNameOrId("z5lghx2r3tm45n1")
+ if err != nil {
+ return err
+ }
+
+ // remove field
+ collection.Fields.RemoveById("number2068100152")
+
+ return app.Save(collection)
+ })
+}
diff --git a/backend/networking/shutdown.go b/backend/networking/shutdown.go
index 155126e4..793e487d 100644
--- a/backend/networking/shutdown.go
+++ b/backend/networking/shutdown.go
@@ -48,16 +48,21 @@ func ShutdownDevice(device *core.Record) error {
done <- cmd.Wait()
}()
- // check state every seconds for 2 min
+ shutdownTimeout := device.GetInt("shutdown_timeout")
+ if shutdownTimeout <= 0 {
+ shutdownTimeout = 120
+ }
+
start := time.Now()
+
for {
select {
case <-time.After(1 * time.Second):
- if time.Since(start) >= 2*time.Minute {
+ if time.Since(start) >= time.Duration(shutdownTimeout)*time.Second {
if err := KillProcess(cmd.Process); err != nil {
logger.Error.Println(err)
}
- return fmt.Errorf("%s not offline after 2 minutes", device.GetString("name"))
+ return fmt.Errorf("%s not offline after %d seconds", device.GetString("name"), shutdownTimeout)
}
isOnline, err := PingDevice(device)
if err != nil {
diff --git a/backend/networking/shutdown_other.go b/backend/networking/shutdown_other.go
index dda0796a..e04fe373 100644
--- a/backend/networking/shutdown_other.go
+++ b/backend/networking/shutdown_other.go
@@ -18,7 +18,7 @@ func SetProcessAttributes(cmd *exec.Cmd) {
// Kills child processes on Linux. Windows doesn't provide a direct way to kill child processes, so we kill just the main process.
func KillProcess(process *os.Process) error {
- logger.Warning.Println("Your shutdown cmd didn't finish in 2 minutes. It will be killed.")
+ logger.Warning.Println("Your shutdown cmd didn't finish in time. It will be killed.")
pgid, err := unix.Getpgid(process.Pid)
if err != nil {
return err
diff --git a/backend/networking/wake.go b/backend/networking/wake.go
index dc8133d1..e314be95 100644
--- a/backend/networking/wake.go
+++ b/backend/networking/wake.go
@@ -15,6 +15,11 @@ import (
func WakeDevice(device *core.Record) error {
logger.Info.Println("Wake triggered for", device.GetString("name"))
+ wakeTimeout := device.GetInt("wake_timeout")
+ if wakeTimeout <= 0 {
+ wakeTimeout = 120
+ }
+
wake_cmd := device.GetString("wake_cmd")
if wake_cmd != "" {
var shell string
@@ -46,16 +51,16 @@ func WakeDevice(device *core.Record) error {
done <- cmd.Wait()
}()
- // check state every seconds for 2 min
start := time.Now()
+
for {
select {
case <-time.After(1 * time.Second):
- if time.Since(start) >= 2*time.Minute {
+ if time.Since(start) >= time.Duration(wakeTimeout)*time.Second {
if err := KillProcess(cmd.Process); err != nil {
logger.Error.Println(err)
}
- return fmt.Errorf("%s not online after 2 minutes", device.GetString("name"))
+ return fmt.Errorf("%s not online after %d seconds", device.GetString("name"), wakeTimeout)
}
isOnline, err := PingDevice(device)
if err != nil {
@@ -83,10 +88,10 @@ func WakeDevice(device *core.Record) error {
return err
}
- // check state every seconds for 2 min
start := time.Now()
for {
time.Sleep(1 * time.Second)
+ fmt.Println("here")
isOnline, err := PingDevice(device)
if err != nil {
logger.Error.Println(err)
@@ -95,10 +100,11 @@ func WakeDevice(device *core.Record) error {
if isOnline {
return nil
}
- if time.Since(start) >= 2*time.Minute {
+ if time.Since(start) >= time.Duration(wakeTimeout)*time.Second {
+ fmt.Println("over")
break
}
}
- return fmt.Errorf(device.GetString("name"), "not online after 2 min")
+ return fmt.Errorf(device.GetString("name"), "not online after %d seconds", wakeTimeout)
}
}
diff --git a/frontend/messages/de.json b/frontend/messages/de.json
index d4216619..2e8e58b8 100644
--- a/frontend/messages/de.json
+++ b/frontend/messages/de.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Entfernten Linux PC ausschalten:",
"device_shutdown_examples_windows": "Entfernten Windows PC ausschalten:",
"device_shutdown_examples": "Beispiele:",
+ "device_shutdown_timeout": "Ausschalt-Timeout (Sekunden)",
"device_shutdown": "Ausschalten",
"device_sol_authorization": "Authorisierung",
"device_sol_desc1": "Du kannst Computer mithilfe des Tools Sleep-On-LAN in den Ruhezustand versetzen. Sleep-On-LAN (SOL) ist ein externes Tool/Daemon, das auf den PCs arbeitet, die du in den Ruhezustand versetzen möchtest, und stellt einen REST-Endpunkt bereit. Für Anweisungen zur Einrichtung von Sleep-On-LAN verweise bitte auf den Abschnitt Usage.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Aktivieren",
"device_wake_cron": "Cron",
"device_wake_desc": "Du kannst das Gerät mit einem Cron-Job einschalten.",
+ "device_wake_timeout": "Einschalt-Timeout (Sekunden)",
"device_wake": "Einschalten",
"home_add_first_device": "Füge dein erstes Gerät hinzu",
"home_grant_permissions": "Bitte frag den Administrator, dir Berechtigungen für bestehende Geräte zu erteilen oder neue Geräte zu erstellen.",
diff --git a/frontend/messages/en.json b/frontend/messages/en.json
index d7e41fef..5408785d 100644
--- a/frontend/messages/en.json
+++ b/frontend/messages/en.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Shutdown remote linux machine:",
"device_shutdown_examples_windows": "Shutdown remote windows machine:",
"device_shutdown_examples": "Examples:",
+ "device_shutdown_timeout": "Shutdown Timeout (seconds)",
"device_shutdown": "Shutdown",
"device_sol_authorization": "Authorization",
"device_sol_desc1": "You can put computers to sleep using the Sleep-On-LAN tool. Sleep-On-LAN (SOL) is an external tool/daemon that operates on the PCs you want to put to sleep, providing a REST endpoint. For instructions on setting up Sleep-On-LAN, please refer to the Usage section.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Enable wake cron",
"device_wake_cron": "Wake cron",
"device_wake_desc": "You can power this device using a scheduled cron job.",
+ "device_wake_timeout": "Wake Timeout (seconds)",
"device_wake": "Wake",
"home_add_first_device": "Add your first device",
"home_grant_permissions": "Please ask the admin to grant you permissions to existing devices or to create new ones.",
diff --git a/frontend/messages/es.json b/frontend/messages/es.json
index a9ee568e..7e31122d 100644
--- a/frontend/messages/es.json
+++ b/frontend/messages/es.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Apagar el dispositivo Linux remoto:",
"device_shutdown_examples_windows": "Apagar el dispositivo Windows remoto:",
"device_shutdown_examples": "Ejemplos:",
+ "device_shutdown_timeout": "Tiempo de espera de apagado (segundos)",
"device_shutdown": "Apagar",
"device_sol_authorization": "Autorización",
"device_sol_desc1": "Puedes poner las computadoras en modo de suspensión usando Sleep-On-LAN herramienta. Sleep-On-LAN (SOL) es una herramienta/daemon externo que opera en las PC que desea poner en suspensión y proporciona un punto final REST. Para obtener instrucciones sobre cómo configurar Sleep-On-LAN, consulte Uso sección.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Activar wake cron",
"device_wake_cron": "Encender cron",
"device_wake_desc": "Podrá encender este dispositivo utilizando un scheduled cron job.",
+ "device_wake_timeout": "Tiempo de espera de encendido (segundos)",
"device_wake": "Encender",
"home_add_first_device": "Añade tu primer dispositivo",
"home_grant_permissions": "Pídale al administrador que le otorgue permisos para los dispositivos existentes o que cree otros nuevos.",
diff --git a/frontend/messages/fr.json b/frontend/messages/fr.json
index 3b996584..62e55054 100644
--- a/frontend/messages/fr.json
+++ b/frontend/messages/fr.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Arrêter une machine Linux distante :",
"device_shutdown_examples_windows": "Arrêter une machine Windows distante :",
"device_shutdown_examples": "Exemples :",
+ "device_shutdown_timeout": "Délai d'arrêt (secondes)",
"device_shutdown": "Arrêt",
"device_sol_authorization": "Autorisation",
"device_sol_desc1": "Vous pouvez mettre les ordinateurs en veille à l'aide de l'outil Sleep-On-LAN. Sleep-On-LAN (SOL) est un outil/daemon externe qui fonctionne sur les PC que vous souhaitez mettre en veille, fournissant un point de terminaison REST. Pour obtenir des instructions sur la configuration de Sleep-On-LAN, veuillez vous référer à la section Usage.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Activer le réveil avec cron",
"device_wake_cron": "Réveil avec cron",
"device_wake_desc": "Vous pouvez allumer cet appareil en utilisant un job cron planifié.",
+ "device_wake_timeout": "Délai de réveil (secondes)",
"device_wake": "Réveil",
"home_add_first_device": "Ajoutez votre premier appareil",
"home_grant_permissions": "Veuillez demander à votre administrateur les permissions aux appareils existants ou créez-en de nouveaux.",
diff --git a/frontend/messages/id.json b/frontend/messages/id.json
index 02d8f023..83cd66dd 100644
--- a/frontend/messages/id.json
+++ b/frontend/messages/id.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Mematikan Linux jarak jauh:",
"device_shutdown_examples_windows": "Mematikan Windows jarak jauh:",
"device_shutdown_examples": "Contoh:",
+ "device_shutdown_timeout": "Waktu tunggu mati (detik)",
"device_shutdown": "Matikan",
"device_sol_authorization": "Otorisasi",
"device_sol_desc1": "Anda dapat membuat tidur komputer menggunakan alat Sleep-On-LAN. Sleep-On-LAN (SOL) merupakan alat/daemon eksternal yang berjalan di PC yang ingin Anda tidurkan, dengan menyediakan REST endpoint. Untuk instruksi pemasangan Sleep-On-LAN, silakan merujuk ke bagian Penggunaan.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Aktifkan jadwal bangun",
"device_wake_cron": "Jadwal Bangun",
"device_wake_desc": "Anda dapat menyalakan perangkat ini menggunakan tugas penjadwalan.",
+ "device_wake_timeout": "Waktu tunggu nyala (detik)",
"device_wake": "Bangunkan",
"home_add_first_device": "Tambahkan perangkat pertama Anda",
"home_grant_permissions": "Mohon minta admin untuk memberikan izin ke perangkat yang sudah ada atau membuat perangkat baru.",
diff --git a/frontend/messages/it.json b/frontend/messages/it.json
index c38605f5..99acdce0 100644
--- a/frontend/messages/it.json
+++ b/frontend/messages/it.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Spegni macchina linux remota:",
"device_shutdown_examples_windows": "Spegni macchina windows remota:",
"device_shutdown_examples": "Esempi:",
+ "device_shutdown_timeout": "Timeout di spegnimento (secondi)",
"device_shutdown": "Spegni",
"device_sol_authorization": "Autorizzazione",
"device_sol_desc1": "Puoi spegnere il tuo dispositivo usando lo strumento Sleep-On-LAN. Sleep-On-LAN (SOL) è uno strumento esterno che opera sul dispositivo che vuoi spegnere, il quale rende disponibile un endpoint REST. Puoi riferirti al link Uso (in inglese) per le istruzioni.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Abilita sveglia programmata",
"device_wake_cron": "Sveglia programmata",
"device_wake_desc": "Puoi accendere questo dispositivo con una sveglia programmata.",
+ "device_wake_timeout": "Timeout di accensione (secondi)",
"device_wake": "Accendi",
"home_add_first_device": "Aggiungi il tuo primo dispositivo",
"home_grant_permissions": "Per favore chiedi all'amministratore di darti i permessi necessari per aggiungere un nuovo dispositivo.",
diff --git a/frontend/messages/ja.json b/frontend/messages/ja.json
index e31fac7d..7372f46c 100644
--- a/frontend/messages/ja.json
+++ b/frontend/messages/ja.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "リモート Linux マシンのシャットダウン:",
"device_shutdown_examples_windows": "リモート Windows マシンのシャットダウン:",
"device_shutdown_examples": "例:",
+ "device_shutdown_timeout": "シャットダウンタイムアウト (秒)",
"device_shutdown": "シャットダウン",
"device_sol_authorization": "認証",
"device_sol_desc1": "Sleep-On-LAN ツールを使用してコンピュータをスリープ状態にすることができます。Sleep-On-LAN(SOL)は、スリープ状態にしたい PC で動作する外部ツール/デーモンで、REST エンドポイントを提供します。Sleep-On-LAN のセットアップ方法については、Usage セクションを参照してください。",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "起動スケジュールを有効化",
"device_wake_cron": "起動スケジュール",
"device_wake_desc": "スケジュールされた cron ジョブを使用してこのデバイスを起動できます。",
+ "device_wake_timeout": "ウェイクタイムアウト (秒)",
"device_wake": "起動",
"home_add_first_device": "最初のデバイスを追加してください",
"home_grant_permissions": "既存のデバイスへの権限を付与するか、新しいデバイスを作成するために管理者に依頼してください。",
diff --git a/frontend/messages/nl.json b/frontend/messages/nl.json
index d1804d8b..b3803b68 100644
--- a/frontend/messages/nl.json
+++ b/frontend/messages/nl.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Afsluiten van een externe Linux-machine:",
"device_shutdown_examples_windows": "Afsluiten van een externe Windows-machine:",
"device_shutdown_examples": "Voorbeelden:",
+ "device_shutdown_timeout": "Uitschakel-time-out (seconden)",
"device_shutdown": "Afsluiten",
"device_sol_authorization": "Autorisatie",
"device_sol_desc1": "Je kunt computers in de slaapstand zetten met de Sleep-On-LAN tool. Sleep-On-LAN (SOL) is een externe tool/daemon die op de PC's werkt die je in de slaapstand wilt zetten en biedt een REST-endpoint. Voor instructies over het instellen van Sleep-On-LAN, zie de Gebruik sectie.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Wek cron inschakelen",
"device_wake_cron": "Wek cron",
"device_wake_desc": "Je kunt dit apparaat inschakelen met een geplande cron-taak.",
+ "device_wake_timeout": "Inschakel-time-out (seconden)",
"device_wake": "Wek",
"home_add_first_device": "Voeg je eerste apparaat toe",
"home_grant_permissions": "Vraag de admin om je toestemming te geven voor bestaande apparaten of om nieuwe te creëren.",
diff --git a/frontend/messages/pl.json b/frontend/messages/pl.json
index 29cb2e80..c00a332e 100644
--- a/frontend/messages/pl.json
+++ b/frontend/messages/pl.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Wyłącz zdalną maszynę Linux:",
"device_shutdown_examples_windows": "Wyłącz zdalną maszynę Windows:",
"device_shutdown_examples": "Przykłady:",
+ "device_shutdown_timeout": "Limit czasu wyłączenia (sekundy)",
"device_shutdown": "Wyłącz",
"device_sol_authorization": "Autoryzacja",
"device_sol_desc1": "Możesz wyłączać urządzenia za pomocą narzędzia Sleep-On-LAN. Sleep-On-LAN (SOL) jest zewnętrznym narzędziem/demonem, działającym na urządzeniach które chcesz wyłączać. Tworzy on endpoint REST. Aby dowiedzieć się jak skonfigurować SOL, zapoznaj się z instrukcją użytkownika.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Włącz cron do włączania",
"device_wake_cron": "Cron do włączania",
"device_wake_desc": "Możesz włączyć to urządzenie za pomocą zaplanowanego zadania cron.",
+ "device_wake_timeout": "Limit czasu wybudzania (sekundy)",
"device_wake": "Włączanie",
"home_add_first_device": "Utwórz pierwsze urządzenie",
"home_grant_permissions": "Poproś administratora o przyznanie uprawnień do istniejących urządzeń lub do tworzenia nowych.",
diff --git a/frontend/messages/pt.json b/frontend/messages/pt.json
index a963cb16..119a126b 100644
--- a/frontend/messages/pt.json
+++ b/frontend/messages/pt.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "Desligar dispositivo linux remoto:",
"device_shutdown_examples_windows": "Desligar dispositivo windows remoto:",
"device_shutdown_examples": "Exemplos:",
+ "device_shutdown_timeout": "Tempo limite de desligamento (segundos)",
"device_shutdown": "Desligar",
"device_sol_authorization": "Autenticação",
"device_sol_desc1": "Poderá suspender o seu dispositivo usando a ferramenta Sleep-On-LAN. Sleep-On-LAN (SOL) é uma ferramenta externa que terá de ser executada no dispositivo que quer suspender, facilitando um REST endpoint. Para instruções em como configurar Sleep-On-LAN, veja a secção Usage.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "Ativar wake cron",
"device_wake_cron": "Wake cron",
"device_wake_desc": "Poderá ligar este dispositivo através dum cron job agendado.",
+ "device_wake_timeout": "Tempo limite de ativação (segundos)",
"device_wake": "Ligar",
"home_add_first_device": "Adicione o seu primeiro dispositivo",
"home_grant_permissions": "Peça ao administrador para alterar as suas permissões para dispositivos existentes ou para criar novos.",
diff --git a/frontend/messages/zh-TW.json b/frontend/messages/zh-TW.json
index e8733786..d06ee7fc 100644
--- a/frontend/messages/zh-TW.json
+++ b/frontend/messages/zh-TW.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "關閉遠端 Linux 主機:",
"device_shutdown_examples_windows": "關閉遠端 Windows 主機:",
"device_shutdown_examples": "範例:",
+ "device_shutdown_timeout": "關機超時(秒)",
"device_shutdown": "關機",
"device_sol_authorization": "認證",
"device_sol_desc1": "你可以使用 Sleep-On-LAN 工具讓電腦睡眠。 Sleep-On-LAN (SOL) 是一个外部的工具,它在你想要進入睡眠的PC上執行並有RestAPI端口. 有關 Sleep-On-LAN 設定的說明, 請見文檔 Usage",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "啟用定時喚醒",
"device_wake_cron": "唤醒排程",
"device_wake_desc": "你可以透過排程来唤醒裝置。",
+ "device_wake_timeout": "喚醒超時(秒)",
"device_wake": "喚醒",
"home_add_first_device": "添加你的第一台設備",
"home_grant_permissions": "請聯絡系統管理員授權現有設備或創建新設備的權限",
diff --git a/frontend/messages/zh.json b/frontend/messages/zh.json
index d1e052b4..87ab532d 100644
--- a/frontend/messages/zh.json
+++ b/frontend/messages/zh.json
@@ -88,6 +88,7 @@
"device_shutdown_examples_linux": "关闭远程 Linux 主机:",
"device_shutdown_examples_windows": "关闭远程 Windows 主机:",
"device_shutdown_examples": "示例:",
+ "device_shutdown_timeout": "关机超时(秒)",
"device_shutdown": "关机",
"device_sol_authorization": "认证",
"device_sol_desc1": "您可以使用 Sleep-On-LAN 工具让计算机进入睡眠状态. Sleep-On-LAN (SOL) 是一个外部的工具/守护程序, 它在您想要进入休眠状态的PC上运行并提供RestApi接口. 有关 Sleep-On-LAN 设置的说明, 请参阅文档 Usage 部分.",
@@ -104,6 +105,7 @@
"device_wake_cron_enable": "启用定时唤醒",
"device_wake_cron": "唤醒计划任务",
"device_wake_desc": "您可以通过计划任务来唤醒设备.",
+ "device_wake_timeout": "唤醒超时(秒)",
"device_wake": "唤醒",
"home_add_first_device": "添加您的第一台设备",
"home_grant_permissions": "请联系管理员授予您相应权限.",
diff --git a/frontend/src/lib/components/DeviceCardNic.svelte b/frontend/src/lib/components/DeviceCardNic.svelte
index 4300b1b3..8fe616e6 100644
--- a/frontend/src/lib/components/DeviceCardNic.svelte
+++ b/frontend/src/lib/components/DeviceCardNic.svelte
@@ -16,7 +16,7 @@
let modalShutdown: HTMLDialogElement;
$: if (device.status === 'pending' && !interval) {
- countdown(Date.parse(device.updated));
+ countdown(Date.parse(device.updated), 'wake');
}
$: minutes = Math.floor(timeout / 60);
$: seconds = timeout % 60;
@@ -53,7 +53,7 @@
.then((resp) => resp.json())
.then(async (data) => {
device = data as Device;
- await countdown(Date.parse(device.updated));
+ await countdown(Date.parse(device.updated), 'wake');
if (device.status === 'online' && device.link && device.link_open !== '') {
if (device.link_open === 'new_tab') {
window.open(device.link, '_blank');
@@ -76,18 +76,22 @@
.then((resp) => resp.json())
.then((data) => {
device = data as Device;
- countdown(Date.parse(device.updated));
+ countdown(Date.parse(device.updated), 'shutdown');
})
.catch((err) => {
toast.error(err.message);
});
}
- function countdown(updated: number) {
+ function countdown(updated: number, action: 'wake' | 'shutdown') {
return new Promise((resolve, reject) => {
try {
- timeout = 120;
- const end = updated + 2 * 60 * 1000;
+ timeout = action === 'wake' ? device.wake_timeout : device.shutdown_timeout;
+ if (timeout <= 0) {
+ timeout = 120;
+ }
+
+ const end = updated + timeout * 1000;
if (interval) {
clearInterval(interval);
diff --git a/frontend/src/lib/components/DeviceForm.svelte b/frontend/src/lib/components/DeviceForm.svelte
index ce3bd8bd..64a2aa4b 100644
--- a/frontend/src/lib/components/DeviceForm.svelte
+++ b/frontend/src/lib/components/DeviceForm.svelte
@@ -323,12 +323,12 @@
{@html m.device_ping_desc()}