PSR SE2a4 2022/2023 G7 : Différence entre versions

De Wiki d'activités IMA
(Def of done)
 
(129 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
'''03/02/2023:''' <br>
+
'''Sujet:'''<br>
 +
https://rex.plil.fr/Enseignement/Systeme/Tutorat.IMA2a4.Messagerie/<br>
 
<br>
 
<br>
'''SOW'''<br>
+
'''Archive:'''<br>
-Lecture du Sujet<br>
+
[[file:2022-PSR-archive.zip]]
-Examine le code:<br>
+
<br>
-Compilation du code<br>
+
<br>
-Il faut determiner les tâches à effectuer<br>
+
= '''PROGRESS''' =
-Prise en main de la VM<br>
+
*'''DONE''' : Pour prévenir les failles, les deux serveurs SMTP seront écrits à partir de zéro en respectant la RFC 5321 mais avec des simplifications ;<br>
 +
*'''DONE''' : Les serveurs doivent être codés en langage C en utilisant la bibliothèque des sockets ;<br>
 +
*'''DONE''' : Les commandes VRFY et EXPN qui permettent au client de vérifier si une messagerie est disponible pour la transmission, ne seront pas implémentées ;<br>
 +
*'''DONE''' : Le routage des messages ne doit pas être implémenté et la gestion des messages non transmis est optionnel ;<br>
 +
*Un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible ;<br>
 +
*'''DONE''' : Les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25 ;<br>
 +
*Les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ;<br>
 +
*Il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ;<br>
 +
*'''DONE''' : Chaque connexion doit être gérée via un processus léger (Thread) et chaque commande par une fonction à laquelle est passée une structure représentant l’état du dialogue entre le client et le serveur ;<br>
 +
*'''DONE''' : Les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en cas d’absence de MX ;<br>
 +
*'''DONE''' : Les serveurs SMTP doivent être contactables en IPv4 et en IPv6, ils doivent aussi prendre en charge IPv4 et IPv6 pour la transmission vers les serveurs SMTP cibles ;<br>
 +
*Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ;<br>
 +
*'''DONE''' : Les deux serveurs ne diffèrent que par la méthode de distribution finale (stockage dans un système de fichiers ou envoi à un serveur SMTP cible) ;<br>
 +
*'''DONE''' : Le serveur SMTP sortant ne doit être lié qu’à l’interface réseau loopback ;<br>
 +
*'''DONE''' : Le serveur SMTP entrant ne doit être lié qu’à l’interface réseau menant à Internet. <br>
 +
<br>
 +
Qq précisions:<br>
 +
<br>
 +
*'''DONE''' : Ne doivent être stockés que les courriels à destination d’un utilisateur local ;<br>
 +
*'''DONE''' : Le format de stockage doit être le format maildir qui est une structure de répertoires particulière utilisée pour sauvegarder des courriers électroniques (le format maildir est très bien décrit sur Wikipédia);<br>
 +
*'''DONE''' : Chaque message entrant doit être ajouté au dossier de réception Maildir propre à l’utilisateur de destination ;<br>
 +
*'''DONE''' : Le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename ;<br>
 +
*'''DONE''' : Pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores indispensable). <br>
 
<br>
 
<br>
  
'''Def of done'''<br>
+
= '''03/02/2023:''' =
 +
== '''Def of done''' ==
 
'''Démarrage de la VM:'''<br>  
 
'''Démarrage de la VM:'''<br>  
''ssh pifou@capbreton''<br>
+
  ''ssh pifou@capbreton''<br>
''xen list'' pour voir la liste des VM déjà démarrées<br>  
+
  ''xen list'' pour voir la liste des VM déjà démarrées<br>  
''xen create /etc/xen/dio1.cfg''<br>
+
  ''xen create /etc/xen/dio1.cfg''<br>
Pour éteindre la VM : ''xen shut dio1''<br>
+
Pour éteindre la VM : <code>''xen shut dio1''</code><br>
 
<br>
 
<br>
 
'''Installation de GCC:'''<br>
 
'''Installation de GCC:'''<br>
''ssh root@193.48.57.186''<br>
+
  ''ssh root@193.48.57.186''<br>
''apt update''<br>
+
  ''apt update''<br>
''apt install gcc''<br>
+
  ''apt install gcc''<br>
 
<br>
 
<br>
 
'''Environment:''' <br>
 
'''Environment:''' <br>
 
Serveur dans ~/ldelepla<br>
 
