#!/usr/local/bin/cbsd
#v11.2.1
MYARG=""
MYOPTARG="node data jname tryoffline"
MYDESC="Fetch sqldb from remote node"
ADDHELP="when node argument is empty - retrieve db from all nodes from node lists\n\
data can be - jdescr,nodedescr,db,rctl,fwcnt,bhyve,jail. If not specify - retrieive all of them\n\
jname - fetch data only for specified jail\n\
tryoffline=1 - try to fetch inventory when node is offline\n"

. ${subrdir}/nc.subr

. ${cbsdinit}

. ${nodes}

retr_db()
{
	local _rnode=${1}

	[ -z "${_rnode}" ] && return 0

	nodescp ${checkforonline} ${_rnode}:var/db/inv.${_rnode}.sqlite ${dbdir}/${_rnode}.sqlite && /bin/chmod 0640 "${dbdir}/${_rnode}.sqlite" && /usr/sbin/chown ${cbsduser} "${dbdir}/${_rnode}.sqlite"
	if [ $? -eq 0 ]; then
		${ECHO} "${N1_COLOR}CBSD: Fetching inventory done: ${N2_COLOR}${_rnode}${N0_COLOR}"
		idle_update ${_rnode}
	else
		${ECHO} "${N1_COLOR}CBSD: Fetching inventory failed: ${N2_COLOR}${_rnode}${N0_COLOR}"
	fi
}

retr_nodedescr()
{
	local _rnode=${1} _files _i

	[ -z "${_rnode}" ] && return 0

	[ ! -d "${dbdir}/nodedescr" ] && /bin/mkdir -m 0700 -p "${dbdir}/nodedescr" && /bin/chmod 0640 "${dbdir}/nodedescr" && ${cbsduser} "${dbdir}/nodedescr"

	_files="descr role domain notes location"

	for _i in ${_files}; do
		nodescp ${checkforonline} ${_rnode}:node.${_i} ${dbdir}/nodedescr/${_rnode}.${_i} 2>/dev/null && /bin/chmod 0640 "${dbdir}/nodedescr/${_rnode}.${_i}" && /usr/bin/chown ${cbsduser} "${dbdir}/nodedescr/${_rnode}.${_i}" 2>/dev/null
	done
}

# todo: check for shared FS
retr_bhyve()
{
	local _rnode=${1} _files _i _sqlfile
	local _tmpdir

	[ -z "${_rnode}" ] && return 0

	_tmpdir="${tmpdir}/${_rnode}"

	[ ! -d ${_tmpdir} ] && /bin/mkdir -p ${_tmpdir}

	cbsdsqlro ${_rnode} SELECT jname FROM jails WHERE emulator=\"bhyve\" ORDER BY jname ASC | while read jname; do
		[ ! -d ${_tmpdir}/${jname} ] && /bin/mkdir -p ${_tmpdir}/${jname}

		_files="jails-system/${jname}"
		nodescp ${checkforonline} ${_rnode}:${_files}/local.sqlite ${_tmpdir}/${jname}/local.sqlite 2>/dev/null
		nodescp ${checkforonline} ${_rnode}:${_files}/vnc_port ${_tmpdir}/${jname}/vnc_port 2>/dev/null
	done
}

retr_jail()
{
	local _rnode=${1} _files _i _sqlfile
	local _tmpdir

	[ -z "${_rnode}" ] && return 0
	_tmpdir="${tmpdir}/${_rnode}"

	[ ! -d ${_tmpdir} ] && /bin/mkdir -p ${_tmpdir}

}


retr_jdescr()
{
	local _rnode=${1} _jname

	[ -z "${_rnode}" ] && return 0

	[ ! -f "${dbdir}/${_rnode}.sqlite" ] && return 0
	[ ! -d "${dbdir}/nodedescr" ] && /bin/mkdir -p "${dbdir}/nodedescr"

	if [ -z "$jname" ]; then
		_jname=$( cbsd -c "cbsdsqlro ${_rnode} SELECT jname FROM jails WHERE status\<2" )
	else
		_jname=${jname}
	fi

	[ -z "${_jname}" ] && return 0

	for _i in ${_jname}; do
		nodescp ${checkforonline} ${_rnode}:jails-system/${_i}/descr ${dbdir}/nodedescr/${_rnode}.${_i}.descr 2>/dev/null && /bin/chmod 0640 "${dbdir}/nodedescr/${_rnode}.${_i}.descr" && /usr/bin/chown ${cbsduser} "${dbdir}/nodedescr/${_rnode}.${_i}.descr" 2>/dev/null
	done
}

