#!/usr/local/bin/cbsd
#v11.0.0
CBSDMODULE="node"
MYARG=""
MYOPTARG="verbose root tryoffline norsync"
MYDESC="get put file to remove nodes"
ADDHELP="[verbose=1] node1:remotefile1 localfile1 [ localfile2 node2@:remotefile2 ]\n\
verbose=1 for debug information\n\
tryoffline=1 - try to fetch inventory when node is offline\n\
norsync=1 - do not preffer rsync, use cp only\n"
EXTHELP="wf_nodescp.html"

# ToDo:
# Instead of this need one nodescp daemon/services with one lock and which will work on AMQP queue
# where executing
#     % cbsd nodescp XXX YYY
# just add job to queue

. ${subr}
. ${tools}
. ${strings}
. ${nodes}

init $*

getnode()
{
	local _t

	_t=$( echo ${1} | /usr/bin/grep ":" )

	[ $? -ne 0 ] && return 1

	node=${1%%:*}
	rfile=${1##*:}
}

### MAIN ###
if [ -n "${verbose}" ]; then
	shift
else
	verbose=0
fi

if [ -n "${root}" ]; then
	shift
else
	root=0
fi

if [ "${verbose}" = "0" ]; then
	quiet="-q"
else
	quiet=""
fi

if [ -n "${norsync}" ]; then
	shift
	norsync=1
else
	norsync=0
fi

if [ -z "${tryoffline}" ]; then
	tryoffline=0
	checkforonline="tryoffline=0"
else
	checkforonline="tryoffline=${tryoffline}"
	shift
fi

[ $# -ne 2 ] && err 1 "${MAGENTA}$0 host1:remotefile1 localfile1 [ localfile2 host2@:remotefile2 ]${NORMAL}"
node=""
rfile=""
rarg=0

if getnode $1; then
	if getnode $2; then
		err 1 "${MAGENTA}Only one remote path${NORMAL}"
	fi
	    rarg=1
else
	if getnode $2; then
		rarg=2
	fi
fi

[ -z "${node}" -o -z "${rfile}" ] && err 1 "${MAGENTA}remove path via node:path records not determine${NORMAL}"

NODEDATA=$(cbsdsql nodes select ip,port,keyfile,rootkeyfile from nodelist where nodename=\"${node}\")
[ -z "${NODEDATA}" ] && err 1 "${MAGENTA}No such node in base: ${GREEN}${node}${NORMAL}"

sqllist "${NODEDATA}" myip myport keyfile rootkey

if [ ${tryoffline} -ne 1 ]; then
	if ! check_locktime ${ftmpdir}/shmux_${myip}.lock >/dev/null 2>&1; then
		err 1 "${MAGENTA}Node is offline${NORMAL}"
	fi
fi

# optional flags for disable needed
if [ ${root} -eq 1 -a -r "${rootkey}" ]; then
	[ ${verbose} -eq 1 ] && ${ECHO} "${MAGENTA}Root key specified and exist, preferred: ${GREEN}${rootkey}${NORMAL}"
	key="${rootkey}"
	sshkey_opt="-i ${rootkey}"
	cbsduser="root"
else
	key="${keyfile}"
	sshkey_opt="-i ${keyfile}"
fi

[ ! -r "${key}" ] && sshkey_opt=""

iptype ${myip} >/dev/null 2>&1
_ret=$?

case ${_ret} in
	1)
		proto="-4"
		;;
	2)
		proto="-6"
		myip="[${myip}]"
		;;
	*)
		err 1 "${MAGENTA}nodeaddkey: unknown IP type: ${GREEN}${myip}${NORMAL}"
	;;
esac

SSHOP="${proto} -C -oBatchMode=yes -oStrictHostKeyChecking=no -oConnectTimeout=5 -oControlPath=${sshdir}/sockets/%r@%h:%p ${quiet} -oPort=${myport} ${sshkey_opt} ${myip}"
SCPOP="${proto} -C -oBatchMode=yes -oStrictHostKeyChecking=no -oConnectTimeout=5 -oControlPath=${sshdir}/sockets/%r@%h:%p ${quiet} -oPort=${myport} ${sshkey_opt}"

[ -z "${SCPOP}" -o -z "${myip}" ] && err 1 "${MAGENTA}No such node ${GREEN}${node}${MAGENTA} in database or have no ip/scpopt${NORMAL}"

[ ${norsync} -ne 1 ] && RSYNC=$( /usr/bin/which rsync )

lockname=$( /sbin/md5 -qs "${myip}${rfile}" )

if [ $rarg -eq 1 ]; then
	DIR=$( dirname ${2} )
	[ ! -d "${DIR}" ] && mkdir -p ${DIR}

	if [ -n "${RSYNC}" ]; then
		#we have rsync for that
		[ ${verbose} -eq 1 ] && set -o xtrace
		/usr/bin/lockf -s -t0 ${ftmpdir}/${lockname}.lock ${RSYNC} -azzlH -e "/usr/bin/ssh ${SCPOP}" ${cbsduser}@${myip}:${rfile} ${2}
		err=$?
		[ ${verbose} -eq 1 ] && set +o xtrace
	else
		#no rsync, just scp
		[ ${verbose} -eq 1 ] && set -o xtrace
		/usr/bin/lockf -s -t0 ${ftmpdir}/${lockname}.lock /usr/bin/scp ${SCPOP} -r ${cbsduser}@${myip}:${rfile} ${2}
		err=$?
		[ ${verbose} -eq 1 ] && set +o xtrace
	fi
else
	DIR=$(dirname ${rfile})
	[ ${verbose} -eq 1 ] && set -o xtrace
	/usr/bin/lockf -s -t0 ${ftmpdir}/${lockname}.lock /usr/bin/ssh $SSHOP -l ${cbsduser} <<EOF
[ ! -d "${DIR}" ] && mkdir -p "${DIR}"
EOF
	[ ${verbose} -eq 1 ] && set +o xtrace
	if [ -n "${RSYNC}" ]; then
		#we have rsync for that
		[ ${verbose} -eq 1 ] && set -o xtrace
		/usr/bin/lockf -s -t0 ${ftmpdir}/${lockname}.lock ${RSYNC} -azzlH -e "/usr/bin/ssh ${SCPOP}" ${1} ${cbsduser}@${myip}:${rfile}
		err=$?
		[ ${verbose} -eq 1 ] && set +o xtrace
	else
		#no rsync, just scp
		[ ${verbose} -eq 1 ] && set -o xtrace
		/usr/bin/lockf -s -t0 ${ftmpdir}/${lockname}.lock scp ${SCPOP} -r ${1} ${cbsduser}@${myip}:${rfile}
		err=$?
		[ ${verbose} -eq 1 ] && set +o xtrace
	fi
fi

exit $err
