199ca880aSopenharmony_ci#!/bin/sh -e 299ca880aSopenharmony_ci 399ca880aSopenharmony_ci# This script is run to create persistent network device naming rules 499ca880aSopenharmony_ci# based on properties of the device. 599ca880aSopenharmony_ci# If the interface needs to be renamed, INTERFACE_NEW=<name> will be printed 699ca880aSopenharmony_ci# on stdout to allow udev to IMPORT it. 799ca880aSopenharmony_ci 899ca880aSopenharmony_ci# variables used to communicate: 999ca880aSopenharmony_ci# MATCHADDR MAC address used for the match 1099ca880aSopenharmony_ci# MATCHID bus_id used for the match 1199ca880aSopenharmony_ci# MATCHDEVID dev_id used for the match 1299ca880aSopenharmony_ci# MATCHDRV driver name used for the match 1399ca880aSopenharmony_ci# MATCHIFTYPE interface type match 1499ca880aSopenharmony_ci# COMMENT comment to add to the generated rule 1599ca880aSopenharmony_ci# INTERFACE_NAME requested name supplied by external tool 1699ca880aSopenharmony_ci# INTERFACE_NEW new interface name returned by rule writer 1799ca880aSopenharmony_ci 1899ca880aSopenharmony_ci# Copyright (C) 2006 Marco d'Itri <md@Linux.IT> 1999ca880aSopenharmony_ci# Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org> 2099ca880aSopenharmony_ci# 2199ca880aSopenharmony_ci# This program is free software: you can redistribute it and/or modify 2299ca880aSopenharmony_ci# it under the terms of the GNU General Public License as published by 2399ca880aSopenharmony_ci# the Free Software Foundation, either version 2 of the License, or 2499ca880aSopenharmony_ci# (at your option) any later version. 2599ca880aSopenharmony_ci# 2699ca880aSopenharmony_ci# This program is distributed in the hope that it will be useful, 2799ca880aSopenharmony_ci# but WITHOUT ANY WARRANTY; without even the implied warranty of 2899ca880aSopenharmony_ci# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2999ca880aSopenharmony_ci# GNU General Public License for more details. 3099ca880aSopenharmony_ci# 3199ca880aSopenharmony_ci# You should have received a copy of the GNU General Public License 3299ca880aSopenharmony_ci# along with this program. If not, see <http://www.gnu.org/licenses/>. 3399ca880aSopenharmony_ci 3499ca880aSopenharmony_ciRULES_FILE='${prefix}/etc/udev/rules.d/70-persistent-net.rules' 3599ca880aSopenharmony_ci 3699ca880aSopenharmony_ci. ${exec_prefix}/lib/udev/rule_generator.functions 3799ca880aSopenharmony_ci 3899ca880aSopenharmony_ciinterface_name_taken() { 3999ca880aSopenharmony_ci local value="$(find_all_rules 'NAME=' $INTERFACE)" 4099ca880aSopenharmony_ci if [ "$value" ]; then 4199ca880aSopenharmony_ci return 0 4299ca880aSopenharmony_ci else 4399ca880aSopenharmony_ci return 1 4499ca880aSopenharmony_ci fi 4599ca880aSopenharmony_ci} 4699ca880aSopenharmony_ci 4799ca880aSopenharmony_cifind_next_available() { 4899ca880aSopenharmony_ci raw_find_next_available "$(find_all_rules 'NAME=' "$1")" 4999ca880aSopenharmony_ci} 5099ca880aSopenharmony_ci 5199ca880aSopenharmony_ciwrite_rule() { 5299ca880aSopenharmony_ci local match="$1" 5399ca880aSopenharmony_ci local name="$2" 5499ca880aSopenharmony_ci local comment="$3" 5599ca880aSopenharmony_ci 5699ca880aSopenharmony_ci { 5799ca880aSopenharmony_ci if [ "$PRINT_HEADER" ]; then 5899ca880aSopenharmony_ci PRINT_HEADER= 5999ca880aSopenharmony_ci echo "# This file was automatically generated by the $0" 6099ca880aSopenharmony_ci echo "# program, run by the persistent-net-generator.rules rules file." 6199ca880aSopenharmony_ci echo "#" 6299ca880aSopenharmony_ci echo "# You can modify it, as long as you keep each rule on a single" 6399ca880aSopenharmony_ci echo "# line, and change only the value of the NAME= key." 6499ca880aSopenharmony_ci fi 6599ca880aSopenharmony_ci 6699ca880aSopenharmony_ci echo "" 6799ca880aSopenharmony_ci [ "$comment" ] && echo "# $comment" 6899ca880aSopenharmony_ci echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\"" 6999ca880aSopenharmony_ci } >> $RULES_FILE 7099ca880aSopenharmony_ci} 7199ca880aSopenharmony_ci 7299ca880aSopenharmony_ciif [ -z "$INTERFACE" ]; then 7399ca880aSopenharmony_ci echo "missing \$INTERFACE" >&2 7499ca880aSopenharmony_ci exit 1 7599ca880aSopenharmony_cifi 7699ca880aSopenharmony_ci 7799ca880aSopenharmony_ci# Prevent concurrent processes from modifying the file at the same time. 7899ca880aSopenharmony_cilock_rules_file 7999ca880aSopenharmony_ci 8099ca880aSopenharmony_ci# Check if the rules file is writeable. 8199ca880aSopenharmony_cichoose_rules_file 8299ca880aSopenharmony_ci 8399ca880aSopenharmony_ci# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces 8499ca880aSopenharmony_ciif [ "$MATCHADDR" ]; then 8599ca880aSopenharmony_ci match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\"" 8699ca880aSopenharmony_cifi 8799ca880aSopenharmony_ci 8899ca880aSopenharmony_ciif [ "$MATCHDRV" ]; then 8999ca880aSopenharmony_ci match="$match, DRIVERS==\"$MATCHDRV\"" 9099ca880aSopenharmony_cifi 9199ca880aSopenharmony_ci 9299ca880aSopenharmony_ciif [ "$MATCHDEVID" ]; then 9399ca880aSopenharmony_ci match="$match, ATTR{dev_id}==\"$MATCHDEVID\"" 9499ca880aSopenharmony_cifi 9599ca880aSopenharmony_ci 9699ca880aSopenharmony_ciif [ "$MATCHID" ]; then 9799ca880aSopenharmony_ci match="$match, KERNELS==\"$MATCHID\"" 9899ca880aSopenharmony_cifi 9999ca880aSopenharmony_ci 10099ca880aSopenharmony_ciif [ "$MATCHIFTYPE" ]; then 10199ca880aSopenharmony_ci match="$match, ATTR{type}==\"$MATCHIFTYPE\"" 10299ca880aSopenharmony_cifi 10399ca880aSopenharmony_ci 10499ca880aSopenharmony_ciif [ -z "$match" ]; then 10599ca880aSopenharmony_ci echo "missing valid match" >&2 10699ca880aSopenharmony_ci unlock_rules_file 10799ca880aSopenharmony_ci exit 1 10899ca880aSopenharmony_cifi 10999ca880aSopenharmony_ci 11099ca880aSopenharmony_cibasename=${INTERFACE%%[0-9]*} 11199ca880aSopenharmony_cimatch="$match, KERNEL==\"$basename*\"" 11299ca880aSopenharmony_ci 11399ca880aSopenharmony_ciif [ "$INTERFACE_NAME" ]; then 11499ca880aSopenharmony_ci # external tools may request a custom name 11599ca880aSopenharmony_ci COMMENT="$COMMENT (custom name provided by external tool)" 11699ca880aSopenharmony_ci if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then 11799ca880aSopenharmony_ci INTERFACE=$INTERFACE_NAME; 11899ca880aSopenharmony_ci echo "INTERFACE_NEW=$INTERFACE" 11999ca880aSopenharmony_ci fi 12099ca880aSopenharmony_cielse 12199ca880aSopenharmony_ci # if a rule using the current name already exists, find a new name 12299ca880aSopenharmony_ci if interface_name_taken; then 12399ca880aSopenharmony_ci INTERFACE="$basename$(find_next_available "$basename[0-9]*")" 12499ca880aSopenharmony_ci # prevent INTERFACE from being "eth" instead of "eth0" 12599ca880aSopenharmony_ci [ "$INTERFACE" = "${INTERFACE%%[ \[\]0-9]*}" ] && INTERFACE=${INTERFACE}0 12699ca880aSopenharmony_ci echo "INTERFACE_NEW=$INTERFACE" 12799ca880aSopenharmony_ci fi 12899ca880aSopenharmony_cifi 12999ca880aSopenharmony_ci 13099ca880aSopenharmony_ciwrite_rule "$match" "$INTERFACE" "$COMMENT" 13199ca880aSopenharmony_ci 13299ca880aSopenharmony_ciunlock_rules_file 13399ca880aSopenharmony_ci 13499ca880aSopenharmony_ciexit 0 135