# # This script is used to test the shared folder support of Vbox@Genode/NOVA. # # Requirements to run this script: # - hard disk with 4 primary partitions # - on the 4. partition an ext2 filesystem is expected with following files: # -- /win7.vdi # -- /ram/overlay_win7.vdi # # The overlay file must be generated beforehand, e.g.: # # vboxmanage showhdinfo win7.vdi # # to find out the size of the vdi and then to create the overlay: # # vboxmanage createhd --filename overlay_win7.vdi --size [vdi_size] --format vdi # # # # # The Windows image (win7.vdi) is prepared to contain a bat file with following # content: # # :check # IF EXIST E:\test.bat (GOTO start) ELSE (timeout /t 3 >nul) # GOTO check # # :start # # call E:\test.bat # # This file must be configured to be autostarted by Windows, e.g change the # value in the registry entry at # # HKEY_CURRENT_USER\Software/Microsoft\Windows\CurrentVersion\Run # # to the batch file in the Windows vdi image as described above. # # # What this script does: # # A VM containing a Win7 image is started configured with two different # Virtualbox fileshares (D: and E:). One contains a test file (test.bin), # which will be copied by the Windows VM from the one file share over to the # second one. # On Genode side a Noux instance is running a bash shell with the two # filesystems mounted. The shell is scripted by this script to wait for # completion of the copy operation performed by the Windows VM. If this is # detected, the bash scripts use sha1sum to generate hashes of the original # test file of the one file system share and of the copy on the second file # system share. This run scripts then compares the hashes and reports # "Test succeeded" if they are identical. # # This script generates the test file out of /dev/urandom and generates a # batch file test.bat which is placed in the shared folder for the VM. test.bat # is invoked by the batch file running already in the Windows VM as described # beforehand. test.bat contains the actual instructions to be performed by # the VM - for this script to copy the test.bin file from D: to E:. if {[have_include "power_on/qemu"]} { puts "\nRun script does not support Qemu.\n" exit 0 } # Tested for nova if {![have_spec nova]} { puts "Platform is unsupported." exit 0 } set virtualbox_binary "virtualbox-rem" if {[have_spec nova]} { set virtualbox_binary "virtualbox-nova" } set virtualbox5_binary "virtualbox5-rem" if {[have_spec nova]} { set virtualbox5_binary "virtualbox5-nova" } # # Create .bat file to be executed by Win VM # set template_bat_fd [open "bin/template.bat" w] puts $template_bat_fd {:check IF EXIST E:\start.txt (GOTO start) ELSE (timeout /t 3 >nul) GOTO check :start copy D:\test.bin E:\test.bin copy D:\template.bat E:\done.txt shutdown /s /t 00} close $template_bat_fd # Convert bat file to dos format catch { exec unix2dos bin/template.bat } # # Create random test binary to be copied via shared folder of vbox # catch { exec dd if=/dev/urandom of=bin/test.bin bs=4096 count=8160 } # # Step 1: prepare and start the actual VM # set build_components { lib/vfs lib/libc lib/posix lib/vfs_lwip lib/vfs_pipe lib/vfs_import server/event_filter server/report_rom server/fs_rom server/vfs server/tcp_terminal server/nic_router driver/nic } # # Build Noux packages only once # foreach pkg {bash coreutils} { lappend_if [expr ![file exists bin/$pkg]] build_components noux-pkg/$pkg } lappend boot_modules bash.tar coreutils.tar test.bin template.bat $vbox_file set config_of_app { 2018-01-01 00:01 } append_if [expr $use_ps2] config_of_app { } append_if [expr $use_usb] config_of_app { } append config_of_app { } append_if [expr $use_ps2] config_of_app { } append_if [expr $use_usb] config_of_app { } append config_of_app { } append_if [expr $use_vbox5] config_of_app " " append config_of_app { } append_if [expr $use_ram_fs] config_of_app { } append config_of_app { } append_if [expr $use_ram_fs] config_of_app { } append config_of_app { } source ${genode_dir}/repos/ports/run/virtualbox_auto.inc exec cp ${genode_dir}/repos/ports/run/$vbox_file bin/. build_boot_image $boot_modules set ip_match_string "nic_router\\\] \\\[uplink\\\] dynamic IP config: interface (\[0-9]{1,3}.\[0-9]{1,3}.\[0-9]{1,3}.\[0-9]{1,3}).*\n" # # Step 2: Read out TCP/IP address of tcp_terminal running on Genode target # run_genode_until $ip_match_string 20 set serial_id [output_spawn_id] regexp $ip_match_string $output -> serial_ip_addr # # Step 3: Wait until Windows is up for sure # run_genode_until {\[init -\> vbox1\].*Guest Additions capability report:.*seamless: yes, hostWindowMapping: no, graphics: yes} 300 $serial_id # # Step 4 : connect to Noux of the running Genode target and issue bash commands # via netcat # puts "\nTest shared folder\n" spawn netcat $serial_ip_addr 8888 set netcat_id $spawn_id set spawn_id_list [list $netcat_id $serial_id] run_genode_until {\[init -> tcp_terminal\] connection established} 20 $spawn_id_list # # Step 5 : interact with netcat -> ... -> tcp_terminal -> /bin/bash # # Windows does not like trailing zeros introduced by our ROM service. # -> .bat script does not find labels like 'check' with zero bytes # so - delete zero bytes puts $netcat_id "cat from/template\.bat | tr -d \"\\0\" >to/test\.bat" # SHA1 of original file puts $netcat_id "sha1sum from/test.bin" # Tell Windows VM to start copying puts $netcat_id "echo \"start\" > to/start\.txt" # Wait until Windows finished copying puts $netcat_id "while \[ ! -f to/done\.txt ]" puts $netcat_id "do" puts $netcat_id "sleep 5" puts $netcat_id "done" # Wait until VM signaled shutdown state run_genode_until {\[init\] child "vbox1" exited with exit value 0} 120 $spawn_id_list # SHA1 of copied file puts $netcat_id "sha1sum to/test.bin" # Wait for output of bash shell until last SHA1 sum is calculated run_genode_until {[[:xdigit:]]+ to/test\.bin} 50 $spawn_id_list # cleanup created files exec rm -f bin/test.bin exec rm -f bin/template.bat exec rm -f bin/$vbox_file # # Step 5: Compare sha1sum of original file and of copy made by .bat file in VM # set sha1sum_original [regexp -inline {[[:xdigit:]]+ from/test\.bin} $output] set sha1sum_copy [regexp -inline {[[:xdigit:]]+ to/test\.bin} $output] set sha1sum_original [regexp -inline {[[:xdigit:]]+} $sha1sum_original] set sha1sum_copy [regexp -inline {[[:xdigit:]]+} $sha1sum_copy] puts -nonewline "\n$sha1sum_original ?= $sha1sum_copy --> " if {$sha1sum_original eq ""} { puts " empty -> no " } else { if {$sha1sum_original != $sha1sum_copy} { puts "no" exit -1 } else { puts "yes" } }