#!/bin/sh

HARD_SIZE_LIMIT=4000000 #~4GB
MAX_SOFTWARE_USAGE=95

source_dir=/var/RtpDb
target_dir=/software/ssdebug
tarfilename='/log/ss_debug_upgrade.tar'

gather_data( )
{
   if ls ${source_dir}/ssdebug*.bak 1> /dev/null 2>&1;
   then
      sync ${source_dir}/ssdebug*.bak >/dev/null 2>&1 || :

      local ts=$(date +"%s")

      if ! for f in ${source_dir}/ssdebug*.bak ; do mv -- "${f}" "${target_dir}/${ts}_$(basename ${f})" ; done;
      then
         echo "Failed to move ssdebug files from ${source_dir} to ${target_dir}"
         return 1
      fi
   fi
}

perform_archive( )
{
   sync ${source_dir}/ssdebug* >/dev/null 2>&1 || :

   local ts=$(date +"%s")

   for f in ${source_dir}/ssdebug* ; do mv -- "${f}" "${target_dir}/${ts}_$(basename ${f})" 2>/dev/null; done;

   if ! ls "${target_dir}/"*ssdebug* 1> /dev/null 2>&1;
   then
      echo "No ssdebug files to archive..."
      rm -rf ${target_dir} || echo "Failed to remove ${target_dir}";
      return 1
   fi

   if pushd ${target_dir} 1>/dev/null 2>&1; then
      sync *ssdebug* >/dev/null 2>&1 || :

      if nice -n 19 tar czf ${tarfilename} *ssdebug*;
      then
         popd 1>/dev/null 2>&1 || :
         rm -rf ${target_dir} || echo "Failed to remove ${target_dir}";
      else
         echo "Failed to create the tar archive"
         popd 1>/dev/null 2>&1 || :
         return 1
      fi
      echo "ssdebug archiving completed successfully!"
   else
      echo "Failed to enter the ${source_dir} directory!"
      return 1
   fi
}

finalize( )
{
   gather_data
   perform_archive
}

trap 'gather_data; exit 0' SIGTERM
trap 'finalize; exit 0' SIGUSR1

echo "Start monitoring the ssdebug log files..."

if ! mkdir -p ${target_dir};
then
   echo "Failed to create ${target_dir} directory"
   exit 1
fi

while true; do

   gather_data

   file_size=$(du -ac ${target_dir}/ssdebug* 2>/dev/null | tail -n1 | awk '{print $1}')
   usage=$(df -h /software --output=pcent | tail -n1 | sed 's/[ %]//g')

   if [ ! -f /repository/diagnostics.dbg ] || \
      [ ${file_size} -ge ${HARD_SIZE_LIMIT} ] || \
      [ ${usage} -ge ${MAX_SOFTWARE_USAGE} ];
   then
      perform_archive
      break
   fi

   sleep 60&
   wait
done

