void compose_json_mpls_vpn_rd(json_t *obj, struct chained_cache *cc) { char rd_str[VERYSHORTBUFLEN]; bgp_rd2str(rd_str, &cc->pbgp->mpls_vpn_rd); json_object_set_new_nocheck(obj, "mpls_vpn_rd", json_string(rd_str)); }
int bgp_peer_log_msg(struct bgp_node *route, struct bgp_info *ri, safi_t safi, char *event_type, int output) { char log_rk[SRVBUFLEN]; struct bgp_peer *peer = ri->peer; struct bgp_attr *attr = ri->attr; int ret = 0, amqp_ret = 0, etype = BGP_LOGDUMP_ET_NONE; if (!strcmp(event_type, "dump")) etype = BGP_LOGDUMP_ET_DUMP; else if (!strcmp(event_type, "log")) etype = BGP_LOGDUMP_ET_LOG; #ifdef WITH_RABBITMQ if ((config.nfacctd_bgp_msglog_amqp_routing_key && etype == BGP_LOGDUMP_ET_LOG) || (config.bgp_table_dump_amqp_routing_key && etype == BGP_LOGDUMP_ET_DUMP)) p_amqp_set_routing_key(peer->log->amqp_host, peer->log->filename); #endif if (output == PRINT_OUTPUT_JSON) { #ifdef WITH_JANSSON char ip_address[INET6_ADDRSTRLEN]; json_t *obj = json_object(), *kv; char empty[] = ""; char prefix_str[INET6_ADDRSTRLEN], nexthop_str[INET6_ADDRSTRLEN]; char *aspath; /* no need for seq and timestamp for "dump" event_type */ if (etype == BGP_LOGDUMP_ET_LOG) { kv = json_pack("{sI}", "seq", log_seq); json_object_update_missing(obj, kv); json_decref(kv); bgp_peer_log_seq_increment(&log_seq); kv = json_pack("{ss}", "timestamp", log_tstamp_str); json_object_update_missing(obj, kv); json_decref(kv); } addr_to_str(ip_address, &peer->addr); kv = json_pack("{ss}", "peer_ip_src", 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); memset(prefix_str, 0, INET6_ADDRSTRLEN); prefix2str(&route->p, prefix_str, INET6_ADDRSTRLEN); kv = json_pack("{ss}", "ip_prefix", prefix_str); json_object_update_missing(obj, kv); json_decref(kv); memset(nexthop_str, 0, INET6_ADDRSTRLEN); if (attr->mp_nexthop.family) addr_to_str(nexthop_str, &attr->mp_nexthop); else inet_ntop(AF_INET, &attr->nexthop, nexthop_str, INET6_ADDRSTRLEN); kv = json_pack("{ss}", "bgp_nexthop", nexthop_str); json_object_update_missing(obj, kv); json_decref(kv); if (ri && ri->extra && ri->extra->path_id) { kv = json_pack("{sI}", "as_path_id", ri->extra->path_id); json_object_update_missing(obj, kv); json_decref(kv); } aspath = attr->aspath ? attr->aspath->str : empty; kv = json_pack("{ss}", "as_path", aspath); json_object_update_missing(obj, kv); json_decref(kv); if (attr->community) { kv = json_pack("{ss}", "comms", attr->community->str); json_object_update_missing(obj, kv); json_decref(kv); } if (attr->ecommunity) { kv = json_pack("{ss}", "ecomms", attr->ecommunity->str); json_object_update_missing(obj, kv); json_decref(kv); } kv = json_pack("{sI}", "origin", attr->origin); json_object_update_missing(obj, kv); json_decref(kv); kv = json_pack("{sI}", "local_pref", attr->local_pref); json_object_update_missing(obj, kv); json_decref(kv); if (attr->med) { kv = json_pack("{sI}", "med", attr->med); json_object_update_missing(obj, kv); json_decref(kv); } if (safi == SAFI_MPLS_VPN) { u_char rd_str[SRVBUFLEN]; bgp_rd2str(rd_str, &ri->extra->rd); kv = json_pack("{ss}", "rd", rd_str); json_object_update_missing(obj, kv); json_decref(kv); } if ((config.nfacctd_bgp_msglog_file && etype == BGP_LOGDUMP_ET_LOG) || (config.bgp_table_dump_file && etype == BGP_LOGDUMP_ET_DUMP)) write_and_free_json(peer->log->fd, obj); #ifdef WITH_RABBITMQ if ((config.nfacctd_bgp_msglog_amqp_routing_key && etype == BGP_LOGDUMP_ET_LOG) || (config.bgp_table_dump_amqp_routing_key && etype == BGP_LOGDUMP_ET_DUMP)) { 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_msg(struct bgp_node *route, struct bgp_info *ri, afi_t afi, safi_t safi, char *event_type, int output, int log_type) { struct bgp_misc_structs *bms; char log_rk[SRVBUFLEN]; struct bgp_peer *peer; struct bgp_attr *attr; int ret = 0, amqp_ret = 0, kafka_ret = 0, etype = BGP_LOGDUMP_ET_NONE; pid_t writer_pid = getpid(); if (!ri || !ri->peer || !ri->peer->log || !event_type) return ERR; peer = ri->peer; attr = ri->attr; bms = bgp_select_misc_db(peer->type); if (!bms) return ERR; if (!strcmp(event_type, "dump")) etype = BGP_LOGDUMP_ET_DUMP; else if (!strcmp(event_type, "log")) etype = BGP_LOGDUMP_ET_LOG; #ifdef WITH_RABBITMQ if ((bms->msglog_amqp_routing_key && etype == BGP_LOGDUMP_ET_LOG) || (bms->dump_amqp_routing_key && etype == BGP_LOGDUMP_ET_DUMP)) p_amqp_set_routing_key(peer->log->amqp_host, peer->log->filename); #endif #ifdef WITH_KAFKA if ((bms->msglog_kafka_topic && etype == BGP_LOGDUMP_ET_LOG) || (bms->dump_kafka_topic && etype == BGP_LOGDUMP_ET_DUMP)) p_kafka_set_topic(peer->log->kafka_host, peer->log->filename); #endif if (output == PRINT_OUTPUT_JSON) { #ifdef WITH_JANSSON char ip_address[INET6_ADDRSTRLEN]; json_t *obj = json_object(); char empty[] = ""; char prefix_str[INET6_ADDRSTRLEN], nexthop_str[INET6_ADDRSTRLEN]; char *aspath; /* no need for seq for "dump" event_type */ if (etype == BGP_LOGDUMP_ET_LOG) { json_object_set_new_nocheck(obj, "seq", json_integer((json_int_t)bms->log_seq)); bgp_peer_log_seq_increment(&bms->log_seq); switch (log_type) { case BGP_LOG_TYPE_UPDATE: json_object_set_new_nocheck(obj, "log_type", json_string("update")); break; case BGP_LOG_TYPE_WITHDRAW: json_object_set_new_nocheck(obj, "log_type", json_string("withdraw")); break; case BGP_LOG_TYPE_DELETE: json_object_set_new_nocheck(obj, "log_type", json_string("delete")); break; default: json_object_set_new_nocheck(obj, "log_type", json_integer((json_int_t)log_type)); break; } } if (etype == BGP_LOGDUMP_ET_LOG) json_object_set_new_nocheck(obj, "timestamp", json_string(bms->log_tstamp_str)); else if (etype == BGP_LOGDUMP_ET_DUMP) json_object_set_new_nocheck(obj, "timestamp", json_string(bms->dump.tstamp_str)); if (bms->bgp_peer_log_msg_extras) bms->bgp_peer_log_msg_extras(peer, output, obj); if (ri && ri->extra && ri->extra->bmed.id && bms->bgp_peer_logdump_extra_data) bms->bgp_peer_logdump_extra_data(&ri->extra->bmed, 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)); json_object_set_new_nocheck(obj, "afi", json_integer((json_int_t)afi)); json_object_set_new_nocheck(obj, "safi", json_integer((json_int_t)safi)); if (route) { memset(prefix_str, 0, INET6_ADDRSTRLEN); prefix2str(&route->p, prefix_str, INET6_ADDRSTRLEN); json_object_set_new_nocheck(obj, "ip_prefix", json_string(prefix_str)); } if (ri && ri->extra && ri->extra->path_id) json_object_set_new_nocheck(obj, "as_path_id", json_integer((json_int_t)ri->extra->path_id)); if (attr) { memset(nexthop_str, 0, INET6_ADDRSTRLEN); if (attr->mp_nexthop.family) addr_to_str(nexthop_str, &attr->mp_nexthop); else inet_ntop(AF_INET, &attr->nexthop, nexthop_str, INET6_ADDRSTRLEN); json_object_set_new_nocheck(obj, "bgp_nexthop", json_string(nexthop_str)); aspath = attr->aspath ? attr->aspath->str : empty; json_object_set_new_nocheck(obj, "as_path", json_string(aspath)); if (attr->community) json_object_set_new_nocheck(obj, "comms", json_string(attr->community->str)); if (attr->ecommunity) json_object_set_new_nocheck(obj, "ecomms", json_string(attr->ecommunity->str)); if (attr->lcommunity) json_object_set_new_nocheck(obj, "lcomms", json_string(attr->lcommunity->str)); json_object_set_new_nocheck(obj, "origin", json_integer((json_int_t)attr->origin)); json_object_set_new_nocheck(obj, "local_pref", json_integer((json_int_t)attr->local_pref)); if (attr->med) json_object_set_new_nocheck(obj, "med", json_integer((json_int_t)attr->med)); } if (safi == SAFI_MPLS_LABEL || safi == SAFI_MPLS_VPN) { u_char label_str[SHORTSHORTBUFLEN]; if (safi == SAFI_MPLS_VPN) { u_char rd_str[SHORTSHORTBUFLEN]; bgp_rd2str(rd_str, &ri->extra->rd); json_object_set_new_nocheck(obj, "rd", json_string(rd_str)); } bgp_label2str(label_str, ri->extra->label); json_object_set_new_nocheck(obj, "label", json_string(label_str)); } if ((bms->msglog_file && etype == BGP_LOGDUMP_ET_LOG) || (bms->dump_file && etype == BGP_LOGDUMP_ET_DUMP)) write_and_free_json(peer->log->fd, obj); #ifdef WITH_RABBITMQ if ((bms->msglog_amqp_routing_key && etype == BGP_LOGDUMP_ET_LOG) || (bms->dump_amqp_routing_key && etype == BGP_LOGDUMP_ET_DUMP)) { 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 && etype == BGP_LOGDUMP_ET_LOG) || (bms->dump_kafka_topic && etype == BGP_LOGDUMP_ET_DUMP)) { 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); }