From 36f06a064a2222c89cbe2e0fb3f5d676b963195f Mon Sep 17 00:00:00 2001 From: tadic-luka Date: Thu, 6 Nov 2025 21:39:22 +0100 Subject: [PATCH] feat: add web route for sending WOL package to given mac addr (#945) * feat: add web route for sending WOL package to given mac addr ``` adds a new route /device/send-wol/:mac-addr to send the magic WOL package to the specified mac-addr. Method is POST and is protected. Useful for custom wake up scripts: example is sending HTTP request through iOS shortcut Test plan: calling the API with curl ``` $ curl -X POST http:///device/send-wol/xx:xx:xx:xx:xx:xx WOL sent to xx:xx:xx:xx:xx:xx ``` and observing the magic packet on my laptop/PC: ``` $ ncat -u -l 9 -k | xxd 00000000: ffff ffff ffff d050 9978 a620 d050 9978 .......P.x. .P.x 00000010: a620 d050 9978 a620 d050 9978 a620 d050 . .P.x. .P.x. .P 00000020: 9978 a620 d050 9978 a620 d050 9978 a620 .x. .P.x. .P.x. 00000030: d050 9978 a620 d050 9978 a620 d050 9978 .P.x. .P.x. .P.x 00000040: a620 d050 9978 a620 d050 9978 a620 d050 . .P.x. .P.x. .P 00000050: 9978 a620 d050 9978 a620 d050 9978 a620 .x. .P.x. .P.x. ``` calling the api with invalid mac addr returns HTTP 400 error ``` $ curl -X POST -v http:///device/send-wol/abcd ... * Request completely sent off < HTTP/1.1 400 Bad Request ... ... Invalid mac address provided * Resolve golint complaint --------- Co-authored-by: Marc Brooks --- web.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/web.go b/web.go index 0fd968b8..bef5a741 100644 --- a/web.go +++ b/web.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "io/fs" + "net" "net/http" "net/http/pprof" "path/filepath" @@ -184,6 +185,8 @@ func setupRouter() *gin.Engine { protected.PUT("/auth/password-local", handleUpdatePassword) protected.DELETE("/auth/local-password", handleDeletePassword) protected.POST("/storage/upload", handleUploadHttp) + + protected.POST("/device/send-wol/:mac-addr", handleSendWOLMagicPacket) } // Catch-all route for SPA @@ -341,7 +344,6 @@ func handleWebRTCSignalWsMessages( l.Trace().Msg("sending ping frame") err := wsCon.Ping(runCtx) - if err != nil { l.Warn().Str("error", err.Error()).Msg("websocket ping error") cancelRun() @@ -807,3 +809,23 @@ func handleSetup(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "Device setup completed successfully"}) } + +func handleSendWOLMagicPacket(c *gin.Context) { + inputMacAddr := c.Param("mac-addr") + macAddr, err := net.ParseMAC(inputMacAddr) + if err != nil { + logger.Warn().Err(err).Str("sendWol", inputMacAddr).Msg("Invalid mac address provided") + c.String(http.StatusBadRequest, "Invalid mac address provided") + return + } + + macAddrString := macAddr.String() + err = rpcSendWOLMagicPacket(macAddrString) + if err != nil { + logger.Warn().Err(err).Str("sendWOL", macAddrString).Msg("Failed to send WOL magic packet") + c.String(http.StatusInternalServerError, "Failed to send WOL to %s: %v", macAddrString, err) + return + } + + c.String(http.StatusOK, "WOL sent to %s ", macAddr) +}