From d57520c66d3ecdb2edb1f0443333bd4cb774a237 Mon Sep 17 00:00:00 2001 From: seriousm4x Date: Wed, 16 Aug 2023 09:49:23 +0200 Subject: [PATCH] feat: add reboot button, #108 --- backend/pb/handlers.go | 30 +++++++++++++++++++ backend/pb/pb.go | 10 +++++++ frontend/src/lib/components/DeviceCard.svelte | 16 +++++++++- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/backend/pb/handlers.go b/backend/pb/handlers.go index 5bc25e47..57cadb55 100644 --- a/backend/pb/handlers.go +++ b/backend/pb/handlers.go @@ -7,6 +7,7 @@ import ( "os/exec" "strconv" "strings" + "time" "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase/apis" @@ -63,6 +64,35 @@ func HandlerSleep(c echo.Context) error { return c.JSON(http.StatusOK, nil) } +func HandlerReboot(c echo.Context) error { + record, err := App.Dao().FindFirstRecordByData("devices", "id", c.PathParam("id")) + if err != nil { + return apis.NewNotFoundError("The device does not exist.", err) + } + record.Set("status", "pending") + if err := App.Dao().SaveRecord(record); err != nil { + logger.Error.Println("Failed to save record:", err) + } + go func(r *models.Record) { + if err := networking.ShutdownDevice(r); err != nil { + logger.Error.Println(err) + r.Set("status", "online") + } else { + time.Sleep(15 * time.Second) // some devices might not respond to ping but are still shutting down + if err := networking.WakeDevice(r); err != nil { + logger.Error.Println(err) + r.Set("status", "offline") + } else { + r.Set("status", "online") + } + } + if err := App.Dao().SaveRecord(r); err != nil { + logger.Error.Println("Failed to save record:", err) + } + }(record) + return c.JSON(http.StatusOK, record) +} + func HandlerShutdown(c echo.Context) error { record, err := App.Dao().FindFirstRecordByData("devices", "id", c.PathParam("id")) if err != nil { diff --git a/backend/pb/pb.go b/backend/pb/pb.go index 9463b076..83d3f933 100644 --- a/backend/pb/pb.go +++ b/backend/pb/pb.go @@ -54,6 +54,16 @@ func StartPocketBase(distDirFS fs.FS) { }, }) + e.Router.AddRoute(echo.Route{ + Method: http.MethodGet, + Path: "/api/upsnap/reboot/:id", + Handler: HandlerReboot, + Middlewares: []echo.MiddlewareFunc{ + apis.ActivityLogger(App), + RequireUpSnapPermission(), + }, + }) + e.Router.AddRoute(echo.Route{ Method: http.MethodGet, Path: "/api/upsnap/shutdown/:id", diff --git a/frontend/src/lib/components/DeviceCard.svelte b/frontend/src/lib/components/DeviceCard.svelte index 6bf8b206..11378f06 100644 --- a/frontend/src/lib/components/DeviceCard.svelte +++ b/frontend/src/lib/components/DeviceCard.svelte @@ -7,7 +7,8 @@ faCircleArrowDown, faCircleArrowUp, faLock, - faPen + faPen, + faRotateLeft } from '@fortawesome/free-solid-svg-icons'; import { scale } from 'svelte/transition'; import { formatDistance, parseISO } from 'date-fns'; @@ -35,6 +36,16 @@ toast.error(err.message); }); } + + function reboot() { + fetch(`${backendUrl}api/upsnap/reboot/${device.id}`, { + headers: { + Authorization: $pocketbase.authStore.token + } + }).catch((err) => { + toast.error(err.message); + }); + }
@@ -88,6 +99,9 @@ tabindex="-1" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-fit" > + {#if ($isAdmin || $permission.power?.includes(device.id)) && device.status === 'online' && device.shutdown_cmd !== ''} +
  • + {/if} {#if ($isAdmin || $permission.power?.includes(device.id)) && device.sol_enabled}
  • {/if}