#!/bin/sh #version=1.0 #Auteur : Élie Gouzien (une recherche sur Internet vous permet de me contacter) #Licence : CeCILL (http://www.cecill.info/licences.fr.html) #Petit script pour récupérer les avis météos sur weather.gmdss.org #et les revoyer sur téléphone iridium via messaging.iridium.com # ou plus exactement un mail à [numero]@msg.iridium.com. #Il y a aussi la possibilité de le recevoir compressé par courrier #électronique avec l'avis compressé en pièce jointe. #Considérez utiliser saildocs (www.saildocs.com) dans ce cas. #Ce script a besoin d'un fichier destinataires.txt dans le répertoire #d'exécution ; la syntaxe suivante est requise (sépateur : tabulation) : #adresse recepteur(mail ou iridium) zone metear Filtre "find" de fichiers date début date fin #Exemple : #elie.gouzien@ens.fr mail 6 *HIGH_SEAS* 2014-11-22 2014-11-30 #Les dates doivent être compréhensibles par le programme date. ##### ATTENTION : S'IL Y A UN NOUVEAU DESTINATAIRE POUR UN FICHIER DEJA #ENVOYE A QUELQU'UN D'AUTRE, IL DEVRA ATTENDRE LA MISE A JOUR DU #BULLETIN AVANT DE RECEVOIR QUOI QUE CE SOIT. #PAS TROP GENANT CAR EN PRINCIPE SCRIPT EXECUTE JUSTE APRES MISE A JOUR #DU SITE METEO ##### Environnement ##### #### Emplacement #### EMPLACEMENT="/users/11/phy/gouzien/Documents/hackEns/meteoiridium/" #### (.local/) #### PATH="$HOME/.local/bin:$PATH" MANPATH="$HOME/.local/share/man:$MANPATH" LD_LIBRARY_PATH="$HOME/.local/lib:$LD_LIBRARY_PATH" #### Exportation #### export PATH MANPATH LD_LIBRARY_PATH EMPLACEMENT ##### FONCTIONS #### #lire [fichier] : envoie sur la sortie standard les lignes du fichier sauf celles de #commentaire. Une ligne de commantaire est une ligne vide ou commançant #par '#', les espaces avant ne comptant pas. S'utilise comme cat mais #permet de mettre des commentaires dans les fichiers annexes. lire () { grep -E -v '^[[:space:]]*(#|$)' "$1" } #romain [nombre] : renvoie nombre écrit en chiffres romains. romain() { local values="1000:M 900:CM 500:D 400:CD 100:C 90:XC\ 50:L 40:XL 10:X 9:IX 5:V 4:IV 1:I" local nvmber="" local num=$1 for value in $values; do local val=$(echo "$value" | cut -f1 -d:) while [ "$num" -ge "$val" ]; do local rval=$(echo "$value" | cut -f2 -d:) nvmber=$nvmber$rval num=$((num - val)) done done echo "$nvmber" } #### DEBUT DU SCRIPT #### #On s'assure qu'on est placé dans le bon répertoire cd "$EMPLACEMENT" #Supression des vielles données si jamais elles survivent encore. rm -rf weather.gmdss.org #Récupération des fichiers des différentes zones demandées par les #destinataires. for ZONE in $(lire destinataires.txt | cut -f3 | sort | uniq); do httrack "http://weather.gmdss.org/$(romain "$ZONE").html" -p2 -r4 -Q -C0 -I0 \ "-*" \ "+http://weather.gmdss.org/*.html" \ $(lire urls_menu.txt) \ "+http://weather.gmdss.org/$(romain "$ZONE").html" \ "+http://weather.gmdss.org/bulletins/METAREA$ZONE.*.txt" \ >> /dev/null 2>> /dev/null done ##Boucle sur les destinataires lire destinataires.txt | while read destinataire; do #Si les dates ne sont pas bonnes, on passe ; dates incluses DATE_DEBUT=$(date -u -d "$(echo "$destinataire" | cut -f5)" +%s) DATE_FIN=$(($(date -u -d "$(echo "$destinataire" | cut -f6)" +%s) + 86400)) if !([ "$DATE_DEBUT" -le "$(date +%s)" ] && [ "$(date +%s)" -le "$DATE_FIN" ]) then continue fi #Fichier dans lequel on va compresser les fichiers du #destinataire si transmission par mail. #on vérifie qu'il n'existe pas pour ne pas envoyer un fichier non #désiré. rm -f "weather.gmdss.org/meteo.zip" #Boucle sur les fichiers MOTIF="*METAREA$(echo "$destinataire" | cut -f3)*$(echo "$destinataire" | cut -f4)*.txt" # Tentative qui fonctionne tant que les noms sont propres mais pas # toujours : # for fichier in $(find weather.gmdss.org -name "$MOTIF"); do # Tentative qui ne fonctionne pas (cherche des fichiers pleins # d'étoiles : # for fichier in "weather.gmdss.org/$MOTIF"; do # Chose qui a l'air de bien fonctionner et de manière robuste : find weather.gmdss.org -name "$MOTIF" | while read fichier; do #Test si le fichier a déjà été envoyé (déjà vu ?) #ça n'est pas parfait, voir commentaire à la fin. if [ -e "ancien/bulletins/$(basename "$fichier")" ] then continue fi #Traitement des différents cas d'envoie case $(echo "$destinataire" | cut -f2) in iridium) #Cas iridium (on découpe) if ! [ -d "$fichier.d" ]; then mkdir "$fichier.d" cd "$fichier.d" iconv -f ISO_8859-1 -t ASCII -c "../$(basename "$fichier")" | tr -d '\r' | split -b 137 "-" "" else cd "$fichier.d" fi #dernier_bout=$(ls | tail --lines 1) for bout in *; do echo "$bout" | cat "-" "$bout" | mutt "$(echo "$destinataire" | cut -f1)" -s "météo" #On attend pour laisser le temps #au réseau iridium de transmettre le message avant d'envoyer le suivant #(un message est soit reçu imédiatement, soit reçu à un moment aléatoire, #soit perdu ; il vaut mieux laisser passer du temps car quand tout est #prêt, ça va vite) sleep 61s done cd ../../../ ;; mail) #Cas mail (on compresse) zip -9 "weather.gmdss.org/meteo.zip" "$fichier" ;; *) #Cas entrée non valide echo "Erreur, $(echo "$destinataire" | cut -f2)\ n'est pas une cible valable, relisez destinataires.txt !" ;; esac done #Envoie dans le cas mail if [ "$(echo "$destinataire" | cut -f2)" = "mail" ] && test -s "weather.gmdss.org/meteo.zip" then mutt "$(echo "$destinataire" | cut -f1)" -s "météo" -a "weather.gmdss.org/meteo.zip" < /dev/null fi done #Sauvegarde des fichiers pour ne pas les renvoyer mv -f weather.gmdss.org ancien 2>> /dev/null #### FIN DU SCRIPT, A TESTER UN PEU PLUS ENCORE #####