[kexec-tools] dracut-kdump: Use proper the known hosts entry in the file known_hosts

WANG Chao wangchao at fedoraproject.org
Fri Dec 12 03:23:52 UTC 2014


commit 63476302aa09b7844ac0fff5aa3878bcc9a5bc0d
Author: Minfei Huang <mhuang at redhat.com>
Date:   Fri Dec 5 16:24:30 2014 +0800

    dracut-kdump: Use proper the known hosts entry in the file known_hosts
    
    Once login using ssh, the ssh will store the known hosts entry to the
    local ~/.ssh/known_hosts. From now, we can login using ssh automaticly.
    
    The ssh will check the ~/ssh/.known_hosts entry, if set the option
    StrictHostKeyChecking=yes/ask in the config or command line, when you
    want to login the target. the default value of StrictHostKeyChecking is
    ask.
    And the kdump using the ssh will append the option
    StrictHostKeyChecking=yes in the command line.
    
    We can using following ip to connect peer machine, if enable the ipv6.
    fe80::5054:ff:fe48:ca80%eth0
    
    Obviously, above ip contains the ethX.
    
    Kdump will add the prefix "kdump-" before ethX to avoid flowing
    netdevice name in case netdevice names ethX in the 2nd kernel. So the
    ip address will change to fe80::5054:ff:fe48:ca80%kdump-eth0.
    
    Kdump will login the target manully in the 2nd kernel, because of the
    option StrictHostKeyChecking=yes and inexistence known hosts entry
    in the local ~/.ssh/known_hosts. Hence dumping core will fail.
    
    In order to login automaticly using ssh, we should add the prefix
    "kdump-" before ethX in the local ~/.ssh/known_hosts.
    
    Signed-off-by: Minfei Huang <mhuang at redhat.com>

 dracut-kdump.sh        |   23 ++++++++++++++++++++++
 dracut-module-setup.sh |   16 ---------------
 kdump-lib.sh           |   50 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+), 16 deletions(-)
---
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index dc948d1..e062665 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -131,6 +131,27 @@ get_host_ip()
     return 0
 }
 
+# kdump will change the ethernet device name in the 2nd using prefix "kdump-",
+# the link scope of ipv6 has the format like fe80::5054:ff:fe48:ca80%eth0,
+# So we should correct the known hosts
+correct_known_hosts()
+{
+    if is_ipv6_target && is_ssh_dump_target; then
+        local _ipv6 _netdev _pre_netdev
+        local _known_hosts="/root/.ssh/known_hosts"
+        local _srcaddr=$(get_option_value ssh)
+
+        [ "x" = "x""$_srcaddr" ] && return 1
+
+        if `echo $_srcaddr | grep -q "%"`; then
+            _ipv6=`get_remote_host $_srcaddr`
+            _netdev=${_srcaddr#*-}
+            _pre_netdev=$(kdump_setup_ifname $_netdev)
+            sed -i "s#$_ipv6\%$_netdev#$_ipv6\%$_pre_netdev#" $_known_hosts
+        fi
+    fi
+}
+
 read_kdump_conf()
 {
     if [ ! -f "$KDUMP_CONF" ]; then
@@ -175,6 +196,8 @@ if [ $? -ne 0 ]; then
     exit 1
 fi
 
+correct_known_hosts
+
 if [ -z "$DUMP_INSTRUCTION" ]; then
     add_dump_code "dump_fs $NEWROOT"
 fi
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index f0d3311..4e004a9 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -97,22 +97,6 @@ kdump_get_perm_addr() {
     fi
 }
 
-# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0
-# Because kernel assigned names are not persistent between 1st and 2nd
-# kernel. We could probably end up with eth0 being eth1, eth0 being
-# eth1, and naming conflict happens.
-kdump_setup_ifname() {
-    local _ifname
-
-    if [[ $1 =~ eth* ]]; then
-        _ifname="kdump-$1"
-    else
-        _ifname="$1"
-    fi
-
-    echo "$_ifname"
-}
-
 kdump_setup_bridge() {
     local _netdev=$1
     local _brif _dev _mac _kdumpdev
diff --git a/kdump-lib.sh b/kdump-lib.sh
index b9dec21..f24f08d 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -138,3 +138,53 @@ check_save_path_fs()
     fi
 }
 
+
+# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0
+# Because kernel assigned names are not persistent between 1st and 2nd
+# kernel. We could probably end up with eth0 being eth1, eth0 being
+# eth1, and naming conflict happens.
+kdump_setup_ifname() {
+    local _ifname
+
+    if [[ $1 =~ eth* ]]; then
+        _ifname="kdump-$1"
+    else
+        _ifname="$1"
+    fi
+
+    echo "$_ifname"
+}
+
+# get ip address or hostname from nfs/ssh config value
+get_remote_host()
+{
+    local _config_val=$1
+
+    # in ipv6, the _config_val format is [xxxx:xxxx::xxxx%eth0]:/mnt/nfs or
+    # username at xxxx:xxxx::xxxx%eth0. what we need is just  xxxx:xxxx::xxxx
+    _config_val=${_config_val#*@}
+    _config_val=${_config_val%:/*}
+    _config_val=${_config_val#[}
+    _config_val=${_config_val%]}
+    _config_val=${_config_val%\%*}
+    echo $_config_val
+}
+
+# check the remote server ip address tpye
+is_ipv6_target()
+{
+    local _server _server_tmp
+
+    if is_ssh_dump_target; then
+        _server=`get_option_value ssh`
+    elif is_nfs_dump_target; then
+        _server=`get_option_value nfs`
+    fi
+
+    [ -z "$_server" ] && return 1
+    _server=`get_remote_host $_server`
+    _server_tmp=$_server
+    _server=`getent ahosts $_server | head -n 1 | cut -d' ' -f1`
+    _server=${_server:-$_server_tmp}
+    echo $_server | grep -q ":"
+}


More information about the scm-commits mailing list