74 lines
1.8 KiB
Bash
Executable File
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]{1,3}/([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
|