Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
e29f93d
Merge pull request #1 from kristrev/master
relet Feb 25, 2016
e2b86f6
Merge pull request #2 from relet/config-file
relet Mar 29, 2016
942d3b8
Merge pull request #3 from kristrev/master
relet Apr 1, 2016
787fed1
some simplification of ZMQ output fields
relet Apr 8, 2016
e66be0c
Merge branch 'master' of https://github.com/kristrev/data-exporter
relet Apr 11, 2016
e9fb223
revert DataId for sensor messages, they are joined into a common table
relet Apr 12, 2016
79462b2
rm double definition of KEY_SIGNAL
relet Apr 18, 2016
9951fad
send NaN values as null in GPS speed
relet Apr 18, 2016
a41ca63
Merge branch 'master' of https://github.com/MONROE-PROJECT/data-expor…
relet May 13, 2016
d9b325a
retry zmq connection if interface is not available
relet May 18, 2016
6f3481d
simplify zmq_send code
relet May 31, 2016
d9439b3
Merge branch 'master' of https://github.com/kristrev/data-exporter
relet Jun 8, 2016
71f08a0
add InternalInterface key to zmq export, using a static mapping from …
relet Jun 21, 2016
d1876bd
Merge branch 'master' of https://github.com/kristrev/data-exporter
relet Jun 21, 2016
0012665
skip wwan0 in mapping
relet Jun 21, 2016
dc00db0
add TelenorS to operator table
relet Jul 7, 2016
a2fc983
merge from kristrev/master
relet Jul 13, 2016
563ce65
add Movistar
relet Jul 18, 2016
af1ed70
typo
relet Jul 18, 2016
dcaf22e
add Weblink
relet Jul 21, 2016
ad2f78a
refactoring, log message when dropping messages
relet Jul 26, 2016
e253e82
reduce munin message interval
relet Jul 26, 2016
1ba47e3
add voda ES to the operator list
relet Aug 22, 2016
7298a83
add NITOS isp as op0
relet Sep 22, 2016
17753b8
Merge branch 'master' of https://github.com/kristrev/data-exporter
relet Oct 21, 2016
ef3043b
+SWE to provider list
relet Oct 21, 2016
2e587be
add C-OTE
Nov 19, 2016
2b5efb9
map by imei, not operayor
Dec 13, 2016
fb0611a
implement map_imei
Dec 13, 2016
637b2aa
rm debug message
Dec 13, 2016
e9f0204
split gps topic
Dec 23, 2016
0862eae
rm overassignment
Dec 23, 2016
141c1b9
switch dest
Dec 23, 2016
3e7c037
merge from kristrev/master
Jan 11, 2017
5821a4b
report InternalInterface for all modems with imei
Jan 25, 2017
356e955
Merge branch 'op-index'
Feb 10, 2017
9c52e8d
+export timestamps with us resolution
Mar 1, 2017
ab10175
increase data version, change timestamp data type from int64 to doubl…
Mar 2, 2017
03bb615
init empty string
Mar 2, 2017
8207fc3
fix gps topic detection
Mar 2, 2017
1e2695f
[fix] change topic, not dataid
relet Mar 3, 2017
2ae893f
fix char type
relet Mar 3, 2017
9cd88da
merge from kristrev/master
relet Jun 12, 2017
2d64d6e
use add_default_fields in all message types
relet Jun 12, 2017
212a338
restrict imei mapping to MNR project
relet Jun 12, 2017
25d862b
restore zmq_send call
relet Jun 12, 2017
f6c5014
s/reselet/reselect/g
relet Jun 12, 2017
35aa274
add missing field ISP_NAME=Operator
relet Jun 12, 2017
019e4f4
add missing topics
relet Jun 14, 2017
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
2 changes: 1 addition & 1 deletion metadata_exporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ struct md_radio_grr_cell_resel_event {
uint8_t serving_priority_class;
uint8_t serving_rxlev_avg;
uint8_t serving_five_second_timer;
uint8_t cell_reselet_status;
uint8_t cell_reselect_status;
uint8_t recent_cell_selection;
};

Expand Down
2 changes: 1 addition & 1 deletion metadata_input_munin.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "backend_event_loop.h"

