blob: 2d6015e1d815e6701a8bbe980f5c42493764b2a6 (
plain) (
blame)
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
|
#!/bin/ash
echo "Configuring stage 3.2 ..."
# first a few variables
CONFIG="${FUTURE_ROOT}/opt/openslx/config"
#########################################################################
#
# This function downloads the config containing environment variables
#
fetch_text_config() {
[ -e "$CONFIG" ] && grep -E '^#_RCONFIG_TAG$' "$CONFIG" > /dev/null \
&& echo "Config already fetched." && return 0
download "${SLX_BASE_PATH}/config$UUID_URL" "${CONFIG}-remote" || return 1
echo "# Config fetched from $URL" >> "$CONFIG"
echo "#_RCONFIG_TAG" >> "$CONFIG"
CONFIG_DOWNLOAD_TIME=$(sed -r 's/^([0-9]+)\.([0-9]+).*$/\1\2/' /proc/uptime)
cat "${CONFIG}-remote" >> "$CONFIG"
}
#########################################################################
#
# This function downloads the config.tgz and unpacks it to $TARGET_PATH <-- no it doesn't!
#
fetch_config_tgz() {
[ -e "${CONFIG}.tgz" ] && echo "config.tgz already downloaded." && return 0
download "${SLX_BASE_PATH}/config.tgz$UUID_URL" "${CONFIG}.tgz"
}
#########################################################################
#
# This function updates the downloaded config with the IP information
# received from /inc/setup_network <-- plus 500 other things
merge_text_config() {
# sanity checks
[ ! -e "${CONFIG}" ] && { echo "Cannot update. '$CONFIG' does not exist."; return 1; }
# write IP and SLX_SERVER configuration to $CONFIG
cat >> "$CONFIG" <<HEREEND
# IP Config written in stage31
SLX_PXE_CLIENT_IP='$ip'
SLX_PXE_SERVER_IP='$SERVERIP'
SLX_PXE_GATEWAY='$router'
SLX_PXE_DNS='$dns'
SLX_PXE_MAC='$MAC'
HEREEND
return 0
}
install_config_tgz() {
[ ! -e "${CONFIG}.tgz" ] && { echo "Cannot install config.tgz. '${CONFIG}.tgz' does not exist."; return 1; }
# setup hardware clock
. "${CONFIG}"
if [ "x$SLX_BIOS_CLOCK" == "xlocal" ]; then
hwclock -s -l
elif [ "x$SLX_BIOS_CLOCK" == "xutc" ]; then
hwclock -s -u
fi
local TEMP_EXTRACT_DIR="/tmp/config.tgz.tmp"
# TODO perserve existing directories permissions (but overwrite the permissions of files!)
mkdir -p "${TEMP_EXTRACT_DIR}"
tar xf "${CONFIG}.tgz" -C "${TEMP_EXTRACT_DIR}" || { echo "Could not untar ${CONFIG}.tgz to ${TEMP_EXTRACT_DIR}"; return 1; }
# Write list to stage32 for debug
tar tvf "${CONFIG}.tgz" > "${FUTURE_ROOT}/opt/openslx/config.tgz.list" 2>&1
chown -R 0:0 "${TEMP_EXTRACT_DIR}" 2>/dev/null
cd "${TEMP_EXTRACT_DIR}"
# first we look for local config.tgz files, which we merge with the common
# config.tgz files
if [ -n "${SLX_LOCAL_CONFIG}" ]; then
local MOD
for MOD in ${SLX_LOCAL_CONFIG}; do
local LOCAL_CONFIG_DIR="openslx-configs/${MOD}"
if [ -d "${LOCAL_CONFIG_DIR}" ]; then
tarcopy "${LOCAL_CONFIG_DIR}" "${TEMP_EXTRACT_DIR}"
echo "Merged local configuration files for '${MOD}'"
fi
done
fi
# purge openslx-configs/*
rm -rf -- "openslx-configs/"
# now just tarcopy them to future root
tarcopy "${TEMP_EXTRACT_DIR}" "${FUTURE_ROOT}"
# cleanup the downloaded stuff
cd /
rm -rf -- "${TEMP_EXTRACT_DIR}"
[ $DEBUG -eq 0 ] && rm -f -- "${CONFIG}.tgz"
# Display branding logo if splash screen is shown
[ "x${MUTED_OUTPUT}" = "x1" ] && [ -e "${FUTURE_ROOT}/etc/branding.ppm" ] && fbsplash -s "${FUTURE_ROOT}/etc/branding.ppm" &
return 0
}
#########################################################################
#
# MAIN PART
#
# Determine machine uuid, save for later
get-uuid
if [ -e "/run/system-uuid" ]; then
UUID=$(cat "/run/system-uuid")
if [ -n "$UUID" ]; then
UUID_URL="?uuid=$UUID"
fi
cp "/run/system-uuid" "${FUTURE_ROOT}/etc/system-uuid"
fi
# Set up /opt/openslx/config
fetch_text_config || drop_shell "Could not download remote config"
if ! ash -n "${CONFIG}-remote"; then
echo -e "\n\tFATAL: Could not download configuration!"
echo -e "\tAborting boot since the system would be in an unusable state."
echo -en "\tRebooting in 60 seconds"
timeout=60
while [ $(( timeout-- )) -gt 0 ]; do
echo -n "."
sleep 1
done
echo b > /proc/sysrq-trigger
fi
. "${CONFIG}-remote" || drop_shell "Could not source remote config"
merge_text_config || drop_shell "Could not update text based config"
# Fetch config.tgz if desired
if [ -z "$SLX_NO_CONFIG_TGZ" ]; then
fetch_config_tgz || drop_shell "Could not download config.tgz"
install_config_tgz || drop_shell "Could not extract config.tgz"
fi
# Change systemd target if desired
if [ -n "$SLX_SYSTEMD_TARGET" ]; then
SLX_SYSTEMD_TARGET="${SLX_SYSTEMD_TARGET%.target}.target"
for dir in etc lib usr/lib; do
mkdir -p "${FUTURE_ROOT}/${dir}/systemd/system"
ln -sf "$SLX_SYSTEMD_TARGET" "${FUTURE_ROOT}/${dir}/systemd/system/default.target"
done
fi
# Activate jumbo frames if requested
(
. /run/network.conf
[ -n "$IFACE" ] && [ "x$SLX_JUMBO_FRAMES" = "xyes" ] && ip link set dev "$IFACE" mtu 9000
)
true
|