#!/bin/bash
#/**
#@file     poweroffconf
#@brief    Control de parada tras tiempo de inactividad para ahorro de energía.
#@license  GNU GPLv3+
#@param    int_minutos    Minutos de inactividad (opcional); "no" para deshabilitar..
#@note     La comprobación periódica debe ejecutarse en el "cron" del sistema.
#@note     Fichero de configuración: /etc/poweroff.conf
#@author   Ramón Gómez - Univ. Sevilla
#@date     2011-10-25
#@version  1.0.5: incluir opción para deshabilitar ahorro de energía.
#@author   Ramón Gómez - Univ. Sevilla
#@date     2014-02-07
#@version  1.1.1: Corregir problema al cambiar de día
#@author   Ramón Gómez - Univ. Sevilla
#@date     2018-07-04
#*/


# Variables generales.
OPENGNSYS=${OPENGNSYS:-/opt/opengnsys}	# Instalación de OpenGnsys
OGETC=${OGETC:-$OPENGNSYS/etc}		# Configuración de OpenGnsys
POWEROFFCONF=/etc/poweroff.conf		# Configuración del script

# Error si no existe el fichero de configuración de ahorro de energía. 
if [ ! -f $POWEROFFCONF ]; then
    ogRaiseError $OG_ERR_NOTFOUND "$POWEROFFCONF"
    exit $?
fi
# Obtener parámetros de configuración de ahorro de energía.
source $POWEROFFCONF
export TZ

case $# in
    0)  # Sin parámetros, comprobar que existe la variable POWEROFFSLEEP.
        if [ -z "$POWEROFFSLEEP" ]; then
             ogRaiseError $OG_ERR_FORMAT "Sin tiempo de espera."
             exit $?
        fi
        ;;
    1)  # Nuevo timepo de espera.
        POWEROFFSLEEP="$1"
        # Se deshabilita si se introduce la cadena "no" como tiempo de espera.
        [ "$POWEROFFSLEEP" == "no" ] && POWEROFFSLEEP=
        # Error si tiempo de espera no es nulo o entero positivo.
        if [[ ! "$POWEROFFSLEEP" =~ ^[0-9]*$ ]]; then
            ogRaiseError $OG_ERR_FORMAT "Parámetro debe ser núm. minutos o \"no\" para deshabilitar."
            exit $?
        fi
        # Actualizar fichero de configuración con nuevo periodo de parada.
        perl -pi -e "s/POWEROFFSLEEP=.*/POWEROFFSLEEP=$POWEROFFSLEEP/" $POWEROFFCONF
        # Si se necesita, recalcular tiempo de parada.
        if [ -n "POWEROFFTIME" ]; then
            # Asignar tiempo de apagado si no está deshabilitado y actualizar fichero.
            POWEROFFTIME=${POWEROFFSLEEP:+$(date --date="$POWEROFFSLEEP min" +"%s")}
            perl -pi -e "s/POWEROFFTIME=.*/POWEROFFTIME=$POWEROFFTIME/" $POWEROFFCONF
        fi
        exit 0 ;;
    *)  # Error de formato de ejecución.
        ogRaiseError $OG_ERR_FORMAT "Formato: $0 [int_minutos | no]"
        exit $? ;;
esac
# Comprobar si hay algún script en ejecución (verificando compatibilidad de "pgrep").
[ -n "$(pgrep -fa 2>&1 | grep "invalid")" ] && PGREP="pgrep -fl" || PGREP="pgrep -fa"
if [ -n "$($PGREP $OPENGNSYS | egrep -v "$OGETC|$0")" ]; then
    # Eliminar tiempo de inicio de espera, si se está ejecutando operación.
    perl -pi -e 's/POWEROFFTIME=.*$/POWEROFFTIME=/' $POWEROFFCONF
else
    # Si el sistema está en estado de espera, ...
    NOW=$(date +"%s")
    if [ -z "$POWEROFFTIME" ]; then
        # Asignar tiempo de inicio, si no estaba definido.
        POWEROFFTIME=$(date --date="$POWEROFFSLEEP min" +"%s")
        perl -pi -e "s/POWEROFFTIME=.*$/POWEROFFTIME=$POWEROFFTIME/" $POWEROFFCONF
    else
        # Apagar el equipo si se sobrepasa el periodo de espera.
        if [ $NOW -ge $POWEROFFTIME ]; then
            $OPENGNSYS/scripts/poweroff
        fi
    fi
fi