retr_rctl()
{
	local _rnode=${1} _jname

	[ -z "${_rnode}" ] && return 0

	[ ! -f "${dbdir}/${_rnode}.sqlite" ] && return 0

	if [ -z "$jname" ]; then
		_jname=$( cbsd -c "cbsdsqlro ${_rnode} SELECT jname FROM jails WHERE status\<2" )
	else
		_jname=${jname}
	fi

	[ -z "${_jname}" ] && return 0

	for _i in ${_jname}; do
		[ ! -d "${dbdir}/rctl/${_rnode}-${_i}" ] && /bin/mkdir -p "${dbdir}/rctl/${_rnode}-${_i}"
		nodescp ${checkforonline} ${_rnode}:jails-system/${_i}/rctl/* ${dbdir}/rctl/${_rnode}.${_i}.descr 2>/dev/null && /bin/chmod 0640 ${dbdir}/rctl/${_rnode}-${_i}/* && /usr/bin/chown ${cbsduser} ${dbdir}/rctl/${_rnode}-${_i}/* 2>/dev/null
	done
}

retr_fwcnt()
{
	local _rnode=${1} _jname

	[ -z "${_rnode}" ] && return 0

	[ ! -f "${dbdir}/${_rnode}.sqlite" ] && return 0

	if [ -z "$jname" ]; then
		_jname=$( cbsd -c "cbsdsqlro ${_rnode} SELECT jname FROM jails WHERE status\<2" )
	else
		_jname=${jname}
	fi

	[ -z "${_jname}" ] && return 0

	for _i in ${_jname}; do
		[ ! -d "${dbdir}/fwcnt/${_rnode}-${_i}" ] && /bin/mkdir -p "${dbdir}/fwcnt/${_rnode}-${_i}"
		nodescp ${checkforonline} ${_rnode}:jails-system/${_i}/traffic/* ${dbdir}/fwcnt/${_rnode}-${_i}/ 2>/dev/null && /bin/chmod 0640 ${dbdir}/fwcnt/${_rnode}-${_i}/* && /usr/bin/chown ${cbsduser} ${dbdir}/fwcnt/${_rnode}-${_i}/* 2>/dev/null
	done
}


# MAIN #
[ -z "${data}" ] && data="db jdescr nodedescr rctl fwcnt bhyve jail"
if [ -z "${tryoffline}" ]; then
	tryoffline=0
	checkforonline="tryoffline=0"
else
	checkforonline="tryoffline=${tryoffline}"
fi

if [ -z "${node}" ]; then
	sqldelimer=" "
	node=$( cbsdsqlro nodes select nodename from nodelist 2>/dev/null )
	unset sqldelimer
fi

# check node online and repopulate array of online nodes if needed
if [ ${sqlreplica} -eq 1 -a ${tryoffline} -eq 0 ]; then
	testnode="${node}"
	node=""
	for i in ${testnode}; do
		NODEDATA=$( cbsdsqlro nodes select ip,port,keyfile from nodelist where nodename=\"${i}\" )
		sqllist "${NODEDATA}" myip myport mykey

		if ! check_locktime ${ftmpdir}/shmux_${myip}.lock >/dev/null 2>&1; then
			${ECHO} "${N1_COLOR}Node is offline: ${N2_COLOR}${i}${N0_COLOR}"
			continue
		fi
		node="${node} ${i}"
	done
fi


for i in ${node}; do
	for items in ${data}; do
		case "${items}" in
			db)
				retr_db ${i}
				;;
			nodedescr)
				retr_nodedescr ${i}
				;;
			jdescr)
				retr_jdescr ${i}
				;;
			# rctl)
			# retr_rctl ${i}
			# ;;
			fwcnt)
				retr_fwcnt ${i}
				;;
			bhyve)
				retr_bhyve ${i}
				;;
			jail)
				retr_jail ${i}
				;;
		esac
	done
done

exit 0
