41 #ifdef WITH_PLUGIN_DIST
42 #include "corsaro_distributions.h"
44 #ifdef WITH_PLUGIN_SIXT
47 #ifdef WITH_PLUGIN_DOS
48 #include "corsaro_dos.h"
55 typedef struct output_funcs
71 #define GENERATE_OUTPUT_FUNCS(o) \
72 {output_headers_##o, output_interval_start_##o, output_interval_end_##o, \
73 output_plugin_start_##o, output_plugin_end_##o, output_trailers_##o}
75 #define GENERATE_OUTPUT_FUNC_PROTOS(o) \
76 static int output_headers_##o(corsaro_t *corsaro, corsaro_file_t *file,\
77 corsaro_header_t *header); \
78 static int output_interval_start_##o(corsaro_t *corsaro, \
79 corsaro_file_t *file, \
80 corsaro_interval_t *int_start); \
81 static int output_interval_end_##o(corsaro_t *corsaro, \
82 corsaro_file_t *file, \
83 corsaro_interval_t *int_end); \
84 static int output_plugin_start_##o(corsaro_t *corsaro, corsaro_file_t *file, \
85 corsaro_plugin_t *plugin); \
86 static int output_plugin_end_##o(corsaro_t *corsaro, corsaro_file_t *file, \
87 corsaro_plugin_t *plugin); \
88 static int output_trailers_##o(corsaro_t *corsaro, corsaro_file_t *file,\
89 corsaro_trailer_t *trailer);
91 GENERATE_OUTPUT_FUNC_PROTOS(ascii);
92 GENERATE_OUTPUT_FUNC_PROTOS(binary);
94 static output_funcs_t output_funcs[] = {
95 GENERATE_OUTPUT_FUNCS(ascii),
96 GENERATE_OUTPUT_FUNCS(binary),
111 uint32_t bytes_out = 0;
134 bytes_out += corsaro_file_printf(corsaro, file,
135 "# CORSARO_VERSION %"PRIu8
".%"PRIu8
"\n",
137 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_INITTIME %ld\n",
139 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_INTERVAL %d\n",
143 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_TRACEURI %s\n",
149 while((tmp = corsaro_plugin_next(corsaro->
plugin_manager, tmp)) != NULL)
151 bytes_out += corsaro_file_printf(corsaro, file,
152 "# CORSARO_PLUGIN %s\n",
160 bytes_out += corsaro_file_printf(corsaro, file,
161 "# CORSARO_PLUGIN %s\n",
175 uint8_t *ptr = &fbuffer[0];
179 uint32_t bytes_out = 0;
188 *ptr = CORSARO_MAJOR_VERSION;
190 *ptr = CORSARO_MID_VERSION;
194 bytes_htonl(ptr, corsaro->
init_time.tv_sec);
198 bytes_htons(ptr, corsaro->
interval);
200 if(corsaro_file_write(corsaro, file, &fbuffer[0],
204 corsaro_log(__func__, corsaro,
"could not dump byte array to file");
213 tmp_len = strlen(corsaro->
uridata);
214 bytes_htons(&tmp[0], tmp_len);
215 if(corsaro_file_write(corsaro, file, &tmp[0], 2) != 2)
217 corsaro_log(__func__, corsaro,
"could not dump traceuri length to file");
220 if(corsaro_file_write(corsaro, file, corsaro->
uridata, tmp_len) != tmp_len)
222 corsaro_log(__func__, corsaro,
"could not dump traceuri string to file");
225 bytes_out += 2 + tmp_len;
229 memset(&tmp[0], 0, 2);
230 if(corsaro_file_write(corsaro, file, &tmp[0], 2) != 2)
232 corsaro_log(__func__, corsaro,
"could not dump zero traceuri length to file");
240 if(corsaro_file_write(corsaro, file, &tmp[0], 2) != 2)
242 corsaro_log(__func__, corsaro,
"could not dump plugins cnt to file");
247 while((p = corsaro_plugin_next(corsaro->
plugin_manager, p)) != NULL)
249 bytes_htons(&tmp[0], p->
id);
250 if(corsaro_file_write(corsaro, file, &tmp[0], 2) != 2)
252 corsaro_log(__func__, corsaro,
"could not dump plugin id to file");
269 return corsaro_file_printf(corsaro, file,
270 "# CORSARO_INTERVAL_START %d %ld\n",
277 return corsaro_file_printf(corsaro, file,
278 "# CORSARO_INTERVAL_END %d %ld\n",
290 uint8_t *iptr = &ibuff[0];
297 bytes_htons(iptr, corsaro->interval_cnt);
299 bytes_htonl(iptr, tv.tv_sec);
301 if(corsaro_file_write(corsaro, file, &ibuff[0],
305 corsaro_log(__func__, corsaro,
"could not dump interval header to file");
320 corsaro_log(__func__, corsaro,
"could not dump interval header to file");
330 return write_interval_header_binary(corsaro, file, int_start);
336 return write_interval_header_binary(corsaro, file, int_end);
342 return corsaro_file_printf(corsaro, file,
343 "# CORSARO_PLUGIN_DATA_START %s\n",
350 return corsaro_file_printf(corsaro, file,
351 "# CORSARO_PLUGIN_DATA_END %s\n",
359 uint8_t *idptr = &idbuff[0];
364 bytes_htonl(idptr, CORSARO_MAGIC_DATA);
367 bytes_htons(idptr, plugin->
id);
368 if(corsaro_file_write(corsaro, file, &idbuff[0],
372 corsaro_log(__func__, corsaro,
"could not dump interval data header to file");
381 return write_plugin_header_binary(corsaro, file, plugin);
387 return write_plugin_header_binary(corsaro, file, plugin);
400 uint32_t bytes_out = 0;
401 gettimeofday_wrap(&ts);
403 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_PACKETCNT %"PRIu64
"\n",
405 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_FIRSTPKT %ld\n",
407 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_LASTPKT %ld\n",
409 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_FINALTIME %ld\n",
411 bytes_out += corsaro_file_printf(corsaro, file,
"# CORSARO_RUNTIME %ld\n",
414 corsaro_log(__func__, corsaro,
"pkt cnt: %"PRIu64, corsaro->
packet_cnt);
423 uint8_t *ptr = &buff[0];
426 gettimeofday_wrap(&ts);
431 bytes_htonl(ptr, CORSARO_MAGIC_TRAILER);
437 bytes_htonl(ptr, corsaro->
first_ts.tv_sec);
440 bytes_htonl(ptr, corsaro->
last_ts.tv_sec);
443 bytes_htonl(ptr, ts.tv_sec);
446 bytes_htonl(ptr, ts.tv_sec-corsaro->
init_time.tv_sec);
451 corsaro_log(__func__, corsaro,
"could not dump trailers to file");
455 corsaro_log(__func__, corsaro,
"pkt cnt: %"PRIu64, corsaro->
packet_cnt);
459 static char *generate_file_name(
corsaro_t *corsaro,
const char *plugin,
463 char *new_name = NULL;
469 assert(plugin != NULL && strlen(plugin) > 0);
474 if((ptr = new_name = malloc(new_size)) == NULL)
476 corsaro_log(__func__, corsaro,
"could not malloc output file name");
483 corsaro_log(__func__, corsaro,
"template (%s) does not contain pattern!",
491 strncpy(ptr, plugin, strlen(plugin));
492 ptr += strlen(plugin);
498 strncpy(ptr, tmpl, strlen(tmpl));
500 new_name[new_size-1] =
'\0';
559 interval->
time = ntohl(interval->
time);
579 pd->
magic != CORSARO_MAGIC_DATA)
601 t->
magic != CORSARO_MAGIC_TRAILER)
614 if((bread = corsaro_io_read_bytes(corsaro, record,
624 corsaro_log_in(__func__, corsaro,
"could not validate plugin data");
637 return corsaro_io_prepare_file_full(corsaro, plugin_name, corsaro->
output_mode,
643 const char *plugin_name,
653 if((outfileuri = generate_file_name(corsaro, plugin_name, compress)) == NULL)
655 corsaro_log(__func__, corsaro,
"could not generate file name for %s", plugin_name);
659 if((f = corsaro_file_open(corsaro,
666 corsaro_log(__func__, corsaro,
"could not open %s for writing", outfileuri);
674 int corsaro_io_validate_template(
corsaro_t *corsaro,
char *
template)
681 corsaro_log(__func__, corsaro,
"output template must be set");
687 corsaro_log(__func__, corsaro,
"template is too short to contain needed fields",
695 corsaro_log(__func__, corsaro,
"template string must contain %s",
717 fprintf(stdout,
"# CORSARO_VERSION %"PRIu8
".%"PRIu8
"\n",
719 fprintf(stdout,
"# CORSARO_INITTIME %"PRIu32
"\n",
721 fprintf(stdout,
"# CORSARO_INTERVAL %"PRIu16
"\n", header->
interval_length);
725 fprintf(stdout,
"# CORSARO_TRACEURI %s\n", header->
traceuri);
729 fprintf(stdout,
"# CORSARO_PLUGIN %s\n",
730 corsaro_plugin_get_name(plugin_manager, header->
plugin_ids[i]));
746 fprintf(stdout,
"# CORSARO_PACKETCNT %"PRIu64
"\n",
748 fprintf(stdout,
"# CORSARO_FIRSTPKT %"PRIu32
"\n",
750 fprintf(stdout,
"# CORSARO_LASTPKT %"PRIu32
"\n",
752 fprintf(stdout,
"# CORSARO_FINALTIME %"PRIu32
"\n",
754 fprintf(stdout,
"# CORSARO_RUNTIME %"PRIu32
"\n",
771 "# CORSARO_INTERVAL_START %d %"PRIu32
"\n",
787 "# CORSARO_INTERVAL_END %d %"PRIu32
"\n",
797 assert(plugin != NULL);
805 fprintf(stdout,
"# CORSARO_PLUGIN_DATA_START %s\n", plugin->
name);
813 assert(plugin != NULL);
821 fprintf(stdout,
"# CORSARO_PLUGIN_DATA_END %s\n", plugin->
name);
845 return corsaro_io_write_header(corsaro, file,
849 return corsaro_io_write_trailer(corsaro, file,
854 return corsaro_io_write_interval_start(corsaro, file,
859 return corsaro_io_write_interval_end(corsaro, file,
868 corsaro_log(__func__, corsaro,
"invalid plugin id detected");
869 corsaro_log(__func__, corsaro,
"is corsaro built with all"
870 "necessary plugins?");
873 return corsaro_io_write_plugin_start(corsaro, file, plugin);
881 corsaro_log(__func__, corsaro,
"invalid plugin id detected");
882 corsaro_log(__func__, corsaro,
"is corsaro built with all"
883 "necessary plugins?");
886 return corsaro_io_write_plugin_end(corsaro, file, plugin);
892 #ifdef WITH_PLUGIN_DIST
893 return corsaro_distributions_record_fprint(corsaro, file,
894 record_type, record);
896 corsaro_log(__func__, corsaro,
897 "corsaro is not built with distributions support");
905 #ifdef WITH_PLUGIN_SIXT
908 corsaro_log(__func__, corsaro,
"corsaro is not built with flowtuple support");
916 #ifdef WITH_PLUGIN_DOS
919 corsaro_log(__func__, corsaro,
"corsaro is not built with dos support");
925 corsaro_log(__func__, corsaro,
"invalid record type %d\n", (
int)record_type);
948 corsaro_io_print_header(plugin_manager,
966 if((plugin = corsaro_plugin_get_by_id(plugin_manager,
969 fprintf(stderr,
"invalid plugin id detected\n");
970 fprintf(stderr,
"is corsaro built with all"
971 "necessary plugins?\n");
974 corsaro_io_print_plugin_start(plugin);
979 if((plugin = corsaro_plugin_get_by_id(plugin_manager,
982 fprintf(stderr,
"invalid plugin id detected\n");
983 fprintf(stderr,
"is corsaro built with all"
984 "necessary plugins?\n");
987 corsaro_io_print_plugin_end(plugin);
993 #ifdef WITH_PLUGIN_DIST
994 return corsaro_distributions_record_print(record_type, record);
996 fprintf(stdout,
"corsaro is not built with distributions support\n");
1004 #ifdef WITH_PLUGIN_SIXT
1007 fprintf(stdout,
"corsaro is not built with flowtuple support\n");
1015 #ifdef WITH_PLUGIN_DOS
1018 fprintf(stdout,
"corsaro is not built with dos support\n");
1024 fprintf(stderr,
"invalid record type %d\n", (
int)record_type);
1044 if((bread = corsaro_io_read_bytes(corsaro, record, bsbread)) != bsbread)
1052 if(validate_header_static(header) != 1)
1054 corsaro_log_in(__func__, corsaro,
"could not validate header");
1059 if(header->traceuri_len == 0)
1061 header->traceuri = NULL;
1066 if((bread += corsaro_io_read_bytes_offset(corsaro, record,
1068 header->traceuri_len)) !=
1069 (bsbread+=header->traceuri_len))
1071 corsaro_log_in(__func__, corsaro,
1072 "failed to read traceuri from file");
1077 offset += header->traceuri_len;
1078 *(record->
buffer+offset) =
'\0';
1083 if((bread += corsaro_io_read_bytes_offset(corsaro, record,
1087 sizeof(uint16_t))) !=
1088 (bsbread+=
sizeof(uint16_t)))
1090 corsaro_log_in(__func__, corsaro,
1091 "failed to read plugin count from file");
1096 header->plugin_cnt = ntohs(header->plugin_cnt);
1098 if(header->plugin_cnt == 0)
1100 header->plugin_ids = NULL;
1105 if((bread += corsaro_io_read_bytes_offset(corsaro, record,
1108 *header->plugin_cnt)) !=
1109 (bsbread+=
sizeof(uint16_t)*header->plugin_cnt))
1111 corsaro_log_in(__func__, corsaro,
1112 "failed to read plugin ids from file");
1116 header->plugin_ids = (uint16_t*)(record->
buffer+offset);
1119 for(i =0; i<header->plugin_cnt;i++)
1121 header->plugin_ids[i] = ntohs(header->plugin_ids[i]);
1125 +header->traceuri_len+
sizeof(uint16_t)
1126 +(header->plugin_cnt*
sizeof(uint16_t)));
1139 if((bytes_read = corsaro_io_read_bytes(corsaro, record,
1149 corsaro_log_in(__func__, corsaro,
"could not validate trailer");
1165 if((bread = corsaro_io_read_bytes(corsaro, record,
1175 corsaro_log_in(__func__, corsaro,
"could not validate interval");
1193 if((bread = corsaro_io_read_bytes(corsaro, record,
1203 corsaro_log_in(__func__, corsaro,
"could not validate interval");
1220 off_t bread = read_plugin_data(corsaro, file, record_type, record);
1234 off_t bread = read_plugin_data(corsaro, file, record_type, record);
1250 return corsaro_file_rread(corsaro, corsaro->
file, record->
buffer, len);
1255 off_t offset, off_t len)
1260 return corsaro_file_rread(corsaro, corsaro->
file,
1261 (record->
buffer)+offset, len);