mdadm: extend uci config support
[openwrt/staging/lynxis/omap.git] / package / utils / mdadm / files / mdadm.init
index 9da4684fb1ce5fe7d9214b9a18e2e4007ea24a2d..e6624a776ed0f5d34bd09a85c499237159b56166 100644 (file)
@@ -7,24 +7,84 @@ USE_PROCD=1
 PROG=/sbin/mdadm
 NAME=mdadm
 
-mdadm_email() {
+CONF="/var/etc/mdadm.conf"
+
+append_list_item() {
+       append "$2" "$1" "$3"
+}
+
+append_option() {
+       local var="$1"
+       local cfg="$2"
+       local opt="$3"
+       local name="$4"
+       local sep="$5"
+       local str
+
+       if [ -n "$sep" ]; then
+               config_list_foreach "$cfg" "$opt" append_list_item str "$sep"
+       else
+               config_get str "$cfg" "$opt"
+       fi
+
+       [ -n "$str" ] && append "$var" $(printf "%s=%s" "${name:-${opt//_/-}}" "$str")
+}
+
+mdadm_common() {
+       local cfg="$1"
+       local email devices
+
+       if [ -x /sbin/sendmail ]; then
+               append_option email "$cfg" email "MAILADDR"
+
+       fi
+
+       append_option devices "$cfg" devices DEVICE " "
+
+       printf "%s\n%s\n" "$email" "$devices" >> $CONF
+}
+
+mdadm_array() {
        local cfg="$1"
-       if [ ! -x /sbin/sendmail ]; then
+       local uuid device devices name array
+
+       config_get uuid "$cfg" uuid
+       config_get name "$cfg" name
+       config_get device "$cfg" device
+
+       if [ -z "$device" ] || [ -z "$uuid$name" ]; then
+               echo "Skipping array without device, uuid or name" >&2
                return
        fi
-       config_get email "$cfg" email
+
+       [ -n "$uuid" ] && append array "uuid=$uuid"
+       [ -n "$name" ] && append array "name=$name"
+
+       append_option array "$cfg" super_minor
+       append_option array "$cfg" spares
+       append_option array "$cfg" spare_group
+       append_option array "$cfg" bitmap
+       append_option array "$cfg" container
+       append_option array "$cfg" member
+       append_option array "$cfg" devices devices ","
+
+       printf "ARRAY %s %s\n" "$device" "$array" >> $CONF
 }
 
 start_service() {
        local email
 
+       mkdir -p "${CONF%/*}"
+       printf "# Autogenerated from /etc/config/mdadm, do not edit!\n" > $CONF
+
        config_load mdadm
-       config_foreach mdadm_email mdadm
+       config_foreach mdadm_common mdadm
+       config_foreach mdadm_array array
 
-       $PROG --assemble --scan
+       $PROG --assemble --scan --config="$CONF"
 
        procd_open_instance
-       procd_set_param command "$PROG" --monitor ${email:+--mail=$email} --syslog --scan
+       procd_set_param command "$PROG" --monitor --syslog --scan --config="$CONF"
        procd_close_instance
 }