2daec2fcacd0e2f4ae741a77ddf02e5e357cf30e
[lhc/ateliers.git] / ateliers_host
1 #!/bin/sh
2 set -e -f ${DRY_RUN:+-n} -u ${TRACE:+-x}
3 # -e: erreur si une commande non testée échoue.
4 # -f: désactive les jokers dans les chemins.
5 # -u: erreur si une variable non-définie est utilisée.
6 # -x: affiche les commandes exécutées sur la sortie d'erreur standard.
7
8 tool=${0%/*}
9 . "$tool"/env.sh
10
11 rule_help () {
12 cat >&2 <<-EOF
13 DESCRIPTION: ce script regroupe des fonctions utilitaires
14 pour gérer la VM des ateliers _depuis_ son hôte ;
15 il sert à la fois d'outil et de documentation.
16 Voir \`$tool/ateliers_hosted' pour les utilitaires côté VM hébergée.
17 SYNTAX: $0 \$RULE \${RULE}_SYNTAX
18 RULES:
19 $(sed -ne 's/^rule_\([^ ]*\) () {\( *#.*\|\)/\t\1\2/p' "$0")
20 ENVIRONMENT:
21 $(sed -ne 's/^readonly \([^ =]*\).*}\( *#.*\|\)$/\t$\1\2/p' "$tool"/env.sh "$0")
22 EOF
23 }
24
25 readonly dev_disk="/dev/xvda"
26 readonly dev_disk_boot="${dev_disk}1"
27 readonly dev_disk_swap="${dev_disk}5"
28 readonly dev_disk_root="${dev_disk}6"
29 readonly dev_disk_var="${dev_disk}7"
30 readonly dev_disk_home="${dev_disk}8"
31
32 rule_xen_config_init () {
33 tee /etc/xen/$vm_fqdn.cfg <<-EOF
34 # -*- mode: python; -*-
35 import os, re
36 name = "$vm"
37 arch = os.uname()[4]
38 memory = 2048
39 vcpus = 1
40 vif = ['mac=$vm_mac,bridge=$vm_bridge']
41 disk = ['phy:/dev/domU/$vm_fqdn-disk,hda,w']
42 kernel = "/usr/lib/xen-4.0/boot/hvmloader"
43 builder = 'hvm'
44 device_model = 'qemu-dm'
45 acpi = 1
46 apic = 1
47 # boot on floppy (a), hard disk (c) or CD-ROM (d)
48 #boot = 'd'
49
50 #vnc = 1
51 #sdl = 0
52 #vncconsole = 0
53 #vnclisten = "0.0.0.0"
54 #vncpasswd = ""
55 #usbdevice = 'tablet'
56
57 keymap = 'fr'
58 serial = 'pty'
59 on_poweroff = 'destroy'
60 on_reboot = 'restart'
61 on_crash = 'restart'
62 EOF
63 }
64 rule_xen_on () {
65 sudo xm create $vm_fqdn.cfg
66 }
67 rule_xen_off () {
68 sudo xm shutdown $vm_fqdn.cfg
69 }
70
71 rule_disk_mount () {
72 # Montage du disque de la VM depuis l'hôte
73 test ! -e $vm_dev_disk
74 sudo xm block-attach 0 phy:/dev/domU/$vm_fqdn-disk $vm_dev_disk w
75 }
76 rule_disk_unmount () {
77 # Démontage du disque de la VM depuis l'hôte
78 test -e $vm_dev_disk
79 ! mountpoint /mnt/$vm_fqdn
80 sudo xm block-detach 0 $vm_dev_disk
81 }
82 rule_disk_part () {
83 # Partitionage du disque de la VM
84 # NOTE: on fait le choix de ne pas utiliser LVM sur la machine virtuelle car :
85 # - pour l'extension de mémoire:
86 # 1. on créera une nouvelle partition sur le LVM de l'hôte
87 # 2. on l'ajoutera comme un disque supplémentaire dans /etc/xen/$vm_fqdn.cfg
88 # 3. on le montera sur /home2 en pensant à changer DHOME=/home2 dans /etc/adduser.conf
89 # - pour la sauvegarde: LVM snapshoot est trop
90 # 1. sauvegarde au niveau applicatif (pgdump, mysqldump)
91 # 2. sauvegarde des configurations (etckeeper, git)
92 # 3. sauvegarde incrémentale et chiffrée des autres fichiers (duplicity)
93 # NOTE:
94 sudo sfdisk -d $vm_dev_disk <<-EOF
95 # partition table of $vm_dev_disk
96 unit: sectors
97
98 ${vm_dev_disk}1 : start= 63, size= 497952, Id=83, bootable
99 ${vm_dev_disk}2 : start= 498015, size=418927005, Id= 5
100 ${vm_dev_disk}3 : start= 0, size= 0, Id= 0
101 ${vm_dev_disk}4 : start= 0, size= 0, Id= 0
102 ${vm_dev_disk}5 : start= 498078, size= 1959867, Id=82
103 ${vm_dev_disk}6 : start= 2458008, size= 29302497, Id=83
104 ${vm_dev_disk}7 : start= 31760568, size= 9767457, Id=83
105 ${vm_dev_disk}8 : start= 41528088, size=377896932, Id=83
106 EOF
107 }
108
109 rule_boot_format () {
110 mount | grep -q "^$vm_dev_disk_boot "
111 sudo mkfs.ext2 -m 0 -T small -L "boot" $vm_dev_disk_boot
112 }
113 rule_boot_mount () {
114 ! mountpoint /mnt/$vm_fqdn/boot
115 sudo mount -v $vm_dev_disk_boot /mnt/$vm_fqdn/boot
116 }
117 rule_boot_unmount () {
118 mountpoint /mnt/$vm_fqdn/boot
119 sudo unmount -v /mnt/$vm_fqdn/boot
120 }
121
122 rule_part_clean () {
123 # NOTE: long, optionnel
124 # Déjà fait à la main histoire de pouvoir créer la machine virtuelle plus
125 # rapidement le jour venu.
126 part=$1
127 eval "sudo dd if=/dev/urandom of=\$vm_dev_disk_$part"
128 }
129 rule_part_clean_stat () {
130 # USE: exécuter cette fonction dans un shell distinct de rule_part_clean()
131 # lui fait afficher sa progression.
132 part=$1
133 eval "pkill -USR1 -f \"^dd if=/dev/urandom of=\$vm_dev_disk_$part\""
134 }
135 rule_part_format_root () {
136 # DECRIPTION: Formatage de /
137 part="root"
138 eval dev="\$vm_dev_disk_$part"
139 sudo cryptsetup luksFormat --hash=sha512 --key-size=512 --key-file=- \
140 --cipher=aes-xts-essiv:sha256 --align-payload=8 $dev
141 sudo cryptsetup luksOpen --key-file=- $dev ${vm}_${part}_deciphered
142 sudo mkfs.ext4 -m 5 -T ext4 -L ${vm}_$part -E stripe_width=32,resize=15G \
143 /dev/mapper/${vm}_${part}_deciphered
144 }
145 rule_format_part () {
146 # DESCRIPTION: formatage d'une partition distincte de /
147 # NOTE: la clef de chiffrement est dérivée de celle de /,
148 # / doit être déchiffrée pour que cela fonctionne.
149 part=$1
150 eval dev="\$vm_dev_disk_$part"
151 test -e /dev/mapper/${vm}_root_deciphered
152 sudo /lib/cryptsetup/scripts/decrypt_derived ${vm}_root_deciphered |
153 sudo cryptsetup luksFormat --key-file=- --hash=sha512 --key-size=512 --cipher=aes-xts-essiv:sha256 $dev
154 }
155 rule_mount_part () {
156 part=$1
157 eval dev="\$vm_dev_disk_$part"
158 test -e /dev/mapper/${vm}_root_deciphered
159 sudo /lib/cryptsetup/scripts/decrypt_derived ${vm}_root_deciphered |
160 sudo cryptsetup luksOpen --key-file=- $dev ${vm}_${part}_deciphered
161 }
162 rule_unmount_part () {
163 part=$1
164 eval dev="\$vm_dev_disk_$part"
165 sudo cryptsetup luksClose ${vm}_${part}_deciphered
166 }
167 rule_part_format_swap () {
168 part="swap"
169 rule_format_part $part
170 rule_mount_part $part
171 sudo mkswap -f -L ${vm}_swap /dev/mapper/${vm}_${part}_deciphered
172 rule_unmount_part $part
173 }
174 rule_part_format_var () {
175 part="var"
176 rule_format_part $part
177 rule_mount_part $part
178 sudo mkfs.ext4 -m 5 -T ext4 -L ${vm}_$part -E stripe_width=32,resize=5G /dev/mapper/${vm}_${part}_deciphered
179 rule_unmount_part $part
180 }
181 rule_part_format_home () {
182 part="home"
183 rule_format_part $part
184 rule_mount_part $part
185 sudo mkfs.ext4 -m 5 -T ext4 -L ${vm}_$part -E stripe_width=32,resize=200G /dev/mapper/${vm}_${part}_deciphered
186 rule_unmount_part $part
187 }
188
189 rule_install_debian () {
190 sudo DEBOOTSTRAP_DIR=/usr/share/debootstrap/ debootstrap \
191 --arch=$vm_arch --verbose --keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
192 --exclude=vim-tiny \
193 --include=$(printf '%s,' \
194 acl \
195 bsdmainutils \
196 busybox \
197 ca-certificates \
198 console-setup \
199 cryptsetup \
200 dash \
201 dnsutils \
202 dropbear \
203 etckeeper \
204 hashalot \
205 htop \
206 ifupdown \
207 initramfs-tools \
208 kbd \
209 less \
210 ncurses-term \
211 openssh-client \
212 openssh-server \
213 openssl \
214 pciutils \
215 procps \
216 quota \
217 quotatool \
218 rsync \
219 screen \
220 sudo \
221 sysprofile \
222 vim-nox \
223 wget \
224 zsh \
225 ) \
226 $vm_lsb_name /mnt/$vm_fqdn/ http://ftp.fr.debian.org/debian/
227 }
228 rule_chroot () {
229 mountpoint /mnt/$vm_fqdn
230 mountpoint /mnt/$vm_fqdn/boot
231 mount --bind /dev /mnt/$vm_fqdn/dev
232 sudo chroot /mnt/$vm_fqdn /bin/bash
233 umount /mnt/$vm_fqdn/dev
234 }
235
236 rule=${1:-help}
237 ${1+shift}
238 rule_$rule "$@"