#!/bin/sh

set -e

KIX_VERSION="17"
KIX_FULL_VERSION="17.2.0-0"
KIX_BUILD_DATE="Mon, 30 Oct 2017 14:46:50 +0100"
KIX_HOME=/opt/kix
KIX_VERSION_HOME=/opt/kix$KIX_VERSION
PRODUCT="KIX"
PACKAGE="kix"
INSTALL_SRC_DIR=/tmp/${PACKAGE}_install
CRON_HOME=$KIX_HOME/var/cron
CONFIGFILES="Kernel/Config/GenericAgent.pm"
CRONJOBS="kix_daemon "

setup_selinux() {
    SELINUX_EXISTS=`which sestatus | wc -l`
    if [ $SELINUX_EXISTS -ne 0 ]; then
        echo selinux is active...creating policy 
        semanage fcontext -a -t httpd_sys_rw_content_t "$KIX_HOME(/.*)?" 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
        restorecon -vR $KIX_HOME 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
        setsebool -P httpd_can_network_connect_db 1 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
        setsebool -P httpd_can_network_connect 1 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1

        semanage fcontext -a -t httpd_sys_rw_content_t "$KIX_VERSION_HOME(/.*)?" 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
        restorecon -vR $KIX_VERSION_HOME 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1

        mkdir -p /usr/share/kix/selinux
        checkmodule -M -m -o /usr/share/kix/selinux/kix.mod /usr/share/kix/kix-selinux.profile 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
        semodule_package -o /usr/share/kix/selinux/kix.pp -m /usr/share/kix/selinux/kix.mod 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
        semodule -i /usr/share/kix/selinux/kix.pp 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1
    fi
}

setup_apache() {
    # get params
    OSTYPE=$1
    
    # configure apache
    case "$OSTYPE" in
        debian)
            if [ ! -e /etc/apache2/sites-available/kix.conf ]; then
                # delete the file anyway since damaged links are also no existing files
                rm -f /etc/apache2/sites-available/kix.conf
                ln -s $KIX_HOME/scripts/kix_apache.conf /etc/apache2/sites-available/kix.conf
            fi
            
            if [ -e /etc/apache2/sites-available/kix.conf ]; then
                a2ensite kix.conf
                a2enmod perl
                a2enmod headers
                a2enmod deflate
                A2QUERY=`which a2query | wc -l`
                if [ $A2QUERY -ne 0 ]; then
                    ACTIVE_MPM=`a2query -M`
                    a2dismod mpm_$ACTIVE_MPM
                    a2enmod mpm_prefork
                fi
                service apache2 restart
            fi
            ;;
        redhat)
            if [ ! -e /etc/httpd/conf.d/kix.conf ]; then
                # delete the file anyway since damaged links are also no existing files
                rm -f /etc/httpd/conf.d/kix.conf
                ln -s $KIX_HOME/scripts/kix_apache.conf /etc/httpd/conf.d/kix.conf
            fi

            if [ -e /etc/httpd/conf.d/kix.conf ]; then
                service httpd restart
            fi
            ;;
        suse)
            if [ ! -e /etc/apache2/conf.d/kix.conf ]; then
                # delete the file anyway since damaged links are also no existing files
                rm -f /etc/apache2/conf.d/kix.conf
                ln -s $KIX_HOME/scripts/kix_apache.conf /etc/apache2/conf.d/kix.conf
            fi
            
            if [ -e /etc/apache2/conf.d/kix.conf ]; then
                a2enmod perl
                a2enmod headers
                a2enmod deflate
                a2enmod filter
                a2enmod version
                service apache2 restart
            fi
            ;;
        *)
            echo "Unknown OSTYPE $OSTYPE!!!"
            exit 1;
            ;;
    esac
}

