#!/bin/sh
# vim: cindent:shiftwidth=4:tabstop=4:smarttab:textwidth=100

set -o errexit
#set -o pipefail
set -o nounset
#set -o xtrace

RRD_DIR='/var/lib/observium'
BACKUP_DIR='/var/cache/observium'
BACKUP_AGE=60
#XZ='xz --check=sha256 --lzma2=preset=9e,pb=0,lc=4'	# 95KB/s, 14.4%
#XZ='xz --check=sha256 --lzma2=preset=9e'			# 95KB/s, 14.1%
XZ='xz --check=sha256 --lzma2=preset=9'				# 570KB/s, 15.1%
XML_EXPANSION_PERMILLE='4099'

cd $RRD_DIR

if [ ! -d $BACKUP_DIR ]; then
	mkdir $BACKUP_DIR
fi

for NODE in *; do
	(
	if [ ! -d "$NODE" ]; then
		continue
	fi

	# empty directories
	RRD_FILES=$(find "$NODE" -type f -name '*.rrd')
	if [ -z "$RRD_FILES" ]; then
		continue
	fi

	cd "$NODE"
	RRD_SIZE=$(du --apparent-size . | awk '{print $1}')

	XML_SIZE_PREDICTED=$((RRD_SIZE*XML_EXPANSION_PERMILLE/1000))
	TMP_AVAILABLE=$(df --output=avail /tmp | awk '(NR!=1){print}')
	if [ $XML_SIZE_PREDICTED -gt $TMP_AVAILABLE ]; then
		export TMPDIR='/var/tmp'
	fi

	XML_TMPDIR=$(mktemp --directory)
	mkdir "$XML_TMPDIR/$NODE"
	for RESOURCE_RRD in *.rrd; do
		RESOURCE=${RESOURCE_RRD%%.rrd}
		RESOURCE_XML="$XML_TMPDIR/$NODE/$RESOURCE.xml"
		rrdtool dump "$RESOURCE_RRD" > "$RESOURCE_XML"
		touch --no-create --reference="$RESOURCE_RRD" "$RESOURCE_XML"
	done

	XML_SIZE=$(du --apparent-size "$XML_TMPDIR/$NODE" | awk '{print $1}')
	nice tar --use-compress-program="$XZ" --directory="$XML_TMPDIR" --remove-files \
		--create --file "$BACKUP_DIR/$NODE.tar.xz.tmp" "$NODE"
	rmdir $XML_TMPDIR
	mv "$BACKUP_DIR/$NODE.tar.xz.tmp" "$BACKUP_DIR/$NODE.tar.xz"
	TARXZ_SIZE=$(du --apparent-size "$BACKUP_DIR/$NODE.tar.xz" | awk '{print $1}')

	logger -p daemon.info -t $0 "$NODE: RRD ${RRD_SIZE} KiB," "XML ${XML_SIZE}/${XML_SIZE_PREDICTED} KiB," "tar.xz ${TARXZ_SIZE} KiB"
	)
done

find $BACKUP_DIR -type f -mtime +$BACKUP_AGE -print0 |
	xargs --null --no-run-if-empty rm --verbose --
