#!/bin/bash

LSOF="/usr/sbin/lsof"
if [ -x "/usr/bin/lsof" ]; then
    LSOF="/usr/bin/lsof"
fi

perform_db_schema_upgrade() {
    /usr/bin/spacewalk-schema-upgrade -y

    if [ $? -ne 0 ]; then
        echo "Database schema upgrade failed. Please check the logs."
        exit 1
    fi
}

check_schema_version() {
    MIN_JAVA_SCHEMA=$( egrep -m1 "^java.min_schema_version[[:space:]]*=" /usr/share/rhn/config-defaults/rhn_java.conf | sed 's/^java.min_schema_version[[:space:]]*=[[:space:]]*\(.*\)/\1/' || echo "" )
    CMP=$(echo "select evr_t_compare(X.evr, evr_t('0', '$MIN_JAVA_SCHEMA', '0', 'rpm')) from (select PE.evr from rhnVersionInfo vi join rhnPackageEVR pe on vi.evr_id = pe.id) X;" | spacewalk-sql --select-mode - | sed -n 3p | xargs)
    if [ $CMP -lt 0 ]; then
        echo "Incompatible database schema version detected! Minimal schema version required by Java: $MIN_JAVA_SCHEMA"
        exit 1
    fi
    MIN_BACK_SCHEMA=$( egrep -m1 "^min_schema_version[[:space:]]*=" /usr/share/rhn/config-defaults/rhn_server_xmlrpc.conf | sed 's/^min_schema_version[[:space:]]*=[[:space:]]*\(.*\)/\1/' || echo "" )
    CMP=$(echo "select evr_t_compare(X.evr, evr_t('0', '$MIN_BACK_SCHEMA', '0', 'rpm')) from (select PE.evr from rhnVersionInfo vi join rhnPackageEVR pe on vi.evr_id = pe.id) X;" | spacewalk-sql --select-mode - | sed -n 3p | xargs)
    if [ $CMP -lt 0 ]; then
        echo "Incompatible database schema version detected! Minimal schema version required by Backend: $MIN_BACK_SCHEMA"
        exit 1
    fi
}

check_database() {
    RETRIES=10;
    source /etc/os-release
    while [ $RETRIES -gt 0 ]; do

        IFS="." read -ra VARR <<< $(echo "show server_version;" | spacewalk-sql --select-mode - | sed -n 3p | xargs)

        if [ $? -eq 0 ]; then
            if [ $VERSION_ID == "15.3" -a "${VARR[0]}" != "13" ]; then
                echo "Database version '${VARR[0]}' is not supported for SUSE Manager/Uyuni on $PRETTY_NAME. Perform database migration."
                exit 1
            fi
            perform_db_schema_upgrade
            check_schema_version
            exit 0 # db is running
        fi

        ((RETRIES--))
        sleep 1
    done
    exit 1
}

wait_for_jabberd() {
    RETRIES=10
    while [ $RETRIES -gt 0 ]
    do
        $LSOF -t -i :5222 > /dev/null && break
        ((RETRIES--))
        sleep 0.5
    done
}

wait_for_tomcat() {
if [ -x /etc/init.d/tomcat5 ]; then
   TOMCAT_PID=$(cat /var/run/tomcat5.pid 2>/dev/null)
elif [ -x /etc/init.d/tomcat6 ]; then
   TOMCAT_PID=$(cat /var/run/tomcat6.pid 2>/dev/null)
elif [ -e /usr/lib/systemd/system/tomcat.service ]; then
   TOMCAT_PID=$(systemctl show --property=MainPID tomcat.service | sed 's/^MainPID=0*//')
elif [ -e /usr/lib/systemd/system/tomcat.service ]; then
   TOMCAT_PID=$(systemctl show --property=MainPID tomcat.service | sed 's/^MainPID=0*//')
else
   echo "No tomcat service found."
   exit 0;
fi

if [ -x $LSOF ]; then
    echo "Waiting for tomcat to be ready ..."
    RETRIES=30
    while [ -n "$TOMCAT_PID" ] ; do
        $LSOF -t -i TCP:8005 | grep "^$TOMCAT_PID$" > /dev/null \
        && $LSOF -t -i TCP:8009 | grep "^$TOMCAT_PID$" > /dev/null \
        && break
        [ $RETRIES -gt 0 ] || break
        ((RETRIES--))
        sleep 1
    done
else
    echo "No lsof found, not waiting for tomcat."
fi
}

wait_for_taskomatic() {
if [ -x $LSOF ]; then
    echo "Waiting for taskomatic to be ready ..."
    RETRIES=30
    while [ $RETRIES -gt 0 ]
    do
        $LSOF -t -i TCP:2829 > /dev/null && break
        ((RETRIES--))
        sleep 3
    done
    if [ $RETRIES -eq 0 ]; then
        echo "taskomatic still not up and running" >&2
    fi
else
    echo "No lsof found, not waiting for taskomatic."
fi
}


ensure_httpd_down() {
    COUNT=0
    LIMIT=10

    while [ "$(pidof -c httpd | wc -w)" -gt 0 ] && [ "$COUNT" -lt "$LIMIT" ]
    do
       sleep 1
       ((COUNT++))
    done

    if [ "$COUNT" -eq "$LIMIT" ]; then
       killall -9 httpd
       sleep 4
    fi

    return 0
}

case $1 in
        ensure-httpd-down) ensure_httpd_down;;
        wait-for-jabberd) wait_for_jabberd;;
        wait-for-tomcat) wait_for_tomcat;;
        wait-for-database) check_database;;
        check-database) check_database;;
        wait-for-taskomatic) wait_for_taskomatic;;
esac
