#!/usr/bin/env bash

scriptpath="`readlink -f \"$0\"`"
scriptbase="`dirname \"${scriptpath}\"`"
REPOTYPE="$1"
CONFFILE="/opt/dosis2/etc/postgresql/9.2/custom-postgresql.conf"

. "${scriptbase}/migrate-tools"

enforce_root

tmpdir="`mktemp -d`"
function cleanup() {
    rm -rf "${tmpdir}"
}
trap cleanup EXIT

function system_needs_proxy() {
    if wget -qO-  --timeout=3 --tries=1 checkip.dyndns.org | grep -q 'Current IP Address'; then
        return 1
    else
        return 0
    fi
}

function system_setup_proxy() {
    "${scriptbase}/setup-proxy"
}

function patch_yum_conf() {
    if grep -q "ip_resolve=" "/etc/yum.conf"; then
        sed -i "s/ip_resolve=.*/ip_resolve=4/g" "/etc/yum.conf"
    else
        echo "ip_resolve=4" >> "/etc/yum.conf"
    fi

    sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo

    sed -i "s/baseurl=http:\/\/puias.math.ias.edu\/data\/puias\/computational\/\$releasever\/\$basearch/baseurl=http:\/\/mirror.math.princeton.edu\/pub\/springdale\/puias\/6.5\/x86_64\/os\/Springdale/" /etc/yum.repos.d/puias-computational.repo
    sed -i "s/#baseurl=/baseurl=/" /etc/yum.repos.d/puias-computational.repo
    sed -i "s/mirrorlist=/#mirrorlist=/" /etc/yum.repos.d/puias-computational.repo

}

function verify_os() {
    os="`getos`"
    if [ "${os}" != "CentOS" ]; then
        abort 2 "Migration unsupported on: ${os}"
    fi
}

function cleanup_pre_migrate() {
    rm -f /etc/yum.repos.d/dosis-mirrors
    rm -f /etc/yum.repos.d/dosis-mirrors-testing
    rm -f /etc/yum.repos.d/Dosis.repo
    rm -f /etc/yum.repos.d/atrpms.repo
    rm -f /etc/yum.repos.d/nux-dextop.repo

    rpm -e pgdg-centos92-9.2-6.noarch
    rm -f /etc/yum.repos.d/pgdg*.repo
    yum -y install nss ca-certificates

    #rpm -ivh --force "${scriptbase}/pgdg-centos92-9.2-8.noarch.rpm"
}

function install_requirements() {
    yum clean all
    yum clean expire-cache
    for i in `seq 1 3`; do
        yum install -y fping yum-plugin-downloadonly
        if [ $? = 0 ]; then
            return 0
        fi
    done
    
    abort 2 "Failed to install migrate requirements"
}

function fix_ius_git() {
    rpm -ivh "${scriptbase}/ius-release-el6.rpm"

    for i in `seq 1 3`; do
        yum remove -y git
    done

    for i in `seq 1 3`; do
        yum install -y git gitk
    done
}

function setup_system_repo() {
    repotype="$1"
    "${scriptbase}/setup-repo" "${repotype}"
    retval=$?
    
    if [ ${retval} != 0 ]; then
        abort ${retval} "Failed to setup repo as: ${repotype}"
    fi
}

function stop_all_services() {
    service dosis_l60 stop
    service dosis_pmis stop
    service dosis_extprint stop
    service httpd stop
    service dosis_dbmonitor stop
    service dosis_pmis_sync stop
}

function remove_old_packages() {
    rpm -e dosis-base L60 dosis_os \
        dosis-mobile-dosis_notify \
        dosis_prep dosis_repo dosis_ctraq \
        mcontrol mcontrol-cli mcontrol-drivers-mdrive mcontrol-libs \
        stpc
}

function cleanup_post_package_removal() {
    rm -rf /opt/dosis2/bin/*
    rm -rf /opt/dosis2/lib/*
    rm -rf /opt/dosis2/pip/*
    rm -rf /opt/dosis2/rpm/*
    rm -rf /opt/dosis2/stpc
    rm -rf /opt/dosis2/tmp.out/*
}

function prep_system_for_upgrade() {
    #"${scriptbase}/prep-for-upgrade"
    #retval=$?

    #if [ ${retval} != 0 ]; then
    #    abort ${retval} "failed to prep for upgrade"
    #fi
    mkdir -p /var/lib/dosis2/rpm/archives
    rm -f /var/lib/dosis/rpm/archives/*.rpm
    yum clean all
    yum clean expire-cache
    cp -vf "${scriptbase}/ohio-rpm-package.tar" /var/lib/dosis2/rpm/archives
    cd /var/lib/dosis2/rpm/archives
    tar -xvf ./ohio-rpm-package.tar
    cd "${scriptbase}"
}

function upgrade_system_from_prep() {
    #"${scriptbase}/upgrade-from-prep"
    #retval=$?

    #if [ ${retval} != 0 ]; then
    #    abort ${retval} "failed to upgrade from prep"
    #fi
    if [ "`ls /var/lib/dosis2/rpm/archives/*.rpm`" != "" ]; then
        yum localinstall /var/lib/dosis2/rpm/archives/*.rpm
    fi
}

function save_file() {
    key="$1"
    filename="$2"

    if [ -f "${filename}" ]; then
        cp -vf "${filename}" "${tmpdir}/${key}"
    fi
}

function restore_file() {
    key="$1"
    dest="$2"

    if [ -f "${tmpdir}/${key}" ]; then
        cp -vf "${tmpdir}/${key}" "${dest}/."
    fi
}

function save_important_files() {
    save_file "dosis_pmis_sync.json" "/opt/dosis2/bin/dosis_pmis_sync/dosis_pmis_sync.json"
}

function restore_important_files() {
    restore_file "dosis_pmis_sync.json" "/opt/dosis2/etc/pmissync"
}

function upd_conf_setting() {
    val=`/opt/dosis2/bin/conf-edit "/var/lib/pgsql/9.2/data/postgresql.conf"  --filetype properties  --get .$1`
    if [ -z "${val}" ]; then 
        val="$2"
    else
        val=${val#*=}
    fi

    echo "Adjusting $1=${val}"
    /opt/dosis2/bin/conf-edit "${CONFFILE}" \
        --output "${CONFFILE}" \
        --filetype properties \
        --set .$1="${val}"
}

function setup_postgres_custom() {
    if ! [ -f "${CONFFILE}" ]; then
        touch "${CONFFILE}"
    fi
    
    upd_conf_setting max_connections "100"
    upd_conf_setting shared_buffers "256MB"
    upd_conf_setting work_mem "24MB"
    upd_conf_setting effective_cache_size "512MB"
    upd_conf_setting maintenance_work_mem "32MB"
    upd_conf_setting checkpoint_segments "10"
}

verify_os
patch_yum_conf
#if system_needs_proxy; then
#    system_setup_proxy
#fi
cleanup_pre_migrate
install_requirements
fix_ius_git
stop_all_services
save_important_files
remove_old_packages
#setup_system_repo "${REPOTYPE}"
cleanup_post_package_removal
prep_system_for_upgrade
upgrade_system_from_prep
restore_important_files
setup_postgres_custom

info "System Update Complete!"
answer=`prompt_yes_no "Reboot?"`
if [ "${answer}" = "yes" ]; then
    reboot
else
    warning "User said not to reboot"
fi
