#!/bin/bash LATEST="v0.18.0" print_logo() {( cat << "EOF" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __ __ ______ ______ __ __ ______ __ __ ______ ______ /\ "-.\ \ /\ ___\ /\__ _\ /\ "-./ \ /\ __ \ /\ \/ / /\ ___\ /\ == \ \ \ \-. \ \ \ __\ \/_/\ \/ \ \ \-./\ \ \ \ __ \ \ \ _"-. \ \ __\ \ \ __< \ \_\\"\_\ \ \_____\ \ \_\ \ \_\ \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_____\ \ \_\ \_\ \/_/ \/_/ \/_____/ \/_/ \/_/ \/_/ \/_/\/_/ \/_/\/_/ \/_____/ \/_/ /_/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EOF )} if [ $(id -u) -ne 0 ]; then echo "This script must be run as root" exit 1 fi unset INSTALL_TYPE unset BUILD_TYPE unset BUILD_TAG unset IMAGE_TAG usage () {( echo "usage: ./nm-quick.sh [-e] [-b buildtype] [-t tag]" echo " -e if specified, will install netmaker EE" echo " -b type of build; options:" echo " \"version\" - will install a specific version of Netmaker using remote git and dockerhub" echo " \"local\": - will install by cloning repo and and building images from git" echo " \"branch\": - will install a specific branch using remote git and dockerhub " echo " -t tag of build; if buildtype=version, tag=version. If builtype=branch or builtype=local, tag=branch" echo "examples:" echo " nm-quick.sh -e -b version -t v0.18.0" echo " nm-quick.sh -e -b local -t feature_v0.17.2_newfeature" echo " nm-quick.sh -e -b branch -t develop" exit 1 )} while getopts evb:t: flag do case "${flag}" in e) INSTALL_TYPE="ee" ;; v) usage exit 0 ;; b) BUILD_TYPE=${OPTARG} if [[ ! "$BUILD_TYPE" =~ ^(version|local|branch)$ ]]; then echo "error: $BUILD_TYPE is invalid" echo "valid options: version, local, branch" usage exit 1 fi ;; t) BUILD_TAG=${OPTARG} ;; esac done if [ -z "$BUILD_TYPE" ]; then BUILD_TYPE="version" BUILD_TAG=$LATEST fi if [ -z "$BUILD_TAG" ] && [ "$BUILD_TYPE" = "version" ]; then BUILD_TAG=$LATEST fi if [ -z "$BUILD_TAG" ] && [ ! -z "$BUILD_TYPE" ]; then echo "error: must specify build tag when build type \"$BUILD_TYPE\" is specified" usage exit 1 fi IMAGE_TAG=$(sed 's/\//-/g' <<< "$BUILD_TAG") if [ "$1" = "ce" ]; then INSTALL_TYPE="ce" elif [ "$1" = "ee" ]; then INSTALL_TYPE="ee" fi if [ -z "$INSTALL_TYPE" ]; then echo "-----------------------------------------------------" echo "Would you like to install Netmaker Community Edition (CE), or Netmaker Enterprise Edition (EE)?" echo "EE will require you to create an account at https://dashboard.license.netmaker.io" echo "-----------------------------------------------------" select install_option in "Community Edition" "Enterprise Edition"; do case $REPLY in 1) echo "installing Netmaker CE" INSTALL_TYPE="ce" break ;; 2) echo "installing Netmaker EE" INSTALL_TYPE="ee" break ;; *) echo "invalid option $REPLY";; esac done fi echo "-----------Build Options-----------------------------" echo " EE or CE: $INSTALL_TYPE"; echo " Build Type: $BUILD_TYPE"; echo " Build Tag: $BUILD_TAG"; echo " Image Tag: $IMAGE_TAG"; echo "-----------------------------------------------------" print_logo wait_seconds() {( for ((a=1; a <= $1; a++)) do echo ". . ." sleep 1 done )} confirm() {( while true; do read -p 'Does everything look right? [y/n]: ' yn case $yn in [Yy]* ) override="true"; break;; [Nn]* ) echo "exiting..."; exit 1;; * ) echo "Please answer yes or no.";; esac done )} local_install_setup() {( rm -rf netmaker-tmp mkdir netmaker-tmp cd netmaker-tmp git clone https://www.github.com/gravitl/netmaker cd netmaker git checkout $BUILD_TAG git pull origin $BUILD_TAG docker build --no-cache --build-arg version=$IMAGE_TAG -t gravitl/netmaker:$IMAGE_TAG . if [ "$INSTALL_TYPE" = "ee" ]; then cp compose/docker-compose.ee.yml /root/docker-compose.yml cp docker/Caddyfile-EE /root/Caddyfile else cp compose/docker-compose.yml /root/docker-compose.yml cp docker/Caddyfile /root/Caddyfile fi cp docker/mosquitto.conf /root/mosquitto.conf cp docker/wait.sh /root/wait.sh cd ../../ rm -rf netmaker-tmp )} echo "checking dependencies..." OS=$(uname) if [ -f /etc/debian_version ]; then dependencies="git wireguard wireguard-tools jq docker.io docker-compose" update_cmd='apt update' install_cmd='apt-get install -y' elif [ -f /etc/alpine-release ]; then dependencies="git wireguard jq docker.io docker-compose" update_cmd='apk update' install_cmd='apk --update add' elif [ -f /etc/centos-release ]; then dependencies="git wireguard jq docker.io docker-compose" update_cmd='yum update' install_cmd='yum install -y' elif [ -f /etc/fedora-release ]; then dependencies="git wireguard jq docker.io docker-compose" update_cmd='dnf update' install_cmd='dnf install -y' elif [ -f /etc/redhat-release ]; then dependencies="git wireguard jq docker.io docker-compose" update_cmd='yum update' install_cmd='yum install -y' elif [ -f /etc/arch-release ]; then dependecies="git wireguard-tools jq docker.io docker-compose" update_cmd='pacman -Sy' install_cmd='pacman -S --noconfirm' elif [ "${OS}" = "FreeBSD" ]; then dependencies="git wireguard wget jq docker.io docker-compose" update_cmd='pkg update' install_cmd='pkg install -y' elif [ -f /etc/turris-version ]; then dependencies="git wireguard-tools bash jq docker.io docker-compose" OS="TurrisOS" update_cmd='opkg update' install_cmd='opkg install' elif [ -f /etc/openwrt_release ]; then dependencies="git wireguard-tools bash jq docker.io docker-compose" OS="OpenWRT" update_cmd='opkg update' install_cmd='opkg install' else install_cmd='' fi if [ -z "${install_cmd}" ]; then echo "OS unsupported for automatic dependency install" exit 1 fi set -- $dependencies ${update_cmd} while [ -n "$1" ]; do if [ "${OS}" = "FreeBSD" ]; then is_installed=$(pkg check -d $1 | grep "Checking" | grep "done") if [ "$is_installed" != "" ]; then echo " " $1 is installed else echo " " $1 is not installed. Attempting install. ${install_cmd} $1 sleep 5 is_installed=$(pkg check -d $1 | grep "Checking" | grep "done") if [ "$is_installed" != "" ]; then echo " " $1 is installed elif [ -x "$(command -v $1)" ]; then echo " " $1 is installed else echo " " FAILED TO INSTALL $1 echo " " This may break functionality. fi fi else if [ "${OS}" = "OpenWRT" ] || [ "${OS}" = "TurrisOS" ]; then is_installed=$(opkg list-installed $1 | grep $1) else is_installed=$(dpkg-query -W --showformat='${Status}\n' $1 | grep "install ok installed") fi if [ "${is_installed}" != "" ]; then echo " " $1 is installed else echo " " $1 is not installed. Attempting install. ${install_cmd} $1 sleep 5 if [ "${OS}" = "OpenWRT" ] || [ "${OS}" = "TurrisOS" ]; then is_installed=$(opkg list-installed $1 | grep $1) else is_installed=$(dpkg-query -W --showformat='${Status}\n' $1 | grep "install ok installed") fi if [ "${is_installed}" != "" ]; then echo " " $1 is installed elif [ -x "$(command -v $1)" ]; then echo " " $1 is installed else echo " " FAILED TO INSTALL $1 echo " " This may break functionality. fi fi fi shift done echo "-----------------------------------------------------" echo "dependency check complete" echo "-----------------------------------------------------" wait_seconds 3 if [ "$BUILD_TYPE" = "local" ]; then local_install_setup fi set -e IP_ADDR=$(dig -4 myip.opendns.com @resolver1.opendns.com +short) if [ "$IP_ADDR" = "" ]; then IP_ADDR=$(curl -s ifconfig.me) fi NETMAKER_BASE_DOMAIN=nm.$(echo $IP_ADDR | tr . -).nip.io COREDNS_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p') SERVER_PUBLIC_IP=$IP_ADDR MASTER_KEY=$(tr -dc A-Za-z0-9 &1) if [[ "$i" == 8 ]]; then echo " Caddy is having an issue setting up certificates, please investigate (docker logs caddy)" echo " Exiting..." exit 1 elif [[ "$curlresponse" == *"failed to verify the legitimacy of the server"* ]]; then echo " Certificates not yet configured, retrying..." elif [[ "$curlresponse" == *"left intact"* ]]; then echo " Certificates ok" break else secs=$(($i*5+10)) echo " Issue establishing connection...retrying in $secs seconds..." fi sleep $secs done } setup_mesh() {( set -e wait_seconds 15 echo "Creating netmaker network (10.101.0.0/16)" curl -s -o /dev/null -d '{"addressrange":"10.101.0.0/16","netid":"netmaker"}' -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' https://api.${NETMAKER_BASE_DOMAIN}/api/networks wait_seconds 5 echo "Creating netmaker access key" curlresponse=$(curl -s -d '{"uses":99999,"name":"netmaker-key"}' -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' https://api.${NETMAKER_BASE_DOMAIN}/api/networks/netmaker/keys) ACCESS_TOKEN=$(jq -r '.accessstring' <<< ${curlresponse}) wait_seconds 3 )} set +e test_connection wait_seconds 3 setup_mesh echo "-----------------------------------------------------------------" echo "-----------------------------------------------------------------" echo "Netmaker setup is now complete. You are ready to begin using Netmaker." echo "Visit dashboard.$NETMAKER_BASE_DOMAIN to log in" echo "-----------------------------------------------------------------" echo "-----------------------------------------------------------------" # cp -f /etc/skel/.bashrc /root/.bashrc