#!/bin/sh
#
# Script para cron, para mover a directorio de backup (y con nombre de backup) 
# archivos de programas que sean mas viejos que X dias (segun archivo config programas).
# Ademas repone archivos de programa aleatoriamente, manteniendolos 7 dias, y chequea que
# no se guarden duplicados de ellos.
# Busca tb. cuñas con nombre del tipo DD-MM-AA o DD-MM y si coincide con dia actual, las
# mueve a dir de backup de cuñas.
#
# Se pueden excluir programas de reposicion (ejemp: agenda conciertos) indicandolo en:
#  /home/garraxi/.programas-radio/config-programas.txt
#
# Necesita el paquete 'randomize-lines' (comando rl) y los comandos standar find,
# grep y cron. A ejecutar diariamente por cron (poner en /etc/cron.daily).
#
#Este script está licenciado bajo la [1] GNU General Public License (GPL) y por tanto
# se permite su copia, distribución y/o modificación mientras se mantenga su licencia y
# se cite que está realizado por [2] Garraxi Irratia. Contacto: [3] Martintxo
#
#[1] http://www.gnu.org/copyleft/gpl.html
#[2] http://sindominio.net/garraxi/
#[3] martintxo@sindominio.net

#Variables utiles (paths y tal, para pruebas sobre todo):
#DIRPROGRAMAS=/home/martintxo/pruebas
DIRPROGRAMAS=/home/garraxi/Biltegi/Programas
#LOG=/home/martintxo/pruebas/mantenprogramas.log
LOG=/var/log/mantenprogramas.log
#CONFIGPROG=./config-programas3.txt
CONFIGPROG=/home/garraxi/.programas-radio/config-programas.txt
#Los archivos/directorios de programas backupeados son propiedad de garraxi2
#USERBAK=martintxo
USERBAK=garraxi2
#Los archivos/directorios en dirs Programas/Emision son propiedad de garraxi
#USERPROG=martintxo
USERPROG=garraxi
#DIRKUNYAS=/home/martintxo/pruebas
DIRKUNYAS=/home/garraxi/Biltegi/Kunyas/kunyas/
#DIRBACKKUNYAS=/home/martintxo/pruebas/back
DIRBACKKUNYAS=/home/garraxi/Biltegi/Kunyas/BesteGauzak/kunyas_emitidas

#Guardo todo lo que hace el script en un archivo de log con fecha de inicio y final:
touch "$LOG"
echo "--------  `date +%d/%m/%Y-%k:%M:%S`  --------" >> "$LOG"

