#!/bin/bash #/opt/skywire/scripts/skywire-autoconfig #skywire autoconfiguration script for debian & archlinux packages #source the skyenv file if it exists - provided by the skybian package or the user [[ -f /etc/profile.d/skyenv.sh ]] && source /etc/profile.d/skyenv.sh #set NOAUTOCONFIG=true to avoid running the script in the postinstall if [[ ${NOAUTOCONFIG} == true ]]; then #unset the env NOAUTOCONFIG='' echo "autoconfiguration disabled. to configure and start skywire run: skywire-autoconfig" exit 0 fi #check for root if [[ $EUID -ne 0 ]]; then echo "root permissions required" exit 1 fi #grant network permissions to the vpn app binaries setcap cap_net_admin+ep /opt/skywire/apps/vpn-client setcap cap_net_admin+ep /opt/skywire/apps/vpn-server # determine if skywire is running via systemd if [[ $(ps -eo pid,comm,cgroup | grep skywire) == *"system.slice"* ]]; then WSYSTEMD=1 fi #root portion of the configuration if [[ $DMSGPTYTERM -ne "1" ]] && [[ $WSYSTEMD -eq "1" ]]; then #halt any running instance systemctl is-active --quiet skywire-visor && systemctl disable --now skywire-visor 2> /dev/null systemctl is-active --quiet skywire-hypervisor && systemctl disable --now skywire-hypervisor 2> /dev/null fi systemctl is-active --quiet skywire-autoconfig && systemctl disable skywire-autoconfig 2> /dev/null #make the logging of this script colorful _nc='\033[0m' _red='\033[0;31m' _green='\033[0;32m' _yellow='\033[0;33m' _blue='\033[1;34m' _purple='\033[0;35m' _cyan='\033[0;36m' _bold='\033[1m' ##set the argument to pass into functions## _1=${1} #recreate pacman logging _msg2() { (( QUIET )) && return local mesg=$1; shift printf "${_cyan} ->${_nc}${_bold} ${mesg}${_nc}\n" "$@" } _msg3() { (( QUIET )) && return local mesg=$1; shift printf "${_blue} -->${_nc}${BOLD} ${mesg}${_nc}\n" "$@" } _errmsg1() { (( QUIET )) && return local mesg=$1; shift printf "${_red}>>> Error:${_nc}${_bold} ${mesg}${_nc}\n" "$@" } _warnmsg1() { (( QUIET )) && return local mesg=$1; shift printf "${_red}>>> Warning:${_nc}${_bold} ${mesg}${_nc}\n" "$@" } _errmsg2() { (( QUIET )) && return local mesg=$1; shift printf "${_red}>>> FATAL:${_bold} ${mesg}${_nc}\n" "$@" } #helpful text _welcome(){ if [[ $(uname -m) == *"arm"* ]]; then _msg2 "register your public key:" _msg2 "${_blue}https://whitelist.skycoin.com/${_nc}" _msg2 "track uptime:" _msg2 "${_blue}http://ut.skywire.skycoin.com/uptimes${_nc}" fi _msg2 "support: ${_blue}https://t.me/skywire${_nc}" } #generate config as root _config_gen() { # remove any existing symlink [[ -f /opt/skywire/skywire-visor.json ]] && rm /opt/skywire/skywire-visor.json #create by default the local hypervisor config if no config exists ; and retain any hypervisor config which exists [[ (! -f /opt/skywire/skywire.json) || ($(cat /opt/skywire/skywire.json | grep -Po '"hypervisor":') != "") ]] && _is_hypervisor="-i" #check for argument - remote pk or 0 # 0 as argument drops any remote hypervisors which were set in the configuration # & triggers the creation of the local hyperisor configuration if [[ ${_1} == "0" ]]; then _retain_hv="" unset _1 _is_hypervisor="-i" fi # create the flag to set the remote hypervisor(s) if [[ ! -z ${_1} ]]; then _retain_hv="" _hvpks="--hvpks ${_1}" #shorthand flag: -j _is_hypervisor="" fi ##generate (hyper)visor configuration## # show config gen command used _msg3 "Generating skywire config with command: ${_cyan}skywire-cli ${_yellow}config gen -bepr ${_retain_hv} ${_is_hypervisor} ${_public_rpc} ${_vpn_server} ${_test_env} ${_hvpks}${_nc}" skywire-cli config gen -bepr ${_retain_hv} ${_is_hypervisor} ${_public_rpc} ${_vpn_server} ${_test_env} ${_hvpks} >> /dev/null 2>&1 if [[ ${?} != 0 ]]; then #print the error! skywire-cli config gen -bepr ${_retain_hv} ${_is_hypervisor} ${_public_rpc} ${_vpn_server} ${_test_env} ${_hvpks} _err=$? _errmsg2 "error generating skywire config" exit ${_err} fi #logging check if [[ -f /opt/skywire/skywire.json ]]; then _msg3 "${_blue}Skywire${_nc} configuration updated config path: ${_purple}/opt/skywire/skywire.json${_nc}" if [[ ! -f /etc/skywire-config.json ]]; then _msg2 "backing up configuration to /etc/skywire-config.json" cp -b /opt/skywire/skywire.json /etc/skywire-config.json fi else _errmsg2 "expected config file not found at /opt/skywire/skywire.json" exit 100 fi } #only use public rpc flag with env PUBLICRPC=1 if [[ ( ${PUBLICRPC} -eq "1") ]]; then _public_rpc="--publicrpc " fi #enable VPN server automatically on config re-gen with env VPNSERVER=1 if [[ ${VPNSERVER} -eq "1" ]]; then _vpn_server="--servevpn " fi #default to retaining hypervisors already set _retain_hv="-x" #use test deployment instead of production with env TESTENV=1 if [[ ${TESTENV} -eq "1" ]]; then _test_env="--testenv" fi #check if >>this script<< is a child process of the systemd service i.e.: run in dmsgpty terminal if [[ "${SYSTEMDCHILD}" -ne "1" ]]; then _now="--now" fi #root portion of the config _msg2 "Configuring skywire" #attempt to import config if none exists - i.e. import skybian config or restore config if [[ ! -f /opt/skywire/skywire.json ]]; then if [[ -f /etc/skywire-config.json ]]; then _warnmsg1 "Importing configuration from /etc/skywire-config.json" cp -b /etc/skywire-config.json /opt/skywire/skywire.json fi fi #config generation _config_gen _svc=skywire if [[ $SKYBIAN == "true" ]]; then _msg3 "Enabling ${_svc} service${_now/--/ and starting }.. systemctl enable ${_now} ${_svc}.service" systemctl enable ${_now} ${_svc}.service 2> /dev/null fi if [[ $DMSGPTYTERM == "1" ]]; then if [[ ${_now} != "--now" ]]; then _msg3 "Please restart ${_svc} service manually: ${_red}systemctl restart ${_svc} 2> /dev/null${_nc}" exit 0 else _msg3 "Please shut down your visor and start it again with: ${_red}systemctl start ${_svc} 2> /dev/null${_nc}" exit 0 fi fi #restart the service systemctl is-active --quiet ${_svc} && _msg3 "Restarting skywire.service..." && systemctl restart ${_svc} 2> /dev/null if ! systemctl is-active --quiet ${_svc} >/dev/null; then _msg2 "Start the skywire service with: ${_red}systemctl start ${_svc}${_nc}" exit 0 fi _pubkey=$(skywire-cli visor pk -p | tail -n1) _msg2 "Visor Public Key: ${_green}${_pubkey}${_nc}" if [[ $_is_hypervisor == "-i" ]]; then if [[ $(ps -o comm= -p $PPID) != "sshd" ]]; then _msg2 "Starting now on: ${_red}http://127.0.0.1:8000${_nc}" _vpnurl=$(skywire-cli hv vpn url -p) _msg2 "Use the vpn: ${_red}${_vpnurl}${_nc}" # ${_red}http://127.0.0.1:8000/#/vpn/${_pubkey}/${_nc}" fi _lanip="$(ip addr show | grep -w inet | grep -v 127.0.0.1 | awk '{ print $2}' | cut -d "/" -f 1)" _msg2 "Access hypervisor UI from local network here: ${_yellow}http://${_lanip}:8000${_nc}" _welcome _msg2 "run the following command on OTHER NODES to set this one as the hypervisor:" echo -e "${_cyan}skywire-autoconfig ${_yellow}${_pubkey}${_nc}" _msg2 "to see this text again run: ${_cyan}skywire-autoconfig${_nc}" else _msg2 "${_blue}Skywire${_nc} starting in visor mode" _msg2 "Visor Public Key: ${_green}${_pubkey}${_nc}" _welcome fi