## modules/nt/notification.cc

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. NT_ntfy_filename_generate
2. NT_forwd_filename_generate
3. NT_crossntfy_filename_generate
4. NT_add_to_ntfy_hash
5. NT_add_to_frwd_hash
6. NT_add_to_ntfy_hash_list
7. NT_add_to_frwd_hash_list
8. NT_add_to_ntfy
9. NT_add_to_ntfy_list
10. NT_send_ntfy
11. NT_log_ntfy
12. NT_delete_ntfy
13. nt_gfunc_send
14. NT_send_ntfy_list
15. nt_gfunc_log
16. NT_log_ntfy_list
17. nt_gfunc_delete
18. NT_delete_ntfy_list
19. NT_gather_ntfy_addresses
20. NT_gather_frwd_addresses
21. NT_write_all_ntfs
22. NT_write_all_frwds

       1 /***************************************
       2   $Revision: 1.7 $
       3
       4   NT (Notifications) module
       5
       6   Status: NOT REVIEWED, NOT TESTED
       7
       8   Author(s):       Engin Gunduz
       9
      10   ******************/ /******************
      11   Modification History:
      12         engin (06/07/2000) Created.
      13   ******************/ /******************
      14   Copyright (c) 2000                              RIPE NCC
      15
      16   All Rights Reserved
      17
      18   Permission to use, copy, modify, and distribute this software and its
      19   documentation for any purpose and without fee is hereby granted,
      20   provided that the above copyright notice appear in all copies and that
      21   both that copyright notice and this permission notice appear in
      22   supporting documentation, and that the name of the author not be
      23   used in advertising or publicity pertaining to distribution of the
      24   software without specific, written prior permission.
      25
      26   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      27   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      28   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      29   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      30   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      31   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      32  ***************************************/
      33
      34
      35
      36
      37
      38
      39 #include "notification.h"
      40
      41
      42 /*  Generates a unique file name and returns the full path of the filename
      43     for storing notification message.  Creates the file at the same time.
      44     May use PID or time or both to ensure uniqueness.  */
      45
      46 char * NT_ntfy_filename_generate( const char * tmpdir, const char * e_mail){
         /* [<][>][^][v][top][bottom][index][help] */
      47
      48    FILE * ntfy_file;
      49    char * name;
      50
      51    /* allocate space for name.  32 should be enough for PID */
      52    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("notify") +32 );
      53
      54    sprintf(name, "%s/%s-%s.%i", tmpdir, "notify", e_mail, getpid());
      55
      56    /* create the file */
      57    if(( ntfy_file = fopen(name, "w")) == NULL){
      58      fprintf(stderr, "Can't open notification file, %s", name);
      59    }
      60
      61    fprintf(ntfy_file, "To: %s\nFrom: %s\nSubject: Notification of RIPE Database changes\nReply-To: %s\n\n%s\n", e_mail, humailbox, humailbox, notitxt);
      62    if(reading_from_mail){
      63      fprintf(ntfy_file, "%s\n\n", notimailtxt);
      64    }
      65    /* close it */
      66    fclose(ntfy_file);
      67
      68    return name;
      69
      70 }
      71
      72
      73
      74
      75
      76 /* Generates a unique file name and returns the full path of the filename
      77    for storing forwarded message. Creates the file at the same time.  */
      78 char * NT_forwd_filename_generate( const char * tmpdir, const char * e_mail){
         /* [<][>][^][v][top][bottom][index][help] */
      79
      80    FILE * forwd_file;
      81    char * name;
      82
      83    /* allocate space for name.  32 should be enough for PID */
      84    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("forwd") +32 );
      85
      86    sprintf(name, "%s/%s-%s.%i", tmpdir, "forwd", e_mail, getpid());
      87    //printf("DEBUG: NT_forwd_filename_generate: will generate %s\n", name);
      88    /* create the file */
      89    if(( forwd_file = fopen(name, "w")) == NULL){
      90      fprintf(stderr, "Can't open forward file, %s", name);
      91    }
      92
      93    fprintf(forwd_file, "To: %s\nFrom: %s\nSubject:  Requested RIPE database object changes \nReply-To: %s\n\n%s\n", e_mail, humailbox, humailbox, fwtxt);
      94    if(reading_from_mail){
      95      fprintf(forwd_file, "\n%s\n", fwmailtxt);
      96    }
      97
      98    /* close it */
      99    fclose(forwd_file);
     100
     101    return name;
     102
     103 }
     104
     105
     106
     107
     108
     109 /* Generates a unique file name and returns the full path of the filename for
     110    storing notification message. Creates the file at the same time.  */
     111 char * NT_crossntfy_filename_generate( const char * tmpdir, const char * e_mail){
         /* [<][>][^][v][top][bottom][index][help] */
     112    FILE * cross_file;
     113    char * name;
     114
     115    /* allocate space for name.  32 should be enough for PID */
     116    name = (char*)malloc(strlen(tmpdir) + strlen(e_mail) + strlen("cross") +32 );
     117
     118    sprintf(name, "%s/%s-%s.%i", tmpdir, "cross", e_mail, getpid());
     119
     120    /* create the file */
     121    if(( cross_file = fopen(name, "w")) == NULL){
     122      fprintf(stderr, "Can't open cross file, %s", name);
     123    }
     124
     125    /* close it */
     126    fclose(cross_file);
     127
     128    return name;
     129
     130 }
     131
     132
     133
     134
     135
     136 /* Adds the e-mail to the notify hash, generating appropriate temp files */
     137 void NT_add_to_ntfy_hash(GHashTable * ntfy_hash, char * e_mail){
         /* [<][>][^][v][top][bottom][index][help] */
     138
     139   if(g_hash_table_lookup(ntfy_hash ,e_mail) == NULL){/* there is no such entry, so create it */
     140     g_hash_table_insert(ntfy_hash, strdup(e_mail), NT_ntfy_filename_generate(tmpdir, e_mail));
     141   }
     142
     143 }
     144
     145
     146 /* Adds the e-mail to the forw hash, generating appropriate temp files */
     147 void NT_add_to_frwd_hash(GHashTable * frwd_hash, char * e_mail){
         /* [<][>][^][v][top][bottom][index][help] */
     148
     149   if(g_hash_table_lookup(frwd_hash ,e_mail) == NULL){/* there is no such entry, so create it */
     150     g_hash_table_insert(frwd_hash, strdup(e_mail), NT_forwd_filename_generate(tmpdir, e_mail));
     151   }
     152
     153 }
     154
     155
     156
     157 /* Adds the e-mails in a linked list to the hash */
     158 void NT_add_to_ntfy_hash_list(GHashTable * ntfy_hash, GSList * e_mail_list){
         /* [<][>][^][v][top][bottom][index][help] */
     159
     160    GSList * temp = NULL;
     161
     162    for(temp = e_mail_list; temp != NULL; temp = g_slist_next(temp)){
     163      NT_add_to_ntfy_hash(ntfy_hash, (char *)temp->data);
     164    }
     165
     166 }
     167
     168
     169
     170
     171 /* Adds the e-mails in a linked list to the hash */
     172 void NT_add_to_frwd_hash_list(GHashTable * frwd_hash, GSList * e_mail_list){
         /* [<][>][^][v][top][bottom][index][help] */
     173
     174    GSList * temp = NULL;
     175
     176    for(temp = e_mail_list; temp != NULL; temp = g_slist_next(temp)){
     177      NT_add_to_frwd_hash(frwd_hash, (char *)temp->data);
     178    }
     179
     180 }
     181
     182
     183
     184 /* Appends the argument strings to the file.  */
     185 void NT_add_to_ntfy( char * filename, char * fmt, ... ){
         /* [<][>][^][v][top][bottom][index][help] */
     186   va_list ap;  /* points to each unnamed arg in turn */
     187   FILE * ack_file;
     188
     189   if(tracing){
     190     printf("TRACING: NT_add_to_ntfy\n");
     191   }
     192   if(( ack_file = fopen(filename, "a")) == NULL){
     193     fprintf(stderr, "Can't open notification file, %s\n", filename);
     194   }
     195
     196   va_start(ap, fmt);
     197   vfprintf(ack_file, fmt, ap);
     198
     199   va_end(ap); /* clean up */
     200   fclose(ack_file);
     201 }
     202
     203
     204
     205
     206
     207 /* Appends the argument string to the temp notif files in the list */
     208 void NT_add_to_ntfy_list(GSList * list, GHashTable * hash, char * arg){
         /* [<][>][^][v][top][bottom][index][help] */
     209
     210   GSList * temp = NULL;
     211
     212   for(temp = list; temp != NULL; temp = g_slist_next(temp)){
     213     NT_add_to_ntfy((char *)g_hash_table_lookup(hash, ((char *)temp->data)), arg);
     214   }
     215 }
     216
     217
     218
     219
     220
     221
     222
     223
     224 /* Sends the notification message which is stored in the temporary filefilename.  */
     225 void NT_send_ntfy( const char * filename, const char * to_address, const char * mailercommand){
         /* [<][>][^][v][top][bottom][index][help] */
     226
     227     char * mail_command_line = NULL;
     228
     229     if(to_address != NULL){
     230       mail_command_line = (char *)malloc(strlen(mailercommand) + strlen(filename) + 128);
     231       sprintf(mail_command_line, "%s %s < %s", mailercommand, to_address, filename);
     232       system(mail_command_line);
     233     }
     234
     235 }
     236
     237
     238
     239 /* Adds the notification message which is in the filename into log_file. */
     240 void NT_log_ntfy( const char * filename, const char * logfilename){
         /* [<][>][^][v][top][bottom][index][help] */
     241
     242   FILE * notif_file, * log_file;
     243   char * buf;
     244
     245   buf = (char *)malloc(1024);
     246   if(( notif_file = fopen(filename, "r")) == NULL){
     247     fprintf(stderr, "Can't open notification file, [%s]\n", filename);
     248     return;
     249   }
     250
     251   if(( log_file = fopen(logfilename, "a")) == NULL){
     252     fprintf(stderr, "Can't open log file, %s\n", logfilename);
     253     return;
     254   }
     255
     256   /* must put real time here */
     257   fprintf(log_file, ">>> time: NOTIF <<<\n\n");
     258
     259
     260   while((buf=fgets(buf, 1023, notif_file)) > 0){
     261     fprintf(log_file, "%s", buf);
     262   }
     263
     264   fclose(notif_file);
     265   fclose(log_file);
     266
     267 }
     268
     269
     270 /* Deletes the temporary notification file. */
     271 void NT_delete_ntfy( const char * filename){
         /* [<][>][^][v][top][bottom][index][help] */
     272
     273    unlink(filename);
     274
     275 }
     276
     277
     278 /* The function required for NT_send_ntfy_list */
     279 void  nt_gfunc_send(gpointer key, gpointer value, gpointer user_data){
         /* [<][>][^][v][top][bottom][index][help] */
     280   NT_send_ntfy((char *)value, (char *)key, (char *)user_data);
     281 }
     282
     283
     284
     285 /* Sends the notification messages whose temp files are stored in filehash. */
     286 void NT_send_ntfy_list( GHashTable * filehash, char * mailercommand){
         /* [<][>][^][v][top][bottom][index][help] */
     287
     288   g_hash_table_foreach( filehash, (GHFunc)nt_gfunc_send, mailercommand);
     289
     290 }
     291
     292
     293
     294
     295 /* The function required for NT_log_ntfy_list */
     296 void  nt_gfunc_log(gpointer key, gpointer value, gpointer user_data){
         /* [<][>][^][v][top][bottom][index][help] */
     297   NT_log_ntfy((char *)value, (char *)user_data);
     298 }
     299
     300
     301
     302
     303 /* Logs the notification whose temp files are in filehash to log_file. */
     304 void NT_log_ntfy_list( GHashTable * filehash, char * log_file){
         /* [<][>][^][v][top][bottom][index][help] */
     305
     306    g_hash_table_foreach( filehash, (GHFunc)nt_gfunc_log, log_file);
     307
     308 }
     309
     310
     311
     312 /* The function required for NT_delete_ntfy_list */
     313 void  nt_gfunc_delete(gpointer key, gpointer value, gpointer user_data){
         /* [<][>][^][v][top][bottom][index][help] */
     314   NT_delete_ntfy((char *)value);
     315 }
     316
     317
     318
     319 /* Deletes the temporary notification messages in the filehash. Empties and frees
     320    the hash too.  */
     321 void NT_delete_ntfy_list( GHashTable * filehash){
         /* [<][>][^][v][top][bottom][index][help] */
     322
     323   g_hash_table_foreach(filehash, (GHFunc)nt_gfunc_delete, NULL);
     324   g_hash_table_destroy(filehash);
     325
     326 }
     327
     328
     329 /* Gathers e-mail boxes to which we will send normal notification messages. It
     330    takes old and new objects, looks up maintainers and less specific inetnums/domains/routes
     331    when necessary, finds the addresses (in mnt-nfy and notify attributes) and returns
     332    a list of them. */
     333 GSList * NT_gather_ntfy_addresses( char * old_object, char * new_object){
         /* [<][>][^][v][top][bottom][index][help] */
     334   GSList *temp = NULL;
     335   GSList * mntners = NULL;
     336
     337   if(old_object != NULL && new_object != NULL){/* it was an update */
     338     temp = get_attr_list(old_object, "notify");
     339     mntners = get_mntners(old_object);
     340     temp = g_slist_concat(temp, get_mntnfy_vector(mntners));
     341   }else if(old_object == NULL && new_object != NULL){/* it was a creation */
     342     temp = get_attr_list(new_object, "notify");
     343     mntners = get_mntners(new_object);
     344     temp = g_slist_concat(temp, get_mntnfy_vector(mntners));
     345   }else if(old_object != NULL && new_object == NULL){/* it was a deletion */
     346     temp = get_attr_list(old_object, "notify");
     347     mntners = get_mntners(old_object);
     348     temp = g_slist_concat(temp, get_mntnfy_vector(mntners));
     349   }
     350   return temp;
     351 }
     352
     353
     354
     355 /* Gathers e-mail boxes to which we will forward messages (or rather, objects). It
     356    an object, looks up maintainers, finds the addresses (in upd-to attributes) and returns
     357    a list of them. */
     358 GSList * NT_gather_frwd_addresses(char * object){
         /* [<][>][^][v][top][bottom][index][help] */
     359   GSList *temp = NULL;
     360   GSList * mntners = NULL;
     361
     362   mntners = get_mntners(object);
     363   temp = get_updto_vector(mntners);
     364   return temp;
     365 }
     366
     367
     368
     369
     370
     371
     372 /* Gets old and new versions of the object, and creates temporary notification
     373    files when necessary, and then writes appropriate strings into those
     374    temporary files. */
     375 void NT_write_all_ntfs(char * old_object, char * new_object, /*const char * notif_log,
         /* [<][>][^][v][top][bottom][index][help] */
     376                        const char * forw_log,    const char * cross_log,*/ const char * tempdir,
     377                        GHashTable * ntfy_hash,  GHashTable * forwd_hash, GHashTable * cross_hash,
     378                        const char * from_address){
     379
     380    GSList * e_mail_list = NULL;
     381
     382
     383    if(tracing){
     384      printf("TRACING: NT_write_all_ntfs\n");
     385    }
     386    if(old_object != NULL && new_object != NULL){/* it was an update */
     387      e_mail_list = NT_gather_ntfy_addresses(old_object, new_object);
     388      NT_add_to_ntfy_hash_list(ntfy_hash, e_mail_list);
     389      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "---\nPREVIOUS OBJECT:\n\n");
     390      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, old_object);
     391      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n\nREPLACED BY:\n\n");
     392      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, new_object);
     393      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n");
     394    }else if(old_object == NULL && new_object != NULL){/* it was a creation */
     395      e_mail_list = NT_gather_ntfy_addresses(old_object, new_object);
     396      NT_add_to_ntfy_hash_list(ntfy_hash, e_mail_list);
     397      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "---\nOBJECT BELOW CREATED:\n\n");
     398      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, new_object);
     399      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n");
     400    }else if(old_object != NULL && new_object == NULL){/* it was a deletion */
     401      e_mail_list = NT_gather_ntfy_addresses(old_object, new_object);
     402      NT_add_to_ntfy_hash_list(ntfy_hash, e_mail_list);
     403      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "---\nOBJECT BELOW DELETED:\n\n");
     404      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, old_object);
     405      NT_add_to_ntfy_list(e_mail_list, ntfy_hash, "\n");
     406    }
     407 }
     408
     409
     410
     411
     412
     413 /* Gets old and new versions of the object, and creates temporary notification
     414    files when necessary, and then writes appropriate strings into those
     415    temporary files. */
     416 void NT_write_all_frwds(char * old_object, char * new_object, /*const char * notif_log,
         /* [<][>][^][v][top][bottom][index][help] */
     417                        const char * forw_log,    const char * cross_log,*/ const char * tempdir,
     418                        GHashTable * ntfy_hash,  GHashTable * forwd_hash, GHashTable * cross_hash,
     419                        const char * from_address){
     420
     421    GSList * e_mail_list = NULL;
     422
     423
     424    if(tracing){
     425      printf("TRACING: NT_write_all_frwds\n");
     426    }
     427    if(old_object != NULL && new_object != NULL){/* it was an update */
     428      e_mail_list = NT_gather_frwd_addresses(old_object);
     429      NT_add_to_frwd_hash_list(forwd_hash, e_mail_list);
     430      NT_add_to_ntfy_list(e_mail_list, forwd_hash, "----\nUPDATE REQUESTED FOR:\n\n");
     431      //NT_add_to_ntfy_list(e_mail_list, forwd_hash, old_object);
     432      //NT_add_to_ntfy_list(e_mail_list, forwd_hash, "\n\n");
     433      NT_add_to_ntfy_list(e_mail_list, forwd_hash, new_object);
     434    }else if(old_object == NULL && new_object != NULL){/* it was a creation */
     435      e_mail_list = NT_gather_frwd_addresses(new_object);
     436      NT_add_to_frwd_hash_list(forwd_hash, e_mail_list);
     437      NT_add_to_ntfy_list(e_mail_list, forwd_hash, "----\nADDITION REQUESTED FOR:\n\n");
     438      NT_add_to_ntfy_list(e_mail_list, forwd_hash, new_object);
     439    }else if(old_object != NULL && new_object == NULL){/* it was a deletion */
     440      e_mail_list = NT_gather_frwd_addresses(old_object);
     441      NT_add_to_frwd_hash_list(forwd_hash, e_mail_list);
     442      NT_add_to_ntfy_list(e_mail_list, forwd_hash, "----\nDELETION REQUESTED FOR:\n\n");
     443      NT_add_to_ntfy_list(e_mail_list, forwd_hash, old_object);
     444    }
     445 }
     446

/* [<][>][^][v][top][bottom][index][help] */