Blame ip/ifcfg

Packit Service 3880ab
#! /bin/sh
Packit Service 3880ab
# SPDX-License-Identifier: GPL-2.0
Packit Service 3880ab
Packit Service 3880ab
CheckForwarding () {
Packit Service 3880ab
  local sbase fwd
Packit Service 3880ab
  sbase=/proc/sys/net/ipv4/conf
Packit Service 3880ab
  fwd=0
Packit Service 3880ab
  if [ -d $sbase ]; then
Packit Service 3880ab
    for dir in $sbase/*/forwarding; do
Packit Service 3880ab
      fwd=$(( fwd + $(cat "$dir") ))
Packit Service 3880ab
    done
Packit Service 3880ab
  else
Packit Service 3880ab
    fwd=2
Packit Service 3880ab
  fi
Packit Service 3880ab
  return $fwd
Packit Service 3880ab
}
Packit Service 3880ab
Packit Service 3880ab
RestartRDISC () {
Packit Service 3880ab
  killall -HUP rdisc || rdisc -fs
Packit Service 3880ab
}
Packit Service 3880ab
Packit Service 3880ab
ABCMaskLen () {
Packit Service 3880ab
  local class;
Packit Service 3880ab
Packit Service 3880ab
  class=${1%%.*}
Packit Service 3880ab
  if [ "$1" = "" -o $class -eq 0 -o $class -ge 224 ]; then return 0
Packit Service 3880ab
  elif [ $class -ge 224 ]; then return 0
Packit Service 3880ab
  elif [ $class -ge 192 ]; then return 24
Packit Service 3880ab
  elif [ $class -ge 128 ]; then return 16
Packit Service 3880ab
  else return 8; fi
Packit Service 3880ab
}
Packit Service 3880ab
Packit Service 3880ab
label="label $1"
Packit Service 3880ab
ldev="$1"
Packit Service 3880ab
dev=${1%:*}
Packit Service 3880ab
if [ "$dev" = "" -o "$1" = "help" ]; then
Packit Service 3880ab
  echo "Usage: ifcfg DEV [[add|del [ADDR[/LEN]] [PEER] | stop]" 1>&2
Packit Service 3880ab
  echo "       add - add new address" 1>&2
Packit Service 3880ab
  echo "       del - delete address" 1>&2
Packit Service 3880ab
  echo "       stop - completely disable IP" 1>&2
Packit Service 3880ab
  exit 1
Packit Service 3880ab
fi
Packit Service 3880ab
shift
Packit Service 3880ab
Packit Service 3880ab
CheckForwarding
Packit Service 3880ab
fwd=$?
Packit Service 3880ab
if [ $fwd -ne 0 ]; then
Packit Service 3880ab
  echo "Forwarding is ON or its state is unknown ($fwd). OK, No RDISC." 1>&2
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
Packit Service 3880ab
deleting=0
Packit Service 3880ab
case "$1" in
Packit Service 3880ab
add) shift ;;
Packit Service 3880ab
stop)
Packit Service 3880ab
  if [ "$ldev" != "$dev" ]; then
Packit Service 3880ab
    echo "Cannot stop alias $ldev" 1>&2
Packit Service 3880ab
    exit 1;
Packit Service 3880ab
  fi
Packit Service 3880ab
  ip -4 addr flush dev $dev $label || exit 1
Packit Service 3880ab
  if [ $fwd -eq 0 ]; then RestartRDISC; fi
Packit Service 3880ab
  exit 0 ;;
Packit Service 3880ab
del*)
Packit Service 3880ab
  deleting=1; shift ;;
Packit Service 3880ab
*)
Packit Service 3880ab
esac
Packit Service 3880ab
Packit Service 3880ab
ipaddr=
Packit Service 3880ab
pfxlen=
Packit Service 3880ab
if [ "$1" != "" ]; then
Packit Service 3880ab
  ipaddr=${1%/*}
Packit Service 3880ab
  if [ "$1" != "$ipaddr" ]; then
Packit Service 3880ab
    pfxlen=${1#*/}
Packit Service 3880ab
  fi
