#!/bin/sh
#
# clean.sh [-force]
#
# Script to clean up a QPipeline analysis

# Shourov K. Chatterji
# shourov@ligo.caltech.edu

# $Id: clean.sh,v 1.14 2007/02/24 21:03:40 shourov Exp $

# test for force argument
force=""
if [ $# -gt 0 ]; then
  if [ "x$1x" = "x-forcex" ]; then
    force=1
  fi
fi

# change to analysis directory
cd `dirname $0`

# test for previous analysis
if [ -z ${force} ]; then
  if [ ! -f start.log ]; then
    echo "ERROR: The analysis has not been run." 1>&2
    exit 1
  fi
fi

# name of dag file
dagFile=`/bin/ls -1 *.dag [0-9]*/*.dag 2>/dev/null | \
         sed -e 's|^.*/||' | tail -1`

# test for dag file
if [ -z "${dagFile}" ]; then
  echo "ERROR: There is no dag file." 1>&2
  exit 1
fi
if [ ! -f "${dagFile}" ]; then
  echo "ERROR: The analysis is already complete." 1>&2
  exit 1
fi

# test for currently running analysis
if [ -f ${dagFile}.lock ]; then
  echo "ERROR: The analysis is still running." 1>&2
  exit 1
fi

# condor submit file name
condorSubmitFile=`basename ${dagFile} .dag`.sub

# condor log file name
condorLogFile=`grep '^log' ${condorSubmitFile} | sed -e 's|^.*=[ ]*||'`

# retrieve condor log file
if [ -L `basename ${condorLogFile}` ]; then
  if [ -f ${condorLogFile} ]; then
    rm -f `basename ${condorLogFile}`
    mv ${condorLogFile} .
  else
    echo "ERROR: Condor log file is not on this machine." 1>&2
    exit 1
  fi
fi

# get list of output directories
outputDirectories=`find log/locate -type f -name 'locate_*.txt' \
                        -exec cat \{\} \; 2>/dev/null | \
                   sed -e "s|^node\([0-9]*\)[^:]*:/usr1|/data/node\1|" \
                       -e "s|^[^:]*:||" | sort | uniq`

# test for recent analysis
if [ -f start.log ]; then

  # retrieve results and logs from remote output directories
  error=false
  if [ -n "${outputDirectories}" ]; then
    for outputDirectory in ${outputDirectories}; do
      if [ ${outputDirectory} != `pwd` ]; then
        rsync -aq ${outputDirectory}/results .
        if [ $? -ne 0 ]; then
          echo "ERROR: Unable to retrieve results from ${outputDirectory}" 1>&2
          error=true
        fi
        rsync -aq ${outputDirectory}/log .
        if [ $? -ne 0 ]; then
          echo "ERROR: Unable to retrieve logs from ${outputDirectory}" 1>&2
          error=true
        fi
        rm -rf ${outputDirectory}/log/*
        sleep 0.5
      fi
    done
  fi
  if [ "${error}" = "true" ]; then
    echo "ERROR: unable to retrieve logs and results.  Rerun clean script." 1>&2
    exit 1
  fi

  # determine previous run number
  previousRunNumber=`/bin/ls -1d [0-9]* 2>/dev/null | sort -g | tail -1`
  previousRunNumber=`expr ${previousRunNumber} + 1`

  # create previous run directory
  mkdir -p ${previousRunNumber} 2>/dev/null
  mkdir -p ${previousRunNumber}/log 2>/dev/null

  # move previous run details to previous run directory
  mv -f start.log ${previousRunNumber} 2>/dev/null
  mv -f ${dagFile} ${previousRunNumber} 2>/dev/null
  mv -f ${dagFile}.condor.sub ${previousRunNumber} 2>/dev/null
  mv -f ${dagFile}.dagman.log ${previousRunNumber} 2>/dev/null
  mv -f ${dagFile}.dagman.out ${previousRunNumber} 2>/dev/null
  mv -f ${dagFile}.lib.err ${previousRunNumber} 2>/dev/null
  mv -f ${dagFile}.lib.out ${previousRunNumber} 2>/dev/null
  cp -f ${dagFile}.rescue ${previousRunNumber} 2>/dev/null
  mv -f `basename ${condorLogFile}` ${previousRunNumber} 2>/dev/null
  mv -f log/stdout ${previousRunNumber}/log 2>/dev/null
  mv -f log/stderr ${previousRunNumber}/log 2>/dev/null
  mv -f log/status ${previousRunNumber}/log 2>/dev/null
  cp -r log/locate ${previousRunNumber}/log 2>/dev/null

# end test for recent analysis
fi

# test for rescue dag
if [ -f ${dagFile}.rescue ]; then
  mv ${dagFile}.rescue ${dagFile}
  if [ -z ${force} ]; then
    echo "ERROR: previous analysis had errors.  Rerun start script." 1>&2
    exit 1
  fi
fi

# remove results from remote output directories
if [ -n "${outputDirectories}" ]; then
  for outputDirectory in ${outputDirectories}; do
    if [ ${outputDirectory} != `pwd` ]; then
      rm -rf ${outputDirectory}/results
      rm -rf ${outputDirectory}/log
      rmdir -p ${outputDirectory} 2>/dev/null
      sleep 0.5
    fi
  done
fi

# remove log of output directories
rm -rf log 2>/dev/null

# force removal of dag file
if [ -n ${force} ]; then
  rm -f ${dagFile} 2>/dev/null
fi

# return to calling function
exit 0

