pyang是一个Python编写的,用来处理IETF YANG模型的工具,可以用来模型验证,以及格式转化等等。

由于pyang有一些依赖,并且安装的时候需要编译扩展模块,在Windows上使用Cygwin来操作会比较方便一点。

安装过程

首先安装GCC:

apt-cyg install gcc-core

然后安装python 3.7 (Python3.8还太新,很多库还不支持)

apt-cyg install python37-devel python37-libxml2 python37-pip python37-setuptools

接着安装辅助的库

apt-cyg install libxml2 libxml2-devel libxslt libxslt-devel

最后使用pip安装pyang

pip3.7 install pyang

上面的操作会安装pyang以及yang2html、yang2dsdl、json2xml等命令。

pyang的使用方法

最简单的使用方法是吧所有的yang模型文件都放在一个目录,然后再命令行用通配符处理:

pyang * -f tree

上面命令行将当前目录的yang模型文件转化为tree格式并输出。

如果无法把所有yang模型文件都放置再一个目录,那么需要通过--path来指定所引用的yang模型文件的目录:

pyang --path ietf-yang-modules * -f tree

上面的命令中,通过--path指定了一个文件夹ietf-yang-modules,假设这个文件夹里面存放了被引用的ietf所定义的标准的yang模型文件。

如果模型文件分散在多个目录,而且你又不知道其中的引用关系,就需要把所有的目录用--path选项指定。可以用一些BASH的技巧来简化这个操作:

set -- */
pyang ${*/#/--path } **/*.yang -f tree -o out.txt

其他参考

pyangbind

(完)

2020-07-04更新

这篇文章https://plajjan.github.io/2017-03-15-validating-data-with-YANG.html介绍使用pyang来验证yang数据是否符合模型,可以yang2dsdl尚不支持yang 1.1。如果运行的话,会显示:

DSDL plugin supports only YANG version 1.

(更新完)

2022-03-07更新

yangson应该也是一个不错的yang解析工具,不过只支持json格式的实例数据。

(更新完)

2022-09-13更新

jstree

function enhanceLeafRef() {
  let leafrefs = document.evaluate("//abbr[text()='leafref']", document, null, XPathResult.ANY_TYPE, null)
  let leafrefNodes = []
  while(true) {
    let next = leafrefs.iterateNext()
    if (next)
      leafrefNodes.push(next)
    else
      break
  }


  for(let i = 0; i < leafrefNodes.length; i++) {
    let leafrefNode = leafrefNodes[i]
    let prefixRe = /[^/:]*(?=:)/
    let refpath = leafrefNode.title.split(' : ')[1].trim()

    if (refpath.search(/\./) != -1) {
      continue
    }

    let refpathPrefix = prefixRe.exec(refpath)
    if (!refpathPrefix) {
      let ownpath = leafrefNode.parentNode.parentNode.lastChild.innerText
      let ownpathPrefix = prefixRe.exec(ownpath)
      if (ownpathPrefix) {
        refpath = refpath.replace(/\//g, '/'+ownpathPrefix+':')
      }
    }
    //console.log(leafrefNode)
    console.log(refpath)
    leafrefNode.style.color = "blue"
    leafrefNode.style.cursor = "pointer"
    leafrefNode.style.textDecoration = "underline"
  }
}

// https://stackoverflow.com/questions/34970272/invalidstateerror-an-attempt-was-made-to-use-an-object-that-is-not-or-is-no-lo // https://stackoverflow.com/questions/37098405/javascript-queryselector-find-div-by-innertext/37098508

(更新完)