thelpers - libdevuansdk - common library for devuan's simple distro kits
HTML git clone https://git.parazyd.org/libdevuansdk
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
thelpers (9425B)
---
1 #!/usr/bin/env zsh
2 # shellcheck shell=bash
3 # Copyright (c) 2016-2021 Ivan J. <parazyd@dyne.org>
4 # This file is part of libdevuansdk
5 #
6 # This source code is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This software is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this source code. If not, see <http://www.gnu.org/licenses/>.
18
19 build_arm_dist()
20 {
21 fn build_arm_dist
22 req=(workdir strapdir os arch size parted_type)
23 case "$parted_type" in
24 gpt) req+=(gpt_boot gpt_root) ;;
25 dos) req+=(dos_boot dos_root) ;;
26 *) die "Unknown parted_type: $parted_type. Supported is gpt|dos."
27 zerr; return 1
28 ;;
29 esac
30 ckreq || return 1
31
32 notice "Building complete Arm image(s)"
33
34 bootstrap_complete_base || { zerr; return 1; }
35 blend_preinst || { zerr; return 1; }
36 image_prepare_raw || { zerr; return 1; }
37 image_connect_raw || { zerr; return 1; }
38 image_partition_${parted_type} || { zerr; return 1; }
39 image_format_partitions || { zerr; return 1; }
40 build_kernel_${arch} || { zerr; return 1; }
41 image_mount || { zerr; return 1; }
42 strapdir_to_image || { zerr; return 1; }
43 blend_postinst || { zerr; return 1; }
44 image_umount || { zerr; return 1; }
45 image_disconnect_raw || { zerr; return 1; }
46 image_pack_dist || { zerr; return 1; }
47 clean_strapdir || { zerr; return 1; }
48 }
49
50 build_iso_dist()
51 {
52 fn build_iso_dist
53 req=(workdir strapdir os arch)
54 ckreq || return 1
55
56 notice "Building complete iso image(s)"
57
58 bootstrap_complete_base || { zerr; return 1; }
59 blend_preinst || { zerr; return 1; }
60 iso_prepare_strap || { zerr; return 1; }
61 iso_setup_isolinux || { zerr; return 1; }
62 iso_write_isolinux_cfg || { zerr; return 1; }
63 blend_postinst || { zerr; return 1; }
64 iso_squash_strap || { zerr; return 1; }
65 iso_xorriso_build || { zerr; return 1; }
66 }
67
68 build_vm_dist()
69 {
70 fn build_vm_dist
71 req=(workdir strapdir os arch size imageformat parted_type)
72 case "$parted_type" in
73 gpt) req+=(gpt_boot gpt_root) ;;
74 dos) req+=(dos_boot dos_root) ;;
75 *) die "Unknown parted_type: $parted_type. Supported is gpt|dos."
76 zerr; return 1
77 ;;
78 esac
79 ckreq || return 1
80
81 notice "Building complete VM image(s)"
82
83 bootstrap_complete_base || { zerr; return 1; }
84 blend_preinst || { zerr; return 1; }
85 image_prepare_raw || { zerr; return 1; }
86 image_connect_raw || { zerr; return 1; }
87 image_partition_${parted_type} || { zerr; return 1; }
88 image_format_partitions || { zerr; return 1; }
89 image_mount || { zerr; return 1; }
90 vm_inject_overrides || { zerr; return 1; }
91 strapdir_to_image || { zerr; return 1; }
92 vm_setup_grub || { zerr; return 1; }
93 blend_postinst || { zerr; return 1; }
94 image_umount || { zerr; return 1; }
95 image_disconnect_raw || { zerr; return 1; }
96 if [[ "$imageformat" = qcow2 ]]; then
97 image_raw_to_qcow2 || { zerr; return 1; }
98 fi
99 image_raw_to_vdi || { zerr; return 1; }
100 vm_pack_dist || { zerr; return 1; }
101 clean_strapdir || { zerr; return 1; }
102 }
103
104 clean_strapdir()
105 {
106 fn clean_strapdir
107 req=(strapdir)
108 ckreq || return 1
109
110 if [[ "$DEBUG" = 1 ]]; then
111 return
112 fi
113
114 notice "Cleaning strapdir"
115
116 # Danger Will Robinson
117 # Check for (bind) mounts as sudo rm -rf will trash the host
118 for m in sys proc dev; do
119 if [[ $(mountpoint -q "${strapdir}/$m") ]]; then
120 zerr
121 return 1
122 fi
123 done
124 sudo rm -rf "$strapdir"
125 }
126
127 devprocsys()
128 {
129 fn devprocsys "$*"
130 local watdo="$1"
131 local werdo="$2"
132 req=(watdo werdo)
133 ckreq || return 1
134
135 if [[ $watdo = mount ]]; then
136 sudo mount -t proc proc,ro $werdo/proc && act "mounted proc" && \
137 sudo mount -o bind /sys $werdo/sys && \
138 sudo mount -o remount,bind,ro /sys $werdo/sys && act "mounted sys" && \
139 sudo mount -o bind /dev $werdo/dev && \
140 sudo mount -o remount,bind,ro /dev $werdo/dev && act "mounted dev" && \
141 sudo mount -o bind /dev/pts $werdo/dev/pts && \
142 sudo mount -o remount,bind,ro /dev/pts $werdo/dev/pts && act "mounted devpts" && \
143 return 0
144 elif [[ $watdo = umount ]]; then
145 sudo umount $werdo/dev/pts && act "umounted devpts"
146 sudo umount $werdo/dev && act "umounted dev"
147 sudo umount $werdo/proc && act "umounted proc"
148 sudo umount $werdo/sys && act "umounted sys"
149 return 0
150 fi
151 zerr; return 1
152 }
153
154 dpkgdivert()
155 {
156 fn dpkgdivert "$@"
157 req=(watdo werdo)
158 local watdo="$1"
159 local werdo="$2"
160 ckreq || return 1
161
162 if [[ $watdo = on ]]; then
163 cat <<EOF | sudo tee ${werdo}/dpkgdivert >/dev/null
164 #!/bin/sh
165 dpkg-divert --add --local \
166 --divert /usr/sbin/invoke-rc.d.chroot \
167 --rename /usr/sbin/invoke-rc.d
168 cp /bin/true /usr/sbin/invoke-rc.d
169 echo -e "#!/bin/sh\nexit 101" > /usr/sbin/policy-rc.d
170 chmod +x /usr/sbin/policy-rc.d
171 EOF
172 elif [[ $watdo = off ]]; then
173 cat <<EOF | sudo tee ${werdo}/dpkgdivert >/dev/null
174 #!/bin/sh
175 rm -f /usr/sbin/policy-rc.d
176 rm -f /usr/sbin/invoke-rc.d
177 dpkg-divert --remove --rename /usr/sbin/invoke-rc.d
178 EOF
179 fi
180
181 # NOTE: tread carefully, potential for recursive calling
182 chroot-script "$werdo/dpkgdivert" || { zerr; return 1; }
183 }
184
185 chroot-script()
186 {
187 fn chroot-script "$*"
188 req=(R workdir strapdir)
189 ckreq || return 1
190
191 mkdir -p "$R/log"
192
193 local _divert=""
194 local _path=""
195 local _script=""
196
197 case "x$1" in
198 x-d)
199 _divert=1
200 shift
201 ;;
202 esac
203
204 if [[ "$(dirname "$1")" = "." ]]; then
205 _path="$strapdir"
206 else
207 _path="$(dirname "$1")"
208 fi
209
210 _script="$(basename "$1")"
211
212 if [[ -n "$_divert" ]]; then
213 # NOTE: tread carefully, potential for recursive calling
214 devprocsys mount "$_path" || { zerr; return 1; }
215 dpkgdivert on "$_path" || { zerr; return 1; }
216 fi
217
218 sudo sed -i "$_path/$_script" \
219 -e 's@^#!/bin/sh@&\nexport DEBIAN_FRONTEND=noninteractive@' \
220 -e 's@^#!/bin/sh@&\nexport SOURCE_DATE_EPOCH=1610550434@' \
221 -e 's@^#!/bin/sh@&\nexport LC_ALL=C@' \
222 -e 's@^#!/bin/sh@&\nexport LANG=C@' \
223 -e 's@^#!/bin/sh@&\nset -x ; exec 2>/'$_script'.log@'
224
225 notice "Chrooting to execute '$_script' ..."
226 sudo chmod +x "$_path/$_script" || { zerr; return 1; }
227 sudo chroot "$_path" "/$_script" || { zerr; return 1; }
228 sudo mv -f "$_path/${_script}.log" "$R/log/"
229 # Some dpkg Debian scripts now expect "/tmp/user/0"
230 sudo mkdir -p "${_path}/tmp/user/0"
231 sudo chmod 0700 "${_path}/tmp/user/0"
232 sudo chmod 0600 "${_path}/tmp/user"
233 sudo chmod 1777 "${_path}/tmp"
234
235 if [[ -n "$_divert" ]]; then
236 # NOTE: tread carefully, potential for recursive calling
237 dpkgdivert off "$_path" || { zerr; return 1; }
238 devprocsys umount "$_path" || { zerr; return 1; }
239 fi
240
241 sudo rm -rf "$_path/tmp/user"
242 sudo rm -f "$_path/$_script"
243 }
244
245 findloopdev()
246 {
247 fn findloopdev
248 req=(workdir image_name)
249 ckreq || return 1
250
251 local _l="$(sudo losetup -f --show "$workdir/${image_name}.img")"
252 if [[ -z "$_l" ]]; then
253 zerr; return 1
254 fi
255
256 echo "$_l"
257 }
258
259 findnbddev()
260 {
261 fn findnbddev
262
263 notice "Finding a free /dev/nbd device"
264
265 for i in $(seq 0 8); do
266 grep -q "^/dev/nbd${i}" /proc/mounts || {
267 echo "/dev/nbd${i}"
268 return
269 }
270 done
271
272 zerr; return 1
273 }
274
275 silly()
276 {
277 fn silly "$@"
278 local arg1="$1"
279 local arg2="$2"
280 # Cheers Mailpile!
281 funneh=(
282 "do not think of purple hippos"
283 "increasing entropy & scrambling bits"
284 "indexing kittens..."
285 "patching bugs..."
286 "spinning violently around the y-axis"
287 "warming up particle accelerator"
288 "this server is powered by a lemon and two electrodes"
289 "becoming self-aware"
290 "BCC-ing ALL THE SPIES!"
291 "all of your config settings & passwords are encrypted with AES256"
292 "the most common password is 123456, hopefully yours is different"
293 "good things come to those who wait"
294 "Make Free Software and be happy"
295 "We like volcanos, do you like volcanos?"
296 "Crossing out swear words..."
297 "Informing David Cameron of suspicious ac^H^H^H ... naaah :)"
298 "Abandon all hope, ye who enter here"
299 "Compiling bullshit bingo grid..."
300 "Estimating chance of asteroid hitting Earth"
301 "Applying coupons..."
302 "Backing up the entire Internet..."
303 "Making you wait for no reason"
304 "Doing nothing"
305 "Pay no attention to the man behind the curtain"
306 "You are great just the way you are"
307 "Supplying monkeys with typewriters"
308 "Swapping time and space"
309 "Self potato"
310 "God is porco"
311 "A million hamsters are spinning their wheels right now"
312 "Launching global internet Denial Of Service, googling 'Google'"
313 "These are not the Devs you are looking for"
314 "herding cats ..."
315 "Illegitimi Non Carborundum"
316 "GNU Terry Pratchett"
317 )
318 local rnd=$(shuf -i1-$#funneh -n 1)
319 act "${funneh[$rnd]}"
320 [[ $arg1 = sleep ]] && sleep $arg2 || true
321 }
322
323 blend_preinst()
324 {
325 fn blend_preinst "(noop)"
326 }
327
328 blend_postinst()
329 {
330 fn blend_postinst "(noop)"
331 }