server side for full gadget disable

starting on frontend

# Conflicts:
#	kvmapp/system/init.d/S03usbdev
This commit is contained in:
Thomas Pressnell
2025-05-24 15:34:55 +01:00
committed by wj-xiao
parent 5958fd5c6f
commit e684936d15
10 changed files with 186 additions and 14 deletions

View File

@@ -92,6 +92,10 @@ type GetGetHdmiStateRsp struct {
Enabled bool `json:"enabled"`
}
type GetUsbStateRsp struct {
Enabled bool `json:"enabled"`
}
type GetSSHStateRsp struct {
Enabled bool `json:"enabled"`
}

View File

@@ -35,6 +35,10 @@ func vmRouter(r *gin.Engine) {
api.GET("/vm/oled", service.GetOLED) // get OLED configuration
api.POST("/vm/oled", service.SetOLED) // set OLED configuration
api.GET("/vm/usb", service.GetUsbState) // get USB gadget state
api.POST("/vm/usb/enable", service.EnableUsb) // enable USB
api.POST("/vm/usb/disable", service.DisableUsb) // disable USB
// Only supported by PCIe version
api.GET("/vm/hdmi", service.GetHdmiState) // get HDMI state
api.POST("/vm/hdmi/reset", service.ResetHdmi) // reset hdmi

86
server/service/vm/usb.go Normal file
View File

@@ -0,0 +1,86 @@
package vm
import (
"NanoKVM-Server/proto"
"NanoKVM-Server/service/hid"
"os"
"os/exec"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
)
const (
udcDisableFile = "/boot/udc.disable"
)
var (
udcEnableCommands = []string{
"rm /boot/udc.disable",
"/etc/init.d/S03usbdev restart",
}
udcDisableCommands = []string{
"touch /boot/udc.disable",
"/etc/init.d/S03usbdev restart",
}
)
func runCommands(commands []string) error {
h := hid.GetHid()
h.Lock()
h.CloseNoLock()
defer func() {
h.OpenNoLock()
h.Unlock()
}()
for _, command := range commands {
if err := exec.Command("sh", "-c", command).Run(); err != nil {
log.Errorf("failed to run command '%s': %v", command, err)
return err
}
}
return nil
}
func (s *Service) EnableUsb(c *gin.Context) {
var rsp proto.Response
err := runCommands(udcEnableCommands)
if err != nil {
rsp.ErrRsp(c, -1, "failed to enable USB")
return
}
rsp.OkRsp(c)
log.Debug("enable usb")
}
func (s *Service) DisableUsb(c *gin.Context) {
var rsp proto.Response
err := runCommands(udcDisableCommands)
if err != nil {
rsp.ErrRsp(c, -1, "failed to disable USB")
return
}
rsp.OkRsp(c)
log.Debug("disable usb")
}
func (s *Service) GetUsbState(c *gin.Context) {
var rsp proto.Response
usbEnabled := false
if _, err := os.Stat(udcDisableFile); err != nil {
usbEnabled = true
}
rsp.OkRspWithData(c, &proto.GetUsbStateRsp{
Enabled: usbEnabled,
})
log.Debug("get usb state")
}