1ct_netconfc(3)             Erlang Module Definition             ct_netconfc(3)
2
3
4

NAME

6       ct_netconfc - NETCONF client module.
7

DESCRIPTION

9       NETCONF  client  module  compliant with RFC 6241, NETCONF Configuration
10       Protocol, and RFC 6242, Using the NETCONF Configuration  Protocol  over
11       Secure  SHell (SSH), and with support for RFC 5277, NETCONF Event Noti‐
12       fications.
13
14       Connecting to a NETCONF server
15
16       Call connect/1,2 to establish a connection to a server, then  pass  the
17       returned  handle to session/1-3 to establish a NETCONF session on a new
18       SSH channel. Each call to session/1-3 establishes a new session on  the
19       same connection, and results in a hello message to the server.
20
21       Alternately,  open/1,2  can  be used to establish a single session on a
22       dedicated connection.  (Or,  equivalently,  only_open/1,2  followed  by
23       hello/1-3.)
24
25       Connect/session  options  can be specified in a configuration file with
26       entries like the following.
27
28        {server_id(), [option()]}.
29
30       The server_id() or an associated ct:target_name() can then be passed to
31       the aforementioned functions to use the referenced configuration.
32
33       Signaling
34
35       Protocol operations in the NETCONF protocol are realized as remote pro‐
36       cedure calls (RPCs) from client to server  and  a  corresponding  reply
37       from  server  to  client. RPCs are sent using like-named functions (eg.
38       edit_config/3-5 to send an edit-config RPC), with the server  reply  as
39       return  value. There are functions for each RPC defined in RFC 6241 and
40       the create-subscription RPC from RFC 5277, all of which are wrappers on
41       send_rpc/2,3,  that can be used to send an arbitrary RPC not defined in
42       RFC 6241 or RFC 5277.
43
44       All of the signaling functions have one variant with a Timeout argument
45       and  one  without,  corresponding to an infinite timeout. The latter is
46       inappropriate in most cases since a non-response by  the  server  or  a
47       missing message-id causes the call to hang indefinitely.
48
49       Logging
50
51       The  NETCONF server uses error_logger for logging of NETCONF traffic. A
52       special purpose error handler is implemented in ct_conn_log_h.  To  use
53       this  error  handler,  add the cth_conn_log hook in the test suite, for
54       example:
55
56        suite() ->
57           [{ct_hooks, [{cth_conn_log, [{ct:conn_log_mod(), ct:conn_log_options()}]}]}].
58
59       conn_log_mod() is the name of the Common Test module  implementing  the
60       connection protocol, for example, ct_netconfc.
61
62       Hook option log_type specifies the type of logging:
63
64         raw:
65           The  sent  and  received  NETCONF data is logged to a separate text
66           file "as is" without any formatting. A link to the file is added to
67           the test case HTML log.
68
69         pretty:
70           The  sent  and  received  NETCONF data is logged to a separate text
71           file with XML data nicely indented. A link to the file is added  to
72           the test case HTML log.
73
74         html (default):
75           The sent and received NETCONF traffic is pretty printed directly in
76           the test case HTML log.
77
78         silent:
79           NETCONF traffic is not logged.
80
81       By default, all NETCONF traffic is logged in one single log file.  How‐
82       ever,  different  connections  can  be  logged in separate files. To do
83       this, use hook option hosts and list the names of  the  servers/connec‐
84       tions  to  be used in the suite. The connections must be named for this
85       to work, that is, they must be opened with open/2.
86
87       Option hosts has no effect if log_type is set to html or silent.
88
89       The hook options can also be specified in  a  configuration  file  with
90       configuration variable ct_conn_log:
91
92        {ct_conn_log,[{ct:conn_log_mod(), ct:conn_log_options()}]}.
93
94       For example:
95
96        {ct_conn_log,[{ct_netconfc,[{log_type,pretty},
97                                    {hosts,[ct:key_or_name()]}]}]}
98
99   Note:
100       Hook options specified in a configuration file overwrite the hard-coded
101       hook options in the test suite.
102
103
104       Logging Example 1:
105
106       The following ct_hooks statement  causes  pretty  printing  of  NETCONF
107       traffic  to  separate  logs  for  the  connections named nc_server1 and
108       nc_server2. Any other connections are logged to default NETCONF log.
109
110        suite() ->
111           [{ct_hooks, [{cth_conn_log, [{ct_netconfc,[{log_type,pretty}},
112                                                      {hosts,[nc_server1,nc_server2]}]}
113                                       ]}]}].
114
115       Connections must be opened as follows:
116
117        open(nc_server1,[...]),
118        open(nc_server2,[...]).
119
120       Logging Example 2:
121
122       The following configuration file causes  raw  logging  of  all  NETCONF
123       traffic in to one single text file:
124
125        {ct_conn_log,[{ct_netconfc,[{log_type,raw}]}]}.
126
127       The ct_hooks statement must look as follows:
128
129        suite() ->
130           [{ct_hooks, [{cth_conn_log, []}]}].
131
132       The  same ct_hooks statement without the configuration file would cause
133       HTML logging of all NETCONF connections in to the test case HTML log.
134

