3030#include <zmq.h>
3131#include JSON_LOC
3232#include <getopt.h>
33+ #include <sys/time.h>
3334#include <sys/types.h>
3435#include <sys/socket.h>
3536#include <netdb.h>
4445#include "metadata_exporter_log.h"
4546#include "backend_event_loop.h"
4647
48+ static double override_tstamp () {
49+ /* return a current export timestamp with us precision, as the
50+ event timestamp with sec resolution is not deemed useful. */
51+ struct timeval tv ;
52+ gettimeofday (& tv , NULL );
53+
54+ return (double ) tv .tv_sec + (double ) (tv .tv_usec / 1000000.0 );
55+ }
56+
57+
4758static json_object * md_zeromq_create_json_string (json_object * obj ,
4859 const char * key , const char * value )
4960{
@@ -53,7 +64,7 @@ static json_object *md_zeromq_create_json_string(json_object *obj,
5364
5465 if (!obj_add )
5566 return NULL ;
56-
67+
5768 json_object_object_add (obj , key , obj_add );
5869 return obj ;
5970}
@@ -65,7 +76,7 @@ static json_object *md_zeromq_create_json_int(json_object *obj, const char *key,
6576
6677 if (!obj_add )
6778 return NULL ;
68-
79+
6980 json_object_object_add (obj , key , obj_add );
7081 return obj ;
7182}
@@ -77,7 +88,7 @@ static json_object *md_zeromq_create_json_int64(json_object *obj,
7788
7889 if (!obj_add )
7990 return NULL ;
80-
91+
8192 json_object_object_add (obj , key , obj_add );
8293 return obj ;
8394}
@@ -97,10 +108,20 @@ static json_object *md_zeromq_create_json_double(json_object *obj,
97108static uint8_t md_zeromq_add_default_fields (const struct md_writer_zeromq * mwz ,
98109 struct json_object * obj , int seq , int64_t tstamp , const char * dataid ) {
99110 if (!md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_SEQ ],
100- seq ) ||
111+ seq )) {
112+ return 0 ;
113+ }
114+ if ((mwz -> metadata_project == MD_PROJECT_NNE ) &&
101115 !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
102- tstamp ) ||
103- (mwz -> keys [MD_ZMQ_KEY_DATAVERSION ] &&
116+ tstamp )) {
117+ return 0 ;
118+ } else
119+ if ((mwz -> metadata_project == MD_PROJECT_MNR ) &&
120+ !md_zeromq_create_json_double (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
121+ override_tstamp ())) {
122+ return 0 ;
123+ }
124+ if ((mwz -> keys [MD_ZMQ_KEY_DATAVERSION ] &&
104125 !md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_DATAVERSION ],
105126 MD_ZMQ_DATA_VERSION )) ||
106127 (mwz -> keys [MD_ZMQ_KEY_DATAID ] &&
@@ -120,6 +141,7 @@ static json_object* md_zeromq_create_json_gps(struct md_writer_zeromq *mwz,
120141 if (!(obj = json_object_new_object ()))
121142 return NULL ;
122143
144+
123145 if (!md_zeromq_add_default_fields (mwz , obj , mge -> sequence ,
124146 mge -> tstamp_tv .tv_sec , mwz -> topics [MD_ZMQ_TOPIC_GPS ])) {
125147 json_object_put (obj );
@@ -157,7 +179,17 @@ static void md_zeromq_handle_gps(struct md_writer_zeromq *mwz,
157179 return ;
158180 }
159181
160- retval = snprintf (topic , sizeof (topic ), "%s %s" , mwz -> topics [MD_ZMQ_TOPIC_GPS ],
182+ char * suffix = "" ;
183+ if (mge -> nmea_raw ) {
184+ if (strncmp (mge -> nmea_raw , "$GPGGA" , 6 )== 0 ) {
185+ suffix = ".GPGGA" ;
186+ } else if (strncmp (mge -> nmea_raw , "$GPRMC" , 6 )== 0 ) {
187+ suffix = ".GPRMC" ;
188+ }
189+ }
190+
191+ retval = snprintf (topic , sizeof (topic ), "%s%s %s" , mwz -> topics [MD_ZMQ_TOPIC_GPS ],
192+ suffix ,
161193 json_object_to_json_string_ext (gps_obj , JSON_C_TO_STRING_PLAIN ));
162194
163195 if (retval < sizeof (topic )) {
@@ -179,8 +211,7 @@ static void md_zeromq_handle_munin(struct md_writer_zeromq *mwz,
179211 mwz -> topics [MD_ZMQ_TOPIC_SENSOR ], key );
180212 if (retval >= sizeof (dataid )) continue ;
181213
182- md_zeromq_add_default_fields (mwz , val , mge -> sequence , mge -> tstamp ,
183- dataid );
214+ md_zeromq_add_default_fields (mwz , val , mge -> sequence , mge -> tstamp , dataid );
184215
185216 retval = snprintf (topic , sizeof (topic ), "%s.%s %s" ,
186217 mwz -> topics [MD_ZMQ_TOPIC_SENSOR ],
@@ -199,14 +230,14 @@ static void md_zeromq_handle_sysevent(struct md_writer_zeromq *mwz,
199230 int retval ;
200231
201232 md_zeromq_add_default_fields (mwz , mge -> json_blob , mge -> sequence ,
202- mge -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_SYSEVENT ]);
233+ mge -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_SYSEVENT ]);
203234
204235 retval = snprintf (topic , sizeof (topic ), "%s %s" ,
205236 mwz -> topics [MD_ZMQ_TOPIC_SYSEVENT ],
206237 json_object_to_json_string_ext (mge -> json_blob ,
207238 JSON_C_TO_STRING_PLAIN ));
208239 if (retval < sizeof (topic )) {
209- zmq_send (mwz -> zmq_publisher , topic , strlen (topic ), 0 );
240+ zmq_send (mwz -> zmq_publisher , topic , strlen (topic ), 0 );
210241 }
211242}
212243
@@ -264,7 +295,7 @@ static void md_zeromq_handle_conn(struct md_writer_zeromq *mwz,
264295 } else {
265296 mode = mce -> connection_mode ;
266297 }
267-
298+
268299 json_obj = md_zeromq_create_json_modem_default (mwz , mce );
269300
270301 if (!(obj_add = json_object_new_int (mode ))) {
@@ -300,6 +331,36 @@ static void md_zeromq_handle_conn(struct md_writer_zeromq *mwz,
300331 json_object_put (json_obj );
301332}
302333
334+
335+ char imei_mapping [10 ][30 ];
336+ int maplen = 0 ;
337+ static int map_imei (const char * imei , const struct md_writer_zeromq * mwz ) {
338+ for (int i = 0 ;i < maplen ;i ++ ) {
339+ if (strcmp (imei_mapping [i ], imei )== 0 ) {
340+ return i ;
341+ }
342+ }
343+ FILE * fp = fopen ("/tmp/interfaces" , "r" );
344+ if (fp == NULL ) return -1 ;
345+ char * line = NULL ;
346+ int nr = 0 ;
347+ int match = -1 ;
348+ size_t len = 0 ;
349+ ssize_t read ;
350+ while ((read = getline (& line , & len , fp )) != -1 ) {
351+ if (len > 29 ) len = 29 ;
352+ strncpy (imei_mapping [nr ], line , len );
353+ imei_mapping [nr ][strlen (imei_mapping [nr ])- 1 ]= '\0' ;
354+
355+ if (strcmp (imei_mapping [nr ], imei )== 0 ) match = nr ;
356+ if (++ nr == 10 ) break ;
357+ }
358+ maplen = nr ;
359+ fclose (fp );
360+ if (line ) free (line );
361+ return match ;
362+ }
363+
303364static json_object * md_zeromq_create_iface_json (const struct md_writer_zeromq * mwz ,
304365 struct md_iface_event * mie )
305366{
@@ -314,11 +375,22 @@ static json_object *md_zeromq_create_iface_json(const struct md_writer_zeromq *m
314375 return NULL ;
315376 }
316377
317- if (!md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_SEQ ],
318- mie -> sequence ) ||
319- !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
320- mie -> tstamp ) ||
321- !md_zeromq_create_json_string (obj , mwz -> keys [MD_ZMQ_KEY_ICCID ],
378+ if (mwz -> metadata_project == MD_PROJECT_MNR ) {
379+ if (mie -> ifname && mie -> imei ) {
380+ int iifindex = map_imei (mie -> imei , mwz );
381+ if (iifindex > -1 ) {
382+ char iifname [4 ]= "opX" ;
383+ iifname [2 ]= iifindex + '0' ;
384+ if (!md_zeromq_create_json_string (obj ,
385+ mwz -> keys [MD_ZMQ_KEY_MONROE_IIF_NAME ], iifname )) {
386+ json_object_put (obj );
387+ return NULL ;
388+ }
389+ }
390+ }
391+ }
392+
393+ if (!md_zeromq_create_json_string (obj , mwz -> keys [MD_ZMQ_KEY_ICCID ],
322394 mie -> iccid ) ||
323395 !md_zeromq_create_json_string (obj , mwz -> keys [MD_ZMQ_KEY_IMSI ],
324396 mie -> imsi ) ||
@@ -472,7 +544,7 @@ static void md_zeromq_handle_iface(struct md_writer_zeromq *mwz,
472544 return ;
473545 }
474546
475- retval = zmq_send (mwz -> zmq_publisher , topic , strlen (topic ), 0 );
547+ zmq_send (mwz -> zmq_publisher , topic , strlen (topic ), 0 );
476548 json_object_put (json_obj );
477549}
478550
@@ -485,6 +557,12 @@ static json_object *md_zeromq_handle_radio_cell_loc_gerant(
485557 if (!(obj = json_object_new_object ()))
486558 return NULL ;
487559
560+ if (!md_zeromq_add_default_fields (mwz , obj , event -> sequence ,
561+ event -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_RADIO_CELL_LOCATION_GERAN ])) {
562+ json_object_put (obj );
563+ return NULL ;
564+ }
565+
488566 if (event -> iccid &&
489567 !md_zeromq_create_json_string (obj , mwz -> keys [MD_ZMQ_KEY_ICCID ],
490568 event -> iccid )) {
@@ -506,11 +584,7 @@ static json_object *md_zeromq_handle_radio_cell_loc_gerant(
506584 return NULL ;
507585 }
508586
509- if (!md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_SEQ ],
510- event -> sequence ) ||
511- !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
512- event -> tstamp ) ||
513- !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_RADIO_CELL_ID ],
587+ if (!md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_RADIO_CELL_ID ],
514588 event -> cell_id ) ||
515589 !md_zeromq_create_json_string (obj , mwz -> keys [MD_ZMQ_KEY_RADIO_PLMN ],
516590 event -> plmn ) ||
@@ -576,11 +650,13 @@ static json_object *md_zeromq_handle_radio_cell_resel_event(
576650 return NULL ;
577651 }
578652
579- if (!md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_SEQ ],
580- event -> sequence ) ||
581- !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
582- event -> tstamp ) ||
583- !md_zeromq_create_json_int (obj ,
653+ if (!md_zeromq_add_default_fields (mwz , obj , event -> sequence ,
654+ event -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_RADIO_GRR_CELL_RESEL ])) {
655+ json_object_put (obj );
656+ return NULL ;
657+ }
658+
659+ if (!md_zeromq_create_json_int (obj ,
584660 mwz -> keys [MD_ZMQ_KEY_RADIO_SERVING_BCCH_ARFCN ],
585661 event -> serving_bcch_arfcn ) ||
586662 !md_zeromq_create_json_int (obj ,
@@ -608,8 +684,8 @@ static json_object *md_zeromq_handle_radio_cell_resel_event(
608684 mwz -> keys [MD_ZMQ_KEY_RADIO_SERVING_FIVE_SECOND_TIMER ],
609685 event -> serving_five_second_timer ) ||
610686 !md_zeromq_create_json_int (obj ,
611- mwz -> keys [MD_ZMQ_KEY_RADIO_CELL_RESELET_STATUS ],
612- event -> cell_reselet_status ) ||
687+ mwz -> keys [MD_ZMQ_KEY_RADIO_CELL_RESELECT_STATUS ],
688+ event -> cell_reselect_status ) ||
613689 !md_zeromq_create_json_int (obj ,
614690 mwz -> keys [MD_ZMQ_KEY_RADIO_RECENT_CELL_SELECTION ],
615691 event -> recent_cell_selection )) {
@@ -662,11 +738,13 @@ static json_object *md_zeromq_handle_radio_cipher_mode_event(
662738 return NULL ;
663739 }
664740
665- if (!md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_SEQ ],
666- event -> sequence ) ||
667- !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
668- event -> tstamp ) ||
669- !md_zeromq_create_json_int (obj ,
741+ if (!md_zeromq_add_default_fields (mwz , obj , event -> sequence ,
742+ event -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_RADIO_GSM_RR_CIPHER_MODE ])) {
743+ json_object_put (obj );
744+ return NULL ;
745+ }
746+
747+ if (!md_zeromq_create_json_int (obj ,
670748 mwz -> keys [MD_ZMQ_KEY_RADIO_CIPHERING_STATE ],
671749 event -> ciphering_state ) ||
672750 !md_zeromq_create_json_int (obj ,
@@ -707,13 +785,15 @@ static json_object *md_zeromq_handle_cell_reset_param_event(
707785 event -> imei )) {
708786 json_object_put (obj );
709787 return NULL ;
788+ }
789+
790+ if (!md_zeromq_add_default_fields (mwz , obj , event -> sequence ,
791+ event -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_RADIO_GSM_RR_CELL_SEL_RESEL_PARAM ])) {
792+ json_object_put (obj );
793+ return NULL ;
710794 }
711795
712- if (!md_zeromq_create_json_int (obj , mwz -> keys [MD_ZMQ_KEY_SEQ ],
713- event -> sequence ) ||
714- !md_zeromq_create_json_int64 (obj , mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
715- event -> tstamp ) ||
716- !md_zeromq_create_json_int (obj ,
796+ if (!md_zeromq_create_json_int (obj ,
717797 mwz -> keys [MD_ZMQ_KEY_RADIO_CELL_RESELECT_HYSTERESIS ],
718798 event -> cell_reselect_hysteresis ) ||
719799 !md_zeromq_create_json_int (obj ,
@@ -786,13 +866,13 @@ static json_object *md_zeromq_handle_rr_channel_conf_event(
786866 return NULL ;
787867 }
788868
869+ if (!md_zeromq_add_default_fields (mwz , obj , event -> sequence ,
870+ event -> tstamp , mwz -> topics [MD_ZMQ_TOPIC_RADIO_GSM_RR_CHANNEL_CONF ])) {
871+ json_object_put (obj );
872+ return NULL ;
873+ }
874+
789875 if (!md_zeromq_create_json_int (obj ,
790- mwz -> keys [MD_ZMQ_KEY_SEQ ],
791- event -> sequence ) ||
792- !md_zeromq_create_json_int64 (obj ,
793- mwz -> keys [MD_ZMQ_KEY_TSTAMP ],
794- event -> tstamp ) ||
795- !md_zeromq_create_json_int (obj ,
796876 mwz -> keys [MD_ZMQ_KEY_RADIO_NUM_DED_CHANS ],
797877 event -> num_ded_chans ) ||
798878 !md_zeromq_create_json_int (obj ,
@@ -983,7 +1063,6 @@ static uint8_t md_zeromq_config(struct md_writer_zeromq *mwz,
9831063 if ((mwz -> zmq_publisher = zmq_socket (mwz -> zmq_context , ZMQ_PUB )) == NULL )
9841064 return RETVAL_FAILURE ;
9851065
986-
9871066 if ((retval = zmq_bind (mwz -> zmq_publisher , mwz -> zmq_addr )) != 0 ) {
9881067 META_PRINT_SYSLOG (mwz -> parent , LOG_ERR , "zmq_bind failed (%d): %s, "
9891068 "stating timer\n" , errno , zmq_strerror (errno ));
0 commit comments