#!/bin/bash

SERVICE_NAME="safeq"

TIMEOUT="5400" #90s * 60 sec = 1.5h
TIMEOUT_KILL="60" # 60 sec to kill after timeout

FACILITY_NAME=$1
DESTINATION=$2
DESTINATION_TYPE=$3

SERVICE_FILES_BASE_DIR="`pwd`/../gen/spool"
SERVICE_FILES_DIR="$SERVICE_FILES_BASE_DIR/$FACILITY_NAME/$SERVICE_NAME"
SERVICE_ERROR_DIR="$DESTINATION/Log_Error"
SERVICE_ERROR_LOG="$SERVICE_ERROR_DIR/safeq_err.log"

### Status codes
E_LDIFSORT_FILE=(53 'Could not sort LDIFF')
E_LDIFDIFF_FILE=(54 'Could not diff LDIFFs')
E_REMOVE_FILE=(55 'Could not remove file')
E_CREATE_DIR=(56 'Could not create directory')

###Function catch error from perun-services/slave/perun
function catch_error {
	ERROR_NAME="$1"
	shift

	exec 3>&1
	ERR_TXT=`"$@" 2>&1 1>&3`
	ERR=$?
	exec 3>&-
	if [ "$ERR_TXT" ]; then echo "$ERR_TXT" >&2; fi
	if [ $ERR -ne 0 ]; then log_msg ${ERROR_NAME} "${ERR_TXT}"; fi
}

###Function log_msg from perun-services/slave/perun
function log_msg {
	CODE=`eval echo '${'$1'[0]}'`
	TEXT=`eval echo '${'$1'[1]}" ("$2")"'`
	TEXT=`eval echo \"${TEXT}\"`	# expand variables in message
	CODE=${CODE:=255}
	TEXT=${TEXT:=Unknown error $1}
	TIME=`date "+%H:%M:%S"`

	if [ "${CODE}" -eq 0 ]; then
		MSG="Info: ${TEXT}"
		echo "${TIME} ${MSG}"
		logger -t "${NAME}" -p daemon.info "${SERVICE}: ${MSG}" &>/dev/null
	else
		MSG="Error $1 (code=${CODE}): ${TEXT}"
		echo "${TIME} ${MSG}" >&2
		logger -t "${NAME}" -p daemon.error "${SERVICE}: ${MSG}" &>/dev/null
		exit "${CODE}"
	fi
}

#if there is no destination type, end with error
if [ -z "$DESTINATION_TYPE" ]; then
	echo "Missing destination type." >&2
	exit 1;
fi

case $DESTINATION_TYPE in
	service-specific)
		DESTINATION_DIR="$DESTINATION"
		;;
	user@host-windows)
		. generic_send
		exit 0;
		;;
	*)
		echo "Unknown destination type '$DESTINATION_TYPE'." >&2
		exit 1;
		;;
esac

if [ ! -d "$SERVICE_ERROR_DIR" ]; then
	catch_error E_CREATE_DIR mkdir "$SERVICE_ERROR_DIR"
fi

if [ -e "$SERVICE_ERROR_LOG" ]; then
	echo "Previous run of service ended up with error: `cat $SERVICE_ERROR_LOG`." >&2
	echo "After resolving the error delete file '$SERVICE_ERROR_LOG'." >&2
	exit 1;
fi

#Just safety check. This should not happen.
if [ ! -d "$SERVICE_FILES_DIR" ]; then echo '$SERVICE_FILES_DIR: '$SERVICE_FILES_DIR' is not a directory' >&2 ; exit 1; fi

#unless specific configuration for destination exists use common configuration for all destination
[ -d "$SERVICE_FILES_FOR_DESTINATION" ] || SERVICE_FILES_FOR_DESTINATION="$SERVICE_FILES_DIR/_destination/all"

# sort & diff scripts from CPAN
LDIFDIFF="./ldifdiff.pl"
LDIFSORT="./ldifsort.pl"

SAFEQ_LDIF_SORT="./safeq-ldif-sort.pl";


# work files location
INFILE="$SERVICE_FILES_DIR/safeq"
OLD_FILE="$DESTINATION_DIR/safeq-content.ldif"

# sorted work files
SINFILE=`mktemp --tmpdir=/tmp sorted-safeq-XXXXXX.ldif`
S_OLD_FILE=`mktemp --tmpdir=/tmp sorted-safeq-old-XXXXXXX.ldif`

LDIF=`mktemp --tmpdir=/tmp safeq-ldif-XXXXXXX.ldif`
FINAL=`mktemp --tmpdir=/tmp safeq-final-XXXXXX.ldif`

if test -s "$OLD_FILE"; then
# LDAP is not empty under base DN

	# SORT LDIFs
	catch_error E_LDIFSORT_FILE $LDIFSORT -k dn $OLD_FILE >$S_OLD_FILE
	catch_error E_LDIFSORT_FILE $LDIFSORT -k dn $INFILE >$SINFILE

	# DIFF LDIFs
	catch_error E_LDIFDIFF_FILE $LDIFDIFF -k dn $SINFILE $S_OLD_FILE > $LDIF
	sed '1,1{/^$/d; }; /^[^ ].*/N; s/\n //g' $LDIF | $SAFEQ_LDIF_SORT > "$FINAL"

else
# LDAP is empty under base DN

	echo "File with old stat is missing: $OLD_FILE"  >&2
	exit 5;

	#$LDIFSORT -k dn $INFILE >$SINFILE

	#$LDIFDIFF -k dn $SINFILE /dev/null | sed '1,1{/^$/d; }; /^[^ ].*/N; s/\n //g' | $SAFEQ_LDIF_SORT  > "$FINAL"

fi

catch_error E_REMOVE_FILE rm "$SINFILE" "$S_OLD_FILE" "$LDIF"
TIMESTAMP=`date "+%F_%H.%M.%S"`

if [ `stat -c %s "$FINAL"` -gt 1  ]; then #first line of file is always empty
	mv "$FINAL" "$DESTINATION_DIR/data/safeq-$TIMESTAMP.ldif"
	if [ $? -ne 0 ]; then
		echo "Could not move file ${FINAL} to ${DESTINATION_DIR}/data/safeq-${TIMESTAMP}.ldif" >> "$SERVICE_ERROR_LOG"
	fi
else
	rm "$FINAL"
	if [ $? -ne 0 ]; then
		echo "Could not remove ${FINAL}" >> "$SERVICE_ERROR_LOG"
	fi
	echo No changes
fi
cp "$INFILE" "$DESTINATION_DIR/backup-data-from-perun/safeq-content-$TIMESTAMP.ldif"
if [ $? -ne 0 ]; then
	echo "Could not copy ${INFILE} to ${DESTINATION_DIR}/backup-data-from-perun/safeq-content-${TIMESTAMP}.ldif" >> "$SERVICE_ERROR_LOG"
fi
cp "$INFILE" "$OLD_FILE"
if [ $? -ne 0 ]; then
	echo "Could not copy ${INFILE} to ${OLD_FILE}" >> "$SERVICE_ERROR_LOG"
fi
if [ -e "$SERVICE_ERROR_LOG" ]; then cat $SERVICE_ERROR_LOG >&2 ; exit 1; fi

