#!/bin/bash ############################################################################### # Script creado para descargar los paquetes XML y JSON del GCS del ECMWF # y descomprimirlos. # # Marcos Molina Cano - 19/06/2017 ############################################################################### # Nombre del script. scriptName=ecmwf_xml-json_downloader function datePID { echo -n "$(date -u +%Y/%m/%d) " echo -n "$(date -u +%H:%M:%S) UTC " echo "[$$]" } function showUse { echo echo "${scriptName} " echo echo " " echo echo " ECMWF_1 - Descarga de Antártida." echo " ECMWF_2 - Descarga de Ártico." echo " ECMWF_1_2 - Descarga de Antártida y después de Ártico." echo " ECMWF_1_2 - Descarga de Ártico y después de Antártida." echo } # Control de los argumentos de entrada. if [ $# = 1 ] ; then if [ "${1}" = "ECMWF_1" ] ; then servidor="antartida.ogimet.com" elif [ "${1}" = "ECMWF_2" ] ; then servidor="artico.ogimet.com" elif [ "${1}" = "ECMWF_1_2" ] ; then servidor="antartida.ogimet.com artico.ogimet.com" elif [ "${1}" = "ECMWF_2_1" ] ; then servidor="artico.ogimet.com antartida.ogimet.com" else showUse exit fi else showUse exit fi # Cálculo de la fecha y de la pasada a estudiar. if [ "$(date -u +%H)" -lt 7 ]; then pasada=12 fecha=$(date -u +%Y%m%d --date="yesterday") fechaConfiguracionFile=$(date -u +%Y-%m-%d --date="yesterday") elif [ "$(date -u +%H)" -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 # Control de argumentos que machacarían las definiciones anteriores # de fecha y pasada. # if test ${#} -eq 1 ; then # pasada=${1} # fecha=$(date -u +%Y%m%d) # elif test ${#} -eq 2 ; then # fecha=${1} # pasada=${2} # fi # Recorremos el bucle principal que determinará de qué servidores bajar los datos y comprobarlos. for SERVIDOR in ${servidor} ; do # Definición del servidor del que se descargarán los datos. SERVER="${SERVIDOR}/imagenes.meteored.com" # Listado de continentes. continente="africa amercen amernor amersur antartida asia europa oceania" # continente="antartida africa amersur" # Tipo de archivos a estudiar. tipo="xml json" # 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}/ecmwf_${TIPO} # Directorio donde se guardarán los paquetes comprimidos de cada tipo. BASE_DIR=/data/${SERVIDOR}/${TIPO} lock=${BASE_DIR}/${scriptName}_${fecha}${pasada}.lock fin=${BASE_DIR}/${scriptName}_${fecha}${pasada}.fin # Limpieza de ficheros antiguos. find "${BASE_DIR}" -type f -mtime +2 -delete || \ { echo "$(datePID) ${SERVIDOR} -> find ha devuelto un error." && exit 1 ; } # Comprobación de que este script ya ha terminado su trabajo anteriormente. if test -e ${fin} ; then echo "$(datePID) ${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. if test -e ${lock} ; then fechaCreacionLockFile=`stat -c %Y ${lock}` haceDosHoras=`date -u +%s --date="2 hours ago"` if test ${fechaCreacionLockFile} -lt ${haceDosHoras} ; then rm -f ${lock} touch ${lock} else echo "$(datePID) ${SERVIDOR} -> ... ${TIPO} ..." exit fi else touch ${lock} echo "$(datePID) ${SERVIDOR} -> *** Comienzo de tareas para los ${TIPO}. ***" fi # Comprobación de que ya están disponibles para descargar los archivos comprimidos estudiando el # fichero de control. echo "$(datePID) ${SERVIDOR} -> Descarga del fichero de control...." controlFile=${SERVER}/ecmwf_${TIPO}/${TIPO}_${fecha}${pasada}_antartida.tar.gz mkdir -p ${BASE_DIR} cd ${BASE_DIR} || exit curl -s ${controlFile} -o ${BASE_DIR}/testigo_${fecha}${pasada} if test "$?" = 0 ; then echo "$(datePID) ${SERVIDOR} -> ...${TIPO} disponibles." rm -f ${BASE_DIR}/testigo_${fecha}${pasada} else echo "$(datePID) ${SERVIDOR} -> ...${TIPO} no disponibles." rm -f ${lock} exit fi # Comprobación de que existe el directorio donde descomprimir todos los xml y json. ALL_DIR="/data/${SERVIDOR}/${TIPO}_all" if test ! -d ${ALL_DIR} ; then mkdir -p ${ALL_DIR} fi # Descarga de los paquetes comprimidos según el tipo. for CONTINENTE in ${continente} ; do # Comprobación de que existe el directorio donde se guardan los xml/json. if test ! -d ${BASE_DIR}/${CONTINENTE} ; then mkdir -p ${BASE_DIR}/${CONTINENTE} fi targz=${TIPO}_${fecha}${pasada}_${CONTINENTE}.tar.gz targzTmp=${targz}.tmp if test -e ${BASE_DIR}/${targz} -a ! -e ${BASE_DIR}/${targzTmp} ; then continue else rm -f ${BASE_DIR}/${targz} ${BASE_DIR}/${targzTmp} fi echo "$(datePID) ${SERVIDOR} --> ${targz} --> Comienza la descarga y descompresión..." touch ${BASE_DIR}/${targzTmp} && \ curl -s ${RAIZ}/${targz} | tar -C ${BASE_DIR}/${CONTINENTE}/ -xzf - && \ echo "$(datePID) ${SERVIDOR} --> ${targz} --> Creando enlaces simbólicos..." && \ for i in ${BASE_DIR}/${CONTINENTE}/*.${TIPO} ; do ln -sf ${i} ${ALL_DIR}/ done && \ mv ${BASE_DIR}/${targzTmp} ${BASE_DIR}/${targz} && \ echo "$(datePID) ${SERVIDOR} --> ${targz} --> ...fin." # Si llega aquí y existe el fichero temporal entonces algo ha fallado. if test -e ${BASE_DIR}/${targzTmp} ; then rm -f "${BASE_DIR}/${targzTmp} ${BASE_DIR}/${targz}" continue 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 targz="${TIPO}_${fecha}${pasada}_${CONTINENTE}.tar.gz" targzTmp=${targz}.tmp if test ! -e ${BASE_DIR}/${targzTmp} -a -e ${BASE_DIR}/${targz} ; then continue else rm -f ${BASE_DIR}/${targzTmp} ${BASE_DIR}/${targz} ${lock} exit fi done # Creamos fichero de configuración para que puedan usarlo los compañeros. if test "${TIPO}" = "xml" ; then echo "{\"fecha\":\"${fechaConfiguracionFile}\",\"salida\":\"${pasada}\"}" > ${BASE_DIR}/configuracion.json fi # Convertimos fichero tst en lock. mv ${lock} ${fin} echo "$(datePID) ${SERVIDOR} -> *** Fin de tareas para los ${TIPO}. ***" done done