#!/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_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
            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