Serveur dans ~/ldelepla<br>
''scp -r ldelepla/ root@193.48.57.186:~''<br>
+
  ''scp -r ldelepla/ root@193.48.57.186:~''<br>
 +
 
 +
= '''10/02/2023:''' =
 +
== '''Def of done''' ==
 +
Dans libs/Flux/mutex.c : ajout du free dans la fonction mutex_fin<br>
 +
Dégager le process qui écoute le port 25 :<br>
 +
  ''ss -tpln''<br>
 +
Pour trouver le process et<br>
 +
  ''service <name> stop''<br>
 +
<br>
 +
On peut maintenant lancer les serveurs SMTP<br>
 +
<br>
 +
Dans src/SMTPin/in.c ligne 56, vérification que la connexion est correctement faite et que le message s'est envoyé<br>
 +
MAILDIR_NEW avec le rename : dans src/SMTPout/out.c ligne 171<br>
 +
Ajout d'un MX sur la VM:<br>
 +
  ''vi /etc/bind/db.raclette''<br>
 +
  ''cd raclette.site.dnssec/''<br>
 +
  ''dnssec-signzone -o raclette.site -k raclette.site-ksk.key ../db.raclette raclette.site-zsk.key''<br>
 +
  ''service named restart''<br>
 +
Pour le test SMTP : [https://mxtoolbox.com/diagnostic.aspx]<br>
 +
<br>
 +
 
 +
= '''17/03/2023:''' =
 +
== '''Objectifs''' ==
 +
*Permettre aux deux serveurs de fonctionner ensemble: SMTPin sur l'interface loopback et SMTPout sur l'interface ETH0<br>
 +
*Essai d'envoi de message(''voir site web pour le test juste au dessus'')<br>
 +
 
 +
== '''Def of done''' ==
 +
'''Faire fonctionner les deux serveurs ensemble'''<br>
 +
''./SMTPin -l'' Pour mettre SMTPin sur ''loopback''<br>
 +
<br>
 +
Dans ''~/ldelepla/src/SMTPout/args.c'' modification pour avoir l'interface ETH0: <br>
 +
*Ligne 12 dans la fonction ''AfficheSyntaxe'': Ajout fprintf<br>
 +
*Ligne 24 dans la fonction ''AnalyseArguments''<br>
 +
*Ligne 40 à 42 dans la fonction ''AnalyseArguments'': strncpy de l'interface<br>
 +
Dans ''~/ldelepla/src/SMTPout/args.h'' ajout d'un élément char nommé interface de taille max CONFIG_MAX_INTERFACE<br>
 +
Dans ''~/ldelepla/libs/Reseau/reseau.c'' dans la fonction initialisation serveur à la ligne 44, si interface!=NULL alors il se met sur la bonne interface<br>
 +
Dans ''~/ldelepla/src/SMTPout/out.c'' à la ligne 202 *interface = config.interface;<br>
 +
Dans le Makefile: ''-g'' à la compilation pour avoir la ligne du segfault avec valgrind<br>
 +
<br>
 +
'''SMTPin et SMTPout fonctionnent ensemble respectivement sur lo et eth0'''<br>
 +
<br>
 +
'''Tests'''<br>
 +
Effectués avec le site sur la section ci-dessus<br>
 +
Premiers résulats venant du site:<br>
 +
<br>
 +
''Connecting to 193.48.57.186''<br>
 +
<br>
 +
''250 Welcome [143 ms]''<br>
 +
''EHLO keeper-us-east-1d.mxtoolbox.com''<br>
 +
<br>
 +
''SendSMTPCommand: Timeout waiting for response after 15 seconds.''<br>
 +
<br>
 +
''LookupServer 16003ms''<br>
 +
<br>
 +
Remarque: Compiler avec ''-j <nom du fichier>'' pour avoir les logs<br>
 +
En ouvrant le fichier de log, rien n'apparaît...<br>
 +
<br>
 +
Essai d'envoi avec nc depuis une machine polytech<br>
 +
Remarque: compiler avec make debug et les arguments -j log.txt 255 pour remplir le journal<br>
 +
<br>
 +
Toujours aucun résultat avec le site web<br>
 +
Pourtant /r/n présents dans le protocol<br>
 +
Avec strace, on remarque que le serveur continue de lire alors que le message est fini.<br>
 +
Pour cela, modification dans ''libs/SMTP/smtp.c'' : Dans la boucle de lecture commencant à la ligne 143, la boucle ne traite pas le cas où ''p->traitement  == NULL'', dans ce cas là, on a l'erreur 502<br>
 +
Ajout dans  du renvoi d'erreur <code>"Not Implemented"</code> (code 502) dans ''libs/SMTP/smtp_private.h'' à la ligne 24<br>
 +
<br>
 +
 
 +
= '''22/03/2023:''' =
 +
== '''Objectifs''' ==
 +
*Réaliser les tests et corriger les premiers bugs<br>
 +
 
 +
== '''Def of done''' ==
 +
Fonctionne avec netcat:<br>
 +
Sur une autre machine:<br>
 +
<pre>
 +
  nc 193.48.57.186 25
 +
  HELO raclette.site
 +
  MAIL FROM: ldelepla@polyetch-lille.fr
 +
  RCPT TO: root@raclette.site
 +
  DATA
 +
  SUBJECT: <sujet>
 +
  <corps du mail>
 +
  .
 +
  QUIT
 +
</pre>
 +
Sur le terminal de la VM on reçoit bien le message<br>
 +
Mais à chaque commande SMTPout renvoi le code 502 à chaque commande<br>
 +
Il manque un break dans la modification du code faite à la séance précédente dans ''smtp.c'' à la ligne 171<br>
 +
<br>
 +
Essai d'envoi avec la boite mail polytech<br>
 +
'''ERREUR'''<br>
 +
Il faut modifier la fonction ''gestion_MAIL'' et gestion_RCPT''<br>
 +
L'erreur est lié au format de l'envoi des commandes<br>
 +
''Modification avant et après les if(statut!=2)''<br>
 +
<br>
 +
En mode debug on voit maintenant la réception du mail sur le terminal
 +
<br>
 +
Le mail doit normalement être stocké dans /tmp mais il n'y à rien, Il faut permettre le debug avec le journal pour savoir où est l'erreur<br>
 +
Cela est fait dans ''SMTPout/out.c'' dans la fonction ''gestionCourriel''<br>
 +
'''=>'''Ne passe pas le ''P(MUTEX_COMPTEUR):''<br>
 +
<br>
 +
 
 +
= '''INTER-SEANCE:''' =
 +
== '''Objectifs''' ==
 +
-Faire tourner les deux serveurs en arrière plan, pour voir s'ils SEGFAULT<br>
 +
 
 +
== '''Def of done''' ==
 +
Pour éviter que les serveurs soient tuer par le signal SIGHUP en quittant la session à distance je lance le programme de cette manière:<br>
 +
  ''nohup ./SMTPout -i eth0 -j log.txt -n 255 &''<br>
 +
<br>
 +
  ''nohup ./SMTPin -l -j log.txt -n 255 &''<br>
 +
Avec la commande:<br>
 +
  ''ps -ef | grep SMTP''<br>
 +
Même après avoir quitter la VM, on voit que SMTPin et SMTPout tournent toujours<br>
 +
<br>
 +
 
 +
= '''29/03/2023:''' =
 +
== '''Objectifs''' ==
 +
Comprendre et corriger le bug lié au non stockage des mails reçus<br>
 +
 
 +
== '''Def of done''' ==
 +
Résultat du test fait en INTER-SEANCE: pas de SEGFAULT<br>
 +
<br>
 +
A la compilation, ajouter ''-u carte.txt'' pour indiquer le fichier avec les utilisateurs possible, sous la forme:<br>
 +
  ''root : root@raclette''<br>
 +
  ''user1 : user1@raclette''<br>
 +
<br>
 +
Dans ''/tmp'' il faut créer les répertoires des utilisateurs:<br>
 +
  ''/tmp/root/tmp''<br>
 +
  ''/tmp/root/new''<br>
 +
<br>
 +
  ''/tmp/user1/tmp''<br>
 +
  ''/tmp/user1/new''<br>
 +
Dans ''out.c'', dans la fonction ''scanCarteUtilisateur'' il manque ''==0'' dans le ''if'' avec le ''strcasecmp''<br>
 +
Dans la fonction ''adresseVersUtilisateur'', erreur: ''strlen(destinataire)'' et non ''strlen(adresse)''<br>
 +
<br>
 +
Dans ''smtp.c'' dans la fonction ''gestion_RCPT'', il y avait encore la chaine de char tag liè à la modification de cette fonction durant la séance 22/03<br>
 +
<br>
 +
'''Le mail est bien recu et est stocké dans les dossiers associés'''<br>
 +
<br>
 +
<br>
 +
Modification nécessaire dans ''smtp.c'':<br>
 +
Dans la fonction ''gestion_DATA'' et ''SMTP_gestion'' dans le while ligne 111, toujours en renvoi de ''SUCCESS_DATA_CODE''<br>
 +
<br>
 +
Jusqu'à la prochaine séance je laisse tourner les deux serveurs:<br>
 +
  ''nohup ./SMTPout -i eth0 -j log.txt -n 255 -u carte.txt &''<br>
 +
<br>
 +
  ''nohup ./SMTPin -l -j log.txt -n 255 &''<br>
 +
<br>
 +
 
 +
= '''05/04/2023:''' =
 +
== '''Objectifs''' ==
 +
-Modif de ''smtp.c''<br>
 +
-Commencer à débuger SMTPin<br>
 +
 
 +
== '''Def of done''' ==
 +
*Aucun segfault ou crash des deux serveurs<br>
 +
<br>
 +
*Pour envoyer un mail:<br>
 +
  nc localhost 25<br>
 +
<br>
 +
Modification de ''reseau.c'' dans la fonction ''connexionServeur'':<br>
 +
<pre>
 +
  while(1){
 +
      if(p->ai_family==AF_INET6) ipv6=1;
 +
      if(p->ai_family==AF_INET) ipv4=1;
 +
      p=p->ai_next;
 +
  }
 +
</pre>
 +
<br>
 +
 
 +
= '''31/05/2023: WORKSHOP''' =
 +
== '''Objectifs''' ==
 +
Mutualiser le travail avec Simon, Farid et Jerôme pour avoir un SMTPin et un SMTPout fonctionnel
 +
 
 +
== '''Def of done''' ==
 +
'''SMTPin:'''<br>
 +
Les codes dans private_smtp.h ne sont pas correct<br>
 +
On ajoute du code pour débuger dans smtp.c<br>
 +
<pre>
 +
static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille){
 +
  char ligne[MAX_LIGNE];
 +
  #ifdef DEVERMINE
 +
    printf("SMTP -> retour generique\n");
 +
  #endif
 +
  if(fgets(ligne,MAX_LIGNE,dialogue)==NULL) return -1;
 +
  ligne[MAX_LIGNE-1]='\0';
 +
  int code;
 +
  int statut=sscanf(ligne,"%d",&code);
 +
  #ifdef DEVERMINE
 +
    printf("statut =%d\n", statut);
 +
    printf("succes =%d\n", succes);
 +
    printf("code =%d\n", code);
 +
  #endif
 +
  if(statut==1 && code!=succes){
 +
    strncpy(erreur,ligne,taille-1);
 +
  #ifdef DEVERMINE
 +
    printf("retour_generique ERROR\n");
 +
  #endif
 +
  }
 +
return (statut==1 && code==succes)?0:-1;<br>
 +
}<br>
 +
