89 lines
2.2 KiB
Bash
89 lines
2.2 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
set -u
|
||
|
|
|
||
|
|
# This script will read address-plan.md and extract registered IPv4 addresses.
|
||
|
|
# From the extracted IPv4 address the matching IPv6 address is created.
|
||
|
|
#
|
||
|
|
# Since loopback (lo) is already configured with 127.0.0.0/8 there is no need
|
||
|
|
# to the configure the loopback interface with the IPv4 addresses for the test
|
||
|
|
# zones (all are within 127.0.0.0/8).
|
||
|
|
#
|
||
|
|
# The IPv6 addresses are configured on the loopback interface (lo) with this
|
||
|
|
# script. If the address is already configured, an error message is outputted by
|
||
|
|
# ip(), but can be ignored.
|
||
|
|
|
||
|
|
|
||
|
|
usage() { echo "Usage: sudo $0" 1>&2;
|
||
|
|
echo 1>&2;
|
||
|
|
exit 1; }
|
||
|
|
|
||
|
|
while getopts "h" o; do
|
||
|
|
case "${o}" in
|
||
|
|
h)
|
||
|
|
usage
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
usage
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
shift $((OPTIND-1))
|
||
|
|
|
||
|
|
# Make sure the script is run by root
|
||
|
|
if [ $(id -u) -ne 0 ] ; then
|
||
|
|
echo "You must be root." 1>&2
|
||
|
|
echo "Run 'sudo $0'" 1>&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Get path of this script
|
||
|
|
path=$(dirname $0)
|
||
|
|
|
||
|
|
|
||
|
|
# address-plan.md must be in the same folder as this script
|
||
|
|
datafile="$path/address-plan.md"
|
||
|
|
|
||
|
|
|
||
|
|
# Function to add IPv4 address
|
||
|
|
add_ipv4_address() {
|
||
|
|
local ip=$1
|
||
|
|
cmd="ip addr add $ip/32 dev lo"
|
||
|
|
echo -n "Adding $ip : "
|
||
|
|
$cmd && echo "added"
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
# Function to add IPv6 address
|
||
|
|
add_ipv6_address() {
|
||
|
|
local ip=$1
|
||
|
|
local ipv6=$(echo $ip | sed 's/\./:/g') # Convert colon to dot
|
||
|
|
cmd="ip addr add fda1:b2:c3::$ipv6/128 dev lo"
|
||
|
|
echo -n "Adding fda1:b2:c3::$ipv6 : "
|
||
|
|
$cmd && echo "added"
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
# Read every line in the data file (markdown)
|
||
|
|
while IFS= read -r line; do
|
||
|
|
# Get IP addresses without prefix (e.g. /24)
|
||
|
|
if [[ $line =~ ^\|\ ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\ +\| ]]; then
|
||
|
|
ip_address=${BASH_REMATCH[1]}
|
||
|
|
# Add address for IPv4
|
||
|
|
add_ipv4_address $ip_address
|
||
|
|
# Add address for IPv6
|
||
|
|
add_ipv6_address $ip_address
|
||
|
|
fi
|
||
|
|
done < $datafile
|
||
|
|
|
||
|
|
|
||
|
|
# An alternative approach is to run the following two commands to make all IPv6
|
||
|
|
# addresses in the /64 range be available.
|
||
|
|
#
|
||
|
|
# $ sudo ip -6 route add to local fda1:b2:c3::/64 dev lo
|
||
|
|
# $ sudo sysctl -w net.ipv6.ip_nonlocal_bind=1
|
||
|
|
#
|
||
|
|
# Migration to that approach should be combined with an update of the address
|
||
|
|
# plan file (address-plan.md) and probably combined with specific address plans
|
||
|
|
# with each test case.
|