75 lines
2.1 KiB
Bash
Executable File
75 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
set -Eeuo pipefail
|
|
IFACE=$1
|
|
|
|
source /etc/libvirt/hooks/$IFACE || true
|
|
|
|
### I need to keep this for backwards compatibility but PUBLICMAC should always be set since it absolutely needs to match the MAC the VM has been assigned by qemu. otherwise nothign will work
|
|
: ${PUBLICMAC:=52:54:00:00:00:11}
|
|
###
|
|
|
|
maxprefixv6=64
|
|
maxprefixv4=25
|
|
|
|
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}
|
|
ip addr add fe80::1/64 dev ${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
|
|
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
|
|
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)
|
|
|
|
elif [[ $IP =~ ^\ *$ ]]; then
|
|
echo "we just got an empty string. so not gonna do anything. probably due to splitting the comma"
|
|
|
|
else
|
|
echo "Unable to detect with what prefix I'm working with"
|
|
exit 10
|
|
fi
|
|
done
|