#!/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 start rsyncd on master Solr server

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

unset data_dir solr_port rsyncd_port user rsyncd_bwlimit verbose debug
. ${solr_root}/bin/scripts-util

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

# define usage string
USAGE="\
usage: $prog [-d dir] [-p portnum] [-u username] [-b kbps] [-v] [-V]
       -d          specify directory holding index data
       -p          specify rsyncd port number
       -u          specify user to sudo to before running script
       -b          specify a max transfer rate in kilobytes per second (defaults to 0 (no limit))
       -v          increase verbosity
       -V          output debugging info
"

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

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

fixUser "$@"

# try to determine rsyncd port number from $confFile if not specified on
# command line, default to solr_port+10000
if [[ -z ${rsyncd_port} ]]
then
    if [[ "${solr_port}" ]]
    then
        rsyncd_port=`expr 10000 + ${solr_port}`
    else
        echo "rsyncd port number missing in $confFile or command line."
        echo "$USAGE"
        exit 1
    fi
fi

# Set bwlimit to unlimited by default
if [[ -z ${rsyncd_bwlimit} ]]
then
       rsyncd_bwlimit='0'
fi

dataDir

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

if [[ ! -f ${solr_root}/logs/rsyncd-enabled ]]
then
    logMessage rsyncd disabled
    exit 2
fi

if \
    rsync rsync://localhost:${rsyncd_port} >/dev/null 2>&1
then
    logMessage "rsyncd already running at port ${rsyncd_port}"
    exit 1
fi

# create conf/rsyncd.conf on the fly, creating solrlogs directory if needed
if [[ ! -d ${solr_root}/conf ]]
then
    mkdir ${solr_root}/conf
fi
cat <<EOF > ${solr_root}/conf/rsyncd.conf
#### rsyncd.conf file ####
 
uid = $(whoami)
gid = $(whoami)
use chroot = no
list = no
pid file = ${solr_root}/logs/rsyncd.pid
log file = ${solr_root}/logs/rsyncd.log
[solr]
    path = ${data_dir}
    comment = Solr
EOF

rsync --daemon --port=${rsyncd_port} --bwlimit=${rsyncd_bwlimit} --config=${solr_root}/conf/rsyncd.conf

# first make sure rsyncd is accepting connections
i=1
while \
 ! rsync rsync://localhost:${rsyncd_port} >/dev/null 2>&1
do
    if (( i++ > 15 ))
    then
        logMessage "rsyncd not accepting connections, exiting" >&2
        exit 2
    fi
    sleep 1
done

logMessage rsyncd started with data_dir=${data_dir} and accepting requests
