aboutsummaryrefslogtreecommitdiff
path: root/rc.lib
diff options
context:
space:
mode:
Diffstat (limited to 'rc.lib')
-rw-r--r--rc.lib43
1 files changed, 43 insertions, 0 deletions
diff --git a/rc.lib b/rc.lib
index 121cc93..381057c 100644
--- a/rc.lib
+++ b/rc.lib
@@ -25,3 +25,46 @@ emergency_shell() {
/bin/sh -l
}
+
+parse_crypttab() {
+ # This is a pure shell crypttab parser which supports
+ # a subset of the format.
+
+ # Function by Dylan Araps
+ exec 3<&0
+
+ # shellcheck disable=2086
+ while read -r name dev pass opts err; do
+ # Skip comments.
+ [ "${name##\#*}" ] || continue
+
+ # Break on invalid crypttab (> 5 columns).
+ [ "$err" ] && break
+
+ # Turn 'UUID=*' lines into device names.
+ [ "${dev##UUID*}" ] || dev=$(blkid -l -o device -t "$dev")
+
+ # Parse options by turning the list into a pseudo array.
+ { old_ifs=$IFS; IFS=,; set -f; set +f -- $opts; IFS=$old_ifs; }
+
+ # Create an argument list (no other way to do this in sh).
+ for opt; do case $opt in
+ discard) copts="$copts --allow-discards" ;;
+ readonly|read-only) copts="$copts -r" ;;
+ tries=*) copts="$copts -T ${opt##*=}" ;;
+ esac; done
+
+ # If password is 'none', '-' or empty ask for it.
+ case $pass in
+ none|-|"") cryptsetup luksOpen $copts "$dev" "$name" <&3 ;;
+ *) cryptsetup luksOpen $copts -d "$pass" "$dev" "$name" ;;
+ esac
+ done < /etc/crypttab
+
+ exec 3>&-
+
+ [ "$copts" ] && [ -x /bin/vgchange ] && {
+ out "Activating LVM devices for dm-crypt..."
+ vgchange --sysinit -a y || emergency_shell
+ }
+}