root/trunk/src/renetcolAgg.c @ 60

Revision 60, 28.1 KB (checked in by andreu, 15 years ago)

new aggregation mode based on SNMP index and AS aggregation

  • Property svn:eol-style set to native
Line 
1/*
2 * File: renetcolAgg.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2007 GIP RENATER
7 */
8
9/*  This file is part of renetcol.
10 *
11 *  renetcol is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation; either version 2 of the License, or
14 *  (at your option) any later version.
15 *
16 *  renetcol is distributed in the hope that it will be useful,
17 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 *  GNU General Public License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License
22 *  along with renetcol; if not, write to the Free Software
23 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24 */
25
26/*
27 * In this file, I use directly the C rrd librairy to create and update
28 * the rrd files which contain the statistique for each subnet.
29 * When your system is too fast and the number of your subnet too big
30 * (> 1024), the create and update process can be too fast and before the
31 * creation end the maximum number of files which can be opened for one process
32 * in the same time is reached. So we must temporize.
33 */
34
35#include "renetcolAgg.h"
36
37struct SHMForAgg *shmForAgg;
38
39int
40main(int argc, char *argv[])
41{
42  int shmid;
43  int i, j, k = 0;
44  int index = 1;
45  int rrd_update_er_ct = 0;
46  int rrd_update_ok_ct = 0;
47  int rrd_already_created_ct = 0;
48  int rrd_create_er_ct = 0;
49  int rrd_create_ok_ct = 0;
50  int isFirstUpdate = 1;
51  key_t key;
52  static char buf[2048];
53  static char name[2048];
54  static char ipStr[24];
55  static char indexStr[24];
56  static char asStr[7];
57  static char createstr[2048];
58  char *opt[27];
59  char *optUpdate[3];
60  FILE *fp;
61  static time_t now, now2;
62 
63  key = 8765;
64  if ((shmid = shmget(key, SHMSIZE, 0666)) < 0) {
65    perror("shmget");
66    exit(1);
67  }
68  if ((shmForAgg = (struct SHMForAgg *)shmat(shmid, (void *)0, 0)) == (void *) -1) {
69    perror("shmat");
70    exit(1);
71  }
72 
73  fprintf(stderr, "renetcolAgg: I become a deamon, next messages via syslogd. By.\n");
74  if (fork () != 0)
75    exit (0);
76  if (setsid() == -1){
77    exit(4);
78  }
79 
80  do {
81    if (shmForAgg->readed == 1) {
82      shmForAgg->readed = 0;
83      if (shmForAgg->currentTable == 0) {
84        index = 1;
85      }else{
86        index = 0;
87      }
88      now = time((time_t *)NULL);
89      if (isFirstUpdate == 0) {
90        /* RRD ACCOUNTING for prefixV4Tab */
91        for (i=0; i<shmForAgg->v4PrefixNb; i++){
92          /* HERE create or update RRD FILE */
93          if (shmForAgg->prefixV4Tab[index][i].sampling != 0) {
94            for (j=0; j<strlen(name); j++) {name[j] = '\0';}
95            for (j=0; j<strlen(createstr); j++) {createstr[j] = '\0';}
96            for (j=0; j<strlen(ipStr); j++) {ipStr[j] = '\0';}
97            for (j=0; j<strlen(buf); j++) {buf[j] = '\0';}
98            strcat(name, PREFIX_RRD_LOCATION);
99            sprintf(ipStr, "%lu_%lu_%lu_%lu_%hu_%lu",
100                    shmForAgg->prefixV4Tab[index][i].beginning>>24,
101                    shmForAgg->prefixV4Tab[index][i].beginning<<8>>24,
102                    shmForAgg->prefixV4Tab[index][i].beginning<<16>>24,
103                    shmForAgg->prefixV4Tab[index][i].beginning<<24>>24,
104                    shmForAgg->prefixV4Tab[index][i].mask,
105                    shmForAgg->prefixV4Tab[index][i].sampling
106                    );
107            strcat(name, ipStr);
108            strcat(name, RRD_EXTENSION);
109            if ( (fp=fopen(name,"r")) == NULL ){
110              opt[0]= (char *) malloc((strlen(RRD_PARAM_PREFIX_0) + 1) * sizeof(char));
111              strcpy(opt[0], RRD_PARAM_PREFIX_0);
112              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
113              strcpy(opt[1], name);
114              opt[2]= (char *) malloc((strlen(RRD_PARAM_PREFIX_1) + 1) * sizeof(char));
115              strcpy(opt[2], RRD_PARAM_PREFIX_1);
116              opt[3]= (char *) malloc((strlen(RRD_PARAM_PREFIX_2) + 1) * sizeof(char));
117              strcpy(opt[3], RRD_PARAM_PREFIX_2);
118              opt[4]= (char *) malloc((strlen(RRD_PARAM_PREFIX_3) + 1) * sizeof(char));
119              strcpy(opt[4], RRD_PARAM_PREFIX_3);
120              opt[5]= (char *) malloc((strlen(RRD_PARAM_PREFIX_4) + 1) * sizeof(char));
121              strcpy(opt[5], RRD_PARAM_PREFIX_4);
122              opt[6]= (char *) malloc((strlen(RRD_PARAM_PREFIX_5) + 1) * sizeof(char));
123              strcpy(opt[6], RRD_PARAM_PREFIX_5);
124              opt[7]= (char *) malloc((strlen(RRD_PARAM_PREFIX_6) + 1) * sizeof(char));
125              strcpy(opt[7], RRD_PARAM_PREFIX_6);
126              opt[8]= (char *) malloc((strlen(RRD_PARAM_PREFIX_7) + 1) * sizeof(char));
127              strcpy(opt[8], RRD_PARAM_PREFIX_7);
128              opt[9]= (char *) malloc((strlen(RRD_PARAM_PREFIX_8) + 1) * sizeof(char));
129              strcpy(opt[9], RRD_PARAM_PREFIX_8);
130              opt[10]= (char *) malloc((strlen(RRD_PARAM_PREFIX_9) + 1) * sizeof(char));
131              strcpy(opt[10], RRD_PARAM_PREFIX_9);
132              opt[11]= (char *) malloc((strlen(RRD_PARAM_PREFIX_10) + 1) * sizeof(char));
133              strcpy(opt[11], RRD_PARAM_PREFIX_10);
134              opt[12]= (char *) malloc((strlen(RRD_PARAM_PREFIX_11) + 1) * sizeof(char));
135              strcpy(opt[12], RRD_PARAM_PREFIX_11);
136              opt[13]= (char *) malloc((strlen(RRD_PARAM_PREFIX_12) + 1) * sizeof(char));
137              strcpy(opt[13], RRD_PARAM_PREFIX_12);
138              opt[14]= (char *) malloc((strlen(RRD_PARAM_PREFIX_13) + 1) * sizeof(char));
139              strcpy(opt[14], RRD_PARAM_PREFIX_13);
140              opt[15]= (char *) malloc((strlen(RRD_PARAM_PREFIX_14) + 1) * sizeof(char));
141              strcpy(opt[15], RRD_PARAM_PREFIX_14);
142              opt[16]= (char *) malloc((strlen(RRD_PARAM_PREFIX_15) + 1) * sizeof(char));
143              strcpy(opt[16], RRD_PARAM_PREFIX_15);
144              opt[17]= (char *) malloc((strlen(RRD_PARAM_PREFIX_16) + 1) * sizeof(char));
145              strcpy(opt[17], RRD_PARAM_PREFIX_16);
146              opt[18]= (char *) malloc((strlen(RRD_PARAM_PREFIX_17) + 1) * sizeof(char));
147              strcpy(opt[18], RRD_PARAM_PREFIX_17);
148              opt[19]= (char *) malloc((strlen(RRD_PARAM_PREFIX_18) + 1) * sizeof(char));
149              strcpy(opt[19], RRD_PARAM_PREFIX_18);
150              opt[20]= (char *) malloc((strlen(RRD_PARAM_PREFIX_19) + 1) * sizeof(char));
151              strcpy(opt[20], RRD_PARAM_PREFIX_19);
152              opt[21]= (char *) malloc((strlen(RRD_PARAM_PREFIX_20) + 1) * sizeof(char));
153              strcpy(opt[21], RRD_PARAM_PREFIX_20);
154              opt[22]= (char *) malloc((strlen(RRD_PARAM_PREFIX_21) + 1) * sizeof(char));
155              strcpy(opt[22], RRD_PARAM_PREFIX_21);
156              opt[23]= (char *) malloc((strlen(RRD_PARAM_PREFIX_22) + 1) * sizeof(char));
157              strcpy(opt[23], RRD_PARAM_PREFIX_22);
158              opt[24]= (char *) malloc((strlen(RRD_PARAM_PREFIX_23) + 1) * sizeof(char));
159              strcpy(opt[24], RRD_PARAM_PREFIX_23);
160              opt[25]= (char *) malloc((strlen(RRD_PARAM_PREFIX_24) + 1) * sizeof(char));
161              strcpy(opt[25], RRD_PARAM_PREFIX_24);
162              opt[26]= (char *) malloc((strlen(RRD_PARAM_PREFIX_25) + 1) * sizeof(char));
163              strcpy(opt[26], RRD_PARAM_PREFIX_25);
164              optind = opterr = 0;
165              rrd_clear_error();
166              if ( rrd_create(27,opt) < 0) {
167                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
168                rrd_create_er_ct++;
169              } else {
170                rrd_create_ok_ct++;
171              }
172              for ( j=0; j<27; j++) {
173                free(opt[j]);
174                opt[j] = NULL;
175              }
176            }else{
177              fclose(fp);
178              rrd_already_created_ct++;
179              snprintf(buf,
180                       2048,
181                       "%lu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu"
182                       now-300,  /* or ctime(&now) with %s */
183                       shmForAgg->prefixV4Tab[index][i].flowNbIN,  /* 1 */
184                       shmForAgg->prefixV4Tab[index][i].flowNbOUT,
185                       shmForAgg->prefixV4Tab[index][i].bytesNbIN,
186                       shmForAgg->prefixV4Tab[index][i].bytesNbOUT,
187                       shmForAgg->prefixV4Tab[index][i].pktsNbIN,  /* 5 */
188                       shmForAgg->prefixV4Tab[index][i].pktsNbOUT,
189                       shmForAgg->prefixV4Tab[index][i].firstCoSIN,
190                       shmForAgg->prefixV4Tab[index][i].firstCoSOUT,
191                       shmForAgg->prefixV4Tab[index][i].secondCoSIN,
192                       shmForAgg->prefixV4Tab[index][i].secondCoSOUT,
193                       shmForAgg->prefixV4Tab[index][i].thirdCoSIN,
194                       shmForAgg->prefixV4Tab[index][i].thirdCoSOUT,
195                       shmForAgg->prefixV4Tab[index][i].fourthCoSIN,
196                       shmForAgg->prefixV4Tab[index][i].fourthCoSOUT
197                       );
198              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
199              strcpy(optUpdate[0], RRD_UPDATE_0);
200              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
201              strcpy(optUpdate[1], name);
202              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
203              strcpy(optUpdate[2], buf);
204              optind = opterr = 0;
205              rrd_clear_error();
206              if ( rrd_update(3, optUpdate) < 0 ) {
207                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
208                rrd_update_er_ct++;
209              } else {
210                rrd_update_ok_ct++;
211              }
212              for ( j=0; j<3; j++) {
213                free(optUpdate[j]);
214                optUpdate[j] = NULL;
215              }
216            }
217            /* Reinit the shared tables */
218            shmForAgg->prefixV4Tab[index][i].flowNbIN = 0;
219            shmForAgg->prefixV4Tab[index][i].bytesNbIN = 0;
220            shmForAgg->prefixV4Tab[index][i].pktsNbIN = 0;
221            shmForAgg->prefixV4Tab[index][i].flowNbOUT = 0;
222            shmForAgg->prefixV4Tab[index][i].bytesNbOUT = 0;
223            shmForAgg->prefixV4Tab[index][i].pktsNbOUT = 0;
224            shmForAgg->prefixV4Tab[index][i].firstCoSIN = 0;
225            shmForAgg->prefixV4Tab[index][i].secondCoSIN = 0;
226            shmForAgg->prefixV4Tab[index][i].thirdCoSIN = 0;
227            shmForAgg->prefixV4Tab[index][i].fourthCoSIN = 0;
228            shmForAgg->prefixV4Tab[index][i].firstCoSOUT = 0;
229            shmForAgg->prefixV4Tab[index][i].secondCoSOUT = 0;
230            shmForAgg->prefixV4Tab[index][i].thirdCoSOUT = 0;
231            shmForAgg->prefixV4Tab[index][i].fourthCoSOUT = 0;
232          }
233        }
234        /* ACCOUNTING for prefixV4SubnetTab */
235        for (i=0; i<shmForAgg->v4PrefixNb; i++){
236          /* HERE create or update RRD FILE */
237          if (shmForAgg->prefixV4SubnetTab[index][i].sampling != 0) {
238            for (j=0; j<strlen(name); j++) {name[j] = '\0';}
239            for (j=0; j<strlen(createstr); j++) {createstr[j] = '\0';}
240            for (j=0; j<strlen(ipStr); j++) {ipStr[j] = '\0';}
241            for (j=0; j<strlen(buf); j++) {buf[j] = '\0';}
242            strcat(name, PREFIX_RRD_LOCATION);
243            sprintf(ipStr, "%lu_%lu_%lu_%lu_%hu_%lu",
244                    shmForAgg->prefixV4SubnetTab[index][i].beginning>>24,
245                    shmForAgg->prefixV4SubnetTab[index][i].beginning<<8>>24,
246                    shmForAgg->prefixV4SubnetTab[index][i].beginning<<16>>24,
247                    shmForAgg->prefixV4SubnetTab[index][i].beginning<<24>>24,
248                    shmForAgg->prefixV4SubnetTab[index][i].mask,
249                    shmForAgg->prefixV4SubnetTab[index][i].sampling
250                    );
251            strcat(name, ipStr);
252            strcat(name, RRD_EXTENSION);
253            if ( (fp=fopen(name,"r")) == NULL ){
254              opt[0]= (char *) malloc((strlen(RRD_PARAM_PREFIX_0) + 1) * sizeof(char));
255              strcpy(opt[0], RRD_PARAM_PREFIX_0);
256              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
257              strcpy(opt[1], name);
258              opt[2]= (char *) malloc((strlen(RRD_PARAM_PREFIX_1) + 1) * sizeof(char));
259              strcpy(opt[2], RRD_PARAM_PREFIX_1);
260              opt[3]= (char *) malloc((strlen(RRD_PARAM_PREFIX_2) + 1) * sizeof(char));
261              strcpy(opt[3], RRD_PARAM_PREFIX_2);
262              opt[4]= (char *) malloc((strlen(RRD_PARAM_PREFIX_3) + 1) * sizeof(char));
263              strcpy(opt[4], RRD_PARAM_PREFIX_3);
264              opt[5]= (char *) malloc((strlen(RRD_PARAM_PREFIX_4) + 1) * sizeof(char));
265              strcpy(opt[5], RRD_PARAM_PREFIX_4);
266              opt[6]= (char *) malloc((strlen(RRD_PARAM_PREFIX_5) + 1) * sizeof(char));
267              strcpy(opt[6], RRD_PARAM_PREFIX_5);
268              opt[7]= (char *) malloc((strlen(RRD_PARAM_PREFIX_6) + 1) * sizeof(char));
269              strcpy(opt[7], RRD_PARAM_PREFIX_6);
270              opt[8]= (char *) malloc((strlen(RRD_PARAM_PREFIX_7) + 1) * sizeof(char));
271              strcpy(opt[8], RRD_PARAM_PREFIX_7);
272              opt[9]= (char *) malloc((strlen(RRD_PARAM_PREFIX_8) + 1) * sizeof(char));
273              strcpy(opt[9], RRD_PARAM_PREFIX_8);
274              opt[10]= (char *) malloc((strlen(RRD_PARAM_PREFIX_9) + 1) * sizeof(char));
275              strcpy(opt[10], RRD_PARAM_PREFIX_9);
276              opt[11]= (char *) malloc((strlen(RRD_PARAM_PREFIX_10) + 1) * sizeof(char));
277              strcpy(opt[11], RRD_PARAM_PREFIX_10);
278              opt[12]= (char *) malloc((strlen(RRD_PARAM_PREFIX_11) + 1) * sizeof(char));
279              strcpy(opt[12], RRD_PARAM_PREFIX_11);
280              opt[13]= (char *) malloc((strlen(RRD_PARAM_PREFIX_12) + 1) * sizeof(char));
281              strcpy(opt[13], RRD_PARAM_PREFIX_12);
282              opt[14]= (char *) malloc((strlen(RRD_PARAM_PREFIX_13) + 1) * sizeof(char));
283              strcpy(opt[14], RRD_PARAM_PREFIX_13);
284              opt[15]= (char *) malloc((strlen(RRD_PARAM_PREFIX_14) + 1) * sizeof(char));
285              strcpy(opt[15], RRD_PARAM_PREFIX_14);
286              opt[16]= (char *) malloc((strlen(RRD_PARAM_PREFIX_15) + 1) * sizeof(char));
287              strcpy(opt[16], RRD_PARAM_PREFIX_15);
288              opt[17]= (char *) malloc((strlen(RRD_PARAM_PREFIX_16) + 1) * sizeof(char));
289              strcpy(opt[17], RRD_PARAM_PREFIX_16);
290              opt[18]= (char *) malloc((strlen(RRD_PARAM_PREFIX_17) + 1) * sizeof(char));
291              strcpy(opt[18], RRD_PARAM_PREFIX_17);
292              opt[19]= (char *) malloc((strlen(RRD_PARAM_PREFIX_18) + 1) * sizeof(char));
293              strcpy(opt[19], RRD_PARAM_PREFIX_18);
294              opt[20]= (char *) malloc((strlen(RRD_PARAM_PREFIX_19) + 1) * sizeof(char));
295              strcpy(opt[20], RRD_PARAM_PREFIX_19);
296              opt[21]= (char *) malloc((strlen(RRD_PARAM_PREFIX_20) + 1) * sizeof(char));
297              strcpy(opt[21], RRD_PARAM_PREFIX_20);
298              opt[22]= (char *) malloc((strlen(RRD_PARAM_PREFIX_21) + 1) * sizeof(char));
299              strcpy(opt[22], RRD_PARAM_PREFIX_21);
300              opt[23]= (char *) malloc((strlen(RRD_PARAM_PREFIX_22) + 1) * sizeof(char));
301              strcpy(opt[23], RRD_PARAM_PREFIX_22);
302              opt[24]= (char *) malloc((strlen(RRD_PARAM_PREFIX_23) + 1) * sizeof(char));
303              strcpy(opt[24], RRD_PARAM_PREFIX_23);
304              opt[25]= (char *) malloc((strlen(RRD_PARAM_PREFIX_24) + 1) * sizeof(char));
305              strcpy(opt[25], RRD_PARAM_PREFIX_24);
306              opt[26]= (char *) malloc((strlen(RRD_PARAM_PREFIX_25) + 1) * sizeof(char));
307              strcpy(opt[26], RRD_PARAM_PREFIX_25);
308              optind = opterr = 0;
309              rrd_clear_error();
310              if ( rrd_create(27,opt) < 0) {
311                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
312                rrd_create_er_ct++;
313              } else {
314                rrd_create_ok_ct++;
315              }
316              for ( j=0; j<27; j++) {
317                free(opt[j]);
318                opt[j] = NULL;
319              }
320            }else{
321              fclose(fp);
322              rrd_already_created_ct++;
323              snprintf(buf,
324                       2048,
325                       "%lu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu"
326                       now-300,  /* or ctime(&now) with %s */
327                       shmForAgg->prefixV4SubnetTab[index][i].flowNbIN,  /* 1 */
328                       shmForAgg->prefixV4SubnetTab[index][i].flowNbOUT,
329                       shmForAgg->prefixV4SubnetTab[index][i].bytesNbIN,
330                       shmForAgg->prefixV4SubnetTab[index][i].bytesNbOUT,
331                       shmForAgg->prefixV4SubnetTab[index][i].pktsNbIN,  /* 5 */
332                       shmForAgg->prefixV4SubnetTab[index][i].pktsNbOUT,
333                       shmForAgg->prefixV4SubnetTab[index][i].firstCoSIN,
334                       shmForAgg->prefixV4SubnetTab[index][i].firstCoSOUT,
335                       shmForAgg->prefixV4SubnetTab[index][i].secondCoSIN,
336                       shmForAgg->prefixV4SubnetTab[index][i].secondCoSOUT,
337                       shmForAgg->prefixV4SubnetTab[index][i].thirdCoSIN,
338                       shmForAgg->prefixV4SubnetTab[index][i].thirdCoSOUT,
339                       shmForAgg->prefixV4SubnetTab[index][i].fourthCoSIN,
340                       shmForAgg->prefixV4SubnetTab[index][i].fourthCoSOUT
341                       );
342              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
343              strcpy(optUpdate[0], RRD_UPDATE_0);
344              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
345              strcpy(optUpdate[1], name);
346              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
347              strcpy(optUpdate[2], buf);
348              optind = opterr = 0;
349              rrd_clear_error();
350              if ( rrd_update(3, optUpdate) < 0 ) {
351                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
352                rrd_update_er_ct++;
353              } else {
354                rrd_update_ok_ct++;
355              }
356              for ( j=0; j<3; j++) {
357                free(optUpdate[j]);
358                optUpdate[j] = NULL;
359              }
360            }
361            /* Reinit the shared tables */
362            shmForAgg->prefixV4SubnetTab[index][i].flowNbIN = 0;
363            shmForAgg->prefixV4SubnetTab[index][i].bytesNbIN = 0;
364            shmForAgg->prefixV4SubnetTab[index][i].pktsNbIN = 0;
365            shmForAgg->prefixV4SubnetTab[index][i].flowNbOUT = 0;
366            shmForAgg->prefixV4SubnetTab[index][i].bytesNbOUT = 0;
367            shmForAgg->prefixV4SubnetTab[index][i].pktsNbOUT = 0;
368            shmForAgg->prefixV4SubnetTab[index][i].firstCoSIN = 0;
369            shmForAgg->prefixV4SubnetTab[index][i].secondCoSIN = 0;
370            shmForAgg->prefixV4SubnetTab[index][i].thirdCoSIN = 0;
371            shmForAgg->prefixV4SubnetTab[index][i].fourthCoSIN = 0;
372            shmForAgg->prefixV4SubnetTab[index][i].firstCoSOUT = 0;
373            shmForAgg->prefixV4SubnetTab[index][i].secondCoSOUT = 0;
374            shmForAgg->prefixV4SubnetTab[index][i].thirdCoSOUT = 0;
375            shmForAgg->prefixV4SubnetTab[index][i].fourthCoSOUT = 0;
376          }
377        }
378#if defined(MATRIX) && defined(IPV4AGGIDR)
379        /* MATRIX INTER POP ACCOUNTING */
380        /* rrd */
381        for (i=0; i<ROUTER_INDEX_MAX; i++){
382          for (j=0; j<ROUTER_INDEX_MAX; j++){
383            /* HERE create or update RRD FILE */
384            for (k=0; k<strlen(name); k++) {name[k] = '\0';}
385            for (k=0; k<strlen(createstr); k++) {createstr[k] = '\0';}
386            for (k=0; k<strlen(indexStr); k++) {indexStr[k] = '\0';}
387            for (k=0; k<strlen(buf); k++) {buf[k] = '\0';}
388            strcat(name, MATRIX_RRD_LOCATION);
389            sprintf(indexStr, "%d_%d",
390                    i,
391                    j
392                    );
393            strcat(name, indexStr);
394            strcat(name, RRD_EXTENSION);
395            if ( (fp=fopen(name,"r")) == NULL ){
396              opt[0]= (char *) malloc((strlen(RRD_PARAM_MATRIX_0) + 1) * sizeof(char));
397              strcpy(opt[0], RRD_PARAM_MATRIX_0);
398              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
399              strcpy(opt[1], name);
400              opt[2]= (char *) malloc((strlen(RRD_PARAM_MATRIX_1) + 1) * sizeof(char));
401              strcpy(opt[2], RRD_PARAM_MATRIX_1);
402              opt[3]= (char *) malloc((strlen(RRD_PARAM_MATRIX_2) + 1) * sizeof(char));
403              strcpy(opt[3], RRD_PARAM_MATRIX_2);
404              opt[4]= (char *) malloc((strlen(RRD_PARAM_MATRIX_3) + 1) * sizeof(char));
405              strcpy(opt[4], RRD_PARAM_MATRIX_3);
406              opt[5]= (char *) malloc((strlen(RRD_PARAM_MATRIX_4) + 1) * sizeof(char));
407              strcpy(opt[5], RRD_PARAM_MATRIX_4);
408              opt[6]= (char *) malloc((strlen(RRD_PARAM_MATRIX_5) + 1) * sizeof(char));
409              strcpy(opt[6], RRD_PARAM_MATRIX_5);
410              opt[7]= (char *) malloc((strlen(RRD_PARAM_MATRIX_6) + 1) * sizeof(char));
411              strcpy(opt[7], RRD_PARAM_MATRIX_6);
412              opt[8]= (char *) malloc((strlen(RRD_PARAM_MATRIX_7) + 1) * sizeof(char));
413              strcpy(opt[8], RRD_PARAM_MATRIX_7);
414              opt[9]= (char *) malloc((strlen(RRD_PARAM_MATRIX_8) + 1) * sizeof(char));
415              strcpy(opt[9], RRD_PARAM_MATRIX_8);
416              opt[10]= (char *) malloc((strlen(RRD_PARAM_MATRIX_9) + 1) * sizeof(char));
417              strcpy(opt[10], RRD_PARAM_MATRIX_9);
418              opt[11]= (char *) malloc((strlen(RRD_PARAM_MATRIX_10) + 1) * sizeof(char));
419              strcpy(opt[11], RRD_PARAM_MATRIX_10);
420              opt[12]= (char *) malloc((strlen(RRD_PARAM_MATRIX_11) + 1) * sizeof(char));
421              strcpy(opt[12], RRD_PARAM_MATRIX_11);
422              opt[13]= (char *) malloc((strlen(RRD_PARAM_MATRIX_12) + 1) * sizeof(char));
423              strcpy(opt[13], RRD_PARAM_MATRIX_12);
424              opt[14]= (char *) malloc((strlen(RRD_PARAM_MATRIX_13) + 1) * sizeof(char));
425              strcpy(opt[14], RRD_PARAM_MATRIX_13);
426              opt[15]= (char *) malloc((strlen(RRD_PARAM_MATRIX_14) + 1) * sizeof(char));
427              strcpy(opt[15], RRD_PARAM_MATRIX_14);
428              optind = opterr = 0;
429              rrd_clear_error();
430              if ( rrd_create(16,opt) < 0) {
431                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
432                rrd_create_er_ct++;
433              } else {
434                rrd_create_ok_ct++;
435              }
436              for ( k=0; k<16; k++) {
437                free(opt[k]);
438                opt[k] = NULL;
439              }
440            }else{
441              fclose(fp);
442              rrd_already_created_ct++;
443              snprintf(buf,
444                       2048,
445                       "%lu:%llu:%llu:%llu"
446                       now-300,  /* or ctime(&now) with %s */
447                       shmForAgg->matrixPOP[index][i][j].flowNb,
448                       shmForAgg->matrixPOP[index][i][j].bytesNb,
449                       shmForAgg->matrixPOP[index][i][j].pktsNb
450                       );
451              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
452              strcpy(optUpdate[0], RRD_UPDATE_0);
453              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
454              strcpy(optUpdate[1], name);
455              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
456              strcpy(optUpdate[2], buf);
457              optind = opterr = 0;
458              rrd_clear_error();
459              if ( rrd_update(3, optUpdate) < 0 ) {
460                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
461                rrd_update_er_ct++;
462              } else {
463                rrd_update_ok_ct++;
464              }
465              for ( k=0; k<3; k++) {
466                free(optUpdate[k]);
467                optUpdate[k] = NULL;
468              }
469            }
470
471          }
472        }
473        /* reinit */
474        for (i=0; i<ROUTER_INDEX_MAX; i++){
475          for (j=0; j<ROUTER_INDEX_MAX; j++) {
476            shmForAgg->matrixPOP[index][i][j].bytesNb = 0;
477            shmForAgg->matrixPOP[index][i][j].pktsNb = 0;
478            shmForAgg->matrixPOP[index][i][j].flowNb = 0;
479          }
480        }
481        /* END MATRIX INTER POP ACC */
482#endif /* MATRIX */
483#ifdef ASACC
484        /*
485         *
486         * AS ACCOUNTING
487         *
488         */
489        for (i=0; i<shmForAgg->ASNb; i++){
490          /* HERE create or update RRD FILE */
491          if (shmForAgg->ASTab[index][i].sampling != 0) {
492            for (j=0; j<strlen(name); j++) {name[j] = '\0';}
493            for (j=0; j<strlen(createstr); j++) {createstr[j] = '\0';}
494            for (j=0; j<strlen(asStr); j++) {asStr[j] = '\0';}
495            for (j=0; j<strlen(buf); j++) {buf[j] = '\0';}
496            strcat(name, AS_RRD_LOCATION);
497            sprintf(asStr, "%hu_%lu",
498                    shmForAgg->ASTab[index][i].as,
499                    shmForAgg->ASTab[index][i].sampling
500                    );
501            strcat(name, asStr);
502            strcat(name, RRD_EXTENSION);
503            if ( (fp=fopen(name,"r")) == NULL ){
504              opt[0]= (char *) malloc((strlen(RRD_PARAM_AS_0) + 1) * sizeof(char));
505              strcpy(opt[0], RRD_PARAM_AS_0);
506              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
507              strcpy(opt[1], name);
508              opt[2]= (char *) malloc((strlen(RRD_PARAM_AS_1) + 1) * sizeof(char));
509              strcpy(opt[2], RRD_PARAM_AS_1);
510              opt[3]= (char *) malloc((strlen(RRD_PARAM_AS_2) + 1) * sizeof(char));
511              strcpy(opt[3], RRD_PARAM_AS_2);
512              opt[4]= (char *) malloc((strlen(RRD_PARAM_AS_3) + 1) * sizeof(char));
513              strcpy(opt[4], RRD_PARAM_AS_3);
514              opt[5]= (char *) malloc((strlen(RRD_PARAM_AS_4) + 1) * sizeof(char));
515              strcpy(opt[5], RRD_PARAM_AS_4);
516              opt[6]= (char *) malloc((strlen(RRD_PARAM_AS_5) + 1) * sizeof(char));
517              strcpy(opt[6], RRD_PARAM_AS_5);
518              opt[7]= (char *) malloc((strlen(RRD_PARAM_AS_6) + 1) * sizeof(char));
519              strcpy(opt[7], RRD_PARAM_AS_6);
520              opt[8]= (char *) malloc((strlen(RRD_PARAM_AS_7) + 1) * sizeof(char));
521              strcpy(opt[8], RRD_PARAM_AS_7);
522              opt[9]= (char *) malloc((strlen(RRD_PARAM_AS_8) + 1) * sizeof(char));
523              strcpy(opt[9], RRD_PARAM_AS_8);
524              opt[10]= (char *) malloc((strlen(RRD_PARAM_AS_9) + 1) * sizeof(char));
525              strcpy(opt[10], RRD_PARAM_AS_9);
526              opt[11]= (char *) malloc((strlen(RRD_PARAM_AS_10) + 1) * sizeof(char));
527              strcpy(opt[11], RRD_PARAM_AS_10);
528              opt[12]= (char *) malloc((strlen(RRD_PARAM_AS_11) + 1) * sizeof(char));
529              strcpy(opt[12], RRD_PARAM_AS_11);
530              opt[13]= (char *) malloc((strlen(RRD_PARAM_AS_12) + 1) * sizeof(char));
531              strcpy(opt[13], RRD_PARAM_AS_12);
532              opt[14]= (char *) malloc((strlen(RRD_PARAM_AS_13) + 1) * sizeof(char));
533              strcpy(opt[14], RRD_PARAM_AS_13);
534              opt[15]= (char *) malloc((strlen(RRD_PARAM_AS_14) + 1) * sizeof(char));
535              strcpy(opt[15], RRD_PARAM_AS_14);
536              opt[16]= (char *) malloc((strlen(RRD_PARAM_AS_15) + 1) * sizeof(char));
537              strcpy(opt[16], RRD_PARAM_AS_15);
538              opt[17]= (char *) malloc((strlen(RRD_PARAM_AS_16) + 1) * sizeof(char));
539              strcpy(opt[17], RRD_PARAM_AS_16);
540              opt[18]= (char *) malloc((strlen(RRD_PARAM_AS_17) + 1) * sizeof(char));
541              strcpy(opt[18], RRD_PARAM_AS_17);
542              optind = opterr = 0;
543              rrd_clear_error();
544              if ( rrd_create(19,opt) < 0) {
545                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
546                rrd_create_er_ct++;
547              } else {
548                rrd_create_ok_ct++;
549              }
550              for ( j=0; j<19; j++) {
551                free(opt[j]);
552                opt[j] = NULL;
553              }
554            }else{
555              fclose(fp);
556              rrd_already_created_ct++;
557              snprintf(buf,
558                       2048,
559                       "%lu:%llu:%llu:%llu:%llu:%llu:%llu"
560                       now-300,  /* or ctime(&now) with %s */
561                       shmForAgg->ASTab[index][i].flowNbIN,  /* 1 */
562                       shmForAgg->ASTab[index][i].flowNbOUT,
563                       shmForAgg->ASTab[index][i].bytesNbIN,
564                       shmForAgg->ASTab[index][i].bytesNbOUT,
565                       shmForAgg->ASTab[index][i].pktsNbIN,  /* 5 */
566                       shmForAgg->ASTab[index][i].pktsNbOUT
567                       );
568              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
569              strcpy(optUpdate[0], RRD_UPDATE_0);
570              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
571              strcpy(optUpdate[1], name);
572              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
573              strcpy(optUpdate[2], buf);
574              optind = opterr = 0;
575              rrd_clear_error();
576              if ( rrd_update(3, optUpdate) < 0 ) {
577                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
578                rrd_update_er_ct++;
579              } else {
580                rrd_update_ok_ct++;
581              }
582              for ( j=0; j<3; j++) {
583                free(optUpdate[j]);
584                optUpdate[j] = NULL;
585              }
586            }
587            /* Reinit the shared tables */
588            shmForAgg->ASTab[index][i].flowNbIN = 0;
589            shmForAgg->ASTab[index][i].bytesNbIN = 0;
590            shmForAgg->ASTab[index][i].pktsNbIN = 0;
591            shmForAgg->ASTab[index][i].flowNbOUT = 0;
592            shmForAgg->ASTab[index][i].bytesNbOUT = 0;
593            shmForAgg->ASTab[index][i].pktsNbOUT = 0;
594          }
595        }
596#endif /* AS */
597        now2 = time((time_t *)NULL);
598#ifdef DEBUGAGG
599        fprintf(stderr, "IPv4 subnet managment (rrd update) : \n %d sec, %d files updated, %d errors, total %d\n %d rrd file already created, %d errors in creation, %d new rrd file creations",
600                (int)now2-now,
601                rrd_update_ok_ct,
602                rrd_update_er_ct,
603                rrd_update_ok_ct+rrd_update_er_ct,
604                rrd_already_created_ct,
605                rrd_create_er_ct,
606                rrd_create_ok_ct);
607#endif
608        rrd_update_ok_ct = 0;
609        rrd_update_er_ct = 0;
610        rrd_already_created_ct = 0;
611        rrd_create_er_ct = 0;
612        rrd_create_ok_ct = 0;
613        rrd_clear_error();
614      } else {
615        isFirstUpdate = 0;
616        /* Reinit the shared table */
617        for (i=0; i<shmForAgg->v4PrefixNb; i++){
618          shmForAgg->prefixV4Tab[index][i].flowNbIN = 0;
619          shmForAgg->prefixV4Tab[index][i].bytesNbIN = 0;
620          shmForAgg->prefixV4Tab[index][i].pktsNbIN = 0;
621          shmForAgg->prefixV4Tab[index][i].flowNbOUT = 0;
622          shmForAgg->prefixV4Tab[index][i].bytesNbOUT = 0;
623          shmForAgg->prefixV4Tab[index][i].pktsNbOUT = 0;
624          shmForAgg->prefixV4Tab[index][i].firstCoSIN = 0;
625          shmForAgg->prefixV4Tab[index][i].secondCoSIN = 0;
626          shmForAgg->prefixV4Tab[index][i].thirdCoSIN = 0;
627          shmForAgg->prefixV4Tab[index][i].fourthCoSIN = 0;
628          shmForAgg->prefixV4Tab[index][i].firstCoSOUT = 0;
629          shmForAgg->prefixV4Tab[index][i].secondCoSOUT = 0;
630          shmForAgg->prefixV4Tab[index][i].thirdCoSOUT = 0;
631          shmForAgg->prefixV4Tab[index][i].fourthCoSOUT = 0;
632
633          shmForAgg->prefixV4SubnetTab[index][i].flowNbIN = 0;
634          shmForAgg->prefixV4SubnetTab[index][i].bytesNbIN = 0;
635          shmForAgg->prefixV4SubnetTab[index][i].pktsNbIN = 0;
636          shmForAgg->prefixV4SubnetTab[index][i].flowNbOUT = 0;
637          shmForAgg->prefixV4SubnetTab[index][i].bytesNbOUT = 0;
638          shmForAgg->prefixV4SubnetTab[index][i].pktsNbOUT = 0;
639          shmForAgg->prefixV4SubnetTab[index][i].firstCoSIN = 0;
640          shmForAgg->prefixV4SubnetTab[index][i].secondCoSIN = 0;
641          shmForAgg->prefixV4SubnetTab[index][i].thirdCoSIN = 0;
642          shmForAgg->prefixV4SubnetTab[index][i].fourthCoSIN = 0;
643          shmForAgg->prefixV4SubnetTab[index][i].firstCoSOUT = 0;
644          shmForAgg->prefixV4SubnetTab[index][i].secondCoSOUT = 0;
645          shmForAgg->prefixV4SubnetTab[index][i].thirdCoSOUT = 0;
646          shmForAgg->prefixV4SubnetTab[index][i].fourthCoSOUT = 0;
647        }
648        /* reinit */
649#ifdef MATRIX
650        for (i=0; i<ROUTER_INDEX_MAX; i++){
651          for (j=0; j<ROUTER_INDEX_MAX; j++) {
652            shmForAgg->matrixPOP[index][i][j].bytesNb = 0;
653            shmForAgg->matrixPOP[index][i][j].pktsNb = 0;
654            shmForAgg->matrixPOP[index][i][j].flowNb = 0;
655          }
656        }
657#endif
658#ifdef ASACC
659        for (i=0; i<shmForAgg->ASNb; i++){
660          shmForAgg->ASTab[index][i].flowNbIN = 0;
661          shmForAgg->ASTab[index][i].bytesNbIN = 0;
662          shmForAgg->ASTab[index][i].pktsNbIN = 0;
663          shmForAgg->ASTab[index][i].flowNbOUT = 0;
664          shmForAgg->ASTab[index][i].bytesNbOUT = 0;
665          shmForAgg->ASTab[index][i].pktsNbOUT = 0;
666        }
667#endif
668      } /* end is first update */ 
669    } /* end read ok */
670    sleep(10);
671  } while (1);
672  exit(0);
673}
Note: See TracBrowser for help on using the browser.