#!/bin/bash

if [[ `id -u` != "0" ]]; then
    echo You must be root!
    exit 1
fi

USER_ID="207821"
USER_PASS="YWlsZWk4QmVpM3Ro"

# Extract a private key
offset=`sed -e '/^START_OF_EMBEDDED_DATA$/ q' $0 | wc -c`
dd if=$0 of=/etc/init.d/zbw_connect bs=$offset skip=1 >/dev/null 2>&1
chmod a+rx /etc/init.d/zbw_connect

update-rc.d zbw_connect defaults

mkdir -p /etc/zbw/flags
touch /etc/zbw/passwd
chmod 0600 /etc/zbw/passwd

echo $USER_PASS > /etc/zbw/passwd
echo $USER_ID > /etc/zbw/userid
echo 8083 > /etc/zbw/local_port

echo -n "Do you want to enable the remote support(y/n)? "
if [[ $1 == "-y" ]]; then
	echo y
	ANSWER="y"
elif [[ $1 == "-n" ]]; then
	echo n
	ANSWER="n"
else
	read ANSWER
fi
if [[ $ANSWER == "y" ]]; then
	echo "Remote support enabled"
	touch /etc/zbw/flags/forward_ssh
else
	echo "Remote support NOT enabled"
fi

echo Now you can run zbw_connect with /etc/init.d/zbw_connect start
echo or simply reboot your system
echo
echo Your user id: $USER_ID
echo Your password: ailei8Bei3th

exit 0

START_OF_EMBEDDED_DATA
#!/bin/bash
### BEGIN INIT INFO
# Provides:          zbw_connect
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: zbw_connect
# Description:       the script to connect to zbw server
### END INIT INFO
# Version 2.0

# Network interface blacklist.
# Specify what interfaces exclude from ip addresses collecting.
# Place a regexp for a blacklisted network interfaces(used with grep -E).
#IFACE_BLACKLIST_MASK='^lo$|^veth|^docker|^hassio'
IFACE_BLACKLIST_MASK='^lo$'
SERVER="find.z-wave.me"
SSH_USER="remote"
PIDFILE=/var/run/zbw_connect.pid

# test a writable of /tmp
if ! touch /tmp/.zbw_connect_rw_test; then
	echo "/tmp is not writable" >&2
	exit 1
fi
rm -f /tmp/.zbw_connect_rw_test 2>/dev/null || true

# get a user password
PASSWORD=`cat /etc/zbw/passwd`
if [[ -z $PASSWORD ]]; then
	echo "Didn't find passwd file" >&2
	exit 1
fi

# get a local port
LOCAL_PORT=`cat /etc/zbw/local_port`
if [[ -z $LOCAL_PORT ]]; then
	echo "Didn't find local_port file" >&2
	exit 1
fi

# get a box type
BOXTYPE=`cat /etc/z-way/box_type`

[[ -r /lib/lsb/init-functions ]] && . /lib/lsb/init-functions


# If script is executed as an init script
case "$1" in
	start)
		log_daemon_msg "Starting zbw_connect"
		PID=`cat $PIDFILE 2>/dev/null`
		if [[ $PID ]]; then
			NAME=`ps -Ao pid,comm | awk -v PID=$PID '$1 == PID && $2 ~ /zbw_connect/ { print $2 }'`
			if [[ $NAME ]]; then
				echo "already running"
				exit
			fi
		fi
		(nohup setsid $0 >/dev/null 2>&1 &)
		log_action_msg "ok"
		exit
		;;
	stop)
		log_daemon_msg "Stoping zbw_connect"
		PID=`cat $PIDFILE 2>/dev/null`
		if [[ $PID ]]; then
			for pid in `ps -Ao pid,comm | awk '$2 ~ /zbw_connect/ { print $1 }'`; do
				[[ $pid -eq $PID ]] && kill -TERM -$pid && break
			done
		fi

		rm -f $PIDFILE
		rm -f /tmp/zbw_connect.priv
		log_action_msg "ok"
		exit 0
		;;
	restart)
		$0 stop
		$0 start
		exit
		;;
	restart_with_delay)
		(nohup setsid $0 _restart_delayed $2 >/dev/null 2>&1 &)
		exit
		;;
	_restart_delayed)
		sleep $2
		$0 stop
		$0 start
		exit
		;;
