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