diff options
Diffstat (limited to 'debian/mdadm.config')
-rw-r--r-- | debian/mdadm.config | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/debian/mdadm.config b/debian/mdadm.config new file mode 100644 index 00000000..97352662 --- /dev/null +++ b/debian/mdadm.config @@ -0,0 +1,174 @@ +#!/bin/sh +# Copyright © 2001-2004 Mario Jou/3en <joussen@debian.org> +# Copyright © martin f. krafft <madduck@debian.org> +# 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 |