#!/bin/bash
#
#/**
# * Copyright 2007 The Apache Software Foundation
# *
# * 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.
# */

export PATH=$PATH:/opt/bookkeeper/bin

BK_HOME=/opt/bookkeeper
BINDIR=${BK_HOME}/bin
BOOKKEEPER=${BINDIR}/bookkeeper
SCRIPTS_DIR=${BK_HOME}/scripts

if [ $# = 0 ]; then
    echo "No command is found";
    exit 1;
fi

COMMAND=$1
shift

function run_command() {
    if [ "$(id -u)" = '0' ]; then
        chown -R "$BK_USER:$BK_USER" ${BK_HOME}
        chmod -R +x ${BINDIR}
        chmod -R +x ${SCRIPTS_DIR}
        echo "This is root, will use user $BK_USER to run command '$@'"
        sudo -s -E -u "$BK_USER" /bin/bash "$@"
        exit
    else
        echo "Run command '$@'"
        $@
    fi
}

# for BC consideration - the old scripts run `entrypoint.sh /opt/bookkeeper/bin/bookkeeper bookie`
if [ ${COMMAND} == "${BOOKKEEPER}" ]; then
    if [ $# -gt 0 ]; then
        if [ $1 == "bookie" ]; then
            source ${SCRIPTS_DIR}/init_bookie.sh
            init_bookie
            run_command /opt/bookkeeper/bin/bookkeeper bookie
            exit
        fi
    fi
fi

if [ -f ${SCRIPTS_DIR}/init_${COMMAND}.sh ]; then
    source ${SCRIPTS_DIR}/init_${COMMAND}.sh
    init_${COMMAND}
    run_command ${BOOKKEEPER} ${COMMAND} $@
else
    source ${SCRIPTS_DIR}/init_generic.sh
    run_command ${COMMAND} $@
fi
