aboutsummaryrefslogtreecommitdiff
path: root/src/sensor
diff options
context:
space:
mode:
authorOmar Tarabai <tarabai@devegypt.com>2014-05-02 18:18:00 +0000
committerOmar Tarabai <tarabai@devegypt.com>2014-05-02 18:18:00 +0000
commit2295fa452abce952d02074af06bc08e265e8ed7c (patch)
tree9c50b7470d49c6d1f9654695a1942f9f0049db78 /src/sensor
parent8fb2088b5105c48353a4b92fb54d6abdf75de45c (diff)
downloadgnunet-2295fa452abce952d02074af06bc08e265e8ed7c.tar.gz
gnunet-2295fa452abce952d02074af06bc08e265e8ed7c.zip
towards sensor scheduling
Diffstat (limited to 'src/sensor')
-rw-r--r--src/sensor/gnunet-service-sensor.c133
-rw-r--r--src/sensor/sensors/averagepingrtt2
-rw-r--r--src/sensor/sensors/connectedpeers2
-rw-r--r--src/sensor/sensors/gnunetversion2
4 files changed, 135 insertions, 4 deletions
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c
index 38099b172..23601c50f 100644
--- a/src/sensor/gnunet-service-sensor.c
+++ b/src/sensor/gnunet-service-sensor.c
@@ -23,6 +23,7 @@
23 * @brief sensor service implementation 23 * @brief sensor service implementation
24 * @author Omar Tarabai 24 * @author Omar Tarabai
25 */ 25 */
26#include <inttypes.h>
26#include "platform.h" 27#include "platform.h"
27#include "gnunet_util_lib.h" 28#include "gnunet_util_lib.h"
28#include "sensor.h" 29#include "sensor.h"
@@ -59,6 +60,11 @@ struct SensorInfo
59 char *description; 60 char *description;
60 61
61 /* 62 /*
63 * Sensor currently enabled
64 */
65 int enabled;
66
67 /*
62 * Category under which the sensor falls (e.g. tcp, datastore) 68 * Category under which the sensor falls (e.g. tcp, datastore)
63 */ 69 */
64 char *category; 70 char *category;
@@ -160,6 +166,7 @@ static void
160shutdown_task (void *cls, 166shutdown_task (void *cls,
161 const struct GNUNET_SCHEDULER_TaskContext *tc) 167 const struct GNUNET_SCHEDULER_TaskContext *tc)
162{ 168{
169 GNUNET_SCHEDULER_shutdown();
163} 170}
164 171
165 172
@@ -221,25 +228,30 @@ static struct SensorInfo *
221load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectionname) 228load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectionname)
222{ 229{
223 struct SensorInfo *sensor; 230 struct SensorInfo *sensor;
224 char *versionstr; 231 char *version_str;
232 char *starttime_str;
233 char *endtime_str;
234 unsigned long long interval_sec;
235 struct GNUNET_TIME_Relative interval;
225 236
226 sensor = GNUNET_new(struct SensorInfo); 237 sensor = GNUNET_new(struct SensorInfo);
227 //name 238 //name
228 sensor->name = GNUNET_strdup(sectionname); 239 sensor->name = GNUNET_strdup(sectionname);
229 //version 240 //version
230 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "VERSION", &versionstr) || 241 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "VERSION", &version_str))
231 NULL == versionstr)
232 { 242 {
233 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor version\n")); 243 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor version\n"));
234 GNUNET_free(sensor); 244 GNUNET_free(sensor);
235 return NULL; 245 return NULL;
236 } 246 }
237 if(GNUNET_OK != version_parse(versionstr, &(sensor->version_major), &(sensor->version_minor))) 247 if(GNUNET_OK != version_parse(version_str, &(sensor->version_major), &(sensor->version_minor)))
238 { 248 {
239 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Invalid sensor version number, format should be major.minor\n")); 249 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Invalid sensor version number, format should be major.minor\n"));
240 GNUNET_free(sensor); 250 GNUNET_free(sensor);
251 GNUNET_free(version_str);
241 return NULL; 252 return NULL;
242 } 253 }
254 GNUNET_free(version_str);
243 //description 255 //description
244 GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "DESCRIPTION", &sensor->description); 256 GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "DESCRIPTION", &sensor->description);
245 //category 257 //category
@@ -250,6 +262,37 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
250 GNUNET_free(sensor); 262 GNUNET_free(sensor);
251 return NULL; 263 return NULL;
252 } 264 }
265 //enabled
266 if(GNUNET_NO == GNUNET_CONFIGURATION_get_value_yesno(cfg, sectionname, "ENABLED"))
267 sensor->enabled = GNUNET_NO;
268 else
269 sensor->enabled = GNUNET_YES;
270 //start time
271 sensor->start_time = NULL;
272 if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "START_TIME", &starttime_str))
273 {
274 GNUNET_STRINGS_fancy_time_to_absolute(starttime_str, sensor->start_time);
275 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Start time loaded: `%s'. Parsed: %d\n", starttime_str, (NULL != sensor->start_time));
276 GNUNET_free(starttime_str);
277 }
278 //end time
279 sensor->end_time = NULL;
280 if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "END_TIME", &endtime_str))
281 {
282 GNUNET_STRINGS_fancy_time_to_absolute(endtime_str, sensor->end_time);
283 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "End time loaded: `%s'. Parsed: %d\n", endtime_str, (NULL != sensor->end_time));
284 GNUNET_free(endtime_str);
285 }
286 //interval
287 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "INTERVAL", &interval_sec))
288 {
289 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor run interval\n"));
290 GNUNET_free(sensor);
291 return NULL;
292 }
293 interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, interval_sec);
294 sensor->interval = &interval;
295 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Interval loaded: %" PRIu64 "\n", sensor->interval->rel_value_us);
253 296
254 return sensor; 297 return sensor;
255} 298}
@@ -332,6 +375,7 @@ add_sensor_to_hashmap(struct SensorInfo *sensor, struct GNUNET_CONTAINER_MultiHa
332 else 375 else
333 { 376 {
334 GNUNET_CONTAINER_multihashmap_remove(map, &key, existing); //remove the old version 377 GNUNET_CONTAINER_multihashmap_remove(map, &key, existing); //remove the old version
378 GNUNET_free(existing);
335 GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Upgrading sensor `%s' to a newer version\n"), sensor->name); 379 GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Upgrading sensor `%s' to a newer version\n"), sensor->name);
336 } 380 }
337 } 381 }
@@ -536,6 +580,86 @@ handle_get_all_sensors (void *cls, struct GNUNET_SERVER_Client *client,
536} 580}
537 581
538/** 582/**
583 * Do a series of checks to determine if sensor should execute
584 *
585 * @return #GNUNET_YES / #GNUNET_NO
586 */
587static int
588should_run_sensor(struct SensorInfo *sensorinfo)
589{
590 struct GNUNET_TIME_Absolute now;
591
592 if(GNUNET_NO == sensorinfo->enabled)
593 {
594 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Sensor `%s' is disabled, will not run\n");
595 return GNUNET_NO;
596 }
597 now = GNUNET_TIME_absolute_get();
598 if(NULL != sensorinfo->start_time
599 && now.abs_value_us < sensorinfo->start_time->abs_value_us)
600 {
601 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Start time for sensor `%s' not reached yet, will not run\n");
602 return GNUNET_NO;
603 }
604 if(NULL != sensorinfo->end_time
605 && now.abs_value_us >= sensorinfo->end_time->abs_value_us)
606 {
607 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "End time for sensor `%s' passed, will not run\n");
608 return GNUNET_NO;
609 }
610 return GNUNET_YES;
611}
612
613/**
614 * Actual execution of a sensor
615 *
616 * @param cls 'struct SensorInfo'
617 * @param tc unsed
618 */
619void
620run_sensor (void *cls,
621 const struct GNUNET_SCHEDULER_TaskContext * tc)
622{
623 struct SensorInfo *sensorinfo = cls;
624
625 if(GNUNET_NO == should_run_sensor(sensorinfo))
626 return;
627 //GNUNET_SCHEDULER_add_delayed(*sensorinfo->interval, &run_sensor, sensorinfo);
628 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Starting the execution of sensor `%s'\n", sensorinfo->name);
629}
630
631/**
632 * Starts the execution of a sensor
633 *
634 * @param cls unused
635 * @param key hash of sensor name, key to hashmap
636 * @param value a 'struct SensorInfo *'
637 * @return #GNUNET_YES if we should continue to
638 * iterate,
639 * #GNUNET_NO if not.
640 */
641int schedule_sensor(void *cls,
642 const struct GNUNET_HashCode *key, void *value)
643{
644 struct SensorInfo *sensorinfo = value;
645
646 if(GNUNET_NO == should_run_sensor(sensorinfo))
647 return GNUNET_YES;
648 GNUNET_SCHEDULER_add_delayed(*sensorinfo->interval, &run_sensor, sensorinfo);
649 return GNUNET_YES;
650}
651
652/**
653 * Starts the execution of all enabled sensors
654 *
655 */
656static void
657schedule_all_sensors()
658{
659 GNUNET_CONTAINER_multihashmap_iterate(sensors, &schedule_sensor, NULL);
660}
661
662/**
539 * Process statistics requests. 663 * Process statistics requests.
540 * 664 *
541 * @param cls closure 665 * @param cls closure
@@ -558,6 +682,7 @@ run (void *cls,
558 cfg = c; 682 cfg = c;
559 sensors = GNUNET_CONTAINER_multihashmap_create(10, GNUNET_NO); 683 sensors = GNUNET_CONTAINER_multihashmap_create(10, GNUNET_NO);
560 reload_sensors(); 684 reload_sensors();
685 schedule_all_sensors();
561 GNUNET_SERVER_add_handlers (server, handlers); 686 GNUNET_SERVER_add_handlers (server, handlers);
562 GNUNET_SERVER_disconnect_notify (server, 687 GNUNET_SERVER_disconnect_notify (server,
563 &handle_client_disconnect, 688 &handle_client_disconnect,
diff --git a/src/sensor/sensors/averagepingrtt b/src/sensor/sensors/averagepingrtt
index 83e66c6e3..b7e714912 100644
--- a/src/sensor/sensors/averagepingrtt
+++ b/src/sensor/sensors/averagepingrtt
@@ -3,10 +3,12 @@
3VERSION = 1.0 3VERSION = 1.0
4DESCRIPTION = Calculate average ping latency to gnunet.org 4DESCRIPTION = Calculate average ping latency to gnunet.org
5CATEGORY = Internet-Connectivity 5CATEGORY = Internet-Connectivity
6ENABLED = YES
6 7
7# Start and end time format: %Y-%m-%d %H:%M:%S 8# Start and end time format: %Y-%m-%d %H:%M:%S
8#START_TIME = 9#START_TIME =
9#END_TIME = 10#END_TIME =
11#Interval in seconds
10INTERVAL = 3600 12INTERVAL = 3600
11#LIFETIME = 13#LIFETIME =
12 14
diff --git a/src/sensor/sensors/connectedpeers b/src/sensor/sensors/connectedpeers
index 5c3c4bb01..1b4e6a986 100644
--- a/src/sensor/sensors/connectedpeers
+++ b/src/sensor/sensors/connectedpeers
@@ -3,10 +3,12 @@
3VERSION = 1.0 3VERSION = 1.0
4DESCRIPTION = Gets the number of connected peers from core 4DESCRIPTION = Gets the number of connected peers from core
5CATEGORY = P2P-Connectivity 5CATEGORY = P2P-Connectivity
6ENABLED = NO
6 7
7# Start and end time format: %Y-%m-%d %H:%M:%S 8# Start and end time format: %Y-%m-%d %H:%M:%S
8#START_TIME = 9#START_TIME =
9#END_TIME = 10#END_TIME =
11#Interval in seconds
10INTERVAL = 60 12INTERVAL = 60
11#LIFETIME = 13#LIFETIME =
12 14
diff --git a/src/sensor/sensors/gnunetversion b/src/sensor/sensors/gnunetversion
index 0a8aff48c..7aee046e3 100644
--- a/src/sensor/sensors/gnunetversion
+++ b/src/sensor/sensors/gnunetversion
@@ -3,10 +3,12 @@
3VERSION = 1.0 3VERSION = 1.0
4DESCRIPTION = Gets gnunet version number 4DESCRIPTION = Gets gnunet version number
5CATEGORY = P2P-Software 5CATEGORY = P2P-Software
6ENABLED = YES
6 7
7# Start and end time format: %Y-%m-%d %H:%M:%S 8# Start and end time format: %Y-%m-%d %H:%M:%S
8#START_TIME = 9#START_TIME =
9#END_TIME = 10#END_TIME =
11#Interval in seconds
10INTERVAL = 86400 12INTERVAL = 86400
11#LIFETIME = 13#LIFETIME =
12 14