install_kix() {
    # get params
    OSTYPE=$1

    RESULT=$(_get_apache_user_and_group $OSTYPE)
    APACHEUSER=`echo $RESULT | cut -d: -f1`
    APACHEGRP=`echo $RESULT | cut -d: -f2`

    UPDATE_FRAMEWORK=1
    IS_INSTALL=1
    TGZ_RELEASE=`basename $INSTALL_SRC_DIR/KIX*.tar.gz | cut -d- -f2 | sed -e 's/\.tar\.gz//g'`

    cd /opt

    if [ ! -d  $KIX_VERSION_HOME ]; then 
        mkdir $KIX_VERSION_HOME 
        rm -rf $KIX_HOME
    else
        IS_INSTALL=0

        # check framework version
        FRAMEWORK_RELEASE=`cat $KIX_VERSION_HOME/RELEASE | grep FRAMEWORK | cut -d' ' -f3`
        if [ "$FRAMEWORK_RELEASE" = "$TGZ_RELEASE" ]; then
            UPDATE_FRAMEWORK=0
        fi

        # stopping the OTRS cronjobs
        CRONTAB=`crontab -lu $APACHEUSER 2>&1 | wc -l`
        if [ $CRONTAB -gt 1 ]; then 
            echo stopping cronjobs
            $KIX_VERSION_HOME/bin/Cron.sh stop $APACHEUSER 2>&1 > /dev/null
        fi
    fi

    # create link
    if [ ! -h $KIX_HOME ]; then
        ln -s $KIX_VERSION_HOME $KIX_HOME
    fi

    if [ $UPDATE_FRAMEWORK -eq 1 ]; then
        echo installing framework
        cd $INSTALL_SRC_DIR 
        tar xfz $INSTALL_SRC_DIR/KIX*.tar.gz 2>&1 > /dev/null
        cp -rf $INSTALL_SRC_DIR/KIX-*/* $KIX_HOME
        find $INSTALL_SRC_DIR/KIX-*/ -name '.*' -type f -exec cp -f {} $KIX_HOME \;
    fi

    # update RELEASE file(s)
    sed -i -e "s/^PRODUCT = .*$/PRODUCT = $PRODUCT/g" $KIX_HOME/RELEASE
    sed -i -e "s/^VERSION = .*$/VERSION = $KIX_FULL_VERSION/g" $KIX_HOME/RELEASE
    sed -i -e "s/^BUILDDATE = .*$/BUILDDATE = $KIX_BUILD_DATE/g" $KIX_HOME/RELEASE

    if [ ! -e $KIX_HOME/Kernel/Config.pm ]; then
        cp $KIX_HOME/Kernel/Config.pm.dist $KIX_HOME/Kernel/Config.pm
        # disable error handling - faulty DNS config shouldn't lead to abort of installer
        set +e
        HOSTNAME=`hostname`
        if [ -z $HOSTNAME ]; then
            echo "WARNING: unable to determine hostname"
        fi
        DNSDOMAINNAME=`dnsdomainname`
        if [ -z $DNSDOMAINNAME ]; then
            echo "WARNING: unable to determine DNS domainname"
        fi
        # re-enable error handling
        set -i
        sed -i -e "s/__FQDN__/$HOSTNAME.$DNSDOMAINNAME/g" $KIX_HOME/Kernel/Config.pm
    fi

    if [ -d $INSTALL_SRC_DIR/Config_deb_upgrade ]; then
        mv $INSTALL_SRC_DIR/Config_deb_upgrade/ZZZAuto.pm $KIX_HOME/Kernel/Config/Files/
        mv $INSTALL_SRC_DIR/Config_deb_upgrade/ZZZAAuto.pm $KIX_HOME/Kernel/Config/Files/
        rm -rf $INSTALL_SRC_DIR/Config_deb_upgrade
    fi

    # create DB if this is an installation
    if [ $IS_INSTALL -eq 1 ]; then
        # check if a previous KIX is already installed and take the password from there
        if [ -d /opt/kix16 ]; then
            DBPASSWORD=$(cat /opt/kix16/Kernel/Config.pm | grep DatabasePw | cut -d\' -f2)
        elif [ -z $KIXDB_PASSWORD ]; then
            DBPASSWORD=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
        fi
        
        # generate SQL files for all supported DBMS
        chown -R $APACHEUSER:$APACHEGRP $KIX_VERSION_HOME
        sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Dev::Tools::Database::XML2SQL --database-type all --source-path $KIX_HOME/scripts/database/kix-schema.xml --target-directory $KIX_HOME/scripts/database/ --target-filename kix-schema --split-files 2>&1 > /dev/null"
        sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Dev::Tools::Database::XML2SQL --database-type all --source-path $KIX_HOME/scripts/database/kix-initial_insert.xml --target-directory $KIX_HOME/scripts/database/ --target-filename kix-initial_insert 2>&1 > /dev/null"

        # source kixdb
        . /usr/share/kix/kixdb
        create_db $OSTYPE $DBPASSWORD
    else
        # execute DB update script
        VERSION=$(echo $KIX_FULL_VERSION | cut -d'-' -f1)
        sudo -u $APACHEUSER bash -c "$KIX_HOME/scripts/database/update/db-update.pl -v '$VERSION' 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1"
    fi
    
    for FILE in $CONFIGFILES; do
        if [ -f $KIX_HOME/$FILE.dist ] && [ ! -e $KIX_HOME/$FILE ]; then
            mv $KIX_HOME/$FILE.dist $KIX_HOME/$FILE
        fi
    done

    # prepare perl startup file
    sed -i -e "s/\/opt\/otrs/\/opt\/kix/g" $KIX_HOME/scripts/apache2-perl-startup.pl

    # set required permissions
    if [ ! -f $KIX_HOME/var/log/TicketCounter.log ]; then
        echo '' > $KIX_HOME/var/log/TicketCounter.log
        chmod 0664 $KIX_HOME/var/log/TicketCounter.log
    fi
    
    if [ -z "$KIX_NO_CHOWN" ]; then
        chown -R $APACHEUSER:$APACHEGRP $KIX_HOME
        chown -R $APACHEUSER:$APACHEGRP $KIX_VERSION_HOME
    fi

    # prepare OTRS cronjobs
    echo preparing cronjobs
    for JOB in $CRONJOBS; do
        if [ ! -e $KIX_HOME/$FILE ]; then
            sed -e "s/\$HOME/\/opt\/kix/g" $KIX_HOME/var/cron/$JOB.dist > $KIX_HOME/var/cron/$JOB
        fi
    done

    if [ -z "$KIX_NO_CHOWN" ]; then
        chown -R $APACHEUSER:$APACHEGRP $KIX_HOME
        chown -R $APACHEUSER:$APACHEGRP $KIX_VERSION_HOME
    fi

    echo rebuilding config
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Config::Rebuild 2>&1 > /dev/null"

    echo deleting caches
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Loader::CacheCleanup 2>&1 > /dev/null"
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Cache::Delete 2>&1 > /dev/null"

    echo activating cronjobs
    $KIX_HOME/bin/Cron.sh start $APACHEUSER 2>&1 > /dev/null

    # restart daemon
    echo restarting daemon
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl stop --force 2>&1 > /dev/null"
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl start 2>&1 > /dev/null"

    # configure apache webserver
    echo configuring apache webserver 
    setup_apache $OSTYPE

    # configure selinux of necessary
    setup_selinux $OSTYPE

    # cleanup
    echo cleaning up
    rm -rf $INSTALL_SRC_DIR
}

uninstall_kix() {
    # get params
    OSTYPE=$1

    RESULT=$(_get_apache_user_and_group $OSTYPE)
    APACHEUSER=`echo $RESULT | cut -d: -f1`
    APACHEGRP=`echo $RESULT | cut -d: -f2`
    
    # stop daemon
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl stop --force 2>&1 > /dev/null"

    # remove apache config
    case "$OSTYPE" in
        debian)
            if [ -f /etc/apache2/sites-available/kix.conf ]; then
                a2dissite kix.conf
                rm -f /etc/apache2/sites-available/kix.conf
            else
                echo "No kix apache config file found."
            fi
            service apache2 reload
            ;;
        redhat)
            if [ -f /etc/httpd/conf.d/kix.conf ]; then
                rm -f /etc/httpd/conf.d/kix.conf
            else
                echo "No kix apache config file found."
            fi
            service httpd reload
            ;;
        suse)
            if [ -f /etc/apache2/conf.d/kix.conf ]; then
                rm -f /etc/apache2/conf.d/kix.conf
            else
                echo "No kix apache config file found."
            fi
            service apache2 reload
            ;;
        *)
            echo "Unknown OSTYPE $OSTYPE!!!"
            exit 1;
            ;;
    esac
}