Packit Service 3880ab
  if [ "$ipaddr" = "" ]; then
Packit Service 3880ab
    echo "$1 is bad IP address." 1>&2
Packit Service 3880ab
    exit 1
Packit Service 3880ab
  fi
Packit Service 3880ab
fi
Packit Service 3880ab
shift
Packit Service 3880ab
Packit Service 3880ab
peer=$1
Packit Service 3880ab
if [ "$peer" != "" ]; then
Packit Service 3880ab
  if [ "$pfxlen" != "" -a "$pfxlen" != "32" ]; then
Packit Service 3880ab
    echo "Peer address with non-trivial netmask." 1>&2
Packit Service 3880ab
    exit 1
Packit Service 3880ab
  fi
Packit Service 3880ab
  pfx="$ipaddr peer $peer"
Packit Service 3880ab
else
Packit Service 3880ab
  if [ "$ipaddr" = "" ]; then
Packit Service 3880ab
    echo "Missing IP address argument." 1>&2
Packit Service 3880ab
    exit 1
Packit Service 3880ab
  fi
Packit Service 3880ab
  if [ "$pfxlen" = "" ]; then
Packit Service 3880ab
    ABCMaskLen $ipaddr
Packit Service 3880ab
    pfxlen=$?
Packit Service 3880ab
  fi
Packit Service 3880ab
  pfx="$ipaddr/$pfxlen"
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
if [ "$ldev" = "$dev" -a "$ipaddr" != "" ]; then
Packit Service 3880ab
  label=
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
if [ $deleting -ne 0 ]; then
Packit Service 3880ab
  ip addr del $pfx dev $dev $label || exit 1
Packit Service 3880ab
  if [ $fwd -eq 0 ]; then RestartRDISC; fi
Packit Service 3880ab
  exit 0
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
Packit Service 3880ab
if ! ip link set up dev $dev ; then
Packit Service 3880ab
  echo "Error: cannot enable interface $dev." 1>&2
Packit Service 3880ab
  exit 1
Packit Service 3880ab
fi
Packit Service 3880ab
if [ "$ipaddr" = "" ]; then exit 0; fi
Packit Service 3880ab
Packit Service 3880ab
if ! arping -q -c 2 -w 3 -D -I $dev $ipaddr ; then
Packit Service 3880ab
  echo "Error: some host already uses address $ipaddr on $dev." 1>&2
Packit Service 3880ab
  exit 1
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
if ! ip address add $pfx brd + dev $dev $label; then
Packit Service 3880ab
  echo "Error: failed to add $pfx on $dev." 1>&2
Packit Service 3880ab
  exit 1
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
arping -q -A -c 1 -I $dev $ipaddr
Packit Service 3880ab
noarp=$?
Packit Service 3880ab
( sleep 2 ;
Packit Service 3880ab
  arping -q -U -c 1 -I $dev $ipaddr ) >/dev/null 2>&1 
Packit Service 3880ab
Packit Service 3880ab
ip route add unreachable 224.0.0.0/24 >/dev/null 2>&1
Packit Service 3880ab
ip route add unreachable 255.255.255.255 >/dev/null 2>&1
Packit Service 3880ab
if [ "`ip link ls $dev | grep -c MULTICAST`" -ge 1 ]; then
Packit Service 3880ab
  ip route add 224.0.0.0/4 dev $dev scope global >/dev/null 2>&1
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
if [ $fwd -eq 0 ]; then
Packit Service 3880ab
  if [ $noarp -eq 0 ]; then
Packit Service 3880ab
    ip ro append default dev $dev metric 30000 scope global
Packit Service 3880ab
  elif [ "$peer" != "" ]; then
Packit Service 3880ab
    if ping -q -c 2 -w 4 $peer ; then
Packit Service 3880ab
      ip ro append default via $peer dev $dev metric 30001
Packit Service 3880ab
    fi
Packit Service 3880ab
  fi
Packit Service 3880ab
  RestartRDISC
Packit Service 3880ab
fi
Packit Service 3880ab
Packit Service 3880ab
exit 0