json_t *CreateJSONHeader(const Packet *p, enum OutputJsonLogDirection dir, const char *event_type) { char timebuf[64]; const Flow *f = (const Flow *)p->flow; json_t *js = json_object(); if (unlikely(js == NULL)) return NULL; CreateIsoTimeString(&p->ts, timebuf, sizeof(timebuf)); /* time & tx */ json_object_set_new(js, "timestamp", json_string(timebuf)); CreateJSONFlowId(js, f); /* sensor id */ if (sensor_id >= 0) json_object_set_new(js, "sensor_id", json_integer(sensor_id)); /* input interface */ if (p->livedev) { json_object_set_new(js, "in_iface", json_string(p->livedev->dev)); } /* pcap_cnt */ if (p->pcap_cnt != 0) { json_object_set_new(js, "pcap_cnt", json_integer(p->pcap_cnt)); } if (event_type) { json_object_set_new(js, "event_type", json_string(event_type)); } /* vlan */ if (p->vlan_idx > 0) { json_t *js_vlan = json_array(); if (js_vlan) { json_array_append_new(js_vlan, json_integer(p->vlan_id[0])); if (p->vlan_idx > 1) { json_array_append_new(js_vlan, json_integer(p->vlan_id[1])); } json_object_set_new(js, "vlan", js_vlan); } } /* 5-tuple */ JsonFiveTuple(p, dir, js); /* icmp */ switch (p->proto) { case IPPROTO_ICMP: if (p->icmpv4h) { json_object_set_new(js, "icmp_type", json_integer(p->icmpv4h->type)); json_object_set_new(js, "icmp_code", json_integer(p->icmpv4h->code)); } break; case IPPROTO_ICMPV6: if (p->icmpv6h) { json_object_set_new(js, "icmp_type", json_integer(p->icmpv6h->type)); json_object_set_new(js, "icmp_code", json_integer(p->icmpv6h->code)); } break; } return js; }
/** * \brief Add flow variables to a json object. * * Adds "flowvars" (map), "flowints" (map) and "flowbits" (array) to * the json object provided as js_root. */ static void JsonAddFlowVars(const Flow *f, json_t *js_root, json_t **js_traffic) { if (f == NULL || f->flowvar == NULL) { return; } json_t *js_flowvars = NULL; json_t *js_traffic_id = NULL; json_t *js_traffic_label = NULL; json_t *js_flowints = NULL; json_t *js_flowbits = NULL; GenericVar *gv = f->flowvar; while (gv != NULL) { if (gv->type == DETECT_FLOWVAR || gv->type == DETECT_FLOWINT) { FlowVar *fv = (FlowVar *)gv; if (fv->datatype == FLOWVAR_TYPE_STR && fv->key == NULL) { const char *varname = VarNameStoreLookupById(fv->idx, VAR_TYPE_FLOW_VAR); if (varname) { if (js_flowvars == NULL) { js_flowvars = json_array(); if (js_flowvars == NULL) break; } uint32_t len = fv->data.fv_str.value_len; uint8_t printable_buf[len + 1]; uint32_t offset = 0; PrintStringsToBuffer(printable_buf, &offset, sizeof(printable_buf), fv->data.fv_str.value, fv->data.fv_str.value_len); json_t *js_flowvar = json_object(); if (unlikely(js_flowvar == NULL)) { break; } json_object_set_new(js_flowvar, varname, json_string((char *)printable_buf)); json_array_append_new(js_flowvars, js_flowvar); } } else if (fv->datatype == FLOWVAR_TYPE_STR && fv->key != NULL) { if (js_flowvars == NULL) { js_flowvars = json_array(); if (js_flowvars == NULL) break; } uint8_t keybuf[fv->keylen + 1]; uint32_t offset = 0; PrintStringsToBuffer(keybuf, &offset, sizeof(keybuf), fv->key, fv->keylen); uint32_t len = fv->data.fv_str.value_len; uint8_t printable_buf[len + 1]; offset = 0; PrintStringsToBuffer(printable_buf, &offset, sizeof(printable_buf), fv->data.fv_str.value, fv->data.fv_str.value_len); json_t *js_flowvar = json_object(); if (unlikely(js_flowvar == NULL)) { break; } json_object_set_new(js_flowvar, (const char *)keybuf, json_string((char *)printable_buf)); json_array_append_new(js_flowvars, js_flowvar); } else if (fv->datatype == FLOWVAR_TYPE_INT) { const char *varname = VarNameStoreLookupById(fv->idx, VAR_TYPE_FLOW_INT); if (varname) { if (js_flowints == NULL) { js_flowints = json_object(); if (js_flowints == NULL) break; } json_object_set_new(js_flowints, varname, json_integer(fv->data.fv_int.value)); } } } else if (gv->type == DETECT_FLOWBITS) { FlowBit *fb = (FlowBit *)gv; const char *varname = VarNameStoreLookupById(fb->idx, VAR_TYPE_FLOW_BIT); if (varname) { if (SCStringHasPrefix(varname, TRAFFIC_ID_PREFIX)) { if (js_traffic_id == NULL) { js_traffic_id = json_array(); if (unlikely(js_traffic_id == NULL)) { break; } } json_array_append_new(js_traffic_id, json_string(&varname[traffic_id_prefix_len])); } else if (SCStringHasPrefix(varname, TRAFFIC_LABEL_PREFIX)) { if (js_traffic_label == NULL) { js_traffic_label = json_array(); if (unlikely(js_traffic_label == NULL)) { break; } } json_array_append_new(js_traffic_label, json_string(&varname[traffic_label_prefix_len])); } else { if (js_flowbits == NULL) { js_flowbits = json_array(); if (unlikely(js_flowbits == NULL)) break; } json_array_append_new(js_flowbits, json_string(varname)); } } } gv = gv->next; } if (js_flowbits) { json_object_set_new(js_root, "flowbits", js_flowbits); } if (js_flowints) { json_object_set_new(js_root, "flowints", js_flowints); } if (js_flowvars) { json_object_set_new(js_root, "flowvars", js_flowvars); } if (js_traffic_id != NULL || js_traffic_label != NULL) { *js_traffic = json_object(); if (likely(*js_traffic != NULL)) { if (js_traffic_id != NULL) { json_object_set_new(*js_traffic, "id", js_traffic_id); } if (js_traffic_label != NULL) { json_object_set_new(*js_traffic, "label", js_traffic_label); } } } }
/** * \brief Add five tuple from packet to JSON object * * \param p Packet * \param dir log direction (packet or flow) * \param js JSON object */ void JsonFiveTuple(const Packet *p, enum OutputJsonLogDirection dir, json_t *js) { char srcip[46] = {0}, dstip[46] = {0}; Port sp, dp; char proto[16]; switch (dir) { case LOG_DIR_PACKET: if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), dstip, sizeof(dstip)); } else { /* Not an IP packet so don't do anything */ return; } sp = p->sp; dp = p->dp; break; case LOG_DIR_FLOW: case LOG_DIR_FLOW_TOSERVER: if ((PKT_IS_TOSERVER(p))) { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), dstip, sizeof(dstip)); } sp = p->sp; dp = p->dp; } else { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), dstip, sizeof(dstip)); } sp = p->dp; dp = p->sp; } break; case LOG_DIR_FLOW_TOCLIENT: if ((PKT_IS_TOCLIENT(p))) { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), dstip, sizeof(dstip)); } sp = p->sp; dp = p->dp; } else { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), dstip, sizeof(dstip)); } sp = p->dp; dp = p->sp; } break; default: DEBUG_VALIDATE_BUG_ON(1); return; } if (SCProtoNameValid(IP_GET_IPPROTO(p)) == TRUE) { strlcpy(proto, known_proto[IP_GET_IPPROTO(p)], sizeof(proto)); } else { snprintf(proto, sizeof(proto), "%03" PRIu32, IP_GET_IPPROTO(p)); } json_object_set_new(js, "src_ip", json_string(srcip)); switch(p->proto) { case IPPROTO_ICMP: break; case IPPROTO_UDP: case IPPROTO_TCP: case IPPROTO_SCTP: json_object_set_new(js, "src_port", json_integer(sp)); break; } json_object_set_new(js, "dest_ip", json_string(dstip)); switch(p->proto) { case IPPROTO_ICMP: break; case IPPROTO_UDP: case IPPROTO_TCP: case IPPROTO_SCTP: json_object_set_new(js, "dest_port", json_integer(dp)); break; } json_object_set_new(js, "proto", json_string(proto)); }
json_t *CreateJSONHeader(Packet *p, int direction_sensitive, char *event_type) { char timebuf[64]; char srcip[46], dstip[46]; Port sp, dp; json_t *js = json_object(); if (unlikely(js == NULL)) return NULL; CreateIsoTimeString(&p->ts, timebuf, sizeof(timebuf)); srcip[0] = '\0'; dstip[0] = '\0'; if (direction_sensitive) { if ((PKT_IS_TOSERVER(p))) { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), dstip, sizeof(dstip)); } sp = p->sp; dp = p->dp; } else { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), dstip, sizeof(dstip)); } sp = p->dp; dp = p->sp; } } else { if (PKT_IS_IPV4(p)) { PrintInet(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(p), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(p), dstip, sizeof(dstip)); } else if (PKT_IS_IPV6(p)) { PrintInet(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(p), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)GET_IPV6_DST_ADDR(p), dstip, sizeof(dstip)); } sp = p->sp; dp = p->dp; } char proto[16]; if (SCProtoNameValid(IP_GET_IPPROTO(p)) == TRUE) { strlcpy(proto, known_proto[IP_GET_IPPROTO(p)], sizeof(proto)); } else { snprintf(proto, sizeof(proto), "%03" PRIu32, IP_GET_IPPROTO(p)); } /* time & tx */ json_object_set_new(js, "timestamp", json_string(timebuf)); CreateJSONFlowId(js, (const Flow *)p->flow); /* sensor id */ if (sensor_id >= 0) json_object_set_new(js, "sensor_id", json_integer(sensor_id)); /* input interface */ if (p->livedev) { json_object_set_new(js, "in_iface", json_string(p->livedev->dev)); } /* pcap_cnt */ if (p->pcap_cnt != 0) { json_object_set_new(js, "pcap_cnt", json_integer(p->pcap_cnt)); } if (event_type) { json_object_set_new(js, "event_type", json_string(event_type)); } /* vlan */ if (p->vlan_idx > 0) { json_t *js_vlan; switch (p->vlan_idx) { case 1: json_object_set_new(js, "vlan", json_integer(VLAN_GET_ID1(p))); break; case 2: js_vlan = json_array(); if (unlikely(js != NULL)) { json_array_append_new(js_vlan, json_integer(VLAN_GET_ID1(p))); json_array_append_new(js_vlan, json_integer(VLAN_GET_ID2(p))); json_object_set_new(js, "vlan", js_vlan); } break; default: /* shouldn't get here */ break; } } /* tuple */ json_object_set_new(js, "src_ip", json_string(srcip)); switch(p->proto) { case IPPROTO_ICMP: break; case IPPROTO_UDP: case IPPROTO_TCP: case IPPROTO_SCTP: json_object_set_new(js, "src_port", json_integer(sp)); break; } json_object_set_new(js, "dest_ip", json_string(dstip)); switch(p->proto) { case IPPROTO_ICMP: break; case IPPROTO_UDP: case IPPROTO_TCP: case IPPROTO_SCTP: json_object_set_new(js, "dest_port", json_integer(dp)); break; } json_object_set_new(js, "proto", json_string(proto)); switch (p->proto) { case IPPROTO_ICMP: if (p->icmpv4h) { json_object_set_new(js, "icmp_type", json_integer(p->icmpv4h->type)); json_object_set_new(js, "icmp_code", json_integer(p->icmpv4h->code)); } break; case IPPROTO_ICMPV6: if (p->icmpv6h) { json_object_set_new(js, "icmp_type", json_integer(p->icmpv6h->type)); json_object_set_new(js, "icmp_code", json_integer(p->icmpv6h->code)); } break; } return js; }
/** * \internal * \brief Write meta data on a single line json record */ static void FileWriteJsonRecord(JsonFileLogThread *aft, const Packet *p, const File *ff) { MemBuffer *buffer = (MemBuffer *)aft->buffer; json_t *js = CreateJSONHeader((Packet *)p, 0, "fileinfo"); //TODO const if (unlikely(js == NULL)) return; /* reset */ MemBufferReset(buffer); json_t *hjs = json_object(); if (unlikely(hjs == NULL)) { json_decref(js); return; } json_object_set_new(hjs, "url", LogFileMetaGetUri(p, ff)); json_object_set_new(hjs, "hostname", LogFileMetaGetHost(p, ff)); json_object_set_new(hjs, "http_refer", LogFileMetaGetReferer(p, ff)); json_object_set_new(hjs, "http_user_agent", LogFileMetaGetUserAgent(p, ff)); json_object_set_new(js, "http", hjs); json_t *fjs = json_object(); if (unlikely(fjs == NULL)) { json_decref(hjs); json_decref(js); return; } char *s = BytesToString(ff->name, ff->name_len); json_object_set_new(fjs, "filename", json_string(s)); if (s != NULL) SCFree(s); if (ff->magic) json_object_set_new(fjs, "magic", json_string((char *)ff->magic)); else json_object_set_new(fjs, "magic", json_string("unknown")); switch (ff->state) { case FILE_STATE_CLOSED: json_object_set_new(fjs, "state", json_string("CLOSED")); #ifdef HAVE_NSS if (ff->flags & FILE_MD5) { size_t x; int i; char *s = SCMalloc(256); if (likely(s != NULL)) { for (i = 0, x = 0; x < sizeof(ff->md5); x++) { i += snprintf(&s[i], 255-i, "%02x", ff->md5[x]); } json_object_set_new(fjs, "md5", json_string(s)); SCFree(s); } } #endif break; case FILE_STATE_TRUNCATED: json_object_set_new(fjs, "state", json_string("TRUNCATED")); break; case FILE_STATE_ERROR: json_object_set_new(fjs, "state", json_string("ERROR")); break; default: json_object_set_new(fjs, "state", json_string("UNKNOWN")); break; } json_object_set_new(fjs, "stored", (ff->flags & FILE_STORED) ? json_true() : json_false()); json_object_set_new(fjs, "size", json_integer(ff->size)); /* originally just 'file', but due to bug 1127 naming it fileinfo */ json_object_set_new(js, "fileinfo", fjs); OutputJSONBuffer(js, aft->filelog_ctx->file_ctx, buffer); json_object_del(js, "fileinfo"); json_object_del(js, "http"); json_object_clear(js); json_decref(js); }
int bgp_peer_log_close(struct bgp_peer *peer, int output, int type) { struct bgp_misc_structs *bms = bgp_select_misc_db(type); char event_type[] = "log_close"; struct bgp_peer_log *log_ptr; void *amqp_log_ptr, *kafka_log_ptr; int ret = 0, amqp_ret = 0, kafka_ret = 0; pid_t writer_pid = getpid(); if (!bms || !peer || !peer->log) return ERR; #ifdef WITH_RABBITMQ if (bms->msglog_amqp_routing_key) p_amqp_set_routing_key(peer->log->amqp_host, peer->log->filename); #endif #ifdef WITH_KAFKA if (bms->msglog_kafka_topic) p_kafka_set_topic(peer->log->kafka_host, peer->log->filename); #endif log_ptr = peer->log; amqp_log_ptr = peer->log->amqp_host; kafka_log_ptr = peer->log->kafka_host; assert(peer->log->refcnt); peer->log->refcnt--; peer->log = NULL; 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->msglog_file) write_and_free_json(log_ptr->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(amqp_log_ptr, obj); p_amqp_unset_routing_key(amqp_log_ptr); } #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(kafka_log_ptr, obj); p_kafka_unset_topic(kafka_log_ptr); } #endif #endif } if (!log_ptr->refcnt) { if (bms->msglog_file && !log_ptr->refcnt) { fclose(log_ptr->fd); memset(log_ptr, 0, sizeof(struct bgp_peer_log)); } } return (ret | amqp_ret | kafka_ret); }
/* Thread to handle incoming messages */ static void *janus_echotest_handler(void *data) { JANUS_LOG(LOG_VERB, "Joining thread\n"); janus_echotest_message *msg = NULL; int error_code = 0; char *error_cause = calloc(512, sizeof(char)); /* FIXME 512 should be enough, but anyway... */ if(error_cause == NULL) { JANUS_LOG(LOG_FATAL, "Memory error!\n"); return NULL; } json_t *root = NULL; while(g_atomic_int_get(&initialized) && !g_atomic_int_get(&stopping)) { if(!messages || (msg = g_async_queue_try_pop(messages)) == NULL) { usleep(50000); continue; } janus_echotest_session *session = (janus_echotest_session *)msg->handle->plugin_handle; if(!session) { JANUS_LOG(LOG_ERR, "No session associated with this handle...\n"); janus_echotest_message_free(msg); continue; } if(session->destroyed) { janus_echotest_message_free(msg); continue; } /* Handle request */ error_code = 0; root = NULL; JANUS_LOG(LOG_VERB, "Handling message: %s\n", msg->message); if(msg->message == NULL) { JANUS_LOG(LOG_ERR, "No message??\n"); error_code = JANUS_ECHOTEST_ERROR_NO_MESSAGE; g_snprintf(error_cause, 512, "%s", "No message??"); goto error; } json_error_t error; root = json_loads(msg->message, 0, &error); if(!root) { JANUS_LOG(LOG_ERR, "JSON error: on line %d: %s\n", error.line, error.text); error_code = JANUS_ECHOTEST_ERROR_INVALID_JSON; g_snprintf(error_cause, 512, "JSON error: on line %d: %s", error.line, error.text); goto error; } if(!json_is_object(root)) { JANUS_LOG(LOG_ERR, "JSON error: not an object\n"); error_code = JANUS_ECHOTEST_ERROR_INVALID_JSON; g_snprintf(error_cause, 512, "JSON error: not an object"); goto error; } json_t *audio = json_object_get(root, "audio"); if(audio && !json_is_boolean(audio)) { JANUS_LOG(LOG_ERR, "Invalid element (audio should be a boolean)\n"); error_code = JANUS_ECHOTEST_ERROR_INVALID_ELEMENT; g_snprintf(error_cause, 512, "Invalid value (audio should be a boolean)"); goto error; } json_t *video = json_object_get(root, "video"); if(video && !json_is_boolean(video)) { JANUS_LOG(LOG_ERR, "Invalid element (video should be a boolean)\n"); error_code = JANUS_ECHOTEST_ERROR_INVALID_ELEMENT; g_snprintf(error_cause, 512, "Invalid value (video should be a boolean)"); goto error; } json_t *bitrate = json_object_get(root, "bitrate"); if(bitrate && !json_is_integer(bitrate)) { JANUS_LOG(LOG_ERR, "Invalid element (bitrate should be an integer)\n"); error_code = JANUS_ECHOTEST_ERROR_INVALID_ELEMENT; g_snprintf(error_cause, 512, "Invalid value (bitrate should be an integer)"); goto error; } if(audio) { session->audio_active = json_is_true(audio); JANUS_LOG(LOG_VERB, "Setting audio property: %s\n", session->audio_active ? "true" : "false"); } if(video) { session->video_active = json_is_true(video); JANUS_LOG(LOG_VERB, "Setting video property: %s\n", session->video_active ? "true" : "false"); } if(bitrate) { session->bitrate = json_integer_value(bitrate); JANUS_LOG(LOG_VERB, "Setting video bitrate: %"SCNu64"\n", session->bitrate); if(session->bitrate > 0) { /* FIXME Generate a new REMB (especially useful for Firefox, which doesn't send any we can cap later) */ char buf[24]; memset(buf, 0, 24); janus_rtcp_remb((char *)&buf, 24, session->bitrate); JANUS_LOG(LOG_VERB, "Sending REMB\n"); gateway->relay_rtcp(session->handle, 1, buf, 24); /* FIXME How should we handle a subsequent "no limit" bitrate? */ } } /* Any SDP to handle? */ if(msg->sdp) { JANUS_LOG(LOG_VERB, "This is involving a negotiation (%s) as well:\n%s\n", msg->sdp_type, msg->sdp); } json_decref(root); /* Prepare JSON event */ json_t *event = json_object(); json_object_set_new(event, "echotest", json_string("event")); json_object_set_new(event, "result", json_string("ok")); char *event_text = json_dumps(event, JSON_INDENT(3) | JSON_PRESERVE_ORDER); json_decref(event); JANUS_LOG(LOG_VERB, "Pushing event: %s\n", event_text); if(!msg->sdp) { int ret = gateway->push_event(msg->handle, &janus_echotest_plugin, msg->transaction, event_text, NULL, NULL); JANUS_LOG(LOG_VERB, " >> %d (%s)\n", ret, janus_get_api_error(ret)); } else { /* Forward the same offer to the gateway, to start the echo test */ const char *type = NULL; if(!strcasecmp(msg->sdp_type, "offer")) type = "answer"; if(!strcasecmp(msg->sdp_type, "answer")) type = "offer"; /* How long will the gateway take to push the event? */ gint64 start = janus_get_monotonic_time(); int res = gateway->push_event(msg->handle, &janus_echotest_plugin, msg->transaction, event_text, type, msg->sdp); JANUS_LOG(LOG_VERB, " >> Pushing event: %d (took %"SCNu64" us)\n", res, janus_get_monotonic_time()-start); } g_free(event_text); janus_echotest_message_free(msg); continue; error: { if(root != NULL) json_decref(root); /* Prepare JSON error event */ json_t *event = json_object(); json_object_set_new(event, "echotest", json_string("event")); json_object_set_new(event, "error_code", json_integer(error_code)); json_object_set_new(event, "error", json_string(error_cause)); char *event_text = json_dumps(event, JSON_INDENT(3) | JSON_PRESERVE_ORDER); json_decref(event); JANUS_LOG(LOG_VERB, "Pushing event: %s\n", event_text); int ret = gateway->push_event(msg->handle, &janus_echotest_plugin, msg->transaction, event_text, NULL, NULL); JANUS_LOG(LOG_VERB, " >> %d (%s)\n", ret, janus_get_api_error(ret)); g_free(event_text); janus_echotest_message_free(msg); } } g_free(error_cause); JANUS_LOG(LOG_VERB, "Leaving thread\n"); return NULL; }
/* JSON format logging */ static void JsonFlowLogJSON(JsonFlowLogThread *aft, json_t *js, Flow *f) { LogJsonFileCtx *flow_ctx = aft->flowlog_ctx; json_t *hjs = json_object(); if (hjs == NULL) { return; } JsonAddFlow(f, js, hjs); char timebuf2[64]; CreateIsoTimeString(&f->lastts, timebuf2, sizeof(timebuf2)); json_object_set_new(hjs, "end", json_string(timebuf2)); int32_t age = f->lastts.tv_sec - f->startts.tv_sec; json_object_set_new(hjs, "age", json_integer(age)); if (f->flow_end_flags & FLOW_END_FLAG_EMERGENCY) json_object_set_new(hjs, "emergency", json_true()); const char *state = NULL; if (f->flow_end_flags & FLOW_END_FLAG_STATE_NEW) state = "new"; else if (f->flow_end_flags & FLOW_END_FLAG_STATE_ESTABLISHED) state = "established"; else if (f->flow_end_flags & FLOW_END_FLAG_STATE_CLOSED) state = "closed"; else if (f->flow_end_flags & FLOW_END_FLAG_STATE_BYPASSED) { state = "bypassed"; int flow_state = SC_ATOMIC_GET(f->flow_state); switch (flow_state) { case FLOW_STATE_LOCAL_BYPASSED: json_object_set_new(hjs, "bypass", json_string("local")); break; case FLOW_STATE_CAPTURE_BYPASSED: json_object_set_new(hjs, "bypass", json_string("capture")); break; default: SCLogError(SC_ERR_INVALID_VALUE, "Invalid flow state: %d, contact developers", flow_state); } } json_object_set_new(hjs, "state", json_string(state)); const char *reason = NULL; if (f->flow_end_flags & FLOW_END_FLAG_TIMEOUT) reason = "timeout"; else if (f->flow_end_flags & FLOW_END_FLAG_FORCED) reason = "forced"; else if (f->flow_end_flags & FLOW_END_FLAG_SHUTDOWN) reason = "shutdown"; json_object_set_new(hjs, "reason", json_string(reason)); json_object_set_new(hjs, "alerted", json_boolean(FlowHasAlerts(f))); if (f->flags & FLOW_WRONG_THREAD) json_object_set_new(hjs, "wrong_thread", json_true()); json_object_set_new(js, "flow", hjs); JsonAddCommonOptions(&flow_ctx->cfg, NULL, f, js); /* TCP */ if (f->proto == IPPROTO_TCP) { json_t *tjs = json_object(); if (tjs == NULL) { return; } TcpSession *ssn = f->protoctx; char hexflags[3]; snprintf(hexflags, sizeof(hexflags), "%02x", ssn ? ssn->tcp_packet_flags : 0); json_object_set_new(tjs, "tcp_flags", json_string(hexflags)); snprintf(hexflags, sizeof(hexflags), "%02x", ssn ? ssn->client.tcp_flags : 0); json_object_set_new(tjs, "tcp_flags_ts", json_string(hexflags)); snprintf(hexflags, sizeof(hexflags), "%02x", ssn ? ssn->server.tcp_flags : 0); json_object_set_new(tjs, "tcp_flags_tc", json_string(hexflags)); JsonTcpFlags(ssn ? ssn->tcp_packet_flags : 0, tjs); if (ssn) { const char *tcp_state = NULL; switch (ssn->state) { case TCP_NONE: tcp_state = "none"; break; case TCP_LISTEN: tcp_state = "listen"; break; case TCP_SYN_SENT: tcp_state = "syn_sent"; break; case TCP_SYN_RECV: tcp_state = "syn_recv"; break; case TCP_ESTABLISHED: tcp_state = "established"; break; case TCP_FIN_WAIT1: tcp_state = "fin_wait1"; break; case TCP_FIN_WAIT2: tcp_state = "fin_wait2"; break; case TCP_TIME_WAIT: tcp_state = "time_wait"; break; case TCP_LAST_ACK: tcp_state = "last_ack"; break; case TCP_CLOSE_WAIT: tcp_state = "close_wait"; break; case TCP_CLOSING: tcp_state = "closing"; break; case TCP_CLOSED: tcp_state = "closed"; break; } json_object_set_new(tjs, "state", json_string(tcp_state)); if (ssn->client.flags & STREAMTCP_STREAM_FLAG_GAP) json_object_set_new(tjs, "gap_ts", json_true()); if (ssn->server.flags & STREAMTCP_STREAM_FLAG_GAP) json_object_set_new(tjs, "gap_tc", json_true()); } json_object_set_new(js, "tcp", tjs); } }
static json_t *CreateJSONHeaderFromFlow(const Flow *f, const char *event_type) { char timebuf[64]; char srcip[46] = {0}, dstip[46] = {0}; Port sp, dp; json_t *js = json_object(); if (unlikely(js == NULL)) return NULL; struct timeval tv; memset(&tv, 0x00, sizeof(tv)); TimeGet(&tv); CreateIsoTimeString(&tv, timebuf, sizeof(timebuf)); if ((f->flags & FLOW_DIR_REVERSED) == 0) { if (FLOW_IS_IPV4(f)) { PrintInet(AF_INET, (const void *)&(f->src.addr_data32[0]), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)&(f->dst.addr_data32[0]), dstip, sizeof(dstip)); } else if (FLOW_IS_IPV6(f)) { PrintInet(AF_INET6, (const void *)&(f->src.address), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)&(f->dst.address), dstip, sizeof(dstip)); } sp = f->sp; dp = f->dp; } else { if (FLOW_IS_IPV4(f)) { PrintInet(AF_INET, (const void *)&(f->dst.addr_data32[0]), srcip, sizeof(srcip)); PrintInet(AF_INET, (const void *)&(f->src.addr_data32[0]), dstip, sizeof(dstip)); } else if (FLOW_IS_IPV6(f)) { PrintInet(AF_INET6, (const void *)&(f->dst.address), srcip, sizeof(srcip)); PrintInet(AF_INET6, (const void *)&(f->src.address), dstip, sizeof(dstip)); } sp = f->dp; dp = f->sp; } char proto[16]; if (SCProtoNameValid(f->proto) == TRUE) { strlcpy(proto, known_proto[f->proto], sizeof(proto)); } else { snprintf(proto, sizeof(proto), "%03" PRIu32, f->proto); } /* time */ json_object_set_new(js, "timestamp", json_string(timebuf)); CreateJSONFlowId(js, (const Flow *)f); #if 0 // TODO /* sensor id */ if (sensor_id >= 0) json_object_set_new(js, "sensor_id", json_integer(sensor_id)); #endif if (event_type) { json_object_set_new(js, "event_type", json_string(event_type)); } #if 0 /* vlan */ if (f->vlan_id[0] > 0) { json_t *js_vlan; switch (f->vlan_idx) { case 1: json_object_set_new(js, "vlan", json_integer(f->vlan_id[0])); break; case 2: js_vlan = json_array(); if (unlikely(js != NULL)) { json_array_append_new(js_vlan, json_integer(VLAN_GET_ID1(p))); json_array_append_new(js_vlan, json_integer(VLAN_GET_ID2(p))); json_object_set_new(js, "vlan", js_vlan); } break; default: /* shouldn't get here */ break; } } #endif /* tuple */ json_object_set_new(js, "src_ip", json_string(srcip)); switch(f->proto) { case IPPROTO_ICMP: break; case IPPROTO_UDP: case IPPROTO_TCP: case IPPROTO_SCTP: json_object_set_new(js, "src_port", json_integer(sp)); break; } json_object_set_new(js, "dest_ip", json_string(dstip)); switch(f->proto) { case IPPROTO_ICMP: break; case IPPROTO_UDP: case IPPROTO_TCP: case IPPROTO_SCTP: json_object_set_new(js, "dest_port", json_integer(dp)); break; } json_object_set_new(js, "proto", json_string(proto)); switch (f->proto) { case IPPROTO_ICMP: case IPPROTO_ICMPV6: json_object_set_new(js, "icmp_type", json_integer(f->icmp_s.type)); json_object_set_new(js, "icmp_code", json_integer(f->icmp_s.code)); if (f->tosrcpktcnt) { json_object_set_new(js, "response_icmp_type", json_integer(f->icmp_d.type)); json_object_set_new(js, "response_icmp_code", json_integer(f->icmp_d.code)); } break; } return js; }
static int do_connect(const char *host, int port, const char *user, const char *pass, const char *email, int reg_user, int connid) { int fd = -1, authresult, copylen; char ipv6_error[120], ipv4_error[120], errmsg[256]; json_t *jmsg, *jarr; #ifdef UNIX /* try to connect to a local unix socket */ struct sockaddr_un sun; sun.sun_family = AF_UNIX; copylen = strlen(host) + 1; if (copylen > sizeof(sun.sun_path) - 1) copylen = sizeof(sun.sun_path) - 1; memcpy(sun.sun_path, host, copylen); sun.sun_path[sizeof(sun.sun_path) - 1] = '\0'; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd >= 0) { if (connect(fd, (struct sockaddr*)&sun, sizeof(sun)) == -1) { close(fd); fd = -1; } } #endif /* try ipv6 */ if (fd == -1) fd = connect_server(host, port, FALSE, ipv6_error, 120); if (fd == -1) /* no ipv6 connection, try ipv4 */ fd = connect_server(host, port, TRUE, ipv4_error, 120); if (fd == -1) { /* both connection attempts failed: error message */ if (!ipv6_error[0] && !ipv4_error[0]) { snprintf(errmsg, 256, "No address for \"%s\" found!", host); print_error(errmsg); } if (ipv6_error[0]) { snprintf(errmsg, 256, "IPv6: %s", ipv6_error); print_error(errmsg); } if (ipv4_error[0]) { snprintf(errmsg, 256, "IPv4: %s", ipv4_error); print_error(errmsg); } return NO_CONNECTION; } in_connect_disconnect = TRUE; sockfd = fd; jmsg = json_pack("{ss,ss}", "username", user, "password", pass); if (reg_user) { if (email) json_object_set_new(jmsg, "email", json_string(email)); jmsg = send_receive_msg("register", jmsg); } else { if (connid) json_object_set_new(jmsg, "reconnect", json_integer(connid)); jmsg = send_receive_msg("auth", jmsg); } in_connect_disconnect = FALSE; if (!jmsg || json_unpack(jmsg, "{si,si*}", "return", &authresult, "connection", &connection_id) == -1) { if (jmsg) json_decref(jmsg); close(fd); return NO_CONNECTION; } /* the "version" field in the response is optional */ if (json_unpack(jmsg, "{so*}", "version", &jarr) != -1 && json_is_array(jarr) && json_array_size(jarr) >= 3) { nhnet_server_ver.major = json_integer_value(json_array_get(jarr, 0)); nhnet_server_ver.minor = json_integer_value(json_array_get(jarr, 1)); nhnet_server_ver.patchlevel = json_integer_value(json_array_get(jarr, 2)); } json_decref(jmsg); if (host != saved_hostname) strncpy(saved_hostname, host, sizeof(saved_hostname)); if (user != saved_username) strncpy(saved_username, user, sizeof(saved_username)); if (pass != saved_password) strncpy(saved_password, pass, sizeof(saved_password)); saved_port = port; conn_err = FALSE; net_active = TRUE; return authresult; }
static WARN_UNUSED_RESULT struct ovsdb_error * ovsdb_clause_from_json(const struct ovsdb_table_schema *ts, const struct json *json, struct ovsdb_symbol_table *symtab, struct ovsdb_clause *clause) { const struct json_array *array; struct ovsdb_error *error; const char *function_name; const char *column_name; struct ovsdb_type type; if (json->type != JSON_ARRAY || json->u.array.n != 3 || json->u.array.elems[0]->type != JSON_STRING || json->u.array.elems[1]->type != JSON_STRING) { return ovsdb_syntax_error(json, NULL, "Parse error in condition."); } array = json_array(json); column_name = json_string(array->elems[0]); clause->column = ovsdb_table_schema_get_column(ts, column_name); if (!clause->column) { return ovsdb_syntax_error(json, "unknown column", "No column %s in table %s.", column_name, ts->name); } type = clause->column->type; function_name = json_string(array->elems[1]); error = ovsdb_function_from_string(function_name, &clause->function); if (error) { return error; } /* Type-check and relax restrictions on 'type' if appropriate. */ switch (clause->function) { case OVSDB_F_LT: case OVSDB_F_LE: case OVSDB_F_GT: case OVSDB_F_GE: /* XXX should we also allow these operators for types with n_min == 0, * n_max == 1? (They would always be "false" if the value was * missing.) */ if (!ovsdb_type_is_scalar(&type) || (type.key.type != OVSDB_TYPE_INTEGER && type.key.type != OVSDB_TYPE_REAL)) { char *s = ovsdb_type_to_english(&type); error = ovsdb_syntax_error( json, NULL, "Type mismatch: \"%s\" operator may not be " "applied to column %s of type %s.", ovsdb_function_to_string(clause->function), clause->column->name, s); free(s); return error; } break; case OVSDB_F_EQ: case OVSDB_F_NE: break; case OVSDB_F_EXCLUDES: if (!ovsdb_type_is_scalar(&type)) { type.n_min = 0; type.n_max = UINT_MAX; } break; case OVSDB_F_INCLUDES: if (!ovsdb_type_is_scalar(&type)) { type.n_min = 0; } break; } return ovsdb_datum_from_json(&clause->arg, &type, array->elems[2], symtab); }
int main (int argc, char **argv) { struct _u_map headers, url_params, post_params, req_headers; char * string_body = "param1=one¶m2=two"; json_t * json_body = json_object(); struct _u_response response; int res; u_map_init(&headers); u_map_init(&url_params); u_map_put(&url_params, "test", "one"); u_map_put(&url_params, "other_test", "two"); u_map_init(&post_params); u_map_put(&post_params, "third_test", "three"); u_map_put(&post_params, "fourth_test", "four"); u_map_put(&post_params, "extreme_test", "Here ! are %9_ some $ ö\\)]= special châraçters"); u_map_init(&req_headers); u_map_put(&req_headers, "Content-Type", MHD_HTTP_POST_ENCODING_FORM_URLENCODED); json_object_set_new(json_body, "param1", json_string("one")); json_object_set_new(json_body, "param2", json_string("two")); struct _u_request req_list[] = { {"GET", SERVER_URL_PREFIX "/get/", NULL, &url_params, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0}, // Parameters in url {"DELETE", SERVER_URL_PREFIX "/delete/", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0}, // No parameters {"POST", SERVER_URL_PREFIX "/post/param/", NULL, NULL, NULL, NULL, &post_params, NULL, NULL, 0, string_body, strlen(string_body)}, // Parameters in post_map and string_body {"POST", SERVER_URL_PREFIX "/post/plain/", NULL, NULL, &req_headers, NULL, NULL, NULL, NULL, 0, string_body, strlen(string_body)}, // Paremeters in string body, header MHD_HTTP_POST_ENCODING_FORM_URLENCODED {"POST", SERVER_URL_PREFIX "/post/json/", NULL, NULL, NULL, NULL, NULL, json_body, NULL, 0, NULL, 0}, // Parameters in json_body {"PUT", SERVER_URL_PREFIX "/put/plain", NULL, NULL, &req_headers, NULL, NULL, NULL, NULL, 0, string_body, strlen(string_body)}, // Paremeters in string body, header MHD_HTTP_POST_ENCODING_FORM_URLENCODED {"PUT", SERVER_URL_PREFIX "/put/json", NULL, NULL, NULL, NULL, NULL, json_body, NULL, 0, NULL, 0}, // Parameters in json_body {"POST", SERVER_URL_PREFIX "/post/param/", NULL, NULL, NULL, NULL, &post_params, NULL, NULL, 0, NULL, 0} // Parameters in post_map }; printf("Press <enter> to run get test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[0], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run get test with no interest on the response\n"); getchar(); printf("Request sent, result is %d\n", ulfius_send_http_request(&req_list[0], NULL)); printf("Press <enter> to run delete test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[1], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run post parameters test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[2], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run post plain test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[3], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run post json test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[4], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run put plain test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[5], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run put json test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[6], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); printf("Press <enter> to run post only test\n"); getchar(); ulfius_init_response(&response); res = ulfius_send_http_request(&req_list[7], &response); if (res == U_OK) { print_response(&response); } else { printf("Error in http request: %d\n", res); } ulfius_clean_response(&response); // Wait for the user to press <enter> on the console to quit the application printf("Press <enter> to quit test\n"); getchar(); json_decref(json_body); u_map_clean(&headers); u_map_clean(&url_params); u_map_clean(&post_params); u_map_clean(&req_headers); return 0; }
struct ast_json *ast_json_string_create(const char *value) { return (struct ast_json *)json_string(value); }
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); }
int jsonPackDictionary( dictionary_t *dictionary, json_t **outObj ) { json_t *paramObj; int i, status; if ( dictionary == NULL || outObj == NULL ) { return USER__NULL_INPUT_ERR; } paramObj = json_object(); for ( i = 0; i < dictionary->len; i++ ) { char *type_PI = dictionary->value[i].type_PI; if ( strcmp( type_PI, STR_MS_T ) == 0 ) { status = json_object_set_new( paramObj, dictionary->key[i], json_string( ( char * ) dictionary->value[i].ptr ) ); } else if ( strcmp( type_PI, INT_MS_T ) == 0 ) { #if JSON_INTEGER_IS_LONG_LONG rodsLong_t myInt = *( int * ) dictionary->value[i].ptr; #else int myInt = *( int * ) dictionary->value[i].ptr; #endif status = json_object_set_new( paramObj, dictionary->key[i], json_integer( myInt ) ); } else if ( strcmp( type_PI, FLOAT_MS_T ) == 0 ) { #if JSON_INTEGER_IS_LONG_LONG double myFloat = *( float * ) dictionary->value[i].ptr; #else float myFloat = *( float * ) dictionary->value[i].ptr; #endif status = json_object_set_new( paramObj, dictionary->key[i], json_real( myFloat ) ); } else if ( strcmp( type_PI, DOUBLE_MS_T ) == 0 ) { /* DOUBLE_MS_T in iRODS is longlong */ #if JSON_INTEGER_IS_LONG_LONG rodsLong_t myInt = *( rodsLong_t * ) dictionary->value[i].ptr; #else int myInt = *( rodsLong_t * ) dictionary->value[i].ptr; #endif status = json_object_set_new( paramObj, dictionary->key[i], json_integer( myInt ) ); } else if ( strcmp( type_PI, BOOL_MS_T ) == 0 ) { int myInt = *( int * ) dictionary->value[i].ptr; if ( myInt == 0 ) { status = json_object_set_new( paramObj, dictionary->key[i], json_false() ); } else { status = json_object_set_new( paramObj, dictionary->key[i], json_true() ); } } else if ( strcmp( type_PI, Dictionary_MS_T ) == 0 ) { json_t *dictObj = NULL; status = jsonPackDictionary( ( dictionary_t * ) dictionary->value[i].ptr, &dictObj ); if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "jsonPackDictionary: jsonPackDictionary error" ); json_decref( paramObj ); return status; } status = json_object_set_new( paramObj, dictionary->key[i], dictObj ); } else { rodsLog( LOG_ERROR, "jsonPackDictionary: type_PI %s not supported", type_PI ); json_decref( paramObj ); return OOI_DICT_TYPE_NOT_SUPPORTED; } if ( status != 0 ) { rodsLog( LOG_ERROR, "jsonPackDictionary: son_object_set paramObj error" ); json_decref( paramObj ); return OOI_JSON_OBJ_SET_ERR; } } *outObj = paramObj; return 0; }
static json_t *btcity_toPath(const void *vc) { btcity_t *c = (btcity_t *)vc; return json_string(c->name->buf); }
/* JSON format logging */ static void JsonFlowLogJSON(JsonFlowLogThread *aft, json_t *js, Flow *f) { #if 0 LogJsonFileCtx *flow_ctx = aft->flowlog_ctx; #endif json_t *hjs = json_object(); if (hjs == NULL) { return; } json_object_set_new(js, "app_proto", json_string(AppProtoToString(f->alproto))); json_object_set_new(hjs, "pkts_toserver", json_integer(f->todstpktcnt)); json_object_set_new(hjs, "pkts_toclient", json_integer(f->tosrcpktcnt)); json_object_set_new(hjs, "bytes_toserver", json_integer(f->todstbytecnt)); json_object_set_new(hjs, "bytes_toclient", json_integer(f->tosrcbytecnt)); char timebuf1[64], timebuf2[64]; CreateIsoTimeString(&f->startts, timebuf1, sizeof(timebuf1)); CreateIsoTimeString(&f->lastts, timebuf2, sizeof(timebuf2)); json_object_set_new(hjs, "start", json_string(timebuf1)); json_object_set_new(hjs, "end", json_string(timebuf2)); int32_t age = f->lastts.tv_sec - f->startts.tv_sec; json_object_set_new(hjs, "age", json_integer(age)); if (f->flow_end_flags & FLOW_END_FLAG_EMERGENCY) json_object_set_new(hjs, "emergency", json_true()); const char *state = NULL; if (f->flow_end_flags & FLOW_END_FLAG_STATE_NEW) state = "new"; else if (f->flow_end_flags & FLOW_END_FLAG_STATE_ESTABLISHED) state = "established"; else if (f->flow_end_flags & FLOW_END_FLAG_STATE_CLOSED) state = "closed"; json_object_set_new(hjs, "state", json_string(state)); const char *reason = NULL; if (f->flow_end_flags & FLOW_END_FLAG_TIMEOUT) reason = "timeout"; else if (f->flow_end_flags & FLOW_END_FLAG_FORCED) reason = "forced"; else if (f->flow_end_flags & FLOW_END_FLAG_SHUTDOWN) reason = "shutdown"; json_object_set_new(hjs, "reason", json_string(reason)); json_object_set_new(js, "flow", hjs); /* TCP */ if (f->proto == IPPROTO_TCP) { json_t *tjs = json_object(); if (tjs == NULL) { return; } TcpSession *ssn = f->protoctx; char hexflags[3] = ""; snprintf(hexflags, sizeof(hexflags), "%02x", ssn ? ssn->tcp_packet_flags : 0); json_object_set_new(tjs, "tcp_flags", json_string(hexflags)); snprintf(hexflags, sizeof(hexflags), "%02x", ssn ? ssn->client.tcp_flags : 0); json_object_set_new(tjs, "tcp_flags_ts", json_string(hexflags)); snprintf(hexflags, sizeof(hexflags), "%02x", ssn ? ssn->server.tcp_flags : 0); json_object_set_new(tjs, "tcp_flags_tc", json_string(hexflags)); JsonTcpFlags(ssn ? ssn->tcp_packet_flags : 0, tjs); if (ssn) { char *state = NULL; switch (ssn->state) { case TCP_NONE: state = "none"; break; case TCP_LISTEN: state = "listen"; break; case TCP_SYN_SENT: state = "syn_sent"; break; case TCP_SYN_RECV: state = "syn_recv"; break; case TCP_ESTABLISHED: state = "established"; break; case TCP_FIN_WAIT1: state = "fin_wait1"; break; case TCP_FIN_WAIT2: state = "fin_wait2"; break; case TCP_TIME_WAIT: state = "time_wait"; break; case TCP_LAST_ACK: state = "last_ack"; break; case TCP_CLOSE_WAIT: state = "close_wait"; break; case TCP_CLOSING: state = "closing"; break; case TCP_CLOSED: state = "closed"; break; } json_object_set_new(tjs, "state", json_string(state)); } json_object_set_new(js, "tcp", tjs); } }
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); }