initial sensor reporting component code
authorOmar Tarabai <tarabai@devegypt.com>
Mon, 30 Jun 2014 14:17:28 +0000 (14:17 +0000)
committerOmar Tarabai <tarabai@devegypt.com>
Mon, 30 Jun 2014 14:17:28 +0000 (14:17 +0000)
14 files changed:
src/include/gnunet_sensor_service.h
src/sensor/Makefile.am
src/sensor/gnunet-service-sensor-reporting.c [new file with mode: 0644]
src/sensor/gnunet-service-sensor.c
src/sensor/sensor.h
src/sensor/sensors/average-ping-rtt
src/sensor/sensors/datacache-bytes-stored
src/sensor/sensors/gnunet-version
src/sensor/sensors/known-peers
src/sensor/sensors/nse
src/sensor/sensors/peerstore-memory
src/sensor/sensors/transport-bytes-received
src/sensor/sensors/transport-tcp-bytes-transmitted
src/sensor/sensors/transport-tcp-sessions-active

index cd840dd758e9253c94c7be094eefc1658dbf95e3..19dcbbb754d66cf9cf970ab43eaf17e3014217f5 100644 (file)
@@ -171,7 +171,7 @@ struct SensorInfo
   /*
    * Time interval to send sensor information to collection point (e.g. every 30 mins)
    */
-  struct GNUNET_TIME_Relative *collection_interval;
+  struct GNUNET_TIME_Relative collection_interval;
 
   /*
    * Flag specifying if value is to be communicated to the p2p network
@@ -181,7 +181,7 @@ struct SensorInfo
   /*
    * Time interval to communicate value to the p2p network
    */
