#!/bin/sh

if [ $(id -u) -ne 0 ]; then
   echo "This script must be run as root"
   exit 1
fi

echo "checking dependencies..."

OS=$(uname)

if [ -f /etc/debian_version ]; then
	dependencies="wireguard wireguard-tools"
	update_cmd='apt update'
	install_cmd='apt-get install -y'
elif [ -f /etc/alpine-release ]; then
	dependencies="wireguard"
	update_cmd='apk update'
	install_cmd='apk --update add'
elif [ -f /etc/centos-release ]; then
	dependencies="wireguard"
	update_cmd='yum update'
	install_cmd='yum install -y'
elif [ -f /etc/fedora-release ]; then
	dependencies="wireguard"
	update_cmd='dnf update'
	install_cmd='dnf install -y'
elif [ -f /etc/redhat-release ]; then
	dependencies="wireguard"
	update_cmd='yum update'
	install_cmd='yum install -y'
elif [ -f /etc/arch-release ]; then
    	dependecies="wireguard-tools"
	update_cmd='pacman -Sy'
	install_cmd='pacman -S --noconfirm'
elif [ "${OS}" = "FreeBSD" ]; then
	dependencies="wireguard wget"
	update_cmd='pkg update'
	install_cmd='pkg install -y'
elif [ -f /etc/turris-version ]; then
	dependencies="wireguard-tools bash"
	OS="TurrisOS"
	update_cmd='opkg update'
	install_cmd='opkg install'
elif [ -f /etc/openwrt_release ]; then
	dependencies="wireguard-tools bash"
	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

${update_cmd}

set -- $dependencies
while [ -n "$1" ]; do
    echo $1
	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

set -e

[ -z "$KEY" ] && KEY=nokey;
[ -z "$VERSION" ] && echo "no \$VERSION provided, fallback to latest" && VERSION=latest;
[ "latest" != "$VERSION" ] && [ "v" != `echo $VERSION | cut -c1` ] && VERSION="v$VERSION"
[ -z "$NAME" ] && NAME="";

dist=netclient

echo "OS Version = $(uname)"
echo "Netclient Version = $VERSION"

case $(uname | tr A-Z a-z) in
	linux*)
		if [ -z "$CPU_ARCH" ]; then
			CPU_ARCH=$(uname -m)
		fi
		case $CPU_ARCH in
			amd64)
				dist=netclient
			;;
			x86_64)
				dist=netclient
			;;
 			arm64)
				dist=netclient-arm64
			;;
			aarch64)
                dist=netclient-arm64
			;;
			armv6l)
                dist=netclient-arm6
			;;
			armv7l)
                dist=netclient-arm7
			;;
			arm*)
				dist=netclient-$CPU_ARCH
			;;
			mipsle)
                dist=netclient-mipsle
			;;
			mips)
			    #If binary in the below condition is not compatible with your hardware, retry with other netclient-mips* binaries.
				if [[ `printf '\0\1' | hexdump -e '/2 "%04x"'` -eq 0100 ]]; then
					#Little Endian, tested and confirmed in GL-MT1300 OS "OpenWrt 19.07.8"
					dist=netclient-mipsle-softfloat
				else
					#Big Endian, tested and confirmed in DSL-2750U OS "OpenWrt 22.03.2"
					dist=netclient-mips-softfloat
				fi
			;;
			*)
				fatal "$CPU_ARCH : cpu architecture not supported"
    		esac
	;;
	darwin)
        dist=netclient-darwin
	;;
	Darwin)
        dist=netclient-darwin
	;;
	freebsd*)
		if [ -z "$CPU_ARCH" ]; then
			CPU_ARCH=$(uname -m)
		fi
		case $CPU_ARCH in
			amd64)
				dist=netclient-freebsd
			;;
			x86_64)
				dist=netclient-freebsd
			;;
 			arm64)
				dist=netclient-freebsd-arm64
			;;
			aarch64)
                dist=netclient-freebsd-arm64
			;;
			armv7l)
                dist=netclient-freebsd-arm7
			;;
			arm*)
				dist=netclient-freebsd-$CPU_ARCH
            ;;
			*)
				fatal "$CPU_ARCH : cpu architecture not supported"
    		esac
	;;
