static int sorcery_astdb_create(const struct ast_sorcery *sorcery, void *data, void *object) { RAII_VAR(struct ast_json *, objset, ast_sorcery_objectset_json_create(sorcery, object), ast_json_unref); RAII_VAR(char *, value, NULL, ast_json_free); const char *prefix = data; char family[strlen(prefix) + strlen(ast_sorcery_object_get_type(object)) + 2]; if (!objset || !(value = ast_json_dump_string(objset))) { return -1; } snprintf(family, sizeof(family), "%s/%s", prefix, ast_sorcery_object_get_type(object)); return ast_db_put(family, ast_sorcery_object_get_id(object), value); }
static void rtcp_message_handler(struct stasis_message *message) { RAII_VAR(struct ast_json *, json_payload, NULL, ast_json_unref); RAII_VAR(char *, payload, NULL, ast_json_free); struct ast_json *json_blob; struct ast_json *json_channel; struct ast_json *json_rtcp; struct hepv3_capture_info *capture_info; struct ast_json *from; struct ast_json *to; struct timeval current_time = ast_tvnow(); json_payload = stasis_message_to_json(message, NULL); if (!json_payload) { return; } json_blob = ast_json_object_get(json_payload, "blob"); if (!json_blob) { return; } json_channel = ast_json_object_get(json_payload, "channel"); if (!json_channel) { return; } json_rtcp = ast_json_object_get(json_payload, "rtcp_report"); if (!json_rtcp) { return; } from = ast_json_object_get(json_blob, "from"); to = ast_json_object_get(json_blob, "to"); if (!from || !to) { return; } payload = ast_json_dump_string(json_rtcp); if (ast_strlen_zero(payload)) { return; } capture_info = hepv3_create_capture_info(payload, strlen(payload)); if (!capture_info) { return; } ast_sockaddr_parse(&capture_info->src_addr, ast_json_string_get(from), PARSE_PORT_REQUIRE); ast_sockaddr_parse(&capture_info->dst_addr, ast_json_string_get(to), PARSE_PORT_REQUIRE); capture_info->uuid = ast_strdup(ast_json_string_get(ast_json_object_get(json_channel, "name"))); if (!capture_info->uuid) { ao2_ref(capture_info, -1); return; } capture_info->capture_time = current_time; capture_info->capture_type = HEPV3_CAPTURE_TYPE_RTCP; capture_info->zipped = 0; hepv3_send_packet(capture_info); }
static int beanstalk_put(struct ast_cdr *cdr) { struct ast_tm timeresult; char strAnswerTime[80] = ""; char strStartTime[80]; char strEndTime[80]; char *cdr_buffer; int bs_id; int bs_socket; struct ast_json *t_cdr_json; if (!enablecdr) { return 0; } ast_rwlock_rdlock(&config_lock); bs_socket = bs_connect(bs_host, bs_port); if (bs_use(bs_socket, bs_tube) != BS_STATUS_OK) { ast_log(LOG_ERROR, "Connection to Beanstalk tube %s @ %s:%d had failed", bs_tube, bs_host, bs_port); ast_rwlock_unlock(&config_lock); return 0; } ast_localtime(&cdr->start, &timeresult, NULL); ast_strftime(strStartTime, sizeof(strStartTime), DATE_FORMAT, &timeresult); if (cdr->answer.tv_sec) { ast_localtime(&cdr->answer, &timeresult, NULL); ast_strftime(strAnswerTime, sizeof(strAnswerTime), DATE_FORMAT, &timeresult); } ast_localtime(&cdr->end, &timeresult, NULL); ast_strftime(strEndTime, sizeof(strEndTime), DATE_FORMAT, &timeresult); ast_rwlock_unlock(&config_lock); t_cdr_json = ast_json_pack("{s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:i, s:i, s:s, s:s, s:s, s:s}", "AccountCode", S_OR(cdr->accountcode, ""), "Source", S_OR(cdr->src, ""), "Destination", S_OR(cdr->dst, ""), "DestinationContext", S_OR(cdr->dcontext, ""), "CallerID", S_OR(cdr->clid, ""), "Channel", S_OR(cdr->channel, ""), "DestinationChannel", S_OR(cdr->dstchannel, ""), "LastApplication", S_OR(cdr->lastapp, ""), "LastData", S_OR(cdr->lastdata, ""), "StartTime", S_OR(strStartTime, ""), "AnswerTime", S_OR(strAnswerTime, ""), "EndTime", S_OR(strEndTime, ""), "Duration", cdr->duration, "Billsec", cdr->billsec, "Disposition", S_OR(ast_cdr_disp2str(cdr->disposition), ""), "AMAFlags", S_OR(ast_channel_amaflags2string(cdr->amaflags), ""), "UniqueID", S_OR(cdr->uniqueid, ""), "UserField", S_OR(cdr->userfield, "")); cdr_buffer = ast_json_dump_string(t_cdr_json); ast_json_unref(t_cdr_json); bs_id = bs_put(bs_socket, priority, BEANSTALK_JOB_DELAY, BEANSTALK_JOB_TTR, cdr_buffer, strlen(cdr_buffer)); if (bs_id > 0) { ast_log(LOG_DEBUG, "Successfully created job %d with %s\n", bs_id, cdr_buffer); } else { ast_log(LOG_ERROR, "CDR job creation failed for %s\n", cdr_buffer); } bs_disconnect(bs_socket); ast_json_free(cdr_buffer); return 0; }