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-manger.
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 --- kdump-lib.sh | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+)
diff --git a/kdump-lib.sh b/kdump-lib.sh index 4d34206..20ec525 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -230,3 +230,92 @@ is_hostname() fi echo $1 | grep -q "[a-zA-Z]" } + +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 + 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:]]*$" 2>/dev/null \ + /etc/sysconfig/network-scripts/ifcfg-* | head -1 +} + +get_ifcfg_by_name() +{ + grep -E -i -l "^[[:space:]]*NAME="*${1}"*[[:space:]]*$" 2>/dev/null \ + /etc/sysconfig/network-scripts/ifcfg-* | head -1 +} + +is_nm_running() +{ + [ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ] +} + +# $1: netdev name +get_ifcfg_nmcli() +{ + local nm_name + local ifcfg_file + + # Get the active nmcli config name of $1 + if [[ is_nm_running ]]; then + # The configuration name generated by nm is wrote to the ifcfg file + # as "NAME=<nm_name>". + nm_name=$(nmcli d show $1 2>/dev/null |grep GENERAL.CONNECTION \ + |sed -e 's/GENERAL.CONNECTION: *//') + if [[ "${nm_name}" && "${nm_name}" != "--" ]]; then + ifcfg_file=$(get_ifcfg_by_name ${nm_name}) + fi + 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}" +}
Change all the ifcfg file users to call get_ifcfg_filename().
Signed-off-by: Xunlei Pang xlpang@redhat.com --- dracut-module-setup.sh | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index 4cd7107..350864e 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -66,7 +66,12 @@ kdump_is_vlan() { kdump_setup_dns() { local _nameserver _dns local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf - . /etc/sysconfig/network-scripts/ifcfg-$1 + local ifcfg_file + + ifcfg_file=$(get_ifcfg_filename $1) + if [ -f "${ifcfg_file}" ]; then + . ${ifcfg_file} + fi
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile" [ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile" @@ -181,6 +186,8 @@ kdump_setup_bridge() { kdump_setup_bond() { local _netdev=$1 local _dev _mac _slaves _kdumpdev + local ifcfg_file + for _dev in `cat /sys/class/net/$_netdev/bonding/slaves`; do _mac=$(kdump_get_perm_addr $_dev) _kdumpdev=$(kdump_setup_ifname $_dev) @@ -189,7 +196,12 @@ 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 + + ifcfg_file=$(get_ifcfg_filename $_netdev) + if [ -f "${ifcfg_file}" ]; then + . ${ifcfg_file} + fi + bondoptions="$(echo :$BONDING_OPTS | sed 's/\s+/,/')" echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf } @@ -244,7 +256,13 @@ kdump_setup_vlan() { # $1: netdev name kdump_setup_znet() { local _options="" - . /etc/sysconfig/network-scripts/ifcfg-$1 + local ifcfg_file + + ifcfg_file=$(get_ifcfg_filename $1) + if [ -f "${ifcfg_file}" ]; then + . ${ifcfg_file} + fi + for i in $OPTIONS; do _options=${_options},$i done
On 2016/04/21 at 12:29, Xunlei Pang wrote:
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-manger.
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
kdump-lib.sh | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+)
diff --git a/kdump-lib.sh b/kdump-lib.sh index 4d34206..20ec525 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -230,3 +230,92 @@ is_hostname() fi echo $1 | grep -q "[a-zA-Z]" }
+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
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:]]*$" 2>/dev/null \
/etc/sysconfig/network-scripts/ifcfg-* | head -1
+}
+get_ifcfg_by_name() +{
- grep -E -i -l "^[[:space:]]*NAME="*${1}"*[[:space:]]*$" 2>/dev/null \
/etc/sysconfig/network-scripts/ifcfg-* | head -1
+}
+is_nm_running() +{
- [ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ]
+}
+# $1: netdev name +get_ifcfg_nmcli() +{
- local nm_name
- local ifcfg_file
- # Get the active nmcli config name of $1
- if [[ is_nm_running ]]; then
# The configuration name generated by nm is wrote to the ifcfg file
# as "NAME=<nm_name>".
nm_name=$(nmcli d show $1 2>/dev/null |grep GENERAL.CONNECTION \
|sed -e 's/GENERAL.CONNECTION: *//')
if [[ "${nm_name}" && "${nm_name}" != "--" ]]; then
ifcfg_file=$(get_ifcfg_by_name ${nm_name})
Sorry, I just realized $nm_name is not unique, I will improve it using: "LANG=C nmcli c show --active" to get netif's UUID to find the right ifcfg filename first.
For example $ LANG=C nmcli c show --active NAME UUID TYPE DEVICE virbr0-nic f37adcb3-5450-4c15-a386-31c940059e76 generic virbr0-nic virbr0 e4ce9946-d402-4439-a3f1-5eb6012714aa bridge virbr0 xxxxx acd24be7-39f8-4bee-9a52-94aad72e37ed 802-3-ethernet enp0s25 tun0 eb987c98-d055-4036-981b-cec6161b0b76 generic tun0 ppp0 9336c687-ecc7-4f45-9169-c76b832de78c generic ppp0
The UUID above is also specified as one directive in netif's corresponding ifcfg file.
Regards, Xunlei
fi
- 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}"
+}