DATA TYPES

136       client() = handle() | server_id() | ct:target_name()
137
138              Handle to a NETCONF session, as required by signaling functions.
139
140       handle()
141
142              Handle to a connection to a NETCONF server as returned  by  con‐
143              nect/1,2,  or to a session as returned by session/1-3, open/1,2,
144              or only_open/1,2.
145
146       xs_datetime() = string()
147
148              Date and time of a startTime/stopTime element  in  an  RFC  5277
149              create-subscription  request.  Of  XML  primitive type dateTime,
150              which has the (informal) form
151
152               [-]YYYY-MM-DDThh:mm:ss[.s][Z|(+|-)hh:mm]
153
154              where T and Z are literal and .s is one or more fractional  sec‐
155              onds.
156
157       event_time() = {eventTime, xml_attributes(), [xs_datetime()]}
158
159       notification_content() = [event_time() | simple_xml()]
160
161       notification() =
162           {notification, xml_attributes(), notification_content()}
163
164              Event  notification  messages  sent as a result of calls to cre‐
165              ate_subscription/2,3.
166
167       option() =
168           {host | ssh, host()} |
169           {port, inet:port_number()} |
170           {timeout, timeout()} |
171           {capability, string() | [string()]} |
172           ssh:client_option()
173
174              Options host and port specify the server endpoint  to  which  to
175              connect,  and are passed directly to ssh:connect/4, as are arbi‐
176              trary  ssh  options.  Common  options  are  user,  password  and
177              user_dir.
178
179              Option timeout specifies the number of milliseconds to allow for
180              connection  establishment  and,  if  the  function  in  question
181              results  in  an  outgoing hello message, reception of the server
182              hello. The timeout applies  to  connection  and  hello  indepen‐
183              dently;  one  timeout  for connection establishment, another for
184              hello reception.
185
186              Option capability specifies the content of a corresponding  ele‐
187              ment  in  an  outgoing hello message, each option specifying the
188              content of a single element. If no base  NETCONF  capability  is
189              configured     then     the    RFC    4741    1.0    capability,
190              "urn:ietf:params:netconf:base:1.0", is added, otherwise not.  In
191              particular,  the RFC 6241 1.1 capability must be explicitly con‐
192              figured. NETCONF capabilities can be specified using the  short‐
193              hand  notation defined in RFC 6241, any capability string start‐
194              ing with a colon being prefixed by either  "urn:ietf:params:net‐
195              conf" or "urn:ietf:params:netconf:capability", as appropriate.
196
197              Capability options are ignored by connect/1-3 and only_open/1-2,
198              which don't result in an outgoing hello message.
199
200       server_id() = atom()
201
202              Identity of connection or session configuration in a  configura‐
203              tion file.
204
205       stream_data() =
206           {description, string()} |
207           {replaySupport, string()} |
208           {replayLogCreationTime, string()} |
209           {replayLogAgedTime, string()}
210
211       stream_name() = string()
212
213       streams() = [{stream_name(), [stream_data()]}]
214
215              Stream information as returned by get_event_streams/1-3. See RFC
216              5277, "XML Schema for Event Notifications", for  detail  on  the
217              format of the string values.
218
219       xml_attribute_tag() = atom()
220
221       xml_attribute_value() = string()
222
223       xml_attributes() =
224           [{xml_attribute_tag(), xml_attribute_value()}]
225
226       xml_content() = [simple_xml() | iolist()]
227
228       xml_tag() = atom()
229
230       simple_xml() =
231           {xml_tag(), xml_attributes(), xml_content()} |
232           {xml_tag(), xml_content()} |
233           xml_tag()
234
235              Representation of XML, as described in application xmerl.
236
237       xpath() = {xpath, string()}
238
239       error_reason() = term()
240
241       host() = inet:hostname() | inet:ip_address()
242
243       netconf_db() = running | startup | candidate
244

