#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in # get pre-requisites prereqs) prereqs exit 0 ;; esac # Nothing to do if ROOTFSTYPE is set to something other than bcachefs if [ -n "$ROOTFSTYPE" -a "$ROOTFSTYPE" != bcachefs ]; then exit 0 fi # source for resolve_device() and panic() functions . /scripts/functions # # Helper functions # message() { if [ -x /bin/plymouth ] && plymouth --ping; then plymouth message --text="$*" else echo "$*" >&2 fi } panic2() { # Send the panic message to plymouth if [ -x /bin/plymouth ] && plymouth --ping; then plymouth message --text="$*" fi panic "$@" exit 1 } unlock() { local msg=$1 shift if [ -x /bin/plymouth ] && plymouth --ping; then msg=$(plymouth ask-for-password --prompt="$msg" | \ bcachefs unlock "$@" 2>&1) # If the unlock failed, send any printed messages to plymouth if [ $? -ne 0 ]; then plymouth message --text="Bcachefs: $msg" return 1 fi else # If unlock() is called multiple times, don't re-print the prompt message # unless it has changed if [ "$LAST_UNLOCK_MSG" != "$msg" ]; then echo "$msg" >&2 LAST_UNLOCK_MSG=$msg fi bcachefs unlock "$@" fi } # Resolve the root device (e.g. if root is specified by UUID) DEV=$(resolve_device "$ROOT") # Check if the root device needs unlocking: if bcachefs unlock -c $DEV >/dev/null 2>&1; then if [ "$DEV" == "$ROOT" ]; then msg="Please unlock $DEV:" else msg="Please unlock $DEV ($ROOT):" fi count=0 tries=3 while [ $tries -le 0 -o $count -lt $tries ]; do if unlock "$msg" "$DEV"; then message "Bcachefs: $DEV successfully unlocked" break fi let count++ done if [ $tries -gt 0 -a $count -ge $tries ]; then panic2 "Bcachefs: maximum number of tries exceeded for $DEV" fi fi exit 0