#!/bin/bash

BIN_DIR=/usr/bin
DATA_DIR=/var/lib/influxdb
LOG_DIR=/var/log/influxdb
SCRIPT_DIR=/usr/lib/influxdb/scripts
LOGROTATE_DIR=/etc/logrotate.d
INFLUXD_CONFIG_PATH=/etc/influxdb/config.toml

function install_init {
    cp -f $SCRIPT_DIR/init.sh /etc/init.d/influxdb
    chmod +x /etc/init.d/influxdb
}

function install_systemd {
    cp -f $SCRIPT_DIR/influxdb.service /lib/systemd/system/influxdb.service
    systemctl enable influxdb
}

function install_update_rcd {
    update-rc.d influxdb defaults
}

function install_chkconfig {
    chkconfig --add influxdb
}

function should_upgrade {
    if [[ ! -s /etc/influxdb/influxdb.conf ]]; then
        # No V1 config present, no upgrade needed.
        return 1
    fi

    bolt_dir="/root/.influxdbv2 /var/lib/influxdb/.influxdbv2 /var/lib/influxdb"
    for bolt in $bolt_dir; do
        if [[ -s ${bolt}/influxd.bolt ]]; then
            # Found a bolt file, assume previous v2 upgrade.
            return 1
        fi
    done

    return 0
}

function upgrade_notice {
cat << EOF

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Important 1.x to 2.x Upgrade Notice !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Thank you for installing InfluxDB v2.  Due to significant changes between
the v1 and v2 versions, upgrading to v2 requires additional steps.  If
upgrading to v2 was not intended, simply re-install the v1 package now.

An upgrade helper script is available that should be reviewed and executed
prior to starting the influxdb systemd service.  In order to start the v2
upgrade, execute the following:

sudo /usr/share/influxdb/influxdb2-upgrade.sh

Visit our website for complete details on the v1 to v2 upgrade process:
https://docs.influxdata.com/influxdb/latest/upgrade/v1-to-v2/

For new or upgrade installations, please review the getting started guide:
https://docs.influxdata.com/influxdb/latest/get-started/

EOF
}

function init_config {
    mkdir -p $(dirname ${INFLUXD_CONFIG_PATH})

    local config_path=${INFLUXD_CONFIG_PATH}
    if [[ -s ${config_path} ]]; then
        config_path=${INFLUXD_CONFIG_PATH}.defaults
        echo "Config file ${INFLUXD_CONFIG_PATH} already exists, writing defaults to ${config_path}"
    fi

    cat << EOF > ${config_path}
bolt-path = "/var/lib/influxdb/influxd.bolt"
engine-path = "/var/lib/influxdb/engine"
EOF
}

# Add defaults file, if it doesn't exist
if [[ ! -s /etc/default/influxdb2 ]]; then
cat << EOF > /etc/default/influxdb2
INFLUXD_CONFIG_PATH=${INFLUXD_CONFIG_PATH}
EOF
fi

# Remove legacy symlink, if it exists
if [[ -L /etc/init.d/influxdb ]]; then
    rm -f /etc/init.d/influxdb
fi

function redhat() {
    if command -v systemctl &>/dev/null; then
        install_systemd
    else
        # Assuming sysv
        install_init
        install_chkconfig
    fi

    case ${1} in
    1)
        # on-install
        if should_upgrade; then
            upgrade_notice
        else
            # Only execute "init_config" during "on-install". If the configuration
            # is absent during "on-upgrade", assume that this it is an intentional
            # choice by the system administrator. Writing default configuration
            # after "influxd" has executed without *any* configuration, causes
            # "influxd" to execute with different "bolt-path" and "engine"
            # directories resulting in the perception of data loss.
            init_config
        fi
    ;;
    2)
        # on-upgrade
        if should_upgrade; then
            upgrade_notice
        fi
    ;;
    esac
}

function debian() {
    # Ownership for RH-based platforms is set in build.py via the `rmp-attr` option.
    # We perform ownership change only for Debian-based systems. Moving these lines
    # out of this if statement would make `rmp -V` fail after installation.
    chown -R -L influxdb:influxdb $LOG_DIR
    chown -R -L influxdb:influxdb $DATA_DIR
    chmod 755 $LOG_DIR
    chmod 755 $DATA_DIR

    if command -v systemctl &>/dev/null; then
        install_systemd
    else
        # Assuming sysv
        install_init
        install_update_rcd
    fi

    if [[ ! "${2:-}" ]]; then
        # on-install
        if should_upgrade; then
            upgrade_notice
        else
            # Only execute "init_config" during "on-install". If the configuration
            # is absent during "on-upgrade", assume that this it is an intentional
            # choice by the system administrator. Writing default configuration
            # after "influxd" has executed without *any* configuration, causes
            # "influxd" to execute with different "bolt-path" and "engine"
            # directories resulting in the perception of data loss.
            init_config
        fi
    else
        # on-upgrade
        if should_upgrade; then
            upgrade_notice
        fi
    fi
}

function amazon() {
    source /etc/os-release

    if [[ "$NAME" = "Amazon Linux" ]]; then
        # Amazon Linux 2+ logic
        install_systemd
    elif [[ "$NAME" = "Amazon Linux AMI" ]]; then
        # Amazon Linux logic
        install_init
        install_chkconfig
    fi

    if should_upgrade; then
        upgrade_notice
    else
        init_config
    fi
}

if [[ "${RPM_INSTALL_PREFIX:-}" ]]; then
    redhat "${@}"
    exit 0
fi

if [[ "${DPKG_RUNNING_VERSION:-}" ]]; then
    debian "${@}"
    exit 0
fi

amazon "${@}"
