GNUnet 0.22.2
gnunet-statistics.c File Reference

tool to obtain statistics More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_statistics_service.h"
Include dependency graph for gnunet-statistics.c:

Go to the source code of this file.

Data Structures

struct  Node
 Representation of all (testbed) nodes. More...
 
struct  ValueSet
 Set of values for a combination of subsystem and name. More...
 

Functions

static struct ValueSetnew_value_set (const char *subsys, const char *new_name, unsigned num_values, int is_persistent)
 Create a new ValueSet. More...
 
static int printer (void *cls, const struct GNUNET_HashCode *key, void *value)
 Print the (collected) values. More...
 
static int printer_watch (void *cls, const char *subsys, const char *print_name, uint64_t value, int is_persistent)
 Callback function to process statistic values. More...
 
static void clean_node (void *cls)
 Clean all data structures related to given node. More...
 
static void print_finish (void *cls)
 Print and shutdown. More...
 
static void continuation_print (void *cls, int success)
 Called once all statistic values are available. More...
 
static void cleanup (void *cls, int success)
 Function called last by the statistics code. More...
 
static int collector (void *cls, const char *subsys, const char *coll_name, uint64_t value, int is_persistent)
 Iterate over statistics values and store them in values. More...
 
static void main_task (void *cls)
 Main task that does the actual work. More...
 
static int iter_check_config (void *cls, const char *filename)
 Iter over content of a node's directory to check for existence of a config file. More...
 
static int iter_testbed_path (void *cls, const char *filename)
 Iterates over filenames in testbed directory. More...
 
static int discover_testbed_nodes (const char *path_testbed_discovered)
 Count the number of nodes running in the testbed. More...
 
static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Main function that will be run by the scheduler. More...
 
int main (int argc, char *const *argv)
 The main function to obtain statistics in GNUnet. More...
 

Variables

static int ret
 Final status code. More...
 
static char * subsystem
 Set to subsystem that we're going to get stats for (or NULL for all). More...
 
static char * path_testbed
 The path of the testbed data. More...
 
static char * name
 Set to the specific stat value that we are after (or NULL for all). More...
 
static int persistent
 Make the value that is being set persistent. More...
 
static int watch
 Watch value continuously. More...
 
static int quiet
 Quiet mode. More...
 
static char * csv_separator_opt
 Separator string for csv. More...
 
static const char * csv_separator
 Separator string for csv. More...
 
static char * remote_host
 Remote host. More...
 
static unsigned long long remote_port
 Remote host's port. More...
 
static unsigned long long set_val
 Value to set. More...
 
static int set_value
 Set operation. More...
 
static struct Nodenodes
 
static unsigned num_nodes
 Number of configurations of all (testbed) nodes. More...
 
static struct GNUNET_CONTAINER_MultiHashMapvalues
 Collection of all values (represented with ValueSet). More...
 
static int num_nodes_ready
 Number of nodes that have their values ready. More...
 
static int num_nodes_ready_shutdown
 Number of nodes that have their values ready. More...
 

Detailed Description

tool to obtain statistics

Author
Christian Grothoff
Igor Wronsky

Definition in file gnunet-statistics.c.

Function Documentation

◆ new_value_set()

static struct ValueSet * new_value_set ( const char *  subsys,
const char *  new_name,
unsigned  num_values,
int  is_persistent 
)
static

Create a new ValueSet.

Parameters
subsystemSubsystem of the valueset.
nameName of the valueset.
num_valuesNumber of values in valueset - number of peers.
is_persistentPersistence status of values.
Returns
Newly allocated ValueSet.

Definition at line 185 of file gnunet-statistics.c.

189{
190 struct ValueSet *value_set;
191
192 value_set = GNUNET_new (struct ValueSet);
193 value_set->subsystem = GNUNET_strdup (subsys);
194 value_set->name = GNUNET_strdup (new_name);
195 value_set->values = GNUNET_new_array (num_values,
196 uint64_t);
197 value_set->is_persistent = persistent;
198 return value_set;
199}
static int persistent
Make the value that is being set persistent.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
Set of values for a combination of subsystem and name.
char * name
Name of the valueset.
int is_persistent
Persistence of the values.
char * subsystem
Subsystem of the valueset.
uint64_t * values
The values.

