summaryrefslogtreecommitdiff
path: root/debian/mdadm.config
blob: e33fcf535daf9b4c291779afc758a83bd4519539 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/bin/sh -eu
# 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.
#
# Revision: $Id$
#

set +u # workaround for #369953
. /usr/share/debconf/confmodule
set -u

CONFIG=/etc/mdadm/mdadm.conf
ALTCONFIG=/etc/mdadm.conf
[ ! -f $CONFIG ] && [ -f $ALTCONFIG ] && CONFIG=$ALTCONFIG 

DEBIANCONFIG=/etc/default/mdadm
DEBIANCONFIG_OLD=/etc/mdadm/debian.conf

if [ ! -e "$DEBIANCONFIG" ]; then
  if [ -e "$DEBIANCONFIG_OLD" ]; then
    DEBIANCONFIG="$DEBIANCONFIG_OLD"
  fi
fi

INITRDSTART=''

if [ -s $DEBIANCONFIG ] ; then
  AUTOSTART=true
  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

  # if $MAIL_TO from $DEBIANCONFIG is set, give it priority. This is because
  # it was used in the command line invocation of the mdadm monitor, and thus
  # overruled any existing setting in /etc/mdadm/mdadm.conf.
  # There's a slight chance of loss of a configuration setting (MAILADDR in
  # /etc/mdadm/mdadm.conf), but it's only an email address, and it is likely
  # unused anyway, thus we run the risk.
  [ -n "${MAIL_TO:-}" ] && MAILADDR="$MAIL_TO"

  [ -n "$AUTOSTART" ] && db_set mdadm/autostart "$AUTOSTART"
  [ -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

db_input high mdadm/warning || true
db_go

db_fget mdadm/initrdstart seen || true
if [ -z "$INITRDSTART" ] || [ "$RET $INITRDSTART" = "false all" ]; then
  ROOTRAIDDEV="$(df / | sed -rne 's,^(/dev/[^[:space:]]+).*,\1,p')"
  if ! mdadm --detail $ROOTRAIDDEV >/dev/null 2>&1; then
    # you are using some funky setup. Let's be save...
    # (could also happen during preconfigure, when no mdadm present)
    INITRDSTART=all
  else
    INITRDSTART="$ROOTRAIDDEV"
  fi
fi

[ -n "$INITRDSTART" ] && db_set mdadm/initrdstart "$INITRDSTART"

cnt=0
while true; do
  db_input low mdadm/initrdstart || true
  db_go

  db_get mdadm/initrdstart
  INITRDSTART="$(echo $RET | tr , ' ')"

  case "$INITRDSTART" in
    ''|none) INITRDSTART=none; break;;
    all) break;;

    *)
      ARRAYS=''
      ERROR=0
      for i in $INITRDSTART; do

        # standardise by prefixing /dev/
        i="/dev/${i#/dev/}"

        if [ ! -e "$i" ]; then
          echo "E: device node does not exist: $i" >&2
          ERROR=1; break
        fi

        if [ ! -b "$i" ]; then
          echo "E: not a block device: $i" >&2
          ERROR=1; break
        fi

        if ! mdadm --detail "$i" >/dev/null 2>&1; then
          echo "E: not a RAID array: $i" >&2
          ERROR=1; break
        fi
        
        # remove partition from name of partitionable devices
        i="${i%p[0-9]*}"

        # 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

      cnt=$((cnt + 1))
      if [ $cnt -eq 3 ]; then
        echo "W: unable to determine RAID arrays needed for boot." >&2
        echo "W: falling back to starting all of them..." >&2
        INITRDSTART=all
        break
      fi
      ;;
  esac
done

db_set mdadm/initrdstart "$INITRDSTART"

if [ "$INITRDSTART" != all ]; then
  db_input high mdadm/autostart || true
  db_go
fi

db_input medium mdadm/autocheck || true
db_go

db_input medium mdadm/start_daemon || true
db_go

db_get mdadm/start_daemon
if [ "$RET" = true ]; then
  db_input medium mdadm/mail_to || true
  db_go
fi