</pre>
 +
En lancant SMTPin avec strace on retrouve les codes attendus à modifier dans private_smtp.h<br>
 +
<pre>
 +
  nc localhost 25
 +
  HELO polytech-lille.net
 +
  MAIL FROM: root@raclette.site
 +
  RCPT TO: ldelepla@polytech-lille.net
 +
  DATA
 +
  SUBJECT: TEST
 +
  TEST
 +
  .
 +
  QUIT
 +
</pre>
 +
Le mail est bien reçu sur ma boîte polytech<br>
 +
<br>
 +
'''SMTPout:'''<br>
 +
Le serveur ne stocke plus les mails<br>
 +
<br>
 +
 
 +
= '''07/06/2023:''' =
 +
== '''Objectifs''' ==
 +
*Verifier les deux serveurs<br>
 +
*Tests de charge<br>
 +
*Tests de charge avec erreurs aléatoires<br>
 +
 
 +
== '''Def of done''' ==
 +
SMTPout restock les mails reçus<br>
 +
<br>
 +
Soit le fichier test suivant:
 +
  HELO TEST
 +
  MAIL FROM: root@raclette.site
 +
  RCPT TO: ldelepla@polyetch-lille.net
 +
  DATA
 +
  SUBJECT: TEST
 +
 
 +
  BONJOUR
 +
  .
 +
  QUIT
 +
 
 +
  nc -C -q0 -i1 localhost 25 < test<br>
 +
 
 +
