From: Omar Tarabai Date: Mon, 30 Jun 2014 14:17:28 +0000 (+0000) Subject: initial sensor reporting component code X-Git-Tag: initial-import-from-subversion-38251~3543 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0e07f3b3f6df0f56bc5b23820977864828616845;p=oweals%2Fgnunet.git initial sensor reporting component code --- diff --git a/src/include/gnunet_sensor_service.h b/src/include/gnunet_sensor_service.h index cd840dd75..19dcbbb75 100644 --- a/src/include/gnunet_sensor_service.h +++ b/src/include/gnunet_sensor_service.h @@ -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) diff --git a/src/sensor/Makefile.am b/src/sensor/Makefile.am index a1c8881fa..08b536d0a 100644 --- a/src/sensor/Makefile.am +++ b/src/sensor/Makefile.am @@ -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 index 000000000..2808f01b8 --- /dev/null +++ b/src/sensor/gnunet-service-sensor-reporting.c @@ -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 */ diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c index 83e611bfb..0e5133d6f 100644 --- a/src/sensor/gnunet-service-sensor.c +++ b/src/sensor/gnunet-service-sensor.c @@ -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); diff --git a/src/sensor/sensor.h b/src/sensor/sensor.h index 0a301327d..9966be951 100644 --- a/src/sensor/sensor.h +++ b/src/sensor/sensor.h @@ -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); diff --git a/src/sensor/sensors/average-ping-rtt b/src/sensor/sensors/average-ping-rtt index 36888c982..5cda1852c 100644 --- a/src/sensor/sensors/average-ping-rtt +++ b/src/sensor/sensors/average-ping-rtt @@ -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 diff --git a/src/sensor/sensors/datacache-bytes-stored b/src/sensor/sensors/datacache-bytes-stored index b55ee8083..05172b14b 100644 --- a/src/sensor/sensors/datacache-bytes-stored +++ b/src/sensor/sensors/datacache-bytes-stored @@ -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 diff --git a/src/sensor/sensors/gnunet-version b/src/sensor/sensors/gnunet-version index b9941f77f..b6ab56a5f 100644 --- a/src/sensor/sensors/gnunet-version +++ b/src/sensor/sensors/gnunet-version @@ -25,7 +25,7 @@ EXT_ARGS = -v EXPECTED_DATATYPE = string # Reporting mechanism -COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 +COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0 COLLECTION_INTERVAL = 86400 P2P_REPORT = NO diff --git a/src/sensor/sensors/known-peers b/src/sensor/sensors/known-peers index 5c7c1aeaa..d7db9b149 100644 --- a/src/sensor/sensors/known-peers +++ b/src/sensor/sensors/known-peers @@ -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 diff --git a/src/sensor/sensors/nse b/src/sensor/sensors/nse index f95cc34de..856f37640 100644 --- a/src/sensor/sensors/nse +++ b/src/sensor/sensors/nse @@ -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 diff --git a/src/sensor/sensors/peerstore-memory b/src/sensor/sensors/peerstore-memory index 6d6c54600..9a5f65d10 100644 --- a/src/sensor/sensors/peerstore-memory +++ b/src/sensor/sensors/peerstore-memory @@ -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 diff --git a/src/sensor/sensors/transport-bytes-received b/src/sensor/sensors/transport-bytes-received index 5c45d6cb1..d3ce67412 100644 --- a/src/sensor/sensors/transport-bytes-received +++ b/src/sensor/sensors/transport-bytes-received @@ -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 diff --git a/src/sensor/sensors/transport-tcp-bytes-transmitted b/src/sensor/sensors/transport-tcp-bytes-transmitted index cf45c0c86..c566ee488 100644 --- a/src/sensor/sensors/transport-tcp-bytes-transmitted +++ b/src/sensor/sensors/transport-tcp-bytes-transmitted @@ -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 diff --git a/src/sensor/sensors/transport-tcp-sessions-active b/src/sensor/sensors/transport-tcp-sessions-active index 810313091..1f5c81125 100644 --- a/src/sensor/sensors/transport-tcp-sessions-active +++ b/src/sensor/sensors/transport-tcp-sessions-active @@ -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