diff --git a/modules.d/40network/ifname-genrules.sh b/modules.d/40network/ifname-genrules.sh new file mode 100644 index 00000000..547f2305 --- /dev/null +++ b/modules.d/40network/ifname-genrules.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# if there are no ifname parameters, just use NAME=KERNEL +if ! getarg ifname= >/dev/null ; then + echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{type}=="1", NAME="%k"' \ + > /etc/udev/rules.d/50-ifname.rules + return +fi + +{ + for p in $(getargs ifname=); do + parse_ifname_opts $p + printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{type}=="1", NAME="%s"\n' "$ifname_mac" "$ifname_if" + done + + # Rename non named interfaces out of the way for named ones. + for p in $(getargs ifname=); do + parse_ifname_opts $p + printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{type}=="1", NAME!="?*", KERNEL=="%s", NAME="%%k-renamed"\n' "$ifname_if" + done +} > /etc/udev/rules.d/50-ifname.rules diff --git a/modules.d/40network/parse-ifname.sh b/modules.d/40network/parse-ifname.sh new file mode 100644 index 00000000..aba84750 --- /dev/null +++ b/modules.d/40network/parse-ifname.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Format: +# ifname=: +# +# Note letters in the macaddress must be lowercase! +# +# Examples: +# ifname=eth0:4a:3f:4c:04:f8:d7 +# +# Note when using ifname= to get persistent interface names, you must specify +# an ifname= argument for each interface used in an ip= or fcoe= argument + +# check if there are any ifname parameters +if ! getarg ifname= >/dev/null ; then + return +fi + +parse_ifname_opts() { + local IFS=: + set $1 + + case $# in + 7) + ifname_if=$1 + ifname_mac=$2:$3:$4:$5:$6:$7 + ;; + *) + die "Invalid arguments for ifname=" + ;; + esac +} + +# Check ifname= lines +for p in $(getargs ifname=); do + parse_ifname_opts $p +done