#!/usr/bin/env 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.

echo $0 $*
[ "$DEBUG" ] && set -x

SLING_COMMON=/opt/sling/scripts/sling-common.sh
if [ -r $SLING_COMMON ] ; then
	. $SLING_COMMON
else
	log_failure_msg "Missing $SLING_COMMON file, cannot read env settings."
	exit -1
fi

SLING_USER=${SLING_USER:-sling}
SLING_GROUP=${SLING_GROUP:-sling}


# Check for sling user and group
if ! getent group | grep -q $SLING_USER ; then
	groupadd --system $SLING_GROUP
fi
if ! getent passwd | grep -q $SLING_GROUP ; then
	useradd --home-dir $SLING_EXEC --gid $SLING_GROUP $SLING_USER
fi

check_sling_permissions force

update-rc.d sling defaults

# Only restart if already running
if service sling status; then
	service sling restart
fi
