]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/bash | |
2 | ||
3 | DIRECTORY=$(cd `dirname $0` && pwd) | |
4 | PYTHON_DIRECTORY="$DIRECTORY/../python" | |
5 | ||
6 | if [ -n "$1" ]; then | |
7 | vps_name="$1" | |
8 | else | |
9 | read -p "Nom du vps : " vps_name | |
10 | fi | |
11 | ||
12 | echo "Patienter le temps du reboot" | |
13 | python $PYTHON_DIRECTORY/reboot_vps_server.py --rescue "$vps_name" | |
14 | ||
15 | stty -echo | |
16 | read -p "Mot de passe reçu par e-mail : " password; echo | |
17 | stty echo | |
18 | ||
19 | ARCH_DIR=`mktemp -d` | |
20 | ARCH_HOST_SCRIPT="$ARCH_DIR/arch_host_script.sh" | |
21 | ARCH_CHROOT_SCRIPT="$ARCH_DIR/arch_chroot_script.sh" | |
22 | ARCH_INSTALL_SCRIPT="$ARCH_DIR/arch_install_script.sh" | |
23 | ARCH_HOST_PUPPET_CONFIGURATION_SCRIPT="$ARCH_DIR/arch_host_puppet_configuration_script.sh" | |
24 | ARCH_PUPPET_CONFIGURATION_SCRIPT="$ARCH_DIR/arch_puppet_configuration_script.sh" | |
25 | ||
26 | trap "rm -rf $ARCH_DIR" EXIT | |
27 | ||
28 | #### Base installation stage | |
29 | cat > $ARCH_HOST_SCRIPT <<EOF | |
30 | #!/bin/bash | |
31 | ||
32 | apt-get update | |
33 | apt-get install -y haveged | |
34 | haveged & | |
35 | ||
36 | cd /tmp | |
37 | ||
38 | LATEST=\$(curl https://mirrors.kernel.org/archlinux/iso/latest/sha1sums.txt | grep "bootstrap" | head -n1) | |
39 | SHA1=\$(echo "\$LATEST" | cut -d' ' -f1) | |
40 | NAME=\$(echo "\$LATEST" | cut -d' ' -f3) | |
41 | ||
42 | curl -O "https://mirrors.kernel.org/archlinux/iso/latest/\$NAME" | |
43 | ||
44 | tar -xzf "\$NAME" | |
45 | ||
46 | echo 'Server = http://archlinux.mirrors.ovh.net/archlinux/\$repo/os/\$arch' > /tmp/root.x86_64/etc/pacman.d/mirrorlist | |
47 | ||
48 | DEVICE_STR=\$(cat /proc/mounts | grep "/dev/sd.. /mnt/") | |
49 | DEVICE=\$(echo "\$DEVICE_STR" | cut -d' ' -f1) | |
50 | MOUNTPOINT=\$(echo "\$DEVICE_STR" | cut -d' ' -f2) | |
51 | ||
52 | umount "\$DEVICE" | |
53 | UUID=\$(lsblk -rno UUID "\$DEVICE") | |
54 | ||
55 | echo "\$UUID" > /tmp/root.x86_64/device_uuid | |
56 | ||
57 | cp /tmp/arch_chroot_script.sh /tmp/root.x86_64/ | |
58 | ||
59 | /tmp/root.x86_64/bin/arch-chroot /tmp/root.x86_64/ /arch_chroot_script.sh | |
60 | ||
61 | mount "\$DEVICE" | |
62 | ||
63 | cp /tmp/arch_install_script.sh "\$MOUNTPOINT/root/" | |
64 | ||
65 | /tmp/root.x86_64/bin/arch-chroot "\$MOUNTPOINT" /root/arch_install_script.sh | |
66 | EOF | |
67 | ||
68 | ||
69 | cat > $ARCH_CHROOT_SCRIPT <<EOF | |
70 | #!/bin/bash | |
71 | ||
72 | pacman-key --init | |
73 | pacman-key --populate archlinux | |
74 | ||
75 | UUID=\$(cat /device_uuid) | |
76 | PART="/dev/disk/by-uuid/\$UUID" | |
77 | DEVICE=\$(realpath "\$PART") | |
78 | ||
79 | # mkfs.ext4 -F -U "\$UUID" "\$DEVICE" | |
80 | mount "\$DEVICE" /mnt | |
81 | ||
82 | ##### FIXME: mkfs.ext4 would be better #### | |
83 | for i in /mnt/*; do | |
84 | if [ "\$i" = "/mnt/boot" ]; then | |
85 | # keep /boot/grub | |
86 | rm -f \$i/* | |
87 | else | |
88 | rm -rf \$i | |
89 | fi | |
90 | done | |
91 | ##### /FIXME #### | |
92 | ||
93 | pacstrap /mnt base git puppet | |
94 | ||
95 | echo "\$PART / auto defaults 0 1" > /mnt/etc/fstab | |
96 | ||
97 | umount /mnt | |
98 | EOF | |
99 | ||
100 | cat > $ARCH_INSTALL_SCRIPT <<EOF | |
101 | CODE_PATH="/etc/puppetlabs/code" | |
102 | rm -rf \$CODE_PATH | |
103 | git clone -b master --recursive https://git.immae.eu/perso/Immae/Projets/Puppet.git \$CODE_PATH | |
104 | puppet apply --test \$CODE_PATH/manifests/site.pp | |
105 | # The password seed requires puppet to be run twice | |
106 | puppet apply --test \$CODE_PATH/manifests/site.pp | |
107 | EOF | |
108 | ||
109 | chmod a+x $ARCH_HOST_SCRIPT $ARCH_CHROOT_SCRIPT $ARCH_INSTALL_SCRIPT | |
110 | ||
111 | expect -f - <<EOF | |
112 | set timeout -1 | |
113 | spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no $ARCH_HOST_SCRIPT $ARCH_CHROOT_SCRIPT $ARCH_INSTALL_SCRIPT root@$vps_name:/tmp | |
114 | expect "assword:" | |
115 | send "$password\n" | |
116 | expect eof | |
117 | spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no root@$vps_name /tmp/arch_host_script.sh | |
118 | expect "assword:" | |
119 | send "$password\r" | |
120 | expect eof | |
121 | EOF | |
122 | ||
123 | ### Role specific stage | |
124 | read -p "Press key when LDAP is configured" i | |
125 | ||
126 | cat > $ARCH_PUPPET_CONFIGURATION_SCRIPT <<EOF | |
127 | CODE_PATH="/etc/puppetlabs/code" | |
128 | puppet apply --test \$CODE_PATH/manifests/site.pp | |
129 | EOF | |
130 | ||
131 | cat > $ARCH_HOST_PUPPET_CONFIGURATION_SCRIPT <<EOF | |
132 | DEVICE_STR=\$(cat /proc/mounts | grep "/dev/sd.. /mnt/") | |
133 | DEVICE=\$(echo "\$DEVICE_STR" | cut -d' ' -f1) | |
134 | MOUNTPOINT=\$(echo "\$DEVICE_STR" | cut -d' ' -f2) | |
135 | ||
136 | cp /tmp/arch_puppet_configuration_script.sh "\$MOUNTPOINT/root/" | |
137 | ||
138 | /tmp/root.x86_64/bin/arch-chroot "\$MOUNTPOINT" /root/arch_puppet_configuration_script.sh | |
139 | EOF | |
140 | ||
141 | chmod a+x $ARCH_PUPPET_CONFIGURATION_SCRIPT $ARCH_HOST_PUPPET_CONFIGURATION_SCRIPT | |
142 | ||
143 | expect -f - <<EOF | |
144 | set timeout -1 | |
145 | spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no $ARCH_PUPPET_CONFIGURATION_SCRIPT $ARCH_HOST_PUPPET_CONFIGURATION_SCRIPT root@$vps_name:/tmp | |
146 | expect "assword:" | |
147 | send "$password\n" | |
148 | expect eof | |
149 | spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no root@$vps_name /tmp/arch_host_puppet_configuration_script.sh | |
150 | expect "assword:" | |
151 | send "$password\r" | |
152 | expect eof | |
153 | EOF | |
154 | ||
155 | ### Installation finished | |
156 | read -p "Reboot to normal? [Y/n]" reboot | |
157 | if [ "x$reboot" != "xn" ]; then | |
158 | echo "Rebooting" | |
159 | python $PYTHON_DIRECTORY/reboot_vps_server.py --local "$vps_name" | |
160 | fi |