ba0aa24316
Add ssh dump support changes including below items: 1. sshkey option 2. sshkey propagate 3. fix a bug of _server ip calculation for dump target string 4. change the prefix of kdump hook from 93 to 01 to avoid dhclient and other cleanups happening before us 5. enable network with dracut cmdline rd.neednet=1 when there's network target config [v1 - v2]: Only check_ssh_target when there's ssh dump target in kdump config file [v2 -> v3] style fixes: trailing spaces and space before tab indent remove set -x simply check_ssh_target use awk to get sshkey option value change pivot hook order to 0000 Signed-off-by: Dave Young <dyoung@redhat.com>
166 lines
3.3 KiB
Bash
166 lines
3.3 KiB
Bash
#!/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
|
|
|