#!/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

case "$1" in
    configure)
        OLDCONFDIR="/etc/cloud/agent"
        NEWCONFDIR="/etc/cloudstack/agent"
        CONFFILES="agent.properties log4j.xml log4j-cloud.xml"

        mkdir -m 0755 -p /usr/share/cloudstack-agent/tmp

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

        BR_NETFILTER_MODULE=br_netfilter
        MODULES_FILE=/etc/modules
        if /sbin/modinfo $BR_NETFILTER_MODULE >/dev/null 2>&1; then
            /sbin/modprobe $BR_NETFILTER_MODULE
            if ! grep $BR_NETFILTER_MODULE $MODULES_FILE >/dev/null 2>&1; then
                echo "$BR_NETFILTER_MODULE" >> $MODULES_FILE
            fi
        fi

        # Running cloudstack-agent-upgrade to update bridge name for upgrade from CloudStack 4.0.x (and before) to CloudStack 4.1 (and later)
        /usr/bin/cloudstack-agent-upgrade
        if [ ! -d "/etc/libvirt/hooks" ] ; then
            mkdir /etc/libvirt/hooks
        fi
        cp -a /usr/share/cloudstack-agent/lib/libvirtqemuhook /etc/libvirt/hooks/qemu

        # Print help message
        if [ -f "/usr/share/cloudstack-common/scripts/installer/cloudstack-help-text" ];then
            acs_version=$(dpkg -l |grep cloudstack-agent |head -n1 |awk '{print $3}')
            sed -i "s,^ACS_VERSION=.*,ACS_VERSION=$acs_version,g" /usr/share/cloudstack-common/scripts/installer/cloudstack-help-text
            /usr/share/cloudstack-common/scripts/installer/cloudstack-help-text agent
        fi

        ;;
esac

#DEBHELPER#
