netopeerguid compilation requires libjson-devel, libnetconf2, and libyang packages.
run following commands in this directory
$ make $ make install
$ service netopeerguid.rc start
If there is any problem with connection to the UNIX socket, please check file permissions.
(with development packages)
Optionally: libwebsockets
UNIX socket (with default path /tmp/netopeerguid.sock) is used for communication with netopeerguid. 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 netopeerguid is opened.
sJSON: string representation of a JSON object
SID: generated unique session identifier (unsigned integer starting with 1)
Replies are in the format:
{ "<SID#1>": { <reply> }, "<SID#2>": { <reply> }, … "<SID#last>": { <reply> } }
Reply format is defined below.
Optional:
Example reply to connect:
{ "<new-SID>": { "type": 0 } }
Optional:
<get>
(returns merged data)Optional:
<get-config>
(returns array of responses merged with schema)Optional:
<edit-config>
Optional:
<copy-config>
Optional:
<delete-config>
Optional:
<lock>
<unlock>
<kill-session>
Optional:
Required when target is "url":
/* Enumeration of Message type (taken from mod_netconf.c) */ const REPLY_OK = 0; const REPLY_DATA = 1; const REPLY_ERROR = 2; const REPLY_INFO = 3; const MSG_CONNECT = 4; const MSG_DISCONNECT = 5; const MSG_GET = 6; const MSG_GETCONFIG = 7; const MSG_EDITCONFIG = 8; const MSG_COPYCONFIG = 9; const MSG_DELETECONFIG = 10; const MSG_LOCK = 11; const MSG_UNLOCK = 12; const MSG_KILL = 13; const MSG_INFO = 14; const MSG_GENERIC = 15; const MSG_GETSCHEMA = 16; const MSG_RELOADHELLO = 17; const MSG_NTF_GETHISTORY = 18; const MSG_VALIDATE = 19; /* Enumeration of Message type - New for libyang */ const SCH_QUERY = 100; const SCH_MERGE = 101;
In module query, the top-nodes array includes only nodes that can appear in data or some descendant can (container, choice, leaf, leaflist, list, anyxml). The rpcs array contains all RPCs defined in the module.
Optional:
(partialy based on https://tools.ietf.org/html/draft-ietf-netmod-yang-json-05#appendix-A)
{ "$@ietf-interfaces:interfaces": { "eltype": "container", "description": "Interface configuration parameters.", "config": true, "status": "current", "mandatory": false, "children": [ "interface" ] }, "ietf-interfaces:interfaces": { "$@interface": { ... } ... } }
{ "$@ietf-interfaces:interface": { "eltype": "list", "description": " ... ", "config": true, "status": "current", "mandatory": false, "keys": [ "name" ], "children": [ "name", "description", "type", "enabled", "link-up-down-trap-enable", "ipv4", "ipv6" ] } }
{ "$@@ietf-interfaces": { "yang-version": "1.0", "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces", "prefix": "if", "contact": " ... ", "organization": "IETF NETMOD (NETCONF Data Modeling Language) Working Group", "revision": "2014-05-08", "description": " ... ", "imports": [ { "name": "ietf-yang-types", "prefix": "yang" } ], "top-nodes": [ "interfaces", "interfaces-state" ] } }
{ "$@@ietf-ip": { "yang-version": "1.0", "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip", "prefix": "ip", "contact": " ... ", "organization": "IETF NETMOD (NETCONF Data Modeling Language) Working Group", "revision": "2014-06-16", "description": " ... ", "imports": [ { "name": "ietf-interfaces", "prefix": "if" }, { "name": "ietf-inet-types", "prefix": "inet" }, { "name": "ietf-yang-types", "prefix": "yang" } ] } }
Each node of or request will be "merged" with schema in following scenario:
Example:
{ "$@node_name": { "eltype": "list", "config": true, "type": "enumeration", "iskey": false } }
Example:
{ "$@node_name": { "children": ["interface", "interface-state"] } }
Example:
{ "$@interface": { "eltype": "list", "config": "true", "type": "enumeration", "iskey": "false", }, "interface": [ { "$@type": { "typedef": { // same result as SCH_QUERY for this typedef "type": "uint8", "range": "0 .. 100", "description": "Percentage" } }, "type": "iana-if-type:ethernetCsmacd" } ] }
Example:
{ "$@node_name": { "enumval": [int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, string] } }
Example based on https://tools.ietf.org/html/rfc6020#section-7.9
{ "$@transfer": { "eltype": "container", "config": "true", "choice": ["how"] }, "transfer": { "$@how": { "eltype": "choice", "default": "interval", "cases": ["interval", "daily", "manual"] }, "how": { "$@interval": { "eltype": "case", "children": ["interval"] }, "$@daily": { "eltype": "case", "children": ["daily", "time-of-day"] } "$@manual": { "eltype": "case", "children": ["manual"] } }, "$@interval": { "eltype": "leaf", "type": "uint16", "default": "30", "units": "minutes" }, "$@daily": { "eltype": "leaf", "type": "empty" }, "$@time-of-day": { "eltype": "leaf", "type": "string", "default": "1am", "units": "24-hour-clock" }, "$@manual": { "eltype": "leaf", "type": "string" } } }
{ "$@ietf-interfaces:interfaces": { "eltype": "leaf", "config": "false", "type": "enumeration", "enumval": [int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, string], "description": "The data type of the parameters argument., "mandatory": "false", "iskey": "false", "children": ["interface", "interface-state"] }, "ietf-interfaces:interfaces": { "$@interface": { "eltype": "list", "config": "true", "type": "enumeration", "iskey": "false", }, "interface": [ { "$@name": { "eltype": “leaf”, "config": "true", "type": "string" }, "name": "eth0", "$@type": { "eltype": “leaf”, "config": “true”, "type": “link-load”, "typedef": { // just an example, this differs in the model "type": "uint8", "range": "0 .. 100", description "Percentage" } }, "type": "iana-if-type:ethernetCsmacd", "$@enabled": { "eltype": “leaf”, "config": “true”, "type": "boolean" }, "enabled": false }, { "$@name": { ... } "name": "eth1", "$@type": { ... } "type": "iana-if-type:ethernetCsmacd", "$@enabled": { ... } "enabled": true, "$@ex-vlan:vlan-tagging": { ... } "ex-vlan:vlan-tagging": true } ] }, "$@ietf-interfaces:interfaces-state": { "eltype": "leaf", "config": "false", "type": "enumeration", "enumval": [int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, string], "description": "The data type of the parameters argument., "mandatory": "false", "iskey": "false" } "ietf-interfaces:interfaces-state": { ... } }
anyxml - XML string which should be converted info JSON in mod_netconf (if it is possible) or in NetopeerGUI backend
{ "$@data": { "eltype": “anyxml” }, "data": { "root": { "node": "value" } } }
augment - applied automatically in result
bit- type
{ "bits": [ { "name": “first-bit”, "position": 0 }, { "name": “second-bit”, "position": 1 }, ... ] }
case
{ "children": [“child1”, “child2”, …], "choice": [“choice1”, “choice2”, …] }
choice - defined in example 5
config
{ "config": true/false }
container - defined in "eltype"
{ "$@interface": { "eltype": "container" } }
default
{ "default": "default value of node" }
description
{ "description": "The text of description of node" }
enum - values are transformed into "enumval"
{ "$@ietf-interfaces:interfaces-state": { "type": "enumeration", "enumval": [int8, int16, int32, int64, uint8, uint16, uint32, uint64, float] } }
fraction-digits
{ "fraction-digits": 2 }
grouping - rendered in "uses" statement directly
key
{ "$@list-name": { "eltype": "list" "keys": [“key-element-name”] } }
leaf
{ "$@leaf-name": { "eltype": "leaf", "iskey": true/false } }
leaf-list
{ "$@leaf-name": { "eltype": "leaf-list" } }
length - renders same value as defined in schema
{ "length": "1..255" }
list
{ "$@list-name": { "eltype": "list" }, "list-name": { "$@leaf-name": { "eltype": “leaf”, ... } } }
mandatory
{ "mandatory": "true/false" }
max-elements
{ "max-elements": number }
min-elements
{ "min-elements": number }
ordered-by
{ "order-by": “user/system” }
path - if defined, target schema informations must be defined, even if data does not exists
{ "$@target": { … }, "$@node": { "eltype": “leafref”, "path": “path/to/target” } }
pattern
{ "pattern": ["[0-9a-fA-F]*"] }
position - no semantical informations, see "bits" statement
presence
{ "presence": “the meaning of presence in container” }
range
{ "range": "11..max" }
reference
{ "reference": "[RFC 3986](https://tools.ietf.org/html/rfc3986): Uniform Resource Identifier (URI): Generic Syntax" }
refine - renders target automatically
rpc - rendered as any other data information with schema. In NetopeerGUI is rendered as a standalone tree. Output substatement is not needed in GUI.
{ "$@rock-the-house": { "eltype": "rpc" }, "rock-the-house": { "input": { "$@zip-code": { "eltype": “leaf”, "type": “string” } "zip-code": { … } } } }
status
{ "status": “current/deprecated/obsolete” }
type - same value as defined in schema
{ "type": “string” }
typedef - defined in example 3
union
{ "type": “union”, "types": [ { (type1) }, { (type2) }, ... ] }
unique
{ "$@list-name": { "eltype": “list”, "unique": [“ip”, “port”] } }
units
{ "units": “string of the units” }
uses - renders content of "grouping" statement directly
must
{ "must": [“must-condition-1”, “must-condition-2”, …] }
when
{ "when": “when-condition” }
require-instance
{ "require-instance": true/false }
identity - all values are transformed into "identityval"
{ "ietf-interfaces:interfaces": { "interface": { "$@type": { "type": "identityref", "identityval": [interface-type, iana-if-type:iana-interface-type, iana-if-type:other, iana-if-type:regular1822, ...] } } } } }
extension - support for NACM extensions only
{ "ext": “default-deny-write”/”default-deny-all” }
Only a part of module information:
contact
{ "contact": “contact information” }
organization
{ "organization": “organization information” }
namespace
{ "namespace": “model namespace” }
prefix
{ "prefix": “model prefix” }
revision
{ "revision": “last model revision date” }
revision-date - part of import and include output
yang-version
{ "yang-version": “1.0/1.1” }
import
{ "imports": [ { "name": “import name”, "prefix": “import prefix”, "revision": “import revision date” } ] }
include
{ "includes": [ { "name": “include name”, "revision": “include revision date” } ] }
Not used (we don't need this information):