References GNUNET_new, GNUNET_new_array, GNUNET_strdup, ValueSet::is_persistent, ValueSet::name, persistent, ValueSet::subsystem, and ValueSet::values.

Referenced by collector().

Here is the caller graph for this function:

◆ printer()

static int printer ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Print the (collected) values.

Implements #GNUNET_CONTAINER_HashMapIterator.

Parameters
clsClosure - unused
keyGNUNET_HashCode key of GNUNET_CONTAINER_MultiHashMap iterator - unused
valueValues represented as ValueSet.
Returns
GNUNET_YES - continue iteration.

Definition at line 214 of file gnunet-statistics.c.

217{
219 const char *now_str;
220 struct ValueSet *value_set = value;
221
222 if (quiet == GNUNET_NO)
223 {
224 if (GNUNET_YES == watch)
225 {
227 fprintf (stdout,
228 "%24s%s %s%s%12s%s %s%50s%s%s ",
229 now_str,
231 value_set->is_persistent ? "!" : " ",
233 value_set->subsystem,
235 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
236 _ (value_set->name),
237 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
238 (0 == strlen (csv_separator) ? ":" : csv_separator));
239 }
240 else
241 {
242 fprintf (stdout,
243 "%s%s%12s%s %s%50s%s%s ",
244 value_set->is_persistent ? "!" : " ",
246 value_set->subsystem,
248 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
249 _ (value_set->name),
250 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
251 (0 == strlen (csv_separator) ? ":" : csv_separator));
252 }
253 }
254 for (unsigned i = 0; i < num_nodes; i++)
255 {
256 fprintf (stdout,
257 "%16llu%s",
258 (unsigned long long) value_set->values[i],
260 }
261 fprintf (stdout, "\n");
262 GNUNET_free (value_set->subsystem);
263 GNUNET_free (value_set->name);
264 GNUNET_free (value_set->values);
265 GNUNET_free (value_set);
266 return GNUNET_YES;
267}
static char * value
Value of the record to add/remove.
static int quiet
Quiet mode.
static const char * csv_separator
Separator string for csv.
static int watch
Watch value continuously.
static unsigned num_nodes
Number of configurations of all (testbed) nodes.
@ GNUNET_YES
@ GNUNET_NO
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:111
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:640
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
Time for absolute times used by GNUnet, in microseconds.

References _, csv_separator, GNUNET_free, GNUNET_NO, GNUNET_STRINGS_absolute_time_to_string(), GNUNET_TIME_absolute_get(), GNUNET_YES, ValueSet::is_persistent, ValueSet::name, num_nodes, quiet, ValueSet::subsystem, value, ValueSet::values, and watch.

Referenced by print_finish().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ printer_watch()

static int printer_watch ( void *  cls,
const char *  subsys,
const char *  print_name,
uint64_t  value,
int  is_persistent 
)
static

Callback function to process statistic values.

Parameters
clsclosure
subsystemname of subsystem that created the statistic
namethe name of the datum
valuethe current value
is_persistentGNUNET_YES if the value is persistent, GNUNET_NO if not
Returns
GNUNET_OK to continue, GNUNET_SYSERR to abort iteration

Definition at line 281 of file gnunet-statistics.c.

286{
288 const char *now_str;
289
290 if (quiet == GNUNET_NO)
291 {
292 if (GNUNET_YES == watch)
293 {
295 fprintf (stdout,
296 "%24s%s %s%s%12s%s %s%50s%s%s %16llu\n",
297 now_str,
299 is_persistent ? "!" : " ",
301 subsys,
303 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
304 _ (print_name),
305 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
306 (0 == strlen (csv_separator) ? ":" : csv_separator),
307 (unsigned long long) value);
308 }
309 else
310 {
311 fprintf (stdout,
312 "%s%s%12s%s %s%50s%s%s %16llu\n",
313 is_persistent ? "!" : " ",
315 subsys,
317 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
318 _ (print_name),
319 (0 == strlen (csv_separator) ? "" : "\""), /* quotes if csv */
320 (0 == strlen (csv_separator) ? ":" : csv_separator),
321 (unsigned long long) value);
322 }
323 }
324 else
325 fprintf (stdout, "%llu\n", (unsigned long long) value);
326
327 return GNUNET_OK;
328}
@ GNUNET_OK

References _, csv_separator, GNUNET_NO, GNUNET_OK, GNUNET_STRINGS_absolute_time_to_string(), GNUNET_TIME_absolute_get(), GNUNET_YES, quiet, value, and watch.

Referenced by clean_node(), and main_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clean_node()

static void clean_node ( void *  cls)
static

Clean all data structures related to given node.

Also clears global structures if we are the last node to clean.

Parameters
clsthe index of the node

Definition at line 339 of file gnunet-statistics.c.

340{
341 const unsigned index_node = *(unsigned *) cls;
344
345 if ((NULL != path_testbed) && /* were issued with -t <testbed-path> option */
346 (NULL != nodes[index_node].conf))
347 {
349 nodes[index_node].conf = NULL;
350 }
351
352 h = nodes[index_node].handle;
353 gh = nodes[index_node].gh;
354
355 if (NULL != gh)
356 {
358 gh = NULL;
359 }
360 if (GNUNET_YES == watch)
361 {
363 GNUNET_OK ==
365 subsystem,
366 name,
368 &nodes[index_node].index_node));
369 }
370
371 if (NULL != h)
372 {
374 h = NULL;
375 }
376
378}
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:98
static char * path_testbed
The path of the testbed data.
static char * name
Set to the specific stat value that we are after (or NULL for all).
static int printer_watch(void *cls, const char *subsys, const char *print_name, uint64_t value, int is_persistent)
Callback function to process statistic values.
static struct Node * nodes
static int num_nodes_ready_shutdown
Number of nodes that have their values ready.
static char * subsystem
Set to subsystem that we're going to get stats for (or NULL for all).
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
int GNUNET_STATISTICS_watch_cancel(struct GNUNET_STATISTICS_Handle *handle, const char *subsystem, const char *name, GNUNET_STATISTICS_Iterator proc, void *proc_cls)
Stop watching statistics from the peer.
void GNUNET_STATISTICS_get_cancel(struct GNUNET_STATISTICS_GetHandle *gh)
Cancel a GNUNET_STATISTICS_get request.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
Definition: conf.py:1
Linked list of things we still need to do.
Handle for the service.
struct GNUNET_STATISTICS_GetHandle * gh
Handle for pending GET operation.
struct GNUNET_STATISTICS_Handle * handle
Statistics handle nodes.
struct GNUNET_CONFIGURATION_Handle * conf
Configuration handle for this node.

References Node::conf, Node::gh, GNUNET_assert, GNUNET_CONFIGURATION_destroy(), GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_destroy(), GNUNET_STATISTICS_get_cancel(), GNUNET_STATISTICS_watch_cancel(), GNUNET_YES, h, Node::handle, name, nodes, num_nodes_ready_shutdown, path_testbed, printer_watch(), subsystem, and watch.

Referenced by continuation_print(), and main_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_finish()

static void print_finish ( void *  cls)
static

Print and shutdown.

Parameters
clsunused

Definition at line 387 of file gnunet-statistics.c.

388{
390 &printer,
391 NULL);
395}
static char * csv_separator_opt
Separator string for csv.
static struct GNUNET_CONTAINER_MultiHashMap * values
Collection of all values (represented with ValueSet).
static int printer(void *cls, const struct GNUNET_HashCode *key, void *value)
Print the (collected) values.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567

References csv_separator_opt, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_free, GNUNET_SCHEDULER_shutdown(), printer(), and values.

Referenced by continuation_print().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ continuation_print()

static void continuation_print ( void *  cls,
int  success 
)
static

Called once all statistic values are available.

Implements GNUNET_STATISTICS_Callback

Parameters
clsClosure - The index of the node.
successWhether statistics were obtained successfully.

Definition at line 407 of file gnunet-statistics.c.

409{
410 const unsigned index_node = *(unsigned *) cls;
411
412 nodes[index_node].gh = NULL;
413 if (GNUNET_OK != success)
414 {
415 if (NULL == remote_host)
416 fprintf (stderr,
417 "%s",
418 _ ("Failed to obtain statistics.\n"));
419 else
420 fprintf (stderr,
421 _ ("Failed to obtain statistics from host `%s:%llu'\n"),
424 ret = 1;
425 }
426 if (NULL != nodes[index_node].shutdown_task)
427 {
429 nodes[index_node].shutdown_task = NULL;
430 }
432 &nodes[index_node].index_node);
435 {
437 NULL);
438 }
439}
struct GNUNET_SCHEDULER_Task * shutdown_task
static void print_finish(void *cls)
Print and shutdown.
static int ret
Final status code.
static int num_nodes_ready
Number of nodes that have their values ready.
static void clean_node(void *cls)
Clean all data structures related to given node.
static char * remote_host
Remote host.
static unsigned long long remote_port
Remote host's port.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1304
struct GNUNET_SCHEDULER_Task * shutdown_task
Identifier for shutdown task for this node.

References _, clean_node(), GNUNET_STATISTICS_GetHandle::cls, Node::gh, GNUNET_OK, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_cancel(), nodes, num_nodes, num_nodes_ready, print_finish(), remote_host, remote_port, ret, shutdown_task, and Node::shutdown_task.

Referenced by main_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleanup()

static void cleanup ( void *  cls,
int  success 
)
static

Function called last by the statistics code.

Parameters
clsclosure
successGNUNET_OK if statistics were successfully obtained, GNUNET_SYSERR if not.

Definition at line 450 of file gnunet-statistics.c.

452{
453 for (unsigned i = 0; i < num_nodes; i++)
454 {
455 nodes[i].gh = NULL;
456 }
457 if (GNUNET_OK != success)
458 {
459 if (NULL == remote_host)
460 fprintf (stderr, "%s", _ ("Failed to obtain statistics.\n"));
461 else
462 fprintf (stderr,
463 _ ("Failed to obtain statistics from host `%s:%llu'\n"),
466 ret = 1;
467 }
469}

References _, Node::gh, GNUNET_OK, GNUNET_SCHEDULER_shutdown(), nodes, num_nodes, remote_host, remote_port, and ret.

Referenced by main_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ collector()

static int collector ( void *  cls,
const char *  subsys,
const char *  coll_name,
uint64_t  value,
int  is_persistent 
)
static

Iterate over statistics values and store them in values.

They will be printed once all are available.

Parameters
clsCosure - Node index.
subsystemSubsystem of the value.
nameName of the value.
valueValue itself.
is_persistentPersistence.
Returns
GNUNET_OK - continue.

Definition at line 484 of file gnunet-statistics.c.

489{
490 const unsigned index_node = *(unsigned *) cls;
491 struct GNUNET_HashCode *key;
492 struct GNUNET_HashCode hc;
493 char *subsys_name;
494 unsigned len_subsys_name;
495 struct ValueSet *value_set;
496
497 len_subsys_name = strlen (subsys) + 3 + strlen (coll_name) + 1;
498 subsys_name = GNUNET_malloc (len_subsys_name);
499 sprintf (subsys_name, "%s---%s", subsys, coll_name);
500 key = &hc;
501 GNUNET_CRYPTO_hash (subsys_name, len_subsys_name, key);
502 GNUNET_free (subsys_name);
504 {
506 }
507 else
508 {
509 value_set = new_value_set (subsys, coll_name, num_nodes, is_persistent);
510 }
511 value_set->values[index_node] = value;
514 values,
515 key,
516 value_set,
518 return GNUNET_OK;
519}
struct GNUNET_HashCode key
The key used in the DHT.
static struct ValueSet * new_value_set(const char *subsys, const char *new_name, unsigned num_values, int is_persistent)
Create a new ValueSet.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL).
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
#define GNUNET_malloc(size)
Wrapper around malloc.
A 512-bit hashcode.

References GNUNET_STATISTICS_GetHandle::cls, GNUNET_assert, GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_CRYPTO_hash(), GNUNET_free, GNUNET_malloc, GNUNET_OK, GNUNET_YES, ValueSet::is_persistent, key, new_value_set(), num_nodes, value, ValueSet::values, and values.

Referenced by main_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main_task()

static void main_task ( void *  cls)
static

Main task that does the actual work.

Parameters
clsclosure with our configuration

Definition at line 528 of file gnunet-statistics.c.

529{
530 unsigned index_node = *(unsigned *) cls;
531 const struct GNUNET_CONFIGURATION_Handle *cfg = nodes[index_node].conf;
532
533 if (set_value)
534 {
535 if (NULL == subsystem)
536 {
537 fprintf (stderr, "%s", _ ("Missing argument: subsystem \n"));
538 ret = 1;
539 return;
540 }
541 if (NULL == name)
542 {
543 fprintf (stderr, "%s", _ ("Missing argument: name\n"));
544 ret = 1;
545 return;
546 }
548 if (NULL == nodes[index_node].handle)
549 {
550 ret = 1;
551 return;
552 }
554 name,
555 (uint64_t) set_val,
556 persistent);
558 nodes[index_node].handle = NULL;
559 return;
560 }
561 if (NULL == (nodes[index_node].handle =
562 GNUNET_STATISTICS_create ("gnunet-statistics", cfg)))
563 {
564 ret = 1;
565 return;
566 }
567 if (GNUNET_NO == watch)
568 {
569 if (NULL == (nodes[index_node].gh =
571 subsystem,
572 name,
574 &collector,
575 &nodes[index_node].index_node)))
576 cleanup (nodes[index_node].handle, GNUNET_SYSERR);
577 }
578 else
579 {
580 if ((NULL == subsystem) || (NULL == name))
581 {
582 printf (_ ("No subsystem or name given\n"));
584 nodes[index_node].handle = NULL;
585 ret = 1;
586 return;
587 }
588 if (GNUNET_OK != GNUNET_STATISTICS_watch (nodes[index_node].handle,
589 subsystem,
590 name,
592 &nodes[index_node].index_node))
593 {
594 fprintf (stderr, _ ("Failed to initialize watch routine\n"));
595 nodes[index_node].shutdown_task =
596 GNUNET_SCHEDULER_add_now (&clean_node, &nodes[index_node].index_node);
597 return;
598 }
599 }
600 nodes[index_node].shutdown_task =
601 GNUNET_SCHEDULER_add_shutdown (&clean_node, &nodes[index_node].index_node);
602}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:108
static unsigned long long set_val
Value to set.
static int set_value
Set operation.
static void continuation_print(void *cls, int success)
Called once all statistic values are available.
static void cleanup(void *cls, int success)
Function called last by the statistics code.
static int collector(void *cls, const char *subsys, const char *coll_name, uint64_t value, int is_persistent)
Iterate over statistics values and store them in values.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition: gnunet-vpn.c:35
@ GNUNET_SYSERR
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1339
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.
struct GNUNET_STATISTICS_GetHandle * GNUNET_STATISTICS_get(struct GNUNET_STATISTICS_Handle *handle, const char *subsystem, const char *name, GNUNET_STATISTICS_Callback cont, GNUNET_STATISTICS_Iterator proc, void *cls)
Get statistic from the peer.
int GNUNET_STATISTICS_watch(struct GNUNET_STATISTICS_Handle *handle, const char *subsystem, const char *name, GNUNET_STATISTICS_Iterator proc, void *proc_cls)
Watch statistics from the peer (be notified whenever they change).

References _, cfg, clean_node(), cleanup(), collector(), Node::conf, continuation_print(), GNUNET_NO, GNUNET_OK, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_add_shutdown(), GNUNET_STATISTICS_create(), GNUNET_STATISTICS_destroy(), GNUNET_STATISTICS_get(), GNUNET_STATISTICS_set(), GNUNET_STATISTICS_watch(), GNUNET_SYSERR, GNUNET_YES, Node::handle, handle, name, nodes, persistent, printer_watch(), ret, set_val, set_value, Node::shutdown_task, subsystem, and watch.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iter_check_config()

static int iter_check_config ( void *  cls,
const char *  filename 
)
static

Iter over content of a node's directory to check for existence of a config file.

Implements GNUNET_FileNameCallback

Parameters
clspointer to indicate success
filenamefilename inside the directory of the potential node
Returns
to continue iteration or not to

Definition at line 617 of file gnunet-statistics.c.

619{
620 if (0 == strncmp (GNUNET_STRINGS_get_short_name (filename), "config", 6))
621 {
622 /* Found the config - stop iteration successfully */
627 if (GNUNET_OK !=
629 {
630 fprintf (stderr, "Failed loading config `%s'\n", filename);
631 return GNUNET_SYSERR;
632 }
633 return GNUNET_NO;
634 }
635 else
636 {
637 /* Continue iteration */
638 return GNUNET_OK;
639 }
640}
static char * filename
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
const char * GNUNET_STRINGS_get_short_name(const char *filename)
"man basename" Returns a pointer to a part of filename (allocates nothing)!
Definition: strings.c:663
unsigned index_node
Index of the node in this array.

References Node::conf, filename, GNUNET_array_grow, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_load(), GNUNET_NO, GNUNET_OK, GNUNET_OS_project_data_gnunet(), GNUNET_STRINGS_get_short_name(), GNUNET_SYSERR, Node::index_node, nodes, and num_nodes.

Referenced by iter_testbed_path().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iter_testbed_path()

static int iter_testbed_path ( void *  cls,
const char *  filename 
)
static

Iterates over filenames in testbed directory.

Implements GNUNET_FileNameCallback

Checks if the file is a directory for a testbed node and counts the nodes.

Parameters
clscounter of nodes
filenamefull path of the file in testbed
Returns
status whether to continue iteration

Definition at line 656 of file gnunet-statistics.c.

658{
659 unsigned index_node;
660
661 GNUNET_assert (NULL != filename);
662 if (1 == sscanf (GNUNET_STRINGS_get_short_name (filename),
663 "%u",
664 &index_node))
665 {
668 NULL))
669 {
670 /* This is probably no directory for a testbed node
671 * Go on with iteration */
672 return GNUNET_OK;
673 }
674 return GNUNET_OK;
675 }
676 return GNUNET_OK;
677}
static int iter_check_config(void *cls, const char *filename)
Iter over content of a node's directory to check for existence of a config file.
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:811

References filename, GNUNET_assert, GNUNET_DISK_directory_scan(), GNUNET_OK, GNUNET_STRINGS_get_short_name(), and iter_check_config().

Referenced by discover_testbed_nodes().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ discover_testbed_nodes()

static int discover_testbed_nodes ( const char *  path_testbed_discovered)
static

Count the number of nodes running in the testbed.

Parameters
path_testbedpath to the testbed data
Returns
number of running nodes

Definition at line 688 of file gnunet-statistics.c.

689{
690 int num_dir_entries;
691
692 num_dir_entries =
693 GNUNET_DISK_directory_scan (path_testbed_discovered,
695 NULL);
696 if (-1 == num_dir_entries)
697 {
698 fprintf (stderr,
699 "Failure during scanning directory `%s'\n",
700 path_testbed_discovered);
701 return -1;
702 }
703 return 0;
704}
static int iter_testbed_path(void *cls, const char *filename)
Iterates over filenames in testbed directory.

References GNUNET_DISK_directory_scan(), and iter_testbed_path().

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
char *const *  args,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle cfg 
)
static

Main function that will be run by the scheduler.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 716 of file gnunet-statistics.c.

