optionally, only upgrade on hosts where prepare said we have something to do
[mirror/dsa-misc.git] / scripts / VM-installs / ganeti-bytemark
1 #!/bin/bash
2
3 set -e
4 set -u
5
6 SUITE=wheezy
7 MIRROR=http://mirror.bytemark.co.uk/debian
8
9 check_installed() {
10     local p
11     for p in "$@"; do
12         if ! dpkg -l "$p" 2>/dev/null | grep -q '^ii'; then
13             echo >&2 "Error: package $p not installed:"
14             echo >&2 "  apt-get install $*"
15             exit 1
16         fi
17     done
18 }
19 get_sshkey_fprs() {
20     local f
21     for f in etc/ssh/ssh_host*_key.pub; do
22         echo -n "  "
23         ssh-keygen -l -f "$f"
24     done
25 }
26 cleanup() {
27     set +x
28     echo
29     if [ -n "${target:-}" ] && [ -e "$target" ]; then
30         cd /
31         if [ "$(stat -f / -c %i)" != "$(stat -f "$target" -c %i)" ]; then
32             umount "$target"
33         fi
34         rmdir "$target"
35     fi
36
37     if [ -n "${part1:-}" ]; then
38         kpartx -d -p "-p" -v "$disk"
39     fi
40 }
41 check_installed debootstrap debian-archive-keyring kpartx
42
43 echo -n "New VM's name: "
44 read guest
45
46 disk="/dev/mapper/$guest"
47 target="/mnt/target-$guest"
48
49 if ! [ -e "$disk" ]; then
50     echo >&2 "Error: Disk $disk does not exist."
51     exit 1
52 fi
53 if [ -e "$target" ]; then
54     echo >&2 "Error: Directory $target already exists."
55     exit 1
56 fi
57
58 if [ "$(head -c 65536 "$disk" | sha1sum | awk '{print $1}')" != "1adc95bebe9eea8c112d40cd04ab7a8d75c4f961" ]; then
59     echo -n "Warning: Disk appears to be not be empty.  Continue anyway? [y/N] "
60     read ans
61     [ "$ans" = "y" ] || exit 0
62 fi
63
64 echo -n "ipaddr: "; read ipaddr
65 prefixlen=25 #echo -n "prefixlen: "; read prefixlen
66 gateway=5.153.231.1     #echo -n "gateway: "; read gateway
67 ip6addr=2001:41c8:1000:21::21:${ipaddr##*.} # echo -n "ip6addr: "; read ip6addr
68 ip6gateway=fe80::1      # echo -n "ip6gateway: "; read ip6gateway
69
70 set -x
71
72 trap cleanup EXIT
73
74 if [ -e "$disk-part1" ]; then
75     # we already had a partition table and udev/kpartx got it at boot time
76     kpartx -v -d -p -part $disk
77 fi
78 echo '2048,,L,*' | sfdisk -u S --Linux "$disk"
79 kpartx -v -p "-p" -a "$disk"
80 part1="${disk}-p1"
81 mkfs.ext4 "$part1"
82
83 mkdir "$target"
84 mount "$part1" "$target"
85 cd "$target"
86
87 debootstrap --variant=minbase --keyring=/usr/share/keyrings/debian-archive-keyring.gpg "$SUITE" . "$MIRROR"
88
89 ### Set up swap and fstab
90 dd if=/dev/zero of=swapfile bs=1024k count=512
91 chmod 0 swapfile
92 mkswap ./swapfile
93
94 uuidroot=$(blkid -s UUID -o value ${part1}) &&
95 cat > etc/fstab << EOF
96 UUID=$uuidroot    /               ext4   errors=remount-ro 0       1
97 /swapfile none swap sw 0 0
98 EOF
99 echo 'RAMTMP=yes' >> etc/default/tmpfs
100
101 ### Set up basic networking stuff
102 echo "$guest" > etc/hostname
103 cat > etc/hosts << EOF
104 127.0.0.1       localhost
105
106 # The following lines are desirable for IPv6 capable hosts
107 ::1     localhost ip6-localhost ip6-loopback
108 fe00::0 ip6-localnet
109 ff00::0 ip6-mcastprefix
110 ff02::1 ip6-allnodes
111 ff02::2 ip6-allrouters
112 ff02::3 ip6-allhosts
113 EOF
114 rm -fv etc/udev/rules.d/70-persistent-*
115 mkdir -p etc/udev/rules.d/
116 touch etc/udev/rules.d/75-persistent-net-generator.rules
117
118 cat > etc/network/interfaces << EOF
119 auto lo
120 iface lo inet loopback
121
122 auto eth0
123 iface eth0 inet static
124     address $ipaddr/$prefixlen
125     gateway $gateway
126 iface eth0 inet6 static
127     address $ip6addr
128     gateway $ip6gateway
129     netmask 64
130     accept_ra 0
131 EOF
132
133 cat > etc/resolv.conf << EOF
134 nameserver 8.8.8.8
135 search debian.org
136 EOF
137
138 # Add a serial console
139 sed -i -e '/ttyS0/s/^#//;/ttyS0/s/9600/115200/' etc/inittab
140
141 ### A couple packages
142 mv etc/apt/sources.list etc/apt/sources.list.d/debian.list
143 chroot . apt-get update
144 echo "Apt::Install-Recommends 0;" > etc/apt/apt.conf.d/local-recommends
145 chroot . apt-get install -y locales-all net-tools iproute ifupdown dialog vim netbase udev psmisc usbutils pciutils
146
147 ### Set up kernel and bootloader
148 chroot . apt-get install -y linux-image-amd64
149 DEBIAN_FRONTEND=noninteractive chroot . apt-get install -y grub2
150
151 ! [ -e dev/vda ]
152 ! [ -e dev/vda1 ]
153 cp -av `readlink -f "$disk"` dev/new-root
154 cp -av `readlink -f "$part1"` dev/new-root1
155 chroot . grub-install --modules=part_msdos /dev/new-root
156 rm -v dev/new-root*
157
158 cp -av `readlink -f "$disk"` dev/vda
159 cp -av `readlink -f "$part1"` dev/vda1
160 rm boot/grub/device.map
161 chroot . update-grub
162 rm -v dev/vda*
163
164 rootpw="$(head -c 12 /dev/urandom | base64)"
165 echo "root:$rootpw" | chroot . chpasswd
166
167 ### install ssh
168 chroot . apt-get install -y ssh
169 sed -i -e "s/`hostname`\$/$guest/" etc/ssh/ssh_host*_key.pub
170 sshkeys="$(get_sshkey_fprs)"
171 rsahostkey="$(cat etc/ssh/ssh_host_rsa_key.pub)"
172
173 ### clean up
174 trap - EXIT
175 cleanup
176
177
178 echo -n "Run on which node? "
179 read node
180 echo
181
182 echo "$guest's root password is $rootpw"
183 echo "SSH host key fingerprints are:"
184 echo "$sshkeys"
185 echo "IP addresses:"
186 echo "  $ipaddr"
187 echo "  $ip6addr"
188
189 echo
190 echo "ud-ldap ldpavi snippet:"
191 cat << EOF
192 add host=$guest,ou=hosts,dc=debian,dc=org
193 host: $guest
194 hostname: $guest.debian.org
195 objectClass: top
196 objectClass: debianServer
197 l: York, UK
198 distribution: Debian GNU/Linux
199 access: restricted
200 admin: debian-admin@lists.debian.org
201 architecture: amd64
202 sshRSAHostKey: $rsahostkey
203 ipHostNumber: $ipaddr
204 ipHostNumber: $ip6addr
205 mXRecord: 0 INCOMING-MX
206 physicalHost: ganeti.bm.debian.org
207 description: XXX
208 purpose: XXX
209 sponsor: [[www.bytemark.co.uk|Bytemark Hosting]] (hosting + hardware)
210
211 EOF
212
213 echo "Maybe run this now: "
214 echo " gnt-instance add \\"
215 echo "    --no-ip-check \\"
216 echo "    --no-name-check \\"
217 echo "    -t blockdev \\"
218 echo "    --disk=0:adopt=/dev/disk/by-id/scsi-"$guest" \\"
219 echo "    --backend-parameters memory=1g \\"
220 echo "    --os-type noop \\"
221 echo "    -n "${node:-XXX}" \\"
222 echo "    $guest.debian.org"
223