Amerigo Wang be4b409
#!/bin/sh
Amerigo Wang be4b409
Hari Bathini 78589a3
# continue here only if we have to save dump.
Hari Bathini e3f2f92
if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ] && [ ! -f /proc/device-tree/ibm,opal/dump/mpipl-boot ]; then
Hari Bathini e3f2f92
    exit 0
Hari Bathini 78589a3
fi
Hari Bathini 78589a3
Amerigo Wang 52dbdac
. /lib/dracut-lib.sh
WANG Chao 3b27570
. /lib/kdump-lib-initramfs.sh
Amerigo Wang 52dbdac
Dave Young e36d4ab
set -o pipefail
Dave Young 5d1bd77
DUMP_RETVAL=0
Dave Young 24eaa7d
Dave Young 24eaa7d
export PATH=$PATH:$KDUMP_SCRIPT_DIR
Dave Young ba0aa24
WANG Chao 7f88bc6
do_dump()
WANG Chao 7f88bc6
{
WANG Chao 7f88bc6
    local _ret
WANG Chao 7f88bc6
WANG Chao 7f88bc6
    eval $DUMP_INSTRUCTION
WANG Chao 7f88bc6
    _ret=$?
WANG Chao 7f88bc6
WANG Chao 7f88bc6
    if [ $_ret -ne 0 ]; then
d7054f4
        derror "saving vmcore failed"
WANG Chao 7f88bc6
    fi
WANG Chao 7f88bc6
WANG Chao 7f88bc6
    return $_ret
WANG Chao 7f88bc6
}
WANG Chao 7f88bc6
Dave Young 4e4a173
do_kdump_pre()
Dave Young 4e4a173
{
45e02e7
    local _ret
45e02e7
Dave Young 4e4a173
    if [ -n "$KDUMP_PRE" ]; then
Dave Young 4e4a173
        "$KDUMP_PRE"
45e02e7
        _ret=$?
45e02e7
        if [ $_ret -ne 0 ]; then
d7054f4
            derror "$KDUMP_PRE exited with $_ret status"
45e02e7
            return $_ret
45e02e7
        fi
Dave Young 4e4a173
    fi
45e02e7
bc67c13
    # if any script fails, it just raises warning and continues
45e02e7
    if [ -d /etc/kdump/pre.d ]; then
45e02e7
        for file in /etc/kdump/pre.d/*; do
45e02e7
            "$file"
45e02e7
            _ret=$?
45e02e7
            if [ $_ret -ne 0 ]; then
d7054f4
                derror "$file exited with $_ret status"
45e02e7
            fi
45e02e7
        done
45e02e7
    fi
45e02e7
    return 0
Dave Young 4e4a173
}
Dave Young 4e4a173
Baoquan He 6f4940f
do_kdump_post()
Baoquan He 6f4940f
{
45e02e7
    local _ret
45e02e7
45e02e7
    if [ -d /etc/kdump/post.d ]; then
45e02e7
        for file in /etc/kdump/post.d/*; do
45e02e7
            "$file" "$1"
45e02e7
            _ret=$?
45e02e7
            if [ $_ret -ne 0 ]; then
d7054f4
                derror "$file exited with $_ret status"
45e02e7
            fi
45e02e7
        done
45e02e7
    fi
45e02e7
Baoquan He 6f4940f
    if [ -n "$KDUMP_POST" ]; then
Baoquan He 6f4940f
        "$KDUMP_POST" "$1"
45e02e7
        _ret=$?
45e02e7
        if [ $_ret -ne 0 ]; then
d7054f4
            derror "$KDUMP_POST exited with $_ret status"
45e02e7
        fi
Baoquan He 6f4940f
    fi
Baoquan He 6f4940f
}
Baoquan He 6f4940f
Amerigo Wang 1048810
add_dump_code()
Amerigo Wang 108f6ac
{
Dave Young 5d1bd77
    DUMP_INSTRUCTION=$1
Amerigo Wang 108f6ac
}
Amerigo Wang 108f6ac
Amerigo Wang 1048810
dump_raw()
Amerigo Wang 1048810
{
WANG Chao fa0ec28
    local _raw=$1
Dave Young 24eaa7d
WANG Chao fa0ec28
    [ -b "$_raw" ] || return 1
WANG Chao fa0ec28
d7054f4
    dinfo "saving to raw disk $_raw"
WANG Chao 1520307
Baoquan He 3158480
    if ! $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then
Dave Young 24eaa7d
        _src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
Dave Young 24eaa7d
        _src_size_mb=$(($_src_size / 1048576))
Baoquan He 3158480
        monitor_dd_progress $_src_size_mb &
Dave Young 24eaa7d
    fi
Dave Young 24eaa7d
d7054f4
    dinfo "saving vmcore"
WANG Chao fa0ec28
    $CORE_COLLECTOR /proc/vmcore | dd of=$_raw bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1
WANG Chao 313aef1
    sync
WANG Chao 1520307
d7054f4
    dinfo "saving vmcore complete"
Dave Young 8770ac2
    return 0
Amerigo Wang 1048810
}
Amerigo Wang 1048810
Amerigo Wang 108f6ac
dump_ssh()
Amerigo Wang 108f6ac
{
d7054f4
    local ret
Dave Young 2697669
    local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
Baoquan He c64f563
    local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR"
WANG Chao fa0ec28
    local _host=$2
Dave Young 2697669
d7054f4
    dinfo "saving to $_host:$_dir"
WANG Chao 1520307
Dave Young c5c4a7b
    cat /var/lib/random-seed > /dev/urandom
WANG Chao fa0ec28
    ssh -q $_opt $_host mkdir -p $_dir || return 1
Dave Young 2697669
WANG Chao fa0ec28
    save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $_host
Hari Bathini e3f2f92
    save_opalcore_ssh ${_dir} "${_opt}" $_host
Baoquan He ca61e6a
d7054f4
    dinfo "saving vmcore"
WANG Chao 1520307
Baoquan He 259baae
    if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then
d7054f4
        scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete"
d7054f4
        ret=$?
d7054f4
        save_log
d7054f4
        scp -q $_opt $KDUMP_LOG_FILE "$_host:$_dir/"
d7054f4
        if [ $ret -ne 0 ]; then
d7054f4
            return 1
d7054f4
        fi
WANG Chao fa0ec28
        ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1
Dave Young 2697669
    else
d7054f4
        $CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete"
d7054f4
        ret=$?
d7054f4
        save_log
d7054f4
        scp -q $_opt $KDUMP_LOG_FILE "$_host:$_dir/"
d7054f4
        if [ $ret -ne 0 ]; then
d7054f4
            return 1
d7054f4
        fi
WANG Chao fa0ec28
        ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1
Dave Young 2697669
    fi
WANG Chao 1520307
d7054f4
    dinfo "saving vmcore complete"
WANG Chao 1520307
    return 0
Dave Young 2697669
}
Dave Young 2697669
Hari Bathini e3f2f92
save_opalcore_ssh() {
Hari Bathini e3f2f92
    local _path=$1
Hari Bathini e3f2f92
    local _opts="$2"
Hari Bathini e3f2f92
    local _location=$3
Hari Bathini e3f2f92
d7054f4
    ddebug "_path=$_path _opts=$_opts _location=$_location"
d7054f4
Hari Bathini e3f2f92
    if [ ! -f $OPALCORE ]; then
Hari Bathini e3f2f92
        # Check if we are on an old kernel that uses a different path
Hari Bathini e3f2f92
        if [ -f /sys/firmware/opal/core ]; then
Hari Bathini e3f2f92
            OPALCORE="/sys/firmware/opal/core"
Hari Bathini e3f2f92
        else
Hari Bathini e3f2f92
            return 0
Hari Bathini e3f2f92
        fi
Hari Bathini e3f2f92
    fi
Hari Bathini e3f2f92
d7054f4
    dinfo "saving opalcore:$OPALCORE to $_location:$_path"
Hari Bathini e3f2f92
    scp $_opts $OPALCORE $_location:$_path/opalcore-incomplete
Hari Bathini e3f2f92
    if [ $? -ne 0 ]; then
d7054f4
        derror "saving opalcore failed"
Hari Bathini e3f2f92
       return 1
Hari Bathini e3f2f92
    fi
Hari Bathini e3f2f92
Hari Bathini e3f2f92
    ssh $_opts $_location mv $_path/opalcore-incomplete $_path/opalcore
d7054f4
    dinfo "saving opalcore complete"
Hari Bathini e3f2f92
    return 0
Hari Bathini e3f2f92
}
Hari Bathini e3f2f92
Baoquan He ca61e6a
save_vmcore_dmesg_ssh() {
Baoquan He ca61e6a
    local _dmesg_collector=$1
Baoquan He ca61e6a
    local _path=$2
Baoquan He ca61e6a
    local _opts="$3"
Baoquan He ca61e6a
    local _location=$4
Baoquan He ca61e6a
d7054f4
    dinfo "saving vmcore-dmesg.txt to $_location:$_path"
Baoquan He ca61e6a
    $_dmesg_collector /proc/vmcore | ssh $_opts $_location "dd of=$_path/vmcore-dmesg-incomplete.txt"
Baoquan He ca61e6a
    _exitcode=$?
Baoquan He ca61e6a
Baoquan He ca61e6a
    if [ $_exitcode -eq 0 ]; then
Baoquan He ca61e6a
        ssh -q $_opts $_location mv $_path/vmcore-dmesg-incomplete.txt $_path/vmcore-dmesg.txt
d7054f4
        dinfo "saving vmcore-dmesg.txt complete"
Baoquan He ca61e6a
    else
d7054f4
        derror "saving vmcore-dmesg.txt failed"
Baoquan He ca61e6a
    fi
Baoquan He ca61e6a
}
Baoquan He ca61e6a
cfd93e2
get_host_ip()
cfd93e2
{
cfd93e2
    local _host
cfd93e2
    if is_nfs_dump_target || is_ssh_dump_target
cfd93e2
    then
cfd93e2
        kdumpnic=$(getarg kdumpnic=)
d7054f4
        [ -z "$kdumpnic" ] && derror "failed to get kdumpnic!" && return 1
cfd93e2
        _host=`ip addr show dev $kdumpnic|grep '[ ]*inet'`
d7054f4
        [ $? -ne 0 ] && derror "wrong kdumpnic: $kdumpnic" && return 1
cfd93e2
        _host=`echo $_host | head -n 1 | cut -d' ' -f2`
cfd93e2
        _host="${_host%%/*}"
d7054f4
        [ -z "$_host" ] && derror "wrong kdumpnic: $kdumpnic" && return 1
cfd93e2
        HOST_IP=$_host
cfd93e2
    fi
cfd93e2
    return 0
cfd93e2
}
cfd93e2
cfd93e2
read_kdump_conf()
cfd93e2
{
cfd93e2
    if [ ! -f "$KDUMP_CONF" ]; then
d7054f4
        derror "$KDUMP_CONF not found"
cfd93e2
        return
cfd93e2
    fi
cfd93e2
cfd93e2
    get_kdump_confs
cfd93e2
cfd93e2
    # rescan for add code for dump target
cfd93e2
    while read config_opt config_val;
cfd93e2
    do
cfd93e2
        # remove inline comments after the end of a directive.
cfd93e2
        case "$config_opt" in
cfd93e2
        dracut_args)
cfd93e2
            config_val=$(get_dracut_args_target "$config_val")
1a5d44d
            if [ -n "$config_val" ]; then
1a5d44d
                config_val=$(get_mntpoint_from_target "$config_val")
1a5d44d
                add_dump_code "dump_fs $config_val"
1a5d44d
            fi
cfd93e2
            ;;
cfd93e2
        ext[234]|xfs|btrfs|minix|nfs)
cfd93e2
            config_val=$(get_mntpoint_from_target "$config_val")
cfd93e2
            add_dump_code "dump_fs $config_val"
cfd93e2
            ;;
cfd93e2
        raw)
cfd93e2
            add_dump_code "dump_raw $config_val"
cfd93e2
            ;;
cfd93e2
        ssh)
cfd93e2
            add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val"
cfd93e2
            ;;
cfd93e2
        esac
cfd93e2
    done <<< "$(read_strip_comments $KDUMP_CONF)"
cfd93e2
}
cfd93e2
WANG Chao e5e0507
fence_kdump_notify()
WANG Chao e5e0507
{
2066e5f
    if [ -n "$FENCE_KDUMP_NODES" ]; then
2066e5f
        $FENCE_KDUMP_SEND $FENCE_KDUMP_ARGS $FENCE_KDUMP_NODES &
WANG Chao e5e0507
    fi
WANG Chao e5e0507
}
WANG Chao e5e0507
Amerigo Wang 108f6ac
read_kdump_conf
2066e5f
fence_kdump_notify
Amerigo Wang 108f6ac
Baoquan He 3be6c12
get_host_ip
Baoquan He 3be6c12
if [ $? -ne 0 ]; then
d7054f4
    derror "get_host_ip exited with non-zero status!"
WANG Chao 2276b85
    exit 1
Baoquan He 3be6c12
fi
Baoquan He 3be6c12
Dave Young d5bc608
if [ -z "$DUMP_INSTRUCTION" ]; then
WANG Chao ee7d158
    add_dump_code "dump_fs $NEWROOT"
Amerigo Wang 108f6ac
fi
Amerigo Wang 108f6ac
Dave Young 4e4a173
do_kdump_pre
Dave Young 4e4a173
if [ $? -ne 0 ]; then
d7054f4
    derror "kdump_pre script exited with non-zero status!"
WANG Chao 67667bd
    do_final_action
bda677c
    # During systemd service to reboot the machine, stop this shell script running
bda677c
    exit 1
Dave Young 4e4a173
fi
arthur ef9f97d
make_trace_mem "kdump saving vmcore" '1:shortmem' '2+:mem' '3+:slab'
WANG Chao 7f88bc6
do_dump
Dave Young 5d1bd77
DUMP_RETVAL=$?
Dave Young 4e4a173
Dave Young 4e4a173
do_kdump_post $DUMP_RETVAL
Dave Young 4e4a173
if [ $? -ne 0 ]; then
d7054f4
    derror "kdump_post script exited with non-zero status!"
Dave Young 4e4a173
fi
Dave Young 4e4a173
Dave Young 5d1bd77
if [ $DUMP_RETVAL -ne 0 ]; then
WANG Chao 2276b85
    exit 1
Dave Young 5d1bd77
fi
Dave Young 5d1bd77
WANG Chao 67667bd
do_final_action