summaryrefslogtreecommitdiff
path: root/scripts/build/chroot_hooks
blob: 4e3702b14c5a7e231ddea62651cec5c3993017e9 (plain)
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
#!/bin/sh

## live-build(7) - System Build Scripts
## Copyright (C) 2016-2020 The Debian Live team
## Copyright (C) 2006-2015 Daniel Baumann <mail@daniel-baumann.ch>
##
## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
## This is free software, and you are welcome to redistribute it
## under certain conditions; see COPYING for details.


set -e

# Including common functions
[ -e "${LIVE_BUILD}/scripts/build.sh" ] && . "${LIVE_BUILD}/scripts/build.sh" || . /usr/lib/live/build.sh

# Setting static variables
DESCRIPTION="Execute hooks in chroot"
USAGE="${PROGRAM} [--force]"

# Processing arguments and configuration files
Init_config_data "${@}"

Echo_message "Begin executing hooks..."

# Requiring stage file
Require_stagefiles config bootstrap

# Checking stage file
Check_stagefile

# Acquire lock file
Acquire_lockfile

## Processing distribution hooks

# Make build config available to chroot hooks. First, make the bind
# mount and then make it read-only. This can't happen in one mount
# command, then the resulting mount will be rw (see mount(8)). Making it
# ro prevents modifications and prevents accidentally removing the
# contents of the config directory when removing the chroot.
mkdir -p chroot/live-build/config
mount -o bind config chroot/live-build/config
mount -o remount,ro,bind config chroot/live-build/config

# Copying hooks
mkdir -p chroot/root/lb_chroot_hooks
for _HOOK in ${LB_CHROOT_HOOKS}
do
	for LOCATION in "${LIVE_BUILD}/hooks" /usr/share/live/build/hooks
	do
		for FILE in "${LOCATION}"/????-"${_HOOK}".chroot
		do
			if [ -e "${FILE}" ]
			then
				cp "${FILE}" chroot/root/lb_chroot_hooks
			fi
		done
	done
done

# Running hooks
if ls chroot/root/lb_chroot_hooks/* > /dev/null 2>&1
then
	for _HOOK in chroot/root/lb_chroot_hooks/*
	do
		Chroot chroot "/root/lb_chroot_hooks/$(basename ${_HOOK})" || { Echo_error "${_HOOK} failed (exit non-zero). You should check for errors."; exit 1 ;}
		rm -f chroot/root/lb_chroot_hooks/"$(basename ${_HOOK})"
	done
fi
rmdir chroot/root/lb_chroot_hooks
rmdir --ignore-fail-on-non-empty chroot/root

## Processing local hooks
if ls config/hooks/normal/*.chroot > /dev/null 2>&1 && (
   ls config/hooks/live/*.chroot > /dev/null 2>&1 ||
   ls config/hooks/live/*.container > /dev/null 2>&1 )
then
	# If a systemd-nspawn hook exists check if package is installed
	if ls config/hooks/live/*.container > /dev/null 2>&1
	then
		Check_package host /usr/bin/systemd-nspawn systemd-container
	fi

	# Restoring cache
	Restore_package_cache chroot

	for HOOK in config/hooks/normal/*.chroot config/hooks/live/*.chroot config/hooks/live/*.container
	do
		if [ ! -e "${HOOK}" ]
		then
			continue
		fi

		# Copying hook
		cp "${HOOK}" chroot/root

		# Making hook executable
		if [ ! -x chroot/root/"$(basename ${HOOK})" ]
		then
			chmod +x chroot/root/"$(basename ${HOOK})"
		fi

		# Executing hook
		Echo_message "Executing hook ${HOOK}..."
		case "${HOOK}" in
			*.container)
				umount chroot/proc
				systemd-nspawn --capability=all -D chroot "/root/$(basename ${HOOK})" || { Echo_error "${HOOK} failed (exit non-zero). You should check for errors."; exit 1 ;}
				mount proc-live -t proc chroot/proc
				;;
			*)
				Chroot chroot "/root/$(basename ${HOOK})" || { Echo_error "${HOOK} failed (exit non-zero). You should check for errors."; exit 1 ;}
				;;
		esac

		# Removing hook
		rm -f chroot/root/"$(basename ${HOOK})"
	done

	# Saving cache
	Save_package_cache chroot
fi

# Remove bind mount of build config inside chroot.
umount chroot/live-build/config
rmdir chroot/live-build/config
rmdir chroot/live-build

# Creating stage file
Create_stagefile