Merge branch 'vici-ruby'
[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                 2, 4,'k','e','y','1', 0,6,'v','a','l','u','e','1',
149                 /* section1 */
150                 0, 8,'s','e','c','t','i','o','n','1',
151                 /* sub-section */
152                 0, 11,'s','u','b','-','s','e','c','t','i','o','n',
153                 /* key2 = value2 */
154                 2, 4,'k','e','y','2', 0,6,'v','a','l','u','e','2',
155                 /* sub-section end */
156                 1,
157                 /* list1 */
158                 3, 5, 'l','i','s','t','1',
159                 /* item1 */
160                 4, 0,5,'i','t','e','m','1',
161                 /* item2 */
162                 4, 0,5,'i','t','e','m','2',
163                 /* list1 end */
164                 5,
165                 /* section1 end */
166                 1,
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                 loglevel = <loglevel to issue "control-log" events for>
263         } => {
264                 success = <yes or no>
265                 errmsg = <error string on failure or timeout>
266         }
267
268 ### terminate() ###
269
270 Terminates an SA while streaming _control-log_ events.
271
272         {
273                 child = <terminate a CHILD_SA by configuration name>
274                 ike = <terminate an IKE_SA by configuration name>
275                 child_id = <terminate a CHILD_SA by its reqid>
276                 ike_id = <terminate an IKE_SA by its unique id>
277                 timeout = <timeout in seconds before returning>
278                 loglevel = <loglevel to issue "control-log" events for>
279         } => {
280                 success = <yes or no>
281                 errmsg = <error string on failure or timeout>
282         }
283
284 ### install() ###
285
286 Install a trap, drop or bypass policy defined by a CHILD_SA config.
287
288         {
289                 child = <CHILD_SA configuration name to install>
290         } => {
291                 success = <yes or no>
292                 errmsg = <error string on failure>
293         }
294
295 ### uninstall() ###
296
297 Uninstall a trap, drop or bypass policy defined by a CHILD_SA config.
298
299         {
300                 child = <CHILD_SA configuration name to install>
301         } => {
302                 success = <yes or no>
303                 errmsg = <error string on failure>
304         }
305
306 ### list-sas() ###
307
308 Lists currently active IKE_SAs and associated CHILD_SAs by streaming _list-sa_
309 events.
310
311         {
312                 noblock = <use non-blocking mode if key is set>
313                 ike = <filter listed IKE_SAs by its name>
314                 ike_id = <filter listed IKE_SA by its unique id>
315         } => {
316                 # completes after streaming list-sa events
317         }
318
319 ### list-policies() ###
320
321 List currently installed trap, drop and bypass policies by streaming
322 _list-policy_ events.
323
324         {
325                 drop = <set to yes to list drop policies>
326                 pass = <set to yes to list bypass policies>
327                 trap = <set to yes to list trap policies>
328                 child = <filter by CHILD_SA configuration name>
329         } => {
330                 # completes after streaming list-sa events
331         }
332
333 ### list-conns() ###
334
335 List currently loaded connections by streaming _list-conn_ events. This
336 call includes all connections known by the daemon, not only those loaded
337 over vici.
338
339         {
340                 ike = <list connections matching a given configuration name only>
341         } => {
342                 # completes after streaming list-conn events
343         }
344
345 ### get-conns() ###
346
347 Return a list of connection names loaded exclusively over vici, not including
348 connections found in other backends.
349
350         {} => {
351                 conns = [
352                         <list of connection names>
353                 ]
354         }
355
356 ### list-certs() ###
357
358 List currently loaded certificates by streaming _list-cert_ events. This
359 call includes all certificates known by the daemon, not only those loaded
360 over vici.
361
362         {
363                 type = <certificate type to filter for, or ANY>
364                 subject = <set to list only certificates having subject>
365         } => {
366                 # completes after streaming list-cert events
367         }
368
369 ### load-conn() ###
370
371 Load a single connection definition into the daemon. An existing connection
372 with the same name gets updated or replaced.
373
374         {
375                 <IKE_SA config name> = {
376                         # IKE configuration parameters with authentication and CHILD_SA
377                         # subsections. Refer to swanctl.conf(5) for details.
378                 } => {
379                         success = <yes or no>
380                         errmsg = <error string on failure>
381                 }
382         }
383
384 ### unload-conn() ###
385
386 Unload a previously loaded connection definition by name.
387
388         {
389                 name = <IKE_SA config name>
390         } => {
391                 success = <yes or no>
392                 errmsg = <error string on failure>
393         }
394
395 ### load-cert() ###
396
397 Load a certificate into the daemon.
398
399         {
400                 type = <certificate type, X509|X509CA|X509AA|X509CRL|X509AC>
401                 data = <PEM or DER encoded certificate data>
402         } => {
403                 success = <yes or no>
404                 errmsg = <error string on failure>
405         }
406
407 ### load-key() ###
408
409 Load a private key into the daemon.
410
411         {
412                 type = <private key type, RSA|ECDSA>
413                 data = <PEM or DER encoded key data>
414         } => {
415                 success = <yes or no>
416                 errmsg = <error string on failure>
417         }
418
419 ### load-shared() ###
420
421 Load a shared IKE PSK, EAP or XAuth secret into the daemon.
422
423         {
424                 type = <private key type, IKE|EAP|XAUTH>
425                 data = <raw shared key data>
426                 owners = [
427                         <list of shared key owner identities>
428                 ]
429         } => {
430                 success = <yes or no>
431                 errmsg = <error string on failure>
432         }
433
434 ### clear-creds() ###
435
436 Clear all loaded certificate, private key and shared key credentials. This
437 affects only credentials loaded over vici, but additionally flushes the
438 credential cache.
439
440         {} => {
441                 success = <yes or no>
442                 errmsg = <error string on failure>
443         }
444
445 ### load-pool() ###
446
447 Load an in-memory virtual IP and configuration attribute pool. Existing
448 pools with the same name get updated, if possible.
449
450         {
451                 <pool name> = {
452                         addrs = <subnet of virtual IP pool addresses>
453                         <attribute type>* = [
454                                 # attribute type is one of address, dns, nbns, dhcp, netmask,
455                                 # server, subnet, split_include, split_exclude or a numerical
456                                 # attribute type identifier.
457                                 <list of attributes for type>
458                         ]
459                 }
460         } => {
461                 success = <yes or no>
462                 errmsg = <error string on failure>
463         }
464
465 ### unload-pool() ###
466
467 Unload a previously loaded virtual IP and configuration attribute pool.
468 Unloading fails for pools with leases currently online.
469
470         {
471                 name = <virtual IP address pool to delete>
472         } => {
473                 success = <yes or no>
474                 errmsg = <error string on failure>
475         }
476
477 ### get-pools() ###
478
479 List the currently loaded pools.
480
481         {} => {
482                 <pool name>* = {
483                         base = <virtual IP pool base address>
484                         size = <total number of addresses in the pool>
485                         online = <number of leases online>
486                         offline = <number of leases offline>
487                 }
488         }
489
490 ## Server-issued events ##
491
492 Based on the packet layer, the vici plugin raises event messages using named
493 EVENT packets wrapping messages. The message contains event details.
494
495 ### log ###
496
497 The _log_ event is issued to registered clients for each debug log message.
498 This event is not associated with a command.
499
500         {
501                 group = <subsystem identifier for debug message>
502                 level = <log level, 0-4>
503                 thread = <numerical thread identifier issuing the log message>
504                 ikesa-name = <name of IKE_SA, if log is associated with any>
505                 ikesa-uniqued = <unique identifier of IKE_A, if log associated with any>
506                 msg = <log message text>
507         }
508
509 ### control-log ###
510
511 The _control-log_ event is issued for log events during active _initiate_ or
512 _terminate_ commands. It is issued only to clients currently having such
513 a command active.
514
515         {
516                 group = <subsystem identifier for debug message>
517                 level = <log level, 0-4>
518                 ikesa-name = <name of IKE_SA, if log associated with any>
519                 ikesa-uniqued = <unique identifier of IKE_A, if log associated with any>
520                 msg = <log message text>
521         }
522
523 ### list-sa ###
524
525 The _list-sa_ event is issued to stream IKE_SAs during an active _list-sas_
526 command.
527
528         {
529                 <IKE_SA config name> = {
530                         uniqueid = <IKE_SA unique identifier>
531                         version = <IKE version, 1 or 2>
532                         state = <IKE_SA state name>
533                         local-host = <local IKE endpoint address>
534                         local-id = <local IKE identity>
535                         remote-host = <remote IKE endpoint address>
536                         remote-id = <remote IKE identity>
537                         remote-xauth-id = <remote XAuth identity, if XAuth-authenticated>
538                         remote-eap-id = <remote EAP identity, if EAP-authenticated>
539                         initiator = <yes, if initiator of IKE_SA>
540                         initiator-spi = <hex encoded initiator SPI / cookie>
541                         responder-spi = <hex encoded responder SPI / cookie>
542                         encr-alg = <IKE encryption algorithm string>
543                         encr-keysize = <key size for encr-alg, if applicable>
544                         integ-alg = <IKE integrity algorithm string>
545                         integ-keysize = <key size for encr-alg, if applicable>
546                         prf-alg = <IKE pseudo random function string>
547                         dh-group = <IKE Diffie-Hellman group string>
548                         established = <seconds the IKE_SA has been established>
549                         rekey-time = <seconds before IKE_SA gets rekeyed>
550                         reauth-time = <seconds before IKE_SA gets re-authenticated>
551                         tasks-queued = [
552                                 <list of currently queued tasks for execution>
553                         ]
554                         tasks-active = [
555                                 <list of tasks currently initiating actively>
556                         ]
557                         tasks-passive = [
558                                 <list of tasks currently handling passively>
559                         ]
560                         child-sas = {
561                                 <child-sa-name>* = {
562                                         reqid = <reqid of CHILD_SA>
563                                         state = <state string of CHILD_SA>
564                                         mode = <IPsec mode, tunnel|transport|beet>
565                                         protocol = <IPsec protocol AH|ESP>
566                                         encap = <yes if using UDP encapsulation>
567                                         spi-in = <hex encoded inbound SPI>
568                                         spi-out = <hex encoded outbound SPI>
569                                         cpi-in = <hex encoded inbound CPI, if using compression>
570                                         cpi-out = <hex encoded outbound CPI, if using compression>
571                                         encr-alg = <ESP encryption algorithm name, if any>
572                                         encr-keysize = <ESP encryption key size, if applicable>
573                                         integ-alg = <ESP or AH integrity algorithm name, if any>
574                                         integ-keysize = <ESP or AH integrity key size, if applicable>
575                                         prf-alg = <CHILD_SA pseudo random function name>
576                                         dh-group = <CHILD_SA PFS rekeying DH group name, if any>
577                                         esn = <1 if using extended sequence numbers>
578                                         bytes-in = <number of input bytes processed>
579                                         packets-in = <number of input packets processed>
580                                         use-in = <seconds since last inbound packet, if any>
581                                         bytes-out = <number of output bytes processed>
582                                         packets-out = <number of output packets processed>
583                                         use-out = <seconds since last outbound packet, if any>
584                                         rekey-time = <seconds before CHILD_SA gets rekeyed>
585                                         life-time = <seconds before CHILD_SA expires>
586                                         install-time = <seconds the CHILD_SA has been installed>
587                                         local-ts = [
588                                                 <list of local traffic selectors>
589                                         ]
590                                         remote-ts = [
591                                                 <list of remote traffic selectors>
592                                         ]
593                                 }
594                         }
595                 }
596         }
597
598 ### list-policy ###
599
600 The _list-policy_ event is issued to stream installed policies during an active
601 _list-policies_ command.
602
603         {
604                 <child-sa-config-name> = {
605                         mode = <policy mode, tunnel|transport|pass|drop>
606                         local-ts = [
607                                 <list of local traffic selectors>
608                         ]
609                         remote-ts = [
610                                 <list of remote traffic selectors>
611                         ]
612                 }
613         }
614
615 ### list-conn ###
616
617 The _list-conn_ event is issued to stream loaded connection during an active
618 _list-conns_ command.
619
620         {
621                 <IKE_SA connection name> = {
622                         local_addrs = [
623                                 <list of valid local IKE endpoint addresses>
624                         ]
625                         remote_addrs = [
626                                 <list of valid remote IKE endpoint addresses>
627                         ]
628                         version = <IKE version as string, IKEv1|IKEv2 or 0 for any>
629
630                         local*, remote* = { # multiple local and remote auth sections
631                                 class = <authentication type>
632                                 eap-type = <EAP type to authenticate if when using EAP>
633                                 eap-vendor = <EAP vendor for type, if any>
634                                 xauth = <xauth backend name>
635                                 revocation = <revocation policy>
636                                 id = <IKE identity>
637                                 aaa_id = <AAA authentication backend identity>
638                                 eap_id = <EAP identity for authentication>
639                                 xauth_id = <XAuth username for authentication>
640                                 groups = [
641                                         <group membership required to use connection>
642                                 ]
643                                 certs = [
644                                         <certificates allowed for authentication>
645                                 ]
646                                 cacerts = [
647                                         <CA certificates allowed for authentication>
648                                 ]
649                         }
650                         children = {
651                                 <CHILD_SA config name>* = {
652                                         mode = <IPsec mode>
653                                         local-ts = [
654                                                 <list of local traffic selectors>
655                                         ]
656                                         remote-ts = [
657                                                 <list of remote traffic selectors>
658                                         ]
659                                 }
660                         }
661                 }
662         }
663
664 ### list-cert ###
665
666 The _list-cert_ event is issued to stream loaded certificates during an active
667 _list-certs_ command.
668
669         {
670                 type = <certificate type>
671                 has_privkey = <set if a private key for the certificate is available>
672                 data = <ASN1 encoded certificate data>
673         }
674
675
676 # libvici C client library #
677
678 libvici is the reference implementation of a C client library implementing
679 the vici protocol. It builds upon libstrongswan, but provides a stable API
680 to implement client applications in the C programming language. libvici uses
681 the libstrongswan thread pool to deliver event messages asynchronously.
682
683 ## Connecting to the daemon ##
684
685 This example shows how to connect to the daemon using the default URI, and
686 then perform proper cleanup:
687
688         #include <stdio.h>
689         #include <errno.h>
690         #include <string.h>
691
692         #include <libvici.h>
693
694         int main(int argc, char *argv[])
695         {
696                 vici_conn_t *conn;
697                 int ret = 0;
698
699                 vici_init();
700                 conn = vici_connect(NULL);
701                 if (conn)
702                 {
703                         /* do stuff */
704                         vici_disconnect(conn);
705                 }
706                 else
707                 {
708                         ret = errno;
709                         fprintf(stderr, "connecting failed: %s\n", strerror(errno));
710                 }
711                 vici_deinit();
712                 return ret;
713         }
714
715 ## A simple client request ##
716
717 In the following example, a simple _version_ request is issued to the daemon
718 and the result is printed:
719
720         int get_version(vici_conn_t *conn)
721         {
722                 vici_req_t *req;
723                 vici_res_t *res;
724                 int ret = 0;
725
726                 req = vici_begin("version");
727                 res = vici_submit(req, conn);
728                 if (res)
729                 {
730                         printf("%s %s (%s, %s, %s)\n",
731                                 vici_find_str(res, "", "daemon"),
732                                 vici_find_str(res, "", "version"),
733                                 vici_find_str(res, "", "sysname"),
734                                 vici_find_str(res, "", "release"),
735                                 vici_find_str(res, "", "machine"));
736                         vici_free_res(res);
737                 }
738                 else
739                 {
740                         ret = errno;
741                         fprintf(stderr, "version request failed: %s\n", strerror(errno));
742                 }
743                 return ret;
744         }
745
746 ## A request with event streaming and callback parsing ##
747
748 In this more advanced example, the _list-conns_ command is used to stream
749 loaded connections with the _list-conn_ event. The event message is parsed
750 with a simple callback to print the connection name:
751
752         int conn_cb(void *null, vici_res_t *res, char *name)
753         {
754                 printf("%s\n", name);
755                 return 0;
756         }
757
758         void list_cb(void *null, char *name, vici_res_t *res)
759         {
760                 if (vici_parse_cb(res, conn_cb, NULL, NULL, NULL) != 0)
761                 {
762                         fprintf(stderr, "parsing failed: %s\n", strerror(errno));
763                 }
764         }
765
766         int list_conns(vici_conn_t *conn)
767         {
768                 vici_req_t *req;
769                 vici_res_t *res;
770                 int ret = 0;
771
772                 if (vici_register(conn, "list-conn", list_cb, NULL) == 0)
773                 {
774                         req = vici_begin("list-conns");
775                         res = vici_submit(req, conn);
776                         if (res)
777                         {
778                                 vici_free_res(res);
779                         }
780                         else
781                         {
782                                 ret = errno;
783                                 fprintf(stderr, "request failed: %s\n", strerror(errno));
784                         }
785                         vici_register(conn, "list-conn", NULL, NULL);
786                 }
787                 else
788                 {
789                         ret = errno;
790                         fprintf(stderr, "registration failed: %s\n", strerror(errno));
791                 }
792                 return ret;
793         }
794
795 ## API documentation ##
796
797 More information about the libvici API is available in the _libvici.h_ header
798 file or the generated Doxygen documentation.
799
800 # vici ruby gem #
801
802 The _vici ruby gem_ is a pure ruby implementation of the VICI protocol to
803 implement client applications. It is provided in the _ruby_ subdirectory, and
804 gets built and installed if strongSwan has been _./configure_'d with
805 _--enable-vici_ and _--enable-ruby-gems_.
806
807 The _Connection_ class from the _Vici_ module provides the high level interface,
808 the underlying classes are usually not required to build ruby applications
809 using VICI. The _Connection_ class provides methods for the supported VICI
810 commands and an event listening mechanism.
811
812 To represent the VICI message data tree, the gem converts the binary encoding
813 to ruby data types. The _Connection_ class takes and returns ruby objects for
814 the exchanged message data:
815  * Sections get encoded as Hash, containing other sections as Hash, or
816  * Key/Values, where the values are Strings as Hash values
817  * Lists get encoded as Arrays with String values
818 Non-String values that are not a Hash nor an Array get converted with .to_s
819 during encoding.
820
821 ## Connecting to the daemon ##
822
823 To create a connection to the daemon, a socket must be passed to the
824 _Connection_ constructor. There is no default, but on Unix systems usually
825 a Unix socket over _/var/run/charon.vici_ is used:
826
827         require "vici"
828         require "socket"
829
830         v = Vici::Connection.new(UNIXSocket.new("/var/run/charon.vici"))
831
832 ## A simple client request ##
833
834 An example to print the daemon version information is as simple as:
835
836         x = v.version
837         puts "%s %s (%s, %s, %s)" % [
838                 x["daemon"], x["version"], x["sysname"], x["release"], x["machine"]
839         ]
840
841 ## A request with closure invocation ##
842
843 The _Connection_ class takes care of event streaming by invoking a closure
844 for each event. The following example lists all loaded connections using the
845 _list-conns_ command and implicitly the _list-conn_ event:
846
847         v.list_conns { |conn|
848                 conn.each { |key, value|
849                         puts key
850                 }
851         }
852
853 ## API documentation ##
854
855 For more details about the ruby gem refer to the comments in the gem source
856 code or the generated documentation.