#!/bin/bash # **** License **** # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # 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. # # This code was originally developed by Vyatta, Inc. # Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc. # All Rights Reserved. # # Author: Tom Grennan # Description: search Vyatta config for interface name given address # # **** End License **** progname=${0##*/} debug= match= attr_address=0:0:0:0:0:0 declare -i ethn=0 last_ethn=0 test -r /etc/default/vyatta && source /etc/default/vyatta # process command line variable overrides for arg ; do case "$arg" in --debug ) debug=echo ;; --*=* ) arg=${arg#--} eval ${arg%=*}=\"${arg#*=}\" ;; *=* ) eval ${arg%=*}=\"${arg#*=}\" ;; *:*:*:*:*:* ) attr_address=$arg ;; * ) kname=$arg ;; esac done : ${vyatta_prefix:=/opt/vyatta} : ${vyatta_sbindir:=${vyatta_prefix}/sbin} : ${vyatta_sysconfdir:=${vyatta_prefix}/etc} : ${BOOTFILE:=${vyatta_sysconfdir:-/opt/vyatta/etc}/config/config.boot} : ${DEFAULT_BOOTFILE:=${vyatta_sysconfdir:-/opt/vyatta/etc}/config.boot.default} if [ ! -f $BOOTFILE ] ; then cp $DEFAULT_BOOTFILE $BOOTFILE chgrp vyattacfg $BOOTFILE chmod 660 $BOOTFILE fi shopt -s extglob nullglob # load cfg_eth_hwid array from config file as follows # interface { # ... # ethernet eth# { # ... # hw-id XX:XX:XX:XX:XX:XX # ... # } # } # # cfg_eth_hwid=( "eth#=xx:xx:xx:xx:xx:xx" ... ) declare -a cfg_net_hwid=( $( sed -ne ' /^interfaces {/,/^}/ { /^ *ethernet eth[0-9]* {/,/^ $/ { /^ *ethernet/ { s/.* eth\([0-9]\+\) {$/ eth\1=/ # hold interface name h } /^.*hw-id:\?/ { # translate field name s/.*hw-id:\? *// # tolower hex mac address y/ABCDEF/abcdef/ # exchange hold and pattern space x # concatenate hold and pattern G s/\n//p } } }' $BOOTFILE )) finish () { local cmd=$1 name=$2 address=$3 echo $name touch /tmp/${progname}_${cmd}_${name}_${address} &> /dev/null exit $? } for name_hwid in ${cfg_net_hwid[@]} ; do name=${name_hwid%=*} hwid=${name_hwid#*=} ethn=${name/eth/} [[ $ethn -gt $last_ethn ]] && \ last_ethn=$ethn if [ "$hwid" == "$attr_address" ] ; then # we mod the config file interface sub-clock in case it is missing finish mod $name $attr_address fi [ "$name" == "$kname" ] && \ match=$name_hwid done [ -z "$kname" ] && \ exit 1 # have not found matching hwid in config, see if we can use kernel name if [ -z "$match" ] ; then # the kernel interface name isnot in config # so, we might as well use it finish add $kname $attr_address elif [ -z "${match#*=}" ] ; then # the config has this interface but the sub-block is missing the hwid # so again, we might as well use the kernel name finish mod $kname $attr_address else # The device mac address is not in the config but the config # has another hwid associated with the device name. This # indicates that the device is either a replacement or new but # detected earlier than the device configured with this name. # Since this is non-deterministic, we make a new name. (( ethn = last_ethn + 1 )) finish add eth$ethn $attr_address fi # Local Variables: # mode: shell-script # sh-indentation: 4 # End: