#! /bin/bash

_TMPFILE=$0.$$
_XSLTFILE="parselog.xslt"
 
# Validate we have the external programs necessary for this script to work
_CHECK="true"
_PROGRAMS_TO_CHECK=( "base64" "cat" "xmllint" "xsltproc" )

for _PROGRAM in "${_PROGRAMS_TO_CHECK[@]}"
do
  command -v $_PROGRAM >/dev/null 2>&1 || \
  { echo "$_PROGRAM is required and could not be found." >&2; _CHECK="false"; }
done

if [[ ! "X$_CHECK" = "Xtrue" ]]
then
  echo "Aborting." >&2
  exit 1
fi

# Input parameters validation
if [[ -z "$1" || "X$1" == "X-h" || "$1" == "X--help" ]]
then
  echo "  Please use $0 auditlog_File_To_Parse"
  echo
  echo "  The auditlog file should be an XML structured file created by an"
  echo "  IDM driver using the XML log feature of the package DRVUTIL."
  echo "  If there is a XSLT file parselog.xslt on the same directory as this"
  echo "  script the same will be used, otherwise a default one will be used."
  exit 1
fi

if [[ ! -e $1 ]]
then
        echo "$1 could not be found, check the path and name then try again."
        exit 1
fi
_INPUTFILE=$1

# Check for the presence of the XSLT file, create it if not available 
# on the current working path if the file was auto-created we assume
#  it should not persist past script execution so will be removed at the end
_REMOVEXSLT="false"
if [[ ! -e $_XSLTFILE ]]
then
  _xslt_parse="\
PHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZ\
y8xOTk5L1hTTC9UcmFuc2Zvcm0iPgo8eHNsOm91dHB1dCBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieW\
VzIi8+Cjx4c2w6dmFyaWFibGUgbmFtZT0ibmV3bGluZSIgc2VsZWN0PSInJiN4YTsnIi8+Cjx4c2w\
6dmFyaWFibGUgbmFtZT0idGFiIiBzZWxlY3Q9IicmI3gwOTsnIi8+Cjx4c2w6dGVtcGxhdGUgbWF0\
Y2g9ImxvZyI+Cgk8IS0tIE9uZSBsaW5lIHN0YXJ0aW5nIHdpdGggdGltZXN0YW1wLCA7IGRlbGlta\
XRlZCAtLT4KCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3RhcnQtdGltZSIvPjx4c2w6dGV4dD47PC\
94c2w6dGV4dD4KCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZHJpdmVyIi8+PHhzbDp0ZXh0Pjs8L3h\
zbDp0ZXh0PgoJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb3JyZWxhdGlvbi1pZCIvPjx4c2w6dGV4\
dD47PC94c2w6dGV4dD4KCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXNzb2NpYXRpb24iLz48eHNsO\
nRleHQ+OzwveHNsOnRleHQ+Cgk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGV2ZW50Ii8+PHhzbDpjb3\
B5LW9mIHNlbGVjdD0iJG5ld2xpbmUiLz4KCTwhLS0gYWxsIG90aGVyIHByb3BlcmllcyBwcmludGV\
kIG9uZSBwZXIgbGluZSwgcHJlY2VlZGVkIGJ5IDEgdGFiIGNoYXJhY3RlciwgZm9ybWF0IGtleTp2\
YWx1ZSAtLT4KCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJAKltub3QobG9jYWwtbmFtZSgpPSdzdGFyd\
C10aW1lJyldW25vdChsb2NhbC1uYW1lKCk9J2NvcnJlbGF0aW9uLWlkJyldW25vdChsb2NhbC1uYW\
1lKCk9J2RyaXZlcicpXVtub3QobG9jYWwtbmFtZSgpPSdldmVudCcpXVtub3QobG9jYWwtbmFtZSg\
pPSdhc3NvY2lhdGlvbicpXVtub3QobG9jYWwtbmFtZSgpPSd3cml0ZS10aW1lJyldIj4KCQk8eHNs\
OmNvcHktb2Ygc2VsZWN0PSIkdGFiIi8+CgkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxvY2FsLW5hb\
WUoKSIvPjx4c2w6dGV4dD46PC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgoJCT\
x4c2w6Y29weS1vZiBzZWxlY3Q9IiRuZXdsaW5lIi8+Cgk8L3hzbDpmb3ItZWFjaD4KCTwhLS0gVGl\
tZSB0aGUgY2FsbCB0byB3cml0ZSB0aGUgbG9nIHdhcyBpc3N1ZWQgaW4gcG9saWN5IC0tPgoJPHhz\
bDpjb3B5LW9mIHNlbGVjdD0iJHRhYiIvPgoJPHhzbDp0ZXh0PndyaXRlLXRpbWU6PC94c2w6dGV4d\
D48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHdyaXRlLXRpbWUiLz4KCTx4c2w6Y29weS1vZiBzZWxlY3\
Q9IiRuZXdsaW5lIi8+CjwveHNsOnRlbXBsYXRlPgo8L3hzbDpzdHlsZXNoZWV0Pg=="

  echo -n $_xslt_parse | base64 -d > $_XSLTFILE
  unset _xslt_parse
  _REMOVEXSLT="true"
fi

# Generate temp file appending <parse></parse> around the log file,
# this is necessary for xsltproc to work

echo "<parse>"  > $_TMPFILE
cat $_INPUTFILE >> $_TMPFILE
echo "</parse>" >> $_TMPFILE
 
# validate the TMP file generated has XML inside
xmllint --noout $_TMPFILE 2> /dev/null
if [[ "X$?" = "X0" ]]
then
  xsltproc $_XSLTFILE $_TMPFILE
fi
 
# clear temp file
unlink $_TMPFILE
 
# remove the XSLT file if it was generated by this script
if [[ "X$_REMOVEXSLT" = "Xtrue" ]]
then
  unlink $_XSLTFILE
fi