@@ -26,6 +26,19 @@ func writeFile(path string, data string) error {
2626 return os .WriteFile (path , []byte (data ), 0644 )
2727}
2828
29+ func getMassStorageImage () (string , error ) {
30+ massStorageFunctionPath , err := gadget .GetPath ("mass_storage_lun0" )
31+ if err != nil {
32+ return "" , fmt .Errorf ("failed to get mass storage path: %w" , err )
33+ }
34+
35+ imagePath , err := os .ReadFile (path .Join (massStorageFunctionPath , "file" ))
36+ if err != nil {
37+ return "" , fmt .Errorf ("failed to get mass storage image path: %w" , err )
38+ }
39+ return strings .TrimSpace (string (imagePath )), nil
40+ }
41+
2942func setMassStorageImage (imagePath string ) error {
3043 massStorageFunctionPath , err := gadget .GetPath ("mass_storage_lun0" )
3144 if err != nil {
@@ -39,19 +52,21 @@ func setMassStorageImage(imagePath string) error {
3952}
4053
4154func setMassStorageMode (cdrom bool ) error {
42- massStorageFunctionPath , err := gadget .GetPath ("mass_storage_lun0" )
43- if err != nil {
44- return fmt .Errorf ("failed to get mass storage path: %w" , err )
45- }
46-
4755 mode := "0"
4856 if cdrom {
4957 mode = "1"
5058 }
51- if err := writeFile (path .Join (massStorageFunctionPath , "lun.0" , "cdrom" ), mode ); err != nil {
59+
60+ err , changed := gadget .OverrideGadgetConfig ("mass_storage_lun0" , "cdrom" , mode )
61+ if err != nil {
5262 return fmt .Errorf ("failed to set cdrom mode: %w" , err )
5363 }
54- return nil
64+
65+ if ! changed {
66+ return nil
67+ }
68+
69+ return gadget .UpdateGadgetConfig ()
5570}
5671
5772func onDiskMessage (msg webrtc.DataChannelMessage ) {
@@ -113,20 +128,17 @@ func rpcMountBuiltInImage(filename string) error {
113128 return mountImage (imagePath )
114129}
115130
116- func getMassStorageMode () (bool , error ) {
131+ func getMassStorageCDROMEnabled () (bool , error ) {
117132 massStorageFunctionPath , err := gadget .GetPath ("mass_storage_lun0" )
118133 if err != nil {
119134 return false , fmt .Errorf ("failed to get mass storage path: %w" , err )
120135 }
121-
122136 data , err := os .ReadFile (path .Join (massStorageFunctionPath , "lun.0" , "cdrom" ))
123137 if err != nil {
124138 return false , fmt .Errorf ("failed to read cdrom mode: %w" , err )
125139 }
126-
127140 // Trim any whitespace characters. It has a newline at the end
128141 trimmedData := strings .TrimSpace (string (data ))
129-
130142 return trimmedData == "1" , nil
131143}
132144
@@ -191,6 +203,36 @@ func rpcUnmountImage() error {
191203
192204var httpRangeReader * httpreadat.RangeReader
193205
206+ func getInitialVirtualMediaState () (* VirtualMediaState , error ) {
207+ cdromEnabled , err := getMassStorageCDROMEnabled ()
208+ if err != nil {
209+ return nil , fmt .Errorf ("failed to get mass storage cdrom enabled: %w" , err )
210+ }
211+
212+ diskPath , err := getMassStorageImage ()
213+ if err != nil {
214+ return nil , fmt .Errorf ("failed to get mass storage image: %w" , err )
215+ }
216+
217+ source := Storage
218+ // TODO: check if it's WebRTC or HTTP
219+ if diskPath == "/dev/nbd0" {
220+ source = HTTP
221+ }
222+
223+ mode := Disk
224+ if cdromEnabled {
225+ mode = CDROM
226+ }
227+
228+ return & VirtualMediaState {
229+ Source : source ,
230+ Mode : mode ,
231+ URL : "" ,
232+ Size : 0 ,
233+ }, nil
234+ }
235+
194236func rpcMountWithHTTP (url string , mode VirtualMediaMode ) error {
195237 virtualMediaStateMutex .Lock ()
196238 if currentVirtualMediaState != nil {
@@ -204,6 +246,11 @@ func rpcMountWithHTTP(url string, mode VirtualMediaMode) error {
204246 return fmt .Errorf ("failed to use http url: %w" , err )
205247 }
206248 logger .Info ().Str ("url" , url ).Int64 ("size" , n ).Msg ("using remote url" )
249+
250+ if err := setMassStorageMode (mode == CDROM ); err != nil {
251+ return fmt .Errorf ("failed to set mass storage mode: %w" , err )
252+ }
253+
207254 currentVirtualMediaState = & VirtualMediaState {
208255 Source : HTTP ,
209256 Mode : mode ,
@@ -243,6 +290,11 @@ func rpcMountWithWebRTC(filename string, size int64, mode VirtualMediaMode) erro
243290 Size : size ,
244291 }
245292 virtualMediaStateMutex .Unlock ()
293+
294+ if err := setMassStorageMode (mode == CDROM ); err != nil {
295+ return fmt .Errorf ("failed to set mass storage mode: %w" , err )
296+ }
297+
246298 logger .Debug ().Interface ("currentVirtualMediaState" , currentVirtualMediaState ).Msg ("currentVirtualMediaState" )
247299 logger .Debug ().Msg ("Starting nbd device" )
248300 nbdDevice = NewNBDDevice ()
@@ -280,6 +332,10 @@ func rpcMountWithStorage(filename string, mode VirtualMediaMode) error {
280332 return fmt .Errorf ("failed to get file info: %w" , err )
281333 }
282334
335+ if err := setMassStorageMode (mode == CDROM ); err != nil {
336+ return fmt .Errorf ("failed to set mass storage mode: %w" , err )
337+ }
338+
283339 err = setMassStorageImage (fullPath )
284340 if err != nil {
285341 return fmt .Errorf ("failed to set mass storage image: %w" , err )
0 commit comments