#!/bin/bash
#
# common functions for collectd ceilometer plugin
# -----------------------------------------------

# start/stop service
#
function start_collectd {
    if [ -e /usr/lib/systemd/system/collectd.service ] || [ -e /etc/init.d/collectd ]; then
        sudo service collectd restart
    fi
}

function stop_collectd {
    if [ -e /usr/lib/systemd/system/collectd.service ] || [ -e /etc/init.d/collectd ]; then
        sudo service collectd stop
    fi
}


function install_requirements {
    echo "Installing pre-resquisites"

    if is_ubuntu; then
        install_package libvirt-bin libvirt-dev python-libvirt
        if [[ "$COLLECTD_INSTALL_TYPE" == "source" ]]; then
            install_package byacc flex bison build-essential automake libgcrypt20 libtool
        fi

    elif is_fedora; then
        install_package libvirt libvirt-devel libvirt-python
        if [[ "$COLLECTD_INSTALL_TYPE" == "source" ]]; then
            install_package flex bison automake autoconf libtool
        fi
    else
        echo "Unsupported distros"
    fi

}

function install_service_file {
    # Configure systemd service file
    if [[ `ls -la /sbin/init` =~ "systemd" ]]; then
        local service_file=/etc/systemd/system/collectd.service
        local collectd_binary=$COLLECTD_PREFIX/sbin/collectd
        local collectd_conf_file=$COLLECTD_PREFIX/etc/collectd.conf

        sudo -E cp $COLLECTD_DIR/contrib/systemd.collectd.service $service_file
        sudo sed 's#ExecStart=.*$#ExecStart='"$collectd_binary"' -C '"$collectd_conf_file"'#g' -i $service_file

        # Enable collectd
        sudo systemctl enable collectd
    else
        die $LINENO "No support for systemd on this platform.\n
                     To use collectd, build it, configure the service
                     manually, and set COLLECTD_INSTALL=False."
    fi

}

function build_collectd {

    git_clone $COLLECTD_REPO $COLLECTD_DIR $COLLECTD_BRANCH
    pushd $COLLECTD_DIR

    # $PS4 has been defined to call short_source but the function is not
    # available when build.sh is called.
    OPS4=$PS4
    PS4='+'

    build_output=$( ./build.sh )
    echo "Build output: " $build_output

    PS4=$OPS4

    ./configure --enable-python --enable-debug \
       --enable-logging --enable-syslog \
       --prefix=$COLLECTD_PREFIX/
    make -j all
    sudo make install
    popd

    # Allow read access to collectd conf file
    sudo chmod +r $COLLECTD_PREFIX/etc/collectd.conf;

    install_service_file
    add_include_dir

}

# install collectd
function install_collectd {
    if [[ "$COLLECTD_INSTALL" == True  ]]; then
        if [[ "$COLLECTD_INSTALL_TYPE" == "source" ]]; then
            build_collectd
        else # if install type is binary
            if is_fedora || is_ubuntu; then
                install_package collectd
            else
                die $LINENO "No support for collectd on this platform"
            fi
        fi
    fi
}

# Add the Include block so that conf dir is read
function add_include_dir {
    cat << EOF | sudo -E tee -a $PREFIX/etc/collectd.conf

    <Include "$COLLECTD_CONF_DIR">
        Filter "*.conf"
    </Include>
EOF

}

