kfan / rpms / kexec-tools

Forked from rpms/kexec-tools 3 years ago
Clone
Blob Blame History Raw
#!/bin/bash --norc
# New mkdumprd
#
# Copyright 2011 Red Hat, Inc.
#
# Written by Cong Wang <amwang@redhat.com>
#

export IN_KDUMP=1

conf_file="/etc/kdump.conf"
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
extra_modules=""
dracut_args=("-m" "kdumpbase" "--add" "dash" "--add" "fstab-sys" "--add" "kernel-modules" "-c" "/dev/null" "-I" "/sbin/makedumpfile")

add_dracut_arg() {
    while [ $# -gt 0 ];
    do
        dracut_args+=("$1")
        shift
    done
}

add_dracut_module() {
    add_dracut_arg "--add" "$1"
}

add_dracut_mount() {
    add_dracut_arg "--mount" "$1"
}

add_dracut_sshkey() {
    add_dracut_arg "--sshkey" "$1"
}

while [ $# -gt 0 ]; do
    case $1 in
    -d)
        shift
        ;;
    --noconf)
        conf_file=""
        shift
        ;;
    --debug)
        add_dracut_arg "-v"
        set -x
        shift
        ;;
    *)
        break
        ;;
    esac
done

# Generic substring function.  If $2 is in $1, return 0.
strstr() { [[ $1 =~ $2 ]]; }

to_dev_name() {
    local dev="$1"

    case "$dev" in
    UUID=*)
        dev=`blkid -U "${dev#UUID=}"`
        ;;
    LABEL=*)
        dev=`blkid -L "${dev#LABEL=}"`
        ;;
    esac
    echo $dev
}

get_rootdev() {
    mount | grep 'on / ' | grep -v rootfs | awk '{print $1}'
}

to_mount() {
    local _dev=$(to_dev_name $1)
    echo "$(grep "$_dev" /proc/mounts | cut -d' ' -f1-4)"
}

# $1 remote target
check_remote() {
    return
}

add_mount() {
    local _dev=$(to_dev_name "$1")
    local _mnt=$(to_mount "$1")
    if [ "$_dev" = "$(get_rootdev)" ]; then
        :
    elif [ -n "$_mnt" ]; then
        add_dracut_mount "$_mnt"
    else
	return 1
    fi
    return 0
}

add_dracut_mount "$(to_mount "$(get_rootdev)")"
if [ -n "$conf_file" ]; then
    # firstly get right SSH_KEY_LOCATION
    keyfile=$(awk '/sshkey/ {print $2}' $conf_file)
    if [ -f "$keyfile" ]; then
        # canonicalize the path
        SSH_KEY_LOCATION=$(/usr/bin/readlink -m $keyfile)
    fi

    while read config_opt config_val;
    do
        case "$config_opt" in
        extra_modules)
            extra_modules="$extra_modules $config_val"
            ;;
        ext[234]|xfs|btrfs|minix)
            add_mount "$config_val"
            if [ $? -ne 0 ]; then
                echo "Dump target $config_val is probably not mounted."
                exit 1
            fi
            ;;
        raw)
            #TODO
            ;;
        net)
            check_remote "$config_val"
            if strstr "$config_val" "@";
            then
                add_dracut_module "ssh-client"
		add_dracut_sshkey "$SSH_KEY_LOCATION"
            else
                add_dracut_module "nfs"
                add_mount "$config_val"
                if [ $? -ne 0 ]; then
                    echo "Dump target $config_val is probably not mounted."
                    exit 1
                fi
            fi
            ;;
        core_collector)
            add_dracut_arg "-I" "${config_val%% *}"
            ;;
        extra_bins)
            add_dracut_arg "-I" "$config_val"
            ;;
        *)
            if [ -n $(echo $config_opt | grep "^#.*$") ]
            then
                continue
            fi
            ;;
        esac
    done < $conf_file
fi

if [ -n "$extra_modules" ]
then
    add_dracut_arg "--add-drivers" "$extra_modules"
fi

dracut "${dracut_args[@]}" -M "$@"
_rc=$?
sync
exit $_rc