-
Notifications
You must be signed in to change notification settings - Fork 13
/
jeos-firstboot
executable file
·218 lines (178 loc) · 5.89 KB
/
jeos-firstboot
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#!/bin/bash
# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: Copyright 2015-2022 SUSE LLC
set -e
TEXTDOMAIN='jeos-firstboot'
. /etc/os-release
. "/usr/share/jeos-firstboot/jeos-firstboot-functions"
. "/usr/share/jeos-firstboot/jeos-firstboot-dialogs"
. "/usr/share/jeos-firstboot/welcome-screen"
# Read the optional configuration file
[ -f /usr/share/defaults/jeos-firstboot.conf ] && . /usr/share/defaults/jeos-firstboot.conf
[ -f /etc/jeos-firstboot.conf ] && . /etc/jeos-firstboot.conf
# for testing we may run as non root
if [ -w /run ]; then
export TMPDIR=/run
# debugging
if [ -n "$FIRSTBOOT_DEBUG" ]; then
set -x
exec 2>/var/log/firstboot-debug
fi
else
dry=1
fi
if [ -n "$dry" ]; then
run() {
echo "$@"
}
else
run() {
"$@"
}
fi
cleanup() {
call_module_hook cleanup
# reenable systemd and kernel logs
# Try the race-free DBus method first
if ! run dbus-send --system --print-reply --dest=org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager.SetShowStatus string: &>/dev/null; then
# Fall back to using signals
run kill -s SIGRTMAX-10 1
fi
run setterm -msg on 2>/dev/null || true
echo
}
trap cleanup EXIT
# avoid kernel messages spamming our console
run setterm -msg off 2>/dev/null || true
# Avoid systemd messages spamming our console
# Try the race-free DBus method first
if ! run dbus-send --system --print-reply --dest=org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager.SetShowStatus string:off &>/dev/null; then
# Fall back to using signals
run kill -s SIGRTMAX-9 1
# sleep to avoid systemd bug, bsc#1119382
sleep 1
fi
systemd_firstboot_args=('--setup-machine-id')
# If the configuration is not loaded and we are in the first terminal
# instance, make sure that the variables are declared.
JEOS_LOCALE=${JEOS_LOCALE-}
JEOS_KEYTABLE=${JEOS_KEYTABLE-}
if [ -z "$JEOS_LOCALE" ]; then
welcome_screen_with_console_switch
dialog_locale
fi
# Activate the locale selected
apply_locale
# also add to systemd-firstboot parameters
systemd_firstboot_args+=("--locale=$JEOS_LOCALE")
if [ -z "$JEOS_KEYTABLE" ]; then
welcome_screen_with_console_switch
dialog_keytable
fi
# langset.sh needs locale to set keytable
apply_locale_and_keytable
[ -n "$JEOS_LOCALE" ] && language="${JEOS_LOCALE%%_*}" || language="en"
force_english_license=0
export LANG="$JEOS_LOCALE"
kmscon_available() {
# kmscon itself is installed
kmscon --help >/dev/null 2>&1 || return 1
# At least one monospace font is available
[ -n "$(fc-match "monospace" 2>/dev/null)" ] || return 1
return 0
}
fbiterm_available() {
# fbiterm itself is installed
fbiterm --help >/dev/null 2>&1 || return 1
# fbiterm comes with its own fallback font
return 0
}
if [[ "$(resolve_tty "$(tty)")" =~ /dev/tty[0-9]+ ]]; then
# Those languages can't be displayed in the console
declare -A start_kmscon
start_kmscon["cs"]=1
start_kmscon["ja"]=1
start_kmscon["zh"]=1
start_kmscon["ko"]=1
# Relay those settings to the nested instance
export JEOS_LOCALE JEOS_KEYTABLE
if [ -n "$JEOS_LOCALE" -a -n "${start_kmscon[${language}]+_}" ]; then
if kmscon_available; then
ret_file="$(mktemp)"
kmscon --silent --font-size 10 --palette vga --no-reset-env -l -- /bin/sh -c "$0; echo \$? > $ret_file; kill \$PPID"
exit $(cat "$ret_file"; rm -f "$ret_file")
elif fbiterm_available; then
exec fbiterm -- "$0"
else
# No kmscon or fbiterm, fall back to english
export LANG="en_US.UTF-8"
force_english_license=1
fi
fi
fi
if [ -z "$JEOS_EULA_ALREADY_AGREED" ]; then
welcome_screen_with_console_switch
# Find the location of the EULA
# An EULA in /etc takes precedence
EULA_FILE=/etc/YaST2/licenses/base/license.txt
[ -e "${EULA_FILE}" ] || EULA_FILE=/usr/share/licenses/product/base/license.txt
# Failsafe: If no license found, quit.
if ! [ -e "$EULA_FILE" ]; then
d --msgbox $"No license found - cannot continue" 6 40
exit 1
fi
if [ "$force_english_license" = "0" ]; then
for i in "${EULA_FILE%.txt}.${JEOS_LOCALE}.txt" \
"${EULA_FILE%.txt}.${JEOS_LOCALE%%.UTF-8}.txt" \
"${EULA_FILE%.txt}.${language}.txt"; do
if [ -e "$i" ]; then
EULA_FILE="$i"
break
fi
done
fi
while true; do
d --textbox "$EULA_FILE" $dh_text 85
[ -e "${EULA_FILE%/*}/no-acceptance-needed" ] && break
dialog --yesno $"Do you agree with the terms of the license?" 0 0 && break
dialog --msgbox $"Can not continue without agreement" 6 40 || :
done
fi
if [ -z "$JEOS_TIMEZONE" ]; then
welcome_screen_with_console_switch
dialog_timezone
fi
systemd_firstboot_args+=("--timezone=$JEOS_TIMEZONE")
# systemd-firstboot does not set the timezone if it exists, langset.sh created it
run rm -f /etc/localtime
run systemd-firstboot "${systemd_firstboot_args[@]}"
if [ -z "$JEOS_PASSWORD_ALREADY_SET" ]; then
welcome_screen_with_console_switch
dialog_password
fi
# Do not show the register on non SLE based distributions or if is
# globally disabled
if [ -x /usr/bin/SUSEConnect -a -z "${ID##sle*}" -a -z "${JEOS_HIDE_SUSECONNECT}" ]; then
welcome_screen_with_console_switch
d --msgbox $"Please register this image using your existing SUSE entitlement.
As \"root\" use the following command:
SUSEConnect -e company@example.com -r YOUR_CODE
to register the instance with SCC
Without registration this instance does not have access to updates and
security fixes." 0 0 || true
fi
call_module_hook systemd_firstboot
d --infobox $"Applying firstboot settings ..." 3 40 || true
apply_password
# Look for EFI dir to see if the machine is booted in UEFI mode
EFI_SYSTAB="/sys/firmware/efi/systab"
# modprobe and efivars are not available everywhere, just ignore those cases
run modprobe efivars &>/dev/null || true
if ! [ -f "$EFI_SYSTAB" ]; then
if [ -f /etc/sysconfig/bootloader ]; then
run sed -i -e "s/LOADER_TYPE=.*/LOADER_TYPE=grub2/g" /etc/sysconfig/bootloader
fi
fi
call_module_hook post