Print This Page

Modification des envois par mail


Objet:


Les routeurs Netgear permettent l'envoi de logs par mail à destination de leur administrateur. Le serveur smtp et le destinataire sont configurables, mais l'adresse d'expéditeur et le sujet du mail ne le sont pas. Un examen du code permet de voir que ces options ont été en partie développées mais ne sont finalement pas disponibles. On trouve notamment des champs logsubject, alertsubject, et frommail dans les paramètres de la nvram, des champs hidden dans le fichier emailform.html, et même un fichier emailAdvance.html non utilisé dans l'interface.
Dans cet exemple on se contentera d'ajouter un champ "subjectMail" dans l'interface, pour étudier de bout en bout l'impact de cet ajout sur le code.


Première étape : préparation

On repart d'une compilation antérieur du firmware (cf : page précédente). On va éventuellement modifier le fichier "user/dniutil/nvram_realtek.c" pour changer le numéro de version de notre firmware.
Ensuite on suit pas à pas la recette de la documentation.
Remarque importante : si vous effectuez des modifications en copier coller, méfiez vous des modifications induites par les éditeurs de texte sur des caractères comme les guillemets et les doubles guillemets. Vous trouverez un fichier de patch à la fin de cette page...

  1) Suppression de l'extension dans le fichier "user/dniutil/nvram_realtek.c" : on recherche dans le fichier une ligne contenant la chaine  "EXTENSION_KO" et on insère après le #endif les lignes suivantes:

#if 1
#ifdef EXTENSION
#undef EXTENSION
#endif
#define EXTENSION ""
#endif

 2) Ajout des paramètres nécessaires dans la nvram: éditer le fichier "user/boa/src/rtl865x/board.h" et rechercher la définition de la structure emailCfgParam_s, et y insérer les lignes suivantes (les parties en italiques correspondent aux lignes déjà présentes dans la structure, les lignes en gras sont celles qui sont ajoutées:

        uint8   mailfrom[64];
uint8 rcptto[64];
//begin hvdp
uint8 subjectmail[128];
//end hvdp
uint8 smtpserver[64];
uint8 logserver[64];
Nous avons donc introduit une chaine de caractères de 128 caractères dans la structure pour le sujet du mail... Une chaine de 64 caractères correspondant à l'emetteur était déjà présente.

 3) la structure est déjà décrite dans l'ensemble des paramètres, il n'y a pas de modification à faire dans romeCfgParam_s

 4) ajout des accesseurs : recherche dans le fichier "user/dniutil/nvram_realtek.c" la fonction "nvram_set_frommail" et ajouter à sa suite les accesseurs correspondant à notre paramètre:

int
nvram_set_frommail(char *name, char *value) {
DPRINTF("nvram_set(\"%s\", \"%s\")\n", name, value); strncpy(pRomeCfgParam->emailCfgParam.mailfrom, value, sizeof(pRomeCfgParam->emailCfgParam.mailfrom));
return 1;
}

//begin hvdp
char *
nvram_get_subjectmail(char *name)
{
DPRINTF("nvram_get(\"%s\")\n", name);

return (pRomeCfgParam->emailCfgParam.subjectmail);
}

int
nvram_set_subjectmail(char *name, char *value)
{
DPRINTF("nvram_set(\"%s\", \"%s\")\n", name, value);

strncpy(pRomeCfgParam->emailCfgParam.subjectmail, value, sizeof(pRomeCfgParam->emailCfgParam.subjectmail));
return 1;
}

//end hvdp
char *
nvram_get_alertimm(char *name)
{
DPRINTF("nvram_get(\"%s\")\n", name);

return (pRomeCfgParam->emailCfgParam.alertimm ? "1" : "0");

}


 5 ) Ajout des getters et setters dans la table des handlers de la nvram. Toujours dans le fichier "user/dniutil/nvram_realtek.c" on recherche le tableau nvram_handlers, et on ajoute les lignes suivantes (en gras):

        { "router_info", nvram_get_router_info, NULL},
//begin hvdp
{ "subjectmail",nvram_get_subjectmail,nvram_set_subjectmail},
//end hvdp

{ NULL, NULL, NULL },

 6) Déclaration et valeurs par défaut du paramètre. Le paramètre est déjà défini, mais il nous faut modifier son initialisation par défaut sous peine de crash. On édite le fichier user/boa/src/dni/board.c

