#! /bin/bash # # Wrapper around ip link command that handles IPv4, IPv6 and DHCP # This is done in shell rather than perl to avoid the overhead of recompilation if [ $# -ne 3 ]; then echo "Usage: $0 {add|delete} interface address" exit 1 fi case $1 in add) if [[ "$3" = "dhcp" ]]; then exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=start elif [[ "$3" = "dhcpv6" ]]; then exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --start -ifname "$2" elif [[ "$3" =~ ":" ]]; then # Ipv6 address if ! ip -6 addr list dev $2 | grep -q $3; then exec ip -6 addr add "$3" dev "$2" fi else if ! ip addr list dev $2 | grep -q $3; then exec ip addr add "$3" broadcast + dev "$2" fi fi ;; delete) # Get current address from interface when using DHCP if [[ "$3" = "dhcp" ]]; then lease_file=/var/lib/dhcp/dhclient_"$2".leases; ip_address=$(sed -n 's/^\s\sfixed-address\s\(.*\);/\1/p' $lease_file | sed -n '$p'); elif [[ "$3" = "dhcpv6" ]]; then lease_file=/var/lib/dhcp/dhclient_v6_"$2".leases; ip_address=$(sed -n 's/^\s\s\s\siaaddr\s\(.*\)\s{/\1/p' $lease_file | sed -n '$p'); else ip_address=$3; fi if ! /sbin/ip address show dev $2 2>/dev/null | grep -q "$ip_address"; then # Address doesn't exist there, nothing to delete exit 0 fi if [ ! -d "/sys/class/net/$2" ]; then # device is already gone exit 0 elif [[ "$3" = "dhcp" ]]; then exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=stop elif [[ "$3" = "dhcpv6" ]]; then exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --stop --ifname "$2" elif [[ "$3" =~ ":" ]]; then exec ip -6 addr del "$3" dev "$2" else exec ip addr del "$3" dev "$2" fi ;; *) echo "Unknown option $1" exit 1 ;; esac