int bgp_peer_log_init(struct bgp_peer *peer, int output, int type) { int peer_idx, have_it, ret = 0, amqp_ret = 0; char log_filename[SRVBUFLEN], event_type[] = "log_init"; char peer_ip_src[] = "peer_ip_src", bmp_router[] = "bmp_router"; /* pointers to BGP or BMP vars */ struct bgp_peer_log **bpl; char *file, *amqp_routing_key, *lts, *pa_str; int amqp_routing_key_rr, max_peers; u_int64_t *ls; if (type == FUNC_TYPE_BGP) { file = config.nfacctd_bgp_msglog_file; amqp_routing_key = config.nfacctd_bgp_msglog_amqp_routing_key; amqp_routing_key_rr = config.nfacctd_bgp_msglog_amqp_routing_key_rr; max_peers = config.nfacctd_bgp_max_peers; pa_str = peer_ip_src; lts = log_tstamp_str; ls = &log_seq; bpl = &peers_log; } else if (type == FUNC_TYPE_BMP) { file = config.nfacctd_bmp_msglog_file; amqp_routing_key = config.nfacctd_bmp_msglog_amqp_routing_key; amqp_routing_key_rr = config.nfacctd_bmp_msglog_amqp_routing_key_rr; max_peers = config.nfacctd_bmp_max_peers; pa_str = bmp_router; lts = bmp_log_tstamp_str; ls = &bmp_log_seq; bpl = &bmp_peers_log; } else if (type == FUNC_TYPE_SFLOW_COUNTER) { file = config.sfacctd_counter_file; amqp_routing_key = NULL; /* AMQP not supported */ amqp_routing_key_rr = 0; /* AMQP not supported */ max_peers = config.sfacctd_counter_max_nodes; pa_str = peer_ip_src; lts = sf_cnt_log_tstamp_str; ls = &sf_cnt_log_seq; bpl = &sf_cnt_log; } else return ret; if (!(*bpl) || !peer || peer->log) return ret; if (file) bgp_peer_log_dynname(log_filename, SRVBUFLEN, file, peer); if (amqp_routing_key) { bgp_peer_log_dynname(log_filename, SRVBUFLEN, amqp_routing_key, peer); } for (peer_idx = 0, have_it = 0; peer_idx < max_peers; peer_idx++) { if (!(*bpl)[peer_idx].refcnt) { if (file) (*bpl)[peer_idx].fd = open_logfile(log_filename, "a"); #ifdef WITH_RABBITMQ if (amqp_routing_key) (*bpl)[peer_idx].amqp_host = &bgp_daemon_msglog_amqp_host; #endif strcpy((*bpl)[peer_idx].filename, log_filename); have_it = TRUE; break; } else if (!strcmp(log_filename, (*bpl)[peer_idx].filename)) { have_it = TRUE; break; } } if (have_it) { peer->log = &(*bpl)[peer_idx]; (*bpl)[peer_idx].refcnt++; #ifdef WITH_RABBITMQ if (amqp_routing_key) p_amqp_set_routing_key(peer->log->amqp_host, peer->log->filename); if (amqp_routing_key_rr && !p_amqp_get_routing_key_rr(peer->log->amqp_host)) { p_amqp_init_routing_key_rr(peer->log->amqp_host); p_amqp_set_routing_key_rr(peer->log->amqp_host, amqp_routing_key_rr); } #endif if (output == PRINT_OUTPUT_JSON) { #ifdef WITH_JANSSON char ip_address[INET6_ADDRSTRLEN]; json_t *obj = json_object(), *kv; kv = json_pack("{sI}", "seq", (*ls)); json_object_update_missing(obj, kv); json_decref(kv); bgp_peer_log_seq_increment(ls); kv = json_pack("{ss}", "timestamp", lts); json_object_update_missing(obj, kv); json_decref(kv); addr_to_str(ip_address, &peer->addr); kv = json_pack("{ss}", pa_str, ip_address); json_object_update_missing(obj, kv); json_decref(kv); kv = json_pack("{ss}", "event_type", event_type); json_object_update_missing(obj, kv); json_decref(kv); if (file) write_and_free_json(peer->log->fd, obj); #ifdef WITH_RABBITMQ if (amqp_routing_key) { amqp_ret = write_and_free_json_amqp(peer->log->amqp_host, obj); p_amqp_unset_routing_key(peer->log->amqp_host); } #endif #endif } } return (ret | amqp_ret); }
int bgp_peer_log_init(struct bgp_peer *peer, int output, int type) { struct bgp_misc_structs *bms = bgp_select_misc_db(type); int peer_idx, have_it, ret = 0, amqp_ret = 0, kafka_ret = 0; char log_filename[SRVBUFLEN], event_type[] = "log_init"; pid_t writer_pid = getpid(); if (!bms || !peer) return ERR; if (bms->msglog_file) bgp_peer_log_dynname(log_filename, SRVBUFLEN, bms->msglog_file, peer); if (bms->msglog_amqp_routing_key) { bgp_peer_log_dynname(log_filename, SRVBUFLEN, bms->msglog_amqp_routing_key, peer); } if (bms->msglog_kafka_topic) { bgp_peer_log_dynname(log_filename, SRVBUFLEN, bms->msglog_kafka_topic, peer); } for (peer_idx = 0, have_it = 0; peer_idx < bms->max_peers; peer_idx++) { if (!bms->peers_log[peer_idx].refcnt) { if (bms->msglog_file) { bms->peers_log[peer_idx].fd = open_output_file(log_filename, "a", FALSE); setlinebuf(bms->peers_log[peer_idx].fd); } #ifdef WITH_RABBITMQ if (bms->msglog_amqp_routing_key) bms->peers_log[peer_idx].amqp_host = bms->msglog_amqp_host; #endif #ifdef WITH_KAFKA if (bms->msglog_kafka_topic) bms->peers_log[peer_idx].kafka_host = bms->msglog_kafka_host; #endif strcpy(bms->peers_log[peer_idx].filename, log_filename); have_it = TRUE; break; } else if (!strcmp(log_filename, bms->peers_log[peer_idx].filename)) { have_it = TRUE; break; } } if (have_it) { peer->log = &bms->peers_log[peer_idx]; bms->peers_log[peer_idx].refcnt++; #ifdef WITH_RABBITMQ if (bms->msglog_amqp_routing_key) p_amqp_set_routing_key(peer->log->amqp_host, peer->log->filename); if (bms->msglog_amqp_routing_key_rr && !p_amqp_get_routing_key_rr(peer->log->amqp_host)) { p_amqp_init_routing_key_rr(peer->log->amqp_host); p_amqp_set_routing_key_rr(peer->log->amqp_host, bms->msglog_amqp_routing_key_rr); } #endif #ifdef WITH_KAFKA if (bms->msglog_kafka_topic) p_kafka_set_topic(peer->log->kafka_host, peer->log->filename); if (bms->msglog_kafka_topic_rr && !p_kafka_get_topic_rr(peer->log->kafka_host)) { p_kafka_init_topic_rr(peer->log->kafka_host); p_kafka_set_topic_rr(peer->log->kafka_host, bms->msglog_kafka_topic_rr); } #endif if (output == PRINT_OUTPUT_JSON) { #ifdef WITH_JANSSON char ip_address[INET6_ADDRSTRLEN]; json_t *obj = json_object(); json_object_set_new_nocheck(obj, "seq", json_integer((json_int_t)bms->log_seq)); bgp_peer_log_seq_increment(&bms->log_seq); json_object_set_new_nocheck(obj, "timestamp", json_string(bms->log_tstamp_str)); if (bms->bgp_peer_logdump_initclose_extras) bms->bgp_peer_logdump_initclose_extras(peer, output, obj); addr_to_str(ip_address, &peer->addr); json_object_set_new_nocheck(obj, bms->peer_str, json_string(ip_address)); json_object_set_new_nocheck(obj, "event_type", json_string(event_type)); if (bms->bgp_peer_log_msg_extras) bms->bgp_peer_log_msg_extras(peer, output, obj); if (bms->msglog_file) write_and_free_json(peer->log->fd, obj); #ifdef WITH_RABBITMQ if (bms->msglog_amqp_routing_key) { add_writer_name_and_pid_json(obj, config.proc_name, writer_pid); amqp_ret = write_and_free_json_amqp(peer->log->amqp_host, obj); p_amqp_unset_routing_key(peer->log->amqp_host); } #endif #ifdef WITH_KAFKA if (bms->msglog_kafka_topic) { add_writer_name_and_pid_json(obj, config.proc_name, writer_pid); kafka_ret = write_and_free_json_kafka(peer->log->kafka_host, obj); p_kafka_unset_topic(peer->log->kafka_host); } #endif #endif } } return (ret | amqp_ret | kafka_ret); }