install_packages() {
    # get params
    OSTYPE=$1
    PACKAGE=$2
    PRODUCT=$3
    INSTALL_SRC_DIR=/tmp/${PACKAGE}_install

    RESULT=$(_get_apache_user_and_group $OSTYPE)
    APACHEUSER=`echo $RESULT | cut -d: -f1`
    APACHEGRP=`echo $RESULT | cut -d: -f2`

    if [ -z "$KIX_NO_CHOWN" ]; then
        chown -R $APACHEUSER:$APACHEGRP $KIX_HOME
        chown -R $APACHEUSER:$APACHEGRP $KIX_VERSION_HOME
    fi

    # stopping the OTRS cronjobs
    CRONTAB=`crontab -lu $APACHEUSER 2>&1 | wc -l`
    if [ $CRONTAB -gt 1 ]; then
        echo stopping cronjobs
        $KIX_HOME/bin/Cron.sh stop $APACHEUSER 2>&1 > /dev/null
    fi

    # install packages
    if [ -d $INSTALL_SRC_DIR/pkgs ]; then
        echo -n configuring
        for FILE in $INSTALL_SRC_DIR/pkgs/*.opm; do
            FILENAME=`basename $FILE`
            PACKAGENAME=`grep -e "<Name>" $FILE | cut -d'>' -f2 | cut -d'<' -f1`
            OPMVERSION=`grep -e "<Version>" $FILE | cut -d'>' -f2 | cut -d'<' -f1`
            METHOD="Install"

            # check package is installed
            set +e
            INSTALLED_PACKAGE_VERSION=`sudo -u $APACHEUSER $KIX_HOME/bin/kix.Console.pl Admin::Package::GetInstalledVersion --package-name $PACKAGENAME | cut -d' ' -f2`
            if [ -n "$INSTALLED_PACKAGE_VERSION" ]; then
                METHOD="Upgrade"
                if [ "$INSTALLED_PACKAGE_VERSION" = "$OPMVERSION" ] && [ -n "$KIX_IGNORE_SAME_PACKAGE_VERSION" ]; then
                    METHOD="Ignore"
                fi
            fi
            set -e
            
            echo -n . 
            if [ "$METHOD" != "Ignore" ]; then
                sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Admin::Package::$METHOD $FILE 1>> $KIX_HOME/var/log/${PACKAGE}_install.log 2>&1"
            else 
                echo "$FILENAME ignored" >> $KIX_HOME/var/log/${PACKAGE}_install.log
            fi
        done
        echo
    fi

    if [ -z "$KIX_NO_CHOWN" ]; then
        chown -R $APACHEUSER:$APACHEGRP $KIX_HOME
        chown -R $APACHEUSER:$APACHEGRP $KIX_VERSION_HOME
    fi

    echo rebuilding config
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Config::Rebuild 2>&1 > /dev/null"

    echo deleting caches
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Loader::CacheCleanup 2>&1 > /dev/null"
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Cache::Delete 2>&1 > /dev/null"

    echo activating cronjobs
    $KIX_HOME/bin/Cron.sh start $APACHEUSER 2>&1 > /dev/null

    # restart daemon
    echo restarting daemon
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl stop --force 2>&1 > /dev/null"
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl start 2>&1 > /dev/null"

    # disable error handling - already stopped apache shouldn't lead to abort of installer
    set +e

    # reload apache webserver
    echo reloading apache webserver
    case "$OSTYPE" in
        debian)
            service apache2 reload
            ;;
        redhat)
            service httpd reload
            ;;
        suse)
            service apache2 reload
            ;;
        *)
            echo "Unknown OSTYPE $OSTYPE!!!"
            ;;
    esac
    set -e
}

uninstall_packages() {
    # get params
    OSTYPE=$1
    PACKAGE=$2
    PACKAGELIST=$3

    RESULT=$(_get_apache_user_and_group $OSTYPE)
    APACHEUSER=`echo $RESULT | cut -d: -f1`
    APACHEGRP=`echo $RESULT | cut -d: -f2`

    # remove packages
    for RM_PACKAGE in $PACKAGELIST; do
        sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Admin::Package::Uninstall --force $RM_PACKAGE 1>> $KIX_HOME/var/log/${PACKAGE}_uninstall.log 2>&1"
    done

    echo rebuilding config        
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Config::Rebuild 2>&1 > /dev/null"

    echo deleting caches
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Loader::CacheCleanup 2>&1 > /dev/null"
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Console.pl Maint::Cache::Delete 2>&1 > /dev/null"

    # restart daemon
    echo restarting daemon
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl stop --force 2>&1 > /dev/null"
    sudo -u $APACHEUSER bash -c "$KIX_HOME/bin/kix.Daemon.pl start 2>&1 > /dev/null"

    # disable error handling - already stopped apache shouldn't lead to abort of installer
    set +e
    
    # reload apache webserver
    echo reloading apache webserver
    case "$OSTYPE" in
        debian)
            service apache2 reload
            ;;
        redhat)
            service httpd reload
            ;;
        suse)
            service apache2 reload
            ;;
        *)
            echo "Unknown OSTYPE $OSTYPE!!!"
            ;;
    esac
    
    set -e
}

print_install_success() {
    PRODUCT=$1

    echo " "
    echo "******************************************************************************"
    echo " ${PRODUCT} has been successfully installed."
    echo "******************************************************************************"
    echo " "
}

print_uninstall_success() {
    PRODUCT=$1

    echo " "
    echo "******************************************************************************"
    echo " ${PRODUCT} has been successfully uninstalled."
    echo "******************************************************************************"
    echo " "
}

_get_apache_user_and_group() {
    # get params
    OSTYPE=$1

    # define some OS secific variables
    case "$OSTYPE" in
        debian)
            APACHEUSER=www-data
            APACHEGRP=www-data
            ;;
        redhat)
            APACHEUSER=apache
            APACHEGRP=apache
            ;;
        suse)
            APACHEUSER=wwwrun
            APACHEGRP=www
            ;;
        *)
            echo "Unknown OSTYPE $OSTYPE!!!"
            ;;
    esac

    echo "$APACHEUSER:$APACHEGRP"
}