EXPORTS

246       action(Client, Action) -> Result
247
248       action(Client, Action, Timeout) -> Result
249
250              Types:
251
252                 Client = client()
253                 Action = simple_xml()
254                 Timeout = timeout()
255                 Result = ok | {ok, [simple_xml()]} | {error, error_reason()}
256
257              Executes  an  action. If the return type is void, ok is returned
258              instead of {ok,[simple_xml()]}.
259
260       close_session(Client) -> Result
261
262       close_session(Client, Timeout) -> Result
263
264              Types:
265
266                 Client = client()
267                 Timeout = timeout()
268                 Result = ok | {error, error_reason()}
269
270              Requests graceful termination of the session associated with the
271              client.
272
273              When  a  NETCONF  server  receives  a  close-session request, it
274              gracefully closes the session. The server releases any locks and
275              resources  associated with the session and gracefully closes any
276              associated connections. Any NETCONF requests  received  after  a
277              close-session request are ignored.
278
279       connect(Options) -> Result
280
281              Types:
282
283                 Options = [option()]
284                 Result = {ok, handle()} | {error, error_reason()}
285
286              Opens an SSH connection to a NETCONF server.
287
288              If the server options are specified in a configuration file, use
289              connect/2 instead.
290
291              The opaque handle() reference returned  from  this  function  is
292              required  as  connection  identifier  when opening sessions over
293              this connection, see session/1-3.
294
295       connect(KeyOrName, ExtraOptions) -> Result
296
297              Types:
298
299                 KeyOrName = ct:key_or_name()
300                 ExtraOptions = [option()]
301                 Result = {ok, handle()} | {error, error_reason()}
302
303              Open an SSH connection to a named NETCONF server.
304
305              If KeyOrName is a  configured  server_id()  or  a  target_name()
306              associated with such an Id, then the options for this server are
307              fetched from the configuration file.
308
309              The options list is added to those of the configuration file. If
310              an  option  is  specified  in both lists, the configuration file
311              takes precedence.
312
313              If the server is not specified in a configuration file, use con‐
314              nect/1 instead.
315
316              The opaque handle() reference returned from this function can be
317              used as connection identifier when opening  sessions  over  this
318              connection,  see  session/1-3.  However,  if KeyOrName is a tar‐
319              get_name(), that is, if the server is named through  a  call  to
320              ct:require/2 or a require statement in the test suite, then this
321              name can be used instead of handle().
322
323       copy_config(Client, Target, Source) -> Result
324
325       copy_config(Client, Target, Source, Timeout) -> Result
326
327              Types:
328
329                 Client = client()
330                 Target = Source = netconf_db()
331                 Timeout = timeout()
332                 Result = ok | {error, error_reason()}
333
334              Copies configuration data.
335
336              Which source and target options that can be  issued  depends  on
337              the  capabilities  supported  by the server. That is, :candidate
338              and/or :startup are required.
339
340       create_subscription(Client, Values) -> Result
341
342       create_subscription(Client, Values, Timeout) -> Result
343
344              Types:
345
346                 Client = client()
347                 Values =
348                     #{stream => Stream,
349                       filter => Filter,
350                       start => StartTime,
351                       stop => StopTime}
352                 Stream = stream_name()
353                 Filter = simple_xml() | [simple_xml()]
354                 StartTime = StopTime = xs_datetime()
355                 Timeout = timeout()
356                 Result = ok | {error, error_reason()}
357
358              Creates a subscription for event notifications by sending an RFC
359              5277  create-subscription RPC to the server. The calling process
360              receives events as messages of type notification().
361
362              From RFC 5722, 2.1 Subscribing to Receive Event Notifications:
363
364                Stream:
365                  Indicates which stream of  event  is  of  interest.  If  not
366                  present, events in the default NETCONF stream are sent.
367
368                Filter:
369                  Indicates  which  subset of all possible events is of inter‐
370                  est. The parameter format is the same as that of the  filter
371                  parameter   in  the  NETCONF  protocol  operations.  If  not
372                  present, all events not precluded by  other  parameters  are
373                  sent.
374
375                StartTime:
376                  Used  to  trigger  the  replay feature and indicate that the
377                  replay is to start at the time specified.  If  StartTime  is
378                  not  present,  this  is not a replay subscription. It is not
379                  valid to specify start times that are later than the current
380                  time.  If  StartTime  is  specified earlier than the log can
381                  support, the replay begins with the earliest available noti‐
382                  fication.  This  parameter is of type dateTime and compliant
383                  to RFC 3339. Implementations must support time zones.
384
385                StopTime:
386                  Used with the optional replay feature to indicate the newest
387                  notifications  of  interest. If StopTime is not present, the
388                  notifications continues until  the  subscription  is  termi‐
389                  nated. Must be used with and be later than StartTime. Values
390                  of StopTime in the future are valid. This  parameter  is  of
391                  type  dateTime  and  compliant  to RFC 3339. Implementations
392                  must support time zones.
393
394              See RFC 5277 for more details.  The  requirement  that  StopTime
395              must  only  be  used with StartTime is not enforced, to allow an
396              invalid request to be sent to the server.
397
398              Prior to OTP 22.1, this function was  documented  as  having  15
399              variants  in  6  arities. These are still exported for backwards
400              compatibility, but no longer documented. The map-based  variants
401              documented  above  provide  the  same functionality with simpler
402              arguments.
403
404       delete_config(Client, Target) -> Result
405
406       delete_config(Client, Target, Timeout) -> Result
407
408              Types:
409
410                 Client = client()
411                 Target = startup | candidate
412                 Timeout = timeout()
413                 Result = ok | {error, error_reason()}
414
415              Deletes configuration data.
416
417              The running configuration cannot be deleted  and  :candidate  or
418              :startup must be advertised by the server.
419
420       disconnect(Conn) -> ok | {error, error_reason()}
421
422              Types:
423
424                 Conn = handle()
425
426              Closes the given SSH connection.
427
428              If there are open NETCONF sessions on the connection, these will
429              be brutally aborted. To avoid  this,  close  each  session  with
430              close_session/1,2
431
432       edit_config(Client, Target, Config) -> Result
433
434       edit_config(Client, Target, Config, OptParams) -> Result
435
436       edit_config(Client, Target, Config, Timeout) -> Result
437
438       edit_config(Client, Target, Config, OptParams, Timeout) -> Result
439
440              Types:
441
442                 Client = client()
443                 Target = netconf_db()
444                 Config = simple_xml() | [simple_xml()]
445                 OptParams = [simple_xml()]
446                 Timeout = timeout()
447                 Result = ok | {error, error_reason()}
448
449              Edits configuration data.
450
451              By  default  only  the  running  target is available, unless the
452              server includes :candidate or :startup in its list of  capabili‐
453              ties.
454
455              OptParams   can  be  used  for  specifying  optional  parameters
456              (default-operation, test-option, or error-option) to be added to
457              the  edit-config  request.  The  value must be a list containing
458              valid simple XML, for example:
459
460               [{'default-operation', ["none"]},
461                {'error-option', ["rollback-on-error"]}]
462
463              If OptParams is not given, the default value [] is used.
464
465       get(Client, Filter) -> Result
466
467       get(Client, Filter, Timeout) -> Result
468
469              Types:
470
471                 Client = client()
472                 Filter = simple_xml() | xpath()
473                 Timeout = timeout()
474                 Result = {ok, [simple_xml()]} | {error, error_reason()}
475
476              Gets data.
477
478              This operation returns both configuration and  state  data  from
479              the server.
480
481              Filter  type  xpath  can  be  used  only  if the server supports
482              :xpath.
483
484       get_capabilities(Client) -> Result
485
486       get_capabilities(Client, Timeout) -> Result
487
488              Types:
489
490                 Client = client()
491                 Timeout = timeout()
492                 Result = [string()] | {error, error_reason()}
493
494              Returns the server capabilities as received in  its  hello  mes‐
495              sage.
496
497       get_config(Client, Source, Filter) -> Result
498
499       get_config(Client, Source, Filter, Timeout) -> Result
500
501              Types:
502
503                 Client = client()
504                 Source = netconf_db()
505                 Filter = simple_xml() | xpath()
506                 Timeout = timeout()
507                 Result = {ok, [simple_xml()]} | {error, error_reason()}
508
509              Gets configuration data.
510
511              To  be  able  to  access another source than running, the server
512              must advertise :candidate and/or :startup.
513
514              Filter type xpath can  be  used  only  if  the  server  supports
515              :xpath.
516
517       get_event_streams(Client) -> Result
518
519       get_event_streams(Client, Timeout) -> Result
520
521       get_event_streams(Client, Streams) -> Result
522
523       get_event_streams(Client, Streams, Timeout) -> Result
524
525              Types:
526
527                 Client = client()
528                 Streams = [stream_name()]
529                 Timeout = timeout()
530                 Result = {ok, streams()} | {error, error_reason()}
531
532              Sends a request to get the specified event streams.
533
534              Streams  is a list of stream names. The following filter is sent
535              to the NETCONF server in a get request:
536
537               <netconf xmlns="urn:ietf:params:xml:ns:netmod:notification">
538                 <streams>
539                   <stream>
540                     <name>StreamName1</name>
541                   </stream>
542                   <stream>
543                     <name>StreamName2</name>
544                   </stream>
545                   ...
546                 </streams>
547               </netconf>
548
549              If Streams is an empty list, all streams are requested by  send‐
550              ing the following filter:
551
552               <netconf xmlns="urn:ietf:params:xml:ns:netmod:notification">
553                 <streams/>
554               </netconf>
555
556              If more complex filtering is needed, use ct_netconfc:get/2,3 and
557              specify the exact filter according  to  "XML  Schema  for  Event
558              Notifications" in RFC 5277.
559
560       get_session_id(Client) -> Result
561
562       get_session_id(Client, Timeout) -> Result
563
564              Types:
565
566                 Client = client()
567                 Timeout = timeout()
568                 Result = integer() >= 1 | {error, error_reason()}
569
570              Returns the session Id associated with the specified client.
571
572       hello(Client) -> Result
573
574       hello(Client, Timeout) -> Result
575
576       hello(Client, Options, Timeout) -> Result
577
578              Types:
579
580                 Client = handle()
581                 Options = [{capability, [string()]}]
582                 Timeout = timeout()
583                 Result = ok | {error, error_reason()}
584
585              Exchanges  hello  messages  with  the  server.  Returns when the
586              server hello has been received or after the specified timeout.
587
588              Note that capabilities for  an  outgoing  hello  can  be  passed
589              directly to open/2.
590
591       kill_session(Client, SessionId) -> Result
592
593       kill_session(Client, SessionId, Timeout) -> Result
594
595              Types:
596
597                 Client = client()
598                 SessionId = integer() >= 1
599                 Timeout = timeout()
600                 Result = ok | {error, error_reason()}
601
602              Forces  termination  of the session associated with the supplied
603              session Id.
604
605              The server side must abort any ongoing operations,  release  any
606              locks  and  resources associated with the session, and close any
607              associated connections.
608
609              Only if the server is in the confirmed commit phase, the config‐
610              uration  is  restored to its state before entering the confirmed
611              commit phase. Otherwise, no configuration rollback is performed.
612
613              If the specified SessionId is equal to the current  session  Id,
614              an error is returned.
615
616       lock(Client, Target) -> Result
617
618       lock(Client, Target, Timeout) -> Result
619
620              Types:
621
622                 Client = client()
623                 Target = netconf_db()
624                 Timeout = timeout()
625                 Result = ok | {error, error_reason()}
626
627              Locks the configuration target.
628
629              Which  target  parameters that can be used depends on if :candi‐
630              date and/or :startup are supported by the  server.  If  success‐
631              full,  the  configuration system of the device is unavailable to
632              other clients (NETCONF, CORBA,  SNMP,  and  so  on).  Locks  are
633              intended to be short-lived.
634
635              Operation kill_session/2,3 can be used to force the release of a
636              lock owned by another NETCONF session. How this is  achieved  by
637              the server side is implementation-specific.
638
639       only_open(Options) -> Result
640
641              Types:
642
643                 Options = [option()]
644                 Result = {ok, handle()} | {error, error_reason()}
645
646              Opens a NETCONF session, but does not send hello.
647
648              As open/1, but does not send a hello message.
649
650       only_open(KeyOrName, ExtraOptions) -> Result
651
652              Types:
653
654                 KeyOrName = ct:key_or_name()
655                 ExtraOptions = [option()]
656                 Result = {ok, handle()} | {error, error_reason()}
657
658              Opens a named NETCONF session, but does not send hello.
659
660              As open/2, but does not send a hello message.
661
662       open(Options) -> Result
663
664              Types:
665
666                 Options = [option()]
667                 Result = {ok, handle()} | {error, error_reason()}
668
669              Opens a NETCONF session and exchanges hello messages.
670
671              If  the server options are specified in a configuration file, or
672              if a named client is needed for logging  purposes  (see  section
673              Logging in this module), use open/2 instead.
674
675              The  opaque  handle()  reference  returned from this function is
676              required as client identifier when calling any other function in
677              this module.
678
679       open(KeyOrName, ExtraOption) -> Result
680
681              Types:
682
683                 KeyOrName = ct:key_or_name()
684                 ExtraOption = [option()]
685                 Result = {ok, handle()} | {error, error_reason()}
686
687              Opens a named NETCONF session and exchanges hello messages.
688
689              If  KeyOrName  is  a  configured  server_id() or a target_name()
690              associated with such an Id, then the options for this server are
691              fetched from the configuration file.
692
693              The options list is added to those of the configuration file. If
694              an option is specified in both  lists,  the  configuration  file
695              take precedence.
696
697              If  the  server  is  not  specified in a configuration file, use
698              open/1 instead.
699
700              The opaque handle() reference returned from this function can be
701              used  as  client  identifier  when calling any other function in
702              this module. However, if KeyOrName is a target_name(), that  is,
703              if  the  server  is  named  through  a call to ct:require/2 or a
704              require statement in the test suite, then this name can be  used
705              instead of handle().
706
707              See also ct:require/2.
708
709       send(Client, SimpleXml) -> Result
710
711       send(Client, SimpleXml, Timeout) -> Result
712
713              Types:
714
715                 Client = client()
716                 SimpleXml = simple_xml()
717                 Timeout = timeout()
718                 Result = simple_xml() | {error, error_reason()}
719
720              Sends an XML document to the server.
721
722              The  specified  XML document is sent "as is" to the server. This
723              function can be used for sending XML documents  that  cannot  be
724              expressed by other interface functions in this module.
725
726       send_rpc(Client, SimpleXml) -> Result
727
728       send_rpc(Client, SimpleXml, Timeout) -> Result
729
730              Types:
731
732                 Client = client()
733                 SimpleXml = simple_xml()
734                 Timeout = timeout()
735                 Result = [simple_xml()] | {error, error_reason()}
736
737              Sends a NETCONF rpc request to the server.
738
739              The  specified  XML  document  is wrapped in a valid NETCONF rpc
740              request and sent to the server.  The  message-id  and  namespace
741              attributes are added to element rpc.
742
743              This  function  can be used for sending rpc requests that cannot
744              be expressed by other interface functions in this module.
745
746       session(Conn) -> Result
747
748       session(Conn, Options) -> Result
749
750       session(KeyOrName, Conn) -> Result
751
752       session(KeyOrName, Conn, Options) -> Result
753
754              Types:
755
756                 Conn = handle()
757                 Options = [session_option()]
758                 KeyOrName = ct:key_or_name()
759                 Result = {ok, handle()} | {error, error_reason()}
760                 session_option() =
761                     {timeout, timeout()} | {capability, string() | [string()]}
762
763              Opens a NETCONF session as a channel on the  given  SSH  connec‐
764              tion, and exchanges hello messages with the server.
765
766              The opaque handle() reference returned from this function can be
767              used as client identifier when calling  any  other  function  in
768              this  module.  However,  if  KeyOrName  is used and it is a tar‐
769              get_name(), that is, if the server is named through  a  call  to
770              ct:require/2 or a require statement in the test suite, then this
771              name can be used instead of handle().
772
773       unlock(Client, Target) -> Result
774
775       unlock(Client, Target, Timeout) -> Result
776
777              Types:
778
779                 Client = client()
780                 Target = netconf_db()
781                 Timeout = timeout()
782                 Result = ok | {error, error_reason()}
783
784              Unlocks the configuration target.
785
786              If the client earlier has acquired a lock through lock/2,3, this
787              operation releases the associated lock. To access another target
788              than  running,  the  server  must  support   :candidate   and/or
789              :startup.
790
791
792
793Ericsson AB                   common_test 1.18.2                ct_netconfc(3)
Impressum