evenet/tinc-up

102 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eu
DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
MAC_ADDRESS_FILE=${DIR}/tinc-macaddr
TINC_SUBNET_FILE=${DIR}/tinc-subnet
has() {
command -v "$1" >/dev/null 2>&1
}
die() {
echo $1 &>2
exit 1
}
set_mac() {
local interface=$1
local mac_address=$2
if has ifconfig; then
ifconfig "$interface" down
if [[ "$OSTYPE" == "linux-gnu" ]]; then
ifconfig "$interface" hw ether "$mac_address"
else
ifconfig "$interface" ether "$mac_address"
fi
elif has ip; then
ip link set dev "$interface" down
ip link set dev "$interface" address "$mac_address"
else
die "no suitable program found to configure the network interface, need iproute2 or ifconfig"
fi
}
mask2cidr() {
local netmask=$1
local nbits=0
IFS=.
for dec in "$netmask"; do
case $dec in
255) let nbits+=8;;
254) let nbits+=7;;
252) let nbits+=6;;
248) let nbits+=5;;
240) let nbits+=4;;
224) let nbits+=3;;
192) let nbits+=2;;
128) let nbits+=1;;
0);;
*) die "Error: $dec is not recognised"
esac
done
echo "$nbits"
}
set_ip() {
local interface=$1
local ip=$2
local netmask=$3
if has ifconfig; then
ifconfig "$interface" "$ip" netmask "$netmask"
elif has ip; then
ip addr add "$ip" dev "$interface"
else
die "no suitable program found to set ip address, need iproute2 or ifconfig"
fi
}
start_dhcp() {
local interface=$1
if has dhcpcd; then
dhcpcd "$interface"
elif has dhclient; then
dhclient "$interface"
elif [[ "$OSTYPE" == "darwin"* ]]; then # TODO
untested
ipconfig set "$interface" DHCP
else
die "no suitable dhcp program found, need dhcpcd or dhclient"
fi
}
[ -z "${INTERFACE:-}" ] && die "no INTERFACE environment variable set"
if [ ! -f "$MAC_ADDRESS_FILE" ]; then
die "${MAC_ADDRESS_FILE} does not exists. Generate it with ./tinc-generate-mac"
fi
read -r MAC_ADDRESS <"$MAC_ADDRESS_FILE"
set_mac "$INTERFACE" "$MAC_ADDRESS"
if [ -e $TINC_SUBNET_FILE ]; then
read -a SUBNET <"$TINC_SUBNET_FILE"
IP=${SUBNET[0]}
NETMASK=${SUBNET[1]}
[ -z "$IP" ] && die "no ip set in '$TINC_SUBNET_FILE'"
[ -z "$NETMASK" ] && die "no netmask set in '$TINC_SUBNET_FILE'"
set_ip "$INTERFACE" "$IP" "$NETMASK"
else
start_dhcp "$INTERFACE"
fi