/* polling interval in seconds */
#define MUNIN_POLLING_INTERVAL 5
#define MUNIN_POLLING_INTERVAL 60

/* TODO
- handle socket disconnect/reconnect
Expand Down
4 changes: 2 additions & 2 deletions metadata_input_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,8 @@ static void md_input_netlink_radio_grr_cell_resel(struct md_input_netlink *min,
event->serving_c32 = (uint32_t) json_object_get_int(val);
else if (!strcmp(key, "serving_five_second_timer"))
event->serving_five_second_timer = (uint8_t) json_object_get_int(val);
else if (!strcmp(key, "cell_reselet_status"))
event->cell_reselet_status = (uint8_t) json_object_get_int(val);
else if (!strcmp(key, "cell_reselect_status"))
event->cell_reselect_status = (uint8_t) json_object_get_int(val);
else if (!strcmp(key, "recent_cell_selection"))
event->recent_cell_selection = (uint8_t) json_object_get_int(val);
}
Expand Down
2 changes: 1 addition & 1 deletion metadata_writer_nne.c
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,7 @@ struct nne_radio_descr NNE_RADIO_GRR_CELL_RESEL_DESCR[] = {
{ "grr_cell_resel.serving_priority_class", NNE_TYPE_UINT8, offsetof(struct md_radio_grr_cell_resel_event, serving_priority_class) },
{ "grr_cell_resel.serving_rxlev_avg", NNE_TYPE_UINT8, offsetof(struct md_radio_grr_cell_resel_event, serving_rxlev_avg) },
{ "grr_cell_resel.serving_five_second_timer", NNE_TYPE_UINT8, offsetof(struct md_radio_grr_cell_resel_event, serving_five_second_timer) },
{ "grr_cell_resel.cell_reselet_status", NNE_TYPE_UINT8, offsetof(struct md_radio_grr_cell_resel_event, cell_reselet_status) },
{ "grr_cell_resel.cell_reselect_status", NNE_TYPE_UINT8, offsetof(struct md_radio_grr_cell_resel_event, cell_reselect_status) },
{ "grr_cell_resel.recent_cell_selection", NNE_TYPE_UINT8, offsetof(struct md_radio_grr_cell_resel_event, recent_cell_selection) },
{ NULL, NNE_TYPE_NULL, 0 }
};
Expand Down
173 changes: 126 additions & 47 deletions metadata_writer_zeromq.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <zmq.h>
#include JSON_LOC
#include <getopt.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
Expand All @@ -44,6 +45,16 @@
#include "metadata_exporter_log.h"
#include "backend_event_loop.h"

static double override_tstamp() {
/* return a current export timestamp with us precision, as the
event timestamp with sec resolution is not deemed useful. */
struct timeval tv;
gettimeofday(&tv, NULL);

return (double) tv.tv_sec + (double) (tv.tv_usec / 1000000.0);
}


