summaryrefslogtreecommitdiff
path: root/run
blob: 9cc5f393dfc240581ac941bc5a7130b85b2abbb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#! /bin/sh

# Auto-install OpenBSD/amd64 6.6 to a QEMU guest machine. A POSIX shell script
# intended to run headless, ssh-controlled integration tests.
#
# Run the following command to serve the automatically created directory mirror
# at http://127.0.0.1 (port 80):
#
#   sudo python3 -m http.server --directory mirror --bind 127.0.0.1 80
#
# Pass the following options to ssh or scp to connect to the guest machine:
#
#   ssh \
#     -o "StrictHostKeyChecking no" \
#     -o "UserKnownHostsFile /dev/null" \
#     -o "Port 2222" \
#     puffy@127.0.0.1
#
# Press C-a x to stop the guest machine. Press C-a h to show other options.
#
# The virtual network:
#
#   network    = 10.0.2.0/24
#   host       = 10.0.2.2
#   nameserver = 10.0.2.3
#   guest      = 10.0.2.15-31
#
# Port forwardings:
#
#   host:2222 -> guest:22
#   host:8080 -> guest:80
#
# Run the following command to clean up any mess created by this script :)
#
#   git clean -Xdf
#
# Copyright (c) 2020 Stefan Kreutz <mail@skreutz.com>

set -o errexit
set -o nounset
set -o xtrace

# Set parameters.
DISK_SIZE="${DISK_SIZE-20G}"
CPU_COUNT="${CPU_COUNT-1}"
MEMORY_SIZE="${MEMORY_SIZE-4G}"

# Download and verify OpenBSD/amd64 6.6 installation images and file sets.
[ -d mirror ] || {
  mkdir -p mirror-tmp/pub/OpenBSD/6.6
  [ -e mirror-tmp/pub/OpenBSD/6.6/openbsd-66-base.pub ] || \
    curl --output mirror-tmp/pub/OpenBSD/6.6/openbsd-66-base.pub --silent \
      https://ftp.openbsd.org/pub/OpenBSD/6.6/openbsd-66-base.pub
  mkdir -p mirror-tmp/pub/OpenBSD/6.6/amd64
  rsync --recursive --delete --quiet \
    rsync://ftp.halifax.rwth-aachen.de/openbsd/6.6/amd64/ \
    mirror-tmp/pub/OpenBSD/6.6/amd64/
  ( cd mirror-tmp/pub/OpenBSD/6.6/amd64 && \
    signify -C -q -p ../openbsd-66-base.pub -x SHA256.sig )
  mv mirror-tmp mirror
}

# Create default site-specific file set.
mkdir -p mirror/pub/OpenBSD/6.6/amd64/site66
[ -d mirror/pub/OpenBSD/6.6/amd64/site66/install.site ] || \
  cat << EOF > mirror/pub/OpenBSD/6.6/amd64/site66/install.site
#! /bin/ksh
set -o errexit
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
echo "permit nopass keepenv :wheel" > /etc/doas.conf
#echo "syspatch && shutdown -r now" >> /etc/rc.firsttime
EOF
chmod +x mirror/pub/OpenBSD/6.6/amd64/site66/install.site

# Package site-specific file set.
( cd mirror/pub/OpenBSD/6.6/amd64 && \
  rm -f site66.tgz && \
  cd site66 && \
  tar -czf ../site66.tgz . && \
  cd .. && \
  ls -l > index.txt )

# Create default install.conf.
ssh_pub_key="$( cat ~/.ssh/id_rsa.pub )"
[ -e mirror/install.conf ] || cat << EOF > mirror/install.conf
Change the default console to com0 = yes
Which speed should com0 use = 115200
System hostname = openbsd-vm
Password for root = *************
Allow root ssh login = no
Setup a user = puffy
Password for user = *************
Public ssh key for user = ${ssh_pub_key}
What timezone are you in = UTC
Location of sets = http
HTTP Server = 10.0.2.2
Unable to connect using https. Use http instead = yes
URL to autopartitioning template for disklabel = http://10.0.2.2/disklabel
Set name(s) = site66.tgz
Checksum test for site66.tgz failed. Continue anyway = yes
Unverified sets: site66.tgz. Continue without verification = yes
EOF

# Create default disklabel template.
[ -e mirror/disklabel ] || cat << EOF > mirror/disklabel
/          500M
swap         1G
/tmp         1G
/var         1G
/var/www     1G
/usr         2G
/usr/X11R6 500M
/usr/local   4G
/usr/src     1M
/usr/obj     1M
/home        4G
EOF

# Wait until the HTTP server is online.
while [ ! "$( curl --silent --location --write-out '%{http_code}\n' --output /dev/null http://127.0.0.1/install.conf )" = 200 ] ;
do
  ( >&2 printf "Please serve the directory mirror at http://127.0.0.1 (port 80).\n" )
  sleep 5
done

# Collect files to be served over TFTP.
mkdir -p tftp
[ -e tftp/auto_install ] || \
  ln -s ../mirror/pub/OpenBSD/6.6/amd64/pxeboot tftp/auto_install
[ -e tftp/bsd.rd ] || \
  ln -s ../mirror/pub/OpenBSD/6.6/amd64/bsd.rd tftp/bsd.rd

# Create default boot.conf.
mkdir -p tftp/etc
[ -e tftp/etc/boot.conf ] || cat << EOF > tftp/etc/boot.conf
stty com0 115200
set tty com0
boot tftp:/bsd.rd
EOF

# Create copy-on-write disk image.
[ -e openbsd-66-vm.qcow2 ] || \
  qemu-img create -f qcow2 openbsd-66-vm.qcow2 "${DISK_SIZE}"

# Auto-install guest machine.
qemu-system-x86_64 \
  -enable-kvm \
  -m "${MEMORY_SIZE}" \
  -smp "cpus=${CPU_COUNT}" \
  -device e1000,netdev=n1 \
  -netdev user,id=n1,hostname=openbsd-vm,tftp=tftp,bootfile=auto_install,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80 \
  -drive file=openbsd-66-vm.qcow2,media=disk,if=virtio \
  -nographic
Generated by cgit. See skreutz.com for my tech blog and contact information.