#/bin/bash # --- GME --- # Envois full automatisés de mails dits bizarres vers un serveur kaz, # dans le but de tester bon fonctionnement du dépollueur # # On enregistre en .eml dans le dossier mails, des messages "mal construits" pouvant causer pb au dépollueur. # Les mails ont les champs suivants à l'interieur: %DATE% %FROM_ADDRESS% %TO_ADDRESS% # Le fichier expectedResults permet de définir des regexp qu'on doit vérifier sur le mail reçu. # # Le script les envoie un par un via l'utilitaire swaks # - interne -> interne # - interne -> externe # - externe -> interne # # Un petit warning, ce script fait du mailing moche (on balance un paquet de mails volontairement mal construits). # Vous savez ce que vous faites ! Et si vous ne savez pas, ne le faites pas. # En particulier si on utilise des mails qui sortent et entrent ... (blacklistings / etc ...) # On préfèrera faire les tests sur un environnement de dev bien sûr ! TEST_DIR=$(cd "$(dirname $0)"; pwd) . $TEST_DIR/mails/expectedResults.sh NBMAILS=$(ls $TEST_DIR/mails/*.eml | wc -l) # random key KEY="TESTDEP-$(echo $RANDOM | md5sum | head -c 20;)" # ou qu'il est le depollueur ? SERVEUR_TO_TEST= SERVEUR_IS_LOCALHOST=0 # s'il est pas en local, il faut bien pouvoir s'identifier USERFROM= USERTO= PASSWORD= # un mail externe pour tester entrant / sortant EXTERNAL_EMAIL= EXTERNAL_SMTP= EXTERNAL_USER= EXTERNAL_PASSWORD= EXTERNAL_SMTP_AUTH=1 EXTERNAL_TESTS_ENABLED=1 EXTERNAL_SMTP_ENABLED=1 EXTERNAL_ONLY=0 #un peu de debug VERBOSE=0 #ou si on préfère ne rien savoir QUIET=0 #swaks est installé ? SWAKS_OK=$(dpkg-query -W --showformat='${Status}\n' swaks 2>/dev/null | grep "install ok installed") # les résultats SKIP_RESULTS=0 KEEP_MAILS_ON_SERVEURS=0 #mutt est installé ? MUTT_OK=$(dpkg-query -W --showformat='${Status}\n' mutt 2>/dev/null | grep "install ok installed") usage () { echo "${PRG} [-h] -s -a [-l] [-p ] [-v|-q] [-eq] [-ea] [-em ] [-es ] [-eu ] [-ep ]" echo " Tests full-automatisés du dépollueur." echo " On envoie une série de mails et on vérifie que le lien généré est bon." echo " -h | --help : Display this help." echo " -s | --server : Quel serveur je teste ? (fqnd)" echo " -l | --localhost : si le script est execute depuis le serveur test" echo " -f | --from : Un compte à utiliser sur ce serveur en tant qu'expediteur" echo " -t | --to : Un compte à utiliser sur ce serveur en tant que destinataire (optionnel, l expediteur est utilise sinon)" echo " -p | --password : Le mot de passe de l'expéditeur si le script est executé à distance" echo " -ed | --ext-disabled : Ne pas faire de tests externes" echo " -eo | --ext-only : Ne faire que les tests externes" echo " -em | --ext-mail : Un mail externe pour des tests vers / depuis l'exterieur" echo " -es | --ext-server : Quel serveur je teste ?" echo " -eu | --ext-user : Un identifiant pour smtp ext si différents de mail" echo " -ep | --ext-password : Le mot de passe associé pour le ext-user ou mail" echo " -ena | --ext-no-auth : Le smtp externe n'a pas besoin d'authentifications (FAI par exemple)" echo " -rd | --results-disabled : Ne pas tenter d'aller chercher les résultats" echo " -ksm | --keep-sended-mails : Laisser les messages envoyés sur les serveurs de destination" echo " -v or -V display more informations" echo " -q or -Q Quiet mode" echo "Un petit warning, ce script fait du mailing moche (on balance un paquet de mails volontairement mal construits). " echo "Vous savez ce que vous faites ! Et si vous ne savez pas, ne le faites pas." } cleanupPackage () { # on vire swaks si on l'a installé # eventuellement on le fait même silently package=$1; quietMode=$2; [ -z $quietMode ] && quietMode=0; [ $quietMode -eq 0 ] && echo "$package a été installé, vous permettez que je désinstalle .. !"; if [ $quietMode -eq 0 ] then apt-get -y remove $package; apt-get -y purge $package; else apt-get -yq remove $package; apt-get -yq purge $package; fi; } # récupération des arguments [ -z "$1" ] && { usage;exit; } for arg in $* do case "$arg" in '-h' | '--help' ) usage shift exit;; '-s' | '--server') shift; SERVEUR_TO_TEST=$1 shift;; '-l' | '--localhost') SERVEUR_IS_LOCALHOST=1 shift;; '-f' | '--from') shift; USERFROM=$1 shift;; '-p' | '--password') shift; PASSWORD=$1 shift;; '-t' | '--to') shift; USERTO=$1 shift;; '-ed' | '--ext-disabled') EXTERNAL_TESTS_ENABLED=0; EXTERNAL_SMTP_ENABLED=0; shift;; '-em' | '--ext-mail') shift; EXTERNAL_EMAIL=$1 shift;; '-es' | '--ext-server') shift; EXTERNAL_SMTP=$1 shift;; '-eu' | '--ext-user') shift; EXTERNAL_USER=$1 shift;; '-ep' | '--ext-password') shift; EXTERNAL_PASSWORD=$1 shift;; '-ena' | '--ext-no-auth') EXTERNAL_SMTP_AUTH=0 shift;; '-eo' | '--ext-only') EXTERNAL_ONLY=1 shift;; '-v' | '-V' ) VERBOSE=1 shift;; '-q' | '-Q' ) QUIET=1 shift;; '-rd' | '--results-disabled') SKIP_RESULTS=1 shift;; '-ksm' | '--keep-sended-mails') KEEP_MAILS_ON_SERVEURS=1 shift;; *) esac done; [ $VERBOSE -eq 1 -a $QUIET -eq 1 ] && echo 'Les options -q et -v ne sont pas compatibles.' && usage; [ $VERBOSE -eq 1 ] && echo "Checking for swaks : $SWAKS_OK"; if [ -z "$SWAKS_OK" ]; then if [ $QUIET -eq 0 ] then echo "Swaks doit être installé, je le fait pour vous si j'ai les droits !"; while true; do read -p "On y va ? [Yn] :" yn case $yn in [YyoO]* ) break;; [Nn]* ) echo "Swaks doit être installé, les tests en dépendent"; exit;; * ) break;; esac done; apt-get update; apt-get -y install swaks; else apt-get -q update; apt-get -qy install swaks; fi; SWAKS_INSTALLED=$(dpkg-query -W --showformat='${Status}\n' swaks 2>/dev/null | grep "install ok installed") if [ -z "$SWAKS_INSTALLED" ] then echo "Swaks doit être installé, et je ne suis pas root visiblement."; echo "Soit le faire à la main, soit je m'en charge (apt install et remove à la fin), mais il me faut les droits root !"; exit; fi; trap 'cleanupPackage swaks $QUIET' EXIT; fi if [ $SKIP_RESULTS -eq 0 -a -z "$MUTT_OK" ]; then [ $VERBOSE -eq 1 ] && echo "Checking for mutt : $MUTT_OK"; if [ $QUIET -eq 0 ] then echo "Mutt doit être installé, je le fait pour vous si j'ai les droits !"; while true; do read -p "On y va ? [Yn] :" yn case $yn in [YyoO]* ) break;; [Nn]* ) echo "Mutt doit être installé, les tests en dépendent"; exit;; * ) break;; esac done; apt-get update; apt-get -y install mutt; else apt-get -q update; apt-get -qy install mutt; fi; MUTT_INSTALLED=$(dpkg-query -W --showformat='${Status}\n' swaks 2>/dev/null | grep "install ok installed") if [ -z "$MUTT_INSTALLED" ] then echo "Mutt doit être installé, et je ne suis pas root visiblement."; echo "Soit le faire à la main, soit je m'en charge (apt install et remove à la fin), mais il me faut les droits root !"; exit; fi; trap 'cleanupPackage mutt $QUIET' EXIT; fi # si les paramètres n'ont pas été renseignés via les arguments du script, # on prompt ceux qui sont necessaires [ $QUIET -eq 1 -a -z "$SERVEUR_TO_TEST" ] && SERVEUR_TO_TEST="mail.kaz.local"; #en mode quiet, on prend les options par défaut if [ -z "$SERVEUR_TO_TEST" ] then [ $VERBOSE -eq 1 ] && echo "-- Le serveur n'a pas été renseigné (il faut un fqdn):"; read -p "Le serveur à tester ? [mail.kaz.local] :" SERVEUR_TO_TEST; [ -z "$SERVEUR_TO_TEST" ] && SERVEUR_TO_TEST="mail.kaz.local"; fi; [ $QUIET -eq 1 -a -z "$USERFROM" ] && SERVEUR_TO_TEST="contact1@kaz.local"; #en mode quiet, on prend les options par défaut if [ -z "$USERFROM" ] then [ $VERBOSE -eq 1 ] && echo "-- Il me faut également un compte mail qui envoie :"; read -p "Email Expediteur ? [contact1@kaz.local]" USERFROM; [ -z "$USERFROM" ] && USERFROM="contact1@kaz.local"; fi; [ -z "$USERTO" ] && USERTO="$USERFROM"; #sauf si précisé en option # si on est en local, normalement les mails partent sans besoin de renseigner l'authentification # sinon il faut un mot de passe pour le smtp if { [ $SKIP_RESULTS -eq 0 ] || [ $SERVEUR_IS_LOCALHOST -eq 0 ]; } && [ -z "$PASSWORD" ]; then [ $VERBOSE -eq 1 ] && echo "-- Le password à utiliser n'a pas été renseigné :"; read -s -p "Le password ? [toto]" PASSWORD; [ -z "$PASSWORD" ] && PASSWORD="toto"; fi; # utilisation d'un mail exterieur et eventuellement un smtp exterieur if [ -z "$EXTERNAL_EMAIL" -a $EXTERNAL_TESTS_ENABLED -eq 1 -a $QUIET -eq 0 ] then [ $VERBOSE -eq 1 ] && echo "-- Les tests vers/depuis l'exterieur n'ont pas été desactivé via l'option -eq."; while true; do read -p "On fait des tests depuis / vers l'exterieur aussi ? [Yn] :" yn case $yn in [YyoO]* ) break;; [Nn]* ) EXTERNAL_TESTS_ENABLED=0; EXTERNAL_SMTP_ENABLED=0; break;; * ) break;; esac done; if [ $EXTERNAL_TESTS_ENABLED -eq 0 ] then [ $VERBOSE -eq 1 ] && echo "-- Les tests vers/depuis l'exterieur annulés"; else [ $VERBOSE -eq 1 ] && echo "-- Ok mais je n'ai toujours pas l'adresse exterieure à utiliser."; read -p "Mail externe ? :" EXTERNAL_EMAIL; fi fi if [ -z "$EXTERNAL_SMTP" -a $EXTERNAL_TESTS_ENABLED -eq 1 -a $QUIET -eq 0 ] then [ $VERBOSE -eq 1 ] && echo "-- smtp, je pourrais le deviner à partir du mail mais ... j'ai la flemme là."; echo "Pour les tests Depuis l'exterieur, il me faut aussi un smtp.Laisser vide si pas de tests depuis l'exterieur." read -p "smtp externe ? :" EXTERNAL_SMTP; [ -z $EXTERNAL_SMTP ] && EXTERNAL_SMTP_ENABLED=0; fi # authent pour le smtp ext if [ -z "$EXTERNAL_USER" -a $EXTERNAL_SMTP_AUTH -eq 1 -a $EXTERNAL_SMTP_ENABLED -eq 1 -a $QUIET -eq 0 ] then [ $VERBOSE -eq 1 ] && echo "L'authentification au smtp externe n'a pas été désactivée avec l'option -ea :"; [ $VERBOSE -eq 1 ] && echo "Le user à utiliser pour ce smtp externe n'a pas été renseigné :"; read -p "Le user du smtp ? " EXTERNAL_USER; fi if [ -z "$EXTERNAL_PASSWORD" -a $EXTERNAL_SMTP_AUTH -eq 1 -a $EXTERNAL_SMTP_ENABLED -eq 1 -a $QUIET -eq 0 ] then [ $VERBOSE -eq 1 ] && echo "L'authentification au smtp externe n'a pas été désactivée avec l'option -ea :"; [ $VERBOSE -eq 1 ] && echo "Le password à utiliser pour ce smtp externe n'a pas été renseigné :"; read -s -p "Le password pour le smtp ? " EXTERNAL_PASSWORD; fi #### #### Fin de la récupération des paramètres du script. On balance les mails ! #### if [ $VERBOSE -eq 1 ] then echo 'Paramètres : ' echo '------------' echo " Serveur : $SERVEUR_TO_TEST" echo " Expéditeur interne : $USERFROM" echo " Destinataire interne : $USERTO" echo ' Password : ***' echo " Tests vers externes : $EXTERNAL_TESTS_ENABLED" echo " Tests depuis externe : $EXTERNAL_SMTP_ENABLED" echo " Mail externe : $EXTERNAL_EMAIL" echo " Auth externe : $EXTERNAL_USER" echo '' echo '' sleep 2; echo "OK on va y aller ... mais j'attend encore 3 secondes pour donner le temps pour un Ctrl C" sleep 3; echo "C'est parti !"; # vous êtes sûr ? bon d'accord c'est chiant, # mais si on a cree des mails vraiment veroles, et qu'on est en train de les balancer sur la en prod, on peut avoir un doute ... fi sleep 2; if [ $EXTERNAL_ONLY -eq 0 ] then echo "1 ----- $NBMAILS Mails envoyés depuis $USERFROM vers $USERTO ----"; for MAIL in "$TEST_DIR/mails/"*.eml do echo "$MAIL"; options=(-f $USERFROM -t $USERTO -d $MAIL --h-From: "\"$KEY\" <$USERFROM>"); [ $SERVEUR_IS_LOCALHOST -eq 0 ] && options+=(-s $SERVEUR_TO_TEST -p 587 --tlso -au $USERFROM -ap $PASSWORD); [ $QUIET -eq 1 ] && options+=(--silent); [ $VERBOSE -eq 0 ] && options+=(-n); swaks "${options[@]}"; done fi if [ $EXTERNAL_TESTS_ENABLED -eq 1 ] then echo "2 ----- $NBMAILS Mails envoyés depuis $USERFROM vers $EXTERNAL_USER ----"; for MAIL in "$TEST_DIR/mails/"*.eml do options=(-f $USERFROM -t $EXTERNAL_EMAIL -d $MAIL -s $SERVEUR_TO_TEST --tlso --h-From: "\"$KEY\" <$USERFROM>"); [ $SERVEUR_IS_LOCALHOST -eq 0 ] && options+=(-p 587 -au $USERFROM -ap $PASSWORD); # on rajoute l'authetification [ $QUIET -eq 1 ] && options+=(--silent); [ $VERBOSE -eq 0 ] && options+=(-n); swaks "${options[@]}"; done fi if [ $EXTERNAL_SMTP_ENABLED -eq 1 ] then if [ $SERVEUR_IS_LOCALHOST -eq 1 ] then [ $QUIET -eq 0 ] && echo "3 ----- Mails envoyés depuis l'extérieur vers localhost ... heu une autre fois en fait ... "; [ $VERBOSE -eq 1 ] && echo "-- Mais si vous renseignez un fqdn pour le serveur je pourrais essayer ..."; else echo "3 ----- $NBMAILS Mails envoyés depuis $EXTERNAL_EMAIL vers $USERTO ----"; for MAIL in "$TEST_DIR/mails/"*.eml do options=(-f $EXTERNAL_EMAIL -t $USERTO -d $MAIL -s $EXTERNAL_SMTP -p 587 --tlso --h-From: "\"$KEY\" <$USERFROM>"); [ $EXTERNAL_SMTP_AUTH -eq 1 ] && options+=(-au $EXTERNAL_USER -ap $EXTERNAL_PASSWORD); [ $QUIET -eq 1 ] && options+=(--silent); [ $VERBOSE -eq 0 ] && options+=(-n); swaks "${options[@]}"; done fi fi #### #### Et bien maintenant on va voir les résultats ! #### if [ $SKIP_RESULTS -eq 0 ] then [ $VERBOSE -eq 1 ] && echo "-- On va maintenant chercher les mails en imap pour checker que tout est bon !"; [ $VERBOSE -eq 1 ] && echo "-- Creation d'un repertoire temporaire /tmp/$KEY"; mkdir /tmp/$KEY [ $VERBOSE -eq 1 ] && echo "-- Fichier de conf pour mutt"; echo "set imap_user=$USERFROM set ssl_force_tls = yes set ssl_starttls = yes set imap_pass=$PASSWORD set folder=imaps://$SERVEUR_TO_TEST:993 set spoolfile = +INBOX set pipe_decode=yes set wait_key=no mailboxes +INBOX " > /tmp/$KEY/muttrc [ $VERBOSE -eq 1 ] && echo "-- on télécharge les mails qu'on colle dans un txt"; mutt -F /tmp/$KEY/muttrc -e "push '~f $KEYallcat >> /tmp/$KEY/mails.eml'" [ $VERBOSE -eq 1 ] && echo "-- Et on fait le ménage sur le serveur"; if [ $KEEP_MAILS_ON_SERVEURS -eq 1 ] then [ $VERBOSE -eq 1 ] && echo "-- On les enregistre dans un sous dossier $KEY"; mutt -F /tmp/$KEY/muttrc -e "push '~f $KEYall'" else [ $VERBOSE -eq 1 ] && echo "-- On supprime les mails identifiés par la clef"; mutt -F /tmp/$KEY/muttrc -e "push '~f $KEYally'" fi NBTESTS=${#TESTS_DESCRIPTION[@]}; RED='\033[0;31m'; GREEN='\033[0;32m'; # Green NC='\033[0m'; # No Color [ $VERBOSE -eq 1 ] && echo "-- On passe les $NBTESTS tests définis dans le repertoire de mails"; echo "-------- RESULTATS DES TESTS ------ "; for (( i=0; i<${NBTESTS}; i++ )); do RESULTCOUNT=$(egrep -c "${TESTS_REGEXP[$i]}" /tmp/$KEY/mails.eml); if [ $RESULTCOUNT -eq ${TESTS_MATCHING_LINES[$i]} ] then echo -e "--$i-- ${TESTS_DESCRIPTION[$i]} : ${GREEN}OK${NC}"; else echo -e "--$i-- ${TESTS_DESCRIPTION[$i]} : ${RED}KO${NC}"; fi done fi