-  struct GNUNET_TIME_Relative *p2p_interval;
+  struct GNUNET_TIME_Relative p2p_interval;
 
   /*
    * Execution task (OR GNUNET_SCHEDULER_NO_TASK)
index a1c8881fa15ff995ba3b8d92f7966bea8691a66d..08b536d0a97982d751d0dfeffd2a2318e5c6289f 100644 (file)
@@ -35,7 +35,8 @@ gnunet_sensor_LDADD = \
 
 gnunet_service_sensor_SOURCES = \
  gnunet-service-sensor.c \
- gnunet-service-sensor-analysis.c
+ gnunet-service-sensor-analysis.c \
+ gnunet-service-sensor-reporting.c
 gnunet_service_sensor_LDADD = \
   $(top_builddir)/src/util/libgnunetutil.la \
   $(top_builddir)/src/statistics/libgnunetstatistics.la \
diff --git a/src/sensor/gnunet-service-sensor-reporting.c b/src/sensor/gnunet-service-sensor-reporting.c
new file mode 100644 (file)
index 0000000..2808f01
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+     This file is part of GNUnet.
+     (C)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file sensor/gnunet-service-sensor-reporting.c
+ * @brief sensor service reporting functionality
+ * @author Omar Tarabai
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "sensor.h"
+#include "gnunet_peerstore_service.h"
+
+#define LOG(kind,...) GNUNET_log_from (kind, "sensor-reporting",__VA_ARGS__)
+
+/**
+ * Context of reporting to collection
+ * point
+ */
+struct CollectionReportingContext
+{
+
+  /**
+   * Sensor information
+   */
+  struct SensorInfo *sensor;
+
+  /**
+   * Reporting task (OR GNUNET_SCHEDULER_NO_TASK)
+   */
+  GNUNET_SCHEDULER_TaskIdentifier task;
+
+};
+
+/**
+ * Our configuration.
+ */
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+/**
+ * Handle to peerstore service
+ */
+static struct GNUNET_PEERSTORE_Handle *peerstore;
+
+/**
+ * My peer id
+ */
+struct GNUNET_PeerIdentity peerid;
+
+
+/**
+ * Stop sensor reporting module
+ */
+void SENSOR_reporting_stop()
+{
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping sensor reporting module.\n");
+  if (NULL != peerstore)
+  {
+    GNUNET_PEERSTORE_disconnect(peerstore);
+    peerstore = NULL;
+  }
+}
+
+/**
+ * Task scheduled to send values to collection point
+ *
+ * @param cls closure, a 'struct CollectionReportingContext *'
+ * @param tc unused
+ */
+void report_collection_point
+(void *cls, const struct GNUNET_SCHEDULER_TaskContext* tc)
+{
+  struct CollectionReportingContext *crc = cls;
+
+  crc->task = GNUNET_SCHEDULER_NO_TASK;
+}
+
+/**
+ * Iterator for defined sensors
+ * Watches sensors for readings to report
+ *
+ * @param cls unused
+ * @param key unused
+ * @param value a 'struct SensorInfo *' with sensor information
+ * @return #GNUNET_YES to continue iterations
+ */
+static int
+init_sensor_reporting (void *cls,
+    const struct GNUNET_HashCode *key,
+    void *value)
+{
+  struct SensorInfo *sensor = value;
+  struct CollectionReportingContext *crc;
+
+  if (NULL != sensor->collection_point)
+  {
+    LOG (GNUNET_ERROR_TYPE_INFO,
+        "Will start reporting sensor `%s' values to collection point `%s' every %s.\n",
+        sensor->name, GNUNET_i2s_full(sensor->collection_point),
+        GNUNET_STRINGS_relative_time_to_string(sensor->collection_interval, GNUNET_YES));
+    crc = GNUNET_new (struct CollectionReportingContext);
+    crc->sensor = sensor;
+    crc->task =
+        GNUNET_SCHEDULER_add_delayed(sensor->collection_interval,
+            &report_collection_point,
+            crc);
+  }
+  if (GNUNET_YES == sensor->p2p_report)
+  {
+    LOG (GNUNET_ERROR_TYPE_INFO,
+        "Will start reporting sensor `%s' values to p2p network every %s.\n",
+        sensor->name,
+        GNUNET_STRINGS_relative_time_to_string(sensor->p2p_interval, GNUNET_YES));
+  }
+  return GNUNET_YES;
+}
+
+/**
+ * Start the sensor reporting module
+ *
+ * @param c our service configuration
+ * @param sensors multihashmap of loaded sensors
+ * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise
+ */
+int
+SENSOR_reporting_start(const struct GNUNET_CONFIGURATION_Handle *c,
+    struct GNUNET_CONTAINER_MultiHashMap *sensors)
+{
+
+  GNUNET_assert(NULL != sensors);
+  cfg = c;
+  GNUNET_CRYPTO_get_peer_identity(cfg, &peerid);
+  GNUNET_CONTAINER_multihashmap_iterate(sensors, &init_sensor_reporting, NULL);
+  peerstore = GNUNET_PEERSTORE_connect(cfg);
+  if (NULL == peerstore)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, _("Could not connect to peerstore service.\n"));
+    SENSOR_reporting_stop();
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+/* end of gnunet-service-sensor-reporting.c */
index 83e611bfbedfcee5456967641a0591a96cd3b0ee..0e5133d6f4eec64350e9e4b7487babb197e166f0 100644 (file)
@@ -159,6 +159,7 @@ static void
 shutdown_task (void *cls,
               const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  SENSOR_reporting_stop();
   SENSOR_analysis_stop();
   GNUNET_CONTAINER_multihashmap_iterate(sensors, &destroy_sensor, NULL);
   GNUNET_CONTAINER_multihashmap_destroy(sensors);
@@ -238,6 +239,8 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
   char *starttime_str;
   char *endtime_str;
   unsigned long long time_sec;
+  char *dummy;
+  struct GNUNET_CRYPTO_EddsaPublicKey public_key;
 
   sensor = GNUNET_new(struct SensorInfo);
   //name
@@ -307,6 +310,10 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
   if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "LIFETIME", &time_sec))
   {
     sensor->lifetime = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
+    if (sensor->lifetime.rel_value_us < sensor->interval.rel_value_us)
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+          "Lifetime of sensor data is preferred to be higher than interval for sensor `%s'.\n",
+          sensor->name);
   }
   else
     sensor->lifetime = sensor->interval;
@@ -352,7 +359,36 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
     GNUNET_free(sensor);
     return NULL;
   }
-  //TODO: reporting mechanism
+  //reporting mechanism
+  if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "COLLECTION_POINT", &dummy))
+  {
+    if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "COLLECTION_INTERVAL", &time_sec))
+    {
+      GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor collection interval\n"));
+    }
+    else
+    {
+      sensor->collection_interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
+      if (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string(dummy, strlen(dummy), &public_key))
+      {
+        sensor->collection_point = GNUNET_new(struct GNUNET_PeerIdentity);
+        sensor->collection_point->public_key = public_key;
+      }
+    }
+  }
+  sensor->p2p_report = GNUNET_NO;
+  if (GNUNET_YES == GNUNET_CONFIGURATION_get_value_yesno(cfg, sectionname, "P2P_REPORT"))
+  {
+    if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "P2P_INTERVAL", &time_sec))
+    {
+      GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor p2p reporting interval\n"));
+    }
+    else
+    {
+      sensor->p2p_interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
+      sensor->p2p_report = GNUNET_YES;
+    }
+  }
   //execution task
   sensor->execution_task = GNUNET_SCHEDULER_NO_TASK;
   //running
