[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [OSSTEST PATCH 24/62] overlay-persistent-net: Copy from jessie
These were copied from a system running Debian jessie. The nontrivial files are: # Copyright (C) 2006 Marco d'Itri <md@xxxxxxxx> # Copyright (C) 2007 Kay Sievers <kay.sievers@xxxxxxxx> and licenced GPLv2+. That is compatible with osstest's AGPLv3+. Right now we do nothing with these. Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- overlay-persistent-net/etc/init.d/udev-finish | 22 +++ .../etc/udev/rule_generator.functions | 113 +++++++++++++++ .../etc/udev/rules.d/73-usb-net-by-mac.rules | 0 .../etc/udev/rules.d/75-net-description.rules | 0 .../udev/rules.d/75-persistent-net-generator.rules | 143 +++++++++++++++++++ overlay-persistent-net/etc/udev/udev-finish | 9 ++ overlay-persistent-net/etc/udev/write_net_rules | 152 +++++++++++++++++++++ .../lib/udev/rule_generator.functions | 1 + overlay-persistent-net/lib/udev/udev-finish | 1 + overlay-persistent-net/lib/udev/write_net_rules | 1 + 10 files changed, 442 insertions(+) create mode 100755 overlay-persistent-net/etc/init.d/udev-finish create mode 100644 overlay-persistent-net/etc/udev/rule_generator.functions create mode 100644 overlay-persistent-net/etc/udev/rules.d/73-usb-net-by-mac.rules create mode 100644 overlay-persistent-net/etc/udev/rules.d/75-net-description.rules create mode 100644 overlay-persistent-net/etc/udev/rules.d/75-persistent-net-generator.rules create mode 100755 overlay-persistent-net/etc/udev/udev-finish create mode 100755 overlay-persistent-net/etc/udev/write_net_rules create mode 120000 overlay-persistent-net/lib/udev/rule_generator.functions create mode 120000 overlay-persistent-net/lib/udev/udev-finish create mode 120000 overlay-persistent-net/lib/udev/write_net_rules diff --git a/overlay-persistent-net/etc/init.d/udev-finish b/overlay-persistent-net/etc/init.d/udev-finish new file mode 100755 index 00000000..10602017 --- /dev/null +++ b/overlay-persistent-net/etc/init.d/udev-finish @@ -0,0 +1,22 @@ +#!/bin/sh -e +### BEGIN INIT INFO +# Provides: udev-finish +# Required-Start: udev $local_fs +# Required-Stop: +# Default-Start: S +# Default-Stop: +# Short-Description: Copy rules generated while the root was ro +### END INIT INFO + +PATH="/sbin:/bin" + +. /lib/lsb/init-functions + +case "$1" in + start) ;; + stop|restart|force-reload) exit 0 ;; + *) echo "Usage: $0 {start|stop|restart|force-reload}" >&2; exit 1 ;; +esac + +exec /lib/udev/udev-finish + diff --git a/overlay-persistent-net/etc/udev/rule_generator.functions b/overlay-persistent-net/etc/udev/rule_generator.functions new file mode 100644 index 00000000..925193e4 --- /dev/null +++ b/overlay-persistent-net/etc/udev/rule_generator.functions @@ -0,0 +1,113 @@ +# functions used by the udev rule generator + +# Copyright (C) 2006 Marco d'Itri <md@xxxxxxxx> + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +PATH='/sbin:/bin' + +# Read a single line from file $1 in the $DEVPATH directory. +# The function must not return an error even if the file does not exist. +sysread() { + local file="$1" + [ -e "/sys$DEVPATH/$file" ] || return 0 + local value + read value < "/sys$DEVPATH/$file" || return 0 + echo "$value" +} + +sysreadlink() { + local file="$1" + [ -e "/sys$DEVPATH/$file" ] || return 0 + readlink -f /sys$DEVPATH/$file 2> /dev/null || true +} + +# Return true if a directory is writeable. +writeable() { + if ln -s test-link $1/.is-writeable 2> /dev/null; then + rm -f $1/.is-writeable + return 0 + else + return 1 + fi +} + +# Create a lock file for the current rules file. +lock_rules_file() { + RUNDIR=/run/udev + [ -e "$RUNDIR" ] || return 0 + + RULES_LOCK="$RUNDIR/.lock-${RULES_FILE##*/}" + + retry=30 + while ! mkdir $RULES_LOCK 2> /dev/null; do + if [ $retry -eq 0 ]; then + echo "Cannot lock $RULES_FILE!" >&2 + exit 2 + fi + sleep 1 + retry=$(($retry - 1)) + done +} + +unlock_rules_file() { + [ "$RULES_LOCK" ] || return 0 + rmdir $RULES_LOCK || true +} + +# Choose the real rules file if it is writeable or a temporary file if not. +# Both files should be checked later when looking for existing rules. +choose_rules_file() { + RUNDIR=/run/udev + local tmp_rules_file="$RUNDIR/tmp-rules--${RULES_FILE##*/}" + [ -e "$RULES_FILE" -o -e "$tmp_rules_file" ] || PRINT_HEADER=1 + + if writeable ${RULES_FILE%/*}; then + RO_RULES_FILE='/dev/null' + else + RO_RULES_FILE=$RULES_FILE + RULES_FILE=$tmp_rules_file + fi +} + +# Return the name of the first free device. +raw_find_next_available() { + local links="$1" + + local basename=${links%%[ 0-9]*} + local max=-1 + for name in $links; do + local num=${name#$basename} + [ "$num" ] || num=0 + [ $num -gt $max ] && max=$num + done + + local max=$(($max + 1)) + # "name0" actually is just "name" + [ $max -eq 0 ] && return + echo "$max" +} + +# Find all rules matching a key (with action) and a pattern. +find_all_rules() { + local key="$1" + local linkre="$2" + local match="$3" + + local search='.*[[:space:],]'"$key"'"('"$linkre"')".*' + echo $(sed -n -r -e 's/^#.*//' -e "${match}s/${search}/\1/p" \ + $RO_RULES_FILE \ + $([ -e $RULES_FILE ] && echo $RULES_FILE) \ + 2>/dev/null) +} diff --git a/overlay-persistent-net/etc/udev/rules.d/73-usb-net-by-mac.rules b/overlay-persistent-net/etc/udev/rules.d/73-usb-net-by-mac.rules new file mode 100644 index 00000000..e69de29b diff --git a/overlay-persistent-net/etc/udev/rules.d/75-net-description.rules b/overlay-persistent-net/etc/udev/rules.d/75-net-description.rules new file mode 100644 index 00000000..e69de29b diff --git a/overlay-persistent-net/etc/udev/rules.d/75-persistent-net-generator.rules b/overlay-persistent-net/etc/udev/rules.d/75-persistent-net-generator.rules new file mode 100644 index 00000000..13551cfb --- /dev/null +++ b/overlay-persistent-net/etc/udev/rules.d/75-persistent-net-generator.rules @@ -0,0 +1,143 @@ +# These rules generate rules to keep network interface names unchanged +# across reboots and write them to /etc/udev/rules.d/70-persistent-net.rules. + +# variables used to communicate: +# MATCHADDR MAC address used for the match +# MATCHID bus_id used for the match +# MATCHDRV driver name used for the match +# MATCHIFTYPE interface type match +# COMMENT comment to add to the generated rule +# INTERFACE_NAME requested name supplied by external tool +# INTERFACE_NEW new interface name returned by rule writer + +ACTION!="add", GOTO="persistent_net_generator_end" +SUBSYSTEM!="net", GOTO="persistent_net_generator_end" + +# ignore the interface if a name has already been set +NAME=="?*", GOTO="persistent_net_generator_end" + +# new predictable network interface naming scheme +# http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ +#IMPORT{cmdline}="net.ifnames" +#ENV{net.ifnames}=="1", GOTO="persistent_net_generator_end" + +# device name whitelist +KERNEL!="eth*|ath*|wlan*[0-9]|msh*|ra*|sta*|ctc*|lcs*|hsi*", \ + GOTO="persistent_net_generator_end" + +# ignore Xen virtual interfaces +SUBSYSTEMS=="xen", GOTO="persistent_net_generator_end" + +# ignore UML virtual interfaces +DRIVERS=="uml-netdev", GOTO="persistent_net_generator_end" + +# ignore "secondary" raw interfaces of the madwifi driver +KERNEL=="ath*", ATTRS{type}=="802", GOTO="persistent_net_generator_end" + +# ignore "secondary" monitor interfaces of mac80211 drivers +KERNEL=="wlan*", ATTRS{type}=="803", GOTO="persistent_net_generator_end" + +# by default match on the MAC address and interface type +ENV{MATCHADDR}="$attr{address}" +ENV{MATCHIFTYPE}="$attr{type}" + +# match interface dev_id +ATTR{dev_id}=="?*", ENV{MATCHDEVID}="$attr{dev_id}" + +# These vendors are known to violate the local MAC address assignment scheme +# Interlan, DEC (UNIBUS or QBUS), Apollo, Cisco, Racal-Datacom +ENV{MATCHADDR}=="02:07:01:*", GOTO="globally_administered_whitelist" +# 3Com +ENV{MATCHADDR}=="02:60:60:*", GOTO="globally_administered_whitelist" +# 3Com IBM PC; Imagen; Valid; Cisco; Apple +ENV{MATCHADDR}=="02:60:8c:*", GOTO="globally_administered_whitelist" +# Intel +ENV{MATCHADDR}=="02:a0:c9:*", GOTO="globally_administered_whitelist" +# Olivetti +ENV{MATCHADDR}=="02:aa:3c:*", GOTO="globally_administered_whitelist" +# CMC Masscomp; Silicon Graphics; Prime EXL +ENV{MATCHADDR}=="02:cf:1f:*", GOTO="globally_administered_whitelist" +# Prominet Corporation Gigabit Ethernet Switch +ENV{MATCHADDR}=="02:e0:3b:*", GOTO="globally_administered_whitelist" +# BTI (Bus-Tech, Inc.) IBM Mainframes +ENV{MATCHADDR}=="02:e6:d3:*", GOTO="globally_administered_whitelist" +# Novell 2000 +ENV{MATCHADDR}=="52:54:4c:*", GOTO="globally_administered_whitelist" +# Realtec +ENV{MATCHADDR}=="52:54:ab:*", GOTO="globally_administered_whitelist" +# Kingston Technologies +ENV{MATCHADDR}=="e2:0c:0f:*", GOTO="globally_administered_whitelist" + + +# ignore interfaces with locally administered or null MAC addresses +# and VMWare, Hyper-V, KVM, Virtualbox and Xen virtual interfaces +ENV{MATCHADDR}=="?[2367abef]:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:00:00:00:00:00", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:0c:29:*|00:50:56:*|00:05:69:*|00:1C:14:*", \ + ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:15:5d:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="52:54:00:*|54:52:00:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="08:00:27:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:16:3e:*", ENV{MATCHADDR}="" + +# ignore Windows Azure Hyper-V virtual interfaces +ENV{MATCHADDR}=="00:03:ff:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:0d:3a:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:1d:d8:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:12:5a:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:17:fa:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:22:48:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:25:ae:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="00:50:f2:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="28:18:78:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="50:1a:c5:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="60:45:bd:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="7c:1e:52:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="7c:ed:8d:*", ENV{MATCHADDR}="" +ENV{MATCHADDR}=="dc:b4:c4:*", ENV{MATCHADDR}="" + +# ignore Ravello virtual interfaces +ENV{MATCHADDR}=="2c:c2:60:*", ENV{MATCHADDR}="" + +LABEL="globally_administered_whitelist" + +# ibmveth interfaces have stable locally administered MAC addresses +SUBSYSTEMS=="ibmveth", ENV{MATCHADDR}="$attr{address}" + +# S/390 interfaces are matched only by id +SUBSYSTEMS=="ccwgroup", \ + ENV{MATCHDRV}="$driver", ENV{MATCHID}="$id", \ + ENV{MATCHADDR}="", ENV{MATCHDEVID}="" + +# terminate processing if there are not enough conditions to create a rule +ENV{MATCHADDR}=="", ENV{MATCHID}=="", ENV{INTERFACE_NAME}=="", \ + GOTO="persistent_net_generator_end" + + +# provide nice comments for the generated rules +SUBSYSTEMS=="pci", \ + ENV{COMMENT}="PCI device $attr{vendor}:$attr{device}" +SUBSYSTEMS=="pcmcia", \ + ENV{COMMENT}="PCMCIA device $attr{card_id}:$attr{manf_id}" +SUBSYSTEMS=="usb", \ + ENV{COMMENT}="USB device 0x$attr{idVendor}:0x$attr{idProduct}" +SUBSYSTEMS=="ccwgroup", \ + ENV{COMMENT}="S/390 device at $id" +SUBSYSTEMS=="ibmveth", \ + ENV{COMMENT}="LPAR virtual device at $id" +SUBSYSTEMS=="ieee1394", \ + ENV{COMMENT}="Firewire device $attr{host_id}" +ENV{COMMENT}=="", \ + ENV{COMMENT}="Unknown $env{SUBSYSTEM} device ($env{DEVPATH})" +ATTRS{driver}=="?*", \ + ENV{COMMENT}="$env{COMMENT} ($attr{driver})" + +# ignore interfaces without a driver link like bridges and VLANs, otherwise +# generate and write the rule +DRIVERS=="?*", IMPORT{program}="write_net_rules" + +# rename the interface if requested +ENV{INTERFACE_NEW}=="?*", NAME="$env{INTERFACE_NEW}" + +LABEL="persistent_net_generator_end" + diff --git a/overlay-persistent-net/etc/udev/udev-finish b/overlay-persistent-net/etc/udev/udev-finish new file mode 100755 index 00000000..85e3c720 --- /dev/null +++ b/overlay-persistent-net/etc/udev/udev-finish @@ -0,0 +1,9 @@ +#!/bin/sh -e + +# Copy any rules generated while the root filesystem was read-only +for file in /run/udev/tmp-rules--*; do + [ -e "$file" ] || continue + cat "$file" >> "/etc/udev/rules.d/${file##*tmp-rules--}" + rm -f "$file" +done + diff --git a/overlay-persistent-net/etc/udev/write_net_rules b/overlay-persistent-net/etc/udev/write_net_rules new file mode 100755 index 00000000..fedc0f1e --- /dev/null +++ b/overlay-persistent-net/etc/udev/write_net_rules @@ -0,0 +1,152 @@ +#!/bin/sh -e + +# This script is run to create persistent network device naming rules +# based on properties of the device. +# If the interface needs to be renamed, INTERFACE_NEW=<name> will be printed +# on stdout to allow udev to IMPORT it. + +# variables used to communicate: +# MATCHADDR MAC address used for the match +# MATCHID bus_id used for the match +# MATCHDEVID dev_id used for the match +# MATCHDRV driver name used for the match +# MATCHIFTYPE interface type match +# COMMENT comment to add to the generated rule +# INTERFACE_NAME requested name supplied by external tool +# INTERFACE_NEW new interface name returned by rule writer + +# Copyright (C) 2006 Marco d'Itri <md@xxxxxxxx> +# Copyright (C) 2007 Kay Sievers <kay.sievers@xxxxxxxx> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# debug, if UDEV_LOG=<debug> +if [ -n "$UDEV_LOG" ]; then + if [ "$UDEV_LOG" -ge 7 ]; then + set -x + fi +fi + +RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules' + +. /lib/udev/rule_generator.functions + +interface_name_taken() { + local value="$(find_all_rules 'NAME=' $INTERFACE)" + if [ "$value" ]; then + return 0 + else + return 1 + fi +} + +find_next_available() { + raw_find_next_available "$(find_all_rules 'NAME=' "$1")" +} + +write_rule() { + local match="$1" + local name="$2" + local comment="$3" + + { + if [ "$PRINT_HEADER" ]; then + PRINT_HEADER= + echo "# This file was automatically generated by the $0" + echo "# program, run by the persistent-net-generator.rules rules file." + echo "#" + echo "# You can modify it, as long as you keep each rule on a single" + echo "# line, and change only the value of the NAME= key." + fi + + echo "" + [ "$comment" ] && echo "# $comment" + echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\"" + } >> $RULES_FILE +} + +if [ -z "$INTERFACE" ]; then + echo "missing \$INTERFACE" >&2 + exit 1 +fi + +# Prevent concurrent processes from modifying the file at the same time. +lock_rules_file + +# Check if the rules file is writeable. +choose_rules_file + +# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces +if [ "$MATCHADDR" ]; then + match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\"" +fi + +if [ "$MATCHDRV" ]; then + match="$match, DRIVERS==\"$MATCHDRV\"" +fi + +if [ "$MATCHDEVID" ]; then + match="$match, ATTR{dev_id}==\"$MATCHDEVID\"" +fi + +if [ "$MATCHID" ]; then + match="$match, KERNELS==\"$MATCHID\"" +fi + +if [ "$MATCHIFTYPE" ]; then + match="$match, ATTR{type}==\"$MATCHIFTYPE\"" +fi + +if [ -z "$match" ]; then + echo "missing valid match" >&2 + unlock_rules_file + exit 1 +fi + +basename=${INTERFACE%%[0-9]*} +match="$match, KERNEL==\"$basename*\"" + +# build a regular expression that matches the new rule that we want to write +new_rule_pattern=$(echo "^SUBSYSTEM==\"net\", ACTION==\"add\"$match" | sed -re 's/([\?\*\{\}])/\\\1/g') + +# Double check if the new rule has already been written. This happens if +# multiple add events are generated before the script returns and udevd +# renames the interfaces. See #765577 for details. +if egrep -qs "$new_rule_pattern" $RO_RULES_FILE $RULES_FILE; then + unlock_rules_file + exit 0 +fi + +if [ "$INTERFACE_NAME" ]; then + # external tools may request a custom name + COMMENT="$COMMENT (custom name provided by external tool)" + if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then + INTERFACE=$INTERFACE_NAME; + echo "INTERFACE_NEW=$INTERFACE" + fi +else + # if a rule using the current name already exists, find a new name + if interface_name_taken; then + INTERFACE="$basename$(find_next_available "$basename[0-9]*")" + # prevent INTERFACE from being "eth" instead of "eth0" + [ "$INTERFACE" = "${INTERFACE%%[ \[\]0-9]*}" ] && INTERFACE=${INTERFACE}0 + echo "INTERFACE_NEW=$INTERFACE" + fi +fi + +write_rule "$match" "$INTERFACE" "$COMMENT" + +unlock_rules_file + +exit 0 diff --git a/overlay-persistent-net/lib/udev/rule_generator.functions b/overlay-persistent-net/lib/udev/rule_generator.functions new file mode 120000 index 00000000..3b225ebf --- /dev/null +++ b/overlay-persistent-net/lib/udev/rule_generator.functions @@ -0,0 +1 @@ +/etc/udev/rule_generator.functions \ No newline at end of file diff --git a/overlay-persistent-net/lib/udev/udev-finish b/overlay-persistent-net/lib/udev/udev-finish new file mode 120000 index 00000000..2c2e3042 --- /dev/null +++ b/overlay-persistent-net/lib/udev/udev-finish @@ -0,0 +1 @@ +/etc/udev/udev-finish \ No newline at end of file diff --git a/overlay-persistent-net/lib/udev/write_net_rules b/overlay-persistent-net/lib/udev/write_net_rules new file mode 120000 index 00000000..bfe37cc3 --- /dev/null +++ b/overlay-persistent-net/lib/udev/write_net_rules @@ -0,0 +1 @@ +/etc/udev/write_net_rules \ No newline at end of file -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |