aboutsummaryrefslogtreecommitdiff
path: root/src/sensor
diff options
context:
space:
mode:
Diffstat (limited to 'src/sensor')
-rw-r--r--src/sensor/gnunet-service-sensor-update.c135
-rw-r--r--src/sensor/gnunet-service-sensor.c61
-rw-r--r--src/sensor/sensor.h4
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 */
161static int updating; 161static int updating;
162 162
163/**
164 * GNUnet scheduler task that starts the update check process.
165 */
166GNUNET_SCHEDULER_TaskIdentifier update_task;
167
168/**
169 * Pointer to service reset function called when we have new sensor updates.
170 */
171void (*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 */
607static int
608update_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 */
664int 760int
665SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, 761SENSOR_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 */
61struct GNUNET_PeerIdentity peerid; 61struct 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 */
68static void
69reset ();
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 */
98static void
99stop ()
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
92shutdown_task (void *cls, 115shutdown_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 */
602static void
603start ()
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 */
652static void
653reset ()
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 */
111int 112int
112SENSOR_update_start (const struct GNUNET_CONFIGURATION_Handle *c, 113SENSOR_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