#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Shell script to clean up backups of a Solr Lucene collection.

orig_dir=$(pwd)
cd ${0%/*}/..
solr_root=$(pwd)
cd ${orig_dir}

unset days num data_dir user verbose debug
. ${solr_root}/bin/scripts-util

# set up variables
prog=${0##*/}
log=${solr_root}/logs/${prog}.log

# define usage string
USAGE="\
usage: $prog -D <days> | -N <num> [-d dir] [-u username] [-v] [-V]
       -D <days>   cleanup backups more than <days> days old
       -N <num>    keep the most recent <num> number of backups and
                   cleanup up the remaining ones that are not being pulled
       -d          specify directory holding index data
       -u          specify user to sudo to before running script
       -v          increase verbosity
       -V          output debugging info
"

# parse args
while getopts D:N:d:u:vV OPTION
do
    case $OPTION in
    D)
        days="$OPTARG"
        ;;
    N)
        num="$OPTARG"
        ;;
    d)
        data_dir="$OPTARG"
        ;;
    u)
        user="$OPTARG"
        ;;
    v)
        verbose="v"
        ;;
    V)
        debug="V"
        ;;
    *)
        echo "$USAGE"
        exit 1
    esac
done

[[ -n $debug ]] && set -x

if [[ -z ${days} && -z ${num} ]]
then
    echo "$USAGE"
    exit 1
fi

fixUser "$@"

dataDir

function remove
{
    logMessage removing backup $1
    /bin/rm -rf $1
}

setStartTime

logMessage started by $oldwhoami
logMessage command: $0 $@

# trap control-c
trap 'echo "caught INT/TERM, exiting now but partial cleanup may have already occured";logExit aborted 13' INT TERM

if [[ -n ${days} ]]
then
    #is maxdepth supported?
    find ${data_dir} -maxdepth 0 -name foobar >/dev/null 2>&1
    if [ $? = 0 ]; then
      maxdepth="-maxdepth 1"
    else
      unset maxdepth
    fi
  
    logMessage cleaning up backups more than ${days} days old
    for i in `find ${data_dir} ${maxdepth} -name 'backup.*' -mtime +${days} -print`
    do
        remove $i
    done
elif [[ -n ${num} ]]
then
    logMessage cleaning up all backups except for the most recent ${num} ones
    unset backups count
    backups=`find ${data_dir} -type d -name 'backup.*' 2>/dev/null| sort -r`
    if [[ $? == 0 ]]
    then
        count=`echo $backups|wc -w`
        startpos=`expr $num + 1`
        if [[ $count -gt $num ]]
        then
            for i in `echo $backups|cut -f${startpos}- -d" "`
            do
	        remove $i
	    done
        fi
    fi
fi

logExit ended 0


