summaryrefslogtreecommitdiffstats
path: root/core/rootfs/rootfs-stage31/data/inc/activate_sysconfig
blob: b4bb5b656484849ad0397ff9cbfd33a3297c4c57 (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
153
154
155
156
157
158
159
160
161
162
163
#!/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 SERVER IP 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'
SLX_SPLASH='$MUTED_OUTPUT'
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}"
	# Recent versions of busybox tar bail out if two symlinks with the same name exist in archive
	if ! tar xf "${CONFIG}.tgz" -C "${TEMP_EXTRACT_DIR}" 2> /tmp/tarpit; then
		# Exit code is unclean...
		if ! [ -s /tmp/tarpit ] || grep -q -v 'create symlink' /tmp/tarpit; then
			# ...and we have en empty error log, OR any error that isn't "can't create symlink" -> abort
			echo "Could not untar ${CONFIG}.tgz to ${TEMP_EXTRACT_DIR}"
			return 1
		fi
	fi
	# 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

run_hooks post-config-tgz

# Activate jumbo frames if requested
(
	. /run/network.conf
	[ -n "$IFACE" ] && [ "x$SLX_JUMBO_FRAMES" = "xyes" ] && ip link set dev "$IFACE" mtu 9000
)

true