#!/bin/sh

# 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.

set -e

if [ "$1" = configure ]; then
    if ! getent passwd cloud >/dev/null; then
        adduser --quiet --system --group --no-create-home --home /var/lib/cloudstack/management cloud
    else
        usermod -m -d /var/lib/cloudstack/management cloud || true
    fi

    rm -fr /var/cache/cloudstack/management/work/*

    for i in /var/cache/cloudstack/management \
        /var/cache/cloudstack/management/work \
        /var/cache/cloudstack/management/temp \
        /var/log/cloudstack/management \
        /var/lib/cloudstack/management
    do
        chmod 0770 $i
        chgrp cloud $i
    done

    OLDCONFDIR="/etc/cloud/management"
    NEWCONFDIR="/etc/cloudstack/management"
    CONFFILES="db.properties key"

    # Copy old configuration so the admin doesn't have to do that
    # Only do so when we are installing for the first time
    if [ -z "$2" ]; then
        for FILE in $CONFFILES; do
            if [ -f "$OLDCONFDIR/${FILE}" ]; then
                cp -a $OLDCONFDIR/$FILE $NEWCONFDIR/$FILE
            fi
        done
        if [ -f "$OLDCONFDIR/cloud.keystore" ]; then
            cp -a $OLDCONFDIR/cloud.keystore $NEWCONFDIR/cloudmanagementserver.keystore
        fi
    fi

    CONFDIR="/etc/cloudstack/management"
    DBPROPS="db.properties"

    chmod 0640 ${CONFDIR}/${DBPROPS}
    chgrp cloud ${CONFDIR}/${DBPROPS}

    if [ -d "/usr/share/tomcat7" ]; then
        rm -f /usr/share/cloudstack-management/bin
        rm -f /usr/share/cloudstack-management/lib
        ln -s /usr/share/tomcat7/bin /usr/share/cloudstack-management/bin
        ln -s /usr/share/tomcat7/lib /usr/share/cloudstack-management/lib
        invoke-rc.d tomcat7 stop || true
        if [ ! -f "/etc/cloudstack/management/server.xml" ]; then
            ln -s /etc/cloudstack/management/server7-nonssl.xml /etc/cloudstack/management/server.xml
        fi
    elif [ -d "/usr/share/tomcat6" ]; then
        rm -f /usr/share/cloudstack-management/bin
        rm -f /usr/share/cloudstack-management/lib
        ln -s /usr/share/tomcat6/bin /usr/share/cloudstack-management/bin
        ln -s /usr/share/tomcat6/lib /usr/share/cloudstack-management/lib
        invoke-rc.d tomcat6 stop || true
        if [ ! -f "/etc/cloudstack/management/server.xml" ]; then
            ln -s /etc/cloudstack/management/server-nonssl.xml /etc/cloudstack/management/server.xml
        fi
    fi

    # Add jdbc MySQL driver settings to db.properties if not present
    grep -s -q "db.cloud.driver=jdbc:mysql" ${CONFDIR}/${DBPROPS} || sed -i -e "\$adb.cloud.driver=jdbc:mysql" ${CONFDIR}/${DBPROPS}
    grep -s -q "db.usage.driver=jdbc:mysql" ${CONFDIR}/${DBPROPS} || sed -i -e "\$adb.usage.driver=jdbc:mysql" ${CONFDIR}/${DBPROPS}
    grep -s -q "db.simulator.driver=jdbc:mysql" ${CONFDIR}/${DBPROPS} || sed -i -e "\$adb.simulator.driver=jdbc:mysql" ${CONFDIR}/${DBPROPS}
fi

#DEBHELPER#
