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
|