[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.