#!/bin/bash

. /etc/rc.d/efw_lib.sh

UPGRADED=/etc/upgrade/upgrade.d
PRE_HOOKS=/etc/upgrade/pre-upgrade.d
LOG="/var/efw/product/openfw-updates.log"
PIDFILE="/var/run/openfw-update.pid"

trap "rm -f $PIDFILE; exit" INT TERM EXIT

loadSettings /var/efw/main/settings

function setupchannels() {
    # Remove e adiciona os canais silenciosamente para não poluir a saída final
    smart channel --remove-all -y > /dev/null 2>&1
    smart channel --add openfw \
        baseurl="https://repo.openfw.com.br" \
        type=rpm-md -y > /dev/null 2>&1
        
    # smart update é necessário para renovar o cache
    # Redirecionamos para /dev/null para o usuário não ver o "Loading cache" inicial no log
    smart update > /dev/null 2>&1
    
    # Agora executamos o newer, que é o que queremos mostrar no modal
    # O filtro 'sed' remove os códigos de cores e as barras de progresso [###]
    smart newer 2>&1 | sed 's/\r//g; s/\[#*\]//g' >> $LOG
}

function start_upgrade() {
    echo "+++ Running pre-upgrade hooks..." >> $LOG
    [ -d "${PRE_HOOKS}" ] && run-parts --report ${PRE_HOOKS} >> $LOG 2>&1

    echo "+++ Starting full system upgrade..." >> $LOG
    # No upgrade mantemos a saída completa para o console preto
    smart upgrade -y >> $LOG 2>&1
    
    if [ $? -eq 0 ]; then
        echo "+++ Running post-upgrade hooks..." >> $LOG
        [ -d "${UPGRADED}" ] && run-parts --report ${UPGRADED} >> $LOG 2>&1
        echo "+++ Upgrade process finished successfully." >> $LOG
    else
        echo "!!! ERROR: System upgrade failed." >> $LOG
    fi
}

echo $$ > $PIDFILE

case "$1" in
    update)
        # Limpa o log antes de começar o check
        > $LOG
        setupchannels
        ;;
    upgrade)
        # No upgrade, garantimos que o canal esteja ok antes, mas sem poluir o log excessivamente
        start_upgrade
        ;;
    *)
        echo "Usage: $0 {update|upgrade}"
        exit 1
        ;;
esac