feat: add reboot button, #108

This commit is contained in:
seriousm4x
2023-08-16 09:49:23 +02:00
parent 8d2e3a5ade
commit d57520c66d
3 changed files with 55 additions and 1 deletions

View File

@@ -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 {

View File

@@ -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",

View File

@@ -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);
});
}
</script>
<div class="card bg-base-300 shadow-md rounded-3xl" transition:scale={{ delay: 0, duration: 200 }}>
@@ -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 !== ''}
<li><button on:click={() => reboot()}><Fa icon={faRotateLeft} />Reboot</button></li>
{/if}
{#if ($isAdmin || $permission.power?.includes(device.id)) && device.sol_enabled}
<li><button on:click={() => sleep()}><Fa icon={faBed} />Sleep</button></li>
{/if}