#! /bin/bash
###############################################################################
# Script creado para descargar los paquetes XML y JSON de los servidores de
# Guillermo y comprobar que están generados correctamente.
#
# Marcos Molina Cano - 16/03/2016
###############################################################################

# Servidor principal de producción.
TIEMPO="tiempo.ogimet.com"
# Servidor secundario de producción.
ISOCERO="isocero.ogimet.com"
# Servidor para implementar pruebas antes de pasar a producción.
AIRE="aire.ogimet.com"

# Recorremos el bucle principal que determinará de qué servidores bajar los datos y comprobarlos.
servidor="${TIEMPO}" # ${AIRE}" # ${ISOCERO}" #${TIEMPO}"
for SERVIDOR in ${servidor} ; do
  # Definición del servidor del que se descargarán los datos.
  SERVER="${SERVIDOR}/imagenes.meteored.com"

  # Archivo php donde poder ver si se han terminado la generación de archivos.
  controlFile="gfs_check.php"

  # Listado de continentes.
  continente="africa amercen amernor amersur antartida asia europa oceania"
#  continente="africa antartida"

  # Tipo de archivos a estudiar.
  tipo="json xml"

  # Comienzo del bucle principal que recorre las tareas pricipales.
  for TIPO in ${tipo} ; do
    # Raíz desde donde se descargarán los datos.
    RAIZ=${SERVER}/${TIPO}

    # Directorio donde se guardarán los paquetes comprimidos de cada tipo.
    BASE_DIR="/media/marcos/SSD/${SERVIDOR}/${TIPO}"
    if test ! -d ${BASE_DIR} ; then
      mkdir --parents ${BASE_DIR}
    fi

    # Cambiamos a directorio de trabajo.
    cd ${BASE_DIR}

    # Borrado de todos los archivos comprimidos en el directorio de trabajo de hace más de dos días.
    for n in 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
      datetmp=`date -u +%Y%m%d --date="${n} days ago"`
      rm -f *${datetmp}*.tar.gz
      rm -f *${datetmp}*.finalizado
    done

    # 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"`
    elif test ${hora} -gt 18 ; then
      fecha=`date -u +%Y%m%d`
      pasada=12
    else
      fecha=`date -u +%Y%m%d`
      pasada=00
    fi

    # Comprobación de que este script ya ha terminado su trabajo anteriormente.
    finishedFile="${TIPO}_download_${fecha}${pasada}.finalizado"
    if test -e ${finishedFile} ; then
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> Pasada ${fecha}_${pasada} --> ${TIPO} finalizada."
      continue
    fi

    # Comprobación de que el script no se está ejecutando ya. En caso de que sí, se acaba.
    # En caso de que no, crea el archivo de bloqueo y empieza.
    lockFile="${TIPO}_download.lock"
    if test -e ${lockFile} ; then
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> ... ${TIPO} ..."
      exit
    fi
    if test ! -e ${lockFile} ; then
      touch ${lockFile}
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> *** Comienzo de tareas para los ${TIPO}. ***"
    else
      fechaCreacionLockFile=`stat -c %Y ${lockFile}`
      haceDosHoras=`date -u +%s --date="2 hours ago"`
      if test ${fechaCreacionLockFile} -lt ${haceDosHoras} ; then
        rm -f ${lockFile}
        touch ${lockFile}
      else
        exit
      fi
    fi

    # Comprobación de que ya están disponibles para descargar los archivos comprimidos estudiando el
    # fichero de control.
    echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> Descarga del fichero de control...."
    wget ${SERVIDOR}/${controlFile}
    if test ${TIPO} = xml ; then
      auxTipo=XML
    else
      auxTipo=JSON
    fi
    cat ${controlFile} | grep "Terminados los  ficheros ${auxTipo}" > aux.tmp ## ¡OJO! Los dos espacios son necesarios.
    if test ! -s aux.tmp ; then
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> ...${TIPO} no disponibles."
      rm ${controlFile} aux.tmp ${lockFile}
      exit
    fi
    echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> ...${TIPO} disponibles."
    rm ${controlFile} aux.tmp

    # Comprobación de que existe el directorio donde descomprimir todos los xml y json.
    ALL_DIR="/media/marcos/SSD/${SERVIDOR}/${TIPO}_all"
    if test ! -d ${ALL_DIR} ; then
      mkdir --parents ${ALL_DIR}
    fi

    # Descarga de los paquetes comprimidos según el tipo.
    for CONTINENTE in ${continente} ; do
      fileName="${TIPO}_${fecha}${pasada}_${CONTINENTE}.tar.gz"
      fileNameTmp=${fileName}.tmp
      if test -s ${fileName} -a ! -e ${fileNameTmp} ; then
        continue
      fi
      if test -e ${fileNameTmp} ; then
        rm -f ${fileName} ${fileNameTmp}
      fi

      touch ${fileNameTmp}
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} --> ${fileName} --> Comienza la descarga..."
      wget ${RAIZ}/${fileName} && \
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} --> ${fileName} --> ...fin." && \
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} --> ${fileName} --> Comienza la descompresión..."
      tar -xzf ${fileName} -C ${ALL_DIR} && rm -f ${fileNameTmp} && \
      echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} --> ${fileName} --> ...fin."

      if test -e ${fileNameTmp} ; then
        rm -f ${fileNameTmp} ${fileName}
      fi
    done

    # Comprobación de que se han terminado todas las descargas, creación del
    # archivo de finalización y borrado del archivo de bloqueo.
    for CONTINENTE in ${continente} ; do
      fileName="${TIPO}_${fecha}${pasada}_${CONTINENTE}.tar.gz"
      fileNameTmp=${fileName}.tmp
      if test ! -e ${fileNameTmp} -a -s ${fileName} ; then
        continue
      else
        rm -f ${lockFile}
        exit
      fi
    done

    rm -f ${lockFile}
    touch ${finishedFile}
    echo "[`date -u +%Y-%m-%d_%H:%M:%S` UTC] - ${SERVIDOR} -> *** Fin de tareas para los ${TIPO}. ***"
  done
done