dashboard/env: add script to create OpenBSD GCE image
This is almost entirely the work of @mdempsky; I just ran
it a bunch and reported bugs or tweaked things until it worked
and booted the buildlet on GCE.
Update #8642
Change-Id: If5d50bcdf90bc6aa648472cc951ed1c53b46eef3
Reviewed-on: https://go-review.googlesource.com/2156
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/env/openbsd-amd64/.gitignore b/env/openbsd-amd64/.gitignore
new file mode 100644
index 0000000..f1bb5ed
--- /dev/null
+++ b/env/openbsd-amd64/.gitignore
@@ -0,0 +1,8 @@
+boot.conf
+disk.raw
+etc
+install.site
+install56-patched.iso
+install56.iso
+random.seed
+site56.tgz
diff --git a/env/openbsd-amd64/README b/env/openbsd-amd64/README
new file mode 100644
index 0000000..5711074
--- /dev/null
+++ b/env/openbsd-amd64/README
@@ -0,0 +1,18 @@
+make.bash creates a Google Compute Engine VM image to run the Go
+OpenBSD builder, booting up to run the buildlet.
+
+make.bash should be run on a Linux box with qemu.
+
+After it completes, it creates a file openbsd-amd64-gce.tar.gz
+
+Upload openbsd-amd64-gce.tar.gz to gs://go-builder-data/openbsd-amd64-gce.tar.gz
+I just use the web UI at:
+ https://console.developers.google.com/project/symbolic-datum-552/storage/browser/go-builder-data/
+
+Then:
+ gcloud compute --project symbolic-datum-552 images create openbsd-amd64-56 --source-uri gs://go-builder-data/openbsd-amd64-gce.tar.gz
+
+The VM needs to be run with the GCE metadata attribute "buildlet-binary-url" set to a URL
+of the OpenBSD builetlet (cross-compiled, typically).
+
+ buildlet-binary-url == http://storage.googleapis.com/go-builder-data/buildlet.openbsd-amd64
diff --git a/env/openbsd-amd64/make.bash b/env/openbsd-amd64/make.bash
new file mode 100755
index 0000000..5bd243c
--- /dev/null
+++ b/env/openbsd-amd64/make.bash
@@ -0,0 +1,224 @@
+#!/bin/bash
+# Copyright 2014 The Go Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+set -e
+
+# Download kernel, sets, etc. from ftp.usa.openbsd.org
+if ! [ -e install56.iso ]; then
+ curl -O ftp://ftp.usa.openbsd.org/pub/OpenBSD/5.6/amd64/install56.iso
+fi
+
+# XXX: Download and save bash, curl, and their dependencies too?
+# Currently we download them from the network during the install process.
+
+# Create custom site56.tgz set.
+mkdir -p etc
+cat >install.site <<EOF
+#!/bin/sh
+env PKG_PATH=ftp://ftp.usa.openbsd.org/pub/OpenBSD/5.6/packages/amd64 pkg_add -iv bash curl
+
+# See https://code.google.com/p/google-compute-engine/issues/detail?id=77
+echo "ignore classless-static-routes;" >> /etc/dhclient.conf
+EOF
+cat >etc/rc.local <<EOF
+(
+ set -x
+ echo "starting buildlet script"
+ netstat -rn
+ cat /etc/resolv.conf
+ dig metadata.google.internal
+ (
+ set -e
+ export PATH="\$PATH:/usr/local/bin"
+ /usr/local/bin/curl -o /buildlet \$(/usr/local/bin/curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/buildlet-binary-url)
+ chmod +x /buildlet
+ exec /buildlet
+ )
+ echo "giving up"
+ sleep 10
+ halt -p
+)
+EOF
+chmod +x install.site
+tar -zcvf site56.tgz install.site etc/rc.local
+
+# Hack install CD a bit.
+echo 'set tty com0' > boot.conf
+dd if=/dev/urandom of=random.seed bs=4096 count=1
+cp install56.iso install56-patched.iso
+growisofs -M install56-patched.iso -l -R -graft-points \
+ /5.6/amd64/site56.tgz=site56.tgz \
+ /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 <<EOF
+spawn qemu-system-x86_64 -nographic -smp 2 -drive if=virtio,file=disk.raw -cdrom install56-patched.iso -net nic,model=virtio -net user -boot once=d
+
+expect "boot>"
+send "\n"
+
+# Need to wait for the kernel to boot.
+expect -timeout 600 "\(I\)nstall, \(U\)pgrade, \(A\)utoinstall or \(S\)hell\?"
+send "i\n"
+
+expect "Terminal type\?"
+send "vt220\n"
+
+expect "System hostname\?"
+send "buildlet\n"
+
+expect "Which network interface do you wish to configure\?"
+send "vio0\n"
+
+expect "IPv4 address for vio0\?"
+send "dhcp\n"
+
+expect "IPv6 address for vio0\?"
+send "none\n"
+
+expect "Which network interface do you wish to configure\?"
+send "done\n"
+
+expect "Password for root account\?"
+send "root\n"
+
+expect "Password for root account\?"
+send "root\n"
+
+expect "Start sshd\(8\) by default\?"
+send "yes\n"
+
+expect "Start ntpd\(8\) by default\?"
+send "no\n"
+
+expect "Do you expect to run the X Window System\?"
+send "no\n"
+
+expect "Do you want the X Window System to be started by xdm\(1\)\?"
+send "no\n"
+
+expect "Do you want to suspend on lid close\?"
+send "no\n"
+
+expect "Change the default console to com0\?"
+send "yes\n"
+
+expect "Which speed should com0 use\?"
+send "115200\n"
+
+expect "Setup a user\?"
+send "gopher\n"
+
+expect "Full name for user gopher\?"
+send "Gopher Gopherson\n"
+
+expect "Password for user gopher\?"
+send "gopher\n"
+
+expect "Password for user gopher\?"
+send "gopher\n"
+
+expect "Since you set up a user, disable sshd\(8\) logins to root\?"
+send "yes\n"
+
+expect "What timezone are you in\?"
+send "US/Pacific\n"
+
+expect "Which disk is the root disk\?"
+send "sd0\n"
+
+expect "Use DUIDs rather than device names in fstab\?"
+send "yes\n"
+
+expect "Use \(W\)hole disk or \(E\)dit the MBR\?"
+send "whole\n"
+
+expect "Use \(A\)uto layout, \(E\)dit auto layout, or create \(C\)ustom layout\?"
+send "custom\n"
+
+expect "> "
+send "z\n"
+
+expect "> "
+send "a b\n"
+expect "offset: "
+send "\n"
+expect "size: "
+send "1G\n"
+expect "FS type: "
+send "swap\n"
+
+expect "> "
+send "a a\n"
+expect "offset: "
+send "\n"
+expect "size: "
+send "\n"
+expect "FS type: "
+send "4.2BSD\n"
+expect "mount point: "
+send "/\n"
+
+expect "> "
+send "w\n"
+expect "> "
+send "q\n"
+
+expect "Location of sets\?"
+send "cd\n"
+
+expect "Which CD-ROM contains the install media\?"
+send "cd0\n"
+
+expect "Pathname to the sets\?"
+send "5.6/amd64\n"
+
+expect "Set name\(s\)\?"
+send "+*\n"
+
+expect "Set name\(s\)\?"
+send " -x*\n"
+
+expect "Set name\(s\)\?"
+send " -game*\n"
+
+expect "Set name\(s\)\?"
+send " -man*\n"
+
+expect "Set name\(s\)\?"
+send "done\n"
+
+expect "Directory does not contain SHA256\.sig\. Continue without verification\?"
+send "yes\n"
+
+# Need to wait for previous sets to unpack.
+expect -timeout 600 "Location of sets\?"
+send "done\n"
+
+# Need to wait for install.site to install curl.
+expect -timeout 600 "CONGRATULATIONS!"
+
+expect "# "
+send "halt\n"
+
+expect "Please press any key to reboot.\n"
+send "\n"
+
+expect "boot>"
+send "\n"
+
+expect -timeout 600 eof
+EOF
+
+# Create Compute Engine disk image.
+echo "Zipping disk.raw... (this may take a while)"
+tar -Szcf openbsd-amd64-gce.tar.gz disk.raw
+
+echo "Done. GCE image is openbsd-amd64-gce.tar.gz."