#!/bin/bash
###############################################################################
# Script creado para descomprimir los XML y JSON descargados de los servidores de
# Guillermo y comprobar uno por uno que están correctos.
#
# Marcos Molina Cano - 29/03/2016
###############################################################################

# Listado de continentes que poseen XML y JSON.
continente="africa amercen amernor amersur antartida asia europa oceania"
#continente="africa antartida"

# Listado del número total de XML o JSON a estudiar por continente.
declare -A total=([africa]=5287 [amercen]=4875 [amernor]=203864 [amersur]=26356 [antartida]=2 [asia]=21683 [europa]=189624 [oceania]=10886)
#echo ${total[africa]}


# Cálculo de la fecha y de la pasada a estudiar.
hora=`date -u +%H`
if test ${hora} -lt 7 ; then
  pasada=12
  fecha=`date -u +%Y%m%d --date="yesterday"`
  fechaConfiguracionFile=`date -u +%Y-%m-%d --date="yesterday"`
elif test ${hora} -gt 18 ; then
  fecha=`date -u +%Y%m%d`
  fechaConfiguracionFile=`date -u +%Y-%m-%d`
  pasada=12
else
  fechaConfiguracionFile=`date -u +%Y-%m-%d`
  fecha=`date -u +%Y%m%d`
  pasada=00
fi

echo " "
# Recorro los directorios de los servidores para su estudio.
servidor="tiempo.ogimet.com" # aire.ogimet.com" # isocero.ogimet.com"
for SERVIDOR in ${servidor} ; do

  # Tipos de archivos a estudiar.
  tipo="json xml"
  for TIPO in ${tipo} ; do

    # Directorio donde se están los paquetes comprimidos.
    BASE_DIR="/media/marcos/SSD/${SERVIDOR}/${TIPO}"

    # Cambio al directorio de trabajo.
    cd ${BASE_DIR}

    # Comprobación de que existe o no el archivo de terminación supremo por tipo y servidor.
#    finishedFileSupreme=${BASE_DIR}/${TIPO}_comprobador.finished
#    if test -e ${finishedFileSupreme} ; then
#      exit
#    fi

    # Comprobación de que existe o no el archivo de bloqueo supremo por tipo y servidor.
#    lockFileSupreme=${BASE_DIR}/${TIPO}_comprobador.lock
#    if test -e ${lockFileSupreme} ; then
#      exit
#    else
#      touch ${lockFileSupreme}
#    fi

    # Creación de los directorios necesarios para cada continente.
    for CONTINENTE in ${continente} ; do
      if test ! -d ${BASE_DIR}/${CONTINENTE} ; then
        mkdir ${BASE_DIR}/${CONTINENTE}
      fi
      if test ! -d ${BASE_DIR}/${CONTINENTE}/mapas ; then
        mkdir ${BASE_DIR}/${CONTINENTE}/mapas
      fi
      if test ! -d ${BASE_DIR}/${CONTINENTE}/localidades ; then
        mkdir ${BASE_DIR}/${CONTINENTE}/localidades
      fi
    done

    # Descompresión de cada paquete para su estudio, previa comprobación de que se
    # ha descargado correctamente.
    contadorLock=0
    for CONTINENTE in ${continente} ; do
      cd ${BASE_DIR}
      fileName="${TIPO}_${fecha}${pasada}_${CONTINENTE}.tar.gz"
      fileNameTmp="${fileName}.tmp"
      finishedFile="${BASE_DIR}/${CONTINENTE}_${fecha}${pasada}.finalizado"
      lockFile="${BASE_DIR}/${CONTINENTE}.lock"

      # Comprobación por si el archivo comprimido no se ha descargado correctamente o aún se está descargando.
      if test -e ${fileNameTmp} ; then
        echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Aún se está descargando ${fileName}. Siguiente..."
        exit
      fi

      # Comprobación de que las tareas con estos ficheros no se han realizado antes.
      if test -e ${finishedFile} ; then
        echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Tareas ya acabadas."
        continue
      fi

      # Comprobación de que las tareas con estos ficheros no están ya en proceso ni llevan paradas más de
      # dos horas.
      if test -e ${lockFile} ; then
        let contadorLock=${contadorLock}+1
        fechaCreacionLockFile=`stat -c %Y ${lockFile}`
        haceDosHoras=`date -u +%s --date="2 hours ago"`
        if test ${fechaCreacionLockFile} -lt ${haceDosHoras} ; then
          rm -f ${lockFile}
          echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Fichero de bloqueo muy antiguo. Borrándolo y saliendo..."
          exit
        else
