]> git.proxmox.com Git - pve-installer.git/blame - unconfigured.sh
build: run shellcheck as part of `test` step
[pve-installer.git] / unconfigured.sh
CommitLineData
89a12446
DM
1#!/bin/bash
2
3trap "err_reboot" ERR
4
0acbbbf5
TL
5# NOTE: we nowadays get exec'd by the initrd's PID 1, so we're the new PID 1
6
89a12446 7parse_cmdline() {
89a12446 8 proxdebug=0
7a11b298 9 proxtui=0
e2cbcc4e 10 serial=0
9e5787e5 11 # shellcheck disable=SC2013 # per word splitting is wanted here
dbe9a0c9 12 for par in $(cat /proc/cmdline); do
9e5787e5
TL
13 case $par in
14 proxdebug)
7a11b298
TL
15 proxdebug=1
16 ;;
17 proxtui)
18 proxtui=1
9e5787e5 19 ;;
a31259b1
SI
20 console=ttyS*)
21 serial=1
22 ;;
9e5787e5 23 esac
89a12446
DM
24 done;
25}
26
27debugsh() {
16ff00ec 28 /bin/bash
89a12446
DM
29}
30
0acbbbf5
TL
31eject_and_reboot() {
32 iso_dev=$(awk '/ iso9660 / {print $1}' /proc/mounts)
33
34 for try in 5 4 3 2 1; do
298bdcaf
TL
35 echo "unmounting ISO"
36 if umount -v -a --types iso9660; then
0acbbbf5
TL
37 break
38 fi
39 if test -n $try; then
e13e3510 40 echo "unmount failed - trying again in 5 seconds"
0acbbbf5
TL
41 sleep 5
42 fi
43 done
44
45 if [ -n "$iso_dev" ]; then
6ce4f3d7 46 eject "$iso_dev" || true # cannot really work currently, don't care
0acbbbf5
TL
47 fi
48
cd801ab8
TL
49 umount -l -n /dev
50
0acbbbf5
TL
51 echo "rebooting - please remove the ISO boot media"
52 sleep 3
024449f1 53 reboot -nf
6ce4f3d7
TL
54 sleep 5
55 echo "trigger reset system request"
56 # we do not expect the reboot above to fail, so rather to avoid kpanic when pid 1 exits
0acbbbf5
TL
57 echo b > /proc/sysrq-trigger
58 sleep 100
59}
60
89a12446 61real_reboot() {
dbe9a0c9 62 trap - ERR
89a12446 63
e13e3510
TL
64 if [[ -x /etc/init.d/networking ]]; then
65 /etc/init.d/networking stop
66 fi
89a12446
DM
67
68 # stop udev (release file handles)
69 /etc/init.d/udev stop
70
20d20ee3 71 swap=$(awk '/^\/dev\// { print $1 }' /proc/swaps);
89a12446 72 if [ -n "$swap" ]; then
6856f73c
TL
73 echo -n "Deactivating swap..."
74 swapoff "$swap"
75 echo "done."
89a12446 76 fi
89a12446 77
6ce4f3d7
TL
78 # just to be sure
79 sync
80
89a12446 81 umount -l -n /target >/dev/null 2>&1
57a8f6e5
TL
82 umount -l -n /dev/pts
83 umount -l -n /dev/shm
8d7ddbde 84 umount -l -n /run
dea730ea 85 [ -d /sys/firmware/efi/efivars ] && umount -l -n /sys/firmware/efi/efivars
89a12446 86
0acbbbf5
TL
87 # do not unmount proc and sys for now, at least /proc is still required to trigger the actual
88 # reboot, and both are virtual FS only anyway
89
8a13026d
TL
90 echo "Terminate all remaining processes"
91 kill -s TERM -1 # TERMinate all but current init (our self) PID 1
92 sleep 2
93 echo "Kill any remaining processes"
94 kill -s KILL -1 # KILL all but current init (our self) PID 1
95 sleep 0.5
0acbbbf5
TL
96
97 eject_and_reboot
98
99 exit 0 # shouldn't be reached, kernel will panic in that case
89a12446
DM
100}
101
126379f6
CH
102# reachable through the ERR trap
103# shellcheck disable=SC2317
89a12446 104err_reboot() {
4fb3a9c6 105 printf "\nInstallation aborted - unable to continue (type exit or CTRL-D to reboot)\n"
2e3fe722 106 debugsh || true
89a12446
DM
107 real_reboot
108}
109
478b111c
TL
110# NOTE: dbus must be launched before this, else iwd cannot work
111# FIXME: very crude, still needs to actually copy over any iwd config to target
112handle_wireless() {
113 wireless_found=
114 for iface in /sys/class/net/*; do
115 if [ -d "$iface/wireless" ]; then
116 wireless_found=1
117 fi
118 done
119 if [ -z $wireless_found ]; then
120 return;
121 fi
122
123 if [ -x /usr/libexec/iwd ]; then
124 echo "wireless device(s) found, starting iwd; use 'iwctl' to manage connections (experimental)"
125 /usr/libexec/iwd &
126 else
127 echo "wireless device found but iwd not available, ignoring"
128 fi
129}
130
89a12446
DM
131PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
132
fff4bc47
TL
133echo "Starting Proxmox installation"
134
0acbbbf5 135# ensure udev doesn't ignores our request; FIXME: not required anymore, as we use switch_root now
194d737a
TL
136export SYSTEMD_IGNORE_CHROOT=1
137
89a12446 138mount -n -t proc proc /proc
89a12446 139mount -n -t sysfs sysfs /sys
f238dd03
TL
140if [ -d /sys/firmware/efi ]; then
141 echo "EFI boot mode detected, mounting efivars filesystem"
dea730ea 142 mount -n -t efivarfs efivarfs /sys/firmware/efi/efivars
f238dd03 143fi
8d7ddbde 144mount -n -t tmpfs tmpfs /run
de629a23 145mkdir -p /run/proxmox-installer
89a12446
DM
146
147parse_cmdline
148
149# always load most common input drivers
000f289d
TL
150modprobe -q psmouse || true
151modprobe -q sermouse || true
152modprobe -q usbhid || true
89a12446
DM
153
154# load device mapper - used by lilo
000f289d 155modprobe -q dm_mod || true
89a12446
DM
156
157echo "Installing additional hardware drivers"
dbe9a0c9 158export RUNLEVEL=S
89a12446
DM
159export PREVLEVEL=N
160/etc/init.d/udev start
161
3119bdeb
TL
162mkdir -p /dev/shm
163mount -t tmpfs tmpfs /dev/shm
164
4569e022
TL
165# allow pseudo terminals for debuggin in X
166mkdir -p /dev/pts
167mount -vt devpts devpts /dev/pts -o gid=5,mode=620
168
cbddb92d
TL
169# shellcheck disable=SC2207
170console_dim=($(IFS=' ' stty size)) # [height, width]
171DPI=96
172if (("${console_dim[0]}" > 100)) && (("${console_dim[1]}" > 400)); then
173 # heuristic only, high resolution can still mean normal/low DPI if it's a really big screen
174 # FIXME: use `edid-decode` as it can contain physical dimensions to calculate actual dpi?
175 echo "detected huge console, setting bigger font/dpi"
176 DPI=192
177 export GDK_SCALE=2
178 setfont /usr/share/consolefonts/Uni2-Terminus32x16.psf.gz
179fi
180
d5268f68
TL
181# set the hostname
182hostname proxmox
183
478b111c
TL
184if command -v dbus-daemon; then
185 echo "starting D-Bus daemon"
186 mkdir /run/dbus
187 dbus-daemon --system --syslog-only
188
189 if [ $proxdebug -ne 0 ]; then # FIXME: better intergration, e.g., use iwgtk?
190 handle_wireless # no-op if not wireless dev is found
191 fi
192fi
193
291ac3b6
TL
194# we use a trimmed down debootstrap so make busybox tools available to compensate that
195busybox --install -s || true
196
521662f8
TL
197setupcon || echo "setupcon failed, TUI rendering might be garbled - $?"
198
3facbe51
CH
199if [ "$serial" -ne 0 ]; then
200 echo "Setting terminal size to 80x24 for serial install"
201 stty columns 80 rows 24
202fi
203
11a42156 204if [ $proxdebug -ne 0 ]; then
aa0fe276 205 /sbin/agetty -o '-p -- \\u' --noclear tty9 &
fff4bc47 206 printf "\nDropping in debug shell before starting installation\n"
521662f8 207 echo "type 'exit' or press CTRL + D to continue and start the installation wizard"
2e3fe722 208 debugsh || true
11a42156
TL
209fi
210
89a12446 211# try to get ip config with dhcp
01e402f0
FG
212echo -n "Attempting to get DHCP leases... "
213dhclient -v
89a12446
DM
214echo "done"
215
203059a9 216echo "Starting chrony for opportunistic time-sync... "
d5268f68 217chronyd || echo "starting chrony failed ($?)"
150291b3 218
909936b5
SI
219echo "Starting a root shell on tty3."
220setsid /sbin/agetty -a root --noclear tty3 &
221
de629a23
TL
222/usr/bin/proxmox-low-level-installer dump-env
223
7a11b298
TL
224if [ $proxtui -ne 0 ]; then
225 echo "Starting the TUI installer"
65694938 226 /usr/bin/proxmox-tui-installer 2>/dev/tty2
7a11b298
TL
227else
228 echo "Starting the installer GUI - see tty2 (CTRL+ALT+F2) for any errors..."
0d97286c 229 xinit -- -dpi "$DPI" -s 0 >/dev/tty2 2>&1
7a11b298 230fi
89a12446 231
b0c4afcc
DM
232# just to be sure everything is on disk
233sync
234
89a12446 235if [ $proxdebug -ne 0 ]; then
fff4bc47 236 printf "\nDebug shell after installation exited (type exit or CTRL-D to reboot)\n"
2e3fe722 237 debugsh || true
89a12446
DM
238fi
239
240echo "Installation done, rebooting... "
d13c1966
TL
241
242killall5 -15
243
89a12446
DM
244real_reboot
245
246# never reached
126379f6 247# shellcheck disable=SC2317
89a12446 248exit 0