720{
722
723 c = (struct GNUNET_CONFIGURATION_Handle *) cfg;
725 if (NULL == csv_separator)
726 csv_separator = "";
727 if (NULL != args[0])
728 {
729 if (1 != sscanf (args[0], "%llu", &set_val))
730 {
731 fprintf (stderr, _ ("Invalid argument `%s'\n"), args[0]);
732 ret = 1;
733 return;
734 }
736 }
737 if (NULL != remote_host)
738 {
739 if (0 == remote_port)
740 {
741 if (GNUNET_SYSERR ==
743 "statistics",
744 "PORT",
745 &remote_port))
746 {
747 fprintf (stderr,
748 _ ("A port is required to connect to host `%s'\n"),
750 return;
751 }
752 }
753 else if (65535 <= remote_port)
754 {
755 fprintf (stderr,
756 _ (
757 "A port has to be between 1 and 65535 to connect to host `%s'\n"),
759 return;
760 }
761
762 /* Manipulate configuration */
764 "statistics",
765 "UNIXPATH",
766 "");
768 "statistics",
769 "HOSTNAME",
772 "statistics",
773 "PORT",
775 }
776 if (NULL == path_testbed)
777 {
780 nodes[0].index_node = 0;
781 nodes[0].conf = c;
782 GNUNET_SCHEDULER_add_now (&main_task, &nodes[0].index_node);
783 }
784 else
785 {
786 if (GNUNET_YES == watch)
787 {
788 printf (
789 _ ("Not able to watch testbed nodes (yet - feel free to implement)\n"));
790 ret = 1;
791 return;
792 }
795 {
796 return;
797 }
798 /* For each config/node collect statistics */
799 for (unsigned i = 0; i < num_nodes; i++)
800 {
801 GNUNET_SCHEDULER_add_now (&main_task, &nodes[i].index_node);
802 }
803 }
804}
static int discover_testbed_nodes(const char *path_testbed_discovered)
Count the number of nodes running in the testbed.
static void main_task(void *cls)
Main task that does the actual work.
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
void GNUNET_CONFIGURATION_set_value_number(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long number)
Set a configuration value that should be a number.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.

References _, consensus-simulation::args, cfg, Node::conf, csv_separator, discover_testbed_nodes(), GNUNET_array_grow, GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_set_value_number(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_NO, GNUNET_SCHEDULER_add_now(), GNUNET_SYSERR, GNUNET_YES, Node::index_node, main_task(), nodes, num_nodes, path_testbed, remote_host, remote_port, ret, set_val, set_value, values, and watch.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *const *  argv 
)

The main function to obtain statistics in GNUnet.

Parameters
argcnumber of arguments from the command line
argvcommand line arguments
Returns
0 ok, 1 on error

Definition at line 815 of file gnunet-statistics.c.

