evenet/tinc-up

146 lines
3.3 KiB
Plaintext
Raw Normal View History

2014-12-25 23:33:08 +00:00
#!/usr/bin/env bash
2014-12-25 20:47:26 +00:00
set -eu
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
2015-01-25 18:54:42 +00:00
current_mac=$(ifconfig "$interface" | awk '/ether/ {print $2}')
if [[ "${current_mac,,}" == "${mac_address,,}" ]]; then
return
fi
2014-12-25 20:47:26 +00:00
ifconfig "$interface" down
if [[ "$OSTYPE" == "linux-gnu" ]]; then
ifconfig "$interface" hw ether "$mac_address"
else
ifconfig "$interface" ether "$mac_address"
fi
2014-12-25 23:33:08 +00:00
ifconfig "$interface" up
2014-12-25 20:47:26 +00:00
elif has ip; then
ip link set dev "$interface" down
ip link set dev "$interface" address "$mac_address"
2014-12-25 23:33:08 +00:00
ip link set dev "$interface" up
2014-12-25 20:47:26 +00:00
else
die "no suitable program found to configure the network interface, need iproute2 or ifconfig"
fi
}
2014-12-25 23:30:02 +00:00
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
}
2015-01-01 20:02:33 +00:00
start_dhclient() {
local interface=$1
if [[ "$OSTYPE" == "linux-gnu" ]]; then
dhclient -x
2015-01-01 20:02:33 +00:00
dhclient -nw "$interface"
elif [[ "$OSTYPE" == "freebsd"* ]]; then
dhclient -b "$interface"
else
nohup setsid dhclient "$interface" >/dev/null 2>&1
fi
}
2014-12-25 20:47:26 +00:00
start_dhcp() {
local interface=$1
if has dhcpcd; then
2015-01-01 20:02:33 +00:00
dhcpcd -b -n "$interface"
2014-12-25 20:47:26 +00:00
elif has dhclient; then
2015-01-01 20:02:33 +00:00
start_dhclient "$interface"
2015-01-01 22:40:56 +00:00
elif [[ "$OSTYPE" == "darwin"* ]]; then # TODO untested
2014-12-25 20:47:26 +00:00
ipconfig set "$interface" DHCP
else
die "no suitable dhcp program found, need dhcpcd or dhclient"
fi
}
2015-01-21 14:58:13 +00:00
disable_ipv6_privacy() {
local interface=$1
if [[ "$OSTYPE" == "linux-gnu" ]]; then
sysctl -w "net.ipv6.conf.${interface}.use_tempaddr=0"
elif [[ "$OSTYPE" == "openbsd"* ]]; then
ifconfig "${interface}" -autoconfprivacy
elif has sysctl; then
sysctl -w net.inet6.ip6.use_tempaddr=0
fi
}
2014-12-25 20:47:26 +00:00
[ -z "${INTERFACE:-}" ] && die "no INTERFACE environment variable set"
2015-01-01 22:40:56 +00:00
DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
MAC_ADDRESS_FILE="${DIR}/tinc-macaddr"
LOCAL_HOOK_FILE="${DIR}/tinc-up.local"
2015-01-25 18:54:42 +00:00
TINCRC="${DIR}/tincrc"
MAC_ADDRESS=""
SUBNET=""
DHCP="YES"
IPV6_PRIVACY="YES"
source "${TINCRC}" || true
2015-01-01 22:40:56 +00:00
2015-01-25 18:54:42 +00:00
if [ -z "$MAC_ADDRESS" ]; then
echo "${MAC_ADDRESS_FILE} does not exists. Generate it with ./tinc-generate-mac..."
"$DIR/tinc-generate-mac"
source "$TINCRC"
2014-12-25 20:47:26 +00:00
fi
set_mac "$INTERFACE" "$MAC_ADDRESS"
2015-01-25 18:54:42 +00:00
if [ -n "$SUBNET" ]; then
IFS=' ' read IP NETMASK <<< "SUBNET"
[ -z "$IP" ] && die "no ip set in SUBNET"
[ -z "$NETMASK" ] && die "no netmask set in SUBNET"
2014-12-25 23:30:02 +00:00
set_ip "$INTERFACE" "$IP" "$NETMASK"
2015-01-25 18:54:42 +00:00
fi
if [ "$DHCP" = "YES" ]; then
2014-12-25 23:30:02 +00:00
start_dhcp "$INTERFACE"
fi
2015-01-21 14:58:13 +00:00
2015-01-25 18:54:42 +00:00
if [[ "$IPV6_PRIVACY" != "YES" ]]; then
disable_ipv6_privacy "$INTERFACE"
fi
2015-01-21 14:58:13 +00:00
[ -x "$LOCAL_HOOK_FILE" ] && "$LOCAL_HOOK_FILE" || true