#!/usr/local/bin/cbsd
#v9.2.2
MYARG="jname"
MYOPTARG="mode"
MYDESC="Collect RCTL count for jail if availeble"
ADDHELP="jname = alljails for cyclic collect via all online jails\n\
mode = nozero - skip for ipfw zero for counters\n\
mode = remove - remove counters after collect info\n"

. ${subrdir}/nc.subr

. ${cbsdinit}

getalljails()
{
	cbsdsqlro local SELECT jname FROM jails WHERE status=1 |while read jname; do
		rctlinit
		insert
	done
}

# prepare dir by $jname
rctlinit()
{
	RCTLDIR="${jailsysdir}/${jname}/rctl"
	[ ! -d "${RCTLDIR}" ] && mkdir -p ${RCTLDIR} && chown $cbsduser:$cbsduser ${RCTLDIR}
	CURDATE=$( ${DATE_CMD} "+%Y-%m" )
	RCTLFILE="${RCTLDIR}/${CURDATE}.sqlite"

	if [ ! -f "${RCTLFILE}" ]; then
		/usr/local/bin/cbsd ${miscdir}/updatesql ${RCTLFILE} ${distdir}/share/local-rctl.schema rctl
		/usr/sbin/chown $cbsduser:$cbsduser ${RCTLFILE}
	fi
}

checkjail()
{
	A=$( cbsdsqlro local SELECT status FROM jails WHERE jname=\"$jname\" )
	[ "${A}" = "1" ] && return 1
	return 0
}

insert()
{
	[ ! -f "${ftmpdir}/${jname}-fwin" -o ! -f "${ftmpdir}/${jname}-fwout" ] && return 0

	FWIN=$( ${CAT_CMD} ${ftmpdir}/${jname}-fwin 2>/dev/null )
	FWOUT=$( ${CAT_CMD} ${ftmpdir}/${jname}-fwout 2>/dev/null )

	### FWIN
	BIN=$( /sbin/ipfw show ${FWIN} | ${AWK_CMD} '/count /{print $3"\n"}' )
	INCODE=$?

	### FWOUT
	BOUT=$( /sbin/ipfw show ${FWOUT} | ${AWK_CMD} '/count /{print $3"\n"}' )
	OUTCODE=$?

	if [ ${INCODE} -eq 0 -a ${OUTCODE} -eq 0 ]; then
		[ "${mode}" != "nozero" -o "${mode}" != "remove" ] && /sbin/ipfw -q zero ${FWIN} ${FWOUT} 2>/dev/null
		${miscdir}/sqlcli ${RCTLFILE} "INSERT INTO rctl ( dt, cputime, datasize, memoryuse, maxproc, openfiles, vmemoryuse, swapuse, nthr, wallclock, pcpu )  VALUES ( ${BIN}, ${BOUT} )"
	fi

	[ "${mode}" = "remove" ] && ipfw -q delete ${FWIN} ${FWOUT}
}



#MAIN
[ ${ipfw_enable} -eq 0 -a -z "`${SYSCTL_CMD} -n net.inet.ip.fw.enable 2>/dev/null`" ] && exit

case "${jname}" in
	"alljails")
		getalljails
		;;
	*)
		if ! checkjail; then
			rctlinit
			insert
		fi
		;;
esac