#Lo de (-printf "%p$IFS") pillado de Advanced Bash-Scripting Guide: Chapter 10. Loops and Branches,
# para parsear correctamente los espacios en los nombres de archivo:
#$IFS (Input Field Separators) indica el separador utilizado, y el estandar en bash es un espacio, lo cambiamos
OLDIFS=$IFS
IFS=æ
#Busca archivos .ogg y .mp3 en subdirs del dir ...Programas/Emision/:
for i in $( find "$DIRPROGRAMAS/Emision" -type f \( -iname '*.ogg' -o -iname '*.mp3' \) -printf "%p$IFS")
do

 #SOLUCIONAR BUG soma-run que no emite el jingle definido en el palinsesto (quitar cuando bug solucionado). 
 #ver: http://lists.autistici.org/message/20080214.182240.5780d64c.en.html
 #Si archivo encontrado = 000000jingle.[mp3|ogg] => se salta el bucle (ese sera el nombre del jingle, en todos los casos):
 if [ "`basename "$i" | grep -i '000000jingle'`" ];then 
  continue  #se salta este loop for y comienza otro
 fi
 #FIN SOLUCIONAR BUG JINGLE
  
  #Variable con el nombre del programa encontrado (lo saca del dir donde esta el archivo):
  # (si cambiamos el path al archivo de programas en emision, cambiar esto)
  BASENAME=`dirname "$i" | cut -d '/' -s -f '7'`

  #Ver si el programa esta en el archivo de config de programas:
  PROGENCONFIG=`grep -v "^#" "$CONFIGPROG" | grep -i -A 5 "$BASENAME" -`
  if [ "$PROGENCONFIG" = "" ];then
    echo "NO mantener "$BASENAME" -> no esta en archivo config. programas." >> "$LOG"
    continue 
  fi

  #Ver si hay que mantener el programa segun config:
  MANTENER=`echo "$PROGENCONFIG" | grep -i "Mantener?:" - | cut -s -d " " -f 2`
  if [ "$MANTENER" = "no" ];then
    echo "NO mantener "$BASENAME" -> en archivo config. programas "Mantener?=no"." >> "$LOG"
    continue  
  fi
  
  #Ver cuantos dias hay que mantener el programa segun config:
  DIASMANTENER=`echo "$PROGENCONFIG" | grep -i "DiasMantener:" - | cut -s -d " " -f 2`
  if [ "$DIASMANTENER" = "" ];then
    echo "NO mantener "$BASENAME" -> en archivo config. programas "DiasMantener=nada"." >> "$LOG"
    continue  
  fi
  
  #Comprueba para cada archivo cuantos dias viejo es (en mtime, ver discusion fechas en info-software-garraxi3.txt):
  ((DIASVIEJO=\(`date +"%s"` - `stat -c %Y "$i"`\) / 86400))
  #Si dias_viejo < DiasMantener => no se realiza la rutina mantenimiento-reposicion para este archivo:
  if [ "$DIASVIEJO" -lt "$DIASMANTENER" ];then
    continue  
  fi  
    
  #Determina la extension del archivo antiguo encontrado:
  if basename "$i" | grep -i '.ogg' > /dev/null ;then
     EXT=ogg
  elif basename "$i" | grep -i '.mp3' > /dev/null ;then
     EXT=mp3
  else
     echo "Error desconocido al parsear archivo "$i"" >> "$LOG"
     continue
  fi 
   
  #Ver si existe el dir de backup, si no existe evitamos errores:
  if  test -d "$DIRPROGRAMAS/Backup/$BASENAME";then
   EXISTEDIRBACK=1
   #Comprueba si el programa antiguo era un hard-link (estaba duplicado),
   # si no hardlink =1, si si =2 o mas (cuenta los enlaces).
   DUPLICS=`stat -c %h "$i"`
  else
   EXISTEDIRBACK=0
   DUPLICS="1"
  fi
    
  #Si el ogg/mp3 NO esta duplicado lo backupea:
  if [ "$DUPLICS" = "1" ];then
    BACKUPNAME=$BASENAME-`stat -c %x "$i" | cut --delimiter=" " -f 1 -s`-`stat -c %x "$i" | cut --delimiter=" " -f 2 -s | cut -c '-8'`
     
    #Comprueba si hay algun archivo con ese nombre en el dir de backup, y sisi le añade un "+" hasta que deje de haber:
    while [[ -f "$DIRPROGRAMAS/Backup/$BASENAME/$BACKUPNAME.$EXT" ]];do 
     BACKUPNAME=${BACKUPNAME}+
    done
    
    install -o "$USERBAK" -g "$USERBAK" -m 1777 -d "$DIRPROGRAMAS/Backup/$BASENAME" \
    && install -p -o "$USERBAK" -g "$USERBAK" -m 664 "$i" "$DIRPROGRAMAS/Backup/$BASENAME/$BACKUPNAME.$EXT" \
    && echo "Backupeado: `basename "$i"` como .../Backup/$BASENAME/$BACKUPNAME.$EXT." >> "$LOG" \
    && rm "$i"
  else
    #Si el ogg/mp3 esta duplicado lo borra:
    rm "$i" && echo "Borrado: "$i", (duplicado)." >> "$LOG"
  fi
      
  #Rutina reposicion o no de archivos de programa:
  
  #Comprueba que no se haya repuesto ya otro programa en el mismo dir,
  # necesario para cuando hay mas de un archivo en el dir de emision, para evitar que se reponga mas de uno
  # (utiliza el hecho de que find no salta a otro dir hasta que no ha acabado de buscar en el actual)
  if [ "$SEGURONOREPONER" != "$BASENAME" ];then
    #Ver si el archivo de programa debe reponerse:
    SEREPONE=`echo "$PROGENCONFIG" | grep -i "Reponer?:" - | cut -s -d " " -f 2`
    if [ "$SEREPONE" != "no" ];then
      #Ver si existe el dir de backup, si no existe evitamos errores:
      if [ "$EXISTEDIRBACK" -eq 1 ];then
        #Variable con cantidad de archivos de programas en dir de backup:
        NUMLSBACKUP=`find "$DIRPROGRAMAS/Backup/$BASENAME" -maxdepth 1 -type f | wc -l`
        #Si cantidad de archivos de programas en dir de backup >= 3:
        if [ "$NUMLSBACKUP" -ge 3 ];then
          #Variable con un nombre de archivo de programa aleatorio para reponer:
          RANDOMIZE=`find "$DIRPROGRAMAS/Backup/$BASENAME" -maxdepth 1 -type f | rl -c 1`
          #Quita el path al nombre del archivo a reponer
          RANDOMIZE2=`basename "$RANDOMIZE"`
           #Repone (con enlace duro) archivo aleatorio en subdir adecuado de /Programas/Emision/ con fecha 
           # adecuada para que solo este en Emision una semana = $DIASMANTENER-7.
           # Pone owner garraxi para que funcione el script de grabar (los programas viejos se guardan como garraxi2).
           ((DIASMANTENER2="$DIASMANTENER"-7))
           ln "$RANDOMIZE" "$DIRPROGRAMAS/Emision/$BASENAME/$RANDOMIZE2" \
               && chown "$USERPROG":"$USERPROG" "$DIRPROGRAMAS/Emision/$BASENAME/$RANDOMIZE2" \
               && touch -m -d "$DIASMANTENER2 day ago" "$DIRPROGRAMAS/Emision/$BASENAME/$RANDOMIZE2" \
               && SEGURONOREPONER="$BASENAME" \
               && echo "Reponiendo: `basename "$RANDOMIZE"` en .../Programas/Emision/"$BASENAME"/." >> "$LOG" 
    
        else
          echo "NO repon.: "$BASENAME" en .../Programas/Emision/"$BASENAME" -> solo hay "$NUMLSBACKUP" programa(s) guardado(s)." >> "$LOG"
        fi
      else
        echo "NO repon.: "$BASENAME" en .../Programas/Emision/"$BASENAME" -> es el 1º programa grabado." >> "$LOG"
      fi
    else
      echo "NO repon.: "$BASENAME" en .../Programas/Emision/"$BASENAME" -> está exluido de reposicion." >> "$LOG"
    fi
  fi
 
done

#Busca archivos con nombre que incluya fecha actual (formato DD-MM o DD-MM-AA) en dir de cuñas:
for i in $( find "$DIRKUNYAS" -type f \( -iregex ".*`date +%d-%m`.*" -o -iregex ".*`date +%d-%m-%y`.*" \) -printf "%p$IFS")
do

#Mueve archivos encontrados al dir de backup de cuñas
# cuñas backupeadas con propietario garraxi para que puedan ser borradas las que sobran facilm.
 install -o "$USERBAK" -g "$USERBAK" -m 1777 -d "$DIRBACKKUNYAS" \
 && install -p -o "$USERPROG" -g "$USERPROG" -m 664 "$i" "$DIRBACKKUNYAS" \
 && echo "Backupeada cuña: `basename "$i"` en $DIRBACKKUNYAS" >> "$LOG" \
 && rm "$i"

done

#Por si acaso, reponemos el separador estandar de bash:
IFS=$OLDIFS

#Guardo todo lo que hace el script en un archivo de log con fecha de inicio y final:
echo "--------  `date +%d/%m/%Y-%k:%M:%S`  --------" >> "$LOG"
echo " " >> "$LOG"

exit 0
