#
# 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 and muen.
if {(![have_spec nova] && ![have_spec muen])} {
puts "Platform is unsupported."
exit 0
}
set virtualbox_binary "virtualbox-rem"
if {[have_spec muen]} { set virtualbox_binary "virtualbox-muen" }
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 {
server/event_filter
server/report_rom server/fs_rom server/vfs
server/tcp_terminal drivers/nic
lib/vfs/lwip lib/vfs/pipe lib/vfs/import
}
#
# Build Noux packages only once
#
foreach pkg {bash coreutils} {
lappend_if [expr ![file exists bin/$pkg]] build_components noux-pkg/$pkg }
set boot_modules {
vfs fs_rom
posix.lib.so bash.tar coreutils.tar
tcp_terminal vfs_lwip.lib.so vfs_pipe.lib.so vfs_import.lib.so
ipxe_nic_drv report_rom event_filter
test.bin template.bat
}
append boot_modules $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_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 "address=(\[0-9\]+\.\[0-9\]+\.\[0-9\]+\.\[0-9\]+).*\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"
}
}