mirror of
https://github.com/sipeed/NanoKVM.git
synced 2026-11-10 01:49:00 -06:00
Merge pull request #268 from scpcom/storage-device-flags
server: storage: set device flags
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
@@ -15,7 +16,11 @@ import (
|
||||
const (
|
||||
imageDirectory = "/data"
|
||||
imageNone = "/dev/mmcblk0p3"
|
||||
cdromFlag = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/cdrom"
|
||||
mountDevice = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/file"
|
||||
removableFlag = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/removable"
|
||||
roFlag = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/ro"
|
||||
roDisk = "/boot/usb.disk0.ro"
|
||||
)
|
||||
|
||||
func (s *Service) GetImages(c *gin.Context) {
|
||||
@@ -61,6 +66,49 @@ func (s *Service) MountImage(c *gin.Context) {
|
||||
image = imageNone
|
||||
}
|
||||
|
||||
imageRemovable := "1"
|
||||
|
||||
imageRo := "0"
|
||||
isImageRo, _ := isFlagExist(roDisk)
|
||||
if isImageRo {
|
||||
imageRo = "1"
|
||||
}
|
||||
|
||||
imageLow := strings.ToLower(image)
|
||||
imageCdrom := "0"
|
||||
if strings.HasSuffix(imageLow, ".iso") {
|
||||
imageRo = "1"
|
||||
imageCdrom = "1"
|
||||
}
|
||||
|
||||
// unmount
|
||||
if err := os.WriteFile(mountDevice, []byte("\n"), 0o666); err != nil {
|
||||
log.Errorf("unmount file failed: %s", err)
|
||||
rsp.ErrRsp(c, -2, "unmount image failed")
|
||||
return
|
||||
}
|
||||
|
||||
// removable flag
|
||||
if err := os.WriteFile(removableFlag, []byte(imageRemovable), 0o666); err != nil {
|
||||
log.Errorf("set removable flag failed: %s", err)
|
||||
rsp.ErrRsp(c, -2, "set removable flag failed")
|
||||
return
|
||||
}
|
||||
|
||||
// ro flag
|
||||
if err := os.WriteFile(roFlag, []byte(imageRo), 0o666); err != nil {
|
||||
log.Errorf("set ro flag failed: %s", err)
|
||||
rsp.ErrRsp(c, -2, "set ro flag failed")
|
||||
return
|
||||
}
|
||||
|
||||
// cdrom flag
|
||||
if err := os.WriteFile(cdromFlag, []byte(imageCdrom), 0o666); err != nil {
|
||||
log.Errorf("set cdrom flag failed: %s", err)
|
||||
rsp.ErrRsp(c, -2, "set cdrom flag failed")
|
||||
return
|
||||
}
|
||||
|
||||
// mount
|
||||
if err := os.WriteFile(mountDevice, []byte(image), 0o666); err != nil {
|
||||
log.Errorf("mount file %s failed: %s", image, err)
|
||||
@@ -106,3 +154,18 @@ func (s *Service) GetMountedImage(c *gin.Context) {
|
||||
|
||||
rsp.OkRspWithData(c, data)
|
||||
}
|
||||
|
||||
func isFlagExist(flag string) (bool, error) {
|
||||
_, err := os.Stat(flag)
|
||||
|
||||
if err == nil {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
log.Errorf("check file %s err: %s", flag, err)
|
||||
return false, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user