#!/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 install a snapshot into place as the Lucene collection # for a Solr server orig_dir=$(pwd) cd ${0%/*}/.. solr_root=$(pwd) cd ${orig_dir} unset master_host master_status_dir data_dir user verbose debug . ${solr_root}/bin/scripts-util # set up variables prog=${0##*/} log=${solr_root}/logs/${prog}.log LOCKDIR="${solr_root}/logs/snapinstaller-lock" PIDFILE="${LOCKDIR}/PID" # define usage string USAGE="\ usage: $prog [-M master] [-S sdir] [-d dir] [-u username] [-v] [-V] -M master specify hostname of master server from where to pull index snapshot -S specify directory holding snapshot status on master server -d specify directory holding index data on local machine -u specify user to sudo to before running script -v increase verbosity -V output debugging info " # parse args while getopts M:S:d:u:vV OPTION do case $OPTION in M) master_host="$OPTARG" ;; S) master_status_dir="$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 ${master_host} ]] then echo "name of master server missing in $confFile or command line." echo "$USAGE" exit 1 fi if [[ -z ${master_status_dir} ]] then echo "directory holding snapshot status on master server missing in $confFile or command line." echo "$USAGE" exit 1 fi fixUser "$@" dataDir # assume relative path to start at ${solr_root} if [[ "`echo ${master_status_dir}|cut -c1`" != "/" ]] then master_status_dir=${solr_root}/${master_status_dir} fi setStartTime if test -r $PIDFILE then OTHERPID="$(cat "${PIDFILE}")" if ! kill -0 $OTHERPID &>/dev/null; then logMessage removing stale lock ${OTHERPID} rm -rf "${LOCKDIR}" else logExit "lock failed, PID ${OTHERPID} is active" 1 fi fi mkdir "${LOCKDIR}" &>/dev/null echo "$$" >"${PIDFILE}" logMessage started by $oldwhoami logMessage command: $0 $@ # get directory name of latest snapshot name=`perl -e 'chdir q|'${data_dir}'|; print ((sort grep {/^snapshot[.][1-9][0-9]{13}$/} <*>)[-1])'` # clean up after INT/TERM trap 'echo "caught INT/TERM, exiting now but partial installation may have already occured";/bin/rm -rf ${data_dir}/index.tmp$$;logExit aborted 13' INT TERM # is there a snapshot if [[ "${name}" == "" ]] then logMessage no shapshot available logExit ended 0 fi name=${data_dir}/${name} # has snapshot already been installed if [[ ${name} == `cat ${solr_root}/logs/snapshot.current 2>/dev/null` ]] then logMessage latest snapshot ${name} already installed logExit ended 0 fi # make sure master has directory for hold slaves stats/state if ! ssh -o StrictHostKeyChecking=no ${master_host} mkdir -p ${master_status_dir} then logMessage failed to ssh to master ${master_host}, snapshot status not updated on master fi # install using hard links into temporary directory # remove original index and then atomically copy new one into place logMessage installing snapshot ${name} if [[ "${OS}" == "SunOS" || "${OS}" == "Darwin" || "${OS}" == "FreeBSD" ]] then orig_dir=$(pwd) mkdir ${data_dir}/index.tmp$$ && \ cd ${name} && \ find . -print|cpio -pdlmu ${data_dir}/index.tmp$$ 1>/dev/null 2>&1 && \ /bin/rm -rf ${data_dir}/index && \ mv -f ${data_dir}/index.tmp$$ ${data_dir}/index cd ${orig_dir} else cp -lr ${name}/ ${data_dir}/index.tmp$$ && \ /bin/rm -rf ${data_dir}/index && \ mv -f ${data_dir}/index.tmp$$ ${data_dir}/index fi # update distribution stats echo ${name} > ${solr_root}/logs/snapshot.current # push stats/state to master if ! scp -q -o StrictHostKeyChecking=no ${solr_root}/logs/snapshot.current ${master_host}:${master_status_dir}/snapshot.current.`uname -n` then logMessage failed to ssh to master ${master_host}, snapshot status not updated on master fi # notify Solr to open a new Searcher logMessage notifing Solr to open a new Searcher ${solr_root}/bin/commit if [[ $? != 0 ]] then logMessage failed to connect to Solr server logMessage snapshot installed but Solr server has not open a new Searcher logExit failed 1 fi rm -rf "${LOCKDIR}" logExit ended 0