#!/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