|
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
|