diff options
Diffstat (limited to 'src/sensor')
-rw-r--r-- | src/sensor/gnunet-service-sensor-update.c | 135 | ||||
-rw-r--r-- | src/sensor/gnunet-service-sensor.c | 61 | ||||
-rw-r--r-- | src/sensor/sensor.h | 4 |
3 files changed, 172 insertions, 28 deletions
diff --git a/src/sensor/gnunet-service-sensor-update.c b/src/sensor/gnunet-service-sensor-update.c index 4cbe26b5b..354cd52c7 100644 --- a/src/sensor/gnunet-service-sensor-update.c +++ b/src/sensor/gnunet-service-sensor-update.c | |||
@@ -160,6 +160,16 @@ static struct GNUNET_CADET_Handle *cadet; | |||
160 | */ | 160 | */ |
161 | static int updating; | 161 | static int updating; |
162 | 162 | ||
163 | /** | ||
164 | * GNUnet scheduler task that starts the update check process. | ||
165 | */ | ||
166 | GNUNET_SCHEDULER_TaskIdentifier update_task; | ||
167 | |||
168 | /** | ||
169 | * Pointer to service reset function called when we have new sensor updates. | ||
170 | */ | ||
171 | void (*reset_cb)(); | ||
172 | |||
163 | 173 | ||
164 | /** | 174 | /** |
165 | * Contact update points to check for new updates | 175 | * Contact update points to check for new updates |
@@ -222,6 +232,11 @@ SENSOR_update_stop () | |||
222 | 232 | ||
223 | up_default = NULL; | 233 | up_default = NULL; |
224 | up = up_head; | 234 | up = up_head; |
235 | if (GNUNET_SCHEDULER_NO_TASK != update_task) | ||
236 | { | ||
237 | GNUNET_SCHEDULER_cancel (update_task); | ||
238 | update_task = GNUNET_SCHEDULER_NO_TASK; | ||
239 | } | ||
225 | while (NULL != up) | 240 | while (NULL != up) |
226 | { | 241 | { |
227 | GNUNET_CONTAINER_DLL_remove (up_head, up_tail, up); | 242 | GNUNET_CONTAINER_DLL_remove (up_head, up_tail, up); |
@@ -262,15 +277,15 @@ fail () | |||
262 | up->failed = GNUNET_NO; | 277 | up->failed = GNUNET_NO; |
263 | up = up->next; | 278 | up = up->next; |
264 | } | 279 | } |
265 | GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_INTERVAL, | 280 | update_task = GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_INTERVAL, |
266 | &check_for_updates, NULL); | 281 | &check_for_updates, NULL); |
267 | return; | 282 | return; |
268 | } | 283 | } |
269 | LOG (GNUNET_ERROR_TYPE_WARNING, | 284 | LOG (GNUNET_ERROR_TYPE_WARNING, |
270 | "Update point `%s' failed, trying next one now.\n", | 285 | "Update point `%s' failed, trying next one now.\n", |
271 | GNUNET_i2s (&up_default->peer_id)); | 286 | GNUNET_i2s (&up_default->peer_id)); |
272 | up_default = up_default->next; | 287 | up_default = up_default->next; |
273 | GNUNET_SCHEDULER_add_now (&check_for_updates, NULL); | 288 | update_task = GNUNET_SCHEDULER_add_now (&check_for_updates, NULL); |
274 | } | 289 | } |
275 | 290 | ||
276 | 291 | ||
@@ -368,6 +383,7 @@ check_for_updates (void *cls, | |||
368 | struct GNUNET_MessageHeader *msg; | 383 | struct GNUNET_MessageHeader *msg; |
369 | size_t msg_size; | 384 | size_t msg_size; |
370 | 385 | ||
386 | update_task = GNUNET_SCHEDULER_NO_TASK; | ||
371 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) | 387 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) |
372 | return; | 388 | return; |
373 | if (GNUNET_YES == updating) | 389 | if (GNUNET_YES == updating) |
@@ -377,8 +393,8 @@ check_for_updates (void *cls, | |||
377 | "Retrying in %s.\n", | 393 | "Retrying in %s.\n", |
378 | GNUNET_STRINGS_relative_time_to_string (SENSOR_UPDATE_CHECK_RETRY, | 394 | GNUNET_STRINGS_relative_time_to_string (SENSOR_UPDATE_CHECK_RETRY, |
379 | GNUNET_NO)); | 395 | GNUNET_NO)); |
380 | GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_RETRY, | 396 | update_task = GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_RETRY, |
381 | &check_for_updates, NULL); | 397 | &check_for_updates, NULL); |
382 | return; | 398 | return; |
383 | } | 399 | } |
384 | updating = GNUNET_YES; | 400 | updating = GNUNET_YES; |
@@ -406,8 +422,8 @@ check_for_updates (void *cls, | |||
406 | msg->size = htons (msg_size); | 422 | msg->size = htons (msg_size); |
407 | msg->type = htons (GNUNET_MESSAGE_TYPE_SENSOR_LIST_REQ); | 423 | msg->type = htons (GNUNET_MESSAGE_TYPE_SENSOR_LIST_REQ); |
408 | queue_msg (msg); | 424 | queue_msg (msg); |
409 | GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_INTERVAL, | 425 | update_task = GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_INTERVAL, |
410 | &check_for_updates, NULL); | 426 | &check_for_updates, NULL); |
411 | } | 427 | } |
412 | 428 | ||
413 | 429 | ||
@@ -539,6 +555,9 @@ handle_sensor_brief (void *cls, | |||
539 | } | 555 | } |
540 | if (GNUNET_MESSAGE_TYPE_SENSOR_END == ntohs (message->type)) | 556 | if (GNUNET_MESSAGE_TYPE_SENSOR_END == ntohs (message->type)) |
541 | { | 557 | { |
558 | LOG (GNUNET_ERROR_TYPE_DEBUG, | ||
559 | "Received end of sensor list msg. We already requested %d updates.\n", | ||
560 | up_default->expected_sensor_updates); | ||
542 | up_default->expecting_sensor_list = GNUNET_NO; | 561 | up_default->expecting_sensor_list = GNUNET_NO; |
543 | if (0 == up_default->expected_sensor_updates) | 562 | if (0 == up_default->expected_sensor_updates) |
544 | { | 563 | { |
@@ -575,6 +594,64 @@ handle_sensor_brief (void *cls, | |||
575 | 594 | ||
576 | 595 | ||
577 | /** | 596 | /** |
597 | * Update local sensor definitions with a sensor retrieved from an update point. | ||
598 | * | ||
599 | * @param sensorname Sensor name | ||
600 | * @param sensorfile Buffer containing the sensor definition file | ||
601 | * @param sensorfile_size Size of @e sensorfile | ||
602 | * @param scriptname Name of associated script file, NULL if no script | ||
603 | * @param scriptfile Buffer containing the script file, NULL if no script | ||
604 | * @param scriptfile_size Size of @e scriptfile, 0 if no script | ||
605 | * @return #GNUNET_OK on success, #GNUNET_SYSERR on error | ||
606 | */ | ||
607 | static int | ||
608 | update_sensor (char *sensorname, | ||
609 | void *sensorfile, uint16_t sensorfile_size, | ||
610 | char *scriptname, | ||
611 | void *scriptfile, uint16_t scriptfile_size) | ||
612 | { | ||
613 | char *sensors_dir; | ||
614 | char *sensor_path; | ||
615 | char *script_path; | ||
616 | |||
617 | LOG (GNUNET_ERROR_TYPE_INFO, | ||
618 | "Received new sensor information:\n" | ||
619 | "Name: %s\n" | ||
620 | "Sensor file size: %d\n" | ||
621 | "Script name: %s\n" | ||
622 | "Script file size: %d.\n", | ||
623 | sensorname, | ||
624 | sensorfile_size, | ||
625 | (NULL == scriptname) ? "None" : scriptname, | ||
626 | scriptfile_size); | ||
627 | sensors_dir = GNUNET_SENSOR_get_sensor_dir (); | ||
628 | GNUNET_asprintf (&sensor_path, "%s%s", sensors_dir, sensorname); | ||
629 | GNUNET_DISK_fn_write (sensor_path, sensorfile, sensorfile_size, | ||
630 | GNUNET_DISK_PERM_USER_READ | | ||
631 | GNUNET_DISK_PERM_GROUP_READ | | ||
632 | GNUNET_DISK_PERM_OTHER_READ | | ||
633 | GNUNET_DISK_PERM_USER_WRITE); | ||
634 | if (NULL != scriptname) | ||
635 | { | ||
636 | GNUNET_asprintf (&script_path, | ||
637 | "%s-files%s%s", | ||
638 | sensor_path, | ||
639 | DIR_SEPARATOR_STR, | ||
640 | scriptname); | ||
641 | GNUNET_DISK_fn_write (script_path, scriptfile, scriptfile_size, | ||
642 | GNUNET_DISK_PERM_USER_READ | | ||
643 | GNUNET_DISK_PERM_GROUP_READ | | ||
644 | GNUNET_DISK_PERM_OTHER_READ | | ||
645 | GNUNET_DISK_PERM_USER_WRITE | | ||
646 | GNUNET_DISK_PERM_GROUP_WRITE | | ||
647 | GNUNET_DISK_PERM_USER_EXEC | | ||
648 | GNUNET_DISK_PERM_GROUP_EXEC); | ||
649 | } | ||
650 | return GNUNET_OK; | ||
651 | } | ||
652 | |||
653 | |||
654 | /** | ||
578 | * Handler of a sensor list message received from an update point. | 655 | * Handler of a sensor list message received from an update point. |
579 | * | 656 | * |
580 | * @param cls Closure (unused). | 657 | * @param cls Closure (unused). |
@@ -592,6 +669,12 @@ handle_sensor_full (void *cls, | |||
592 | { | 669 | { |
593 | struct GNUNET_SENSOR_SensorFullMessage *sfm; | 670 | struct GNUNET_SENSOR_SensorFullMessage *sfm; |
594 | uint16_t msg_size; | 671 | uint16_t msg_size; |
672 | uint16_t sensorfile_size; | ||
673 | uint16_t scriptfile_size; | ||
674 | char *sensorname_ptr; | ||
675 | void *sensorfile_ptr; | ||
676 | char *scriptname_ptr; | ||
677 | void *scriptfile_ptr; | ||
595 | 678 | ||
596 | /* error check */ | 679 | /* error check */ |
597 | GNUNET_assert (*channel_ctx == up_default); | 680 | GNUNET_assert (*channel_ctx == up_default); |
@@ -605,20 +688,32 @@ handle_sensor_full (void *cls, | |||
605 | } | 688 | } |
606 | /* parse received msg */ | 689 | /* parse received msg */ |
607 | sfm = (struct GNUNET_SENSOR_SensorFullMessage *)message; | 690 | sfm = (struct GNUNET_SENSOR_SensorFullMessage *)message; |
608 | LOG (GNUNET_ERROR_TYPE_INFO, | 691 | sensorname_ptr = (char *)&sfm[1]; |
609 | "Received full sensor info:\n" | 692 | sensorfile_ptr = sensorname_ptr + ntohs (sfm->sensorname_size); |
610 | "File size: %d\n" | 693 | sensorfile_size = ntohs (sfm->sensorfile_size); |
611 | "Script name size: %d\n" | 694 | scriptfile_size = ntohs (sfm->scriptfile_size); |
612 | "Script size: %d.\n", | 695 | if (scriptfile_size > 0) |
613 | ntohs (sfm->cfg_size), | 696 | { |
614 | ntohs (sfm->scriptname_size), | 697 | scriptname_ptr = sensorfile_ptr + sensorfile_size; |
615 | ntohs (sfm->script_size)); | 698 | scriptfile_ptr = scriptname_ptr + ntohs (sfm->scriptname_size); |
616 | //TODO: do the actual update | 699 | } |
700 | else | ||
701 | { | ||
702 | scriptname_ptr = NULL; | ||
703 | scriptfile_ptr = NULL; | ||
704 | } | ||
705 | update_sensor ((char *)&sfm[1], | ||
706 | sensorfile_ptr, | ||
707 | sensorfile_size, | ||
708 | scriptname_ptr, | ||
709 | scriptfile_ptr, | ||
710 | scriptfile_size); | ||
617 | up_default->expected_sensor_updates --; | 711 | up_default->expected_sensor_updates --; |
618 | if (0 == up_default->expected_sensor_updates) | 712 | if (0 == up_default->expected_sensor_updates) |
619 | { | 713 | { |
620 | updating = GNUNET_NO; | 714 | updating = GNUNET_NO; |
621 | cleanup_updatepoint (up_default); | 715 | cleanup_updatepoint (up_default); |
716 | reset_cb (); | ||
622 | } | 717 | } |
623 | else | 718 | else |
624 | GNUNET_CADET_receive_done (channel); | 719 | GNUNET_CADET_receive_done (channel); |
@@ -659,11 +754,13 @@ cadet_channel_destroyed (void *cls, | |||
659 | * | 754 | * |
660 | * @param c our service configuration | 755 | * @param c our service configuration |
661 | * @param sensors multihashmap of loaded sensors | 756 | * @param sensors multihashmap of loaded sensors |
757 | * @param cb callback to reset service components when we have new updates | ||
662 | * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise | 758 | * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise |
663 | */ | 759 | */ |
664 | int | 760 | int |
665 | SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, | 761 | SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, |
666 | struct GNUNET_CONTAINER_MultiHashMap *s) | 762 | struct GNUNET_CONTAINER_MultiHashMap *s, |
763 | void (*cb)()) | ||
667 | { | 764 | { |
668 | static struct GNUNET_CADET_MessageHandler cadet_handlers[] = { | 765 | static struct GNUNET_CADET_MessageHandler cadet_handlers[] = { |
669 | {&handle_sensor_brief, GNUNET_MESSAGE_TYPE_SENSOR_BRIEF, 0}, | 766 | {&handle_sensor_brief, GNUNET_MESSAGE_TYPE_SENSOR_BRIEF, 0}, |
@@ -675,6 +772,7 @@ SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, | |||
675 | GNUNET_assert(NULL != s); | 772 | GNUNET_assert(NULL != s); |
676 | cfg = c; | 773 | cfg = c; |
677 | sensors = s; | 774 | sensors = s; |
775 | reset_cb = cb; | ||
678 | cadet = GNUNET_CADET_connect(cfg, | 776 | cadet = GNUNET_CADET_connect(cfg, |
679 | NULL, | 777 | NULL, |
680 | NULL, | 778 | NULL, |
@@ -696,7 +794,8 @@ SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, | |||
696 | } | 794 | } |
697 | up_default = up_head; | 795 | up_default = up_head; |
698 | updating = GNUNET_NO; | 796 | updating = GNUNET_NO; |
699 | GNUNET_SCHEDULER_add_now (&check_for_updates, NULL); | 797 | update_task = GNUNET_SCHEDULER_add_delayed (SENSOR_UPDATE_CHECK_INTERVAL, |
798 | &check_for_updates, NULL); | ||
700 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 799 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
701 | "Sensor update module started.\n"); | 800 | "Sensor update module started.\n"); |
702 | return GNUNET_OK; | 801 | return GNUNET_OK; |
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c index e476db50c..4f2942fec 100644 --- a/src/sensor/gnunet-service-sensor.c +++ b/src/sensor/gnunet-service-sensor.c | |||
@@ -60,6 +60,15 @@ char *subsystem = "sensor"; | |||
60 | */ | 60 | */ |
61 | struct GNUNET_PeerIdentity peerid; | 61 | struct GNUNET_PeerIdentity peerid; |
62 | 62 | ||
63 | |||
64 | /** | ||
65 | * Resets the service by stopping components, reloading sensors and starting | ||
66 | * components. This is needed when we receive new sensor updates. | ||
67 | */ | ||
68 | static void | ||
69 | reset (); | ||
70 | |||
71 | |||
63 | /** | 72 | /** |
64 | * Change the state of the sensor. | 73 | * Change the state of the sensor. |
65 | * Write the change to file to make it persistent. | 74 | * Write the change to file to make it persistent. |
@@ -82,6 +91,20 @@ set_sensor_enabled (struct GNUNET_SENSOR_SensorInfo *sensor, int state) | |||
82 | GNUNET_CONFIGURATION_write (sensor->cfg, sensor->def_file); | 91 | GNUNET_CONFIGURATION_write (sensor->cfg, sensor->def_file); |
83 | } | 92 | } |
84 | 93 | ||
94 | |||
95 | /** | ||
96 | * Stops components and destroys sensors | ||
97 | */ | ||
98 | static void | ||
99 | stop () | ||
100 | { | ||
101 | SENSOR_update_stop (); | ||
102 | SENSOR_reporting_stop (); | ||
103 | SENSOR_analysis_stop (); | ||
104 | GNUNET_SENSOR_destroy_sensors (sensors); | ||
105 | } | ||
106 | |||
107 | |||
85 | /** | 108 | /** |
86 | * Task run during shutdown. | 109 | * Task run during shutdown. |
87 | * | 110 | * |
@@ -92,10 +115,7 @@ static void | |||
92 | shutdown_task (void *cls, | 115 | shutdown_task (void *cls, |
93 | const struct GNUNET_SCHEDULER_TaskContext *tc) | 116 | const struct GNUNET_SCHEDULER_TaskContext *tc) |
94 | { | 117 | { |
95 | SENSOR_update_stop (); | 118 | stop (); |
96 | SENSOR_reporting_stop (); | ||
97 | SENSOR_analysis_stop (); | ||
98 | GNUNET_SENSOR_destroy_sensors (sensors); | ||
99 | if (NULL != statistics) | 119 | if (NULL != statistics) |
100 | { | 120 | { |
101 | GNUNET_STATISTICS_destroy (statistics, GNUNET_YES); | 121 | GNUNET_STATISTICS_destroy (statistics, GNUNET_YES); |
@@ -575,6 +595,21 @@ schedule_all_sensors() | |||
575 | GNUNET_CONTAINER_multihashmap_iterate(sensors, &schedule_sensor, NULL); | 595 | GNUNET_CONTAINER_multihashmap_iterate(sensors, &schedule_sensor, NULL); |
576 | } | 596 | } |
577 | 597 | ||
598 | |||
599 | /** | ||
600 | * Loads sensors and starts different service components | ||
601 | */ | ||
602 | static void | ||
603 | start () | ||
604 | { | ||
605 | sensors = GNUNET_SENSOR_load_all_sensors (); | ||
606 | schedule_all_sensors(); | ||
607 | SENSOR_analysis_start(cfg, sensors); | ||
608 | SENSOR_reporting_start(cfg, sensors); | ||
609 | SENSOR_update_start (cfg, sensors, &reset); | ||
610 | } | ||
611 | |||
612 | |||
578 | /** | 613 | /** |
579 | * Process statistics requests. | 614 | * Process statistics requests. |
580 | * | 615 | * |
@@ -596,11 +631,6 @@ run (void *cls, | |||
596 | }; | 631 | }; |
597 | 632 | ||
598 | cfg = c; | 633 | cfg = c; |
599 | sensors = GNUNET_SENSOR_load_all_sensors (); | ||
600 | schedule_all_sensors(); | ||
601 | SENSOR_analysis_start(c, sensors); | ||
602 | SENSOR_reporting_start(c, sensors); | ||
603 | SENSOR_update_start (c, sensors); | ||
604 | statistics = GNUNET_STATISTICS_create("sensor", cfg); | 634 | statistics = GNUNET_STATISTICS_create("sensor", cfg); |
605 | GNUNET_CRYPTO_get_peer_identity(cfg, &peerid); | 635 | GNUNET_CRYPTO_get_peer_identity(cfg, &peerid); |
606 | peerstore = GNUNET_PEERSTORE_connect(cfg); | 636 | peerstore = GNUNET_PEERSTORE_connect(cfg); |
@@ -611,6 +641,19 @@ run (void *cls, | |||
611 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, | 641 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, |
612 | &shutdown_task, | 642 | &shutdown_task, |
613 | NULL); | 643 | NULL); |
644 | start (); | ||
645 | } | ||
646 | |||
647 | |||
648 | /** | ||
649 | * Resets the service by stopping components, reloading sensors and starting | ||
650 | * components. This is needed when we receive new sensor updates. | ||
651 | */ | ||
652 | static void | ||
653 | reset () | ||
654 | { | ||
655 | stop (); | ||
656 | start (); | ||
614 | } | 657 | } |
615 | 658 | ||
616 | 659 | ||
diff --git a/src/sensor/sensor.h b/src/sensor/sensor.h index 044adac69..cf36c7d86 100644 --- a/src/sensor/sensor.h +++ b/src/sensor/sensor.h | |||
@@ -106,9 +106,11 @@ SENSOR_update_stop (); | |||
106 | * | 106 | * |
107 | * @param c our service configuration | 107 | * @param c our service configuration |
108 | * @param sensors multihashmap of loaded sensors | 108 | * @param sensors multihashmap of loaded sensors |
109 | * @param reset_cb callback to reset service components when we have new updates | ||
109 | * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise | 110 | * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise |
110 | */ | 111 | */ |
111 | int | 112 | int |
112 | SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, | 113 | SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, |
113 | struct GNUNET_CONTAINER_MultiHashMap *sensors); | 114 | struct GNUNET_CONTAINER_MultiHashMap *s, |
115 | void (*reset_cb)()); | ||
114 | 116 | ||