diff --git a/CMakeLists.txt b/CMakeLists.txt index eefbdea..7cc4332 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,11 +7,9 @@ set(CMAKE_C_FLAGS "-O1 -Wall -std=gnu99 -g") set(LIBS pthread mnl) set(SOURCE metadata_exporter.c - netlink_helpers.c backend_event_loop.c metadata_utils.c system_helpers.c - metadata_input_netlink.c metadata_input_nl_zmq_common.c lib/minmea.c) diff --git a/metadata_exporter.c b/metadata_exporter.c index 6749dd2..8745dbb 100644 --- a/metadata_exporter.c +++ b/metadata_exporter.c @@ -56,7 +56,6 @@ #ifdef GPS_NSB_SUPPORT #include "metadata_input_gps_nsb.h" #endif -#include "metadata_input_netlink.h" #include "metadata_input_iface_test.h" #ifdef SQLITE_SUPPORT #include "metadata_writer_sqlite.h" @@ -75,7 +74,6 @@ #include "metadata_writer_file.h" #endif -#include "netlink_helpers.h" #include "backend_event_loop.h" #include "metadata_exporter_log.h" @@ -167,492 +165,6 @@ static int configure_core(struct md_exporter **mde) return RETVAL_SUCCESS; } -#if 0 -static struct json_object *create_fake_gps_gga_obj() -{ - struct json_object *obj = NULL, *obj_add = NULL; - struct timeval tv; - - if (!(obj = json_object_new_object())) - return NULL; - - gettimeofday(&tv, NULL); - if (!(obj_add = json_object_new_int64(tv.tv_sec))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "timestamp", obj_add); - - if (!(obj_add = json_object_new_int(META_TYPE_POS))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_type", obj_add); - - if (!(obj_add = json_object_new_string("$GPGGA,190406.0,5103.732280,N,01701.493660,E,1,05,1.7,130.0,M,42.0,M,,*53"))) { - json_object_put(obj); - return NULL; - } - - json_object_object_add(obj, "nmea_string", obj_add); - - return obj; -} - -static struct json_object *create_fake_gps_rmc_obj() -{ - struct json_object *obj = NULL, *obj_add = NULL; - struct timeval tv; - - if (!(obj = json_object_new_object())) - return NULL; - - gettimeofday(&tv, NULL); - if (!(obj_add = json_object_new_int64(tv.tv_sec))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "timestamp", obj_add); - - if (!(obj_add = json_object_new_int(META_TYPE_POS))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_type", obj_add); - - if (!(obj_add = json_object_new_string("$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68"))) { - json_object_put(obj); - return NULL; - } - - json_object_object_add(obj, "nmea_string", obj_add); - - return obj; -} -#endif - -static struct json_object *create_fake_restart_obj() -{ - struct json_object *obj = NULL, *obj_add = NULL; - struct timeval tv; - - if (!(obj = json_object_new_object())) { - return NULL; - } - - gettimeofday(&tv, NULL); - if (!(obj_add = json_object_new_int64(tv.tv_sec))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "timestamp", obj_add); - - if (!(obj_add = json_object_new_int(META_TYPE_SYSTEM))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_type", obj_add); - - if (!(obj_add = json_object_new_string("861107030230685"))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "imei", obj_add); - - return obj; -} - -static struct json_object *create_fake_conn_obj(uint64_t l3_id, uint64_t l4_id, - uint8_t event_param, char *event_value_str, uint64_t tstamp) -{ - struct json_object *obj = NULL, *obj_add = NULL; - uint8_t rand_value = 0; - uint64_t rand_value_64 = 0; - struct timeval tv; - - if (!(obj = json_object_new_object())) - return NULL; - - gettimeofday(&tv, NULL); - if (!(obj_add = json_object_new_int64(tv.tv_sec))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "timestamp", obj_add); - - if (l3_id) - rand_value_64 = l3_id; - else - rand_value_64 = (uint64_t) random(); - - if (!(obj_add = json_object_new_int64(rand_value_64))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "l3_session_id", obj_add); - - if (l4_id) - rand_value_64 = l4_id; - else - rand_value_64 = (uint64_t) random(); - - if (!(obj_add = json_object_new_int64(rand_value_64))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "l4_session_id", obj_add); - - if (!(obj_add = json_object_new_int(META_TYPE_CONNECTION))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_type", obj_add); - - rand_value = (uint8_t) random(); - if (!(obj_add = json_object_new_int(rand_value))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "interface_type", obj_add); - - rand_value = (uint8_t) random(); - if (!(obj_add = json_object_new_int(rand_value))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "network_address_family", obj_add); - - if (!event_param) - rand_value = (uint8_t) random(); - else - rand_value = event_param; - - if (!(obj_add = json_object_new_int(rand_value))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_param", obj_add); - - if (event_value_str) { - if (!(obj_add = json_object_new_string(event_value_str))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_value_str", obj_add); - } else { - rand_value = (uint8_t) random(); - if (!(obj_add = json_object_new_int(rand_value))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "event_value", obj_add); - } - - rand_value = (uint8_t) random(); - if (!(obj_add = json_object_new_int(rand_value))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "interface_id_type", obj_add); - - if (!(obj_add = json_object_new_string("89470000140710276612"))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "interface_id", obj_add); - - if (!(obj_add = json_object_new_string("1234567"))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "imei", obj_add); - - if (!(obj_add = json_object_new_string("22222"))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "imsi", obj_add); - - if (!(obj_add = json_object_new_string("192.168.0.153/24"))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "network_address", obj_add); - - rand_value = (uint8_t) random(); - if (rand_value % 2) { - obj_add = json_object_new_int(24201); - - if (!obj_add) { - json_object_put(obj); - return NULL; - } - - json_object_object_add(obj, "network_provider", obj_add); - } - - if (!(obj_add = json_object_new_int(-99))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "signal_strength", obj_add); - - if (!(obj_add = json_object_new_int(100))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "rx_bytes", obj_add); - - if (!(obj_add = json_object_new_int(100))) { - json_object_put(obj); - return NULL; - } - json_object_object_add(obj, "tx_bytes", obj_add); - - return obj; -} - -static ssize_t send_netlink_json(uint8_t *snd_buf, - struct json_object *parsed_obj, int32_t sock_fd, - struct sockaddr *netlink_addr) -{ - struct nlmsghdr *netlink_hdr = (struct nlmsghdr*) snd_buf; - const char *json_str = json_object_to_json_string_ext(parsed_obj, - JSON_C_TO_STRING_PLAIN); - socklen_t netlink_addrlen = sizeof(netlink_addr); - - memcpy(netlink_hdr + 1, json_str, strlen(json_str) + 1); - netlink_hdr->nlmsg_len = mnl_nlmsg_size(MNL_ALIGN(strlen(json_str))); - - return sendto(sock_fd, snd_buf, netlink_hdr->nlmsg_len, 0, netlink_addr, - netlink_addrlen); -} - -#if 0 -static void test_modem_metadata(uint8_t *snd_buf, int32_t sock_fd, - struct sockaddr *netlink_addr) -{ - struct json_object *parsed_obj = NULL; - - parsed_obj = json_tokener_parse(IFACE_REGISTER_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface register object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_UNREGISTER_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface unregister object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_CONNECT_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface connect object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_DISCONNECT_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface connect object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_MODE_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface mode changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_SUBMODE_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface submode changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_RSSI_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface rssi changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_LTE_RSSI_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface lte rssi changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_LTE_BAND_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface lte rssi changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_ISP_NAME_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface isp name changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_EXTERNAL_ADDR_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface addr changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_LOCATION_CHANGED_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface location changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_UPDATE_TEST); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface lte rssi changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - - parsed_obj = json_tokener_parse(IFACE_NETWORK_MCC_CHANGED); - if (parsed_obj == NULL) { - fprintf(stderr, "Failed to create iface lte rssi changed object\n"); - } else { - send_netlink_json(snd_buf, parsed_obj, sock_fd, netlink_addr); - json_object_put(parsed_obj); - } - -} -#endif -//Test function which just generates some netlink messages that are sent to our -//group -static void test_netlink(uint32_t packets) -{ - struct mnl_socket *mnl_sock = NULL; - struct sockaddr_nl netlink_addr; - uint8_t snd_buf[MNL_SOCKET_BUFFER_SIZE]; - struct nlmsghdr *netlink_hdr; - uint32_t i = 0; - struct json_object *obj_to_send = NULL; - struct timeval tv; - - - mnl_sock = nlhelper_create_socket(NETLINK_USERSOCK, 0); - - if (mnl_sock == NULL) { - fprintf(stderr, "Could not create netlink socket used for testing\n"); - return; - } - - memset(&netlink_addr, 0, sizeof(netlink_addr)); - memset(snd_buf, 0, sizeof(snd_buf)); - - netlink_hdr = mnl_nlmsg_put_header(snd_buf); - netlink_hdr->nlmsg_type = 1; - - netlink_addr.nl_family = AF_NETLINK; - - //A message is broadcasted (multicasted) to all members of the group, except - //the one where portid equals nl_pid (if any). Then it is unicasted to the - //socket where portid equals nl_pid (if any). See af_netlink.c and - //netlink_unicast()/netlink_broadcast(). - // - //When testing, there is no need to multicast. We can just send to the PID - netlink_addr.nl_pid = getpid(); - - srand(time(NULL)); - - //TODO: Specify number of packets from command line - while(1) { - gettimeofday(&tv, NULL); - - if (i == 0) - obj_to_send = create_fake_conn_obj(0, 0, CONN_EVENT_META_UPDATE, "1,2,1,", i+1); - else - obj_to_send = create_fake_conn_obj(0, 0, CONN_EVENT_META_UPDATE, "1,2,1,4", i+1); - - if (i < 4) - obj_to_send = create_fake_conn_obj(1, 2, CONN_EVENT_L3_UP, "1,2,1", i+1); - else - obj_to_send = create_fake_conn_obj(1, 2, CONN_EVENT_DATA_USAGE_UPDATE, "1,2,1,4", tv.tv_sec); - - //obj_to_send = create_fake_restart_obj(); - - if (!obj_to_send) - continue; - - send_netlink_json(snd_buf, obj_to_send, mnl_socket_get_fd(mnl_sock), - (struct sockaddr*) &netlink_addr); - json_object_put(obj_to_send); - -#if 0 - obj_to_send = create_fake_gps_gga_obj(); - send_netlink_json(snd_buf, obj_to_send, mnl_socket_get_fd(mnl_sock), - (struct sockaddr*) &netlink_addr); - json_object_put(obj_to_send); - - obj_to_send = create_fake_gps_rmc_obj(); - send_netlink_json(snd_buf, obj_to_send, mnl_socket_get_fd(mnl_sock), - (struct sockaddr*) &netlink_addr); - json_object_put(obj_to_send); - test_modem_metadata(snd_buf, mnl_socket_get_fd(mnl_sock), - (struct sockaddr*) &netlink_addr); -#endif - if (packets && (++i >= packets)) - break; - - usleep(1000000); - } -} - -static void *mde_run(void *ptr) -{ - struct md_exporter *mde = ptr; - backend_event_loop_run(mde->event_loop); - return NULL; -} - -static void run_test_mode(struct md_exporter *mde, uint32_t packets) -{ - pthread_t thread; - pthread_attr_t attr; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - - pthread_create(&thread, &attr, mde_run, mde); - - test_netlink(packets); - - pthread_join(thread, NULL); - - META_PRINT_SYSLOG(mde, LOG_ERR, "Threads should NEVER exit\n"); -} - static void default_usage() { fprintf(stderr, "Parameters. At least one input and one writer must be specified in the configuration.\n"); @@ -666,7 +178,6 @@ static void print_usage() default_usage(); fprintf(stderr, "Configuration file syntax:\n"); fprintf(stderr, "INPUTS:\n"); - md_netlink_usage(); #ifdef GPSD_SUPPORT md_gpsd_usage(); #endif @@ -736,8 +247,7 @@ int main(int argc, char *argv[]) { struct md_exporter *mde; int32_t i; - uint32_t packets = 0; - uint8_t test_mode = 0, num_writers = 0, num_inputs = 0; + uint8_t num_writers = 0, num_inputs = 0; const char *logfile_path = NULL; json_object *config = NULL; @@ -764,17 +274,11 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - json_object_object_foreach(config, key, val) { - if (!strcmp(key, "netlink")) { - mde->md_inputs[MD_INPUT_NETLINK] = calloc(sizeof(struct md_input_netlink),1); - - if (mde->md_inputs[MD_INPUT_NETLINK] == NULL) { - META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate Netlink input\n"); - exit(EXIT_FAILURE); - } - - md_netlink_setup(mde, (struct md_input_netlink*) mde->md_inputs[MD_INPUT_NETLINK]); - num_inputs++; + json_object_object_foreach(config, key, val) { + if (!strcmp(key, "logfile")) { + logfile_path = json_object_get_string(val); + } else if (!strcmp(key, "syslog")) { + mde->use_syslog = json_object_get_int(val); } #ifdef GPS_NSB_SUPPORT else if (!strcmp(key, "gps_nsb")) { @@ -906,18 +410,6 @@ int main(int argc, char *argv[]) num_writers++; } #endif - else if (!strcmp(key, "test")) { - test_mode = 1; - } - else if (!strcmp(key, "packets")) { - packets = (uint32_t) json_object_get_int(val); - } - else if (!strcmp(key, "logfile")) { - logfile_path = json_object_get_string(val); - } - else if (!strcmp(key, "syslog")) { - mde->use_syslog = json_object_get_int(val); - } } if (num_writers == 0 || num_inputs == 0) { @@ -958,10 +450,7 @@ int main(int argc, char *argv[]) json_object_put(config); - if (test_mode) - run_test_mode(mde, packets); - else - backend_event_loop_run(mde->event_loop); + backend_event_loop_run(mde->event_loop); META_PRINT_SYSLOG(mde, LOG_ERR, "Threads should NEVER exit\n"); exit(EXIT_FAILURE); diff --git a/metadata_exporter.h b/metadata_exporter.h index fbfbcae..0d62462 100644 --- a/metadata_exporter.h +++ b/metadata_exporter.h @@ -139,12 +139,6 @@ enum md_writers { __MD_WRITER_MAX }; -enum output_format -{ - FORMAT_SQL = 1, - FORMAT_JSON -}; - #define MD_INPUT \ struct md_exporter *parent; \ uint8_t (*init)(void *ptr, json_object* config); \ diff --git a/metadata_input_netlink.c b/metadata_input_netlink.c deleted file mode 100644 index d1f3f4a..0000000 --- a/metadata_input_netlink.c +++ /dev/null @@ -1,395 +0,0 @@ -/* Copyright (c) 2015, Celerway, Kristian Evensen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include JSON_LOC -#include -#include - -#include "metadata_exporter.h" -#include "metadata_input_netlink.h" -#include "metadata_input_nl_zmq_common.h" -#include "netlink_helpers.h" -#include "backend_event_loop.h" - -#include "lib/minmea.h" -#include "metadata_exporter_log.h" - -static void md_input_netlink_handle_iface_event(struct md_input_netlink *min, - struct json_object *obj) -{ - init_iface_event(min->mie); - - if (parse_iface_event(obj, min->mie, min->parent) == RETVAL_FAILURE) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) min->mie); -} - -static void md_input_netlink_radio_cell_loc_geran(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_cell_loc_geran_event * event = radio_cell_loc_geran(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_radio_grr_cell_resel(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_grr_cell_resel_event *event = radio_grr_cell_resel(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_radio_gsm_rr_cell_sel_reset_param(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_gsm_rr_cell_sel_reset_param_event *event = radio_gsm_rr_cell_sel_reset_param(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_radio_gsm_rr_cipher_mode(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_gsm_rr_cipher_mode_event *event = radio_gsm_rr_cipher_mode(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_radio_gsm_rr_channel_conf(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_gsm_rr_channel_conf_event* event = radio_gsm_rr_channel_conf(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_radio_wcdma_rrc_state(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_wcdma_rrc_state_event *event = radio_wcdma_rrc_state(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_radio_wcdma_cell_id(struct md_input_netlink *min, - struct json_object *obj) -{ - struct md_radio_wcdma_cell_id_event *event = radio_wcdma_cell_id(obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) event); - free(event); -} - -static void md_input_netlink_handle_radio_event(struct md_input_netlink *min, - struct json_object *obj) -{ - json_object *event_param_json; - uint8_t event_param; - - if (!json_object_object_get_ex(obj, "event_param", &event_param_json)) { - META_PRINT_SYSLOG(min->parent, LOG_ERR, "Missing event type\n"); - return; - } - - memset(min->mre, 0, sizeof(struct md_radio_event)); - min->mre->md_type = META_TYPE_RADIO; - event_param = (uint8_t) json_object_get_int(event_param_json); - - switch (event_param) { - case RADIO_EVENT_GSM_RR_CIPHER_MODE: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "GSM_RR_CIPHER_MODE\n"); - md_input_netlink_radio_gsm_rr_cipher_mode(min, obj); - break; - case RADIO_EVENT_GSM_RR_CHANNEL_CONF: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "GSM_RR_CHANNEL_CONF\n"); - md_input_netlink_radio_gsm_rr_channel_conf(min, obj); - break; - case RADIO_EVENT_CELL_LOCATION_GERAN: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "CELL_LOCATION_GERAN\n"); - md_input_netlink_radio_cell_loc_geran(min, obj); - break; - case RADIO_EVENT_GSM_RR_CELL_SEL_RESEL_PARAM: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "GSM_RR_CELL_SEL_RESEL_PARAM\n"); - md_input_netlink_radio_gsm_rr_cell_sel_reset_param(min, obj); - break; - case RADIO_EVENT_GRR_CELL_RESEL: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "GRR_CELL_RESEL\n"); - md_input_netlink_radio_grr_cell_resel(min, obj); - break; - case RADIO_EVENT_WCDMA_RRC_STATE: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "WCDMA_RRC_STATE\n"); - md_input_netlink_radio_wcdma_rrc_state(min, obj); - break; - case RADIO_EVENT_WCDMA_CELL_ID: - META_PRINT_SYSLOG(min->parent, LOG_ERR, "WCDMA_CELL_ID\n"); - md_input_netlink_radio_wcdma_cell_id(min, obj); - break; - - default: - break; - } -} - -static void md_input_netlink_handle_conn_event(struct md_input_netlink *min, - struct json_object *obj) -{ - uint8_t retval = 0; - - init_conn_event(min->mce); - retval = parse_conn_info(obj, min->mce, min->parent); - - if (retval == RETVAL_FAILURE) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) min->mce); -} - -static void md_input_netlink_handle_gps_event(struct md_input_netlink *min, - struct json_object *json_obj) -{ - struct md_gps_event* event = handle_gps_event(json_obj); - - if (!event) - return; - - mde_publish_event_obj(min->parent, (struct md_event *) event); - free(event); -} - -static void md_input_netlink_handle_system_event(struct md_input_netlink *min, - struct json_object *obj) -{ - //recycle iface event, it contains all fields we need (currently) - memset(min->mse, 0, sizeof(md_system_event_t)); - min->mse->md_type = META_TYPE_SYSTEM; - - if (parse_iface_event(obj, min->mse, min->parent) == RETVAL_FAILURE) - return; - - mde_publish_event_obj(min->parent, (struct md_event*) min->mse); -} - -static void md_input_netlink_handle_event(void *ptr, int32_t fd, uint32_t events) -{ - struct md_input_netlink *min = ptr; - uint8_t rcv_buf[MNL_SOCKET_BUFFER_SIZE]; - ssize_t retval; - struct nlmsghdr *nlh = (struct nlmsghdr*) rcv_buf; - const char *nlh_payload; - struct json_object *nlh_obj = NULL, *json_event = NULL; - uint8_t event_type = 0; - - memset(rcv_buf, 0, sizeof(rcv_buf)); - - //TODO: Consider adding support for fragmented data - retval = mnl_socket_recvfrom(min->metadata_sock, rcv_buf, - MNL_SOCKET_BUFFER_SIZE); - - if (retval <= 0) - return; - - nlh_payload = mnl_nlmsg_get_payload(nlh); - nlh_obj = json_tokener_parse(nlh_payload); - - if (!nlh_obj) { - META_PRINT_SYSLOG(min->parent, LOG_ERR, "Received invalid JSON object on Netlink socket\n"); - return; - } - - //We are inserting version and sequence number. Version is so that the - //application handling this data knows if it supports the format or not. - //Sequence is so that we can see the order in which events arrived at the - //metadata exporter, making it easier to correlate events between - //applications. The different applications publishing data might also insert - //their own sequence number - if (add_json_key_value("md_seq", mde_inc_seq(min->parent), nlh_obj) || - add_json_key_value("md_ver", MDE_VERSION, nlh_obj)) { - json_object_put(nlh_obj); - return; - } - - if (!json_object_object_get_ex(nlh_obj, "event_type", &json_event)) { - META_PRINT_SYSLOG(min->parent, LOG_ERR, "Missing event type\n"); - json_object_put(nlh_obj); - return; - } - - event_type = (uint8_t) json_object_get_int(json_event); - - if (!(event_type & min->md_nl_mask)) { - json_object_put(nlh_obj); - return; - } - - META_PRINT(min->parent->logfile, "Got JSON %s\n", json_object_to_json_string(nlh_obj)); - - switch (event_type) { - case META_TYPE_INTERFACE: - md_input_netlink_handle_iface_event(min, nlh_obj); - break; - case META_TYPE_CONNECTION: - md_input_netlink_handle_conn_event(min, nlh_obj); - break; - case META_TYPE_POS: - md_input_netlink_handle_gps_event(min, nlh_obj); - break; - case META_TYPE_RADIO: - md_input_netlink_handle_radio_event(min, nlh_obj); - break; - case META_TYPE_SYSTEM: - md_input_netlink_handle_system_event(min, nlh_obj); - break; - default: - META_PRINT(min->parent->logfile, "Unknown event type\n"); - break; - } - - json_object_put(nlh_obj); -} - -static uint8_t md_input_netlink_config(struct md_input_netlink *min) -{ - - //TODO: This code will be refactored to different importers, similar to - //outputs - min->metadata_sock = nlhelper_create_socket(NETLINK_USERSOCK, - (1 << (METADATA_NL_GROUP - 1))); - - if (min->metadata_sock == NULL) - return RETVAL_FAILURE; - - if(!(min->event_handle = backend_create_epoll_handle(min, - mnl_socket_get_fd(min->metadata_sock), - md_input_netlink_handle_event))) - return RETVAL_FAILURE; - - backend_event_loop_update(min->parent->event_loop, EPOLLIN, EPOLL_CTL_ADD, - mnl_socket_get_fd(min->metadata_sock), min->event_handle); - - //TODO: guard with check for flag - min->mce = calloc(sizeof(struct md_conn_event), 1); - if (min->mce == NULL) - return RETVAL_FAILURE; - - min->mie = calloc(sizeof(struct md_iface_event), 1); - if (min->mie == NULL) - return RETVAL_FAILURE; - - min->mre = calloc(sizeof(struct md_radio_event), 1); - if (min->mre == NULL) - return RETVAL_FAILURE; - - min->mse = calloc(sizeof(md_system_event_t), 1); - if (min->mre == NULL) - return RETVAL_FAILURE; - - - return RETVAL_SUCCESS; -} - -static uint8_t md_input_netlink_init(void *ptr, json_object* config) -{ - struct md_input_netlink *min = ptr; - uint32_t md_nl_mask = 0; - - json_object* subconfig; - if (json_object_object_get_ex(config, "netlink", &subconfig)) { - json_object_object_foreach(subconfig, key, val) { - if (!strcmp(key, "conn")) { - md_nl_mask |= META_TYPE_CONNECTION; - } else if (!strcmp(key, "pos")) { - md_nl_mask |= META_TYPE_POS; - } else if (!strcmp(key, "iface")) { - md_nl_mask |= META_TYPE_INTERFACE; - } else if (!strcmp(key, "radio")) { - md_nl_mask |= META_TYPE_RADIO; - } else if (!strcmp(key, "system")) { - md_nl_mask |= META_TYPE_SYSTEM; - } - } - } - - if (!md_nl_mask) { - META_PRINT_SYSLOG(min->parent, LOG_ERR, "At least one netlink event type must be present\n"); - return RETVAL_FAILURE; - } - - min->md_nl_mask = md_nl_mask; - - //Netlink has no arguments (for now), so just go right to config - return md_input_netlink_config(min); -} - -void md_netlink_usage() -{ - fprintf(stderr, "\"netlink\": {\t\tNetlink input (at least one event type must be present)\n"); - fprintf(stderr, " \"conn\":\t\tReceive netlink connection events\n"); - fprintf(stderr, " \"pos\":\t\tReceive netlink position events\n"); - fprintf(stderr, " \"iface\":\t\tReceive netlink interface events\n"); - fprintf(stderr, " \"radio\":\t\tReceive netlink radio events (QXDM + neigh. cells)\n"); - fprintf(stderr, " \"system\":\t\tReceive netlink system (reboot) events\n"); - fprintf(stderr, "},\n"); -} - -void md_netlink_setup(struct md_exporter *mde, struct md_input_netlink *min) -{ - min->parent = mde; - min->init = md_input_netlink_init; -} diff --git a/metadata_input_netlink.h b/metadata_input_netlink.h deleted file mode 100644 index c706379..0000000 --- a/metadata_input_netlink.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2015, Celerway, Kristian Evensen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once -#include "metadata_exporter.h" - -struct mnl_socket; -struct backend_epoll_handle; - -struct md_input_netlink { - MD_INPUT; - uint32_t md_nl_mask; - struct mnl_socket *metadata_sock; - struct backend_epoll_handle *event_handle; - struct md_conn_event *mce; - struct md_iface_event *mie; - struct md_radio_event *mre; - md_system_event_t *mse; -}; - -void md_netlink_usage(); -void md_netlink_setup(struct md_exporter *mde, struct md_input_netlink *min); diff --git a/metadata_writer_inventory_conn.c b/metadata_writer_inventory_conn.c index f81d48a..5cda22a 100644 --- a/metadata_writer_inventory_conn.c +++ b/metadata_writer_inventory_conn.c @@ -80,7 +80,8 @@ static int32_t md_inventory_execute_insert_update(struct md_writer_sqlite *mws, sqlite3_bind_int(stmt, 11, mce->connectivity) || sqlite3_bind_int(stmt, 13, mce->quality) || sqlite3_bind_int(stmt, 14, mce->interface_type) || - sqlite3_bind_text(stmt, 16, mce->network_address, strlen(mce->network_address), SQLITE_STATIC)){ + sqlite3_bind_int(stmt, 16, mce->network_address_family) || + sqlite3_bind_text(stmt, 17, mce->network_address, strlen(mce->network_address), SQLITE_STATIC)){ META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to bind values to INSERT query\n"); return SQLITE_ERROR; } @@ -201,18 +202,19 @@ static int32_t md_inventory_update_event(struct md_writer_sqlite *mws, sqlite3_bind_int(stmt, 5, mce->quality) || sqlite3_bind_int(stmt, 7, mce->l3_session_id) || sqlite3_bind_int(stmt, 8, mce->l4_session_id) || - sqlite3_bind_text(stmt, 9, mce->network_address, strlen(mce->network_address), SQLITE_STATIC)) { + sqlite3_bind_int(stmt, 9, mce->network_address_family) || + sqlite3_bind_text(stmt, 10, mce->network_address, strlen(mce->network_address), SQLITE_STATIC)) { META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to bind values to UPDATE query\n"); return SQLITE_ERROR; } if (mws->api_version == 2 && mce->interface_type == INTERFACE_MODEM) { - if (sqlite3_bind_text(stmt, 10, mce->imei, strlen(mce->imei), SQLITE_STATIC)) { + if (sqlite3_bind_text(stmt, 11, mce->imei, strlen(mce->imei), SQLITE_STATIC)) { META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to bind IMEI\n"); return SQLITE_ERROR; } } else { - if (sqlite3_bind_text(stmt, 10, mce->interface_id, strlen(mce->interface_id), SQLITE_STATIC)) { + if (sqlite3_bind_text(stmt, 11, mce->interface_id, strlen(mce->interface_id), SQLITE_STATIC)) { META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to bind interface id\n"); return SQLITE_ERROR; } @@ -349,7 +351,8 @@ static int16_t md_inventory_get_last_update(struct md_writer_sqlite *mws, if (sqlite3_bind_int(stmt, 1, mce->l3_session_id) || sqlite3_bind_int(stmt, 2, mce->l4_session_id) || - sqlite3_bind_text(stmt, 4, mce->network_address, strlen(mce->network_address), SQLITE_STATIC)) { + sqlite3_bind_int(stmt, 4, mce->network_address_family) || + sqlite3_bind_text(stmt, 5, mce->network_address, strlen(mce->network_address), SQLITE_STATIC)) { META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to bind values to SELECT query\n"); return retval; } @@ -565,21 +568,6 @@ uint8_t md_inventory_handle_conn_event(struct md_writer_sqlite *mws, return retval; } -static uint8_t md_inventory_conn_dump_db_sql(struct md_writer_sqlite *mws, FILE *output) -{ - sqlite3_reset(mws->dump_table); - sqlite3_reset(mws->dump_update); - - sqlite3_bind_int64(mws->dump_table, 1, mws->dump_tstamp); - sqlite3_bind_int64(mws->dump_update, 1, mws->dump_tstamp); - - if (md_sqlite_helpers_dump_write(mws->dump_table, output) || - md_sqlite_helpers_dump_write(mws->dump_update, output)) - return RETVAL_FAILURE; - else - return RETVAL_SUCCESS; -} - static uint8_t md_inventory_conn_dump_db_json(struct md_writer_sqlite *mws, FILE *output) { const char *json_str; @@ -658,16 +646,6 @@ static uint8_t md_inventory_conn_delete_db(struct md_writer_sqlite *mws) return RETVAL_SUCCESS; } -static uint8_t md_inventory_usage_dump_db_sql(struct md_writer_sqlite *mws, FILE *output) -{ - sqlite3_reset(mws->dump_usage); - - if (md_sqlite_helpers_dump_write(mws->dump_usage, output)) - return RETVAL_FAILURE; - else - return RETVAL_SUCCESS; -} - static uint8_t md_inventory_usage_dump_db_json(struct md_writer_sqlite *mws, FILE *output) { const char *json_str; @@ -706,16 +684,9 @@ static uint8_t md_inventory_usage_delete_db(struct md_writer_sqlite *mws) uint8_t md_inventory_conn_copy_db(struct md_writer_sqlite *mws) { uint8_t retval = 0; - dump_db_cb dump_cb = NULL; - - if (mws->output_format == FORMAT_SQL) { - dump_cb = md_inventory_conn_dump_db_sql; - } else { - dump_cb = md_inventory_conn_dump_db_json; - } md_writer_helpers_copy_db(mws->meta_prefix, - mws->meta_prefix_len, dump_cb, mws, + mws->meta_prefix_len, md_inventory_conn_dump_db_json, mws, md_inventory_conn_delete_db); if (retval == RETVAL_SUCCESS) { @@ -733,16 +704,9 @@ uint8_t md_inventory_conn_copy_db(struct md_writer_sqlite *mws) uint8_t md_inventory_conn_usage_copy_db(struct md_writer_sqlite *mws) { uint8_t retval = 0; - dump_db_cb dump_cb = NULL; - - if (mws->output_format == FORMAT_SQL) { - dump_cb = md_inventory_usage_dump_db_sql; - } else { - dump_cb = md_inventory_usage_dump_db_json; - } md_writer_helpers_copy_db(mws->usage_prefix, - mws->usage_prefix_len, dump_cb, mws, + mws->usage_prefix_len, md_inventory_usage_dump_db_json, mws, md_inventory_usage_delete_db); if (retval == RETVAL_SUCCESS) diff --git a/metadata_writer_inventory_gps.c b/metadata_writer_inventory_gps.c index dafe0c0..96e01bf 100644 --- a/metadata_writer_inventory_gps.c +++ b/metadata_writer_inventory_gps.c @@ -35,16 +35,6 @@ #include "metadata_writer_json_helpers.h" #include "metadata_exporter_log.h" -static uint8_t md_inventory_gps_dump_db_sql(struct md_writer_sqlite *mws, FILE *output) -{ - sqlite3_reset(mws->dump_gps); - - if (md_sqlite_helpers_dump_write(mws->dump_gps, output)) - return RETVAL_FAILURE; - else - return RETVAL_SUCCESS; -} - static uint8_t md_inventory_gps_dump_db_json(struct md_writer_sqlite *mws, FILE *output) { const char *json_str; @@ -68,16 +58,9 @@ static uint8_t md_inventory_gps_dump_db_json(struct md_writer_sqlite *mws, FILE uint8_t md_inventory_gps_copy_db(struct md_writer_sqlite *mws) { uint8_t retval = RETVAL_SUCCESS; - dump_db_cb dump_cb = NULL; - - if (mws->output_format == FORMAT_SQL) { - dump_cb = md_inventory_gps_dump_db_sql; - } else { - dump_cb = md_inventory_gps_dump_db_json; - } retval = md_writer_helpers_copy_db(mws->gps_prefix, - mws->gps_prefix_len, dump_cb, mws, + mws->gps_prefix_len, md_inventory_gps_dump_db_json, mws, NULL); if (retval == RETVAL_SUCCESS) diff --git a/metadata_writer_sqlite.c b/metadata_writer_sqlite.c index 417a0bd..84ad2c7 100644 --- a/metadata_writer_sqlite.c +++ b/metadata_writer_sqlite.c @@ -41,7 +41,6 @@ #include "metadata_writer_inventory_gps.h" #include "metadata_writer_sqlite_monitor.h" #include "metadata_writer_inventory_system.h" -#include "netlink_helpers.h" #include "system_helpers.h" #include "backend_event_loop.h" #include "metadata_exporter_log.h" @@ -324,8 +323,6 @@ static int md_sqlite_configure(struct md_writer_sqlite *mws, const char *system_prefix, const char *ntp_fix_file) { sqlite3 *db_handle = md_sqlite_configure_db(mws, db_filename); - const char *dump_events, *dump_updates, *dump_gps, *dump_monitor, - *dump_usage, *dump_system; if (db_handle == NULL) return RETVAL_FAILURE; @@ -338,22 +335,6 @@ static int md_sqlite_configure(struct md_writer_sqlite *mws, #endif } - if (mws->output_format == FORMAT_SQL) { - dump_events = DUMP_EVENTS; - dump_updates = DUMP_UPDATES; - dump_gps = DUMP_GPS; - dump_monitor = DUMP_MONITOR; - dump_usage = DUMP_USAGE; - dump_system = NULL; - } else { - dump_events = DUMP_EVENTS_JSON; - dump_updates = DUMP_UPDATES_JSON; - dump_gps = DUMP_GPS_JSON; - dump_monitor = DUMP_MONITOR_JSON; - dump_usage = DUMP_USAGE_JSON; - dump_system = DUMP_SYSTEM_JSON; - } - //Only set variables that are not 0 mws->db_handle = db_handle; mws->db_interval = db_interval; @@ -382,26 +363,26 @@ static int md_sqlite_configure(struct md_writer_sqlite *mws, &(mws->insert_gps), NULL) || sqlite3_prepare_v2(mws->db_handle, DELETE_GPS_TABLE, -1, &(mws->delete_gps), NULL) || - sqlite3_prepare_v2(mws->db_handle, dump_gps, -1, + sqlite3_prepare_v2(mws->db_handle, DUMP_GPS_JSON, -1, &(mws->dump_gps), NULL) || sqlite3_prepare_v2(mws->db_handle, INSERT_MONITOR_EVENT, -1, &(mws->insert_monitor), NULL) || sqlite3_prepare_v2(mws->db_handle, DELETE_MONITOR_TABLE, -1, &(mws->delete_monitor), NULL) || - sqlite3_prepare_v2(mws->db_handle, dump_monitor, -1, + sqlite3_prepare_v2(mws->db_handle, DUMP_MONITOR_JSON, -1, &(mws->dump_monitor), NULL) || sqlite3_prepare_v2(mws->db_handle, INSERT_USAGE, -1, &(mws->insert_usage), NULL) || sqlite3_prepare_v2(mws->db_handle, UPDATE_USAGE, -1, &(mws->update_usage), NULL) || - sqlite3_prepare_v2(mws->db_handle, dump_usage, -1, + sqlite3_prepare_v2(mws->db_handle, DUMP_USAGE_JSON, -1, &(mws->dump_usage), NULL) || sqlite3_prepare_v2(mws->db_handle, DELETE_USAGE_TABLE, -1, &(mws->delete_usage), NULL) || sqlite3_prepare_v2(mws->db_handle, INSERT_REBOOT_EVENT, -1, &(mws->insert_system), NULL) || - (dump_system && sqlite3_prepare_v2(mws->db_handle, dump_system, -1, - &(mws->dump_system), NULL)) || + sqlite3_prepare_v2(mws->db_handle, DUMP_SYSTEM_JSON, -1, + &(mws->dump_system), NULL) || sqlite3_prepare_v2(mws->db_handle, DELETE_SYSTEM_TABLE, -1, &(mws->delete_system), NULL)) { META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Statement failed: %s\n", @@ -410,9 +391,9 @@ static int md_sqlite_configure(struct md_writer_sqlite *mws, return RETVAL_FAILURE; } - if (sqlite3_prepare_v2(mws->db_handle, dump_events, -1, + if (sqlite3_prepare_v2(mws->db_handle, DUMP_EVENTS_JSON, -1, &(mws->dump_table), NULL) || - sqlite3_prepare_v2(mws->db_handle, dump_updates, -1, + sqlite3_prepare_v2(mws->db_handle, DUMP_UPDATES_JSON, -1, &(mws->dump_update), NULL)) { META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Dump prepare failed: %s\n", sqlite3_errmsg(mws->db_handle)); @@ -504,7 +485,6 @@ void md_sqlite_usage() fprintf(stderr, " \"session_id\":\t\tpath to session id file\n"); fprintf(stderr, " \"api_version\":\tbackend API version (default: 1)\n"); fprintf(stderr, " \"last_conn_tstamp_path\":\toptional path to file where we read/store timestamp of last conn dump\n"); - fprintf(stderr, " \"output_format\":\tJSON/SQL (default SQL)\n"); fprintf(stderr, " \"ntp_fix_file\":\tFile to check for NTP fix\n"); fprintf(stderr, "}\n"); } @@ -515,7 +495,7 @@ int32_t md_sqlite_init(void *ptr, json_object* config) uint32_t node_id = 0, interval = DEFAULT_TIMEOUT, num_events = EVENT_LIMIT; const char *db_filename = NULL, *meta_prefix = NULL, *gps_prefix = NULL, *monitor_prefix = NULL, *usage_prefix = NULL, - *output_format = NULL, *system_prefix = NULL, *ntp_fix_file = NULL; + *system_prefix = NULL, *ntp_fix_file = NULL; json_object* subconfig; if (json_object_object_get_ex(config, "sqlite", &subconfig)) { @@ -546,8 +526,6 @@ int32_t md_sqlite_init(void *ptr, json_object* config) mws->api_version = (uint32_t) json_object_get_int(val); else if (!strcmp(key, "last_conn_tstamp_path")) mws->last_conn_tstamp_path = strdup(json_object_get_string(val)); - else if (!strcmp(key, "output_format")) - output_format = json_object_get_string(val); else if (!strcmp(key, "ntp_fix_file")) ntp_fix_file = json_object_get_string(val); } @@ -583,17 +561,6 @@ int32_t md_sqlite_init(void *ptr, json_object* config) return RETVAL_FAILURE; } - if (output_format) { - if (!strcasecmp(output_format, "sql")) { - mws->output_format = FORMAT_SQL; - } else if (!strcasecmp(output_format, "json")) { - mws->output_format = FORMAT_JSON; - } else { - META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Unknown output format\n"); - return RETVAL_FAILURE; - } - } - META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Done configuring SQLite handle\n"); return md_sqlite_configure(mws, db_filename, node_id, interval, @@ -815,6 +782,5 @@ void md_sqlite_setup(struct md_exporter *mde, struct md_writer_sqlite* mws) { mws->itr_cb = md_sqlite_itr_cb; mws->usage = md_sqlite_usage; mws->api_version = 1; - mws->output_format = FORMAT_SQL; } diff --git a/metadata_writer_sqlite.h b/metadata_writer_sqlite.h index d7b670e..f51abf1 100644 --- a/metadata_writer_sqlite.h +++ b/metadata_writer_sqlite.h @@ -76,12 +76,13 @@ "Quality INTEGER," \ "InterfaceType INTEGER NOT NULL," \ "InterfaceId TEXT NOT NULL," \ + "NetworkAddressFamily INTEGER NOT NULL," \ "NetworkAddress TEXT NOT NULL," \ "NetworkProvider INT," \ "EventValueStr TEXT, " \ "PRIMARY KEY(SessionId,SessionIdMultip,"\ "L3SessionId,L4SessionId,InterfaceId,"\ - "NetworkAddress))" + "NetworkAddressFamily,NetworkAddress))" #define CREATE_GPS_SQL "CREATE TABLE IF NOT EXISTS GpsUpdate(" \ "NodeId INTEGER NOT NULL," \ @@ -137,8 +138,8 @@ #define INSERT_UPDATE "INSERT INTO NetworkUpdates(NodeId,SessionId,"\ "SessionIdMultip,Timestamp,Sequence,L3SessionId,"\ "L4SessionId,EventType,EventParam,HasIp,Connectivity,ConnectionMode,Quality"\ - ",InterfaceType,InterfaceId,NetworkAddress,NetworkProvider,EventValueStr) " \ - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" + ",InterfaceType,InterfaceId,NetworkAddressFamily,NetworkAddress,NetworkProvider,EventValueStr) " \ + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" #define INSERT_GPS_EVENT "INSERT INTO GpsUpdate(NodeId,BootCount" \ ",BootMultiplier,Timestamp" \ @@ -163,6 +164,7 @@ " FROM NetworkUpdates WHERE "\ "L3SessionId=? AND "\ "L4SessionId=? AND InterfaceId=? AND "\ + "NetworkAddressFamily=? AND "\ "NetworkAddress=? ORDER BY Timestamp DESC LIMIT 1;" //The reason NetworkAddress is used here, is that we first identify by L3/L4 @@ -178,7 +180,8 @@ "Quality=?,EventValueStr=? " \ "WHERE "\ "L3SessionId=? AND L4SessionId=? " \ - "AND NetworkAddress=? AND InterfaceId=?" + "AND NetworkAddressFamily=? AND "\ + "NetworkAddress=? AND InterfaceId=?" #define UPDATE_USAGE "UPDATE DataUse SET " \ "RxData = RxData + ?, TxData = TxData + ? " \ @@ -372,7 +375,6 @@ struct md_writer_sqlite { uint8_t api_version; uint8_t delete_conn_update; - uint8_t output_format; }; void md_sqlite_usage(); diff --git a/metadata_writer_sqlite_helpers.c b/metadata_writer_sqlite_helpers.c index 279e933..f01f200 100644 --- a/metadata_writer_sqlite_helpers.c +++ b/metadata_writer_sqlite_helpers.c @@ -36,34 +36,6 @@ #include "metadata_writer_sqlite_helpers.h" #include "metadata_exporter_log.h" -uint8_t md_sqlite_helpers_dump_write(sqlite3_stmt *stmt, FILE *output) -{ - int32_t retval = sqlite3_step(stmt); - int32_t column_count, i = 0; - - while (retval == SQLITE_ROW) { - column_count = sqlite3_column_count(stmt); - - if (fprintf(output, "%s", sqlite3_column_text(stmt, 0)) < 0) - return RETVAL_FAILURE; - - for (i = 1; ioutput_format == FORMAT_SQL) - snprintf(dst_filename, 128, "%s_%d.sql", prefix, mws->node_id); - else - snprintf(dst_filename, 128, "%s_%d.json", prefix, mws->node_id); + snprintf(dst_filename, 128, "%s_%d.json", prefix, mws->node_id); output = fdopen(output_fd, "w"); diff --git a/metadata_writer_sqlite_helpers.h b/metadata_writer_sqlite_helpers.h index 5899a95..15531b3 100644 --- a/metadata_writer_sqlite_helpers.h +++ b/metadata_writer_sqlite_helpers.h @@ -39,6 +39,4 @@ uint8_t md_writer_helpers_copy_db(char *prefix, size_t prefix_len, dump_db_cb dump_db, struct md_writer_sqlite *mws, delete_db_cb delete_cb); -uint8_t md_sqlite_helpers_dump_write(sqlite3_stmt *stmt, FILE *output); - #endif diff --git a/metadata_writer_sqlite_monitor.c b/metadata_writer_sqlite_monitor.c index a664545..4ea866e 100644 --- a/metadata_writer_sqlite_monitor.c +++ b/metadata_writer_sqlite_monitor.c @@ -35,16 +35,6 @@ #include "metadata_writer_json_helpers.h" #include "metadata_exporter_log.h" -static uint8_t md_sqlite_monitor_dump_db_sql(struct md_writer_sqlite *mws, FILE *output) -{ - sqlite3_reset(mws->dump_monitor); - - if (md_sqlite_helpers_dump_write(mws->dump_monitor, output)) - return RETVAL_FAILURE; - else - return RETVAL_SUCCESS; -} - static uint8_t md_sqlite_monitor_dump_json(struct md_writer_sqlite *mws, FILE *output) { const char *json_str; @@ -80,16 +70,8 @@ static uint8_t md_sqlite_monitor_delete_db(struct md_writer_sqlite *mws) uint8_t md_sqlite_monitor_copy_db(struct md_writer_sqlite *mws) { - dump_db_cb dump_cb = NULL; - - if (mws->output_format == FORMAT_SQL) { - dump_cb = md_sqlite_monitor_dump_db_sql; - } else { - dump_cb = md_sqlite_monitor_dump_json; - } - uint8_t retval = md_writer_helpers_copy_db(mws->monitor_prefix, - mws->monitor_prefix_len, dump_cb, mws, + mws->monitor_prefix_len, md_sqlite_monitor_dump_json, mws, md_sqlite_monitor_delete_db); if (retval == RETVAL_SUCCESS) diff --git a/netlink_helpers.c b/netlink_helpers.c deleted file mode 100644 index 97934bb..0000000 --- a/netlink_helpers.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2015, Celerway, Kristian Evensen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "netlink_helpers.h" -#include "metadata_exporter_log.h" - -struct mnl_socket *nlhelper_create_socket(int32_t bus, uint32_t groups) -{ - struct mnl_socket *mnl_sock = NULL; - - if ((mnl_sock = mnl_socket_open(bus)) == NULL) - return NULL; - - if (groups && mnl_socket_bind(mnl_sock, groups, getpid()) < 0) - { - mnl_socket_close(mnl_sock); - return NULL; - } - - return mnl_sock; -} diff --git a/netlink_helpers.h b/netlink_helpers.h deleted file mode 100644 index 9e343f2..0000000 --- a/netlink_helpers.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2015, Celerway, Kristian Evensen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NETLINK_HELPERS_H -#define NETLINK_HELPERS_H - -struct mnl_socket; - -struct mnl_socket *nlhelper_create_socket(int32_t aBus, uint32_t aGroups); - -#endif