emailCfgParam_t emailCfgParamDefault[1] =
{
{
0, /* enable */
"\0","\0",
"Subject\0","\0","\0", /* mail */
0, /* auth */

0, /* alert imm */

 

 7) Définition de la fonction d'initialisation: pas de modification nécessaire.

  8) Ajout de la fonction dans l'initialisation du système: pas de modification nécessaire.

  9) Ajout d'un identifiant dans les tables de gestion de la configuration et de controle: pas de modification nécessaire.

 10) Ajout d'une fonction de sauvegarde du paramètre: pas de modification nécessaire.

 11) Ajout du paramètre dans la fonction commit de la nvram: pas de modification nécessaire.

Deuxième étape: modification de l'application smtp

il nous faut éditer le fichier "./user/smtpclient/smtpclient_main.c" pour ajouter nos nouvelles fonctionnalités. On commence par ajouter une variable contenant le sujet de notre mail:


char subject_log[50]     = "NETGEAR Security Log";
char subject_alert[50] = "NETGEAR *Security Alert*";
//begin hvdp
char custom_subject[128];
//end hvdp

puis on introduit les lignes permettant la modification du sujet du message:

     memset(mac,0,20);
strcpy(mac,nvram_get("wan0_hwaddr"));
sprintf(mac_addr,"[%s]", mac+9);

memset(custom_subject,0,128);
strcpy(custom_subject,nvram_get("subjectmail"));
if(strlen(custom_subject)!=0)
{
subject = custom_subjet;
}
else
if(strcmp(subject, "subject_log")==0)
{


On inverse les commentaires sur les lignes gérant l'adresse de l'expéditeur:


     from_addr  = nvram_get("frommail");
//from_addr = nvram_get("tomail");

Troisième étape: modification des pages Web:

on se place dans le répertoire user/boa/src/www_WW, et on modifie le fichier emailform.html


                        <td width="50%">
Send To This E-mail Address:
</td>
<td width="50%">
<img src="/img/spacer.gif" width="90" height="1" border=0><input type="text" name="toMail" value="<% nvram_get("tomail"); %>" size="24" maxlength="50">
</td>

</tr>

<!-- //begin hvdp -->
<tr>
<td width="50%">
Send From This E-mail Address:
</td>
<td width="50%">
<img src="/img/spacer.gif" width="90" height="1" border=0><input type="text" name="fromMail" value="<% nvram_get("frommail"); %>" size="24" maxlength="50">
</td>

</tr>
<tr>
<td width="50%">
Subject:
</td>
<td width="50%">
<img src="/img/spacer.gif" width="90" height="1" border=0><input type="text" name="subjectMail" value="<% nvram_get("subjectmail"); %>" size="24" maxlength="120">
</td>

</tr>
<!-- //end hvdp -->


 Il nous faut ensuite modifier le fichier user/boa/src/dni/dni_post.c pour soumettre les infos saisies dans l'interface web.


                { name: "toMail", longname: "toMail", nvram_name: "tomail" },
{ name: "fromMail", longname: "fromMail", nvram_name: "frommail" },
{ name: "subjectMail", longname: "subjectMail", nvram_name: "subjectmail" },

{ name: "AlertSelect", longname: "AlertSelect", nvram_name: "alerttype" },

 

Dernière étape: compilation

Nettoyage et rebuild: attention il est nécessaire d'effectuer un clean complet des fonctions utilisateur avant le rebuild, car la taille de certaines structures a changé.

cd user; make clean;cd ..;make
Si la construction se passe correctement, on obtient un fichier run.bix

Binary image ...KWGR614/KWGR614_V1.0.1_10.17WW/images/run.bin generated!
/home/hugo/KWGR614/KWGR614_V1.0.1_10.17WW/tools/packbin /home/hugo/KWGR614/KWGR614_V1.0.1_10.17WW/images/run.bin k 0 /home/hugo/KWGR614/KWGR614_V1.0.1_10.17WW/images/run.bix
date 2007/08/31 09:12:19
07d7081f 090c1300
Image Original Size = 0x1c2fe8
Magic Number = 0x47363134
Body Checksum = 0x96
Header Checksum = 0x1f
Binary image ...KWGR614/KWGR614_V1.0.1_10.17WW/images/run.bix generated!

Il ne reste plus qu'à réaliser un upgrade classique du routeur...

Voici l'affichage du statut du routeur, avec la nouvelle version du firmware:


menu mail firmware netgear


et voici le menu de configuration du mail:

menu config mail netgear firmware

 

Pour vous éviter la recopie des modifications présentées ci-dessus, voici un fichier patch à appliquer à la racine de votre distribution.


Previous page: Compilation du firmware
Next page: Enrichir les Logs