# Add conf file for plugin
function adapt_collectd_conf {
    if [ ! -d "$COLLECTD_CONF_DIR" ]; then
        sudo -E mkdir -p "$COLLECTD_CONF_DIR"
    fi

    # Configure collectd-ceilometer-plugin
    if [[ "$COLLECTD_CEILOMETER_ENABLED" == "True" ]]; then
        sudo cp $COLLECTD_CEILOMETER_DIR/etc/collectd.conf.d/collectd-ceilometer-plugin.conf $COLLECTD_CONF_DIR/

        # Configure collectd-ceiloemter-plugin.conf
        sudo sed -i 's|ModulePath.*$|ModulePath "'$COLLECTD_CEILOMETER_DIR'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|VERBOSE.*$|VERBOSE '$COLLECTD_CEILOMETER_VERBOSE'|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|BATCH_SIZE.*$|BATCH_SIZE "'$COLLECTD_BATCH_SIZE'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|OS_AUTH_URL.*$|OS_AUTH_URL "'$OS_AUTH_URL'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|CEILOMETER_URL_TYPE.*$|CEILOMETER_URL_TYPE "'$CEILOMETER_URL_TYPE'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|CEILOMETER_TIMEOUT.*$|CEILOMETER_TIMEOUT "'$CEILOMETER_TIMEOUT'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|OS_PASSWORD.*$|OS_PASSWORD "'$SERVICE_PASSWORD'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo sed -i 's|OS_TENANT_NAME.*$|OS_TENANT_NAME "'$SERVICE_TENANT_NAME'"|g' $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf

        config_custom_units "ceilometer" "$COLLECTD_CEILOMETER_UNITS"
    fi

    # configure collectd-gnocchi plugin
    if [[ "$COLLECTD_GNOCCHI_ENABLED" == "True" ]]; then

        sudo cp $COLLECTD_CEILOMETER_DIR/etc/collectd.conf.d/collectd-gnocchi-plugin.conf $COLLECTD_CONF_DIR/

        # Configure collectd-gnocchi-plugin.conf
        sudo sed -i 's|ModulePath.*$|ModulePath "'$COLLECTD_CEILOMETER_DIR'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|VERBOSE.*$|VERBOSE '$COLLECTD_CEILOMETER_VERBOSE'|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|BATCH_SIZE.*$|BATCH_SIZE "'$COLLECTD_BATCH_SIZE'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|OS_AUTH_URL.*$|OS_AUTH_URL "'$OS_AUTH_URL'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|CEILOMETER_URL_TYPE.*$|CEILOMETER_URL_TYPE "'$CEILOMETER_URL_TYPE'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|CEILOMETER_TIMEOUT.*$|CEILOMETER_TIMEOUT "'$CEILOMETER_TIMEOUT'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|OS_PASSWORD.*$|OS_PASSWORD "'$SERVICE_PASSWORD'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        sudo sed -i 's|OS_TENANT_NAME.*$|OS_TENANT_NAME "'$SERVICE_TENANT_NAME'"|g' $COLLECTD_CONF_DIR/collectd-gnocchi-plugin.conf
        config_custom_units "gnocchi" "$COLLECTD_GNOCCHI_UNITS"
    fi

    # Configure collectd logfile plugin
    if [ -n $COLLECTD_LOG_FILE ]; then
        touch $COLLECTD_LOG_FILE
    fi

    sudo cp $COLLECTD_CEILOMETER_DIR/etc/collectd.conf.d/logfile.conf $COLLECTD_CONF_DIR/01-logfile.conf

    sudo sed -i '/<Plugin.*logfile/,/^<\/Plugin>/{s|LogLevel.*$|LogLevel "'$COLLECTD_LOG_LEVEL'"|}' $COLLECTD_CONF_DIR/01-logfile.conf
    sudo sed -i 's|File.*$|File "'$COLLECTD_LOG_FILE'"|g' $COLLECTD_CONF_DIR/01-logfile.conf

}

function config_custom_units {
    service_name=$1
    custom_units=$2
    if [[ $custom_units != none ]]; then

        OIFS=$IFS
        IFS=','

        for UNIT in $custom_units
        do
                sudo sed -i '/<UNITS>/a\       UNIT '"$UNIT"'' $COLLECTD_CONF_DIR/collectd-$service_name-plugin.conf
        done
    IFS=$OIFS
    fi
}

# remove plugin conf file
function restore_collectd_conf {

    if [ -f '$COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf' ]; then
        sudo rm -f $COLLECTD_CONF_DIR/collectd-ceilometer-plugin.conf
        sudo rm -f $COLLECTD_CONF_DIR/01-logfile.conf
    fi

}