'''Le mail est bien reçu sur ma boîte mail polytech'''<br>
 +
<br>
 +
Pour automatiser:<br>
 +
  i=0 ; while [ $i -lt 10 ] ; do nc -C -q0 -i1 localhost 25 < test & i='expr $i + 1'; done<br>
 +
'''Fonctionne en envoyant 100 mails'''<br>
 +
<br>
 +
'''Test pour le SMTPout:'''<br>
 +
Même méthode mais sur une autre machine<br>
 +
Pour automatiser:<br>
 +
<pre>
 +
  #!/bin/bash
 +
  i=0
 +
  while [ $i -lt $2 ]
 +
  do
 +
      nc -C -q0 -i1 $1 25 < $3 &
 +
      i=`expr $i + 1`
 +
  done
 +
</pre>
 +
  ./test.sh <adresse> <nb_envoi> <fichier><br>
 +
 
 +
= '''14/06/2023:''' =
 +
== '''Objectifs''' ==
 +
*Test de charge pour l'envoi<br>
 +
*Test de charge avec erreurs aléatoires<br>
 +
*Recherche des leaks avec valgrind<br>
 +
 
 +
== '''Def of done''' ==
 +
Lors de l'envoi de mail (SMTPin) j'ai remarqué qu'il faut obligatoirement les chevrons. Il faut modifier la fonction ''*adresseVersUtilisateur''. Maintenant le test de charge fonctionne correctement.<br>
 +
 
 +
