void csv_writer::write(std::ostream& out, const std::vector<flexible_type>& row) { for (size_t i = 0;i < row.size(); ++i) { csv_print(out, row[i]); // put a delimiter after every element except for the last element. if (i + 1 < row.size()) out << delimiter; } out << "\n"; }
void csv_writer::csv_print(std::ostream& out, const flexible_type& val) { switch(val.get_type()) { case flex_type_enum::INTEGER: case flex_type_enum::FLOAT: case flex_type_enum::VECTOR: out << std::string(val); break; case flex_type_enum::STRING: escape_string(val.get<flex_string>(), escape_char, quote_char, use_quote_char, double_quote, m_escape_buffer, m_escape_buffer_len); out.write(m_escape_buffer.c_str(), m_escape_buffer_len); break; case flex_type_enum::LIST: out << "["; for(size_t i = 0;i < val.get<flex_list>().size(); ++i) { csv_print(out, val.get<flex_list>()[i]); if (i + 1 < val.get<flex_list>().size()) out << ","; } out << "]"; break; case flex_type_enum::DICT: out << "{"; for(size_t i = 0;i < val.get<flex_dict>().size(); ++i) { csv_print(out, val.get<flex_dict>()[i].first); out << ":"; csv_print(out, val.get<flex_dict>()[i].second); if (i + 1 < val.get<flex_dict>().size()) out << ","; } out << "}"; break; case flex_type_enum::UNDEFINED: default: break; } }
/* ---------------------------- * MONITOR CODE * ---------------------------- */ void run_dtnperf_monitor(monitor_parameters_t * parameters) { /* ------------------------ * variables * ------------------------ */ dtnperf_options_t * perf_opt = parameters->perf_g_opt->perf_opt; bp_error_t error; bp_endpoint_id_t local_eid; bp_reg_info_t reginfo; bp_reg_id_t regid; bp_bundle_object_t bundle_object; bp_bundle_status_report_t * status_report; bp_endpoint_id_t bundle_source_addr; bp_timestamp_t bundle_creation_timestamp; bp_timeval_t bundle_expiration; bp_endpoint_id_t relative_source_addr; bp_timestamp_t relative_creation_timestamp; HEADER_TYPE bundle_header; session_t * session; bundle_type_t bundle_type; struct timeval current, start; char * command; char temp[256]; char * filename; int filename_len; char * full_filename; FILE * file; /* ------------------------ * initialize variables * ------------------------ */ boolean_t debug = perf_opt->debug; int debug_level = perf_opt->debug_level; dedicated_monitor = parameters->dedicated_monitor; bp_handle_open = FALSE; perf_opt->logs_dir = correct_dirname(perf_opt->logs_dir); status_report = NULL; session_list = session_list_create(); // set out buffer size if daemon if (perf_opt->daemon) { setlinebuf(stdout); setlinebuf(stderr); } // create dir where dtnperf monitor will save logs // command should be: mkdir -p "logs_dir" if(debug && debug_level > 0) printf("[debug] initializing shell command..."); command = malloc(sizeof(char) * (10 + strlen(perf_opt->logs_dir))); sprintf(command, "mkdir -p %s", perf_opt->logs_dir); if(debug && debug_level > 0) printf("done. Shell command = %s\n", command); // execute shell command if(debug && debug_level > 0) printf("[debug] executing shell command..."); if (system(command) < 0) { perror("Error opening monitor logs dir"); monitor_clean_exit(-1); } free(command); if(debug && debug_level > 0) printf("done\n"); // signal handlers signal(SIGINT, monitor_handler); signal(SIGUSR1, monitor_handler); signal(SIGUSR2, monitor_handler); //open the connection to the bundle protocol router if(debug && debug_level > 0) printf("[debug] opening connection to bundle protocol router..."); if (perf_opt->use_ip) error = bp_open_with_ip(perf_opt->ip_addr, perf_opt->ip_port, &handle); else error = bp_open(&handle); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "fatal error opening bp handle: %s\n", bp_strerror(error)); monitor_clean_exit(1); } else { bp_handle_open = TRUE; } if(debug && debug_level > 0) printf("done\n"); //build a local eid if(debug && debug_level > 0) printf("[debug] building a local eid..."); if (parameters->dedicated_monitor) sprintf(temp, "%s_%d", MON_EP_STRING, parameters->client_id); else sprintf(temp, "%s", MON_EP_STRING); bp_build_local_eid(handle, &local_eid, temp); if(debug && debug_level > 0) printf("done\n"); if (debug) printf("local_eid = %s\n", local_eid.uri); // checking if there is already a registration if(debug && debug_level > 0) printf("[debug] checking for existing registration..."); error = bp_find_registration(handle, &local_eid, ®id); if (error == BP_SUCCESS) { fflush(stdout); fprintf(stderr, "error: there is a registration with the same eid.\n"); fprintf(stderr, "regid 0x%x\n", (unsigned int) regid); monitor_clean_exit(1); } if ((debug) && (debug_level > 0)) printf(" done\n"); //create a new registration to the local router based on this eid if(debug && debug_level > 0) printf("[debug] registering to local daemon..."); memset(®info, 0, sizeof(reginfo)); bp_copy_eid(®info.endpoint, &local_eid); reginfo.flags = BP_REG_DEFER; reginfo.regid = BP_REGID_NONE; reginfo.expiration = 0; if ((error = bp_register(handle, ®info, ®id)) != 0) { fflush(stdout); fprintf(stderr, "error creating registration: %d (%s)\n", error, bp_strerror(bp_errno(handle))); monitor_clean_exit(1); } if ((debug) && (debug_level > 0)) printf(" done\n"); if (debug) printf("regid 0x%x\n", (unsigned int) regid); // start expiration timer thread pthread_mutex_init (&mutexdata, NULL); pthread_create(&session_exp_timer, NULL, session_expiration_timer, (void *) parameters); if (!dedicated_monitor) printf("DTNperf Monitor started\n Waiting for bundles...\n"); // start infinite loop while(1) { // reset variables bundle_type = NONE; // create a bundle object if ((debug) && (debug_level > 0)) printf("[debug] initiating memory for bundles...\n"); error = bp_bundle_create(&bundle_object); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "fatal error initiating memory for bundles: %s\n", bp_strerror(error)); monitor_clean_exit(1); } if(debug && debug_level > 0) printf("done\n"); // wait until receive a bundle if ((debug) && (debug_level > 0)) printf("[debug] waiting for bundles...\n"); error = bp_bundle_receive(handle, bundle_object, BP_PAYLOAD_MEM, -1); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "error getting recv reply: %d (%s)\n", error, bp_strerror(bp_errno(handle))); monitor_clean_exit(1); } if ((debug) && (debug_level > 0)) printf(" bundle received\n"); // mark current time if ((debug) && (debug_level > 0)) printf("[debug] marking time..."); gettimeofday(¤t, NULL); if ((debug) && (debug_level > 0)) printf(" done\n"); // get SOURCE eid if ((debug) && (debug_level > 0)) printf("[debug]\tgetting source eid..."); error = bp_bundle_get_source(bundle_object, &bundle_source_addr); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "error getting bundle source eid: %s\n", bp_strerror(error)); monitor_clean_exit(1); } if ((debug) && (debug_level > 0)) { printf(" done:\n"); printf("\tbundle_source_addr = %s\n", bundle_source_addr.uri); printf("\n"); } // get bundle CREATION TIMESTAMP if ((debug) && (debug_level > 0)) printf("[debug]\tgetting bundle creation timestamp..."); error = bp_bundle_get_creation_timestamp(bundle_object, &bundle_creation_timestamp); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "error getting bundle creation timestamp: %s\n", bp_strerror(error)); monitor_clean_exit(1); } if ((debug) && (debug_level > 0)) { printf(" done:\n"); printf("\tbundle creation timestamp:\n" "\tsecs = %d\n\tseqno= %d\n", (int)bundle_creation_timestamp.secs, (int)bundle_creation_timestamp.seqno); printf("\n"); } // get bundle EXPIRATION TIME if ((debug) && (debug_level > 0)) printf("[debug]\tgetting bundle expiration time..."); error = bp_bundle_get_expiration(bundle_object, &bundle_expiration); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "error getting bundle expiration time: %s\n", bp_strerror(error)); monitor_clean_exit(1); } if ((debug) && (debug_level > 0)) { printf(" done:\n"); printf("\tbundle expiration: %lu\n", bundle_expiration); printf("\n"); } // check if bundle is a status report if ((debug) && (debug_level > 0)) printf("[debug] check if bundle is a status report...\n"); error = bp_bundle_get_status_report(bundle_object, &status_report); if (error != BP_SUCCESS) { fflush(stdout); fprintf(stderr, "error checking if bundle is a status report: %d (%s)\n", error, bp_strerror(bp_errno(handle))); continue; } if ((debug) && (debug_level > 0)) printf(" %s\n", status_report == NULL ? "no" : "yes"); // check for other bundle types if (status_report != NULL) bundle_type = STATUS_REPORT; else { get_bundle_header_and_options(&bundle_object, & bundle_header, NULL); if (bundle_header == FORCE_STOP_HEADER) bundle_type = CLIENT_FORCE_STOP; else if (bundle_header == STOP_HEADER) bundle_type = CLIENT_STOP; else if (bundle_header == DSA_HEADER) bundle_type = SERVER_ACK; else // unknown bundle type { fprintf(stderr, "error: unknown bundle type\n"); continue; } } // retrieve or open log file pthread_mutex_lock(&mutexdata); session = NULL; switch (bundle_type) { case STATUS_REPORT: bp_copy_eid(&relative_source_addr, &(status_report->bundle_id.source)); relative_creation_timestamp = status_report->bundle_id.creation_ts; break; case SERVER_ACK: get_info_from_ack(&bundle_object, &relative_source_addr, &relative_creation_timestamp); break; case CLIENT_STOP: case CLIENT_FORCE_STOP: bp_copy_eid(&relative_source_addr, &bundle_source_addr); relative_creation_timestamp = bundle_creation_timestamp; break; default: break; } session = session_get(session_list, relative_source_addr); if (session == NULL) // start a new session { // mark start time start = current; char * ptr; filename_len = strlen(relative_source_addr.uri) - strlen("dtn://") + 15; filename = (char *) malloc(filename_len); memset(filename, 0, filename_len); strncpy(temp, relative_source_addr.uri, strlen(relative_source_addr.uri) + 1); strtok(temp, "/"); sprintf(filename, "%lu_", relative_creation_timestamp.secs); strcat(filename, strtok(NULL, "/")); // remove .dtn suffix from the filename ptr = strstr(filename, ".dtn"); if (ptr != NULL) ptr[0] = '\0'; // add .csv extension strcat(filename, ".csv"); full_filename = (char *) malloc(strlen(perf_opt->logs_dir) + strlen(filename) + 2); sprintf(full_filename, "%s/%s", perf_opt->logs_dir, filename); file = fopen(full_filename, "w"); session = session_create(relative_source_addr, full_filename, file, start, relative_creation_timestamp.secs, bundle_expiration); session_put(session_list, session); // write header in csv log file fprintf(file,"Mon_RX_TIME;BSR_OR_ACK_SOURCE;BSR_OR_ACK_TIMESTAMP;BSR_OR_ACK_SEQNO;" "TYPE;BUNDLE_X_SOURCE;BUNDLE_X_TIMESTAMP;BUNDLE_X_SEQNO;" "FRAG_OFFSET;FRAG_LENGTH;"); csv_print_status_report_timestamps_header(file); csv_end_line(file); } // update session infos session->last_bundle_time = bundle_creation_timestamp.secs; session->expiration = bundle_expiration; file = session->file; memcpy(&start, session->start, sizeof(struct timeval)); if (bundle_type == STATUS_REPORT && (status_report->flags & BP_STATUS_DELIVERED)) { session->delivered_count++; } pthread_mutex_unlock(&mutexdata); // print rx time in csv log csv_print_rx_time(file, current, start); // print bundle source in csv log csv_print_eid(file, bundle_source_addr); //print bundle creation timestamp in csv log csv_print_timestamp(file, bundle_creation_timestamp); // print bundle type in csv log switch (bundle_type) { case CLIENT_STOP: csv_print(file, "CLIENT_STOP"); break; case CLIENT_FORCE_STOP: csv_print(file, "CLIENT_FORCE_STOP"); break; case SERVER_ACK: csv_print(file, "SERVER_ACK"); break; case STATUS_REPORT: csv_print(file, "STATUS_REPORT"); break; default: csv_print(file, "UNKNOWN"); break; } // print relative source and timestamp if (bundle_type == SERVER_ACK || bundle_type == STATUS_REPORT) { csv_print_eid(file, relative_source_addr); csv_print_timestamp(file, relative_creation_timestamp); } // print status report infos in csv log if (bundle_type == STATUS_REPORT) { csv_print_ulong(file, status_report->bundle_id.frag_offset); csv_print_ulong(file, status_report->bundle_id.orig_length); csv_print_status_report_timestamps(file, * status_report); } // end line in csv log csv_end_line(file); // close file if (bundle_type == CLIENT_STOP) { int total_to_receive; get_info_from_stop(&bundle_object, &total_to_receive); pthread_mutex_lock(&mutexdata); session->total_to_receive = total_to_receive; session->wait_after_stop = bundle_expiration; gettimeofday(session->stop_arrival_time, NULL); pthread_mutex_unlock(&mutexdata); } else if (bundle_type == CLIENT_FORCE_STOP) { printf("DTNperf monitor: received forced end session bundle\n"); session_close(session_list, session); } } // end loop session_list_destroy(session_list); bp_close(handle); bp_handle_open = FALSE; }
/* This is the overall CSV producer. */ void csv_producer (char * variable, const char * sep) { vector * v; // save variable including its dependencies if (variable && (v = qucs_data->findVariable (variable)) != NULL) { // prepare variable + dependency structures strlist * deps = v->getDependencies (); int vectors = 1 + (deps ? deps->length () : 0); struct csv_data * data = new struct csv_data[vectors]; int i = vectors - 1; data[i].type = real (sum (norm (imag (*v)))) > 0.0 ? 'c' : 'r'; data[i].v = v; data[i].idx = 0; data[i].skip = 1; data[i].len = v->getSize (); int a = v->getSize (); for (i = vectors - 2; i >= 0; i--) { vector * d = qucs_data->findDependency (deps->get (i)); data[i].type = real (sum (norm (imag (*d)))) > 0.0 ? 'c' : 'r'; data[i].v = d; data[i].idx = 0; a /= d->getSize (); data[i].skip = a; data[i].len = d->getSize (); } csv_print (data, vectors, sep); delete[] data; } // save dependency + all variable depending on it else if (variable && (v = qucs_data->findDependency (variable)) != NULL) { // prepare dependency + variables structures vector * vars; int vectors = 1; for (vars = qucs_data->getVariables (); vars != NULL; vars = (vector *) vars->getNext ()) { strlist * deps = vars->getDependencies (); if (deps->contains (v->getName ())) vectors++; } struct csv_data * data = new struct csv_data[vectors]; data[0].type = real (sum (norm (imag (*v)))) > 0.0 ? 'c' : 'r'; data[0].v = v; data[0].idx = 0; data[0].skip = 1; data[0].len = v->getSize (); int i = 1; for (vars = qucs_data->getVariables (); vars != NULL; vars = (vector *) vars->getNext ()) { strlist * deps = vars->getDependencies (); if (deps->contains (v->getName ())) { vector * d = vars; data[i].type = real (sum (norm (imag (*d)))) > 0.0 ? 'c' : 'r'; data[i].v = d; data[i].idx = 0; data[i].skip = 1; data[i].len = d->getSize (); i++; } } csv_print (data, vectors, sep); delete[] data; } // no such data found else { fprintf (stderr, "no such data variable `%s' found\n", variable); } }