#!/bin/bash -e
# This file boot straps NagiosXI install with all the yum packages.

. ./xi-sys.cfg

# Check whether we have sufficient privileges
if [ $(id -u) -ne 0 ]; then
    echo "This script needs to be run as root/superuser." >&2
    exit 1
fi

# Was previous step completed?
if [ ! -f installed.repos ]; then
    echo "Repos were not properly prepared - run previous script" >&2
    exit 1
fi

# Are prereqs already installed?
if [ -f installed.prereqs ]; then
    echo "Prereqs already installed - skipping..."
    echo "Note: If you want to update the RPMs installed on this system, run your package manager's update command"
    exit 0
fi

##########################################
# INSTALL REQUIRED PACKAGES
##########################################

echo "Installing prerequisites..."
if [ -f $INSTALL_PATH/offline ]; then
    rpm -ivh $INSTALL_PATH/nagiosxi-deps-$xiver-1.noarch.rpm
else
    if [ "$distro" = "SUSE LINUX" ]; then
        if [ "$dist" == "suse11" ]; then
            xiverrpm="nagiosxi-deps-suse11"
            zypper install -y $(readlink -e ./$xiverrpm-$xiver-1.noarch.rpm)
        else
            xiverrpm="nagiosxi-deps-suse12"
            zypper install -y $(readlink -e ./$xiverrpm-$xiver-1.noarch.rpm)
        fi
    elif [ "$distro" == "Raspbian" ] || [ "$distro" == "Ubuntu" ] || [ "$distro" == "Debian" ]; then

        export DEBIAN_FRONTEND=noninteractive
        export PERL_MM_USE_DEFAULT=1
        
        echo "Checking conflicting packages " 
        if ! dpkg -s nagios nagios-nrpe nagios-nsca ndoutils ndoutils-mysql nrpe nsca && [ "$?" -ne 0 ]; then
            echo "ERROR: Conflicting packages found." >&2
            exit 1
        fi

        extras="libgd3"

        # Fixes for mysql install (sshpass required for migrate)
        if [ "$dist" == "debian11" ] || [ "$dist" == "debian12" ]; then
            extras="$extras mariadb-server libmariadb-dev-compat libmariadb-dev python3-pymssql python3-pip python3-rrdtool sshpass"
        elif [ "$dist" == "ubuntu22" ] || [ "$dist" == "ubuntu24" ]; then
            extras="$extras libmysqlclient-dev python3-pymssql python3-lxml python3-numpy python3-pip python3-rrdtool mysql-server sshpass"
        else
            extras="$extras libmysqlclient-dev python-pymssql python-pip python-rrdtool mysql-server php-gettext"
        fi

        if [ "$dist" == "ubuntu22" ] || [ "$dist" == "ubuntu24" ] || [ "$dist" == "debian11" ] || [ "$dist" == "debian12" ]; then
            extras="$extras libgd-dev"
        else
            extras="$extras libgd2-xpm-dev"
        fi

        if [ "$dist" == "ubuntu24" ]; then
            extras="$extras tzdata-legacy"
        fi

        # Fixes for python deps
        if [ "$dist" == "debian11" ] || [ "$dist" == "debian12" ] || [ "$dist" == "ubuntu22" ] || [ "$dist" == "ubuntu24" ]; then
            extras="$extras python3-numpy python3-lxml python3-simplejson python3-winrm"
        else
            extras="$extras python-numpy python-lxml python-simplejson"
        fi

        # Ensure sendmail is installed on Debian
        if [ "$dist" == "debian11" ] || [ "$dist" == "debian12" ]; then
            extras="$extras sendmail"
        fi

        # Test install all required packages (for now)
        apt-get update
        if [ "$dist" == "ubuntu22" ] || [ "$dist" == "ubuntu24" ] || [ "$dist" == "debian11" ] || [ "$dist" == "debian12" ]; then
            apt-get install -y $extras automake autoconf bc dnsutils dos2unix dstat libxml-parser-perl fping gcc libc6 graphviz apache2 apache2-utils iptables mcrypt locales libmcrypt-dev make automake mailutils snmp snmptt snmptrapd snmpd libsnmp-base libsnmp-dev snmp-mibs-downloader nmap ntp slapd libpq5 libpq-dev libldap2-dev ldap-utils openssl ssh libexpat1-dev libssl-dev curl libcurl4-openssl-dev perl libmail-imapclient-perl libdbd-mysql-perl libnet-dns-perl libnet-snmp-perl php php-pdo php-sybase libapache2-mod-php php-gd php-mysql php-pear php-sqlite3 php-mbstring php-pgsql php-intl php-dev php-snmp php-imap php-ldap php-curl libssh2-1-dev libpq-dev rrdtool librrds-perl subversion sudo sysstat traceroute unzip wget xinetd zip tftp-hpa uuid-runtime rsync xfonts-75dpi xfonts-base postgresql gawk postgresql-contrib ansible dc git iputils-ping cron jq poppler-utils
            
            printf "\n" | pecl install ssh2
            echo "extension=ssh2.so" | tee -a $(find /etc/php -name "php.ini" | grep apache2)
        else
            apt-get install -y $extras automake autoconf bc dnsutils dos2unix dstat libxml-parser-perl fping locales gcc libc6 libgd2-xpm-dev graphviz apache2 apache2-utils iptables mcrypt libmcrypt-dev make automake mailutils mysql-server libmysqlclient-dev snmp snmptt snmpd libsnmp-base libsnmp-dev snmp-mibs-downloader nmap ntp python-numpy slapd libpq5 libpq-dev libldap2-dev ldap-utils openssl ssh libexpat1-dev libssl-dev curl libcurl4-openssl-dev perl libmail-imapclient-perl libdbd-mysql-perl libnet-dns-perl libnet-snmp-perl php5 libapache2-mod-php5 php5-gd php5-mcrypt php5-mssql php5-intl php-gettext php5-sqlite php5-mysql php-pear libssh2-1-dev php5-pgsql php5-snmp php5-imap php5-ldap php5-dev php5-curl php5-sybase php5-ssh2 libpq-dev python-pip python-lxml python-simplejson rrdtool librrds-perl python-rrdtool subversion sudo sysstat traceroute unzip wget xinetd zip tftp uuid-runtime rsync xfonts-75dpi xfonts-base postgresql postgresql-contrib ansible gawk dc git
        fi

        # Fix for python if it doesn't exist as a binary
        if [ ! -f /usr/bin/python ]; then
            if [ -f /usr/bin/python3 ]; then
                ln -s /usr/bin/python3 /usr/bin/python
            elif [ -f /usr/bin/python2 ]; then
                ln -s /usr/bin/python2 /usr/bin/python
            fi
        fi

        # Install shellinabox in a shell because it has problems...
        (
            apt-get install -y shellinabox > /dev/null 2>&1
        )

        # Install via cpan - apparently if already installed it causes an error
        LANG="C" cpan install CPAN ||:
        LANG="C" cpan install Error ||:
        LANG="C" cpan install Params::Validate Math::Calc::Units Config::Tiny Crypt::Rijndael Crypt::SSLeay Crypt::DES HTTP::Cookies HTTP::Request::Common Mail::POP3Client Net::SMTP Net::SMTP::TLS Test::More Time::HiRes Number::Format XML::Parser XML::Simple Class::Accessor ||:

        # Set up apache SSL and CGI
        a2enmod cgi
        a2enmod ssl
        a2enmod rewrite
        a2ensite default-ssl

        # Set up languages for the install
        (
            cd nagiosxi/basedir/html/includes/lang/locale
            for lang in *; do
                if [ -d "$lang" ]; then
                    if [ "$distro" == "Debian" ]; then
                        sed -i "/#[[:blank:]]*$lang/s/#//" /etc/locale.gen
                    else
                        locale-gen "$lang" &> /dev/null
                        locale-gen "$lang.UTF-8" &> /dev/null
                    fi
                fi
            done
            echo "Configuring locale... this might take a minute..."
            if [ `command -v locale-update` ]; then
                locale-update &> /dev/null
            else
                locale-gen &> /dev/null
            fi
        )

        # Update /bin/mail to /usr/bin/mail on Ubuntu/Debian
        if [ ! -f /bin/mail ]; then
            ln -s /usr/bin/mail /bin/mail
        fi

    elif [ "$distro" == "CentOS" ] || [ "$distro" == "RedHatEnterpriseServer" ] || [ "$distro" == "OracleServer" ]; then

        if [ $ver -eq 9 ]; then

            xiverrpm="nagiosxi-deps-el9"

        elif [ $ver -eq 8 ]; then

            xiverrpm="nagiosxi-deps-el8"

        fi

        yumlocalinstall="$(readlink -e ./$xiverrpm-$xiver-1.noarch.rpm)"

        # Attempt to install dependencies, and if it fails for some reason clean the repos
        if ! yum -y localinstall $yumlocalinstall; then
            yum clean all
            yum -y localinstall $yumlocalinstall
        fi

        # Special section for EL8 perl, net-snmp and ssh2
        if [ $ver -eq 8 ]; then

            # Set 'alternatives' to python3.9
            # NOTE: we are installing python 3.9 (39), so make sure we link /usr/bin/python to 3.9.
            alternatives --set python3 /usr/bin/python3.9

            # Link python3 to python so we are using 3 normally
            # NOTE: 'alternatives' should set this, so may not be necessary.
            if [ ! -f /usr/bin/python ]; then
                ln -s /usr/bin/python3 /usr/bin/python
            fi

            # Upgrade pip and setuptools for RHEL 8
            pip3 install --upgrade setuptools
            python -m pip install -U pip

            python -m pip install "pymssql<3"
            python -m pip install --upgrade requests

            # Perl modules (if install exits because something is already installed the install stops... due to -e)
            set +e
            echo | cpan install CPAN
            cpan install Crypt::Rijndael Class::Accessor Mail::IMAPClient Number::Format Params::Validate
            set -e

            #
            # libssh2 version 1.10 is not available from epel-release for RHEL 8
            #

            # Download libssh2 version 1.10.0
            wget https://libssh2.org/download/libssh2-1.10.0.tar.gz
            tar -zxvf libssh2-1.10.0.tar.gz
            cd libssh2-1.10.0

            # Configure and install libssh2:
            ./configure
            make
            sudo make install

            # Reset location
            cd ..

            # Ensure the correct rrdtool module version is installed:
            python -m pip install rrdtool

        elif [ $ver -eq 9 ]; then

            set +e
            echo | cpan install CPAN
            cpan install Math::Calc::Units Crypt::Rijndael Class::Accessor Mail::IMAPClient Number::Format Params::Validate Config::IniFiles
            set -e

        fi

        # Adds ssh2 VIA pecl to support newer versions of PHP
        printf "\n" | pecl install ssh2
        echo "extension=ssh2" > /etc/php.d/ssh2.ini
    fi
fi

echo "Prerequisites installed OK"
touch installed.prereqs