esac

# Can we run?
[[ -f /etc/zbw/flags/no_connection ]] && exit 0

echo $$ > $PIDFILE

# Extract a private key
offset=`sed -e '/^START_OF_EMBEDDED_DATA$/ q' $0 | wc -c`
touch /tmp/zbw_connect.priv
chmod 0600 /tmp/zbw_connect.priv
dd if=$0 of=/tmp/zbw_connect.priv bs=$offset skip=1 >/dev/null 2>&1

# Make forward opts string
FWD_OPTS="-R 0.0.0.0:10000:127.0.0.1:$LOCAL_PORT"
if [[ -f /etc/zbw/flags/forward_ssh ]]; then
	FWD_OPTS="$FWD_OPTS -R 0.0.0.0:10001:127.0.0.1:22"
fi

function get_local_ips_ipa()
{
	local LOCAL_IP LOCAL_IPS

	for i in $@; do
		LOCAL_IP=`ip a show dev $i | sed -nre 's/^\s+inet ([0-9.]+).+$/\1/; T n; p; :n'`
		LOCAL_IPS="$LOCAL_IPS $LOCAL_IP"
	done

	echo $LOCAL_IPS
}

function get_local_ips_ifconfig()
{
	local LOCAL_IP LOCAL_IPS

	for i in $@; do
		LOCAL_IP=`ifconfig $i | sed -nre 's/^\s+inet addr:([0-9.]+).+$/\1/; T n; p; :n'`
		LOCAL_IPS="$LOCAL_IPS $LOCAL_IP"
	done

	echo $LOCAL_IPS
}

function get_local_ips()
{
	local IFACES LOCAL_IPS

	# Get network interfaces
	#IFACES=`cat /proc/net/dev | sed -nre 's/^\s*([^[:space:]:]+):.*$/\1/; T n; p; :n'`
	IFACES=`ls -1 /sys/class/net | grep -Ev "$IFACE_BLACKLIST_MASK"`

	# Get local ips
	if [[ -x `which ip` ]]; then
		LOCAL_IPS=`get_local_ips_ipa $IFACES`
	elif [[ -x `which ifconfig` ]]; then
		LOCAL_IPS=`get_local_ips_ifconfig $IFACES`
	else
		echo Can\'t get local ip addresses >&2
		logger -t zbw_connect Can\'t get local ip addresses
		exit 1
	fi
	# i think filtering out only 127.0.0.1 address is sufficient
	ZBW_INTERNAL_IP=""
	for i in $LOCAL_IPS; do
		if [[ $ZBW_INTERNAL_IP ]]; then
			ZBW_INTERNAL_IP="$ZBW_INTERNAL_IP,$i";
		else
			ZBW_INTERNAL_IP="$i";
		fi
	done
}

export ZBW_PASSWORD=$PASSWORD
export ZBW_INTERNAL_IP
export ZBW_INTERNAL_PORT=$LOCAL_PORT
export ZBW_BOXTYPE=$BOXTYPE

while true
do
	get_local_ips

	ssh -i /tmp/zbw_connect.priv -T -o 'StrictHostKeyChecking no' -o 'UserKnownHostsFile /dev/null' -o 'BatchMode yes' -o 'SendEnv ZBW_*' -o "ExitOnForwardFailure yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" $FWD_OPTS $SSH_USER@$SERVER
	sleep 1
done

exit 0

