#!/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 take a snapshot of a Solr Lucene collection.

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

unset 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 dir] [-u username] [-v] [-V] [-c]
       -d          specify directory holding index data
       -u          specify user to sudo to before running script
       -v          increase verbosity
       -V          output debugging info
       -c          only take snapshot if different than previous
"

# parse args
while getopts d:u:vVc OPTION
do
    case $OPTION in
    d)
        data_dir="$OPTARG"
        ;;
    u)
        user="$OPTARG"
        ;;
    v)
        verbose="v"
        ;;
    V)
        debug="V"
        ;;
    c)
        check=1
 	;;
    *)
        echo "$USAGE"
        exit 1
    esac
done

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

fixUser "$@"

dataDir

setStartTime

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

snap_name=snapshot.`date +"%Y%m%d%H%M%S"`
name=${data_dir}/${snap_name}
temp=${data_dir}/temp-${snap_name}

if [[ -d ${name} ]]
then
    logMessage snapshot directory ${name} already exists
    logExit aborted 1
fi

if [[ -d ${temp} ]]
then
    logMessage snapshoting of ${name} in progress
    logExit aborted 1
fi

if [[ ${check} ]]
then
   previous=`find ${data_dir} -name snapshot.\* | sort -r  | head -1` 
   if [[ -d ${previous} ]]
   then
     differences=`diff -q ${data_dir}/index ${previous} | wc -l` 
     if [[ ${differences} -lt 1 ]]
     then 
       logMessage Snap would be same as last, exiting
       logExit aborted 1 
     fi
   fi
fi

# clean up after INT/TERM
trap 'echo cleaning up, please wait ...;/bin/rm -rf ${name} ${temp};logExit aborted 13' INT TERM

logMessage taking snapshot ${name}

# take a snapshot using hard links into temporary location
# then move it into place atomically
if [[ "${OS}" == "SunOS" || "${OS}" == "Darwin"  || "${OS}" == "FreeBSD" ]]
then
  orig_dir=$(pwd)
  mkdir ${temp}
  cd ${data_dir}/index
  find . -print|cpio -pdlmu ${temp} 1>/dev/null 2>&1
  cd ${orig_dir}
else
  cp -lr ${data_dir}/index ${temp}
fi
mv ${temp} ${name}

logExit ended 0