esac

echo "Binary = $dist"

url="https://github.com/gravitl/netmaker/releases/download/$VERSION/$dist"
curl_opts='-nv'
if [ "${OS}" = "OpenWRT" ] || [ "${OS}" = "TurrisOS" ]; then
	curl_opts='-q'
fi

if curl --output /dev/null --silent --head --fail "$url"; then
	echo "Downloading $dist $VERSION"
	wget $curl_opts -O netclient $url
else
	echo "Downloading $dist latest"
	wget $curl_opts -O netclient https://github.com/gravitl/netmaker/releases/latest/download/$dist
fi

chmod +x netclient

EXTRA_ARGS=""
if [ "${OS}" = "OpenWRT" ] || [ "${OS}" = "TurrisOS" ]; then
	EXTRA_ARGS="--daemon=off"
fi

if [ "${KEY}" != "nokey" ]; then
  if [ -z "${NAME}" ]; then
    ./netclient join -t $KEY $EXTRA_ARGS
  else
    ./netclient join -t $KEY --name $NAME $EXTRA_ARGS
  fi
fi

if [ "${OS}" = "FreeBSD" ]; then
  if ! [ -x /usr/sbin/netclient ]; then
    echo "Moving netclient executable to \"/usr/sbin/netclient\""
    mv netclient /usr/sbin
  else
    echo "Netclient already present."
  fi
fi

if [ "${OS}" = "OpenWRT" ] || [ "${OS}" = "TurrisOS" ]; then
	mv ./netclient /sbin/netclient

	if [ "${OS}" = "TurrisOS" ]; then
		url="https://raw.githubusercontent.com/gravitl/netmaker/$VERSION/scripts/openwrt-daemon.sh"
		if curl --output /dev/null --silent --head --fail $url; then
			wget $curl_opts -O netclient.service.tmp $url
		else
			wget $curl_opts -O netclient.service.tmp https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/openwrt-daemon.sh
		fi
	elif [ "${OS}" = "OpenWRT" ] && [ "$CPU_ARCH" = "mips" ]; then
		wget $curl_opts -O netclient.service.tmp https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/openwrt-daemon.sh
	else
		cat << 'END_OF_FILE' > ./netclient.service.tmp
#!/bin/sh /etc/rc.common

EXTRA_COMMANDS="status"
EXTRA_HELP="        status      Check service is running"
START=99

LOG_FILE="/tmp/netclient.logs"

start() {
  if [ ! -f "${LOG_FILE}" ];then
      touch "${LOG_FILE}"
  fi
  local PID=$(ps|grep "netclient daemon"|grep -v grep|awk '{print $1}')
  if [ "${PID}" ];then
    echo "service is running"
    return
  fi
  bash -c "do /sbin/netclient daemon  >> ${LOG_FILE} 2>&1;\
           if [ $(ls -l ${LOG_FILE}|awk '{print $5}') -gt 10240000 ];then tar zcf "${LOG_FILE}.tar" -C / "tmp/netclient.logs"  && > $LOG_FILE;fi;done &"
  echo "start"
}

stop() {
  pids=$(ps|grep "netclient daemon"|grep -v grep|awk '{print $1}')
  for i in "${pids[@]}"
  do
	if [ "${i}" ];then
		kill "${i}"
	fi
  done
  echo "stop"
}

status() {
  local PID=$(ps|grep "netclient daemon"|grep -v grep|awk '{print $1}')
  if [ "${PID}" ];then
    echo -e "netclient[${PID}] is running \n"
  else
    echo -e "netclient is not running \n"
  fi
}

END_OF_FILE
	fi
	mv ./netclient.service.tmp /etc/init.d/netclient
	chmod +x /etc/init.d/netclient
	/etc/init.d/netclient enable
	/etc/init.d/netclient start
else
	rm -f netclient
fi