How To Setup Apache Server
--------------------------
- mod_netconf compilation requires apache2-devel and libjson-devel packages.

- run following commands in this directory
$ make
# make install

- Add following lines into the (appropriate parts of the ) Apache configuration:
LoadModule netconf_module                 /usr/lib64/apache2/mod_netconf.so

- Start Apache

- For testing, you can run test-client
  - run under the same user as Apache, or change access rights of the
    communication socket (/tmp/mod_netconf.sock) to allow writing.

    
mod_netconf Message Format
--------------------------

UNIX socket (with default path /tmp/mod_netconf.sock) is used for communication
with mod_netconf daemon. Messages are formated using JSON and encoded using
Chunked Framing Mechanism described in RFC6242 (http://tools.ietf.org/html/rfc6242#section-4.2)
with the following content.
Client is free to send multiple requests when the communication socket
to the mod_netconf daemon is opened.

Replies
~~~~~~~
1) OK
key: type (int), value: 0

Optional (for request type 3 - create NETCONF connection):
key: session (string), value: 40 unique characters of session identifier

2) DATA
key: type (int), value: 1
key: data (string)

3) ERROR
key: type (int), value: 2
key: error-message (string)

Optional:
key: error-tag (string)
key: error-type (string)
key: error-severity (string)
key: error-app-tag (string)
key: error-path (string)
key: bad-attribute (string)
key: bad-element (string)
key: bad-namespace (string)
key: session-id (string)

4) INFO
key: type (int), value: 3
key: sid (string), value: session ID
key: version (string), value: NETCONF protocol version
key: host (string), value: hostname of the NETCONF server
key: port (string), value: port of the NETCONF server
key: user (string), value: username of the user holding the NETCONF session
key: capabilities (array of strings), value: list of supported capabilities

Requests
~~~~~~~~
1) Request to create NETCONF session (connect)
key: type (int), value: 4
key: user (string)
key: pass (string), value: plain text password

Optional:
key: host (string), "localhost" if not specified
key: port (string), "830" if not specified

2) Request to close NETCONF session (disconnect)
key: type (int), value: 5
key: session (string), value: unique session identifier

3) NETCONF <get>
key: type (int), value: 6
key: session (string), value: unique session identifier

Optional:
key: filter (string), value: xml subtree filter

4) NETCONF <get-config>
key: type (int), value: 7
key: session (string), value: unique session identifier
key: source (string), value: running|startup|candidate

Optional:
key: filter (string), value: xml subtree filter

5) NETCONF <edit-config>
key: type (int), value: 8
key: session (string), value: unique session identifier
key: target (string), value: running|startup|candidate
key: config (string), value: editing configuration data according to NETCONF RFC

Optional:
key: source (string), value: config|url, default value: config
key: default-operation (string), value: merge|replace|none
key: error-option (string), value: stop-on-error|continue-on-error|rollback-on-error 
key: uri-source (string), required when "source" is "url", value: uri
key: test-option (string), value: notset|testset|set|test, default value: testset

6) NETCONF <copy-config>
key: type (int), value: 9
key: session (string), value: unique session identifier
key: source (string), value: running|startup|candidate|url
key: target (string), value: running|startup|candidate|url
Optional, required when "url" is used:
key: uri-source (string), required when "source" is "url", value: uri
key: uri-target (string), required when "target" is "url", value: uri


Alternating:
key: source (string), value: running|startup|candidate
key: config (string), value: new complete configuration data, if source not specified

7) NETCONF <delete-config>
key: type (int), value: 10
key: session (string), value: unique session identifier
key: target (string), value: running|startup|candidate

8) NETCONF <lock>
key: type (int), value: 11
key: session (string), value: unique session identifier
key: target (string), value: running|startup|candidate

9) NETCONF <unlock>
key: type (int), value: 12
key: session (string), value: unique session identifier
key: target (string), value: running|startup|candidate

10) NETCONF <kill-session>
key: type (int), value: 13
key: session (string), value: unique session identifier
key: session-id (string), value: ID of the session to kill

11) Provide information about NETCONF session
key: type (int), value: 14
key: session (string), value: unique session identifier

12) Perform generic operation not included in base NETCONF
key: type (int), value: 15
key: session (string), value: unique session identifier
key: content (string), value: XML data as content of the NETCONF's <rpc> envelope

13) get-schema
key: type (int), value: 16
key: session (string), value: unique session identifier
key: identifier (string), value: identifier of schema

14) reloadhello Update hello message of NETCONF session
key: type (int), value: 17
key: session (string), value: unique session identifier

15) notif_history Provide list of notifications from past.
key: type (int), value: 18
key: session (string), value: unique session identifier
key: from (int64), value: start time in history
key: to (int64), value: end time

16) validate Validate datastore or url
key: type (int), value: 19
key: session (string), value: unique session identifier
key: target (string), value: running|startup|candidate|url
Required when target is "url":
key: url (string), value: URL of datastore to validate

