summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@cryptonomic.net>2021-03-02 16:50:47 -0500
committerAndrew Cady <d@cryptonomic.net>2021-03-02 16:50:47 -0500
commitbb57e8ef3e5b76bf5ab68fcf1348ce51f0baa617 (patch)
treecc61289a33b1506e44790d8c14b54fc54459a9b3
parent8133d01b282c570260c5026a0e034325ae816998 (diff)
simplify samizdat-eject.sh
-rwxr-xr-xsrc/initrd/samizdat-eject.sh102
1 files changed, 2 insertions, 100 deletions
diff --git a/src/initrd/samizdat-eject.sh b/src/initrd/samizdat-eject.sh
index a950ec5..fcb808d 100755
--- a/src/initrd/samizdat-eject.sh
+++ b/src/initrd/samizdat-eject.sh
@@ -1,102 +1,4 @@
1#!/bin/sh 1#!/bin/sh
2die() 2[ "$(id -u)" = 0 ] || exec sudo $0 "$@"
3{
4 printf '%s\n' "$*" >&2
5 exit 1
6}
7 3
8btrfs_subdevices() 4btrfs device remove 1 2 /
9{
10 local mountpoint="$1"
11 btrfs filesystem show "$mountpoint" | sed -ne 's/^[ \t]*devid.* path //p'
12}
13
14btrfs_subdevice_count()
15{
16 btrfs_subdevices "$1" | wc -l
17}
18
19remove()
20{
21 for dev; do
22 (set -x; btrfs device remove "$dev" /)
23 dmsetup remove "$dev" 2>/dev/null
24 losetup -D
25 done
26}
27
28dm_name()
29{
30 dmsetup info "$1" | sed -ne 's/^Name: *//p'
31}
32
33md_ready()
34{
35 local mountpoint="$1" count dev
36 count=$(mdadm_subdevices /dev/md55|wc -l)
37 [ "$count" = 1 ] || return
38 dev=$(mdadm_subdevices /dev/md55)
39 [ "$(dm_name "$dev")" = samizdatiso ]
40}
41
42copy()
43{
44 temp_target=$(mktemp --tmpdir=/outerfs)
45 mdadm_copy_eject_crypt /dev/md55 "$temp_target"
46}
47
48. mdadm-dup.sh || exit 1
49
50target=$1
51
52if [ ! "$target" ] && mountpoint -q /srv && [ ! -e /srv/samizdat.iso ]; then
53 target=/srv/samizdat.iso
54fi
55
56[ "$target" ] || die "Usage: $0 <target filename>"
57[ ! -e "$target" ] || die "Error: file exists: $target"
58
59if ! mountpoint -q /outerfs; then
60 die "Error: /outerfs is not a mountpoint. Please mount a safe filesystem to temporarily store the ISO on /outerfs"
61fi
62
63devices=$(btrfs_subdevices /) || exit 1
64
65set --
66seen=
67for dev in $devices; do
68 [ -b "$dev" ] || exit 1
69 case "$dev" in
70 /dev/mapper/loop*) set -- "$@" "$dev" ;;
71 /dev/mapper/samizdatcrypt) seen=y ;;
72 esac
73done
74[ "$seen" ] || set -- # avoid messing up someone's btrfs!
75
76
77
78
79
80
81if ! md_ready; then
82 copy &
83fi
84
85remove "$@"
86
87echo 'Waiting while boot medium is freed...' >&2
88wait
89
90notified=
91while true; do
92 if [ "$(btrfs_subdevice_count /)" = 1 ] && md_ready; then
93 if [ -z "$notified" ]; then
94 echo 'Boot medium is free. It may be ejected now.' >&2
95 notified=y
96 fi
97 mdadm_copy_eject /dev/md55 "$target".part &&
98 mv "$target".part "$target"
99 exit
100 fi
101 sleep 5
102done