@@ -991,6 +1027,7 @@ run (void *cls,
   reload_sensors();
   schedule_all_sensors();
   SENSOR_analysis_start(c, sensors);
+  SENSOR_reporting_start(c, sensors);
   statistics = GNUNET_STATISTICS_create("sensor", cfg);
   GNUNET_CRYPTO_get_peer_identity(cfg, &peerid);
   peerstore = GNUNET_PEERSTORE_connect(cfg);
index 0a301327d0b31a5977a8dae02498f0aa5f462ec1..9966be951e0bdf1c2f964b77511e0fdf8cf7678d 100644 (file)
@@ -77,3 +77,19 @@ void SENSOR_analysis_stop();
 int
 SENSOR_analysis_start(const struct GNUNET_CONFIGURATION_Handle *c,
     struct GNUNET_CONTAINER_MultiHashMap *sensors_mhm);
+
+/**
+ * Stop sensor reporting module
+ */
+void SENSOR_reporting_stop();
+
+/**
+ * Start the sensor reporting module
+ *
+ * @param c our service configuration
+ * @param sensors multihashmap of loaded sensors
+ * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise
+ */
+int
+SENSOR_reporting_start(const struct GNUNET_CONFIGURATION_Handle *c,
+    struct GNUNET_CONTAINER_MultiHashMap *sensors);
index 36888c9829e867fd1f9a2a64283b21bdf35b8f55..5cda1852c3941c67c940a0525e035bb05a74e861 100644 (file)
@@ -25,8 +25,8 @@ EXT_PROCESS = avgping.sh
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 7200
 
-P2P_REPORT = NO
-#P2P_INTERVAL = 
+P2P_REPORT = YES
+P2P_INTERVAL = 300
index b55ee80834da1afca1a6d7d6f2c2da9e93ed8560..05172b14b8f1a2df1592fa4d49e740a24264a5c4 100644 (file)
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # bytes stored
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 120
 
 P2P_REPORT = NO
index b9941f77f7fe6f1485afdc17f622bd65b9064b9e..b6ab56a5fae6fd460c2179818a7730f72ff0af38 100644 (file)
@@ -25,7 +25,7 @@ EXT_ARGS = -v
 EXPECTED_DATATYPE = string
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 86400
 
 P2P_REPORT = NO
index 5c7c1aeaae47556345f95eb13639eee706504b00..d7db9b1492268e5d05cf003679bda7667e65d9e0 100644 (file)
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # peers known
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 120
 
 P2P_REPORT = NO
index f95cc34de9b52e0518cccf931ebca10889bd31f8..856f37640b68457182c5936f9ee094edfb223a0c 100644 (file)
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # nodes in the network (estimate)
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 120
 
 P2P_REPORT = NO
index 6d6c54600be1f1f7ee25c355fb1afd8bd1f54ce9..9a5f65d100b4fa75d3035bc1006c0382053d935f 100644 (file)
@@ -25,7 +25,7 @@ EXT_PROCESS = peerstore-memory.sh
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 7200
 
 P2P_REPORT = NO
index 5c45d6cb1efbd3594e0b029918c68aa65f888009..d3ce674121e65d09f8927d8a269f8211b9959a42 100644 (file)
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # bytes total received
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 120
 
 P2P_REPORT = NO
index cf45c0c86730bc46be89fe7de407c96fda944eba..c566ee488d3717a54967e79f2e533d0d22c5d9ee 100644 (file)
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # bytes transmitted via TCP
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 120
 
 P2P_REPORT = NO
index 810313091a03937127274ece27c1522fe6191bcb..1f5c81125bd179d4ff45d79d2407d8f90c611a17 100644 (file)
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # TCP sessions active
 EXPECTED_DATATYPE = numeric
 
 # Reporting mechanism
-COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
+COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
 COLLECTION_INTERVAL = 120
 
 P2P_REPORT = NO