forked from eclipse-zenoh/zenoh
-
Notifications
You must be signed in to change notification settings - Fork 4
/
DEFAULT_CONFIG.json5
673 lines (653 loc) · 32.4 KB
/
DEFAULT_CONFIG.json5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
/// This file attempts to list and document available configuration elements.
/// For a more complete view of the configuration's structure, check out `zenoh/src/config.rs`'s `Config` structure.
/// Note that the values here are correctly typed, but may not be sensible, so copying this file to change only the parts that matter to you is not good practice.
{
/// The identifier (as unsigned 128bit integer in hexadecimal lowercase - leading zeros are not accepted)
/// that zenoh runtime will use.
/// If not set, a random unsigned 128bit integer will be used.
/// WARNING: this id must be unique in your zenoh network.
// id: "1234567890abcdef",
/// The node's mode (router, peer or client)
mode: "peer",
/// The node's metadata (name, location, DNS name, etc.) Arbitrary JSON data not interpreted by zenoh and available in admin space @/<zid>/router, @/<zid>/peer or @/<zid>/client
metadata: {
name: "strawberry",
location: "Penny Lane",
},
/// Which endpoints to connect to. E.g. tcp/localhost:7447.
/// By configuring the endpoints, it is possible to tell zenoh which router/peer to connect to at startup.
///
/// For TCP/UDP on Linux, it is possible additionally specify the interface to be connected to:
/// E.g. tcp/192.168.0.1:7447#iface=eth0, for connect only if the IP address is reachable via the interface eth0
///
/// It is also possible to specify a priority range and/or a reliability setting to be used on the link.
/// For example `tcp/localhost?prio=6-7;rel=0` assigns priorities "data_low" and "background" to the established link.
connect: {
/// timeout waiting for all endpoints connected (0: no retry, -1: infinite timeout)
/// Accepts a single value (e.g. timeout_ms: 0)
/// or different values for router, peer and client (e.g. timeout_ms: { router: -1, peer: -1, client: 0 }).
timeout_ms: { router: -1, peer: -1, client: 0 },
/// The list of endpoints to connect to.
/// Accepts a single list (e.g. endpoints: ["tcp/10.10.10.10:7447", "tcp/11.11.11.11:7447"])
/// or different lists for router, peer and client (e.g. endpoints: { router: ["tcp/10.10.10.10:7447"], peer: ["tcp/11.11.11.11:7447"] }).
///
/// See https://docs.rs/zenoh/latest/zenoh/config/struct.EndPoint.html
endpoints: [
// "<proto>/<address>"
],
/// Global connect configuration,
/// Accepts a single value or different values for router, peer and client.
/// The configuration can also be specified for the separate endpoint
/// it will override the global one
/// E.g. tcp/192.168.0.1:7447#retry_period_init_ms=20000;retry_period_max_ms=10000"
/// exit from application, if timeout exceed
exit_on_failure: { router: false, peer: false, client: true },
/// connect establishing retry configuration
retry: {
/// initial wait timeout until next connect try
period_init_ms: 1000,
/// maximum wait timeout until next connect try
period_max_ms: 4000,
/// increase factor for the next timeout until nexti connect try
period_increase_factor: 2,
},
},
/// Which endpoints to listen on. E.g. tcp/0.0.0.0:7447.
/// By configuring the endpoints, it is possible to tell zenoh which are the endpoints that other routers,
/// peers, or client can use to establish a zenoh session.
///
/// For TCP/UDP on Linux, it is possible additionally specify the interface to be listened to:
/// E.g. tcp/0.0.0.0:7447#iface=eth0, for listen connection only on eth0
///
/// It is also possible to specify a priority range and/or a reliability setting to be used on the link.
/// For example `tcp/localhost?prio=6-7;rel=0` assigns priorities "data_low" and "background" to the established link.
listen: {
/// timeout waiting for all listen endpoints (0: no retry, -1: infinite timeout)
/// Accepts a single value (e.g. timeout_ms: 0)
/// or different values for router, peer and client (e.g. timeout_ms: { router: -1, peer: -1, client: 0 }).
timeout_ms: 0,
/// The list of endpoints to listen on.
/// Accepts a single list (e.g. endpoints: ["tcp/[::]:7447", "udp/[::]:7447"])
/// or different lists for router, peer and client (e.g. endpoints: { router: ["tcp/[::]:7447"], peer: ["tcp/[::]:0"] }).
///
/// See https://docs.rs/zenoh/latest/zenoh/config/struct.EndPoint.html
endpoints: { router: ["tcp/[::]:7447"], peer: ["tcp/[::]:0"] },
/// Global listen configuration,
/// Accepts a single value or different values for router, peer and client.
/// The configuration can also be specified for the separate endpoint
/// it will override the global one
/// E.g. tcp/192.168.0.1:7447#exit_on_failure=false;retry_period_max_ms=1000"
/// exit from application, if timeout exceed
exit_on_failure: true,
/// listen retry configuration
retry: {
/// initial wait timeout until next try
period_init_ms: 1000,
/// maximum wait timeout until next try
period_max_ms: 4000,
/// increase factor for the next timeout until next try
period_increase_factor: 2,
},
},
/// Configure the session open behavior.
open: {
/// Configure the conditions to be met before session open returns.
return_conditions: {
/// Session open waits to connect to scouted peers and routers before returning.
/// When set to false, first publications and queries after session open from peers may be lost.
connect_scouted: true,
/// Session open waits to receive initial declares from connected peers before returning.
/// Setting to false may cause extra traffic at startup from peers.
declares: true,
},
},
/// Configure the scouting mechanisms and their behaviours
scouting: {
/// In client mode, the period in milliseconds dedicated to scouting for a router before failing.
timeout: 3000,
/// In peer mode, the maximum period in milliseconds dedicated to scouting remote peers before attempting other operations.
delay: 500,
/// The multicast scouting configuration.
multicast: {
/// Whether multicast scouting is enabled or not
enabled: true,
/// The socket which should be used for multicast scouting
address: "224.0.0.224:7446",
/// The network interface which should be used for multicast scouting
interface: "auto", // If not set or set to "auto" the interface if picked automatically
/// The time-to-live on multicast scouting packets
ttl: 1,
/// Which type of Zenoh instances to automatically establish sessions with upon discovery on UDP multicast.
/// Accepts a single value (e.g. autoconnect: ["router", "peer"])
/// or different values for router, peer and client (e.g. autoconnect: { router: [], peer: ["router", "peer"] }).
/// Each value is a list of: "peer", "router" and/or "client".
autoconnect: { router: [], peer: ["router", "peer"] },
/// Whether or not to listen for scout messages on UDP multicast and reply to them.
listen: true,
},
/// The gossip scouting configuration.
gossip: {
/// Whether gossip scouting is enabled or not
enabled: true,
/// When true, gossip scouting information are propagated multiple hops to all nodes in the local network.
/// When false, gossip scouting information are only propagated to the next hop.
/// Activating multihop gossip implies more scouting traffic and a lower scalability.
/// It mostly makes sense when using "linkstate" routing mode where all nodes in the subsystem don't have
/// direct connectivity with each other.
multihop: false,
/// Which type of Zenoh instances to automatically establish sessions with upon discovery on gossip.
/// Accepts a single value (e.g. autoconnect: ["router", "peer"])
/// or different values for router, peer and client (e.g. autoconnect: { router: [], peer: ["router", "peer"] }).
/// Each value is a list of: "peer", "router" and/or "client".
autoconnect: { router: [], peer: ["router", "peer"] },
},
},
/// Configuration of data messages timestamps management.
timestamping: {
/// Whether data messages should be timestamped if not already.
/// Accepts a single boolean value or different values for router, peer and client.
enabled: { router: true, peer: false, client: false },
/// Whether data messages with timestamps in the future should be dropped or not.
/// If set to false (default), messages with timestamps in the future are retimestamped.
/// Timestamps are ignored if timestamping is disabled.
drop_future_timestamp: false,
},
/// The default timeout to apply to queries in milliseconds.
queries_default_timeout: 10000,
/// The routing strategy to use and it's configuration.
routing: {
/// The routing strategy to use in routers and it's configuration.
router: {
/// When set to true a router will forward data between two peers
/// directly connected to it if it detects that those peers are not
/// connected to each other.
/// The failover brokering only works if gossip discovery is enabled.
peers_failover_brokering: true,
},
/// The routing strategy to use in peers and it's configuration.
peer: {
/// The routing strategy to use in peers. ("peer_to_peer" or "linkstate").
mode: "peer_to_peer",
},
},
// /// The declarations aggregation strategy.
// aggregation: {
// /// A list of key-expressions for which all included subscribers will be aggregated into.
// subscribers: [
// // key_expression
// ],
// /// A list of key-expressions for which all included publishers will be aggregated into.
// publishers: [
// // key_expression
// ],
// },
// /// The downsampling declaration.
// downsampling: [
// {
// /// A list of network interfaces messages will be processed on, the rest will be passed as is.
// interfaces: [ "wlan0" ],
// /// Data flow messages will be processed on. ("egress" or "ingress")
// flow: "egress",
// /// A list of downsampling rules: key_expression and the maximum frequency in Hertz
// rules: [
// { key_expr: "demo/example/zenoh-rs-pub", freq: 0.1 },
// ],
// },
// ],
// /// Configure access control (ACL) rules
// access_control: {
// /// [true/false] acl will be activated only if this is set to true
// "enabled": false,
// /// [deny/allow] default permission is deny (even if this is left empty or not specified)
// "default_permission": "deny",
// /// Rule set for permissions allowing or denying access to key-expressions
// "rules":
// [
// {
// /// Id has to be unique within the rule set
// "id": "rule1",
// "messages": [
// "put", "delete", "declare_subscriber",
// "query", "reply", "declare_queryable",
// ],
// "flows":["egress","ingress"],
// "permission": "allow",
// "key_exprs": [
// "test/demo"
// ],
// },
// {
// "id": "rule2",
// "messages": [
// "put", "delete", "declare_subscriber",
// "query", "reply", "declare_queryable",
// ],
// "flows":["ingress"],
// "permission": "allow",
// "key_exprs": [
// "**"
// ],
// },
// ],
// /// List of combinations of subjects.
// ///
// /// If a subject property (i.e. username, certificate common name or interface) is empty
// /// it is interpreted as a wildcard. Moreover, a subject property cannot be an empty list.
// "subjects":
// [
// {
// /// Id has to be unique within the subjects list
// "id": "subject1",
// /// Subjects can be interfaces
// "interfaces": [
// "lo0",
// "en0",
// ],
// /// Subjects can be cert_common_names when using TLS or Quic
// "cert_common_names": [
// "example.zenoh.io"
// ],
// /// Subjects can be usernames when using user/password authentication
// "usernames": [
// "zenoh-example"
// ],
// /// This instance translates internally to this filter:
// /// (interface="lo0" && cert_common_name="example.zenoh.io" && username="zenoh-example") ||
// /// (interface="en0" && cert_common_name="example.zenoh.io" && username="zenoh-example")
// },
// {
// "id": "subject2",
// "interfaces": [
// "lo0",
// "en0",
// ],
// "cert_common_names": [
// "example2.zenoh.io"
// ],
// /// This instance translates internally to this filter:
// /// (interface="lo0" && cert_common_name="example2.zenoh.io") ||
// /// (interface="en0" && cert_common_name="example2.zenoh.io")
// },
// {
// "id": "subject3",
// /// An empty subject combination is a wildcard
// },
// ],
// /// The policies list associates rules to subjects
// "policies":
// [
// /// Each policy associates one or multiple rules to one or multiple subject combinations
// {
// /// Rules and Subjects are identified with their unique IDs declared above
// "rules": ["rule1"],
// "subjects": ["subject1", "subject2"],
// },
// {
// "rules": ["rule2"],
// "subjects": ["subject3"],
// },
// ]
//},
/// Configure internal transport parameters
transport: {
unicast: {
/// Timeout in milliseconds when opening a link
accept_timeout: 10000,
/// Maximum number of zenoh session in pending state while accepting
accept_pending: 100,
/// Maximum number of sessions that can be simultaneously alive
max_sessions: 1000,
/// Maximum number of incoming links that are admitted per session
max_links: 1,
/// Enables the LowLatency transport
/// This option does not make LowLatency transport mandatory, the actual implementation of transport
/// used will depend on Establish procedure and other party's settings
///
/// NOTE: Currently, the LowLatency transport doesn't preserve QoS prioritization.
/// NOTE: Due to the note above, 'lowlatency' is incompatible with 'qos' option, so in order to
/// enable 'lowlatency' you need to explicitly disable 'qos'.
/// NOTE: LowLatency transport does not support the fragmentation, so the message size should be
/// smaller than the tx batch_size.
lowlatency: false,
/// Enables QoS on unicast communications.
qos: {
enabled: true,
},
/// Enables compression on unicast communications.
/// Compression capabilities are negotiated during session establishment.
/// If both Zenoh nodes support compression, then compression is activated.
compression: {
enabled: false,
},
},
/// WARNING: multicast communication does not perform any negotiation upon group joining.
/// Because of that, it is important that all transport parameters are the same to make
/// sure all your nodes in the system can communicate. One common parameter to configure
/// is "transport/link/tx/batch_size" since its default value depends on the actual platform
/// when operating on multicast.
/// E.g., the batch size on Linux and Windows is 65535 bytes, on Mac OS X is 9216, and anything else is 8192.
multicast: {
/// JOIN message transmission interval in milliseconds.
join_interval: 2500,
/// Maximum number of multicast sessions.
max_sessions: 1000,
/// Enables QoS on multicast communication.
/// Default to false for Zenoh-to-Zenoh-Pico out-of-the-box compatibility.
qos: {
enabled: false,
},
/// Enables compression on multicast communication.
/// Default to false for Zenoh-to-Zenoh-Pico out-of-the-box compatibility.
compression: {
enabled: false,
},
},
link: {
/// An optional whitelist of protocols to be used for accepting and opening sessions. If not
/// configured, all the supported protocols are automatically whitelisted. The supported
/// protocols are: ["tcp" , "udp", "tls", "quic", "ws", "unixsock-stream", "vsock"] For
/// example, to only enable "tls" and "quic": protocols: ["tls", "quic"],
///
/// Configure the zenoh TX parameters of a link
tx: {
/// The resolution in bits to be used for the message sequence numbers.
/// When establishing a session with another Zenoh instance, the lowest value of the two instances will be used.
/// Accepted values: 8bit, 16bit, 32bit, 64bit.
sequence_number_resolution: "32bit",
/// Link lease duration in milliseconds to announce to other zenoh nodes
lease: 10000,
/// Number of keep-alive messages in a link lease duration. If no data is sent, keep alive
/// messages will be sent at the configured time interval.
/// NOTE: In order to consider eventual packet loss and transmission latency and jitter,
/// set the actual keep_alive interval to one fourth of the lease time: i.e. send
/// 4 keep_alive messages in a lease period. Changing the lease time will have the
/// keep_alive messages sent more or less often.
/// This is in-line with the ITU-T G.8013/Y.1731 specification on continuous connectivity
/// check which considers a link as failed when no messages are received in 3.5 times the
/// target interval.
keep_alive: 4,
/// Batch size in bytes is expressed as a 16bit unsigned integer.
/// Therefore, the maximum batch size is 2^16-1 (i.e. 65535).
/// The default batch size value is the maximum batch size: 65535.
batch_size: 65535,
/// Each zenoh link has a transmission queue that can be configured
queue: {
/// The size of each priority queue indicates the number of batches a given queue can contain.
/// NOTE: the number of batches in each priority must be included between 1 and 16. Different values will result in an error.
/// The amount of memory being allocated for each queue is then SIZE_XXX * BATCH_SIZE.
/// In the case of the transport link MTU being smaller than the ZN_BATCH_SIZE,
/// then amount of memory being allocated for each queue is SIZE_XXX * LINK_MTU.
/// If qos is false, then only the DATA priority will be allocated.
size: {
control: 1,
real_time: 1,
interactive_high: 1,
interactive_low: 1,
data_high: 2,
data: 4,
data_low: 4,
background: 4,
},
/// Congestion occurs when the queue is empty (no available batch).
congestion_control: {
/// Behavior pushing CongestionControl::Drop messages to the queue.
drop: {
/// The maximum time in microseconds to wait for an available batch before dropping a droppable message if still no batch is available.
wait_before_drop: 1000,
},
/// Behavior pushing CongestionControl::Block messages to the queue.
block: {
/// The maximum time in microseconds to wait for an available batch before closing the transport session when sending a blocking message
/// if still no batch is available.
wait_before_close: 5000000,
},
},
/// Perform batching of messages if they are smaller of the batch_size
batching: {
/// Perform adaptive batching of messages if they are smaller of the batch_size.
/// When the network is detected to not be fast enough to transmit every message individually, many small messages may be
/// batched together and sent all at once on the wire reducing the overall network overhead. This is typically of a high-throughput
/// scenario mainly composed of small messages. In other words, batching is activated by the network back-pressure.
enabled: true,
/// The maximum time limit (in ms) a message should be retained for batching when back-pressure happens.
time_limit: 1,
},
},
},
/// Configure the zenoh RX parameters of a link
rx: {
/// Receiving buffer size in bytes for each link
/// The default the rx_buffer_size value is the same as the default batch size: 65535.
/// For very high throughput scenarios, the rx_buffer_size can be increased to accommodate
/// more in-flight data. This is particularly relevant when dealing with large messages.
/// E.g. for 16MiB rx_buffer_size set the value to: 16777216.
buffer_size: 65535,
/// Maximum size of the defragmentation buffer at receiver end.
/// Fragmented messages that are larger than the configured size will be dropped.
/// The default value is 1GiB. This would work in most scenarios.
/// NOTE: reduce the value if you are operating on a memory constrained device.
max_message_size: 1073741824,
},
/// Configure TLS specific parameters
tls: {
/// Path to the certificate of the certificate authority used to validate either the server
/// or the client's keys and certificates, depending on the node's mode. If not specified
/// on router mode then the default WebPKI certificates are used instead.
root_ca_certificate: null,
/// Path to the TLS listening side private key
listen_private_key: null,
/// Path to the TLS listening side public certificate
listen_certificate: null,
/// Enables mTLS (mutual authentication), client authentication
enable_mtls: false,
/// Path to the TLS connecting side private key
connect_private_key: null,
/// Path to the TLS connecting side certificate
connect_certificate: null,
// Whether or not to verify the matching between hostname/dns and certificate when connecting,
// if set to false zenoh will disregard the common names of the certificates when verifying servers.
// This could be dangerous because your CA can have signed a server cert for foo.com, that's later being used to host a server at baz.com. If you wan't your
// ca to verify that the server at baz.com is actually baz.com, let this be true (default).
verify_name_on_connect: true,
},
},
/// Shared memory configuration.
/// NOTE: shared memory can be used only if zenoh is compiled with "shared-memory" feature, otherwise
/// settings in this section have no effect.
shared_memory: {
/// A probing procedure for shared memory is performed upon session opening. To enable zenoh to operate
/// over shared memory (and to not fallback on network mode), shared memory needs to be enabled also on the
/// subscriber side. By doing so, the probing procedure will succeed and shared memory will operate as expected.
enabled: true,
},
auth: {
/// The configuration of authentication.
/// A password implies a username is required.
usrpwd: {
user: null,
password: null,
/// The path to a file containing the user password dictionary
dictionary_file: null,
},
pubkey: {
public_key_pem: null,
private_key_pem: null,
public_key_file: null,
private_key_file: null,
key_size: null,
known_keys_file: null,
},
},
},
/// Configure the Admin Space
/// Unstable: this configuration part works as advertised, but may change in a future release
adminspace: {
// Enables the admin space
enabled: false,
// read and/or write permissions on the admin space
permissions: {
read: true,
write: false,
},
},
///
/// Plugins configurations
///
//
// plugins_loading: {
// /// Enable plugins loading.
// enabled: false,
// /// Directories where plugins configured by name should be looked for. Plugins configured by __path__ are not subject to lookup.
// /// Directories are specified as object with fields `kind` and `value` is accepted.
// /// 1. If `kind` is `current_exe_parent`, then the parent of the current executable's directory is searched and `value` should be `null`.
// /// In Bash notation, `{ "kind": "current_exe_parent" }` equals `$(dirname $(which zenohd))` while `"."` equals `$PWD`.
// /// 2. If `kind` is `path`, then `value` is interpreted as a filesystem path. Simply supplying a string instead of a object is equivalent to this.
// /// If `enabled: true` and `search_dirs` is not specified then `search_dirs` falls back to the default value:
// search_dirs: [{ "kind": "current_exe_parent" }, ".", "~/.zenoh/lib", "/opt/homebrew/lib", "/usr/local/lib", "/usr/lib"],
// },
// /// Plugins are only loaded if `plugins_loading: { enabled: true }` and present in the configuration when starting.
// /// Once loaded, they may react to changes in the configuration made through the zenoh instance's adminspace.
// plugins: {
// /// If no `__path__` is given to a plugin, zenohd will automatically search for a shared library matching the plugin's name (here, `libzenoh_plugin_rest.so` would be searched for on linux)
//
// /// Plugin settings may contain field `__config__`
// /// - If `__config__` is specified, it's content is merged into plugin configuration
// /// - Properties loaded from `__config__` file overrides existing properties
// /// - If json objects in loaded file contains `__config__` properties, they are processed recursively
// /// This is used in the 'storage_manager' which supports subplugins, each with it's own config
// ///
// /// See below example of plugin configuration using `__config__` property
//
// /// Configure the REST API plugin
// rest: {
// /// Setting this option to true allows zenohd to panic should it detect issues with this plugin. Setting it to false politely asks the plugin not to panic.
// __required__: true, // defaults to false
// /// load configuration from the file
// __config__: "./plugins/zenoh-plugin-rest/config.json5",
// /// http port to answer to rest requests
// http_port: 8000,
// /// The number of worker thread in TOKIO runtime (default: 2)
// /// The configuration only takes effect if running as a dynamic plugin, which can not reuse the current runtime.
// work_thread_num: 2,
// /// The number of blocking thread in TOKIO runtime (default: 50)
// /// The configuration only takes effect if running as a dynamic plugin, which can not reuse the current runtime.
// max_block_thread_num: 50,
// },
//
// /// Configure the storage manager plugin
// storage_manager: {
// /// When a path is present, automatic search is disabled, and zenohd will instead select the first path which manages to load.
// __path__: [
// "./target/release/libzenoh_plugin_storage_manager.so",
// "./target/release/libzenoh_plugin_storage_manager.dylib",
// ],
// /// Directories where plugins configured by name should be looked for. Plugins configured by __path__ are not subject to lookup
// backend_search_dirs: [],
// /// The "memory" volume is always available, but you may create other volumes here, with various backends to support the actual storing.
// volumes: {
// /// An influxdb backend is also available at https://github.com/eclipse-zenoh/zenoh-backend-influxdb
// influxdb: {
// url: "https://myinfluxdb.example",
// /// Some plugins may need passwords in their configuration.
// /// To avoid leaking them through the adminspace, they may be masked behind a privacy barrier.
// /// any value held at the key "private" will not be shown in the adminspace.
// private: {
// username: "user1",
// password: "pw1",
// },
// },
// influxdb2: {
// /// A second backend of the same type can be spawned using `__path__`, for examples when different DBs are needed.
// backend: "influxdb",
// private: {
// username: "user2",
// password: "pw2",
// },
// url: "https://localhost:8086",
// },
// },
//
// /// Configure the storages supported by the volumes
// storages: {
// demo: {
// /// Storages always need to know what set of keys they must work with. These sets are defined by a key expression.
// key_expr: "demo/memory/**",
// /// Storages also need to know which volume will be used to actually store their key-value pairs.
// /// The "memory" volume is always available, and doesn't require any per-storage options, so requesting "memory" by string is always sufficient.
// volume: "memory",
// },
// demo2: {
// key_expr: "demo/memory2/**",
// /// This prefix will be stripped of the received keys when storing.
// /// ⚠️ If you replicate this Storage then THIS VALUE SHOULD BE THE SAME FOR ALL THE REPLICAS YOU WANT TO
// /// KEEP ALIGNED.
// strip_prefix: "demo/memory2",
// volume: "memory",
// /// Storage manager plugin handles metadata in order to ensure convergence of distributed storages configured in Zenoh.
// /// Metadata includes the set of wild card updates and deletions (tombstones).
// /// Once the samples are guaranteed to be delivered, the metadata can be garbage collected.
// garbage_collection: {
// /// The garbage collection event will be periodic with this duration.
// /// The duration is specified in seconds.
// period: 30,
// /// Metadata older than this parameter will be garbage collected.
// /// The duration is specified in seconds.
// lifespan: 86400,
// },
// /// If multiple storages subscribing to the same key_expr should be synchronized, declare them as replicas.
// /// In the absence of this configuration, a normal storage is initialized
// /// Note: all the samples to be stored in replicas should be timestamped
// ///
// /// ⚠️ THESE VALUE SHOULD BE THE SAME FOR ALL THE REPLICAS YOU WANT TO KEEP ALIGNED.
// replication: {
// /// Specifying the parameters is optional, by default the values provided will be used.
// /// Time interval between different synchronization attempts in SECONDS.
// interval: 10.0,
// /// Number of sub-intervals, of equal duration, within an interval.
// sub_intervals: 5,
// /// Number of intervals that compose the "hot" era.
// hot: 6,
// /// Number of intervals that compose the "warm" era.
// warm: 30,
// /// The average time, expressed in MILLISECONDS, it takes a publication to reach the Storage.
// propagation_delay: 250,
// }
// },
// demo3: {
// key_expr: "demo/memory3/**",
// volume: "memory",
// /// A complete storage advertises itself as containing all the known keys matching the configured key expression.
// /// If not configured, complete defaults to false.
// complete: "true",
// },
// influx_demo: {
// key_expr: "demo/influxdb/**",
// /// This prefix will be stripped of the received keys when storing.
// strip_prefix: "demo/influxdb",
// /// influxdb-backed volumes need a bit more configuration, which is passed like-so:
// volume: {
// id: "influxdb",
// db: "example",
// },
// },
// influx_demo2: {
// key_expr: "demo/influxdb2/**",
// strip_prefix: "demo/influxdb2",
// volume: {
// id: "influxdb2",
// db: "example",
// },
// },
// },
// },
// },
// /// Plugin configuration example using `__config__` property
// plugins: {
// rest: {
// __config__: "./plugins/zenoh-plugin-rest/config.json5",
// },
// storage_manager: {
// __config__: "./plugins/zenoh-plugin-storage-manager/config.json5",
// }
// },
}