0x1af4
  "   l4(TmJq@qn1hh      0x8086
  #   la?Jƚ*bѿ 0    #!/bin/bash

#
# configures aliases of device $1
#
# This script goes out of its way to arrive at the configuration of ip
# aliases described in the ifcfg-$DEV:* and ifcfg-$DEV-range* files from
# whatever existing configuration it may be given: existing aliases not
# specified in the configuration will be removed, netmasks and broadcast
# addrs will be updated on existing aliases, and new aliases will be setup.
#
#   range specification files:
#
# One can specify ranges of alised ipaddress using ifcfg-$DEV-range* files.
# Specify multiple ranges using multiple files, such as ifcfg-eth0-range0 and
# ifcfg-eth0-range1, etc. In these files, the following configuration variables 
# specify the range:
#
#    IPADDR_START    -- ipaddr to start range at. eg "192.168.30.1"
#    IPADDR_END      -- ipaddr to end range at. eg "192.168.30.254"
#    CLONENUM_START  -- interface clone number to start using for this range. eg "0"
#
# The above example values create the interfaces eth0:0 through eth0:253 using
# ipaddrs 192.168.30.1 through 192.168.30.254, inclusive.
#
# Other configuration variables such as NETMASK and BROADCAST may be specified
# in the range file and will apply to all of the ipaddresses in the range. Range
# files also inherit configuration from the ifcfg-$DEV file just like normal.
#
# Note that IPADDR_START and IPADR_END are required to be in the same class-c
# block. I.e. IPADDR_START=192.168.30.1 and IPADDR_END=192.168.31.255 is
# not valid.
#
#   speed with large sets of interfaces:
#
# Considerable effort was spent making this script fast. It can efficiently 
# handle a thousand ip aliases on one interface.
# 
# With large sets of ipaddresses the NO_ALIASROUTING=yes configuration is
# highly recommended. (This can be specified in ifcfg-$DEV and inherited.) This
# prevents this script from setting up routing details for the virtual
# interfaces, which I don't think is needed, because outgoing traffic can use the
# main interface. However, make your own conclusions on what you need.
# 
# My test setup of four class C address blocks on a P166 took 25 seconds of 
# which 16 seconds of this was spent in the ifcconfig calls. Without the 
# NO_ALIASROUTING=yes config an additional 12 seconds is spent in route calls.
#
#   notes on internals:
#
# This script uses the bash "eval" command to lookup shell variables with names
# which are generated from other shell variables. This allows us to, in effect,
# create hashes using the shell variable namesspace by just including the hash
# key in the name of the variable.
#
# This script originally written by: David Harris <dharris@drh.net> 
#                                    Principal Engineer, DRH Internet
#                                    June 30, 1999
#
#            modified by: Bill Nottingham <notting@redhat.com>

TEXTDOMAIN=initscripts
TEXTDOMAINDIR=/etc/locale

device=$1
if [ "$device" = "" ]; then
  echo $"usage: ifup-aliases <net-device> [<parent-config>]\n"
  exit 1
fi

PARENTCONFIG=${2:-ifcfg-$device}
parent_device=$device

cd /etc/sysconfig/network-scripts  
. ./network-functions

# Grab the current configuration of any running aliases, place device info
# into variables of the form:
# rdev_<index>_addr = <ip address>
# rdev_<index>_pb = <prefix>_<broadcast>
# rdevip_<ipaddress> = <index>
# Example:
# rdev_0_addr=192.168.1.1
# rdev_0_pb=24_192.16.1.255
# rdevip_192_168_1_1=0
#
# A list of all the devices is created in rdev_LIST.

eval $( ip addr show $device label $device:* | \
    awk 'BEGIN { COUNT=0;LAST_DEV="" } /inet / {
        # Split IP address into address/prefix
        split($2,IPADDR,"/");
        # Create A_B_C_D IP address form
        IP_ADDR=IPADDR[1];
        gsub(/\./,"_",IP_ADDR);
        # Split device into device:index
        split($NF,DEV,":");
        # Update last device
        LAST_DEV=LAST_DEV " " DEV[2];
        printf("rdev_%s_addr=%s\nrdevip_%s=%s\nrdev_%s_pb=%s_%s\nrdev_LIST=\"%s\"\n",
        DEV[2],IPADDR[1],