summaryrefslogtreecommitdiff
path: root/debian/mdadm.config
blob: 85745a347571164a90b5fd190d9196da710c0d72 (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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#!/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
  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

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
                md5sum $CONFIG > /var/lib/mdadm/CONF-UNCHECKED
                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