wit-network-config/files/qemu-ifup-public

74 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
set -e
set -x
IFACE=$1
source /etc/libvirt/hooks/$IFACE
echo CLUSTER=$CLUSTER
echo IP=$IP
maxprefixv6=64
maxprefixv4=25
publicmac=52:54:00:00:00:11
if [ -z $IP ]; then
echo "got nothing back from the API"
exit 10
fi
eui64() {
local macaddr="$1"
printf "%02x%s" $(( 16#${macaddr:0:2} ^ 2#00000010 )) "${macaddr:2}" \
| sed -E -e 's/([0-9a-zA-Z]{2})*/0x\0|/g' \
| tr -d ':\n' \
| xargs -d '|' \
printf "fe80::%02x%02x:%02xff:fe%02x:%02x%02x"
}
ip link set up ${IFACE}
arp -i ${IFACE} -Ds 169.254.0.1 ${IFACE} netmask 255.255.255.255 pub
IFS=',' read -ra IPS <<< "$IP"
for IP in "${IPS[@]}"; do
echo $IP
if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]/([0-9]{2})$ ]]; then ### we got a IPv4 prefix < maxprefixv4
echo matched ${BASH_REMATCH[1]}
if [ ${BASH_REMATCH[1]} -lt $maxprefixv4 ]; then
echo "we don't support such a big customer net?"
continue
fi
if [ ${BASH_REMATCH[1]} -gt 32 ]; then
echo "prefix is invalid"
continue
fi
echo "we got IPv4 with prefix ${BASH_REMATCH[0]}"
ip route add ${IP} dev ${IFACE}
elif [[ $IP =~ ^2604:bbc0:[0-9,a-f,:]{1,444}/([0-9]{2,3})$ ]]; then ### we got a PIv6 prefix < masprefixv6
if [ ${BASH_REMATCH[1]} -lt $maxprefixv6 ]; then
echo "we don't support such a big customer net?"
continue
fi
if [ ${BASH_REMATCH[1]} -gt 128 ]; then
echo "prefix is invalid"
continue
fi
echo "we got IPv6 with prefix ${BASH_REMATCH[0]}"
ip route add ${IP} dev ${IFACE} via $(eui64 $publicmac)
else ### don't know what we have but something we can't work with
echo "Unable to detect with what prefix I'm working with"
fi
done