| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | 
							- #!/bin/bash
 
- set -euo pipefail
 
- export VM=clevis
 
- title() {
 
-     [ -z "${1}" ] && return 0
 
-     printf '\n\n\n### %s\n' "${@}"
 
-     return 0
 
- }
 
- cmd() {
 
-     [ -z "${1}" ] && return 0
 
-     ssh "${VM}" "${@}"
 
- }
 
- is_unlocked() {
 
-     dev=${1:-}
 
-     [ -z "${dev}" ] && echo "ERROR" && return 0
 
-     luks_uuid="$(cmd cryptsetup luksUUID ${dev} | sed -e 's/-//'g)"
 
-     if cmd test -b /dev/disk/by-id/dm-uuid-*"${luks_uuid}"*; then
 
-         echo "YES"
 
-         return 0
 
-     fi
 
-     echo "NO"
 
- }
 
- wait_for_vm() {
 
-     local _timeout=${1:-120}
 
-     echo "[$(date)] Waiting up to ${_timeout} seconds for VM to respond..." >&2
 
-     local _start _elapsed
 
-     _start=${SECONDS}
 
-     while /bin/true; do
 
-         cmd ls 2>/dev/null >/dev/null && break
 
-         _elapsed=$((SECONDS - _start))
 
-         [ "${_elapsed}" -gt "${_timeout}" ] && echo "[$(date)] TIMEOUT reached" >&2 && return 1
 
-         sleep 0.1
 
-     done
 
-     _elapsed=$((SECONDS - _start))
 
-     echo "[$(date)] VM is up in ${_elapsed} seconds!" >&2
 
-     return 0
 
- }
 
- setup_host() {
 
-     ip a >&2
 
-     free -m >&2
 
-     sudo systemctl restart tangd-update
 
- }
 
- setup_vm() {
 
-     CWD="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
 
-     set -x
 
-     mkdir -p ~/.ssh
 
-     chmod 700 ~/.ssh
 
-     ssh-keygen -q -t rsa -b 4096 -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null
 
-     rm -f ~/.ssh/known_hosts
 
-     cat << EOF > ~/.ssh/config
 
- host clevis
 
-         user root
 
-         hostname 192.168.122.100
 
-         StrictHostKeyChecking no
 
-         ConnectTimeout 20
 
-         PasswordAuthentication no
 
-         PreferredAuthentications publickey
 
-         GSSAPIAuthentication no
 
- EOF
 
-     chmod 600 ~/.ssh/config
 
-     PUBKEY="$(< ~/.ssh/id_rsa.pub)"
 
-     NAME=clevis-vm
 
-     DATA=/data
 
-     DISK=${DATA}/disk.qcow2
 
-     KS=${DATA}/ks.cfg
 
-     case "${DISTRO}" in
 
-     fedora:32)
 
-         COMPOSE=https://download.fedoraproject.org/pub/fedora/linux/releases/32/Everything/x86_64/os/
 
-         KS_TEMPLATE=${CWD}/fedora.cfg.in
 
-         ;;
 
-     fedora:rawhide)
 
-         COMPOSE=https://download.fedoraproject.org/pub/fedora/linux/development/rawhide/Everything/x86_64/os/
 
-         KS_TEMPLATE=${CWD}/fedora.cfg.in
 
-         ;;
 
-     centos:8)
 
-         COMPOSE=http://mirror.centos.org/centos/8/BaseOS/x86_64/os/
 
-         KS_TEMPLATE=${CWD}/centos.cfg.in
 
-         ;;
 
-     centos:8-stream)
 
-         COMPOSE=http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/
 
-         KS_TEMPLATE=${CWD}/centos.cfg.in
 
-         ;;
 
-     *)
 
-         echo "Unsupported distro [${DISTRO}]" >&2
 
-         exit 1
 
-         ;;
 
-     esac
 
-     sudo mkdir -m755 -p "${DATA}"
 
-     pushd "${DATA}"
 
-     cat "${KS_TEMPLATE}" \
 
-         | sed -e "s#@PUBKEY@#${PUBKEY}#g" \
 
-         | sed -e "s#@COMPOSE@#${COMPOSE}#g" \
 
-         | sed -e "s#@TRAVIS_REPO_SLUG@#${TRAVIS_REPO_SLUG}#g" \
 
-         | sed -e "s#@TRAVIS_COMMIT@#${TRAVIS_COMMIT}#g" \
 
-         | sudo tee ${KS}
 
-     sudo chown libvirt-qemu:kvm "${DATA}" -R
 
-     sudo virt-install --name=${NAME} --ram=2048 \
 
-         --os-variant=generic --os-type=linux --vcpus=1 --graphics=none \
 
-         --disk=path="${DISK}",size=7,bus=virtio,format=qcow2 \
 
-         --location="${COMPOSE}" --initrd-inject="${KS}" \
 
-         --extra-args="ip=dhcp ks=file:/ks.cfg inst.repo=${COMPOSE} net.ifnames=0 biosdevname=0 console=tty0 console=ttyS0,115200n8 serial" \
 
-         --console pty,target_type=serial --noreboot
 
-     set +x
 
- }
 
- title "host setup"
 
- setup_host
 
- title "VM setup"
 
- setup_vm
 
- # Start VM.
 
- title "Start VM"
 
- sudo virsh start "${NAME}"
 
- title "Verify dracut boot unlocker"
 
- # Check if it booted properly (i.e. unlocked on boot).
 
- if ! wait_for_vm; then
 
-     echo "[FAIL] Unable to verify the VM booted properly" >&2
 
-     exit 1
 
- fi
 
- title "fstab"
 
- cmd "cat /etc/fstab"
 
- title "crypttab"
 
- cmd "cat /etc/crypttab"
 
- title "Block devices"
 
- cmd "lsblk --fs"
 
- title "LUKS devices"
 
- # Check LUKS devices and config.
 
- for dev in $(cmd "lsblk -p -n -s -r " \
 
-             | awk '$6 == "crypt" { getline; print $1 }' | sort -u); do
 
-     echo "DEVICE[${dev}] CONFIG[$(cmd clevis luks list -d ${dev})] UNLOCKED[$(is_unlocked "${dev}")]"
 
- done
 
- title "clevis-luks-askpass journal"
 
- cmd "journalctl -xe -u clevis-luks-askpass"
 
- echo
 
- echo "[PASS] Test completed successfully" >&2
 
- exit 0
 
 
  |