summaryrefslogtreecommitdiffstats
path: root/builder/modules.d/slx-addons/scripts/setup-addons.sh
blob: 94c2c4443407e01e83b2ddfb4fec46593d6a2027 (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
#!/usr/bin/env bash
#
# Stage4 addons setup script
#
###############################################################################
# Support stage4 addons residing under '/opt/openslx/addons'.
# This script will loop over all addons found, in the form of
# directories containing directory structures relative to '/'
#
# Additionally addons are expected to provide:
# * <addon_dir>/addon-required -> script to check whether the
#   addon should be installed (exit 0) or not (exit 1).
#
# * <addon_dir>/opt/openslx/etc/<addon_name>.whiteout -> list of files
#   that were removed during the addon installation and thus need to be
#   removed after the addon was installed.
#
# * <addon_dir>/opt/openslx/etc/<addon_name> ld.so.cache -> ld cache containing
#   the newly installed libraries. CAVE: multiple addons -> ld cache combination
#
### CURRENTLY NOT EXECUTED
# * <addon_dir>/addon-init -> script that will be automatically
#   be executed after the addon was installed.
#   NOTE: question remains if this should be done within stage3
#         or by chroot'ing into the stage4 before executing it.
### CURRENTLY NOT EXECUTED: Since whiteouts could be handled for _all_addons

type emergency_shell >/dev/null 2>&1 || . /lib/dracut-lib.sh

# Check if we even have any addons to process
if [ ! -d "$NEWROOT/opt/openslx/addons" ]; then
	info "No stage4 addons found."
	return 0
fi

setup_addons() {
	local ADDONS_DIR="$NEWROOT/opt/openslx/addons/"
	cd "$ADDONS_DIR" || return 1
	for ADDON in *; do
		if ! setup_addon "$ADDON"; then
			info "Failed to setup $ADDON"
		fi
	done
}

setup_addon() {
	[ -z "$1" -o ! -d "$ADDONS_DIR/$1" ] && return 1
	local ADDON="$1"
	cd "$ADDONS_DIR/$ADDON" || return 1

	if ! bash addon-required 2>&1 ; then
		info "'$ADDONS_DIR/$ADDON/addon-required' missing or returned non-zero, skipping..."
		return 1
	fi

	for entry in $(find * -not -wholename "addon-*" 2>/dev/null); do
		if [ -d "$entry" ]; then
			[ -d "/$entry" ] || mkdir -p "/${entry}"
			continue
		fi
		local dir=${entry%/*}
		[ -d "$NEWROOT/$dir" ] || mkdir -p "$NEWROOT/$dir"
		if [ -f "$entry" -a ! -L "$entry" ]; then
			if [ ! -e "$NEWROOT/${entry}" ] || ! diff -q "$entry" "$NEWROOT/${entry}"; then
				mv -f -- "$entry" "$NEWROOT/${entry}"
			fi
		else
			# either block dev, char dev or a symlink, just overwrite them "blindly"
			mv -f -- "$entry" "$NEWROOT/${entry}"
		fi
	done

	# post merge: remove whiteouts from filesystem
	for WHITEOUT in "$NEWROOT/opt/openslx/etc/"*.whiteout; do
		[ -e "$WHITEOUT" ] || continue
		while read line; do
			rm -f "${NEWROOT}/${line}"
		done < "$WHITEOUT"
	done

	# finally update ld.so.cache expected to be under /opt/openslx/etc/<addon_name>.ld.so.cache
	# NOTE: if we have more than one addon in the future, we need to be extra
 	# careful with prebuilt ld.caches since they need to match *ALL* addons
	local ADDON_LD_CACHE="$NEWROOT/opt/openslx/etc/$ADDON.ld.so.cache"
	if [ ! -e "$ADDON_LD_CACHE" ] || ! mv -f -- "$ADDON_LD_CACHE" "$NEWROOT/etc/ld.so.cache" ; then
		# Using prebuilt ld cache failed, try hard to find a ldconfig...
		for LDCONFIG in "$(type -p ldconfig 2>/dev/null)" "${NEWROOT}/sbin/ldconfig.real"; do
			if [ -x "$LDCONFIG" ] && "$LDCONFIG" -r "$NEWROOT"; then
				return 0
			fi
		done
		# try with chroot if we have it
		local CHROOT_PATH="$(type -p chroot 2>/dev/null)"
		if [ -x "$CHROOT_PATH" ] && "$CHROOT_PATH" "$NEWROOT" ldconfig; then
			return 0
		fi
		# very bad indeed, libraries won't be registered in the cache ...
		warn "Failed to find 'ldconfig' to rebuild the addon's missing ld.so.cache..."
		return 1
	fi
}

if ! setup_addons; then
	warn "Failed to fully setup some addons! They will likely malfunction..."
fi