#!/bin/bash
#
#%stage: softraid
#
mdblockdev=

# Full mdadm.conf generated by mdadm.
# Contains all created MD RAIDs
mdadm_conf=

cont_list=
md_devs=

declare -A md_conf
# blockdev contains real devices (/dev/X) for root, resume, journal, dumb
for bd in $blockdev ; do
    is_part_dev=false
    case $bd in
	/dev/md[_0-9]*p[0-9]* )
	    # Partitionable MD RAID. This is partition on RAID. Get the RAID
	    bd=${bd%%p[0-9]*}
	    is_part_dev=true
	    ;;
	/dev/md[0-9_]*)
	    ;;
	*)
	    mdblockdev="$mdblockdev $bd"
	    continue
	    ;;
    esac
    # Check if this device is already added (possible for partitionable).
    md_dev=`mdadm -D --export $bd | sed -n -e 's/^MD_DEVNAME=//p'`
    if [ -z "$md_dev" ]; then
        md_dev=${bd##/dev/}
    else
	bd="/dev/md/$md_dev"
    fi
    dup_found=false
    for dup in $md_devs; do
	if [ x"$dup" = x"$md_dev" ]; then
	    dup_found=true
	    break
	fi
    done
    if $dup_found; then
	if ! $is_part_dev; then
	    echo "setup-md.sh: $md_dev found multiple times" >&2
	fi
        continue
    fi
    mdconf=$(mdadm -Db "$bd")
    if test -z "$mdconf"; then
        mdblockdev="$mdblockdev $bd"
        continue
    fi
    md_tmpblockdev=$(mdadm -Dbv $bd | sed -n "1D;s/,/ /g;s/^ *devices=//p")
    mdblockdev="$mdblockdev $md_tmpblockdev"
    md_devs="$md_devs $md_dev"
    container=$(echo "$mdconf" | sed -rn 's/.* container=([^ ]*) .*/\1/p')
    for cnt in $cont_list; do
        if [ x"$container" = x"$cnt" ]; then
            container=
            break
        fi
    done
    case "$container" in
    "")
        ;;
    /dev/*)
        mdconf="$(mdadm -Db "$container")\\n$mdconf"
        cont_list="$cont_list $container"
        ;;
    [0-9a-f]*[0-9a-f])
        if test -z "$mdadm_conf"; then
            mdadm_conf=$(mdadm --examine --brief --scan)
        fi
        mdconf="$(echo "$mdadm_conf" | grep "UUID=$container")\\n$mdconf"
        cont_list="$cont_list $container"
        ;;
    *)
        echo "unrecognized container for $md_dev: $container"
        ;;
    esac
    # If /etc/mdadm.conf contains a different name for this
    # array, then use that.
    md_uuid=`echo $mdconf | sed -n -e 's/.* UUID=\([0-9a-f:]*\).*/\1/p'`
    if [ -f /etc/mdadm.conf -a -n "$md_uuid" ]; then
       md_devname=`sed -n -e 's,^ARRAY  */dev/\([^ ]*\) .*[Uu][Uu][Ii][Dd]='$md_uuid'.*,\1,p' /etc/mdadm.conf`
       if [ -n "$md_devname" ]; then
          mdconf=`echo $mdconf | sed -e 's,^ARRAY /dev/\([^ ]*\),ARRAY /dev/'$md_devname','`
       fi
    fi
    md_conf["$md_dev"]="$mdconf"
    root_md=1
done

# Any 'md' device is replaced by it's component disks.
blockdev="$mdblockdev"

if [ -n "$root_md" ] ; then
    need_mdadm=1
    echo "AUTO -all" > $tmp_mnt/etc/mdadm.conf
    for md in $md_devs; do
        echo -e "${md_conf["$md"]}" >> $tmp_mnt/etc/mdadm.conf
    done
fi

if [ "x$need_mdadm" = "x1" ] ; then
    for rule in \
        63-md-raid-arrays.rules \
        64-md-raid-assembly.rules; do
        if [ -f /usr/lib/udev/rules.d/$rule ]; then
            cp /usr/lib/udev/rules.d/$rule $tmp_mnt/usr/lib/udev/rules.d
        elif [ -f /lib/udev/rules.d/$rule ]; then
            cp /lib/udev/rules.d/$rule $tmp_mnt/lib/udev/rules.d
        fi
    done
fi

save_var need_mdadm