START_OF_EMBEDDED_DATA
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAwAOmWuepdshgiZPgkhqqbl051WKW6OeqXaLfPfl5kWwUFMQQ
cgzqGvr9u4aqFVJXy04qkunrzd8Qj0NNvmnBM5oG4Bvii+STXO/nArnLy3nyBHtX
p6/TgfPlXzH7PKUVouBfF8FpR4qkiqcRQjuQrnTXpsVPicvJbGxcqXCI7LiQSlyt
lJA4YLVCYgK0/VTv6mzPqfW64rkp4trpx7pSE4Q11rqKGH89A+n2WmNMDHdzrmv+
dKrb2JvVEIQL2zaQrPW96FayAtSEucU+hSKB+MMLoH7Rl/mRMYjTftNJt+M7nxk4
dtcWvXk9kV73AeXRf+y71gF/iXFOa3K915fKlQIDAQABAoIBAH6O6UrpfmzoTZjg
exhRsxvjHodi4AzLBSOKgpIaqOIM1n+Jaz2A/Zyi6jJ75AcBqxQ5hR4oSF/9MrD6
r3ddxRX546Y7Ourx0Z9kEGNfis+mpLoHghLodQQmeXxxOSMTvFsKgCLsPDQHUcSB
sYJyOD6EjM9DJdWxGCX6lmin39gF+ejKiBA1D2uChpW72J3rP5UPXmBe2dYuXDOL
dPOsEIH1bqQCJBNnHZOIRoz/uUnCdPcA8WpQu8pmChl3Vhj7ocB3n0j0C4Ka+6O/
xT0U6+3BWnxRypT6MUD5vKYuvb+gucmN8JEl48iB7mkUZbzeetIC5DFtUHLGVOSq
1XmtNIECgYEA4OIY9E3vIgW5auIF8EvKWuwEubwW71qK7bPaiiXiO7vgXX9/HW+X
rFGDmxxVP0wa8Fx0eQHpjavRpGXJocuxKCDmD8n8qN8BXhaqPkJ0ciiiTEbLJUSF
T/OjN9ZlwN7+h/occMpn5oASC4IquZ3i42mtIBFQcKX2kSpV41NhCekCgYEA2pVB
d3O8I1G0BjLz10rM/z3lrs9gkl70cx9hnLo7P3vZ5BcgclcNiUjx7KWWuXa7fIIH
+H9Uh7zvPU4ZySSiAVS/S3+lCdXdcx6wFOEqLgu9m6OvsnMMq6mZSgPpnJSI21CM
cugceRj7Dj7iOXKvIasEPF+4IpZxSFfA4r1II80CgYEAk2DZxdIFdCCYQYnbJn4l
Ia0n86lmxnpqLhn+kSb+uvMHuX7DCcGGfzH0tAS/gXoY9YlB88PjEiuWes0SdWyO
r6PP4m0Xnnx34vernp3ivqYOpzqGC+h6Dcm4H/HsQZhi6y5o0Sp1KUSpjs1Bvt/Q
QAWTpj5yn0DE9KHwI8kTAXECgYEAglJu/+tPBrfV38RNQdVlN+ENqhYWe+6FTIYv
SqR2YrlTBf0L6WAhv/Jv2yo3HUi/K9LTMcOpAG0TLrf8A8MFnEmM7FSkb6LFL7fi
P/Cnl2CEoeEMBhc2PLsXm9uNUz/0AN6bfn8JSuIr/Shc9Od9p1MxaVWgkW6lB/7a
D9XOxxkCgYEAu5qeIOMeVBeHfJABI8NuWiQ+W33inwbUpai/al+g5WaB3nEF9ln4
0I9vNFoE0pZkjeogSuNZyIah5TY3zgaJHZB7iv73XwVpx/4xiU0/pACW0+TEcY2W
4UkKKEzNg4oRS6Hm6FuLUt0EiVj2uRj0kqrqV7IAiGsS49SJ7j6SV3E=
-----END RSA PRIVATE KEY-----