#          exit
          echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Un proceso ya está con esto..."
          continue
        fi
      fi

      # Comprobamos cuántos *.lock existen para saber si lanzamos más
      # procesos o no.
      lockFileMax=2
      if test ${contadorLock} -ge ${lockFileMax} ; then
        echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> Esperamos a que termine algún proceso. Saliendo..."
        exit
      fi

      # Comprobación de que se ha descargado el fichero comprimido.
      if test ! -s ${fileName} ; then
        echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> ${fileName} aún no disponible. Siguiente..."
        continue
      fi

      # Comienzo de las tareas, por lo que se crea el fichero de bloqueo.
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Creación de archivo de bloqueo."
      touch ${lockFile}

      # Descompresión de los xml y json en el directorio apropiado para su uso en la web local tiempo.
      ALL_DIR="/media/marcos/SSD/${SERVIDOR}/${TIPO}_all"
      if test ! -d ${ALL_DIR} ; then
        mkdir --parents ${ALL_DIR}
      fi

      # Descompresión de los archivos comprimidos en su directorio por continente para su estudio.
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Comienzo descompresión..."
      tar -xzf ${fileName} -C ${CONTINENTE}/localidades/
      rm ${CONTINENTE}/localidades/*_*.${TIPO}
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> ...Fin"

      # Recorrido de los ficheros de localidades descomprimidos para su comprobación.
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Comienzo del parseamiento..."
      cd ${BASE_DIR}/${CONTINENTE}/localidades
      contador="0"
      rm ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_${CONTINENTE}.log
      for i in *.${TIPO}; do
        let contador=${contador}+1
        echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${i} ( ${contador} de ${total[${CONTINENTE}]} )" >> ${lockFile}
        if test ${TIPO} = "xml" ; then
          php /home/marcos/wrf_model/varios/xml_parser.php ${fecha} ${pasada} ${i} >> ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_${CONTINENTE}.log
        else
          php /home/marcos/wrf_model/varios/json_parser.php ${fecha} ${pasada} ${i} >> ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_${CONTINENTE}.log
#          touch ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_${CONTINENTE}.log
#          /home/marcos/wrf_model/utils/JSON_checker/JSON_checker <${i} 2>> aux.tmp
#          if test -s aux.tmp ; then
#            echo "${i}" >> ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_${CONTINENTE}.log
#          fi
#          rm aux.tmp
        fi
      done
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> ...fin."

      # Limpieza de los directorios. Lo más rápido es, al ser tal cantidad de archivos en algunos continentes,
      # borrar directamente el directorio y volver a crearlo.
      rm -r ${BASE_DIR}/${CONTINENTE}/localidades/
      mkdir ${BASE_DIR}/${CONTINENTE}/localidades/
      rm -r ${BASE_DIR}/${CONTINENTE}/mapas/
      mkdir ${BASE_DIR}/${CONTINENTE}/mapas/

      # Borrado de archivos .log de más de una semana.
      cd ${BASE_DIR}
      haceUnaSemana=`date -u +%s --date="7 days ago"`
      for i in *${CONTINENTE}.log; do
        fechaCreacionFichero=`stat -c %Y ${i}`
        if test ${fechaCreacionFichero} -lt ${haceUnaSemana} ; then
          rm ${i}
        fi
       done

      # Borrado de archivo de bloqueo y creación de archivo de finalización.
      mv ${lockFile} ${finishedFile}
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> ${CONTINENTE} --> Fin de tareas."
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] -              ****"

    done
    echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${TIPO} --> Tareas acabadas."
#    touch ${finishedFileSupreme}

    if test "${TIPO}" = "xml" ; then
      if test -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_africa.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_amercen.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_amernor.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_amersur.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_antartida.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_asia.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_europa.log \
        -a -e ${BASE_DIR}/${TIPO}_parser_${fecha}_${pasada}_oceania.log ; then
        echo "{\"fecha\":\"${fechaConfiguracionFile}\",\"salida\":\"${pasada}\"}" > ${BASE_DIR}/configuracion.json
      fi
    fi
  done
done