816{
819 "name",
820 "NAME",
822 "limit output to statistics for the given NAME"),
823 &name),
825 "persistent",
827 "make the value being set persistent"),
828 &persistent),
830 "subsystem",
831 "SUBSYSTEM",
833 "limit output to the given SUBSYSTEM"),
834 &subsystem),
836 "csv-separator",
837 "CSV_SEPARATOR",
838 gettext_noop ("use as csv separator"),
841 "testbed",
842 "TESTBED",
844 "path to the folder containing the testbed data"),
845 &path_testbed),
847 "quiet",
849 "just print the statistics value"),
850 &quiet),
852 "watch",
853 gettext_noop ("watch value continuously"),
854 &watch),
856 "remote",
857 "REMOTE",
858 gettext_noop ("connect to remote host"),
859 &remote_host),
861 "port",
862 "PORT",
863 gettext_noop ("port for remote host"),
864 &remote_port),
866 };
867
868 remote_port = 0;
869 remote_host = NULL;
870
871 ret = (GNUNET_OK ==
873 argc,
874 argv,
875 "gnunet-statistics [options [value]]",
877 "Print statistics about GNUnet operations."),
878 options,
879 &run,
880 NULL))
881 ? ret
882 : 1;
884 num_nodes,
885 0);
887 return ret;
888}
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
#define gettext_noop(String)
Definition: gettext.h:74
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
Main function that will be run by the scheduler.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_filename(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a filename (automatically path expanded).
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_ulong(char shortName, const char *name, const char *argumentHelp, const char *description, unsigned long long *val)
Allow user to specify an unsigned long long.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:407
Definition of a command line option.

References csv_separator_opt, gettext_noop, GNUNET_array_grow, GNUNET_free, GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_filename(), GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_string(), GNUNET_GETOPT_option_ulong(), GNUNET_OK, GNUNET_OS_project_data_gnunet(), GNUNET_PROGRAM_run(), name, nodes, num_nodes, options, path_testbed, persistent, quiet, remote_host, remote_port, ret, run(), subsystem, and watch.

Here is the call graph for this function:

Variable Documentation

◆ ret

int ret
static

Final status code.

Definition at line 35 of file gnunet-statistics.c.

Referenced by cleanup(), continuation_print(), main(), main_task(), and run().

◆ subsystem

char* subsystem
static

Set to subsystem that we're going to get stats for (or NULL for all).

Definition at line 40 of file gnunet-statistics.c.

Referenced by clean_node(), GNUNET_STATISTICS_create(), GNUNET_STATISTICS_get(), GNUNET_STATISTICS_watch(), GNUNET_STATISTICS_watch_cancel(), handle_uri(), main(), main_task(), process_stats(), run(), and stats_iterator().

◆ path_testbed

char* path_testbed
static

The path of the testbed data.

Definition at line 45 of file gnunet-statistics.c.

Referenced by clean_node(), main(), and run().

◆ name

char* name
static

Set to the specific stat value that we are after (or NULL for all).

Definition at line 50 of file gnunet-statistics.c.

Referenced by clean_node(), main(), and main_task().

◆ persistent

int persistent
static

Make the value that is being set persistent.

Definition at line 55 of file gnunet-statistics.c.

Referenced by main(), main_task(), and new_value_set().

◆ watch

int watch
static

Watch value continuously.

Definition at line 60 of file gnunet-statistics.c.

Referenced by clean_node(), main(), main_task(), printer(), printer_watch(), run(), and schedule_watch_request().

◆ quiet

int quiet
static

Quiet mode.

Definition at line 65 of file gnunet-statistics.c.

Referenced by main(), printer(), and printer_watch().

◆ csv_separator_opt

char* csv_separator_opt
static

Separator string for csv.

Definition at line 70 of file gnunet-statistics.c.

Referenced by main(), and print_finish().

◆ csv_separator

const char* csv_separator
static

Separator string for csv.

Definition at line 75 of file gnunet-statistics.c.

Referenced by printer(), printer_watch(), and run().

◆ remote_host

char* remote_host
static

Remote host.

Definition at line 80 of file gnunet-statistics.c.

Referenced by cleanup(), continuation_print(), main(), and run().

◆ remote_port

unsigned long long remote_port
static

Remote host's port.

Definition at line 85 of file gnunet-statistics.c.

Referenced by add_services(), cleanup(), continuation_print(), main(), and run().

◆ set_val

unsigned long long set_val
static

Value to set.

Definition at line 90 of file gnunet-statistics.c.

Referenced by main_task(), and run().

◆ set_value

int set_value
static

Set operation.

Definition at line 95 of file gnunet-statistics.c.

Referenced by main_task(), and run().

◆ nodes

◆ num_nodes

unsigned num_nodes
static

Number of configurations of all (testbed) nodes.

Definition at line 130 of file gnunet-statistics.c.

Referenced by cleanup(), collector(), continuation_print(), iter_check_config(), main(), printer(), and run().

◆ values

struct GNUNET_CONTAINER_MultiHashMap* values
static

Collection of all values (represented with ValueSet).

Definition at line 162 of file gnunet-statistics.c.

Referenced by collector(), heap_plugin_get_closest(), print_finish(), and run().

◆ num_nodes_ready

int num_nodes_ready
static

Number of nodes that have their values ready.

Definition at line 167 of file gnunet-statistics.c.

Referenced by continuation_print().

◆ num_nodes_ready_shutdown

int num_nodes_ready_shutdown
static

Number of nodes that have their values ready.

Definition at line 172 of file gnunet-statistics.c.

Referenced by clean_node().