rule_generator: move all policy from write_net_rules to the rules file

This commit is contained in:
Kay Sievers
2007-09-21 17:42:46 +02:00
parent b317b96c15
commit c746922ca2
2 changed files with 84 additions and 78 deletions
@@ -1,33 +1,56 @@
# do not edit this file, it will be overwritten on update
# these rules generate rules for persistent network device naming
#
# 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"
# device name whitelist
KERNEL!="eth*|ath*|wlan*|ra*|sta*|ctc*|lcs*|hsi*", GOTO="persistent_net_generator_end"
# ignore the interface if a name has already been set
NAME=="?*", GOTO="persistent_net_generator_end"
# device name whitelist
KERNEL!="eth*|ath*|wlan*[0-9]|ra*|sta*|ctc*|lcs*|hsi*", GOTO="persistent_net_generator_end"
# add interface type match for some devices
KERNEL=="wlan*|ath*", ENV{MATCHIFTYPE}="1"
# ignore Xen virtual interfaces
SUBSYSTEMS=="xen", GOTO="persistent_net_generator_end"
# build device description string to add a comment to the generated rule
# read MAC address
ENV{MATCHADDR}="$attr{address}"
# do not use "locally administered" MAC address
ENV{MATCHADDR}=="?[2367abef]:*", ENV{MATCHADDR}=""
# do not use empty address
ENV{MATCHADDR}=="00:00:00:00:00:00", ENV{MATCHADDR}=""
# build comment line for generated rule:
SUBSYSTEMS=="pci", ENV{COMMENT}="PCI device $attr{vendor}:$attr{device} ($driver)"
SUBSYSTEMS=="usb", ENV{COMMENT}="USB device 0x$attr{idVendor}:0x$attr{idProduct} ($driver)"
SUBSYSTEMS=="pcmcia", ENV{COMMENT}="PCMCIA device $attr{card_id}:$attr{manf_id} ($driver)"
SUBSYSTEMS=="ccwgroup", ENV{COMMENT}="S/390 $driver device at $id", ENV{NETDEV}="$id", ENV{NETDRV}="$driver"
SUBSYSTEMS=="ieee1394", ENV{COMMENT}="Firewire device $attr{host_id})"
ENV{COMMENT}=="", ENV{COMMENT}="$env{SUBSYSTEM} device ($driver)"
DRIVERS=="?*", ENV{NETDEV}=="?*", IMPORT{program}="write_net_rules --driver $env{NETDRV} --id $env{NETDEV}"
# S/390 uses id matches only, do not use MAC address match
SUBSYSTEMS=="ccwgroup", ENV{COMMENT}="S/390 $driver device at $id", ENV{MATCHID}="$id", ENV{MATCHDRV}="$driver", ENV{MATCHADDR}=""
# skip "locally administered" MAC addresses
ATTR{address}=="?[2367abef]:*", GOTO="persistent_net_generator_end"
# default comment
ENV{COMMENT}=="", ENV{COMMENT}="$env{SUBSYSTEM} device"
DRIVERS=="?*", ENV{NETDEV}!="?*", IMPORT{program}="write_net_rules $attr{address}"
# write rule
DRIVERS=="?*", IMPORT{program}="write_net_rules"
# rename interface if needed
ENV{INTERFACE_NEW}=="?*", NAME="$env{INTERFACE_NEW}"
LABEL="persistent_net_generator_end"
+51 -68
View File
@@ -1,20 +1,25 @@
#!/bin/sh -e
#
# This script is run if the interface (recognized by its MAC address) lacks
# a rule for persistent naming.
#
# If there is already a persistent rule with that interface name then the
# current interface needs to be renamed.
#
# If the interface needs to be renamed, a NAME=value pair will be printed
# on stdout to allow udev to IMPORT it. Then a rule for the MAC address and
# interface name is written.
#
# (C) 2006 Marco d'Itri <md@Linux.IT>
# Copyright (C) 2006 Marco d'Itri <md@Linux.IT>
# Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org>
#
# 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 version 2 of the License.
#
# 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
# 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
RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules'
@@ -49,78 +54,57 @@ write_rule() {
echo ""
[ "$comment" ] && echo "# $comment"
echo "SUBSYSTEM==\"net\", $match, NAME=\"$name\""
echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\""
} >> $RULES_FILE
}
if [ -z "$INTERFACE" ]; then
echo "Missing \$INTERFACE." >&2
echo "missing \$INTERFACE" >&2
exit 1
fi
if [ "$1" ]; then
while [ "$*" ] ; do
case $1 in
--mac)
shift
MAC_ADDR=$1
shift
;;
--driver)
shift
DRIVER=$1
shift
;;
--id)
shift
ID=$1
shift
;;
*)
MAC_ADDR=$1
shift
;;
esac
done
else
MAC_ADDR=$(sysread address)
fi
if [ -z "$DRIVER" ] && [ -z "$ID" ] ; then
if [ -z "$MAC_ADDR" ]; then
echo "No MAC address for $INTERFACE." >&2
exit 1
fi
if [ "$MAC_ADDR" = "00:00:00:00:00:00" ]; then
echo "NULL MAC address for $INTERFACE." >&2
exit 1
fi
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
# If a rule using the current name already exists then find a new name and
# report it to udev which will rename the interface.
basename=${INTERFACE%%[0-9]*}
if interface_name_taken; then
INTERFACE="$basename$(find_next_available "$basename[0-9]*")"
if [ ! -t 1 ]; then
echo "INTERFACE_NEW=$INTERFACE"
fi
# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
if [ "$MATCHADDR" ]; then
match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\""
fi
# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
if [ "$MAC_ADDR" ] ; then
match="DRIVERS==\"?*\", ATTR{address}==\"$MAC_ADDR\""
else
match="DRIVERS==\"$DRIVER\", KERNELS==\"$ID\""
if [ "$MATCHDRV" ]; then
match="$match, DRIVERS==\"$MATCHDRV\""
fi
if [ $basename = "ath" -o $basename = "wlan" ]; then
match="$match, ATTR{type}==\"1\"" # do not match the wifi* interfaces
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
exit 1
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
basename=${INTERFACE%%[0-9]*}
if interface_name_taken; then
INTERFACE="$basename$(find_next_available "$basename[0-9]*")"
echo "INTERFACE_NEW=$INTERFACE"
fi
fi
write_rule "$match" "$INTERFACE" "$COMMENT"
@@ -128,4 +112,3 @@ write_rule "$match" "$INTERFACE" "$COMMENT"
unlock_rules_file
exit 0