#!/bin/sh # Copyright © 2001-2004 Mario Jou/3en # Copyright © martin f. krafft # Distributable under the terms of the GNU GPL version 2. # . /usr/share/debconf/confmodule # see #369953 for ordering set -eu CONFIG=/etc/mdadm/mdadm.conf ALTCONFIG=/etc/mdadm.conf [ ! -f $CONFIG ] && [ -f $ALTCONFIG ] && CONFIG=$ALTCONFIG DEBIANCONFIG=/etc/default/mdadm db_get mdadm/initrdstart || : INITRDSTART="$RET" if [ -s $DEBIANCONFIG ] ; then AUTOCHECK=true START_DAEMON=true MAILADDR=root [ -f $DEBIANCONFIG ] && . $DEBIANCONFIG if [ -f $CONFIG ]; then MAILADDR=$(sed -rne 's/^MAILADDR[[:space:]]*([^[:space:]]+).*/\1/p' $CONFIG) fi [ -n "$AUTOCHECK" ] && db_set mdadm/autocheck "$AUTOCHECK" [ -n "$START_DAEMON" ] && db_set mdadm/start_daemon "$START_DAEMON" [ -n "$MAILADDR" ] && db_set mdadm/mail_to "$MAILADDR" fi chrooted() { test "$(stat -c "%d/%i" /)" != "$(stat -Lc "%d/%i" /proc/1/root 2>/dev/null)" } get_root_raiddev() { local rootraiddev; rootraiddev="$(df --portability / | sed -rne 's,^(/dev/[^[:space:]]+).*,\1,p')" if ! mdadm --detail $rootraiddev >/dev/null 2>&1; then return 1 fi echo ${rootraiddev%p[0-9]*} return 0 } get_initrdstart() { db_fget mdadm/initrdstart seen if chrooted || [ "$RET $INITRDSTART" = "false all" ]; then echo all return 1 fi get_root_raiddev || echo all } [ -z "$INITRDSTART" ] && INITRDSTART="$(get_initrdstart)" || : [ -n "$INITRDSTART" ] && db_set mdadm/initrdstart "$INITRDSTART" INITRDSTART_PRIORITY=high if chrooted; then INITRDSTART_PRIORITY=medium fi db_capb escape msg=intro; suffix=''; error=0 while true; do db_metaget mdadm/initrdstart_msg_${msg} extended_description || : db_subst mdadm/initrdstart msg "$(echo -n "${RET}${suffix}" | debconf-escape -e)" ret=0; db_input $INITRDSTART_PRIORITY mdadm/initrdstart || ret=$? db_go if [ $error -ne 0 ] && [ $ret -eq 30 ]; then # there was an error in a previous run of this loop, but the above question # was not asked, so we better exit the endless loop... echo "W: mdadm: unable to determine MD arrays needed for boot." >&2 echo "W: mdadm: falling back to starting all of them..." >&2 INITRDSTART=all break fi db_get mdadm/initrdstart INITRDSTART="$(echo $RET | tr , ' ')" case "$INITRDSTART" in ''|none) INITRDSTART=none; break;; all) break;; *) arrays='' for i in $INITRDSTART; do # standardise by prefixing /dev/ i="/dev/${i#/dev/}" # remove partition from partitionable array i="${i%p[0-9]*}" if [ ! -e "$i" ]; then error=1; msg=errexist; suffix=": $i"; break fi if [ ! -b "$i" ]; then t="$(readlink -nf "$i")" if [ ! -b "$t" ]; then suffix=": $t" else suffix=": $i" fi error=1; msg=errblock; break fi if ! mdadm --detail "$i" >/dev/null 2>&1; then error=1; msg=errmd; suffix=": $i"; break fi if [ -f $CONFIG ]; then if ! egrep -q "^(ARRAY)?[[:space:]]+$i([[:space:]]+|$)" $CONFIG; then t="$(readlink -nf "$i")" if [ -L "$i" ] \ && egrep -q "^(ARRAY)?[[:space:]]+$t([[:space:]]|$)+" $CONFIG; then i="$t" else db_set mdadm/initrdstart_notinconf false db_fset mdadm/initrdstart_notinconf seen false db_subst mdadm/initrdstart_notinconf array "$i" db_subst mdadm/initrdstart_notinconf config "$CONFIG" db_input high mdadm/initrdstart_notinconf || : db_go db_get mdadm/initrdstart_notinconf if [ "$RET" = true ]; then error=0 else db_fset mdadm/initrdstart seen false db_set mdadm/initrdstart all error=1; msg=errconf; suffix=": $i"; break fi fi fi fi # uniquely add device name echo $arrays | egrep -q "\b${i}\b" || arrays="${arrays:+$arrays }$i" done if [ $error -eq 0 ]; then INITRDSTART="$arrays" # exit the while true loop break fi ;; esac done db_set mdadm/initrdstart "$INITRDSTART" if [ "$INITRDSTART" != all ]; then db_input high mdadm/autostart || : db_go fi db_input medium mdadm/autocheck || : db_go db_input medium mdadm/start_daemon || : db_go db_get mdadm/start_daemon || : if [ "$RET" = true ]; then db_input medium mdadm/mail_to || : db_go fi