#!/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 make an Atomic Backup after Optimize of
# a Solr Lucene collection.

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

unset solr_hostname solr_port data_dir webapp_name user verbose debug solr_url
. ${solr_root}/bin/scripts-util

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

# define usage string
USAGE="\
usage: $prog [-h hostname] [-p port] [-d dir] [-w webapp_name] [-u username] [-U url] [-v] [-V]
       -h          specify Solr hostname (defaults to localhost)
       -p          specify Solr port number
       -w          specify name of Solr webapp (defaults to solr)
       -u          specify user to sudo to before running script
       -U          specify full update url (overrides -h,-p,-w parameters)
       -d          specify directory holding index data (defaults to data)
       -v          increase verbosity
       -V          output debugging info
"

# parse args
while getopts h:p:d:w:u:U:vV OPTION
do
    case $OPTION in
    h)
        solr_hostname="$OPTARG"
        ;;
    p)
        solr_port="$OPTARG"
        ;;
    d)
        data_dir="$OPTARG"
        ;;
    w)
        webapp_name="$OPTARG"
        ;;
    u)
        user="$OPTARG"
        ;;
    U)
        solr_url="$OPTARG"
        ;;
    v)
        verbose="v"
        ;;
    V)
        debug="V"
        ;;
    *)
        echo "$USAGE"
        exit 1
    esac
done

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

dataDir

curlUrl

fixUser "$@"

setStartTime

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

logMessage sending optimize to Solr server at ${curl_url}
rs=`curl ${curl_url} -s -H 'Content-type:text/xml; charset=utf-8' -d "<optimize/>"`
if [[ $? != 0 ]]
then
  logMessage failed to connect to Solr server at ${curl_url}
  logMessage optimize failed
  logExit failed 1
fi

# check status of optimize request - original format
echo $rs | grep '<result.*status="0"' > /dev/null 2>&1
if [[ $? != 0 ]]
then
# check status of optimize request - new format
  echo $rs | grep '<lst name="responseHeader"><int name="status">0</int>' > /dev/null 2>&1
  if [[ $? != 0 ]]
  then
    logMessage optimize request to Solr at ${curl_url} failed:
    logMessage $rs
    logExit failed 2
  fi
fi

# successful optimize creates a snapshot file synchronously
lastsnap=`find ${data_dir} -type d -name 'snapshot.*' 2>/dev/null| sort -r | head -1`

if [[ $lastsnap == "" ]]
then
  logMessage commit did not create snapshot at ${curl_url}, backup failed:
  logExit failed 3
fi

name=backup.${lastsnap##*snapshot.}
temp=temp-${name}

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

if [[ -d ${data_dir}/${temp} ]]
then
    logMessage backingup of ${data_dir}/${name} in progress
    logExit aborted 1
fi
logMessage making backup ${data_dir}/${name}

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

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

logExit ended 0