'''Test de charge avec erreurs aléatoires:'''<br>
 +
Pour créer des erreurs aléatoires j'ai écris en bash:<br>
 +
<pre>
 +
  #!/bin/bash
 +
  i=0
 +
  while [ $i -lt $2 ]
 +
  do
 +
    nombre=$RANDOM
 +
    nombre=`expr $nombre \% 5`
 +
    case $nombre in
 +
      1)
 +
      nc -C -q0 -i1 $1 25 < $4 &
 +
      ;;
 +
      *)
 +
      nc -C -q0 -i1 $1 25 < $3 &
 +
      ;;
 +
    esac
 +
    i=`expr $i + 1`
 +
  done
 +
</pre>
 +
Avec comme premier argument l'adresse ip, le suivant le nombre de messages a envoyer, le suivant un fichier test.txt contenant aucune erreur, et un autre argument contenant des erreurs. Ainsi dans ce cas, il y a une chance sur cinq de tomber sur une erreur.<br>
 +
<br>
 +
Le serveur tient toujours la charge avec de nombreux mails contenant 1 fois sur 5 des erreurs.<br>
 +
<br>
 +
'''Fuites mémoires'''<br>
 +
Avec:<br>
 +
<code>valgrind --leak-check=full --show-leak-kinds=all -s ./SMTPout -i eth0 -u carte.txt > /tmp/log</code><br>
 +
On vérifie les fuites mémoires. On constate que 30ko sont définitivement perdues.<br>
 +
Après vérification il y a une erreur dans le malloc de la fonction adresseVersUtilisateur de out.c il faut ajouter un +1 dans le malloc dans le cas ou il n'y a aucun destinataire.<br>
 +
Aussi, on remarque qu'il y a autant de blocks perdues que de messages envoyés, en fait, il n'y a pas de <code>free(donnees)</code> dans la fonction SMTP_gestion.

Version actuelle datée du 14 juin 2023 à 15:45

Sujet:
https://rex.plil.fr/Enseignement/Systeme/Tutorat.IMA2a4.Messagerie/

Archive:
Fichier:2022-PSR-archive.zip

PROGRESS

  • DONE : Pour prévenir les failles, les deux serveurs SMTP seront écrits à partir de zéro en respectant la RFC 5321 mais avec des simplifications ;
  • DONE : Les serveurs doivent être codés en langage C en utilisant la bibliothèque des sockets ;
  • DONE : Les commandes VRFY et EXPN qui permettent au client de vérifier si une messagerie est disponible pour la transmission, ne seront pas implémentées ;
  • DONE : Le routage des messages ne doit pas être implémenté et la gestion des messages non transmis est optionnel ;
  • Un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible ;
  • DONE : Les communications peuvent ne pas être chiffrées, les communications non chiffrés sont reçues sur le port 25 ;
  • Les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 ;
  • Il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS ;
  • DONE : Chaque connexion doit être gérée via un processus léger (Thread) et chaque commande par une fonction à laquelle est passée une structure représentant l’état du dialogue entre le client et le serveur ;
  • DONE : Les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en cas d’absence de MX ;
  • DONE : Les serveurs SMTP doivent être contactables en IPv4 et en IPv6, ils doivent aussi prendre en charge IPv4 et IPv6 pour la transmission vers les serveurs SMTP cibles ;
  • Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ;
  • DONE : Les deux serveurs ne diffèrent que par la méthode de distribution finale (stockage dans un système de fichiers ou envoi à un serveur SMTP cible) ;
  • DONE : Le serveur SMTP sortant ne doit être lié qu’à l’interface réseau loopback ;
  • DONE : Le serveur SMTP entrant ne doit être lié qu’à l’interface réseau menant à Internet.


