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
其他参考
- pyang documentation
- pyangbind
- https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
- https://stackoverflow.com/questions/38558401/add-prefix-and-suffix-to-in-bash
(完)
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更新
- Simple data validation with YANG using yanglint
- https://github.com/openconfig/ygot
- yumaworks
- https://www.yumaworks.com/pub/docs/17.10/html/yangdiff/yumapro-yangdiff-manual3.xhtml
- https://www.yumaworks.com/support/download-yumapro-client/
- https://www.yumaworks.com/pub/docs/17.10/pdf/yangcli-pro_command_reference_2017.pdf
yangdiff-pro --difftype=revision --new=new_version.yang --old=old_version.yang
dpkg --force-overwrite -i yumapro-client-doc_18.10-6_all.deb
yangdump-pro all/*.yang --format html --output html/ --objview=cooked --modpath=all
- libsmi (http://www.ibr.cs.tubs.de/projects/libsmi) – generates YANG from SMIv2 – open source
- https://wiki.onosproject.org/display/ODTN/Generate+NETCONF+emulator
- https://github.com/cmoberg/netconf-yang-training/tree/master/example-confd
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
(更新完)