chiark / gitweb /
rule_generator: move all policy from write_net_rules to the rules file
authorKay Sievers <kay.sievers@vrfy.org>
Fri, 21 Sep 2007 15:42:46 +0000 (17:42 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Fri, 21 Sep 2007 15:42:46 +0000 (17:42 +0200)
extras/rule_generator/75-persistent-net-generator.rules
extras/rule_generator/write_net_rules

index f88627d..d09bc38 100644 (file)
@@ -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}=""
+
+# default comment
+ENV{COMMENT}=="", ENV{COMMENT}="$env{SUBSYSTEM} device"
 
-# skip "locally administered" MAC addresses
-ATTR{address}=="?[2367abef]:*", GOTO="persistent_net_generator_end"
+# write rule
+DRIVERS=="?*", IMPORT{program}="write_net_rules"
 
-DRIVERS=="?*", ENV{NETDEV}!="?*", IMPORT{program}="write_net_rules $attr{address}"
+# rename interface if needed
 ENV{INTERFACE_NEW}=="?*", NAME="$env{INTERFACE_NEW}"
 
 LABEL="persistent_net_generator_end"
index 62acb88..b25ecfd 100644 (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 [ "$MATCHID" ]; then
+       match="$match, KERNELS==\"$MATCHID\""
+fi
+
+if [ "$MATCHIFTYPE" ]; then
+       match="$match, ATTR{type}==\"$MATCHIFTYPE\""
 fi
-if [ $basename = "ath" -o $basename = "wlan" ]; then
-       match="$match, ATTR{type}==\"1\"" # do not match the wifi* interfaces
+
+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
-