Previously, we assumed the ifcfg file of a network "interface" is "/etc/sysconfig/network-scripts/ifcfg-<interface>", but actually it is not the case.
For example, for network interface "enp0s25", we are able to generate like "/etc/sysconfig/network-scripts/ifcfg-enp0s25-test" for it via network-manager.
The "suffix" in "ifcfg-<suffix>" is actually a "configuration" name not "interface" name, though normally we use the "interface" name as its "configuration" name. You can refer to "man ifup" for some detail.
So, this patch adds some assistant helpers to acquire the right ifcfg file for an interface. Borrow some logic from script below: "/etc/sysconfig/network-scripts/network-functions"
Signed-off-by: Xunlei Pang xlpang@redhat.com --- v4->v5: -Add "LC_ALL= LANG=" in get_hwaddr(), add some comments according to Dave's suggestion.
kdump-lib.sh | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+)
diff --git a/kdump-lib.sh b/kdump-lib.sh index 4d34206..b2fd2bb 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -230,3 +230,106 @@ is_hostname() fi echo $1 | grep -q "[a-zA-Z]" } + +# Copied from "/etc/sysconfig/network-scripts/network-functions" +get_hwaddr() +{ + if [ -f "/sys/class/net/${1}/address" ]; then + awk '{ print toupper($0) }' < /sys/class/net/${1}/address + elif [ -d "/sys/class/net/${1}" ]; then + LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \ + awk '{ print toupper(gensub(/.*link/[^ ]* ([[:alnum:]:]*).*/, + "\1", 1)); }' + fi +} + +get_ifcfg_by_device() +{ + grep -E -i -l "^[[:space:]]*DEVICE="*${1}"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +get_ifcfg_by_hwaddr() +{ + grep -E -i -l "^[[:space:]]*HWADDR="*${1}"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +get_ifcfg_by_uuid() +{ + grep -E -i -l "^[[:space:]]*UUID="*${1}"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +get_ifcfg_by_name() +{ + grep -E -i -l "^[[:space:]]*NAME="*${1}"*[[:space:]]*$" \ + /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1 +} + +is_nm_running() +{ + [ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ] +} + +is_nm_handling() +{ + LANG=C nmcli -t --fields device,state dev status 2>/dev/null \ + | grep -q "^(${1}:connected)|(${1}:connecting.*)$" +} + +# $1: netdev name +get_ifcfg_nmcli() +{ + local nm_uuid nm_name + local ifcfg_file + + # Get the active nmcli config name of $1 + if is_nm_running && is_nm_handling "${1}" ; then + # The configuration "uuid" and "name" generated by nm is wrote to + # the ifcfg file as "UUID=<nm_uuid>" and "NAME=<nm_name>". + nm_uuid=$(LANG=C nmcli -t --fields uuid,device c show --active 2>/dev/null \ + | grep "${1}" | head -1 | cut -d':' -f1) + nm_name=$(LANG=C nmcli -t --fields name,device c show --active 2>/dev/null \ + | grep "${1}" | head -1 | cut -d':' -f1) + ifcfg_file=$(get_ifcfg_by_uuid "${nm_uuid}") + [ -z "${ifcfg_file}" ] && ifcfg_file=$(get_ifcfg_by_name "${nm_name}") + fi + + echo -n "${ifcfg_file}" +} + +# $1: netdev name +get_ifcfg_legacy() +{ + local ifcfg_file + + ifcfg_file="/etc/sysconfig/network-scripts/ifcfg-${1}" + [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return + + ifcfg_file=$(get_ifcfg_by_name "${1}") + [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return + + local hwaddr=$(get_hwaddr "${1}") + if [ -n "$hwaddr" ]; then + ifcfg_file=$(get_ifcfg_by_hwaddr "${hwaddr}") + [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return + fi + + ifcfg_file=$(get_ifcfg_by_device "${1}") + + echo -n "${ifcfg_file}" +} + +# $1: netdev name +# Return the ifcfg file whole name(including the path) of $1 if any. +get_ifcfg_filename() { + local ifcfg_file + + ifcfg_file=$(get_ifcfg_nmcli "${1}") + if [ -z "${ifcfg_file}" ]; then + ifcfg_file=$(get_ifcfg_legacy "${1}") + fi + + echo -n "${ifcfg_file}" +}
The ifcfg file name of <netif> under "/etc/sysconfig/network-scripts/" may not be "ifcfg-<netif>". For example, for "enp0s25" we are able to generate its ifcfg like "/etc/sysconfig/network-scripts/ifcfg-enp0s25test" via network-manager. If we alway assume "ifcfg-<netif>" is there, we will got the wrong result in some cases.
The issue can be resolved by using the new get_ifcfg_filename() introduced by PATCH "kdump-lib: Add get_ifcfg_filename() to get the proper ifcfg file", so we hereby change all the "ifcfg-<netif>" users to use get_ifcfg_filename().
Signed-off-by: Xunlei Pang xlpang@redhat.com --- v4->v5: -Add source_ifcfg_file(). -Improve changelog.
dracut-module-setup.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index 4cd7107..ecf7d3f 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -63,10 +63,23 @@ kdump_is_vlan() { }
# $1: netdev name +source_ifcfg_file() { + local ifcfg_file + + ifcfg_file=$(get_ifcfg_filename $1) + if [ -f "${ifcfg_file}" ]; then + . ${ifcfg_file} + else + dwarning "The ifcfg file of $1 is not found!" + fi +} + +# $1: netdev name kdump_setup_dns() { local _nameserver _dns local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf - . /etc/sysconfig/network-scripts/ifcfg-$1 + + source_ifcfg_file $1
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile" [ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile" @@ -189,7 +202,9 @@ kdump_setup_bond() { done echo -n " bond=$_netdev:$(echo $_slaves | sed 's/,$//')" >> ${initdir}/etc/cmdline.d/42bond.conf # Get bond options specified in ifcfg - . /etc/sysconfig/network-scripts/ifcfg-$_netdev + + source_ifcfg_file $_netdev + bondoptions="$(echo :$BONDING_OPTS | sed 's/\s+/,/')" echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf } @@ -244,7 +259,9 @@ kdump_setup_vlan() { # $1: netdev name kdump_setup_znet() { local _options="" - . /etc/sysconfig/network-scripts/ifcfg-$1 + + source_ifcfg_file $1 + for i in $OPTIONS; do _options=${_options},$i done
On 05/26/16 at 10:05pm, Xunlei Pang wrote:
The ifcfg file name of <netif> under "/etc/sysconfig/network-scripts/" may not be "ifcfg-<netif>". For example, for "enp0s25" we are able to generate its ifcfg like "/etc/sysconfig/network-scripts/ifcfg-enp0s25test" via network-manager. If we alway assume "ifcfg-<netif>" is there, we will got the wrong result in some cases.
The issue can be resolved by using the new get_ifcfg_filename() introduced by PATCH "kdump-lib: Add get_ifcfg_filename() to get the proper ifcfg file", so we hereby change all the "ifcfg-<netif>" users to use get_ifcfg_filename().
Signed-off-by: Xunlei Pang xlpang@redhat.com
v4->v5: -Add source_ifcfg_file(). -Improve changelog.
dracut-module-setup.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index 4cd7107..ecf7d3f 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -63,10 +63,23 @@ kdump_is_vlan() { }
# $1: netdev name +source_ifcfg_file() {
- local ifcfg_file
- ifcfg_file=$(get_ifcfg_filename $1)
- if [ -f "${ifcfg_file}" ]; then
. ${ifcfg_file}
- else
dwarning "The ifcfg file of $1 is not found!"
- fi
+}
+# $1: netdev name kdump_setup_dns() { local _nameserver _dns local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf
- . /etc/sysconfig/network-scripts/ifcfg-$1
source_ifcfg_file $1
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile" [ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile"
@@ -189,7 +202,9 @@ kdump_setup_bond() { done echo -n " bond=$_netdev:$(echo $_slaves | sed 's/,$//')" >> ${initdir}/etc/cmdline.d/42bond.conf # Get bond options specified in ifcfg
- . /etc/sysconfig/network-scripts/ifcfg-$_netdev
- source_ifcfg_file $_netdev
- bondoptions="$(echo :$BONDING_OPTS | sed 's/\s+/,/')" echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf
} @@ -244,7 +259,9 @@ kdump_setup_vlan() { # $1: netdev name kdump_setup_znet() { local _options=""
- . /etc/sysconfig/network-scripts/ifcfg-$1
- source_ifcfg_file $1
- for i in $OPTIONS; do _options=${_options},$i done
-- 1.8.3.1 _______________________________________________ kexec mailing list kexec@lists.fedoraproject.org https://lists.fedoraproject.org/admin/lists/kexec@lists.fedoraproject.org
For the two patches
Acked-by: Dave Young dyoung@redhat.com
Thanks Dave