From 3c5b0b13fbc9c6726045480df599fba6bb0aa5fe Mon Sep 17 00:00:00 2001 From: Frieder Schlesier Date: Fri, 15 Jun 2018 16:55:52 +0200 Subject: [PATCH] add quicktinc --- quicktinc.sh | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 quicktinc.sh diff --git a/quicktinc.sh b/quicktinc.sh new file mode 100644 index 0000000..2481e3e --- /dev/null +++ b/quicktinc.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# from https://github.com/j3k0/quicktinc + +set -e + +IMAGE="fschl/tinc" + +function usage() { + echo " +Usage: + $0 [OPTIONS] + +Options: + --net=NET_NAME Network name (required) + --node=NODE_NAME Node name (required) + --public-ip=PUBLIC_IP Node's public IP (required) + --private-ip=PRIVATE_IP Node's private IP (required) + --connect-to=HOST Name of another node (optional, repeatable) + --interface=tun0 Network interface to create (optional, default=tun0) + --config=/srv/tinc Where to save tinc networks (optional, default=$(pwd)/etc-tinc) + --up Also start the daemon + +Example: + $0 --net=demonet --node=node23 --public-ip=8.9.10.11 --private-ip=10.0.0.23 --connect-to=node1 --connect-to=node2 --up + +Report bugs to +" + exit 1 +} + +for i in "$@" +do + case $i in + -n=*|--net=*) + NET_NAME="${i#*=}" + shift # past argument=value + ;; + -o=*|--node=*) + NODE_NAME="${i#*=}" + shift # past argument=value + ;; + -v=*|--private-ip=*) + PRIVATE_IP="${i#*=}" + shift # past argument=value + ;; + -p=*|--public-ip=*) + PUBLIC_IP="${i#*=}" + shift # past argument=value + ;; + -c=*|--connect-to=*) + CONNECT_TO="$CONNECT_TO ${i#*=}" + shift # past argument=value + ;; + -i=*|--interface=*) + INTERFACE="${i#*=}" + shift # past argument=value + ;; + -C=*|--config=*) + TINC_HOME="${i#*=}" + shift # past argument=value + ;; + --up) + TINC_UP=YES + ;; + *) + # unknown option + usage + ;; + esac +done + +if [ "_$NET_NAME" = "_" ]; then usage; fi +if [ "_$NODE_NAME" = "_" ]; then usage; fi +if [ "_$PRIVATE_IP" = "_" ]; then usage; fi +if [ "_$PUBLIC_IP" = "_" ]; then usage; fi + +if [ "_$INTERFACE" = "_" ]; then + INTERFACE=tun0 +fi + +if [ "_$TINC_HOME" = "_" ]; then + TINC_HOME=$(pwd)/etc-tinc +fi + +function tinc() { + docker run --rm --net=host --device=/dev/net/tun --cap-add NET_ADMIN --volume $TINC_HOME:/etc/tinc $IMAGE -n $NET_NAME "$@" +} + +# Initialize configuration file +tinc init $NODE_NAME + +# Setup host file +# Declare public and private IPs in the host file, CONFIG/NET/hosts/HOST +echo "Address = $PUBLIC_IP" >> $TINC_HOME/$NET_NAME/hosts/$NODE_NAME +echo "Subnet = $PRIVATE_IP/32" >> $TINC_HOME/$NET_NAME/hosts/$NODE_NAME + +# Tweak the config to add our particular setup +tinc add AddressFamily ipv4 +tinc add Device /dev/net/tun +tinc add Interface $INTERFACE +if [ "_$CONNECT_TO" != "_" ]; then + for i in $CONNECT_TO; do + tinc add ConnectTo $i + done +fi + +# Edit the tinc-up script +cat << EOF > $TINC_HOME/$NET_NAME/tinc-up +#!/bin/sh +ifconfig \$INTERFACE $PRIVATE_IP netmask 255.255.255.0 +EOF + +cat << EOF > $TINC_HOME/$NET_NAME/tinc-down +#!/bin/sh +ifconfig \$INTERFACE down +EOF + +chmod +x $TINC_HOME/$NET_NAME/tinc-up +chmod +x $TINC_HOME/$NET_NAME/tinc-down + +if [ "_$TINC_UP" != "_" ]; then + NAME=tinc_$NET_NAME_$NODE_NAME + docker run -d --restart=always --name=$NAME --net=host --device=/dev/net/tun --cap-add NET_ADMIN --volume $TINC_HOME:/etc/tinc $IMAGE -n $NET_NAME start -D + echo "Docker container started with name: $NAME" +fi