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

80 lines
2.2 KiB
Plaintext
Raw Normal View History

2018-07-26 03:57:41 -05:00
#!/bin/bash
set -Eeuo pipefail
2018-07-26 03:57:41 -05:00
IFACE=$1
2019-02-22 23:16:27 -06:00
if [ ${#IFACE} -gt 14 ]; then
echo "interface name too long, mac 14 char: $IFACE"
exit 10
fi
source /etc/libvirt/hooks/$IFACE
2019-02-20 22:31:18 -06:00
### 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}
2019-02-20 22:31:18 -06:00
###
2018-07-26 03:57:41 -05:00
maxprefixv6=64
maxprefixv4=25
2018-07-26 03:57:41 -05:00
if [ -z $IP ]; then
echo "got nothing back from the API"
exit 10
2018-07-26 03:57:41 -05:00
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}
2018-07-26 03:57:41 -05:00
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
2018-07-26 03:57:41 -05:00
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}
2018-07-26 03:57:41 -05:00
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)
2018-07-26 03:57:41 -05:00
elif [[ $IP =~ ^\ *$ ]]; then
echo "we just got an empty string. so not gonna do anything. probably due to splitting the comma"
else
2018-07-26 03:57:41 -05:00
echo "Unable to detect with what prefix I'm working with"
exit 10
2018-07-26 03:57:41 -05:00
fi
done