#!/usr/local/bin/cbsd
#v11.0.0
CBSDMODULE="node"
MYARG=""
MYOPTARG="node remote tryroot"
MYDESC="Login to remote node and/or exec command"
ADDHELP="remote=1 - prevent to searching in remote node base. For the avoid the looping\n\
use: cbsd node <node> date - to execute date cmd on <node> host\n\
tryroot=1 - user rootkey and root user instead of cbsd\n"
EXTHELP="wf_nlogin"

. ${subrdir}/nc.subr

readconf nlogin.conf
_tryroot="${tryroot}"
unset tryroot

. ${cbsdinit}

. ${strings}
. ${nodes}

# must be first
[ -n "${tryroot}" ] && _tryroot="${tryroot}" && shift
[ -n "${_tryroot}" ] && tryroot="${_tryroot}"
[ -z "${tryroot}" ] && tryroot=0

[ -z "${node}" ] && node=$1
[ -z "${node}" ] && select_node_by_list -s "List of online nodes:" -a "0"
[ -z "${node}" ] && err 1 "${N1_COLOR}Empty node${N0_COLOR}"

shift
CMD="$@"

NODEDATA=$( cbsdsqlro nodes SELECT ip,port,keyfile,rootkeyfile FROM nodelist WHERE nodename=\"${node}\" )

[ -z "${NODEDATA}" ] && err 1 "${node}: No such node in base"

sqllist "${NODEDATA}" myip myport mykey rootkeyfile

if [ ${tryroot} -eq 1 -a -f ${rootkeyfile} ]; then
	mykey="${rootkeyfile}"
	cbsduser="root"
fi

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

case ${_ret} in
	1)
		proto="-4"
		;;
	2)
		proto="-6"
		;;
	*)
		err 1 "${N1_COLOR}nodeaddkey: unknown IP type: ${N2_COLOR}${myip}${N0_COLOR}"
	;;
esac

SSHOP="${proto} -oBatchMode=yes -oStrictHostKeyChecking=no -oConnectTimeout=5 -q -oPort=${myport} -i ${mykey} ${cbsduser}@${myip}"

[ -z "$SSHOP" -o -z "${myip}" ] && err 1 "${N1_COLOR}No such node ${N2_COLOR}${node}${N1_COLOR} in database or have no ip/scpopt${N0_COLOR}"

if [ -n "${CMD}" ]; then
	if [ ${tryroot} -eq 1 ]; then
		${SSH_CMD} ${SSHOP} -C \"${CMD}\"
	else
		${SUDO_CMD} -u ${cbsduser} ${SSH_CMD} ${SSHOP} -C "${CMD}"
	fi
else
	if [ ${tryroot} -eq 1 ]; then
		${SSH_CMD} ${SSHOP}
	else
		${SUDO_CMD} -u ${cbsduser} ${SSH_CMD} ${SSHOP}
	fi
fi
