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()}

-