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

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

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

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

# successful commit 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
