Compare commits

...

4 Commits

Author SHA1 Message Date
Aveline e21837bfb5
Merge dafebacdfd into 6e1b84f39b 2025-11-07 13:25:11 +01:00
Marc Brooks 6e1b84f39b
chore: clean up logger messaging 2025-11-07 13:21:38 +01:00
Siyuan dafebacdfd feat: reset USB gadget if needed 2025-11-05 15:47:31 +00:00
Siyuan f0595fff40 fix: await sleep needs to be called inside async function 2025-11-05 15:45:34 +00:00
4 changed files with 34 additions and 20 deletions

View File

@ -177,7 +177,7 @@ func (u *UsbGadget) Init() error {
u.udc = udcs[0]
err := u.configureUsbGadget(false)
err := u.configureUsbGadget(false, true)
if err != nil {
return u.logError("unable to initialize USB stack", err)
}
@ -185,13 +185,13 @@ func (u *UsbGadget) Init() error {
return nil
}
func (u *UsbGadget) UpdateGadgetConfig() error {
func (u *UsbGadget) UpdateGadgetConfig(resetUsbIfNeeded bool) error {
u.configLock.Lock()
defer u.configLock.Unlock()
u.loadGadgetConfig()
err := u.configureUsbGadget(true)
err := u.configureUsbGadget(true, resetUsbIfNeeded)
if err != nil {
return u.logError("unable to update gadget config", err)
}
@ -199,14 +199,28 @@ func (u *UsbGadget) UpdateGadgetConfig() error {
return nil
}
func (u *UsbGadget) configureUsbGadget(resetUsb bool) error {
return u.WithTransaction(func() error {
func (u *UsbGadget) configureUsbGadget(resetUsb bool, resetUsbIfNeeded bool) error {
f := func(resetUsbBefore bool, resetUsbAfter bool) func() error {
return func() error {
if resetUsbBefore {
u.tx.RebindUsb(true)
}
u.tx.MountConfigFS()
u.tx.CreateConfigPath()
u.tx.WriteGadgetConfig()
if resetUsb {
if resetUsbAfter {
u.tx.RebindUsb(true)
}
return nil
})
}
}
// initial attempt to configure the gadget
err := u.WithTransaction(f(false, resetUsb))
if err != nil && !resetUsbIfNeeded {
return err
}
// if the initial attempt failed, try to configure the gadget again with the resetUsb flag
return u.WithTransaction(f(true, resetUsb))
}

View File

@ -678,7 +678,7 @@ func rpcSetUsbConfig(usbConfig usbgadget.Config) error {
LoadConfig()
config.UsbConfig = &usbConfig
gadget.SetGadgetConfig(config.UsbConfig)
return updateUsbRelatedConfig()
return updateUsbRelatedConfig(false)
}
func rpcGetWakeOnLanDevices() ([]WakeOnLanDevice, error) {
@ -890,8 +890,8 @@ func rpcGetUsbDevices() (usbgadget.Devices, error) {
return *config.UsbDevices, nil
}
func updateUsbRelatedConfig() error {
if err := gadget.UpdateGadgetConfig(); err != nil {
func updateUsbRelatedConfig(resetUsbIfNeeded bool) error {
if err := gadget.UpdateGadgetConfig(resetUsbIfNeeded); err != nil {
return fmt.Errorf("failed to write gadget config: %w", err)
}
if err := SaveConfig(); err != nil {
@ -903,7 +903,7 @@ func updateUsbRelatedConfig() error {
func rpcSetUsbDevices(usbDevices usbgadget.Devices) error {
config.UsbDevices = &usbDevices
gadget.SetGadgetDevices(config.UsbDevices)
return updateUsbRelatedConfig()
return updateUsbRelatedConfig(false)
}
func rpcSetUsbDeviceState(device string, enabled bool) error {
@ -920,7 +920,7 @@ func rpcSetUsbDeviceState(device string, enabled bool) error {
return fmt.Errorf("invalid device: %s", device)
}
gadget.SetGadgetDevices(config.UsbDevices)
return updateUsbRelatedConfig()
return updateUsbRelatedConfig(false)
}
func rpcSetCloudUrl(apiUrl string, appUrl string) error {

View File

@ -66,7 +66,7 @@ func setMassStorageMode(cdrom bool) error {
return nil
}
return gadget.UpdateGadgetConfig()
return gadget.UpdateGadgetConfig(true)
}
func mountImage(imagePath string) error {

4
web.go
View File

@ -814,7 +814,7 @@ 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")
logger.Warn().Err(err).Str("inputMacAddr", inputMacAddr).Msg("Invalid MAC address provided")
c.String(http.StatusBadRequest, "Invalid mac address provided")
return
}
@ -822,7 +822,7 @@ func handleSendWOLMagicPacket(c *gin.Context) {
macAddrString := macAddr.String()
err = rpcSendWOLMagicPacket(macAddrString)
if err != nil {
logger.Warn().Err(err).Str("sendWOL", macAddrString).Msg("Failed to send WOL magic packet")
logger.Warn().Err(err).Str("macAddrString", macAddrString).Msg("Failed to send WOL magic packet")
c.String(http.StatusInternalServerError, "Failed to send WOL to %s: %v", macAddrString, err)
return
}