static json_object *md_zeromq_create_json_string(json_object *obj,
const char *key, const char *value)
{
Expand All @@ -53,7 +64,7 @@ static json_object *md_zeromq_create_json_string(json_object *obj,

if (!obj_add)
return NULL;

json_object_object_add(obj, key, obj_add);
return obj;
}
Expand All @@ -65,7 +76,7 @@ static json_object *md_zeromq_create_json_int(json_object *obj, const char *key,

if (!obj_add)
return NULL;

json_object_object_add(obj, key, obj_add);
return obj;
}
Expand All @@ -77,7 +88,7 @@ static json_object *md_zeromq_create_json_int64(json_object *obj,

if (!obj_add)
return NULL;

json_object_object_add(obj, key, obj_add);
return obj;
}
Expand All @@ -97,10 +108,20 @@ static json_object *md_zeromq_create_json_double(json_object *obj,
static uint8_t md_zeromq_add_default_fields(const struct md_writer_zeromq *mwz,
struct json_object* obj, int seq, int64_t tstamp, const char* dataid) {
if (!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_SEQ],
seq) ||
seq)) {
return 0;
}
if ((mwz->metadata_project == MD_PROJECT_NNE) &&
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
tstamp) ||
(mwz->keys[MD_ZMQ_KEY_DATAVERSION] &&
tstamp)) {
return 0;
} else
if ((mwz->metadata_project == MD_PROJECT_MNR) &&
!md_zeromq_create_json_double(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
override_tstamp())) {
return 0;
}
if ((mwz->keys[MD_ZMQ_KEY_DATAVERSION] &&
!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_DATAVERSION],
MD_ZMQ_DATA_VERSION)) ||
(mwz->keys[MD_ZMQ_KEY_DATAID] &&
Expand All @@ -120,6 +141,7 @@ static json_object* md_zeromq_create_json_gps(struct md_writer_zeromq *mwz,
if (!(obj = json_object_new_object()))
return NULL;


if (!md_zeromq_add_default_fields(mwz, obj, mge->sequence,
mge->tstamp_tv.tv_sec, mwz->topics[MD_ZMQ_TOPIC_GPS])) {
json_object_put(obj);
Expand Down Expand Up @@ -157,7 +179,17 @@ static void md_zeromq_handle_gps(struct md_writer_zeromq *mwz,
return;
}

retval = snprintf(topic, sizeof(topic), "%s %s", mwz->topics[MD_ZMQ_TOPIC_GPS],
char* suffix="";
if (mge->nmea_raw) {
if (strncmp(mge->nmea_raw, "$GPGGA", 6)==0) {
suffix = ".GPGGA";
} else if (strncmp(mge->nmea_raw, "$GPRMC", 6)==0) {
suffix = ".GPRMC";
}
}

retval = snprintf(topic, sizeof(topic), "%s%s %s", mwz->topics[MD_ZMQ_TOPIC_GPS],
suffix,
json_object_to_json_string_ext(gps_obj, JSON_C_TO_STRING_PLAIN));

if (retval < sizeof(topic)) {
Expand All @@ -179,8 +211,7 @@ static void md_zeromq_handle_munin(struct md_writer_zeromq *mwz,
mwz->topics[MD_ZMQ_TOPIC_SENSOR], key);
if (retval >= sizeof(dataid)) continue;

md_zeromq_add_default_fields(mwz, val, mge->sequence, mge->tstamp,
dataid);
md_zeromq_add_default_fields(mwz, val, mge->sequence, mge->tstamp, dataid);

retval = snprintf(topic, sizeof(topic), "%s.%s %s",
mwz->topics[MD_ZMQ_TOPIC_SENSOR],
Expand All @@ -199,14 +230,14 @@ static void md_zeromq_handle_sysevent(struct md_writer_zeromq *mwz,
int retval;

md_zeromq_add_default_fields(mwz, mge->json_blob, mge->sequence,
mge->tstamp, mwz->topics[MD_ZMQ_TOPIC_SYSEVENT]);
mge->tstamp, mwz->topics[MD_ZMQ_TOPIC_SYSEVENT]);

retval = snprintf(topic, sizeof(topic), "%s %s",
mwz->topics[MD_ZMQ_TOPIC_SYSEVENT],
json_object_to_json_string_ext(mge->json_blob,
JSON_C_TO_STRING_PLAIN));
if (retval < sizeof(topic)) {
zmq_send(mwz->zmq_publisher , topic, strlen(topic), 0);
zmq_send(mwz->zmq_publisher, topic, strlen(topic), 0);
}
}

Expand Down Expand Up @@ -264,7 +295,7 @@ static void md_zeromq_handle_conn(struct md_writer_zeromq *mwz,
} else {
mode = mce->connection_mode;
}

json_obj = md_zeromq_create_json_modem_default(mwz, mce);

if (!(obj_add = json_object_new_int(mode))) {
Expand Down Expand Up @@ -300,6 +331,36 @@ static void md_zeromq_handle_conn(struct md_writer_zeromq *mwz,
json_object_put(json_obj);
}


char imei_mapping [10][30];
int maplen=0;
static int map_imei(const char* imei, const struct md_writer_zeromq *mwz) {
for (int i=0;i<maplen;i++) {
if (strcmp(imei_mapping[i], imei)==0) {
return i;
}
}
FILE *fp = fopen("/tmp/interfaces", "r");
if (fp==NULL) return -1;
char* line = NULL;
int nr=0;
int match=-1;
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, fp)) != -1) {
if(len>29) len=29;
strncpy(imei_mapping[nr], line, len);
imei_mapping[nr][strlen(imei_mapping[nr])-1]='\0';

if (strcmp(imei_mapping[nr], imei)==0) match=nr;
if (++nr==10) break;
}
maplen=nr;
fclose(fp);
if (line) free(line);
return match;
}

static json_object *md_zeromq_create_iface_json(const struct md_writer_zeromq *mwz,
struct md_iface_event *mie)
{
Expand All @@ -314,11 +375,22 @@ static json_object *md_zeromq_create_iface_json(const struct md_writer_zeromq *m
return NULL;
}

if (!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_SEQ],
mie->sequence) ||
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
mie->tstamp) ||
!md_zeromq_create_json_string(obj, mwz->keys[MD_ZMQ_KEY_ICCID],
if (mwz->metadata_project == MD_PROJECT_MNR) {
if (mie->ifname && mie->imei) {
int iifindex=map_imei(mie->imei, mwz);
if (iifindex > -1) {
char iifname[4]="opX";
iifname[2]=iifindex + '0';
if (!md_zeromq_create_json_string(obj,
mwz->keys[MD_ZMQ_KEY_MONROE_IIF_NAME], iifname)) {
json_object_put(obj);
return NULL;
}
}
}
}

if (!md_zeromq_create_json_string(obj, mwz->keys[MD_ZMQ_KEY_ICCID],
mie->iccid) ||
!md_zeromq_create_json_string(obj, mwz->keys[MD_ZMQ_KEY_IMSI],
mie->imsi) ||
Expand Down Expand Up @@ -472,7 +544,7 @@ static void md_zeromq_handle_iface(struct md_writer_zeromq *mwz,
return;
}

retval = zmq_send(mwz->zmq_publisher, topic, strlen(topic), 0);
zmq_send(mwz->zmq_publisher, topic, strlen(topic), 0);
json_object_put(json_obj);
}

Expand All @@ -485,6 +557,12 @@ static json_object *md_zeromq_handle_radio_cell_loc_gerant(
if (!(obj = json_object_new_object()))
return NULL;

if (!md_zeromq_add_default_fields(mwz, obj, event->sequence,
event->tstamp, mwz->topics[MD_ZMQ_TOPIC_RADIO_CELL_LOCATION_GERAN])) {
json_object_put(obj);
return NULL;
}

if (event->iccid &&
!md_zeromq_create_json_string(obj, mwz->keys[MD_ZMQ_KEY_ICCID],
event->iccid)) {
Expand All @@ -506,11 +584,7 @@ static json_object *md_zeromq_handle_radio_cell_loc_gerant(
return NULL;
}

if (!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_SEQ],
event->sequence) ||
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
event->tstamp) ||
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_RADIO_CELL_ID],
if (!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_RADIO_CELL_ID],
event->cell_id) ||
!md_zeromq_create_json_string(obj, mwz->keys[MD_ZMQ_KEY_RADIO_PLMN],
event->plmn) ||
Expand Down Expand Up @@ -576,11 +650,13 @@ static json_object *md_zeromq_handle_radio_cell_resel_event(
return NULL;
}

if (!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_SEQ],
event->sequence) ||
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
event->tstamp) ||
!md_zeromq_create_json_int(obj,
if (!md_zeromq_add_default_fields(mwz, obj, event->sequence,
event->tstamp, mwz->topics[MD_ZMQ_TOPIC_RADIO_GRR_CELL_RESEL])) {
json_object_put(obj);
return NULL;
}

if (!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_RADIO_SERVING_BCCH_ARFCN],
event->serving_bcch_arfcn) ||
!md_zeromq_create_json_int(obj,
Expand Down Expand Up @@ -608,8 +684,8 @@ static json_object *md_zeromq_handle_radio_cell_resel_event(
mwz->keys[MD_ZMQ_KEY_RADIO_SERVING_FIVE_SECOND_TIMER],
event->serving_five_second_timer) ||
!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_RADIO_CELL_RESELET_STATUS],
event->cell_reselet_status) ||
mwz->keys[MD_ZMQ_KEY_RADIO_CELL_RESELECT_STATUS],
event->cell_reselect_status) ||
!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_RADIO_RECENT_CELL_SELECTION],
event->recent_cell_selection)) {
Expand Down Expand Up @@ -662,11 +738,13 @@ static json_object *md_zeromq_handle_radio_cipher_mode_event(
return NULL;
}

if (!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_SEQ],
event->sequence) ||
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
event->tstamp) ||
!md_zeromq_create_json_int(obj,
if (!md_zeromq_add_default_fields(mwz, obj, event->sequence,
event->tstamp, mwz->topics[MD_ZMQ_TOPIC_RADIO_GSM_RR_CIPHER_MODE])) {
json_object_put(obj);
return NULL;
}

if (!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_RADIO_CIPHERING_STATE],
event->ciphering_state) ||
!md_zeromq_create_json_int(obj,
Expand Down Expand Up @@ -707,13 +785,15 @@ static json_object *md_zeromq_handle_cell_reset_param_event(
event->imei)) {
json_object_put(obj);
return NULL;
}

