chore: try to set initial virtual media state from sysfs

This commit is contained in:
Siyuan Miao 2025-05-12 18:38:03 +02:00
parent 3f8b30cf19
commit 023c6e29b0
2 changed files with 42 additions and 13 deletions

View File

@ -77,6 +77,11 @@ func Main() {
initUsbGadget() initUsbGadget()
err = setInitialVirtualMediaState()
if err != nil {
logger.Warn().Err(err).Msg("failed to set initial virtual media state")
}
go func() { go func() {
time.Sleep(15 * time.Minute) time.Sleep(15 * time.Minute)
for { for {

View File

@ -133,7 +133,7 @@ func getMassStorageCDROMEnabled() (bool, error) {
if err != nil { if err != nil {
return false, fmt.Errorf("failed to get mass storage path: %w", err) return false, fmt.Errorf("failed to get mass storage path: %w", err)
} }
data, err := os.ReadFile(path.Join(massStorageFunctionPath, "lun.0", "cdrom")) data, err := os.ReadFile(path.Join(massStorageFunctionPath, "cdrom"))
if err != nil { if err != nil {
return false, fmt.Errorf("failed to read cdrom mode: %w", err) return false, fmt.Errorf("failed to read cdrom mode: %w", err)
} }
@ -214,23 +214,47 @@ func getInitialVirtualMediaState() (*VirtualMediaState, error) {
return nil, fmt.Errorf("failed to get mass storage image: %w", err) return nil, fmt.Errorf("failed to get mass storage image: %w", err)
} }
source := Storage initialState := &VirtualMediaState{
// TODO: check if it's WebRTC or HTTP Source: Storage,
if diskPath == "/dev/nbd0" { Mode: Disk,
source = HTTP
} }
mode := Disk
if cdromEnabled { if cdromEnabled {
mode = CDROM initialState.Mode = CDROM
} }
return &VirtualMediaState{ // TODO: check if it's WebRTC or HTTP
Source: source, if diskPath == "" {
Mode: mode, return nil, nil
URL: "", } else if diskPath == "/dev/nbd0" {
Size: 0, initialState.Source = HTTP
}, nil initialState.URL = "/"
initialState.Size = 1
} else {
initialState.Filename = filepath.Base(diskPath)
// get size from file
logger.Info().Str("diskPath", diskPath).Msg("getting file size")
info, err := os.Stat(diskPath)
if err != nil {
return nil, fmt.Errorf("failed to get file info: %w", err)
}
initialState.Size = info.Size()
}
return initialState, nil
}
func setInitialVirtualMediaState() error {
virtualMediaStateMutex.Lock()
defer virtualMediaStateMutex.Unlock()
initialState, err := getInitialVirtualMediaState()
if err != nil {
return fmt.Errorf("failed to get initial virtual media state: %w", err)
}
currentVirtualMediaState = initialState
logger.Info().Interface("initial_virtual_media_state", initialState).Msg("initial virtual media state set")
return nil
} }
func rpcMountWithHTTP(url string, mode VirtualMediaMode) error { func rpcMountWithHTTP(url string, mode VirtualMediaMode) error {