Qq précisions:

  • DONE : Ne doivent être stockés que les courriels à destination d’un utilisateur local ;
  • DONE : Le format de stockage doit être le format maildir qui est une structure de répertoires particulière utilisée pour sauvegarder des courriers électroniques (le format maildir est très bien décrit sur Wikipédia);
  • DONE : Chaque message entrant doit être ajouté au dossier de réception Maildir propre à l’utilisateur de destination ;
  • DONE : Le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename ;
  • DONE : Pour assurer un nom unique aux fichiers de stockage, utilisez la date en seconde (fonction time), le PID et un compteur commun à tous les flux d’exécution (utilisation de sémaphores indispensable).


03/02/2023:

Def of done

Démarrage de la VM:

  ssh pifou@capbreton
xen list pour voir la liste des VM déjà démarrées
xen create /etc/xen/dio1.cfg

Pour éteindre la VM : xen shut dio1

Installation de GCC:

  ssh root@193.48.57.186
apt update
apt install gcc


Environment:
Serveur dans ~/ldelepla

  scp -r ldelepla/ root@193.48.57.186:~

10/02/2023:

Def of done

Dans libs/Flux/mutex.c : ajout du free dans la fonction mutex_fin
Dégager le process qui écoute le port 25 :

  ss -tpln

Pour trouver le process et

  service <name> stop


On peut maintenant lancer les serveurs SMTP

Dans src/SMTPin/in.c ligne 56, vérification que la connexion est correctement faite et que le message s'est envoyé
MAILDIR_NEW avec le rename : dans src/SMTPout/out.c ligne 171
Ajout d'un MX sur la VM:

  vi /etc/bind/db.raclette
cd raclette.site.dnssec/
dnssec-signzone -o raclette.site -k raclette.site-ksk.key ../db.raclette raclette.site-zsk.key
service named restart

Pour le test SMTP : [1]

17/03/2023:

Objectifs

  • Permettre aux deux serveurs de fonctionner ensemble: SMTPin sur l'interface loopback et SMTPout sur l'interface ETH0
  • Essai d'envoi de message(voir site web pour le test juste au dessus)

Def of done

Faire fonctionner les deux serveurs ensemble
./SMTPin -l Pour mettre SMTPin sur loopback

Dans ~/ldelepla/src/SMTPout/args.c modification pour avoir l'interface ETH0:

  • Ligne 12 dans la fonction AfficheSyntaxe: Ajout fprintf
  • Ligne 24 dans la fonction AnalyseArguments
  • Ligne 40 à 42 dans la fonction AnalyseArguments: strncpy de l'interface

Dans ~/ldelepla/src/SMTPout/args.h ajout d'un élément char nommé interface de taille max CONFIG_MAX_INTERFACE
Dans ~/ldelepla/libs/Reseau/reseau.c dans la fonction initialisation serveur à la ligne 44, si interface!=NULL alors il se met sur la bonne interface
Dans ~/ldelepla/src/SMTPout/out.c à la ligne 202 *interface = config.interface;
Dans le Makefile: -g à la compilation pour avoir la ligne du segfault avec valgrind

SMTPin et SMTPout fonctionnent ensemble respectivement sur lo et eth0

Tests
Effectués avec le site sur la section ci-dessus
Premiers résulats venant du site:

Connecting to 193.48.57.186

250 Welcome [143 ms]
EHLO keeper-us-east-1d.mxtoolbox.com

SendSMTPCommand: Timeout waiting for response after 15 seconds.

LookupServer 16003ms

Remarque: Compiler avec -j <nom du fichier> pour avoir les logs
En ouvrant le fichier de log, rien n'apparaît...

