vici: Add get-algorithms command to query loaded algorithms and implementations
[strongswan.git] / src / libcharon / plugins / vici / README.md
1 # The Versatile IKE Control Interface (VICI) protocol #
2
3 The vici plugin implements the server side of an IPC protocol to configure,
4 monitor and control the IKE daemon charon. It uses request/response and event
5 messages to communicate over a reliable stream based transport.
6
7 ## Transport protocol ##
8
9 To provide the service, the plugin opens a listening socket using a reliable,
10 stream based transport. charon relies on the different stream service
11 abstractions provided by libstrongswan, such as TCP and UNIX sockets.
12
13 A client connects to this service to access functionality. It may send an
14 arbitrary number of packets over the connection before closing it.
15
16 To exchange data, the transport protocol is segmented into byte sequences.
17 Each byte sequence is prefixed by a 32-bit length header in network order,
18 followed by the data. The maximum segment length is currently limited to 512KB
19 of data, and the length field contains the length of the data only, not
20 including the length field itself.
21
22 The order of byte sequences must be strict, byte sequences must arrive in the
23 same order as sent.
24
25 ## Packet layer ##
26
27 Within the byte sequences defined by the transport layer, both the client
28 and the server can exchange packets. The type of packet defines its structure
29 and purpose. The packet type is a 8-bit identifier, and is the first byte
30 in a transport layer byte sequence. The length of the packet is given by the
31 transport layer.
32
33 While a packet type may define the format of the wrapped data freely, currently
34 all types either contain a name, a message or both. The following packet types
35 are currently defined:
36
37 * _CMD_REQUEST = 0_: A named request message
38 * _CMD_RESPONSE = 1_: An unnamed response message for a request
39 * _CMD_UNKNOWN = 2_: An unnamed response if requested command is unknown
40 * _EVENT_REGISTER = 3_: A named event registration request
41 * _EVENT_UNREGISTER = 4_: A named event deregistration request
42 * _EVENT_CONFIRM = 5_: An unnamed response for successful event (de-)registration
43 * _EVENT_UNKNOWN = 6_: A unnamed response if event (de-)registration failed
44 * _EVENT = 7_: A named event message
45
46 For packets having a named type, after the packet type an 8-bit length header
47 of the name follows, indicating the string length in bytes of the name tag, not
48 including the length field itself. The name is an ASCII string that is not
49 null-terminated.
50
51 The rest of the packet forms the exchanged message, the length is determined
52 by the transport byte sequence length, subtracting the packet type and
53 the optional name tag in some messages.
54
55 ### Commands ###
56
57 Commands are currently always requested by the client. The server replies with
58 a response, or with a CMD_UNKNOWN failure message to let the client know
59 that it does not have a handler for such a command. There is no sequence number
60 to associate responses to requests, so only one command can be active at
61 a time on a single connection.
62
63 ### Events ###
64
65 To receive event messages, the client explicitly registers for events by name,
66 and also unregisters if it does not want to receive events of the named kind
67 anymore. The server confirms event registration using EVENT_CONFIRM, or
68 indicates that there is no such event source with EVENT_UNKNOWN.
69
70 Events may get raised at any time while registered, even during an active
71 request command. This mechanism is used to feed continuous data during a request,
72 for example.
73
74 ## Message format ##
75
76 The defined packet types optionally wrap a message with additional data.
77 Messages are currently used in CMD_REQUEST/CMD_RESPONSE, and in EVENT packets.
78 A message uses a hierarchial tree of sections. Each section (or the implicit
79 root section) contains an arbitrary set of key/value pairs, lists and
80 sub-sections. The length of a message is not part of the message itself, but
81 the wrapping layer, usually calculated from the transport byte sequence length.
82
83 The message encoding consists of a sequence of elements. Each element starts
84 with the element type, optionally followed by an element name and/or an element
85 value. Currently the following message element types are defined:
86
87 * _SECTION_START = 1_: Begin a new section having a name
88 * _SECTION_END = 2_: End a previously started section
89 * _KEY_VALUE = 3_: Define a value for a named key in the current section
90 * _LIST_START = 4_: Begin a named list for list items
91 * _LIST_ITEM = 5_: Define an unnamed item value in the current list
92 * _LIST_END = 6_: End a previously started list
93
94 Types are encoded as 8-bit values. Types having a name (SECTION_START,
95 KEY_VALUE and LIST_START) have an ASCII string following the type, which itself
96 uses an 8-bit length header. The string must not be null-terminated, the string
97 length does not include the length field itself.
98
99 Types having a value (KEY_VALUE and LIST_ITEM) have a raw blob sequence,
100 prefixed with a 16-bit network order length. The blob follows the type or the
101 name tag if available, the length defined by the length field does not include
102 the length field itself.
103
104 The interpretation of any value is not defined by the message format; it can
105 take arbitrary blobs. The application may specify types for specific keys, such
106 as strings or integer representations. The vici plugin currently uses
107 non-null terminated strings as values only; numbers get encoded as strings.
108
109 ### Sections ###
110
111 Sections may be opened in the implicit root section, or any previously section.
112 They can be nested to arbitrary levels. A SECTION_END marker always closes
113 the last opened section; SECTION_START and SECTION_END items must be balanced
114 in a valid message.
115
116 ### Key/Values ###
117
118 Key/Value pair elements may appear in the implicit root section or any explicit
119 sub-section at any level. Key names must be unique in the current section, use
120 lists to define multiple values for a key. Key/values may not appear in lists,
121 use a sub-section instead.
122
123 ### Lists ###
124
125 Lists may appear at the same locations as Key/Values, and may not be nested.
126 Only a single list may be opened at the same time, and all lists must be closed
127 in valid messages. After opening a list, only list items may appear before the
128 list closing element. Empty lists are allowed, list items may appear within
129 lists only.
130
131 ### Encoding example ###
132
133 Consider the following structure using pseudo-markup for this example:
134
135         key1 = value1
136         section1 = {
137                 sub-section = {
138                         key2 = value2
139                 }
140                 list1 = [ item1, item2 ]
141         }
142
143 The example above reprensents a valid tree structure, that gets encoded as
144 the following C array:
145
146         char msg[] = {
147                 /* key1 = value1 */
148                 3, 4,'k','e','y','1', 0,6,'v','a','l','u','e','1',
149                 /* section1 */
150                 1, 8,'s','e','c','t','i','o','n','1',
151                 /* sub-section */
152                 1, 11,'s','u','b','-','s','e','c','t','i','o','n',
153                 /* key2 = value2 */
154                 3, 4,'k','e','y','2', 0,6,'v','a','l','u','e','2',
155                 /* sub-section end */
156                 2,
157                 /* list1 */
158                 4, 5, 'l','i','s','t','1',
159                 /* item1 */
160                 5, 0,5,'i','t','e','m','1',
161                 /* item2 */
162                 5, 0,5,'i','t','e','m','2',
163                 /* list1 end */
164                 6,
165                 /* section1 end */
166                 2,
167         };
168
169 ## Client-initiated commands ##
170
171 Based on the packet layer, VICI implements commands requested by the client
172 and responded to by the server using named _CMD_REQUEST_ and _CMD_RESPONSE_
173 packets wrapping messages. The request message may contain command arguments,
174 the response message the reply.
175
176 Some commands use response streaming, that is, a request triggers a series of
177 events to consecutively stream data to the client before the response message
178 completes the stream. A client must register for the appropriate event to
179 receive the stream, and unregister after the response has been received.
180
181 The following client issued commands with the appropriate command input and
182 output messages are currently defined:
183
184 ### version() ###
185
186 Returns daemon and system specific version information.
187
188         {} => {
189                 daemon = <IKE daemon name>
190                 version = <strongSwan version>
191                 sysname = <operating system name>
192                 release = <operating system release>
193                 machine = <hardware identifier>
194         }
195
196 ### stats() ###
197
198 Returns IKE daemon statistics and load information.
199
200         {} => {
201                 uptime = {
202                         running = <relative uptime in human-readable form>
203                         since = <absolute startup time>
204                 }
205                 workers = {
206                         total = <total number of worker threads>
207                         idle = <worker threads currently idle>
208                         active = {
209                                 critical = <threads processing "critical" priority jobs>
210                                 high = <threads processing "high" priority jobs>
211                                 medium = <threads processing "medium" priority jobs>
212                                 low = <threads processing "low" priority jobs>
213                         }
214                 }
215                 queues = {
216                         critical = <jobs queued with "critical" priority>
217                         high = <jobs queued with "high" priority>
218                         medium = <jobs queued with "medium" priority>
219                         low = <jobs queued with "low" priority>
220                 }
221                 scheduled = <number of jobs scheduled for timed execution>
222                 ikesas = {
223                         total = <total number of IKE_SAs active>
224                         half-open = <number of IKE_SAs in half-open state>
225                 }
226                 plugins = [
227                         <names of loaded plugins>
228                 ]
229                 mem = { # available if built with leak-detective or on Windows
230                         total = <total heap memory usage in bytes>
231                         allocs = <total heap allocation blocks>
232                         <heap-name>* = { # on Windows only
233                                 total = <heap memory usage in bytes by this heap>
234                                 allocs = <allocated blocks for this heap>
235                         }
236                 }
237                 mallinfo = { # available with mallinfo() support
238                         sbrk = <non-mmaped space available>
239                         mmap = <mmaped space available>
240                         used = <total number of bytes used>
241                         free = <available but unused bytes>
242                 }
243         }
244
245 ### reload-settings() ###
246
247 Reloads _strongswan.conf_ settings and all plugins supporting configuration
248 reload.
249
250         {} => {
251                 success = <yes or no>
252                 errmsg = <error string on failure>
253         }
254
255 ### initiate() ###
256
257 Initiates an SA while streaming _control-log_ events.
258
259         {
260                 child = <CHILD_SA configuration name to initiate>
261                 timeout = <timeout in seconds before returning>
262                 init-limits = <whether limits may prevent initiating the CHILD_SA>
263                 loglevel = <loglevel to issue "control-log" events for>
264         } => {
265                 success = <yes or no>
266                 errmsg = <error string on failure or timeout>
267         }
268
269 ### terminate() ###
270
271 Terminates an SA while streaming _control-log_ events.
272
273         {
274                 child = <terminate a CHILD_SA by configuration name>
275                 ike = <terminate an IKE_SA by configuration name>
276                 child_id = <terminate a CHILD_SA by its reqid>
277                 ike_id = <terminate an IKE_SA by its unique id>
278                 timeout = <timeout in seconds before returning>
279                 loglevel = <loglevel to issue "control-log" events for>
280         } => {
281                 success = <yes or no>
282                 errmsg = <error string on failure or timeout>
283         }
284
285 ### install() ###
286
287 Install a trap, drop or bypass policy defined by a CHILD_SA config.
288
289         {
290                 child = <CHILD_SA configuration name to install>
291         } => {
292                 success = <yes or no>
293                 errmsg = <error string on failure>
294         }
295
296 ### uninstall() ###
297
298 Uninstall a trap, drop or bypass policy defined by a CHILD_SA config.
299
300         {
301                 child = <CHILD_SA configuration name to install>
302         } => {
303                 success = <yes or no>
304                 errmsg = <error string on failure>
305         }
306
307 ### list-sas() ###
308
309 Lists currently active IKE_SAs and associated CHILD_SAs by streaming _list-sa_
310 events.
311
312         {
313                 noblock = <use non-blocking mode if key is set>
314                 ike = <filter listed IKE_SAs by its name>
315                 ike_id = <filter listed IKE_SA by its unique id>
316         } => {
317                 # completes after streaming list-sa events
318         }
319
320 ### list-policies() ###
321
322 List currently installed trap, drop and bypass policies by streaming
323 _list-policy_ events.
324
325         {
326                 drop = <set to yes to list drop policies>
327                 pass = <set to yes to list bypass policies>
328                 trap = <set to yes to list trap policies>
329                 child = <filter by CHILD_SA configuration name>
330         } => {
331                 # completes after streaming list-sa events
332         }
333
334 ### list-conns() ###
335
336 List currently loaded connections by streaming _list-conn_ events. This
337 call includes all connections known by the daemon, not only those loaded
338 over vici.
339
340         {
341                 ike = <list connections matching a given configuration name only>
342         } => {
343                 # completes after streaming list-conn events
344         }
345
346 ### get-conns() ###
347
348 Return a list of connection names loaded exclusively over vici, not including
349 connections found in other backends.
350
351         {} => {
352                 conns = [
353                         <list of connection names>
354                 ]
355         }
356
357 ### list-certs() ###
358
359 List currently loaded certificates by streaming _list-cert_ events. This
360 call includes all certificates known by the daemon, not only those loaded
361 over vici.
362
363         {
364                 type = <certificate type to filter for, or ANY>
365                 subject = <set to list only certificates having subject>
366         } => {
367                 # completes after streaming list-cert events
368         }
369
370 ### list-authorities() ###
371
372 List currently loaded certification authority information by streaming
373 _list-authority_ events.
374
375         {
376                 name = <list certification authority of a given name>
377         } => {
378                 # completes after streaming list-authority events
379         }
380
381 ### get-authorities() ###
382
383 Return a list of currently loaded certification authority names.
384
385         {} => {
386                 authorities = [
387                         <list of certification authority names>
388                 ]
389         }
390
391 ### load-conn() ###
392
393 Load a single connection definition into the daemon. An existing connection
394 with the same name gets updated or replaced.
395
396         {
397                 <IKE_SA config name> = {
398                         # IKE configuration parameters with authentication and CHILD_SA
399                         # subsections. Refer to swanctl.conf(5) for details.
400                 } => {
401                         success = <yes or no>
402                         errmsg = <error string on failure>
403                 }
404         }
405
406 ### unload-conn() ###
407
408 Unload a previously loaded connection definition by name.
409
410         {
411                 name = <IKE_SA config name>
412         } => {
413                 success = <yes or no>
414                 errmsg = <error string on failure>
415         }
416
417 ### load-cert() ###
418
419 Load a certificate into the daemon.
420
421         {
422                 type = <certificate type, X509|X509CA|X509AA|X509CRL|X509AC>
423                 data = <PEM or DER encoded certificate data>
424         } => {
425                 success = <yes or no>
426                 errmsg = <error string on failure>
427         }
428
429 ### load-key() ###
430
431 Load a private key into the daemon.
432
433         {
434                 type = <private key type, RSA|ECDSA>
435                 data = <PEM or DER encoded key data>
436         } => {
437                 success = <yes or no>
438                 errmsg = <error string on failure>
439         }
440
441 ### load-shared() ###
442
443 Load a shared IKE PSK, EAP or XAuth secret into the daemon.
444
445         {
446                 type = <private key type, IKE|EAP|XAUTH>
447                 data = <raw shared key data>
448                 owners = [
449                         <list of shared key owner identities>
450                 ]
451         } => {
452                 success = <yes or no>
453                 errmsg = <error string on failure>
454         }
455
456 ### clear-creds() ###
457
458 Clear all loaded certificate, private key and shared key credentials. This
459 affects only credentials loaded over vici, but additionally flushes the
460 credential cache.
461
462         {} => {
463                 success = <yes or no>
464                 errmsg = <error string on failure>
465         }
466
467 ### load-authority() ###
468
469 Load a single certification authority definition into the daemon. An existing
470 authority with the same name gets replaced.
471
472         {
473                 <certification authority name> = {
474                         # certification authority parameters
475                         # refer to swanctl.conf(5) for details.
476                 } => {
477                         success = <yes or no>
478                         errmsg = <error string on failure>
479                 }
480         }
481
482 ### unload-authority() ###
483
484 Unload a previously loaded certification authority definition by name.
485
486         {
487                 name = <certification authority name>
488         } => {
489                 success = <yes or no>
490                 errmsg = <error string on failure>
491         }
492
493 ### load-pool() ###
494
495 Load an in-memory virtual IP and configuration attribute pool. Existing
496 pools with the same name get updated, if possible.
497
498         {
499                 <pool name> = {
500                         addrs = <subnet of virtual IP pool addresses>
501                         <attribute type>* = [
502                                 # attribute type is one of address, dns, nbns, dhcp, netmask,
503                                 # server, subnet, split_include, split_exclude or a numerical
504                                 # attribute type identifier.
505                                 <list of attributes for type>
506                         ]
507                 }
508         } => {
509                 success = <yes or no>
510                 errmsg = <error string on failure>
511         }
512
513 ### unload-pool() ###
514
515 Unload a previously loaded virtual IP and configuration attribute pool.
516 Unloading fails for pools with leases currently online.
517
518         {
519                 name = <virtual IP address pool to delete>
520         } => {
521                 success = <yes or no>
522                 errmsg = <error string on failure>
523         }
524
525 ### get-pools() ###
526
527 List the currently loaded pools.
528
529         {
530                 leases = <set to yes to include leases>
531         } => {
532                 <pool name>* = {
533                         base = <virtual IP pool base address>
534                         size = <total number of addresses in the pool>
535                         online = <number of leases online>
536                         offline = <number of leases offline>
537                         leases = {
538                                 <zero-based index>* = {
539                                         address = <IP address>
540                                         identity = <assigned identity>
541                                         status = <online|offline>
542                                 }
543                         }
544                 }
545         }
546
547 ### get-algorithms() ###
548
549 List currently loaded algorithms and their implementation.
550
551         {} => {
552                 <algorithm type> = {
553                         <algorithm> = <plugin providing the implementation>
554                 }
555         }
556
557 ## Server-issued events ##
558
559 Based on the packet layer, the vici plugin raises event messages using named
560 EVENT packets wrapping messages. The message contains event details.
561
562 ### log ###
563
564 The _log_ event is issued to registered clients for each debug log message.
565 This event is not associated with a command.
566
567         {
568                 group = <subsystem identifier for debug message>
569                 level = <log level, 0-4>
570                 thread = <numerical thread identifier issuing the log message>
571                 ikesa-name = <name of IKE_SA, if log is associated with any>
572                 ikesa-uniqued = <unique identifier of IKE_A, if log associated with any>
573                 msg = <log message text>
574         }
575
576 ### control-log ###
577
578 The _control-log_ event is issued for log events during active _initiate_ or
579 _terminate_ commands. It is issued only to clients currently having such
580 a command active.
581
582         {
583                 group = <subsystem identifier for debug message>
584                 level = <log level, 0-4>
585                 ikesa-name = <name of IKE_SA, if log associated with any>
586                 ikesa-uniqued = <unique identifier of IKE_A, if log associated with any>
587                 msg = <log message text>
588         }
589
590 ### list-sa ###
591
592 The _list-sa_ event is issued to stream IKE_SAs during an active _list-sas_
593 command.
594
595         {
596                 <IKE_SA config name> = {
597                         uniqueid = <IKE_SA unique identifier>
598                         version = <IKE version, 1 or 2>
599                         state = <IKE_SA state name>
600                         local-host = <local IKE endpoint address>
601                         local-id = <local IKE identity>
602                         remote-host = <remote IKE endpoint address>
603                         remote-id = <remote IKE identity>
604                         remote-xauth-id = <remote XAuth identity, if XAuth-authenticated>
605                         remote-eap-id = <remote EAP identity, if EAP-authenticated>
606                         initiator = <yes, if initiator of IKE_SA>
607                         initiator-spi = <hex encoded initiator SPI / cookie>
608                         responder-spi = <hex encoded responder SPI / cookie>
609                         nat-local = <yes, if local endpoint is behind a NAT>
610                         nat-remote = <yes, if remote endpoint is behind a NAT>
611                         nat-fake = <yes, if NAT situation has been faked as responder>
612                         nat-any = <yes, if any endpoint is behind a NAT (also if faked)>
613                         encr-alg = <IKE encryption algorithm string>
614                         encr-keysize = <key size for encr-alg, if applicable>
615                         integ-alg = <IKE integrity algorithm string>
616                         integ-keysize = <key size for encr-alg, if applicable>
617                         prf-alg = <IKE pseudo random function string>
618                         dh-group = <IKE Diffie-Hellman group string>
619                         established = <seconds the IKE_SA has been established>
620                         rekey-time = <seconds before IKE_SA gets rekeyed>
621                         reauth-time = <seconds before IKE_SA gets re-authenticated>
622                         local-vips = [
623                                 <list of virtual IPs assigned by the remote peer, installed locally>
624                         ]
625                         remote-vips = [
626                                 <list of virtual IPs assigned to the remote peer>
627                         ]
628                         tasks-queued = [
629                                 <list of currently queued tasks for execution>
630                         ]
631                         tasks-active = [
632                                 <list of tasks currently initiating actively>
633                         ]
634                         tasks-passive = [
635                                 <list of tasks currently handling passively>
636                         ]
637                         child-sas = {
638                                 <child-sa-name>* = {
639                                         uniqueid = <unique CHILD_SA identifier>
640                                         reqid = <reqid of CHILD_SA>
641                                         state = <state string of CHILD_SA>
642                                         mode = <IPsec mode, tunnel|transport|beet>
643                                         protocol = <IPsec protocol AH|ESP>
644                                         encap = <yes if using UDP encapsulation>
645                                         spi-in = <hex encoded inbound SPI>
646                                         spi-out = <hex encoded outbound SPI>
647                                         cpi-in = <hex encoded inbound CPI, if using compression>
648                                         cpi-out = <hex encoded outbound CPI, if using compression>
649                                         encr-alg = <ESP encryption algorithm name, if any>
650                                         encr-keysize = <ESP encryption key size, if applicable>
651                                         integ-alg = <ESP or AH integrity algorithm name, if any>
652                                         integ-keysize = <ESP or AH integrity key size, if applicable>
653                                         prf-alg = <CHILD_SA pseudo random function name>
654                                         dh-group = <CHILD_SA PFS rekeying DH group name, if any>
655                                         esn = <1 if using extended sequence numbers>
656                                         bytes-in = <number of input bytes processed>
657                                         packets-in = <number of input packets processed>
658                                         use-in = <seconds since last inbound packet, if any>
659                                         bytes-out = <number of output bytes processed>
660                                         packets-out = <number of output packets processed>
661                                         use-out = <seconds since last outbound packet, if any>
662                                         rekey-time = <seconds before CHILD_SA gets rekeyed>
663                                         life-time = <seconds before CHILD_SA expires>
664                                         install-time = <seconds the CHILD_SA has been installed>
665                                         local-ts = [
666                                                 <list of local traffic selectors>
667                                         ]
668                                         remote-ts = [
669                                                 <list of remote traffic selectors>
670                                         ]
671                                 }
672                         }
673                 }
674         }
675
676 ### list-policy ###
677
678 The _list-policy_ event is issued to stream installed policies during an active
679 _list-policies_ command.
680
681         {
682                 <child-sa-config-name> = {
683                         mode = <policy mode, tunnel|transport|pass|drop>
684                         local-ts = [
685                                 <list of local traffic selectors>
686                         ]
687                         remote-ts = [
688                                 <list of remote traffic selectors>
689                         ]
690                 }
691         }
692
693 ### list-conn ###
694
695 The _list-conn_ event is issued to stream loaded connection during an active
696 _list-conns_ command.
697
698         {
699                 <IKE_SA connection name> = {
700                         local_addrs = [
701                                 <list of valid local IKE endpoint addresses>
702                         ]
703                         remote_addrs = [
704                                 <list of valid remote IKE endpoint addresses>
705                         ]
706                         version = <IKE version as string, IKEv1|IKEv2 or 0 for any>
707
708                         local*, remote* = { # multiple local and remote auth sections
709                                 class = <authentication type>
710                                 eap-type = <EAP type to authenticate if when using EAP>
711                                 eap-vendor = <EAP vendor for type, if any>
712                                 xauth = <xauth backend name>
713                                 revocation = <revocation policy>
714                                 id = <IKE identity>
715                                 aaa_id = <AAA authentication backend identity>
716                                 eap_id = <EAP identity for authentication>
717                                 xauth_id = <XAuth username for authentication>
718                                 groups = [
719                                         <group membership required to use connection>
720                                 ]
721                                 certs = [
722                                         <certificates allowed for authentication>
723                                 ]
724                                 cacerts = [
725                                         <CA certificates allowed for authentication>
726                                 ]
727                         }
728                         children = {
729                                 <CHILD_SA config name>* = {
730                                         mode = <IPsec mode>
731                                         local-ts = [
732                                                 <list of local traffic selectors>
733                                         ]
734                                         remote-ts = [
735                                                 <list of remote traffic selectors>
736                                         ]
737                                 }
738                         }
739                 }
740         }
741
742 ### list-cert ###
743
744 The _list-cert_ event is issued to stream loaded certificates during an active
745 _list-certs_ command.
746
747         {
748                 type = <certificate type>
749                 has_privkey = <set if a private key for the certificate is available>
750                 data = <ASN1 encoded certificate data>
751         }
752
753 ### list-authority ###
754
755 The _list-authority_ event is issued to stream loaded certification authority
756 information during an active_list-authorities_ command.
757
758         {
759                 <certification authority name> = {
760                         cacert = <subject distinguished name of CA certificate>
761                         crl_uris = [
762                                 <CRL URI (http, ldap or file)>
763                         ]
764                         ocsp_uris = [
765                                 <OCSP URI (http)>
766                         ]
767                         cert_uri_base = <base URI for download of hash-and-URL certificates>
768                 }
769         }
770
771 ### ike-updown ###
772
773 The _ike-updown_ event is issued when an IKE_SA is established or terminated.
774
775         {
776                 up = <yes or no>
777                 <IKE_SA config name> = {
778                         <same data as in the list-sas event, but without child-sas section>
779                 }
780         }
781
782 ### ike-rekey ###
783
784 The _ike-rekey_ event is issued when an IKE_SA is rekeyed.
785
786         {
787                 <IKE_SA config name> = {
788                         old = {
789                                 <same data as in the list-sas event, but without child-sas section>
790                         }
791                         new = {
792                                 <same data as in the list-sas event, but without child-sas section>
793                         }
794                 }
795         }
796
797 ### child-updown ###
798
799 The _child-updown_ event is issued when a CHILD_SA is established or terminated.
800
801         {
802                 up = <yes or no>
803                 <IKE_SA config name> = {
804                         <same data as in the list-sas event, but with only the affected
805                          CHILD_SA in the child-sas section>
806                 }
807         }
808
809 ### child-rekey ###
810
811 The _child-rekey_ event is issued when a CHILD_SA is rekeyed.
812
813         {
814                 <IKE_SA config name> = {
815                         <same data as in the list-sas event, but with the child-sas section
816                          as follows>
817                         child-sas = {
818                                 <child-sa-name> = {
819                                         old = {
820                                                 <same data as in the list-sas event>
821                                         }
822                                         new = {
823                                                 <same data as in the list-sas event>
824                                         }
825                                 }
826                         }
827                 }
828         }
829
830 # libvici C client library #
831
832 libvici is the reference implementation of a C client library implementing
833 the vici protocol. It builds upon libstrongswan, but provides a stable API
834 to implement client applications in the C programming language. libvici uses
835 the libstrongswan thread pool to deliver event messages asynchronously.
836
837 ## Connecting to the daemon ##
838
839 This example shows how to connect to the daemon using the default URI, and
840 then perform proper cleanup:
841
842         #include <stdio.h>
843         #include <errno.h>
844         #include <string.h>
845
846         #include <libvici.h>
847
848         int main(int argc, char *argv[])
849         {
850                 vici_conn_t *conn;
851                 int ret = 0;
852
853                 vici_init();
854                 conn = vici_connect(NULL);
855                 if (conn)
856                 {
857                         /* do stuff */
858                         vici_disconnect(conn);
859                 }
860                 else
861                 {
862                         ret = errno;
863                         fprintf(stderr, "connecting failed: %s\n", strerror(errno));
864                 }
865                 vici_deinit();
866                 return ret;
867         }
868
869 ## A simple client request ##
870
871 In the following example, a simple _version_ request is issued to the daemon
872 and the result is printed:
873
874         int get_version(vici_conn_t *conn)
875         {
876                 vici_req_t *req;
877                 vici_res_t *res;
878                 int ret = 0;
879
880                 req = vici_begin("version");
881                 res = vici_submit(req, conn);
882                 if (res)
883                 {
884                         printf("%s %s (%s, %s, %s)\n",
885                                 vici_find_str(res, "", "daemon"),
886                                 vici_find_str(res, "", "version"),
887                                 vici_find_str(res, "", "sysname"),
888                                 vici_find_str(res, "", "release"),
889                                 vici_find_str(res, "", "machine"));
890                         vici_free_res(res);
891                 }
892                 else
893                 {
894                         ret = errno;
895                         fprintf(stderr, "version request failed: %s\n", strerror(errno));
896                 }
897                 return ret;
898         }
899
900 ## A request with event streaming and callback parsing ##
901
902 In this more advanced example, the _list-conns_ command is used to stream
903 loaded connections with the _list-conn_ event. The event message is parsed
904 with a simple callback to print the connection name:
905
906         int conn_cb(void *null, vici_res_t *res, char *name)
907         {
908                 printf("%s\n", name);
909                 return 0;
910         }
911
912         void list_cb(void *null, char *name, vici_res_t *res)
913         {
914                 if (vici_parse_cb(res, conn_cb, NULL, NULL, NULL) != 0)
915                 {
916                         fprintf(stderr, "parsing failed: %s\n", strerror(errno));
917                 }
918         }
919
920         int list_conns(vici_conn_t *conn)
921         {
922                 vici_req_t *req;
923                 vici_res_t *res;
924                 int ret = 0;
925
926                 if (vici_register(conn, "list-conn", list_cb, NULL) == 0)
927                 {
928                         req = vici_begin("list-conns");
929                         res = vici_submit(req, conn);
930                         if (res)
931                         {
932                                 vici_free_res(res);
933                         }
934                         else
935                         {
936                                 ret = errno;
937                                 fprintf(stderr, "request failed: %s\n", strerror(errno));
938                         }
939                         vici_register(conn, "list-conn", NULL, NULL);
940                 }
941                 else
942                 {
943                         ret = errno;
944                         fprintf(stderr, "registration failed: %s\n", strerror(errno));
945                 }
946                 return ret;
947         }
948
949 ## API documentation ##
950
951 More information about the libvici API is available in the _libvici.h_ header
952 file or the generated Doxygen documentation.
953
954 # vici ruby gem #
955
956 The _vici ruby gem_ is a pure ruby implementation of the VICI protocol to
957 implement client applications. It is provided in the _ruby_ subdirectory, and
958 gets built and installed if strongSwan has been _./configure_'d with
959 _--enable-vici_ and _--enable-ruby-gems_.
960
961 The _Connection_ class from the _Vici_ module provides the high level interface,
962 the underlying classes are usually not required to build ruby applications
963 using VICI. The _Connection_ class provides methods for the supported VICI
964 commands and an event listening mechanism.
965
966 To represent the VICI message data tree, the gem converts the binary encoding
967 to ruby data types. The _Connection_ class takes and returns ruby objects for
968 the exchanged message data:
969  * Sections get encoded as Hash, containing other sections as Hash, or
970  * Key/Values, where the values are Strings as Hash values
971  * Lists get encoded as Arrays with String values
972 Non-String values that are not a Hash nor an Array get converted with .to_s
973 during encoding.
974
975 ## Connecting to the daemon ##
976
977 To create a connection to the daemon, a socket can be passed to the
978 _Connection_ constructor. If none is passed, a default Unix socket at
979 _/var/run/charon.vici_ is used:
980
981         require "vici"
982         require "socket"
983
984         v = Vici::Connection.new(UNIXSocket.new("/var/run/charon.vici"))
985
986 ## A simple client request ##
987
988 An example to print the daemon version information is as simple as:
989
990         x = v.version
991         puts "%s %s (%s, %s, %s)" % [
992                 x["daemon"], x["version"], x["sysname"], x["release"], x["machine"]
993         ]
994
995 ## A request with closure invocation ##
996
997 The _Connection_ class takes care of event streaming by invoking a closure
998 for each event. The following example lists all loaded connections using the
999 _list-conns_ command and implicitly the _list-conn_ event:
1000
1001         v.list_conns { |conn|
1002                 conn.each { |key, value|
1003                         puts key
1004                 }
1005         }
1006
1007 ## API documentation ##
1008
1009 For more details about the ruby gem refer to the comments in the gem source
1010 code or the generated documentation.
1011
1012 # vici Python egg #
1013
1014 The _vici Python egg_ is a pure Python implementation of the VICI protocol to
1015 implement client applications. It is provided in the _python_ subdirectory, and
1016 gets built and installed if strongSwan has been _./configure_'d with
1017 _--enable-vici_ and _--enable-python-eggs_.
1018
1019 The _vici_ module provides a _Session()_ constructor for a high level interface,
1020 the underlying classes are usually not required to build Python applications
1021 using VICI. The _Session_ class provides methods for the supported VICI
1022 commands.
1023
1024 To represent the VICI message data tree, the library converts the binary
1025 encoding to Python data types. The _Session_ class takes and returns Python
1026 objects for the exchanged message data:
1027  * Sections get encoded as OrderedDict, containing other sections, or
1028  * Key/Values, where the values are strings as dictionary values
1029  * Lists get encoded as Python Lists with string values
1030 Values that do not conform to Python dict or list get converted to strings using
1031 str().
1032
1033 ## Connecting to the daemon ##
1034
1035 To create a connection to the daemon, a socket can be passed to the _Session_
1036 constructor. If none is passed, a default Unix socket at _/var/run/charon.vici_
1037 is used:
1038
1039         import vici
1040         import socket
1041
1042         s = socket.socket(socket.AF_UNIX)
1043         s.connect("/var/run/charon.vici")
1044         v = vici.Session(s)
1045
1046 ## A simple client request ##
1047
1048 An example to print the daemon version information is as simple as:
1049
1050         ver = v.version()
1051
1052         print "{daemon} {version} ({sysname}, {release}, {machine})".format(**ver)
1053
1054 ## A request with response iteration ##
1055
1056 The _Session_ class returns an iterable Python generator for streamed events to
1057 continuously stream objects to the caller. The following example lists all
1058 loaded connections using the _list-conns_ command and implicitly the _list-conn_
1059 event:
1060
1061         for conn in v.list_conns():
1062                 for key in conn:
1063                         print key
1064
1065 Please note that if the returned generator is not iterated completely, it must
1066 be closed using _close()_. This is implicitly done when breaking from a loop,
1067 but an explicit call may be required when directly iterating the generator with
1068 _next()_.
1069
1070 ## Sorting in dictionaries ##
1071
1072 In VICI, in some message trees the order of objects in dictionary matters. In
1073 contrast to ruby Hashes, Python dictionaries do not preserve order of added
1074 objects. It is therefore recommended to use OrderedDicts instead of the default
1075 dictionaries. Objects returned by the library use OrderedDicts.
1076
1077 ## API documentation ##
1078
1079 For more details about the Python egg refer to the comments in the Python source
1080 code.