Exemple #1
0
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);
}
Exemple #2
0
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);
}