Essai d'envoi avec nc depuis une machine polytech
Remarque: compiler avec make debug et les arguments -j log.txt 255 pour remplir le journal

Toujours aucun résultat avec le site web
Pourtant /r/n présents dans le protocol
Avec strace, on remarque que le serveur continue de lire alors que le message est fini.
Pour cela, modification dans libs/SMTP/smtp.c : Dans la boucle de lecture commencant à la ligne 143, la boucle ne traite pas le cas où p->traitement == NULL, dans ce cas là, on a l'erreur 502
Ajout dans du renvoi d'erreur "Not Implemented" (code 502) dans libs/SMTP/smtp_private.h à la ligne 24

22/03/2023:

Objectifs

  • Réaliser les tests et corriger les premiers bugs

Def of done

Fonctionne avec netcat:
Sur une autre machine:

   nc 193.48.57.186 25
   HELO raclette.site
   MAIL FROM: ldelepla@polyetch-lille.fr
   RCPT TO: root@raclette.site
   DATA
   SUBJECT: <sujet>
   <corps du mail>
   .
   QUIT

Sur le terminal de la VM on reçoit bien le message
Mais à chaque commande SMTPout renvoi le code 502 à chaque commande
Il manque un break dans la modification du code faite à la séance précédente dans smtp.c à la ligne 171

Essai d'envoi avec la boite mail polytech
ERREUR
Il faut modifier la fonction gestion_MAIL et gestion_RCPT
L'erreur est lié au format de l'envoi des commandes
Modification avant et après les if(statut!=2)

En mode debug on voit maintenant la réception du mail sur le terminal
Le mail doit normalement être stocké dans /tmp mais il n'y à rien, Il faut permettre le debug avec le journal pour savoir où est l'erreur
Cela est fait dans SMTPout/out.c dans la fonction gestionCourriel
=>Ne passe pas le P(MUTEX_COMPTEUR):

INTER-SEANCE:

Objectifs

-Faire tourner les deux serveurs en arrière plan, pour voir s'ils SEGFAULT

Def of done

Pour éviter que les serveurs soient tuer par le signal SIGHUP en quittant la session à distance je lance le programme de cette manière:

  nohup ./SMTPout -i eth0 -j log.txt -n 255 &


  nohup ./SMTPin -l -j log.txt -n 255 &

Avec la commande:

  ps -ef | grep SMTP

Même après avoir quitter la VM, on voit que SMTPin et SMTPout tournent toujours

29/03/2023:

Objectifs

Comprendre et corriger le bug lié au non stockage des mails reçus

Def of done

Résultat du test fait en INTER-SEANCE: pas de SEGFAULT

A la compilation, ajouter -u carte.txt pour indiquer le fichier avec les utilisateurs possible, sous la forme:

  root : root@raclette
user1 : user1@raclette


Dans /tmp il faut créer les répertoires des utilisateurs:

  /tmp/root/tmp
/tmp/root/new


  /tmp/user1/tmp
/tmp/user1/new

Dans out.c, dans la fonction scanCarteUtilisateur il manque ==0 dans le if avec le strcasecmp
Dans la fonction adresseVersUtilisateur, erreur: strlen(destinataire) et non strlen(adresse)

Dans smtp.c dans la fonction gestion_RCPT, il y avait encore la chaine de char tag liè à la modification de cette fonction durant la séance 22/03

Le mail est bien recu et est stocké dans les dossiers associés


Modification nécessaire dans smtp.c:
Dans la fonction gestion_DATA et SMTP_gestion dans le while ligne 111, toujours en renvoi de SUCCESS_DATA_CODE

Jusqu'à la prochaine séance je laisse tourner les deux serveurs:

  nohup ./SMTPout -i eth0 -j log.txt -n 255 -u carte.txt &


  nohup ./SMTPin -l -j log.txt -n 255 &


05/04/2023:

Objectifs

-Modif de smtp.c
-Commencer à débuger SMTPin

Def of done

  • Aucun segfault ou crash des deux serveurs


  • Pour envoyer un mail:
  nc localhost 25


Modification de reseau.c dans la fonction connexionServeur:

   while(1){
      if(p->ai_family==AF_INET6) ipv6=1;
      if(p->ai_family==AF_INET) ipv4=1;
      p=p->ai_next;
   }


31/05/2023: WORKSHOP

Objectifs

Mutualiser le travail avec Simon, Farid et Jerôme pour avoir un SMTPin et un SMTPout fonctionnel