if (!md_zeromq_add_default_fields(mwz, obj, event->sequence,
event->tstamp, mwz->topics[MD_ZMQ_TOPIC_RADIO_GSM_RR_CELL_SEL_RESEL_PARAM])) {
json_object_put(obj);
return NULL;
}

if (!md_zeromq_create_json_int(obj, mwz->keys[MD_ZMQ_KEY_SEQ],
event->sequence) ||
!md_zeromq_create_json_int64(obj, mwz->keys[MD_ZMQ_KEY_TSTAMP],
event->tstamp) ||
!md_zeromq_create_json_int(obj,
if (!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_RADIO_CELL_RESELECT_HYSTERESIS],
event->cell_reselect_hysteresis) ||
!md_zeromq_create_json_int(obj,
Expand Down Expand Up @@ -786,13 +866,13 @@ static json_object *md_zeromq_handle_rr_channel_conf_event(
return NULL;
}

if (!md_zeromq_add_default_fields(mwz, obj, event->sequence,
event->tstamp, mwz->topics[MD_ZMQ_TOPIC_RADIO_GSM_RR_CHANNEL_CONF])) {
json_object_put(obj);
return NULL;
}

if (!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_SEQ],
event->sequence) ||
!md_zeromq_create_json_int64(obj,
mwz->keys[MD_ZMQ_KEY_TSTAMP],
event->tstamp) ||
!md_zeromq_create_json_int(obj,
mwz->keys[MD_ZMQ_KEY_RADIO_NUM_DED_CHANS],
event->num_ded_chans) ||
!md_zeromq_create_json_int(obj,
Expand Down Expand Up @@ -983,7 +1063,6 @@ static uint8_t md_zeromq_config(struct md_writer_zeromq *mwz,
if ((mwz->zmq_publisher = zmq_socket(mwz->zmq_context, ZMQ_PUB)) == NULL)
return RETVAL_FAILURE;


if ((retval = zmq_bind(mwz->zmq_publisher, mwz->zmq_addr)) != 0) {
META_PRINT_SYSLOG(mwz->parent, LOG_ERR, "zmq_bind failed (%d): %s, "
"stating timer\n", errno, zmq_strerror(errno));
Expand Down
4 changes: 3 additions & 1 deletion metadata_writer_zeromq.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ enum md_zmq_keys {
MD_ZMQ_KEY_RADIO_SERVING_C31,
MD_ZMQ_KEY_RADIO_SERVING_C32,
MD_ZMQ_KEY_RADIO_SERVING_FIVE_SECOND_TIMER,
MD_ZMQ_KEY_RADIO_CELL_RESELET_STATUS ,
MD_ZMQ_KEY_RADIO_CELL_RESELECT_STATUS ,
MD_ZMQ_KEY_RADIO_RECENT_CELL_SELECTION,
MD_ZMQ_KEY_RADIO_GRR_CELL_NEIGHBORS,

Expand Down Expand Up @@ -147,6 +147,8 @@ enum md_zmq_keys {
MD_ZMQ_KEY_RADIO_BEFORE_CHANNEL_CONFIG,
MD_ZMQ_KEY_RADIO_CHANNEL_MODE_1,
MD_ZMQ_KEY_RADIO_CHANNEL_MODE_2,

MD_ZMQ_KEY_MONROE_IIF_NAME,
__MD_ZMQ_KEYS_MAX
};
#define MD_ZMQ_KEYS_MAX (__MD_ZMQ_KEYS_MAX - 1)
Expand Down
Loading