aboutsummaryrefslogtreecommitdiff
path: root/whispers-tree-tests
diff options
context:
space:
mode:
Diffstat (limited to 'whispers-tree-tests')
-rwxr-xr-xwhispers-tree-tests345
1 files changed, 345 insertions, 0 deletions
diff --git a/whispers-tree-tests b/whispers-tree-tests
new file mode 100755
index 0000000..ed20362
--- /dev/null
+++ b/whispers-tree-tests
@@ -0,0 +1,345 @@
+#!/bin/sh
+
+BOOT_WAIT_DEFAULT=25
+# set GO_PLAY_KIDS to no to have a longer sequence of tests
+GO_PLAY_KIDS=no
+
+YESCOUNT=0
+NOCOUNT=0
+
+function testcount()
+{
+ test $1 = $2 && echo SUCCESS || echo FAILED
+ test $1 = $2 && YESCOUNT=$(($YESCOUNT + 1)) || NOCOUNT=$(($NOCOUNT + 1))
+}
+
+function dirtyssh()
+{
+ ssh -q \
+ -o UserKnownHostsFile=/dev/null \
+ -o StrictHostKeyChecking=no \
+ -p $1 \
+ root@localhost \
+ "$2"
+}
+
+function herd_service_status()
+{
+ echo "herd status of $2 on ${VM[$1]}:"
+ dirtyssh ${PORT[$1]} "herd status $2"
+ echo
+}
+
+function herd_test_service_status()
+{
+ echo "Test if the $2 service is $3 on ${VM[$1]}."
+ RESULT=$(herd_service_status $1 $2 | awk -- '/It is '$3'/ {print $3}')
+ testcount ${RESULT} $3
+ echo
+}
+
+function test_forward()
+{
+ echo "From ${VM[$1]}, take reverse port forward opened by
+${VM[$2]} to connect to ${VM[$3]} through
+sshd of ${VM[$4]}."
+ EXITHOST=reset
+ EXITHOST=$(dirtyssh \
+ ${PORT[$1]} \
+ "ssh -q \\
+ -o UserKnownHostsFile=/dev/null \\
+ -o StrictHostKeyChecking=no \\
+ -p $5 \\
+ root@$6 \\
+ hostname")
+ echo "Hostname at forward exit: ${EXITHOST}, expected: ${VM[$3]}"
+ testcount ${EXITHOST} ${VM[$3]}
+}
+
+echo "*** DEFINING VM INSTANCIATION ARRAYS"
+echo
+
+I=0
+SSHD_WILD=$I
+
+VM[$I]=sshd-wild
+echo "* VM: ${VM[$I]}"
+EXTRA_SERVICES[$I]=""
+PORT[$I]=$((10022+$I))
+EXTRAPORT_HOST[$I]=$((${PORT[$I]}+1000))
+EXTRAPORT_VM[$I]=$((${PORT[$I]}+2000))
+ULTIMAPORT_HOST[$I]=$((${PORT[$I]}+3000))
+ULTIMAPORT_VM[$I]=$((${PORT[$I]}+4000))
+echo
+
+I=$(($I+1))
+SSHD_REMOTE=$I
+
+VM[$I]=sshd-remote
+echo "* VM: ${VM[$I]}"
+ALLOW_GATEWAY[$I]="yes"
+EXTRA_SERVICES[$I]=""
+PORT[$I]=$((10022+$I))
+EXTRAPORT_HOST[$I]=$((${PORT[$I]}+1000))
+EXTRAPORT_VM[$I]=$((${PORT[$I]}+2000))
+ULTIMAPORT_HOST[$I]=$((${PORT[$I]}+3000))
+ULTIMAPORT_VM[$I]=$((${PORT[$I]}+4000))
+EXTRA_SERVICES[$I]=""
+echo
+
+I=$(($I+1))
+SSHD_SOCKS=$I
+
+VM[$I]=sshd-socks
+echo "* VM: ${VM[$I]}"
+ALLOW_GATEWAY[$I]="yes"
+BOOT_WAIT[$I]=25
+EXTRA_SERVICES[$I]=""
+PORT[$I]=$((10022+$I))
+EXTRAPORT_HOST[$I]=$((${PORT[$I]}+1000))
+EXTRAPORT_VM[$I]=$((${PORT[$I]}+2000))
+ULTIMAPORT_HOST[$I]=$((${PORT[$I]}+3000))
+ULTIMAPORT_VM[$I]=$((${PORT[$I]}+4000))
+echo
+
+I=$(($I+1))
+WHISPERS=$I
+
+VM[$I]=whispers
+echo "* VM: ${VM[$I]}"
+EXTRA_SERVICES[$I]=""
+PORT[$I]=$((10022+$I))
+EXTRAPORT_HOST[$I]=$((${PORT[$I]}+1000))
+EXTRAPORT_VM[$I]=$((${PORT[$I]}+2000))
+ULTIMAPORT_HOST[$I]=$((${PORT[$I]}+3000))
+ULTIMAPORT_VM[$I]=$((${PORT[$I]}+4000))
+EXTRA_SERVICES[$I]="
+ (service
+ whispers-service-type
+ (whispers-configuration
+ (lieutenants
+ (list
+ (service
+ whispers-service-type
+ (whispers-configuration
+ (name 'bare)
+ (lieutenants
+ (list
+ (service
+ persistent-ssh-service-type
+ (ssh-connection-configuration
+ (require-networking? #f)
+ (socks-proxy-config
+ (socks-proxy-configuration
+ (use-proxy? #t)
+ (dynamic-forward
+ (ssh-connection-configuration
+ (require-networking? #f)
+ (sshd-host \"10.0.2.2\")
+ (sshd-port ${PORT[$SSHD_SOCKS]})
+ (forwards
+ (list (dynamic-forward-configuration)))))))
+ (sshd-host \"10.0.2.2\")
+ (sshd-port ${PORT[$SSHD_REMOTE]})
+ (forwards
+ (list (reverse-port-forward-configuration
+ (entry-port ${EXTRAPORT_VM[$SSHD_REMOTE]})
+ (forward-host \"10.0.2.2\")
+ (exit-port ${PORT[$SSHD_WILD]}))))))
+ (service
+ whispers-service-type
+ (whispers-configuration
+ (name 'burr)
+ (user \"whispers\")
+ (group \"whispers\")))
+ (service
+ whispers-service-type
+ (whispers-configuration
+ (name 'bear)
+ (user \"whispers\")
+ (group \"whispers\")
+ (lieutenants
+ (list
+ (service
+ whispers-service-type
+ (whispers-configuration
+ (name 'bearable)
+ (user \"whispers\")
+ (group \"whispers\")))
+ (service
+ whispers-service-type
+ (whispers-configuration
+ (name 'bore)
+ (user \"whispers\")
+ (group \"whispers\")
+ (extend-user? #t)
+ (extend-group? #t)))))))))))))))"
+echo
+
+for I in ${!PORT[@]}
+do
+ EXTRACONTENT[$I]=""
+ if [ -v ALLOW_TUNDEV[$I] ]
+ then
+ EXTRACONTENT[$I]="
+ (extra-content \"
+PermitTunnel=point-to-point\")"
+ fi
+ GATEWAY[$I]=""
+ if [ -v ALLOW_GATEWAY[$I] ]
+ then
+ GATEWAY[$I]="
+ (gateway-ports? #t)"
+ fi
+ WAIT[$I]=$BOOT_WAIT_DEFAULT
+ if [ -v BOOT_WAIT[$I] ]
+ then
+ WAIT[$I]=${BOOT_WAIT[$I]}
+ fi
+done
+echo
+
+echo "*** CONCATENATING SYSTEM CONFIGURATIONS"
+echo
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}"
+ echo "(use-modules (guix records)
+ (gnu)
+ (whispers services whispers)
+ (whispers services ssh-tunneler))
+(use-service-modules networking ssh desktop)
+(use-package-modules ssh lsof)
+
+(operating-system
+ (host-name \"${VM[$I]}\")
+ (timezone \"Asia/Shanghai\")
+ (locale \"en_US.utf8\")
+
+ (bootloader (bootloader-configuration
+ (bootloader grub-bootloader)
+ (targets '(\"/dev/sda\"))))
+
+ (file-systems (cons (file-system
+ (device (file-system-label \"root\"))
+ (mount-point \"/\")
+ (type \"ext4\"))
+ %base-file-systems))
+
+ (users %base-user-accounts)
+
+ (packages (append (list lsof)
+ %base-packages))
+
+ (services
+ (append
+ (list (service dhcp-client-service-type)
+ (service openssh-service-type
+ (openssh-configuration
+ (permit-root-login #t)
+ (allow-empty-passwords? #t)
+ (openssh openssh-sans-x)
+ (port-number 22)${GATEWAY[$I]}${EXTRACONTENT[$I]}))${EXTRA_SERVICES[$I]})
+ %base-services)))" > /tmp/${VM[$I]}.scm
+ echo
+done
+echo
+
+echo "*** INSTANCIATING VMs"
+echo
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}"
+ VMRUN[$I]=$(guix system vm /tmp/${VM[$I]}.scm)
+ echo
+done
+echo
+
+echo "*** SILENTLY BOOTING VMs..."
+echo
+for I in ${!PORT[@]}
+do
+ NICSTANCE=-"nic user,model=virtio-net-pci,hostfwd=tcp::${PORT[$I]}-:22,hostfwd=tcp::${EXTRAPORT_HOST[$I]}-:${EXTRAPORT_VM[$I]},hostfwd=tcp::${ULTIMAPORT_HOST[$I]}-:${ULTIMAPORT_VM[$I]}"
+ echo "* VM: ${VM[$I]}"
+ ${VMRUN[$I]} \
+ $NICSTANCE \
+ -display none &
+ sleep ${WAIT[$I]}
+ echo
+done
+echo
+
+echo "*** SETTING PASSWORDLESS LOGIN FOR WHISPERS USERS..."
+echo
+echo "* VM: ${VM[$WHISPERS]}"
+dirtyssh ${PORT[$CLIENT01]} 'passwd -d whispers'
+echo
+echo
+
+echo "*** REPORTING SHEPHERD STATUS"
+echo
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}"
+ dirtyssh ${PORT[$I]} 'herd status'
+ echo
+done
+echo
+
+echo "*** REPORTING NETWORK INTERFACES"
+echo
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}"
+ dirtyssh ${PORT[$I]} 'ip addr show'
+ echo
+done
+echo
+
+echo "*** REPORTING ROUTES"
+echo
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}"
+ dirtyssh ${PORT[$I]} 'ip route'
+ echo
+done
+echo
+
+function full_tests()
+{
+ herd_service_status $WHISPERS whispers
+ herd_test_service_status $WHISPERS whispers running
+}
+
+if [[ foo$GO_PLAY_KIDS == foono ]]
+then
+ full_tests
+ echo
+fi
+
+echo "*** TESTS SUMMARRY"
+echo
+echo Successes: $YESCOUNT
+echo Failures: $NOCOUNT
+echo
+echo
+
+echo "You can ssh into the VMs from another terminal of this host"
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}, port: ${PORT[$I]}"
+done
+echo
+read -n 1 -r -s -p "When done playing, press any key to halt the VMs..."
+echo
+echo
+
+echo "*** HALTING VMs"
+echo
+for I in ${!PORT[@]}
+do
+ echo "* VM: ${VM[$I]}"
+ dirtyssh ${PORT[$I]} halt
+ echo
+done