Élie Gouzien

Élie Gouzien

#!/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  #####