summaryrefslogtreecommitdiffstats
path: root/src/VBox/Additions/common/testcase/led-lights.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Additions/common/testcase/led-lights.sh')
-rwxr-xr-xsrc/VBox/Additions/common/testcase/led-lights.sh276
1 files changed, 276 insertions, 0 deletions
diff --git a/src/VBox/Additions/common/testcase/led-lights.sh b/src/VBox/Additions/common/testcase/led-lights.sh
new file mode 100755
index 00000000..50514cd2
--- /dev/null
+++ b/src/VBox/Additions/common/testcase/led-lights.sh
@@ -0,0 +1,276 @@
+#!/bin/bash
+# $Id: led-lights.sh $
+## @file
+# VirtualBox guest LED demonstration test
+#
+
+#
+# Copyright (C) 2021-2022 Oracle and/or its affiliates.
+#
+# This file is part of VirtualBox base platform packages, as
+# available from https://www.virtualbox.org.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation, in version 3 of the
+# License.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses>.
+#
+# SPDX-License-Identifier: GPL-3.0-only
+#
+
+#
+# Usage:
+# led-lights.sh [-a | -r]
+#
+
+#
+# Test script to twiddle the console LEDs of a VirtualBox VM.
+#
+# This is not an automated test, just something for humans to look
+# at, to convince themselves that the VM console LEDs are working.
+# By default it cycles through the LED types in a specific order.
+#
+# '-a' twiddles all possible LEDs at the same time
+# '-r' reverses the default order
+#
+# For instance, run the script in 2 VMs at once, one with '-r'.
+#
+# LEDs are not expected to track perfectly, as other OS activities
+# will light them (and buffer cache effects can delay things). Just
+# make sure that all the tested ones (hard disk, optical, USB storage,
+# floppy, shared folders, net) are working. Expected activity:
+#
+# - Disk & optical devices show solid 'read'
+# - Virtual USB disk & optical devices show 'write' on the USB LED
+# - Floppy devices and shared folders alternate 'read/write'
+# - Net blinks 'write'
+#
+# Pre-VM setup:
+#
+# Download or locate a bootable Linux ISO able to be used 'live'.
+# Make a tarball of this script + extra junk:
+#
+# $ dd if=/dev/zero of=junk bs=100k count=1
+# $ tar cf floppy.img led-lights.sh junk
+#
+# NOTE: floppy.img must be >= 20KiB or you will get I/O errors!
+#
+# VM setup:
+#
+# New VM; type: Linux (subtype to match ISO); create default HD.
+# VM Settings:
+# System > raise base memory to 4GiB
+# Storage > insert 'Live bootable' Linux ISO image;
+# turn on 'Live CD/DVD'
+# Storage > add floppy controller (i82078); insert floppy.img
+# Storage > add USB controller; insert USB HD & USB CD
+# System > move Optical before Floppy in boot order
+# Shared Folders > set up one or more Shared Folders if desired
+# (they should be permanent, auto-mount,
+# writable, with at least 10MB free space)
+#
+# Boot the VM. Open a shell, become root, optionally install
+# VirtualBox Guest Utilities to access Shared Folders, then extract
+# and run this script:
+#
+# $ sudo bash
+# # yum install virtualbox-guest-utils # for Shared Folders
+# # tar xf /dev/fd0 led-lights.sh
+# # ./led-lights.sh [-a | -r]
+
+if [ ! -w / ]; then
+ echo "Must be run as root!" 1>&2
+ exit 1
+fi
+
+all_all=false
+reverse=false
+
+if [ "x$1" = "x-a" ]; then
+ all_all=true
+fi
+
+if [ "x$1" = "x-r" ]; then
+ reverse=true
+fi
+
+# Copy binaries to RAM tmpfs to avoid CD I/O after cache purges
+MYTMP=/tmp/led-lights.$$
+mkdir $MYTMP
+for bin in $(which dd sleep sync); do
+ case $bin in
+ /*)
+ cp -p $bin $MYTMP
+ ;;
+ esac
+done
+export MYTMP PATH=$MYTMP:$PATH
+
+set -o monitor
+
+# Make device reads keep hitting the 'hardware'
+# even if the whole medium fits in cache...
+drop_cache()
+{
+ echo 1 >/proc/sys/vm/drop_caches
+}
+
+activate()
+{
+ kill -CONT -$1 2>/dev/null
+}
+
+suppress()
+{
+ $all_all || kill -STOP -$1 2>/dev/null
+}
+
+declare -a pids pidnames
+cpids=0
+
+twiddle()
+{
+ let ++cpids
+ new_pid=$!
+ pidname=$1
+ pids[$cpids]=$new_pid
+ pidnames[$cpids]=$pidname
+ suppress $new_pid
+}
+
+hide_stderr()
+{
+ exec 3>&2 2>/dev/null
+}
+
+show_stderr()
+{
+ exec 2>&3 3>&-
+}
+
+bail()
+{
+ hide_stderr
+ for pid in ${pids[*]}; do
+ activate $pid
+ kill -TERM -$pid
+ kill -TERM $pid
+ done 2>/dev/null
+ rm -rf $MYTMP
+ kill $$
+}
+
+trap "bail" INT
+
+drives()
+{
+ echo $(
+ awk '$NF ~/^('$1')$/ { print $NF }' /proc/partitions
+ )
+}
+
+# Prevent job control 'stopped' msgs during twiddler startup
+hide_stderr
+
+# Hard disks
+for hdd in $(drives '[sh]d.'); do
+ while :; do
+ dd if=/dev/$hdd of=/dev/null
+ drop_cache
+ done 2>/dev/null &
+ twiddle disk:$hdd
+done
+
+# Optical drives
+for odd in $(drives 'sr.|scd.'); do
+ while :; do
+ dd if=/dev/$odd of=/dev/null
+ drop_cache
+ done 2>/dev/null &
+ twiddle optical:$odd
+done
+
+# Floppy drives
+for fdd in $(drives 'fd.'); do
+ while :; do
+ dd if=/dev/$fdd of=$MYTMP/$fdd bs=1k count=20
+ dd of=/dev/$fdd if=$MYTMP/$fdd bs=1k count=20
+ done 2>/dev/null &
+ twiddle floppy:$fdd
+done
+
+# Shared folders
+if ! lsmod | grep -q vboxsf; then
+ echo
+ echo "Note: to test the Shared Folders LED, install this"
+ echo "distro's VirtualBox Guest Utilities package, e.g.:"
+ echo
+ echo " # yum install virtualbox-guest-utils (Red Hat family)"
+ echo " # apt install virtualbox-guest-utils (Debian family)"
+ echo
+fi >&3 # original stderr
+for shf in $(mount -t vboxsf | awk '{ print $3 }'); do
+ while :; do
+ dd if=/dev/urandom of=$shf/tmp.led-lights.$$ bs=100k count=100
+ for rep in $(seq 1 10); do
+ drop_cache
+ dd of=/dev/zero if=$shf/tmp.led-lights.$$ bs=100k count=100
+ done
+ sync
+ rm -f $shf/tmp.led-lights.$$
+ done >/dev/null 2>&1 &
+ twiddle sharedfs:$shf
+done
+
+# Network
+ping -i.2 1.2.3.4 >/dev/null &
+twiddle net
+
+# Untested LED: Graphics3D -- add some day?
+
+sleep 0.1
+show_stderr
+
+if $reverse; then
+ seq=$(seq $cpids -1 1)
+else
+ seq=$(seq 1 $cpids)
+fi
+
+show_intr()
+{
+ intr=$(stty -a | sed -n '/intr/ { s/.*intr *=* *//; s/[ ;].*//p }')
+ echo
+ echo "[ Hit $intr to stop ]"
+ echo
+}
+
+if $all_all; then
+ printf "%s ...\n" ${pidnames[*]}
+ show_intr
+ wait
+else
+ CEOL=$(tput el)
+ show_intr
+ while :; do
+ for pidx in $seq; do
+ pid=${pids[$pidx]}
+ pidname=${pidnames[$pidx]}
+ echo -e -n "$pidname$CEOL\r"
+ shift
+ activate $pid
+ sleep 2
+ suppress $pid
+ sync
+ sleep .5
+ done
+ done
+fi