Def of done

SMTPin:
Les codes dans private_smtp.h ne sont pas correct
On ajoute du code pour débuger dans smtp.c

 static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille){
   char ligne[MAX_LIGNE];
   #ifdef DEVERMINE
     printf("SMTP -> retour generique\n");
   #endif
   if(fgets(ligne,MAX_LIGNE,dialogue)==NULL) return -1;
   ligne[MAX_LIGNE-1]='\0';
   int code;
   int statut=sscanf(ligne,"%d",&code);
   #ifdef DEVERMINE
     printf("statut =%d\n", statut);
     printf("succes =%d\n", succes);
     printf("code =%d\n", code);
   #endif
   if(statut==1 && code!=succes){
     strncpy(erreur,ligne,taille-1);
   #ifdef DEVERMINE
     printf("retour_generique ERROR\n");
   #endif
   }
 return (statut==1 && code==succes)?0:-1;<br>
 }<br>

En lancant SMTPin avec strace on retrouve les codes attendus à modifier dans private_smtp.h

   nc localhost 25
   HELO polytech-lille.net
   MAIL FROM: root@raclette.site
   RCPT TO: ldelepla@polytech-lille.net
   DATA
   SUBJECT: TEST
   TEST
   .
   QUIT

Le mail est bien reçu sur ma boîte polytech

SMTPout:
Le serveur ne stocke plus les mails

07/06/2023:

Objectifs

  • Verifier les deux serveurs
  • Tests de charge
  • Tests de charge avec erreurs aléatoires

Def of done

SMTPout restock les mails reçus

Soit le fichier test suivant:

  HELO TEST
  MAIL FROM: root@raclette.site
  RCPT TO: ldelepla@polyetch-lille.net
  DATA
  SUBJECT: TEST
  
  BONJOUR
  .
  QUIT
  nc -C -q0 -i1 localhost 25 < test

Le mail est bien reçu sur ma boîte mail polytech

Pour automatiser:

  i=0 ; while [ $i -lt 10 ] ; do nc -C -q0 -i1 localhost 25 < test & i='expr $i + 1'; done

Fonctionne en envoyant 100 mails

Test pour le SMTPout:
Même méthode mais sur une autre machine
Pour automatiser:

   #!/bin/bash
   i=0
   while [ $i -lt $2 ]
   do
      nc -C -q0 -i1 $1 25 < $3 &
      i=`expr $i + 1`
   done
  ./test.sh <adresse> <nb_envoi> <fichier>

14/06/2023:

Objectifs

  • Test de charge pour l'envoi
  • Test de charge avec erreurs aléatoires
  • Recherche des leaks avec valgrind

Def of done

Lors de l'envoi de mail (SMTPin) j'ai remarqué qu'il faut obligatoirement les chevrons. Il faut modifier la fonction *adresseVersUtilisateur. Maintenant le test de charge fonctionne correctement.

Test de charge avec erreurs aléatoires:
Pour créer des erreurs aléatoires j'ai écris en bash:

   #!/bin/bash
   i=0
   while [ $i -lt $2 ]
   do
    nombre=$RANDOM
    nombre=`expr $nombre \% 5`
     case $nombre in
      1)
       nc -C -q0 -i1 $1 25 < $4 &
       ;;
      *)
       nc -C -q0 -i1 $1 25 < $3 &
       ;;
     esac
     i=`expr $i + 1`
   done

Avec comme premier argument l'adresse ip, le suivant le nombre de messages a envoyer, le suivant un fichier test.txt contenant aucune erreur, et un autre argument contenant des erreurs. Ainsi dans ce cas, il y a une chance sur cinq de tomber sur une erreur.

Le serveur tient toujours la charge avec de nombreux mails contenant 1 fois sur 5 des erreurs.

Fuites mémoires
Avec:
valgrind --leak-check=full --show-leak-kinds=all -s ./SMTPout -i eth0 -u carte.txt > /tmp/log
On vérifie les fuites mémoires. On constate que 30ko sont définitivement perdues.
Après vérification il y a une erreur dans le malloc de la fonction adresseVersUtilisateur de out.c il faut ajouter un +1 dans le malloc dans le cas ou il n'y a aucun destinataire.
Aussi, on remarque qu'il y a autant de blocks perdues que de messages envoyés, en fait, il n'y a pas de free(donnees) dans la fonction SMTP_gestion.