#!/bin/bash # Copyright 2018 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. # Produces GCE image of syz-ci running on OpenBSD. # Mostly derived from Go buildlet generator with blessing from bradfitz@. set -eu -o pipefail readonly MIRROR="${MIRROR:-cdn.openbsd.org}" readonly VERSION="${VERSION:-6.7}" readonly DOWNLOAD_VERSION="${DOWNLOAD_VERSION:-snapshots}" readonly RELNO="${2:-${VERSION/./}}" # The only supported setting. readonly ARCH="amd64" readonly ISO="install${RELNO}-${ARCH}.iso" readonly ISO_PATCHED="install${RELNO}-${ARCH}-patched.iso" if [[ ! -f "${ISO}" ]]; then curl -o "${ISO}" "https://${MIRROR}/pub/OpenBSD/${DOWNLOAD_VERSION}/${ARCH}/install${RELNO}.iso" fi # Create custom siteXX.tgz set. rm -fr etc && mkdir -p etc cat >install.site < boot.conf echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config echo 'pass in on egress proto tcp from any to any port 80 rdr-to 127.0.0.1 port 8080' >> /etc/pf.conf echo 'permit keepenv nopass syzkaller as root' > /etc/doas.conf mkdir /syzkaller echo '/dev/sd1a /syzkaller ffs rw,noauto 1 0' >> /etc/fstab EOF cat >etc/installurl <etc/rc.local < /etc/myname.gce \ && echo >> /etc/myname.gce \ && mv /etc/myname{.gce,} \ && hostname \$(cat /etc/myname) GET /computeMetadata/v1/instance/hostname HTTP/1.0 Host: metadata.google.internal Metadata-Flavor: Google EOF2 set -eux echo "starting syz-ci" fsck -y /dev/sd1a mount /syzkaller su -l syzkaller <&1 | tee syz-ci.log & EOF2 ) EOF chmod +x install.site cat >etc/rc.conf.local <etc/sysctl.conf <auto_install.conf <disklabel.template < boot.conf dd if=/dev/urandom of=random.seed bs=4096 count=1 cp "${ISO}" "${ISO_PATCHED}" growisofs -M "${ISO_PATCHED}" -l -R -graft-points \ /${VERSION}/${ARCH}/site${RELNO}.tgz=site${RELNO}.tgz \ /auto_install.conf=auto_install.conf \ /disklabel.template=disklabel.template \ /etc/boot.conf=boot.conf \ /etc/random.seed=random.seed # Initialize disk image. rm -f disk.raw qemu-img create -f raw disk.raw 10G # Run the installer to create the disk image. expect 2>&1 <" send "\n" # Need to wait for the kernel to boot. expect timeout { exit 1 } "\(I\)nstall, \(U\)pgrade, \(A\)utoinstall or \(S\)hell\?" send "s\n" expect timeout { exit 1 } "# " send "mount /dev/cd0c /mnt\n" send "cp /mnt/auto_install.conf /mnt/disklabel.template /\n" send "chmod a+r /disklabel.template\n" send "umount /mnt\n" send "exit\n" expect timeout { exit 1 } "CONGRATULATIONS!" proc login {} { send "root\n" expect "Password:" send "root\n" expect "# " send "cat /etc/ssh/ssh_host_*_key.pub\nhalt -p\n" expect eof } # There is some form of race condition with OpenBSD 6.2 MP # and qemu, which can result in init(1) failing to run /bin/sh # the first time around... expect { timeout { exit 1 } "Enter pathname of shell or RETURN for sh:" { send "\nexit\n" expect "login:" { login } } "login:" { login } } EOF grep 'pkg_add OK' install_log > /dev/null \ || { echo Package installation failed. Inspect install_log. 2>&1 ; exit 1; } # Create Compute Engine disk image. echo "Archiving disk.raw... (this may take a while)" i="openbsd-${ARCH}-${RELNO}-gce.tar.gz" tar -Szcf "$i" disk.raw cat <