Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
cmake_minimum_required(VERSION 2.6)
project(meta_exporter)

set(CMAKE_C_FLAGS "-O1 -Wall -std=gnu99")
set(CMAKE_C_FLAGS "-O1 -Wall -std=gnu99 -g")

set(LIBS pthread mnl)
set(SOURCE
Expand Down Expand Up @@ -40,6 +40,7 @@ if (SQLITE3)
metadata_writer_json_helpers.c
metadata_writer_inventory_conn.c
metadata_writer_inventory_gps.c
metadata_writer_inventory_system.c
metadata_writer_sqlite_monitor.c)
add_definitions("-DSQLITE_SUPPORT")
endif()
Expand Down
3 changes: 2 additions & 1 deletion files/metadata-exporter.conf.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
"netlink": {
"conn" : true,
"pos" : true,
"iface": true
"iface": true,
"system": true,
},
"sqlite": {
"database": "/tmp/metadata.db",
Expand Down
39 changes: 37 additions & 2 deletions metadata_exporter.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,38 @@ static struct json_object *create_fake_gps_rmc_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;
}

#if 0
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)
{
Expand Down Expand Up @@ -373,6 +405,7 @@ static struct json_object *create_fake_conn_obj(uint64_t l3_id, uint64_t l4_id,

return obj;
}
#endif

static ssize_t send_netlink_json(uint8_t *snd_buf,
struct json_object *parsed_obj, int32_t sock_fd,
Expand Down Expand Up @@ -552,16 +585,18 @@ static void test_netlink(uint32_t packets)
while(1) {
gettimeofday(&tv, NULL);

if (i == 0)
/*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);
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;

Expand Down
3 changes: 3 additions & 0 deletions metadata_exporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
#define META_TYPE_MUNIN 0x05
#define META_TYPE_SYSEVENT 0x06
#define META_TYPE_RADIO 0x08
#define META_TYPE_SYSTEM 0x10

enum iface_event {
IFACE_EVENT_DEV_STATE=1,
Expand Down Expand Up @@ -190,6 +191,8 @@ struct md_iface_event {
uint8_t event_type;
};

typedef struct md_iface_event md_system_event_t;

struct md_conn_event {
MD_EVENT;
uint8_t event_type;
Expand Down
35 changes: 30 additions & 5 deletions metadata_input_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,6 +679,19 @@ static uint8_t md_input_netlink_add_json_key_value(const char *key,
return RETVAL_SUCCESS;
}

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 (md_input_netlink_parse_iface_event(min, obj, min->mse) == 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;
Expand Down Expand Up @@ -746,6 +759,9 @@ static void md_input_netlink_handle_event(void *ptr, int32_t fd, uint32_t events
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;
Expand Down Expand Up @@ -773,7 +789,7 @@ static uint8_t md_input_netlink_config(struct md_input_netlink *min)
backend_event_loop_update(min->parent->event_loop, EPOLLIN, EPOLL_CTL_ADD,
mnl_socket_get_fd(min->metadata_sock), min->event_handle);

//TODO: Move to handler
//TODO: guard with check for flag
min->mce = calloc(sizeof(struct md_conn_event), 1);
if (min->mce == NULL)
return RETVAL_FAILURE;
Expand All @@ -786,6 +802,11 @@ static uint8_t md_input_netlink_config(struct md_input_netlink *min)
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;
}

Expand All @@ -797,14 +818,17 @@ static uint8_t md_input_netlink_init(void *ptr, json_object* config)
json_object* subconfig;
if (json_object_object_get_ex(config, "netlink", &subconfig)) {
json_object_object_foreach(subconfig, key, val) {
if (!strcmp(key, "conn"))
if (!strcmp(key, "conn")) {
md_nl_mask |= META_TYPE_CONNECTION;
else if (!strcmp(key, "pos"))
} else if (!strcmp(key, "pos")) {
md_nl_mask |= META_TYPE_POS;
else if (!strcmp(key, "iface"))
} else if (!strcmp(key, "iface")) {
md_nl_mask |= META_TYPE_INTERFACE;
else if (!strcmp(key, "radio"))
} else if (!strcmp(key, "radio")) {
md_nl_mask |= META_TYPE_RADIO;
} else if (!strcmp(key, "system")) {
md_nl_mask |= META_TYPE_SYSTEM;
}
}
}

Expand All @@ -826,6 +850,7 @@ void md_netlink_usage()
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");
}

Expand Down
1 change: 1 addition & 0 deletions metadata_input_netlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ struct md_input_netlink {
struct md_conn_event *mce;
struct md_iface_event *mie;
struct md_radio_event *mre;
md_system_event_t *mse;
};

void md_netlink_usage();
Expand Down
84 changes: 84 additions & 0 deletions metadata_writer_inventory_system.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#include <string.h>
#include <stdint.h>

#include "metadata_writer_inventory_system.h"
#include "metadata_exporter_log.h"
#include "metadata_writer_sqlite_helpers.h"
#include "metadata_writer_json_helpers.h"

uint8_t md_inventory_handle_system_event(struct md_writer_sqlite *mws,
md_system_event_t *mse)
{
sqlite3_stmt *stmt = mws->insert_system;
sqlite3_clear_bindings(stmt);
sqlite3_reset(stmt);

if (sqlite3_bind_int(stmt, 1, mws->node_id) ||
sqlite3_bind_int(stmt, 2, mws->session_id) || // BootCount
sqlite3_bind_int(stmt, 3, mws->session_id_multip) || // BootMultiplier
sqlite3_bind_int(stmt, 4, mse->tstamp) ||
sqlite3_bind_int(stmt, 5, mse->sequence) ||
sqlite3_bind_text(stmt, 6, mse->imei, strlen(mse->imei),
SQLITE_STATIC)) {
META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to bind values to "
"INSERT query (system)\n");
return RETVAL_FAILURE;
}

if (sqlite3_step(stmt) != SQLITE_DONE) {
return RETVAL_FAILURE;
} else {
return RETVAL_SUCCESS;
}
}

static uint8_t md_inventory_system_dump_db_json(struct md_writer_sqlite *mws,
FILE *output)
{
const char *json_str;
sqlite3_reset(mws->dump_system);

json_object *jarray = json_object_new_array();

if (md_json_helpers_dump_write(mws->dump_system, jarray))
{
json_object_put(jarray);
return RETVAL_FAILURE;
}

json_str = json_object_to_json_string_ext(jarray, JSON_C_TO_STRING_PLAIN);
fprintf(output, "%s", json_str);

json_object_put(jarray);
return RETVAL_SUCCESS;
}

static uint8_t md_inventory_system_delete_db(struct md_writer_sqlite *mws)
{
int32_t retval;

sqlite3_reset(mws->delete_system);
retval = sqlite3_step(mws->delete_system);

if (retval != SQLITE_DONE) {
META_PRINT_SYSLOG(mws->parent, LOG_ERR, "Failed to delete system %s\n",
sqlite3_errstr(retval));
return RETVAL_FAILURE;
}

return RETVAL_SUCCESS;
}

uint8_t md_inventory_system_copy_db(struct md_writer_sqlite *mws)
{
uint8_t retval = RETVAL_SUCCESS;

retval = md_writer_helpers_copy_db(mws->system_prefix,
mws->system_prefix_len, md_inventory_system_dump_db_json, mws,
md_inventory_system_delete_db);

if (retval == RETVAL_SUCCESS)
mws->num_system_events = 0;

return retval;
}
11 changes: 11 additions & 0 deletions metadata_writer_inventory_system.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef METADATA_WRITER_INVENTORY_SYSTEM_H
#define METADATA_WRITER_INVENTORY_SYSTEM_H

#include "metadata_exporter.h"
#include "metadata_writer_sqlite.h"

uint8_t md_inventory_handle_system_event(struct md_writer_sqlite *mws,
md_system_event_t *mse);
uint8_t md_inventory_system_copy_db(struct md_writer_sqlite *mws);

#endif
Loading