File: write_net_rules

package info (click to toggle)
udev 0.105-4etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 672 kB
  • ctags: 54
  • sloc: sh: 1,636; makefile: 273
file content (136 lines) | stat: -rw-r--r-- 3,477 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/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>
#
# 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.

RULES_FILE='/etc/udev/rules.d/z25_persistent-net.rules'

. /lib/udev/hotplug.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, probably 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 line."
    echo "# MAC addresses must be written in lowercase."
  fi

  echo ""
  [ "$comment" ] && echo "# $comment"
  echo "SUBSYSTEM==\"net\", $match, NAME=\"$name\""
  } >> $RULES_FILE
}

write_all_rules() {
  cd /sys/class/net/ || return 0

  for INTERFACE in *; do
    case $INTERFACE in
    eth*|ath*|wlan*|ra*|sta*) ;;
    *) continue ;;
    esac

    INTERFACE="$INTERFACE" DEVPATH="/class/net/$INTERFACE" \
      /lib/udev/write_net_rules || true
  done
}

##############################################################################
# can be used only if $RULES_FILE is empty
if [ "$1" = "all_interfaces" ]; then
  if [ -e $RULES_FILE ]; then
    printf "$RULES_FILE exists, persistent interface names\nnot saved.\n" >&2
    exit 0
  fi

  if [ ! -e /sys/class/net/ ]; then
    echo "/sys/class/net/ is not available, persistent interface names not saved." >&2
    exit 0
  fi

  write_all_rules
  exit 0
fi

if [ -z "$INTERFACE" ]; then
  echo "Missing \$INTERFACE." >&2
  exit 1
fi

if [ "$1" ]; then
  MAC_ADDR="$1"
else
  MAC_ADDR=$(sysread address)
fi

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

# 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
fi

# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
match="DRIVERS==\"?*\", ATTRS{address}==\"$MAC_ADDR\""
if [ $basename = "ath" -o $basename = "wlan" ]; then
  match="$match, ATTRS{type}==\"1\"" # do not match the wifi* interfaces
fi

write_rule "$match" "$INTERFACE" "$COMMENT"

unlock_rules_file

exit 0