重情义的杯子 · H3C S5130 交换机 netconf ...· 1 月前 · |
重情义的筷子 · H3C 中低端路由器 NETCONF ...· 1 月前 · |
快乐的剪刀 · H3C 中低端路由器 NETCONF ...· 2 月前 · |
旅途中的保温杯 · 【社区图书馆】记:读完《网络工程师的Pyth ...· 1 年前 · |
文雅的火锅 · 什么是"debconf:延迟包配置,因为ap ...· 3 周前 · |
欢乐的甜瓜 · SQL Convert Date ...· 3 周前 · |
大鼻子的荒野 · 河北华林酸碱平dds泥疗膏渗吸草本膏泥灸热敷 ...· 3 周前 · |
豪情万千的骆驼 · Home » Shire of ...· 4 周前 · |
爱看球的牙膏 · jquery用ajax方式从后台获取json ...· 1 月前 · |
session 报文交换 xml技术 netconf |
https://www.h3c.com/cn/Service/Document_Software/Document_Center/Home/Routers/00-Public/Developer_Guides/Development_Guide/H3C_NETCONF_API-7456/ |
重情义的筷子
1 月前 |
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
除新华三技术有限公司的商标外,本手册中出现的其它公司的商标、产品标识及商品名称,由各自权利人拥有。
本文中的内容为通用性技术信息,某些信息可能不适用于您所购买的产品 。
由于设备型号不同、配置不同、版本升级等原因,可能造成本手册中的内容与用户使用的设备显示信息不一致。实际使用中请以设备显示的内容为准。
本手册中出现的端口编号仅作示例,并不代表设备上实际具有此编号的端口,实际使用中请以设备上存在的端口编号为准。
如果您在使用过程中发现产品资料的任何问题,可以通过以下方式反馈:
E-mail : [email protected]
感谢您的反馈,让我们做得更好!
NETCONF ( Network Configuration Protocol ,网络配置协议)是一种基于 XML 的网络管理协议,它提供了一种可编程的、对网络设备进行配置和管理的方法。用户可以通过该协议设置属性、获取属性值、获取统计信息等。这使得它在第三方软件的开发上非常便利,很容易开发出在混合不同厂商、不同设备的环境下的特殊定制的网管软件。
NETCONF 协议采用分层结构,分为内容层( Content )、操作层( Operations )、 RPC ( Remote Procedure Call ,远程调用)层和通信协议层( Transport Protocol )等。
表1-1 XML 分层与 NETCONF 分层模型对应关系
为 NETCONF 提供面向连接的、可靠的、顺序的数据链路。
非 FIPS 模式下:
· NETCONF 支持 Telnet 、 SSH 和 Console 等 CLI 登录方式 / 协议,即 NETCONF over SSH 、 NETCONF over Telnet 和 NETCONF over Console
· NETCONF 支持 HTTP 和 HTTPS 协议,即 NETCONF over HTTP 和 NETCONF over HTTPS
· NETCONF 支持封装成 SOAP ( Simple Object Access Protocol ,简单对象访问协议)报文后通过 HTTP 或 HTTPS 协议传输,即 NETCONF over SOAP over HTTP 和 NETCONF over SOAP over HTTPS
FIPS 模式下:
· NETCONF 支持 SSH 和 Console 等 CLI 方式 / 协议,即 NETCONF over SSH 和 NETCONF over Console
· NETCONF 支持 HTTPS 登录协议,即 NETCONF over HTTPS
· NETCONF 支持封装成 SOAP 报文后通过 HTTPS 协议传输,即 NETCONF over SOAP over HTTPS
NETCONF 网络主要由 NETCONF 客户端和 NETCONF 服务器组成:
· 客户端 上需要安装 NETCONF 客户端软件(如 ncclient 、 NetconfBrowser ),或运行 基于 SOAP 请求的脚本或程序。 客户端的 主要作用 为 :
¡ 通过 NETCONF 协议对网络设备进行配置和管理。
¡ 主动查询网络设备的状态。
¡ 接收网络设备主动发送的告警和事件,以获知网络设备的当前状态。
· 服务器(即待管理网络设备)上需要运行 NETCONF 服务端程序,即支持 NETCONF 功能。服务器主要用于响应客户端的请求,并在发生故障或事件时,主动通告给客户端。
NETCONF 命令必须符合 XML 语言的基本格式,格式遵循 RFC 4741 。
NETCONF 报文分为请求和应答报文两种。 NETCONF 请求和应答报文的格式有所不同。
执行 NETCONF 请求前,需要先校验 NETCONF 报文的数据合法性。如果校验失败,则会向客户端报错。其中,数据合法性校验通过 XML Schema 的方式完成。
Comware NETCONF 请求遵循 NETCONF 协议,其格式如下:
<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<operation>
其中 <operation> 为“ 1.6 Comware 支持的协议操作 ”中列举的支持的操作类型:
· 对于 get 系列操作, filter 元素下为 H3C 自定义部分,以 top 元素为起点。以 get-config 操作为例,报文格式为:
<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<get-config>
<source>
<running/>
</source>
<filter type=”subtree”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
</filter>
</get-config>
· 对于 edit-config 操作, config 元素下为 H3C 自定义 部分,以 top 元素为起点 。以 edit-config 操作为例,报文格式为:
<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<edit-config>
<target>
<running/>
</target>
<config xmlns:xc=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
</config>
</edit-config>
通过 NETCONF over SOAP 访问设备, NETCONF 报文会封装在 SOAP 报文的 BODY 元素里,这些报文除了需要遵循纯 NETCONF 报文的规则外,还需要遵循以下规则:
· SOAP 消息必须用 XML 来编码。
· SOAP 消息必须使用 SOAP Envelope 命名空间 和 SOAP Encoding 命名空间。
· SOAP 消息不能包含 DTD ( Document Type Definition ,文件类型定义) 引用。
· SOAP 消息不能包含 XML 处理指令。
NETCONF over SOAP 请求和应答报文的格式有所不同。
如下为一个 NETCONF over SOAP 请求报文示例,用于获取设备上所有接口的所有参数:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<auth:Authentication env:mustUnderstand="1" xmlns:auth="http://www.h3c.com/netconf/base:1.0">
<auth:AuthInfo> 100002ea7bd8f3bbb727c5eff9b246d85be6</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface/>
</Interfaces>
</Ifmgr>
</filter>
</env:Body>
</env:Envelope>
<env:Envelope xmlns:env=”http://schemas.xmlsoap.org/soap/envelope/”>
<env:Header>
<auth:Authentication env:mustUnderstand=”true” xmlns:auth=”http://www.h3c.com/netconf/base:1.0”>
<auth:AuthInfo>10027c2abebdb482633f847102fbc890d22a</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<rpc-reply message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
<Syslog>
<LogBuffer>
<BufferSize>527</BufferSize>
</LogBuffer>
<LogHosts>
<Address>1.1.1.1</Address><Port>123</Port>
<Facility>152</Facility>
</Host>
<Address>1.1.1.1</Address><VRF>a</VRF>
<Port>123</Port>
<Facility>152</Facility>
</Host>
<Address>1.1.1.1</Address><VRF>b</VRF>
<Port>123</Port>
<Facility>152</Facility>
</Host>
<Address>1.1.1.1</Address>
<VRF>c</VRF><Port>123</Port>
<Facility>152</Facility>
</Host>
</LogHosts>
</Syslog>
</data>
</rpc-reply>
</env:Body>
</env:Envelope>
Comware NETCONF 中, CLI 操作返回的数据因为是命令行的原始输出,故统一使用 CDATA 标记来封装,以防止客户端程序解析 XML 出现错误。使用时,客户端需要从 CDATA 中抽取返回结果。
Comware NETCONF 中, XML 请求对注释没有要求,可以随意添加合法的注释。 XML 应答中不包含 XML 注释。
请求中,如果要保持两端的空格字符,必须对最开始和最后一个空格进行转义,转义遵循 W3C XML 规范。如果不进行转义,则两端连续的空格会被忽略。
应答元素的值中,两端最外侧的空格会被 Comware NETCONF 转义。
如果需要使用一个当前编码不能支持的字符时,可以使用标准的 W3C XML 规范来进行转义,比如 	 代表一个 Tab 键。
Comware NETCONF 支持使用 gb2312 、 GB18030 、 utf-8 、 utf-16 、 utf-16BE 、 utf-16LE 、 utf-32 、 utf-32BE 、 utf-32LE 进行传输。默认情况下,如果请求中不指定 XML 传输格式,将使用 utf-8 作为默认编码,转换编码过程中,如果出现类似半个汉字之类无法转换的情况,将使用 ? 来替代无法转换的字符。
表1-2 NETCONF 相关协议规范
Comware NETCONF 支持的能力集如 表 1-3 所示。除 RFC 中定义的标准能力集外, Comware NETCONF 还定义了一些私有能力集。私有能力集没有对应的 RFC ,因此,私有能力集的 RFC 列取值为“ - ”。
表1-3 Comware NETCONF 的能力集 支持情况
module-specified-namespace:1.0
urn:h3c:params:netconf:capability:module-specified-namespace:1.0
(5) 准备 NETCONF 客户端
按照 RFC 4741 的描述准备客户端软件、基于 SOAP 请求的脚本或程序,使其能发送 hello 和 close-session 。具体方法请参见客户端软件的操作指导等。
依据需要使用的访问方式,使用准备好的 NETCONF 客户端连接到设备。
测试建立连接( hello )和断开连接( close-session )的能力,使后续工作能够正常进行 。
(8) 验证准备的 NETCONF 请求 XML 报文的正确性
使用工具或命令行 XML 方式来验证 XML 报文的正确性。
(9) 将请求集成到客户端脚本或程序
把测试好的 XML 报文集成到客户端程序中。
(10) (可选) 最佳实践建议
通过 NETCONF 客户端配置和管理设备时,在某些特殊情况下需要进行特殊处理。例如,容错处理、大数据量处理、并发处理等。
(11) (可选) 常见问题及处理方法
完成上述操作后,即可使用 NETCONF 客户端程序执行 NETCONF 操作管理设备。 Comware 支持操作的详细介绍,请参见“ 4 执行 Comware NETCONF 请求 ”。
用户可通过以下方式来使用 NETCONF 配置和管理设备:
· 通过 Telnet 、 SSH 或 Console 登录到设备并进入 XML 视图,将合法的 NETCONF 报文(报文格式请参见“ 1.3.1 NETCONF ”)直接拷贝、粘贴到命令行中执行,即可实现对设备的配置和管理。该方式一般用于研发和测试环境。
· 使用配置工具与设备建立连接并向设备下发 NETCONF 指令来实现对设备的配置和管理。配置工具支持以下两种传输方式:
¡ NETCONF over SSH 传输方式:配置工具采用该方式与设备建立 SSH 连接后,可下发 NETCONF 格式报文(报文格式请参见“ 1.3.1 NETCONF ”)配置和管理设备。
¡ NETCONF over SOAP 传输方式:该方式通过 HTTP/HTTPS 与设备建立连接,并将 NETCONF 指令用 SOAP 封装成通用格式的报文后发送给设备,报文格式请参见“ 1.3.2 NETCONF over SOAP ”。 使用该方式前 设备上 必须开启 NETCONF over SOAP 功能。
客户可以根据需要选择 NETCONF 传输方式,开发和定制自己专用的配置工具软件,也可以使用第三方开发的配置工具。第三方的配置工具有:
· 采用 NETCONF over SSH 传输方式配置工具 : NETCONF B rowser 等 。
· 采用 NETCONF over SOAP 传输方式配置工具 : SOAP UI 等。
关于各配置工具的使用方法,请参见配置工具的使用指导文档。
H3C 设备目前支持如下访问方式:
非 FIPS 模式下:
· NETCONF over SSH
· NETCONF over Telnet
· NETCONF over Console
· NETCONF over SOAP over HTTP
· NETCONF over SOAP over HTTPS
FIPS 模式下:
· NETCONF over SSH
· NETCONF over Console
· NETCONF over SOAP over HTTPS
使用不同配置方式时,需要使用的访问方式不同:
· 使用 Telnet 或 SSH 登录到设备 , 进入 XML 视图执行 NETCONF 配置时 , 需要使用 NETCONF over Telnet 访问方式。
· 使用 Console 登录到设备 , 进入 XML 视图执行 NETCONF 配置时 , 需要使用 NETCONF over Console 访问方式。
· 使用 SSH 配置工具( 例如 NETCONF B rowser ) 执行 NETCONF 配置时 , 需要使用 NETCONF over SSH 访问方式。
· 使用 SOAP 配置工具 下发 NETCONF 指令配置设备时,需要使用 NETCONF over SOAP over HTTP 或 NETCONF over SOAP over HTTPS 方式。
使用配置工具与设备建立 NETCONF 连接前,需要确保 NETCONF 用户具有对应的操作权限。
Comware 通过 RBAC ( Role Based Access Control ,基于角色的访问控制) 实现基于角色的用户访问权限控制。 RBAC 对用户权限的控制包括用户角色规则和资源控制策略两个方面:
· 用户角色规则用来控制用户对系统功能的操作权限。例如,定义用户角色规则允许用户配置 A 功能,或禁止用户配置 B 功能。
· 资源控制策略用来控制用户对系统资源的操作权限。例如,定义资源控制策略允许用户操作 VLAN 10 。
在用户角色规则方面, NETCONF 用户角色需要具有如下权限:
· 执行 NETCONF 操作需要具有执行 XML 元素 NETCONF RPC 节点的权限,不同 NETCONF 操作需要的权限不同,具体请参见 表 2-1 。
· 执行 NETCONF 操作内容的权限,即用户执行 XML 元素(具体模块或模块中表的 Xpath )的权限。 例如 , 配置用户具有执行接口模块 XML 元素的权限 时 ,需要执行 rule number permit read write execute xml-element ifmgr/ 命令。
在资源策略方面,可以根据实际需要配置用户角色操作接口、 VLAN 、 VPN 、安全域的权限。缺省情况下,用户具有操作所有资源的权限。
不同用户角色的操作权限有所不同:
· 缺省用户角色 network-admin 、 mdc-admin 、 context-admin 具有操作对应设备 /MDC/Context 的所有功能和资源(除安全日志文件管理相关命令 display security-logfile summary 、 info-center security-logfile directory 、 security-logfile save 之外)的权限 。 如果用户所属角色是这几种,则只需要指定用户角色为 network-admin 、 mdc-admin 或 context-admin 即可。
· 缺省用户角色 network-operator 、 context-operator 和 mdc-operator 默认只有读权限 和部分可执行权限 ,必须事先配置后才有对应的操作权限。
· 其他用户角色必须事先配置后才有对应的操作权限。
NETCONF 操作需要权限的详细介绍请见 表 2-1 。
表2-1 执行 NETCONF 操作需要配置的权限
¡ 配置用户具有执行 XML 元素 NETCONF RPC 节点的权限。
rule number permit { execute | read | write } * xml-element rpc/
通过 rule number permit { execute | read | write } * xml-element rpc/? 可以查看具体操作的列表。不指定具体操作时,表示所有操作。
¡ 配置用户执行 XML 元素具体模块的权限。
rule number { deny | permit } { execute | read | write } * xml-element [ module-xpath ]
通过 rule number { deny | permit } { execute | read | write } * xml-element ? 可以查看具体模块列表,通过 rule number { deny | permit } { execute | read | write } * xml-element module-name/ ? 可以查看模块中具体表的列表。不指定具体模块和表时表示所有模块 / 所有表。
本配置用来为 NETCONF 用户指定如下属性:
· 根据 NETCONF 访问方式,指定正确的服务类型: 使用 NETCONF over SSH 访问方式 时,用户的服务类型为 SSH ; 使用 NETCONF over SOAP over HTTP 访问方式时,用户的服务类型为 HTTP ;使用 NETCONF over SOAP over HTTPS 访问方式 时,用户的服务类型为 HTTPS 。
· 为用户指定用户角色,使其具有所需权限。
本文以本地认证为例,介绍配置过程。使用远程认证的配置方式请参见产品对应版本的 AAA 配置指导。
(1) 进入系统视图。
system-view
(2) 添加设备管理类本地用户,并进入设备管理类本地用户视图。
local-user user-name class manage
(3) 设置本地用户的密码。
(非 FIPS 模式)
password [ { hash | simple } string ]
( FIPS 模式)
password
在非 FIPS 模式下,可以不为本地用户设置密码;在 FIPS 模式下,必须且只能通过交互式方式设置明文密码,否则用户的本地认证不能成功。
(4) 设置本地用户可以使用的服务类型。请根据访问方式选择其中一项进行配置
¡ 使用 NETCONF over SSH 访问方式:
service-type
¡ 使用 NETCONF over SOAP over HTTP 或 NETCONF over SOAP over HTTPS 访问方式:
(非 FIPS 模式)
service-type { http | https } *
( FIPS 模式)
service-type https
缺省情况下,本地用户不能使用任何服务类型。
(5) 设置本地用户的角色。
authorization-attribute user-role role-name
以下配置步骤只介绍采用 password 方式认证 SSH 客户端的配置方法, publickey 方式的配置方法及 SSH 的详细介绍,请参见“安全配置指导”中的“ SSH ”。
(1) 进入系统视图。
system-view
(2) 生成本地密钥对。
(非 FIPS 模式)
public-key local create { dsa | ecdsa [ secp192r1 | secp256r1 | secp384r1 | secp521r1 ] | rsa } [ name key-name ]
( FIPS 模式)
public-key local create { dsa | ecdsa [ secp256r1 | secp384r1 | secp521r1 ] | rsa } [ name key-name ]
(3) (可选)创建 SSH 用户,并指定 SSH 用户的服务类型为 NETCONF ,认证方式为 password 。
ssh user username service-type netconf authentication-type password
(4) 进入 VTY 用户线或 VTY 用户线类视图。
¡ 进入 VTY 用户线视图。
line vty first - number [ last-number ]
¡ 进入 VTY 用户线类视图。
line class vty
(5) 配置 VTY 用户线的认证方式为 scheme 方式。
(非 FIPS 模式)
authentication-mode scheme
缺省情况下, VTY 用户线的认证方式为 password 方式。
( FIPS 模式)
authentication-mode scheme
缺省情况下, VTY 用户线的认证方式为 scheme 方式。
(1) 进入系统视图。
system-view
(2) 开启 NETCONF over SSH 。
netconf ssh server enable
缺省情况下, NETCONF over SSH 处于关闭状态。
(3) 配置 NETCONF over SSH 的监听端口。
netconf ssh server port port-number
缺省情况下, NETCONF over SSH 的监听端口为 830 。
(4) (可选)开启 NETCONF 日志功能。
netconf log source { all | { agent | soap | web } * } { protocol-operation { all | { action | config | get | set | session | syntax | others } * } | row-operation | verbose }
缺省情况下, NETCONF 日志功能处于关闭状态。
(5) 通过 SSH 配置工具与设备建立 NETCONF over SSH 会话。关于 SSH 配置工具的使用方法,具体参见 SSH 配置工具的配置指导。
使用 NETCONF over SOAP over HTTP 或 NETCONF over SOAP over HTTPS 访问方式时,配置工具将配置指令封装成 SOAP 报文后通过 HTTP 或 HTTPS 协议传输到设备。
本文仅介绍基本配置,有关 SOAP 报文的 DSCP 优先级、 NETCONF 客户端访问控制、 NETCONF 用户使用的认证域等相关内容请参见产品对应版本的 NETCONF 配置、 NETCONF 命令手册。
(1) 进入系统视图。
system-view
(2) 开启 NETCONF over SOAP 功能。
(非 FIPS 模式)
netconf soap { http | https } enable
( FIPS 模式)
netconf soap https enable
缺省情况下, NETCONF over SOAP 处于关闭状态。
(3) (可选)开启 NETCONF 日志功能。
netconf log source { all | { agent | soap | web } * } { protocol-operation { all | { action | config | get | set | session | syntax | others } * } | row-operation | verbose }
缺省情况下, NETCONF 日志功能处于关闭状态。
(4) 通过配置工具与设备建立 NETCONF over SOAP 会话。关于配置工具的使用方法,具体参见配置工具的配置指导。
· data 命名空间:提供系统的运行状态数据和配置数据,为只读,支持下发 get 和 get-bulk 操作。
· config 命名空间 : 提供系统的配置数据信息,可读写,支持下发 get-config 、 get-bulk-config 和 edit-config 操作。
· action 命名空间:通常提供系统非配置类的操作(如 ping 、 reset 操作),可执行,支持下发 action 操作。
· event 命名空间: 提供系统的事件数据信息,支持通过 create-subscription 操作订阅指定类型的事件。
每一个支持 NETCONF 的模块都包括一个或者多个 NETCONF API 文档,分别描述其在 data 命名空间、 config 命名空间、 action 命名空间和 event 命名空间的功能。文档命名遵循如下格式,其中 XXX 代表模块名:
· data 命名空间: Comware XXX NETCONF XML API Data Reference.docx
· config 命名空间: Comware XXX NETCONF XML API Configuration Reference.docx
· action 命名空间: Comware XXX NETCONF XML API Action Reference.docx
· event 命名空间: Comware XXX NETCONF XML API Event Reference.docx
NETCONF 模块可能还存在一个名为 Comware XXX NETCONF XML API Error Message Reference.docx 的模块错误提示信息参考文档,该文档用来描述模块操作过程中的各种错误。
每一个 NETCONF API 文档对应一个功能模块,如 ARP 、 DHCP 。每个模块由一个或者多个表组成。表以行和列的形式进行组织:
· 行:表示一个对象实例。
· 列:表示每个对象实例中包含的信息。
以 ARP 表为例,一条 ARP 表项为一行, ARP 表项中的 IP 地址、 MAC 地址、所属 VLAN 等为列。
在 NETCONF API 文档中,每个表包含下面几个部分的信息:
· 表名称:提供了从模块开始的路径和最终的表名,如: ACL/Base
· 表的 XML 结构( XML structure ):列举了本表从模块开始的 XML 表示方式,但不包括值信息,例如:
NETCONF API 文档介绍了 NETCONF 请求报文(参见“ 1.3 NETCONF 报文格式 ” )中 H3C 自定义部分的模块信息语法。构造某一请求时,需要先根据操作类型查找对应模块、对应空间的 API 文档来获取需要的 XML 结构,如 表 2-2 所示。
表2-2 操作类型与 API 文档对应关系
获取到所需模块的 NETCONF API 文档后,应当先确认需要的功能是否已经支持。若已经支持,则可以依据真实需求,构造所需报文。一般情况下,可以从对应的表的 XML Structure 部分开始,依据如下步骤构造 NETCONF 请求:
(1) 构造 XML 请求的协议定义部分,即 top 外层的部分。
以 get 操作为例, top 以外的部分为协议定义部分,可以直接从现有请求或者本文档拷贝。
message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter>
xmlns="http://www.h3c.com/netconf/data:1.0">
指定模块,子模块,表名,列名
</filter>
其他操作的协议定义部分格式,请参见“ 4 执行 Comware NETCONF 请求 ”。
(2) 构造 top 元素。
top 元素 的格式通常为: <top xmlns="http://www.h3c.com/netconf/data:1.0"> 。其中, http://www.h3c.com/netconf/data:1.0 为 H3C 自定义的命名空间,需要根据需要设置为 data 、 config 或 action 命名空间,即 data:1.0 也可根据需要设置为 config:1.0 或 action:1.0 。
(3) 构造模块操作部分。
拷贝 NETCONF API 文档中表格 XML 结构到“指定模块,子模块,表名,列名”部分,然后依据实际情况删除不需要的列或者为已知列赋值。
目前产品发布时,会同步发布该产品支持的 XSD 文件。用户也可以根据 XSD 文件构造 NETCONF 请求。构造方法与 NETCONF API 类似,本文不再赘述。
Comware NETCONF 请求遵循 NETCONF 协议,可通过 get-schema 操作获取设备上某个 YANG 文件内容,通过获取 netconf-state 操作获取设备上所有 YANG 文件列表,详细介绍请参见“ 4.2.10 get-schema 操作 ”和“ 4.2.11 获取 netconf-state 操作 ”。
用户也可以根据 YANG 文件构造 NETCONF 请求。构造方法与 NETCONF API 类似,本文不再赘述。
Comware 目前支持使用 NETCONF over Telnet 、 NETCONF over Console 、 NETCONF over SSH 、 NETCONF over SOAP over HTTP 、 NETCONF over SOAP over HTTPS 几种方式访问 NETCONF 功能。按其访问方式不同, NETCONF 的访问方式可以分为下面 3 类:
· 客户端使用 SOAP 方式连接到设备 :即 NETCONF over SOAP over HTTP 和 NETCONF over SOAP over HTTPS 方式。
· 客户端使用 NETCONF over SSH 访问 方式连接到设备 :即 NETCONF over SSH 方式。
· 客户端使用 Telnet/SSH/Console 以命令行方式连接到设备 :即 NETCONF over Telnet 、 NETCONF over Console 和 NETCONF over SSH 方式。
使用前,需要先确定 NETCONF 客户端选取的访问方式,并在设备上使能对应的功能。使能对应功能后, NETCONF 客户端即可使用对应的连接手段访问设备的 NETCONF 功能。
配置完设备后,客户端通过 HTTP/HTTPS 协议,向设备的 80 端口( HTTP )或者 832 端口( HTTPS )的 URL 地址 /soap/netconf/ ,发送 SOAP 包装过的 NETCONF xml 请求来进行配置。例如,设备地址为 192.168.1.1 ,则请求地址为:
· HTTP 方式: http://192.168.1.1/soap/netconf/
· HTTPS 方式: https://192.168.1.1:832/soap/netconf/
如 图 2-1 所示,登录时,用户名和密码分别放在元素 \Envelope\Header\Authentication\UserName 和元素 \Envelope\Header\Authentication\Password 中。
其中,元素 Authentication 必须满足原则:
· 属于 命名空间 http://www.h3c.com/netconf/base:1.0 。
· 具有 http://www.w3.org/2003/05/soap-envelope 命名空间下的 mustUnderstand 属性,且属性值必须为 1 或者 true 。
如 图 2-2 所示,登录成功后,返回的元素 \Envelope\Header\Authentication\AuthInfo 的值为下次请求的凭据,客户端必须保留此凭据作为下次请求的凭证。
必须使用 hello 报文返回的凭据作为下次请求的依据,才能成功进行登录后的请求,凭据放在 \Envelope\Header\Authentication\AuthInfo 中。
· 连接为短连接,发送每个请求并接收到应答后,断开与服务器的连接。因此不支持事件订阅。
· 所有请求和正常应答都在外层封装一个 SOAP 层,只有 Body 层才封装 RPC 请求。
· 基于 SOAP 的 NETCONF 请求支持多线程并行发送请求,但不要在同一个会话中超过 4 个并发,一个会话超过 4 个并发的请求会被拒绝并返回资源不足的错误。
在设备上完成 NETCONF over SSH 连接相关配置后,客户端可通过 NETCONF over SSH 访问方式来配置和管理设备。访问过程遵循 RFC 4742 。
一般情况下,客户端需要提供 IP 地址、用户名、密码、子系统、端口这几个信息。
Banner 、欢迎、前置法律告警在下发到 NETCONF over SSH 之前可能会被传递到客户端,这些信息应当被客户端忽略。
客户端通过 Telnet 、 SSH 或 Console 方式登录设备的命令行终端后,执行 xml 命令进入 XML 视图, 将合法的 NETCONF 报文直接拷贝、粘贴到命令行提示符处执行,即可实现对设备的配置和管理。
使用 Telnet/SSH/Console/NETCONF over SSH 模式连接成功后,会收到服务器发送的 hello 报文,格式如下,收到后即可确认和设备连接是正常的:
<?xml version=”1.0” encoding=”UTF-8”?><hello xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”><capabilities><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:writable-running:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.0</capability><capability>urn:ietf:params:netconf:capability:interleave:1.0</capability><capability>urn:h3c:params:netconf:capability:h3c-netconf-ext:1.0</capability></capabilities><session-id>1</session-id></hello>
使用 SOAP 方式连接后,收到如下格式的 hello 报文,可确认 NETCONF 客户端和设备连接是正常的:
<env:Envelope xmlns:env=”http://www.w3.org/2003/05/soap-envelope”>
<env:Header>
<auth:Authentication env:mustUnderstand=”true” xmlns:auth=”http://www.h3c.com/netconf/base:1.0”>
<auth:AuthInfo>1001e17d1916e60ef0068f3c6387d4410a1b</auth:AuthInfo>
</auth:Authentication>
</env:Header>
<env:Body>
<hello xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:writable-running:1.0</capability>
<capability>urn:ietf:params:netconf:capability:notification:1.0</capability>
<capability>urn:ietf:params:netconf:capability:validate:1.0</capability>
<capability>urn:ietf:params:netconf:capability:interleave:1.0</capability>
<capability>urn:h3c:params:netconf:capability:h3c-netconf-ext:1.0</capability>
</capabilities>
<session-id>1</session-id>
</hello>
</env:Body>
</env:Envelope>
建立 NETCONF 连接后,客户端和设备必须交换各自支持的能力集,双方收到对方的能力集后才可以进行下一步操作。
设备会发送如下报文自动告知客户端支持的 NETCONF 能力集:
· <capabilities> 和 </capabilities> 之间的内容表示设备支持的能力集,以设备实际返回值为准。
· <session-id> 和 </session-id> 之间的内容表示为本次会话分配的会话 ID ,用来唯一标识本次会话。
客户端收到设备发送的能力集协商报文后,需要给设备发送如下格式的报文,告知设备客户端支持哪些 NETCONF 能力集。
Hello 协商报文格式如下:
<hello xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<capabilities>
<capability>
capability-set
</capability>
</capabilities>
</hello>
其中, capability-set 表示客户端支持的能力集,由用户定义。一个 <capability> 和 </capability> 选项对中填写一个能力集,可以使用多个选项对,发送多个能力集。
对于 NETCONF over SSH 功能,按照协议规定,如果两者都有 Base 1.1 的能力,将自动使用 Base1.1 规定的访问方式进行通信,故客户端需要检查服务器返回的能力集,依据能力集进行通信协议调整。
<rpc message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<close-session/>
<?xml version=”1.0” encoding=”UTF-8” ?>
<rpc-reply message-id=”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
</rpc-reply>
连接到设备后,使用准备好的 XML 来查看请求是否正确。
推荐使用 SOAP UI 开源工具或者直接使用命令行 XML 方式来验证。
SOAP UI 执行的结果,如 图 2-5 所示。
图2-5 SOAP UI 下发 XML 请求及返回结果举例
使用命令行方式验证时,需要注意:
· 尽量避免在 Console 上使用,推荐在 Telnet 或者 SSH 下使用命令行的方式进行验证。由于串口上存在速度限制,且 XML 下无回显,在 Console 口上使用命令行方式验证很容易出现错误。
· 尽量避免手敲,尽可能拷贝和粘贴准备好的 XML 脚本。
· 与 SOAP 方式不同,命令行模式需要 ]]>]]> 作为结束符。
当准备好的 XML 经过验证是正确的后,可以把验证好的 XML 集成到自己的客户端程序中。如果是无人值守的程序,需要考虑超时、断线等异常情况,以保证长时间情况下也能正确运行。
客户端应答需要考虑在某些情况下的异常恢复,如连接断开的情况、 XML 应答结果不是良好格式的情况、长时间不能得到结果的情况。
系统中部分表的数据量可能非常大,不适合在一次请求中把数据全部取出,此时可以考虑使用 get-bulk 操作配合 count 属性。每次获取一定量的数据,取完需要下一批数据时,使用最后一条数据的索引为条件,继续使用 get-bulk ,直到获取到所有的数据为止。
另外,在处理大数据量请求时,请考虑 TCP 底层超时的情况发生,需要适当放大底层 TCP timeout 参数的值,最好在客户端部署到生产环境前对最大数据情况进行模拟,以期找到一个合适的超时时间。
系统支持多个用户或者会话同时下发 NETCONF 请求,但需要注意的是:
· 多个 edit-config 同时来变更系统时,如果不加锁,系统最终状态不一定是最终要求的状态。如果携带了错误后自动回滚的选项( edit-config 携带的 error-option 取值为 rollback-on-error ,详细介绍请参见 表 4-7 ),则多人情况下,可能会回退他人的修改。如果有可能,应当避免多个 NETCONF 客户端同时修改系统,或者对所有请求进行加锁后再下发。加锁方法的详细介绍,请参见“ 4.2.3 lock 操作 ”。
· 通过 lock 操作对当前 NETCONF 会话加锁后,用户仅可以通过该 NETCONF 会话配置设备。无法通过其他 NETCONF 会话、其他配置方式(如命令行或 SNMP )配置设备。
· 多个 get 系列操作或者 edit-config 请求并发时,不能保证一定得到线性的性能提升,视请求占用资源的情况,随着请求的数量增加,单个请求响应时间会加长,整体时间的缩短逐渐减小。
通过 SOAP 发送请求时,当不再使用会话时,建议使用 close-session 请求关闭当前会话。但需要注意的是:通过 close-session 关闭会话后,客户端有可能无法收到应答。
当 debug 开关打开时,设备可能会生成大量的 debug 日志,导致正常响应滞后。因此,不建议通过 NETCONF 接收 Debug 级别的日志。
SOAP 同时支持 HTTP 和 HTTPS 用户,但不能串用:不能用 HTTP 登录后,使用 HTTP 的 AuthInfo 通过 HTTPS 访问;反之亦然。
可能的原因是输入没有完成,可以通过手工敲入 ]]>]]> 查看是否真的没有反应。一般情况下,输入 ]]>]]> 后能看到一个应答,提示 XML 输入错误。为了解决该问题,需要在确认输入 XML 无误的情况下,使用拷贝粘贴的方式进行,不要手工敲击 XML 命令片段。
· 由于 Console 口的速率限制问题,在 Console 口上即使拷贝粘贴,也可能出现丢失字符导致无法正确解析和应答的情况。 除非对 Comware 系统非常熟悉, 否则, 不要在 C onsole 上直接敲 XML 命令。
· 如果已经在 Console 敲了 XML 命令,可以通过输入 ]]>]]> 之后准备一个 close-session 消息 ,拷贝粘贴后等待退出。 close-session 消息 的详细介绍,请参见“ 2.7.2 断开 NETCONF 连接 ”。
因为系统中某些请求可能耗时很长,对于 SOAP 方式的请求,客户端软件可能设置了服务器的应答超时时间。当响应时间超过超时时间时,客户端软件直接返回失败。
为避免上述情况发生,建议:
· 逐渐调整客户端 socket 的超时时间,使之处于一个合适的数值。
· 通过过滤功能对需要获取的数据进行过滤,尽量避免获取整机数据。过滤功能的详细介绍,请参见“ 5 Comware NETCONF 数据过滤功能 ”。
设备上可使用 表 2-3 和 表 2-4 中的命令辅助调试 NETCONF 功能 。
表2-3 SOAP 相关
· 会话 闲置时间超期 。
会话期间,属于此会话的每一个请求都是一个新的 TCP 连接,应答完成后, TCP 连接关闭。后续请求依赖第一个 hello 报文返回的 AuthInfo 来标识其身份。如果最后一个请求之后会话闲置时间超过 NETCONF 会话超时时间(可通过 netconf idle-timeout 命令配置,缺省为 10 分钟) ,则此会话自动被关闭。如果希望保持会话,可以每隔一段时间,发送一个使用 AuthInfo 来标识的 hello 报文给服务器,服务器返回和第一个 hello 相同的应答报文。
对于基于 NETCONF over Console/NETCONF over Telnet/NETCONF over SSH 的会话,从连接建立开始建立会话,在以下情况下关闭会话:
· 发送 close-session 主动 断开 会话。
· 被其他用户 通过 kill-session 关闭会话。
· 会话的 底层连接断开 。
· 会话闲置时间超期。缺省情况下,会话从建立到关闭期间,一直有效,且不会过期。通过 netconf idle-timeout 命令配置 NETCONF 会话超时时间后,如果 会话闲置时间超过 NETCONF 会话超时时间,则该会话会被关闭。
基于 SOAP 的会话可以通过多个线程,使用相同的 AuthInfo 来发送请求而互不干扰,但并发数量存在限制。不建议使用这个方式来进行并发。
基于其他方式连接的请求不支持同一个会话进行并发。
Comware NETCONF 中,权限分为 3 个部分,分别为协议级权限控制、模块级权限控制和实例级权限控制。其中:
· 协议级权限指的是 rpc-operation 需要的权限。
· 模块级权限指的是用户是否对模块、表、行、组、列具有访问权限。
· 实例级权限 指的是 具体到某个 VPN 、 Interface 、 VLAN 、 Secure Zone 的访问权限。
一个完整的请求如果要通过 RBAC ,必须确保 3 部分都有权限才能继续。
例如,下面 edit-config 例子中:
· 协议级权限:要求用户具有 rpc/edit-config/config/top 的写权限。
· 模块级权限 : 要求用户具有 Ifmgr/Interfaces/Interface 表的写权限。
· 实例级权限:要求用户具有接口索引为 3 的接口的写权限。
<rpc message-id =”101” xmlns=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<edit-config>
<target>
<running/>
</target>
<default-operation> merge</default-operation>
<test-option>set</test-option>
<error-option>continue-on-error</error-option>
<config xmlns:xc=”urn:ietf:params:xml:ns:netconf:base:1.0”>
<top xmlns=”http://www.h3c.com/netconf/config:1.0”>
<Ifmgr xc:operation=”delete”>
<Interfaces>
<Interface>
<IfIndex>3</IfIndex>
</Interface>
</Interfaces>
</Ifmgr>
</config>
</edit-config>
为了使 NETCONF 用户具有上述权限,需要为 NETCONF 用户赋予如下权限:
role name netconf
rule 1 permit write xml-element rpc/edit-config/config/top
rule 2 permit write xml-element ifmgr/interfaces/interface
interface policy deny
permit interface GigabitEthernet2/0/1
Comware NETCONF 的锁遵循 RFC 4741 中的描述,当一个 NETCONF 客户端持有锁时,其它的 NETCONF 客户端或非 NETCONF 客户端(命令行、 SNMP 等)均不可以执行系统配置操作。
NETCONF over SOAP ( over HTTP 和 over HTTPs )、 NETCONF over Telnet 、 NETCONF over Console 和 NETCONF over SSH 访问方式下,每一种访问方式支持的最大 NETCONF 会话个数均依赖于 AAA 会话最大个数的配置。
执行 Comware NETCONF 请求Comware NETCONF 支持的操作如 表 4-1 所示。
表4-1 Comware NETCONF 支持的操作速览表
NETCONF 支持用户对设备进行业务操作,包括对指定信息的获取和修改。基本标签有 <get> 、 <get-bulk> 、 <get-config> 、 <get-bulk-config> 和 <edit-config> ,分别用来获取所有数据、获取配置数据和编辑指定模块的数据。详细规则参见各个模块的 NETCONF XML API 手册。
<get-config> 和 <get-bulk-config> 用来获取系统中所有可配置的变量的值,配置的方式包括 CLI 、 MIB 、 Web 等。 <get-config> 和 <get-bulk-config> 操作报文中可以包含子标签 <filter> ,用来对要获取的信息进行过滤。
<get-config> 和 <get-bulk-config> 的通用报文格式如下:
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-config>
<source>
< datastore />
</source>
<filter>
<top xmlns="http://www.h3c.com/netconf/config:1.0">
指定模块,子模块,表名,列名
</filter>
</get-config>
其中, datastore 可以为 running 或 candidate :
默认情况下,当 NETCONF 正在执行 rollback 操作时,不允许下发 edit-config 请求。如需关闭这个限制,请使用 action 操作,详细介绍请参见“ 4.3.3 action 操作 ”。
<edit-config> 支持如下选项: merge 、 create 、 replace 、 remove 、 delete 、默认操作选项、默认错误处理选项、测试处理,关于这些选项的详细描述请参见 表 4-7 。
xmlns="http://www.h3c.com/netconf/config:1.0">
<I fmgr >
<Interfaces><Interface>
< If Index>1307</ If Index>
<Shutdown>1</Shutdown></Interface>
<Interface>
< If Index>1308</ If Index>
<Shutdown>1</Shutdown></Interface>
<Interface>
< If Index>1309</ If Index>
<Shutdown>1</Shutdown></Interface>
<Interface>
< If Index>1311</ If Index>
<VlanType>2</VlanType></Interface>
<Interface>
< If Index>1313</ If Index>
<VlanType>2</VlanType></Interface>
</Interfaces>
</I fmgr >
<Syslog>
<LogBuffer><BufferSize>120</BufferSize>
</LogBuffer>
</Syslog>
<System>
<Device>
<SysName>H3C</SysName>
<TimeZone>
<Zone>+11:44</Zone>
<ZoneName>beijing</ZoneName>
</TimeZone></Device>
</System>
< Fundamentals >
< WebUI >
< SessionAgingTime>98</SessionAgingTime>
</ WebUI >
</ Fundamentals >
</data>
</rpc-reply>
获取 Syslog 模块的所有配置数据 。
# 进入 XML 视图。
# 进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>
urn:ietf:params:netconf:base:1.0
</capability>
</capabilities>
</hello>
# 获取 Syslog 模块的所有配置数据。 请将以下报文拷贝、粘贴到客户端 。
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-config>
<source>
<running/>
</source>
<filter type="subtree">
<top xmlns="http://www.h3c.com/netconf/config:1.0">
<Syslog/>
</filter>
</get-config>
# 如果客户端收到类似如下的报文,则表示操作成功 。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
xmlns="http://www.h3c.com/netconf/config:1.0">
<Syslog>
<LogBuffer><BufferSize>120</BufferSize>
</LogBuffer>
</Syslog>
</data>
</rpc-reply>
进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
# 取接口表的一条数据。 请将以下报文拷贝、粘贴到客户端 。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:web="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-bulk>
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0" xmlns:web="http://www.h3c.com/netconf/base:1.0">
<Ifmgr>
<Interfaces web:count="1">
</Interfaces>
</Ifmgr>
</filter>
</get-bulk>
# 如果客户端收到类似如下的报文,则表示操作成功 。
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<IfIndex>3</IfIndex><Name>GigabitEthernet1/0/2</Name>
<AbbreviatedName>GE1/0/2</AbbreviatedName>
<PortIndex>3</PortIndex>
<ifTypeExt>22</ifTypeExt>
<ifType>6< /ifType>
<Description>GigabitEthernet 1/0/2 Interface</Description>
<AdminStatus>2</AdminStatus>
<OperStatus>2</OperStatus>
<ConfigSpeed>0</ConfigSpeed>
<ActualSpeed>100000</ActualSpeed>
<ConfigDuplex>3</ConfigDuplex>
<ActualDuplex>1</ActualDuplex>
</Interface>
</Interfaces>
</Ifmgr>
</data>
</rpc-reply>
将 Syslog 模块中的日志缓冲区可存储的信息条数修改为 512 。
# 进入 XML 视图。
# 进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
# 把 Syslog 模块 LogBuffer 表中的 BufferSize 列改成 512 。 请将以下报文拷贝、粘贴到客户端 。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:web="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config>
xmlns="http://www.h3c.com/netconf/config:1.0" web:operation="merge">
<Syslog>
<LogBuffer>
<BufferSize>512</BufferSize>
</LogBuffer>
</Syslog>
</config>
</edit-config>
如果客户端收到类似如下的报文,则表示操作成功 .
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
因为设备同时最多能建立 32 个 NETCONF 连接,即最多支持 32 个用户同时使用 NETCONF 功能管理和监控设备。所以,当用户管理、维护设备或者定位网络问题时,为防止其他 NETCONF 用户修改当前配置、引入干扰,可以使用本特性为当前配置加锁。为当前配置加锁后,只有持有锁的用户可以修改设备的当前配置,其他 NETCONF 用户、 CLI 、 WEB 等只能读取,不能修改当前配置。
只有持有锁的用户可以解锁,解锁后其他用户才可以修改设备的当前配置或另外加锁。如果持有锁的用户的当前连接断开,系统会自动解锁。
目前设备只支持对当前配置加锁,不能对具体的功能模块进行加锁。请将以下报文拷贝、粘贴到客户端,用户即能完成加锁操作 。
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<target>
< datastore />
</target>
</lock>
其中, datastore 可以为 running 或 candidate :
<get> 操作用来获取数据,包括运行状态数据和配置数据。
<get> 操作会返回所有符合条件的数据,在某些情况下,会导致获取数据效率不高。此时可以考虑使用 Comware 扩展的 <get-bulk> 操作。 <get-bulk> 允许用户从固定数据项开始,向后获取指定条目的数据记录,具体可参见“ 4.3.1 get-bulk 操作 ”。
<get> 报文的通用格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter>
<top xmlns="http://www.h3c.com/netconf/data:1.0">
指定模块,子模块,表名,列名
</filter>
</ get >
<filter> 选项用于过滤信息。过滤条件和过滤结果,请参见“ 5 Comware NETCONF 数据过滤功能 ”。 <filter> 中可包括模块名、子模块名、表名和列名 。
<get> 操作报文中还可以携带 count 参数,如下为一个携带了 count 参数的 <get> 操作报文示例:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="http://www.h3c.com/netconf/base:1.0">
<filter type="subtree">
<top xmlns="http://www.h3c.com/netconf/data:1.0" xmlns:base="http://www.h3c.com/netconf/base:1.0">
<Syslog>
<Logs xc:count="5">
<Index> </Index>
</Logs>
</Syslog>
</filter>
其中, <get> 操作报文中的 count 属性遵循如下约定:
· count 属性的位置可以从 top 下的节点( <Syslog> )开始,到表节点( <Logs> )为止,这几个位置都能放置 count 属性。如果在其他位置放置 count 属性,则会报告错误。
· count 放在模块节点上时,如果报文中指定的子孙节点(表)中没有 count 属性,则这些节点的 count 属性与模块节点的 count 属性一致。
· 如果 count 放在多级表节点上,只有父节点上的 count 生效;如果 count 放在子表节点上,则必须指定其祖先节点的所有索引列。
· 如果不指定 count ,则获取从指定索引开始的所有数据。
设备收到配置获取请求报文后,会将相应参数的值通过如下报文反馈给客户端 。
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
全部配置数据和状态数据
</data>
</rpc-reply>
close-session 操作用来关闭当前会话。
请将以下报文拷贝、粘贴到客户端,用户即能关闭当前的会话。
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<close-session/>
设备收到会话关闭请求后会回应客户端,当客户端收到如下报文时,表示当前会话已经被关闭。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
kill-session 操作用来关闭除自己外的另一个 NETCONF 会话,被关闭会话的用户退回到用户视图。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<kill-session>
<session-id>
指定 session-ID
</session-id>
</kill-session>
设备收到会话关闭请求后会回应客户端,当客户端收到如下报文时,表示指定会话已经被关闭 。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
当前有两个 NETCONF 登录用户, session ID 分别是 1 和 2 。 session ID 为 1 的用户要关闭另一个用户的会话。
# 进入 XML 视图。
# 进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>
urn:ietf:params:netconf:base:1.0
</capability>
</capabilities>
</hello>
关闭 session ID 为 2 的用户会话。 请将以下报文拷贝、粘贴到客户端 。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<kill-session>
<session-id>2</session-id>
</kill-session>
如果客户端收到如下报文,则表明 session ID 为 2 的 NETCONF 会话已经被关闭。建立该会话的用户会从 XML 视图退回到用户视图。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
NETCONF 支持 Syslog 事件、监控事件及模块上报事件三种类型的事件订阅。基于 NETCONF over Telnet/NETCONF over SSH 模式的连接支持事件订阅。
用户向设备订阅事件后,设备上发生用户订阅的事件时,设备会自动向订阅的客户端发送事件的相关信息,信息内容包括事件的 code 、 group 、 severity 以及发生时间和描述信息。此处可订阅的事件是指系统支持的日志信息。具体可以订阅哪些模块的事件,请参见《日志信息参考手册》。
· 通过在订阅报文中包括多个事件过滤选项,可以订阅多个事件。
· Comware 目前不支持事件回放。
· 在当前订阅存在的情况下,不支持继续订阅或者变更当前订阅。
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream>NETCONF</stream>
<filter>
<event xmlns="http://www.h3c.com/netconf/event:1.0">
<Code> code </Code>
<Group> group </Group>
<Severity> severity </Severity>
</event>
</filter>
<startTime> start-time </startTime>
<stopTime> stop-time </stopTime>
</create-subscription>
· stream 表示支持的事件流,目前只支持 NETCONF 。
· event 表示订阅的事件。
· code 表示 日志信息中的 助记符。
· group 表示 日志信息中的 模块名。
· severity 表示 日志信息中的 安全级别。
· start-time 表示订阅的开始时间。
· stop-time 表示结束 订阅的 时间 。
设备收到订阅报文后会回应客户端,当客户端收到如下报文时,表示订阅成功 。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101" xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply >
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<rpc-error>
<error-type> error-type </error-type>
<error-tag> error-tag </error-tag>
<error-severity> error-severity </error-severity>
<error-message xml:lang="en">error-message</error-message>
</rpc-error>
</rpc-reply>
订阅监控事件后, NETCONF 每隔指定时间获取一次所订阅事件,并将符合订阅条件的信息发送给用户。
事件订阅报文格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns='urn:ietf:params:xml:ns:netconf:notification:1.0'>
<stream>NETCONF_MONITOR_EXTENSION</stream>
<filter>
<NetconfMonitor xmlns='http://www.h3c.com/netconf/monitor:1.0'>
<XPath>XPath</XPath>
<Interval>interval</Interval>
<ColumnConditions>
<ColumnCondition>
<ColumnName>ColumnName</ColumnName>
<ColumnValue>ColumnValue</ColumnValue>
<ColumnCondition>ColumnCondition</ColumnCondition>
</ColumnCondition>
</ColumnConditions>
<MustIncludeResultColumns>
<ColumnName>columnName</ColumnName>
</MustIncludeResultColumns>
</NetconfMonitor>
</filter>
<startTime>start-time</startTime>
<stopTime>stop-time</stopTime>
</create-subscription>
表4-2 订阅监控事件属性说明
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream> XXX_STREAM </stream>
<filter type="subtree">
< event xmlns="http://www.h3c.com/netconf/event:1.0/ xxx -features-list-name:1.0">
< ColumnName xs:condition=" Condition "> value </ ColumnName >
</ event >
</filter>
<startTime> start-time </startTime>
<stopTime> stop-time </stopTime>
</create-subscription>
表4-3 订阅模块上报事件属性说明
当用户( IP 地址为 192.168.100.130 )登录设备时,设备会发送如下报文来通知订阅客户端 。
<?xml version="1.0" encoding="UTF-8"?>
<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<eventTime>2011-01-04T12:30:52</eventTime>
<event xmlns="http://www.h3c.com/netconf/event:1.0">
<Group>SHELL</Group><Code>SHELL_LOGIN</Code>
<Slot>6</Slot>
<Severity>Notification</Severity>
<context>VTY logged in from 192.168.100.130.</context>
</event>
</notification>
¡ 订阅监控事件举例
# 以 1s 为周期订阅 Device/Base 表。请将以下报文拷贝、粘贴到客户端。
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream>NETCONF_MONITOR_EXTENSION</stream>
<filter>
<NetconfMonitor xmlns="http://www.h3c.com/netconf/monitor:1.0">
<XPath>Device/Base</XPath><Interval>1</Interval>
<ColumnConditions>
<ColumnCondition><ColumnName>HostName</ColumnName>
<ColumnValue>H3C</ColumnValue>
<ColumnCondition>include</ColumnCondition>
</ColumnCondition>
</ColumnConditions>
</NetconfMonitor>
</filter>
</create-subscription>
# 如果客户端收到如下报文,则表示订阅成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
</rpc-reply>
之后设备以 1s 周期间隔发送如下报文通知订阅客户端。
<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<eventTime>2020-02-22T09:28:14</eventTime>
<NetconfMonitor xmlns="http://www.h3c.com/netconf/monitor:1.0">
<Device xmlns="http://www.h3c.com/netconf/data:1.0">
<HostName>H3C</HostName>
</Base>
</Device>
</NetconfMonitor>
</notification>
¡ 订阅模块上报事件举例
# 订阅 Ifmgr 模块的所有事件。请将以下报文拷贝、粘贴到客户端。
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0">
<stream>Ifmgr</stream>
</create-subscription>
# 如果客户端收到如下报文,则表示订阅成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
</rpc-reply>
当接口 deactive 时,设备会发送如下报文通知订阅客户端。
<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<eventTime>2020-02-22T09:32:10</eventTime>
<InterfaceEvent xmlns="Ifmgr:1.0">
<Interface>
<Name>GigabitEthernet2/0/2</Name>
<Status>IF_DEACTIVE</Status>
<IfIndex>286</IfIndex><AdminStatus>ADMIN_UP</AdminStatus>
<OperStatus>OPER_DOWN</OperStatus>
<Description>The Interface GigabitEthernet2/0/2 occurred IF_DEACTIVE event,the administration status is ADMIN_UP,operation status is OPER_DOWN.</Description>
</Interface>
</InterfaceEvent>
</notification>
当接口 active 时,设备会发送如下报文通知订阅客户端:
<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<eventTime>2020-02-22T09:32:10</eventTime>
<InterfaceEvent xmlns="Ifmgr:1.0">
<Interface>
<Name>GigabitEthernet2/0/2</Name><Status>IF_ACTIVE</Status>
<IfIndex>286</IfIndex>
<AdminStatus>ADMIN_UP</AdminStatus>
<OperStatus>OPER_DOWN</OperStatus>
<Description>The Interface GigabitEthernet2/0/2 occurred IF_ACTIVE event,the administration status is ADMIN_UP,operation status is OPER_DOWN.</Description>
</Interface>
</InterfaceEvent>
</notification>
validate 操作用来验证指定的 XML 请求格式和其他约束是否正确。 Comware 系统中,只进行基本的格式检查,不下发到后台模块进行进一步的约束检查。故即使 validate 检查通过,不代表此请求一定能成功。因为其他操作也会进行格式检查,所以客户端可以直接使用其他操作进行下发,不必使用 validate 来保证格式的正确性。
<get-schema> 操作用来获取设备上指定 NETCONF 模型文件内容,目前仅支持 YANG 文件的获取。
<get-schema> 报文的通用格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-schema xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
<identifier>syslog-data</identifier>
<version>2015-05-07</version>
<format>yang</format>
</get-schema>
其中, Identifier 、 version 、 format 三列请参见“ 4.2.11 获取 netconf-state 操作 ”。
设备收到请求报文后,会将指定 YANG 文件的内容通过如下报文反馈给客户端。
<?xml version="1.0"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
指定 yang 文件内容 数据
</data>
</rpc-reply>
获取 netconf-state 可返回下面五种类型的数据:
· <netconf-state><capabilities/></netconf-state> 用来获取设备支持的能力集列表 。
· <netconf-state><datastores/></netconf-state> 用来获取设备上的 NETCONF 配置库信息列表 。
· <netconf-state><schemas/></netconf-state> 用来获取设备支持的 schemas 文件信息列表 。
· <netconf-state><sessions/></netconf-state> 用来获取设备上的 NETCONF 会话信息列表 。
· <netconf-state><statistics/></netconf-state> 用来获取设备 NETCONF 全局统计信息。
获取 netconf-state 报文的通用格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type='subtree'>
<netconf-state xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
< getType />
</netconf-state>
</filter>
· getType 可以为 capabilities 、 datastores 、 schemas 、 sessions 或者 statistics 。 如果不指定 getType ,则表示获取 <netconf-state> 下全部类型的 neconf-state 数据。
· 此操作目前不支持过滤。
(1) 客户端发送报文
version="1.0" encoding="UTF-8" ?>message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type='subtree'>
<netconf-state xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
<capabilities/>
</netconf-state>
</filter>
(2) 结果验证
# 如果客户端收到类似如下的报文,则表示操作成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<netconf-state xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
<capability>urn:ietf:params:netconf:capability:writable-running:1.0</capability>
<capability>urn:ietf:params:netconf:capability:notification:1.0</capability>
</capabilities>
</netconf-state>
</rpc-reply>
其中,能力集列表以设备实际返回值为准。
(1) 客户端发送报文
<?xml version="1.0" encoding="UTF-8" ?>
message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type='subtree'>
<netconf-state xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
<datastores/>
</netconf-state>
</filter>
(2) 结果验证
# 如果客户端收到类似如下的报文,则表示操作成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<netconf-state xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<datastores>
<datastore>
<name>running</name>
<locks>
<global-lock><locked-by-session>1</locked-by-session>
<locked-time>2015-07-30T12:54:45</locked-time>
</global-lock>
</locks>
</datastore>
</datastores>
</netconf-state>
</rpc-reply>
¡ 设备目前仅支持 running 库 。
¡ locks 表示 用户是否持有锁及锁信息。
(1) 客户端发送报文
version="1.0" encoding="UTF-8" ?>message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type='subtree'>
<netconf-state xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
<schemas/>
</netconf-state>
</filter>
(2) 结果验证
# 如果客户端收到类似如下的报文,则表示操作成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<netconf-state xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<schemas>
<schema>
<identifier>syslog-data</identifier>
<version>2015-05-07</version><format>yang</format>
<namespace>http://www.h3c.com/netconf/data:1.0</namespace>
<location>NETCONF</location>
</schema>
</schemas>
</netconf-state>
</rpc-reply>
¡ identifier 、 version 、 format 作为 <get-schema> 操作的输入参数可获取相应文件的具体内容。
¡ format 列目前仅支持 YANG 格式。
¡ namespace 表示本文件的命名空间。
¡ location 表示文件的存放位置,目前仅支持 NETCONF , 即存放于设备磁盘上。
(1) 客户端发送报文
<?xml version="1.0" encoding="UTF-8" ?>
message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type='subtree'>
<netconf-state xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
<sessions/>
</netconf-state>
</filter>
(2) 结果验证
# 如果客户端收到类似如下的报文,则表示操作成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<netconf-state xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<sessions>
<session>
<session-id>1</session-id>
<transport>netconf-soap-over-http</transport>
<username>test</username>
<source-host>192.168.100.68</source-host>
<login-time>2015-07-30T09:44:03</login-time>
<in-rpcs>0</in-rpcs>
<in-bad-rpcs>0</in-bad-rpcs>
<out-rpc-errors>0</out-rpc-errors>
<out-notifications>0</out-notifications>
</session>
</sessions>
</netconf-state>
</rpc-reply>
¡ session-id 表示用户会话 ID 信息。
¡ transport 表示本会话使用的传输协议。
¡ username 表示用户 登录使用 的用户名。
¡ source-host 表示本会话请求的源地址。
¡ login-time 表示本会话 登录 时间。
¡ in-rpcs 表示本会话收到的合法 RPC 个数。
¡ in-bad-rpcs 表示本会话收到的不合法 RPC 个数。
¡ out-rpc-errors 表示本会话输出的 rpc-error 个数。
¡ out-notifications 表示本会话输出的通知事件个数。
(1) 客户端发送报文
version="1.0" encoding="UTF-8" ?>message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type='subtree'>
<netconf-state xmlns='urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring'>
<statistics/>
</netconf-state>
</filter>
(2) 结果验证
# 如果客户端收到类似如下的报文,则表示操作成功。
version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<netconf-state xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<statistics>
<netconf-start-time>2015-07-30T09:44:01</netconf-start-time>
<in-bad-hellos>0</in-bad-hellos>
<in-sessions>2</in-sessions>
<dropped-sessions>0</dropped-sessions>
<in-rpcs>1</in-rpcs>
<in-bad-rpcs>0</in-bad-rpcs>
<out-rpc-errors>0</out-rpc-errors>
<out-notifications>0</out-notifications>
</statistics>
</netconf-state>
</rpc-reply>
¡ netconf-start-time 表示 NETCONF 管理系统启动时间 。
¡ in-bad-hellos 表示 本系统收到的不合法 hello 报文总数 。
¡ in-sessions 表示 本系统曾建立的会话个数 。
¡ dropped-sessions 表示 本系统曾因超时丢弃的会话个数 。
¡ in-rpcs 表示 本系统收到的合法 RPC 请求总个数 。
¡ in-bad-rpcs 表示 本系统收到的不合法 RPC 请求总个数 。
¡ out-rpc-errors 表示 本系统输出的 rpc-error 总个数 。
¡ out-notifications 表示 本系统输出的通知事件总个数 。
commit (立即运行)操作用来将候选配置立即下发给当前运行配置。
将候选配置立即下发给当前运行配置:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<commit/>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
commit (试运行)操作用来试运行候选配置。进行本操作后,用户需要在超时时间内执行 commit (确认运行)操作,来确认候选配置的下发操作;否则,当前运行配置数据库自动回滚到运行候选配置以前的状态。
执行本操作时,必须指定 confirmed 节点,可以指定以下列:
· (可选) confirm-timeout 列:试运行候选配置的确认超时时间,单位为秒,缺省值为 600 秒。
· (可选) persist 列:用于标识当前 commit 操作对应的候选配置,以便退出当前 NETCONF 会话后也可以对该候选配置进行确认下发或其他操作。如果未指定 persist 列,则只能在当前 NETCONF 会话内对该候选配置进行确认下发或其他操作。
将候选配置标识为 test 并试运行,试运行的确认超时时间为 600 秒:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<commit>
<confirmed/>
<confirm-timeout> 60 0 </confirm-timeout>
<persist>test</persist>
</commit>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
commit (确认运行)操作用来确认试运行的候选配置的下发操作。
执行本操作时需要注意:
· 本操作需要在 commit (试运行)操作中指定的确认超时时间内执行才有效。
· 如果 commit (试运行)操作通过 persist 列标识了候选配置,则执行本操作时,需要使用 persist-id 列指定该标识。
· 如果 commit (试运行)操作没有使用 persist 列,则本操作与 commit (立即运行)操作完全相同。
确认候选配置的下发操作,该候选配置的标识为 test :
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<commit>
<persist-id>test</persist-id>
</commit>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
执行 commit (试运行)操作后,如果要在超时以前手动取消运行候选配置,则可以使用 cancel-commit 操作,使当前运行配置回滚到运行候选配置以前的状态。
手动取消运行候选配置,触发配置回滚:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<cancel-commit/>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
copy-config 操作用来将源配置数据库复制到目标配置数据库。如果目标配置数据库不存在,则直接创建目标配置数据库。
目前,本操作仅支持将当前运行配置数据库复制到候选配置数据库。
将当前运行配置数据库复制到候选配置数据库:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<copy-config>
<source>
<running/>
</source>
<target>
<candidate/>
</target>
</copy-config>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
delete-config 操作用来删除一个配置数据库。
目前,本操作仅支持删除候选配置数据库。
删除候选配置数据库:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<delete-config>
<target>
<candidate/>
</target>
<delete-config/>
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
discard-changes 操作用来将尚未运行的候选配置恢复到修改前状态。
将尚未运行的候选配置恢复到修改前状态:
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<discard-changes/>
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
<get-bulk> 操作用来从指定索引的下一条开始批量获取后续 N 条数据(索引行数据不返回),包括运行状态数据和配置数据。用户通过 index 属性指定索引,通过 count 属性指定 N 。如未指定索引,则以第一条为索引;如未指定 N ,或者数据表中符合条件的数据记录不足 N 条,则返回表中所有剩余的数据条目。
<get> 操作会返回所有符合条件的数据,在某些情况下,会导致获取数据效率不高。 <get-bulk> 允许用户从固定数据项开始,向后获取指定条目的数据记录。
和 <get> 的报文类似, <get-bulk> 报文的通用格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-bulk>
<filter>
<top xmlns="http://www.h3c.com/netconf/data:1.0">
指定模块,子模块,表名,列名
</filter>
</get-bulk>
<filter> 选项用于过滤信息。过滤条件和过滤结果,请参见“ 5 Comware NETCONF 数据过滤功能 ”。 <filter> 中可包括模块名、子模块名、表名和列名。
<get-bulk> 操作报文中还可以携带 count 和索引参数,如下为一个携带了 count 和索引参数的 <get-bulk> 操作报文示例:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="http://www.h3c.com/netconf/base:1.0">
<get-bulk>
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0" xmlns:base="http://www.h3c.com/netconf/base:1.0">
<Syslog>
<Logs xc:count="5">
<Index>10</Index>
</Logs>
</Syslog>
</filter>
</get-bulk>
其中, <get-bulk> 操作报文中的 count 属性遵循如下约定:
· count 属性的位置可以从 top 下的节点( <Syslog> )开始,到表节点( <Logs> )为止,这几个位置都能放置 count 属性。如果在其他位置放置 count 属性,则会报告错误。
· count 放在模块节点上时,如果报文中指定的子孙节点(表)中没有 count 属性,则这些节点的 count 属性与模块节点的 count 属性一致。
· 如果 count 放在多级表节点上,只有父节点上的 count 生效;如果 count 放在子表节点上,则必须指定其祖先节点的所有索引列。
· 如果不指定 count ,则获取从指定索引开始的所有数据。
设备收到配置获取请求报文后,会将相应参数的值通过如下报文反馈给客户端。
<?xml version="1.0"?>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
全部配置数据和状态数据
</data>
</rpc-reply>
<get-bulk-config> 用来获取系统中所有可配置的变量的值,请求的标签格式和 <get-config> 一致。其差别在于: get-bulk-config 操作在指定完整索引后,返回从指定索引的下一条开始的数据(指定的索引行本身不返回)。
get-bulk-config 同样支持 count 操作属性,指定 count 后,每个表返回的数据最多不超过 count 行。
<get-config> 和 <get-bulk-config> 的通用报文格式如下:
<?xml version="1.0"?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-config>
<source>
< datastore />
</source>
<filter>
<top xmlns="http://www.h3c.com/netconf/config:1.0">
指定模块,子模块,表名,列名
</filter>
</get-config>
其中, datastore 可以为 running 或 candidate :
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save OverWrite=”false” VsysName=”vsys-name” Safely=”false”>
<file> 指定文件的名称 </file>
</save>
· “指定文件的名称”必须以存储介质的名称开头,后缀为 .cfg ,后缀不区分大小写。当报文中存在 <file> 列时,必须输入指定文件的名称,不能为空;如果不存在该列,则设备会自动将当前配置保存到缺省的主用下次启动配置文件中。
· OverWrite 属性的默认取值为 true 。缺省情况下,当指定的配置文件名与原有配置文件名相同时,原文件将被覆盖,当前配置保存成功。如果指定 OverWrite 的值为 false ,则当指定的配置文件名与原有配置文件名相同时,当前配置保存失败,同时返回错误提示信息。
· VsysName 属性仅在支持 v System 的系统有效。用户 v System 下不允许指定 VsysName ,且不允许指定 save 的文件名称。管理 v System 下根据该属性指定的 vsys-name ,将指定 vSystem 的配置保存到指定的文件中。指定 VsysName 属性的同时支持 OverWrite ,不支持 Binary-only 属性。
· Safely 属性, 是否以安全模式保存配置文件, 默认取值为 false 。取值为:
• true :存在同名配置文件时,系统会先将当前配置保存到一个临时文件,保存成功后,再用这个临时文件替换原同名文件。因此,即使在保存过程中出现设备重启、断电等问题导致配置保存失败,仍然能够以原同名的配置文件启动设备。
• false :存在同名配置文件时,系统先删除该文件,再保存当前配置文件。在保存过程中,如果出现设备重启、断电、内存不足、设备存储空间不足等问题,可能会出现当前配置保存失败、下次启动文件为空的问题。
设备收到配置保存请求后会回应客户端,当客户端收到如下报文时,表示保存成功 。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
将设备的当前配置保存到配置文件 my_config.cfg 。
# 进入 XML 视图。
# 进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>
urn:ietf:params:netconf:base:1.0
</capability>
</capabilities>
</hello>
将设备的当前配置保存到配置文件 my_config.cfg 。 请将以下报文拷贝、粘贴到客户端 。
<?xml version="1.0" encoding="UTF-8"?>
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<file> my_config.cfg</file>
</save>
# 如果客户端收到类似如下的报文,则表示操作成功。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
rollback 操作用来将设备的当前配置恢复到指定配置文件中的配置。
请将以下报文拷贝、粘贴到客户端,用户即可将设备的当前配置恢复到指定配置文件中的配置 。
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<rollback>
<file> 指定文件的名称 </file>
</rollback>
设备收到配置回滚请求后会回应客户端,当客户端收到如下报文时,表示配置回滚成功 。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
通过 NETCONF 功能,用户可以将命令行封装在 XML 报文中对设备进行操作。
CLI 包括 Open-channel 、 Close-channel 、 Execution 和 Configuration 四种子操作:
· Open-channel : 打开当前会话的保留 channel 。
· Close-channel : 关闭当前会话的保留 channel 。
· Execution :只在用户视图下进行操作,不能通过 system 命令切换进入系统视图 。
· Configuration :默认在系统视图下进行操作,可以通过 system 和 quit 命令进行视图切换。使用 channel 方式下发 CLI 时,不可以通过 quit 命令退回到用户视图,且除首次下发命令是在系统视图,其余所在视图为上一条命令执行完成时所在的视图。
表4-4 CLI 标签的介绍
当前标签增加了 exec-use-channel 属性,用户下发命令时必须携带该属性,该属性取值包括:
· false :不使用 channel 下发执行命令,同原有的下发方式
· true :使用临时 channel 下发执行命令
· persist :使用保留 channel 下发执行命令
在系统视图 / 保留 channel 当前视图下执行 display this 命令:
message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<Configuration exec-use-channel=”persist”>
display this
</Configuration>
使用保留 channel 下发执行命令
如果保留 channel 不存在,则先自行创建保留 channel ,并直接从系统视图开始执行命令
如果保留 channel 存在,则直接在保留 channel 当前所处的视图执行本次下发的命令
在系统视图下执行 display this 命令:
message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<Configuration exec-use-channel=”persist”>
display this
</Configuration>
设备收到命令行指令后会回应客户端,当客户端收到如下报文时,表示命令行执行成功(注意命令响应被 CDATA 节点包含) 。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<Execution>
<![CDATA[ 对应命令行响应 ]]>
</Execution>
</rpc-reply>
对于 Open-channel 、 Close-channel 操作成功返回如下报文:
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101235" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
对于 Open-channel 、 Close-channel 、 Configuration 的 channel 下发方式操作失败返回如下报文( XXX 为失败原因):
<?xml version="1.0" encoding="UTF-8"?>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type><error-tag>data-missing</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en"> 失败错误提示 </error-message>
</rpc-error>
# 进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>
urn:ietf:params:netconf:base:1.0
</capability>
</capabilities>
</hello>
# 向设备发送显示当前配置命令。 请将以下报文拷贝、粘贴到客户端 。
<?xml version="1.0" encoding="UTF-8"?>
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<Execution>
display current-configuration
</Execution>
如果客户端收到类似如下的报文,则表示操作成功。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<Execution> <![CDATA[
version 7.1.052, Demo 2501005
sysname ab
ftp server enable
ftp update fast
ftp timeout 2000
irf mac-address persistent timer
irf auto-update enable
undo irf link-delay
domain default enable system
telnet server enable
vlan 1
vlan 1000
radius scheme system
primary authentication 127.0.0.1 1645
</Execution>
</rpc-reply>
使用 get-sessions 操作,用户可以获取当前设备的所有 NETCONF 会话信息。
<?xml version="1.0" encoding="UTF-8"?>
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-sessions/>
设备收到命令行指令后会回应客户端,当客户端收到如下报文时,表示命令行执行成功 。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-sessions>
<Session>
<SessionID> 用户会话 ID 信息 </SessionID>
<Line> line 信息 </Line>
<UserName> 用户登陆名称 < /UserName>
<Since> 用户登录时间 </Since>
<LockHeld> 用户是否持有锁 </LockHeld>
</Session>
</get-sessions>
</rpc-reply>
· SessionID 表示用户会话 ID 信息,返回值为一个从 1 开始的数字。
· Line 表示用户登录的用户线信息,通过 SOAP 方式登录的用户的用户线为空。
· UserName 表示 登录用户的用户名 。
· Since 表示用户登录时间,返回值为一个标准的 Schema 的 DateTime 类型的时间。
· LockHeld 表示 用户是否持有锁,返回值为 true 、 false 。
# 进行能力交换。 请将以下报文拷贝、粘贴到客户端 。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>
urn:ietf:params:netconf:base:1.0
</capability>
</capabilities>
</hello>
# 获取设备上当前存在的 NETCONF 会话的信息。 请将以下报文拷贝、粘贴到客户端 。
<?xml version="1.0" encoding="UTF-8"?>
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<get-sessions/>
# 如果客户端收到类似如下的报文,则表示操作成功。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
<get-sessions>
<Session>
<SessionID>1</SessionID>
<Line>vty0</Line>
<UserName></UserName>
<Since>2011-01-05T00:24:57 </Since>
<LockHeld>false</LockHeld>
</Session>
</get-sessions>
</rpc-reply>
以上信息表明:目前有一个 NETCONF 连接, SessionID 是 1 ,登录用户类型 vty0 ,登录时间是 2011-01-05T00:24:57 ,此用户不持有锁。
设备支持配置自动回滚,配置回滚点后,设备可以在如下场景下进行配置回滚:
· NETCONF 客户端主动下发配置回滚指令。
· NETCONF 客户端在指定的时间内无任何指令,即 NETCONF 会话空闲时间超过配置的回滚空闲超时时间。
· NETCONF 客户端和设备间的连接异常断开。
配置回滚步骤如下:
(1) 对当前系统加锁。
(2) 下发 <save-point>/<begin> 操作 进行配置回滚点标记。
(3) 下发 <edit-config> 操作 ,对设备进行所需配置 。
(4) 下发 <save-point>/<commit> 进行配置确认,可分多次修改配置并确认。
(5) 下发 <save-point>/<rollback> 进行配置回滚。可选择对应的一次 commit 进行配置回滚,或者等待 NETCONF 会话空闲时间超过配置回滚空闲超时时间时,自动将配置回滚到最近使用的 commit 的配置。
(6) 下发 <save-point>/<end> 结束配置回滚功能。
(7) 对当前系统解锁。
<commit-id/> , <commit-index/> , <commit-label/> 任选一个,或者不选时 , 回滚此前最近使用的 commit 的配置。其中 :
¡ commit-id 为系统唯一标识的 commit 编号。
¡ commit-index 表示最近 50 次的 commit , 0 表示最近一次下发 commit , 49 表示最远一次 commit 。
¡ commit-label 为标签,不同的 commit 标签不能一样,可以没有标签。
(2) 结果验证
当客户端收到如下报文时,表示主动下发配置回滚成功。
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<ok></ok>
</rpc-reply>
下发 <save-point>/<commit> 操作接受当前配置。使能 save-point 后,系统可支持最近 50 个 commit 回滚点的配置回滚。超过 50 次, commit 需指定 force 属性强制覆盖最早的记录。
(1) 客户端发送报文
请将以下报文拷贝、粘贴到客户端:
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<commit>
<label>SUPPORT VLAN<label>
<comment>vlan 1 to 100 and interfaces. Each vlan used for different custom as follows: ……</comment>
</commit>
</save-point>
其中, <label/> 和 <comment/> 可选。
(2) 结果验证
当客户端收到如下报文时,表示主动下发配置确认成功。
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<commit>
<commit-id>2</commit-id>
</commit>
</save-point>
</data>
</rpc-reply>
下发 <save-point>/<end> 操作可以取消配置回滚。
(1) 客户端发送报文
请将以下报文拷贝、粘贴到客户端:
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
</save-point>
(2) 结果验证
当客户端收到如下报文时,返回对应的 end 结果成功。
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</rpc-reply>
下发 <save-point>/<get-commits> 操作可以获取 commit 的操作记录。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<get-commits>
<commit-id/>
<commit-index/>
<commit-label/>
</get-commits>
</save-point>
其中, <commit-id> 、 <commit-index> 、 <commit-label> 任选一个,也可以都不选。都不选时,表示显示所有的 commit 记录。
(1) 客户端发送报文
请将以下报文拷贝、粘贴到客户端。
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<get-commits>
<commit-label>SUPPORT VLAN</commit-label>
</get-commits>
</save-point>
(2) 结果验证
当客户端收到如下报文时,返回对应的 commit 操作记录。
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<commit-information>
<CommitID>2</CommitID>
<TimeStamp>Thu Oct 30 11:30:28 1980</TimeStamp>
<UserName>test</UserName>
<Label>SUPPORT VLAN</Label>
</commit-information><commit-information>
<CommitID>1</CommitID>
<TimeStamp>Wed Nov 8 18:26:28 1972</TimeStamp>
<UserName>test</UserName>
</commit-information>
</save-point>
</data>
</rpc-reply>
下发 <save-point>/<get-commits> 操作可以获取对应的 commit 操作时的配置。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<get-commit-information>
<commit-information>
<commit-id/>
<commit-index/>
<commit-label/>
</commit-information>
<compare-information>
<commit-id/>
<commit-index/>
<commit-label/>
</compare-information
</get-commit-information>
</save-point>
其中, <commit-id/> 、 <commit-index/> 、 <commit-label/> 任选一个。 <compare-information/> 可选。 <commit-information> 不输入参数时,显示最近使用的 commit 配置。
(1) 客户端发送报文
请将以下报文拷贝、粘贴到客户端。
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<get-commit-information><commit-label>SUPPORT VLAN</commit-label>
</get-commit-information>
</save-point>
(2) 结果验证
当客户端收到如下报文时,显示对应的配置信息。
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<save-point>
<commit-information>
<content>
interface vlan 1
</content>
</commit-information>
</save-point>
</data>
</rpc-reply>
Comware 提供索引替换功能,在某些表中,执行 get 、 get-config 、 edit-config 、 action 操作时可以使用名称来替换索引。比如,假定接口 Ethernet1/0/1 的索引是 1 ,则可以用 Ethernet0/0/0 来替换接口索引 1 。具体哪些表具有上述能力,请参考对应的 NETCONF API 文档。
例如:假定接口 GigabitEthernet1/0/1 是 Trunk 接口,要允许 VLAN 2 、 3 通过,可以下发下面的 XML :
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0"> xmlns:base=”http://www.h3c.com/netconf/base:1.0”
<TrunkInterfaces>
<Interface>
<IfIndex> GigabitEthernet 1 /0/1 </IfIndex>
<PermitVlanList>2-3</PermitVlanList>
</Interface>
</TrunkInterfaces>
</VLAN>
</config>
</edit-config>
为了区分数字是名称还是索引,从 h3c-name2index1.1 版本后(版本信息从能力集中获取,能力集的详细介绍请参见“ 2.7 测试 NETCONF 客户端和设备的连通性 ”),可以使用 valuetype 属性指定该值的类型。 valuetype 取值为:
· Name :值为名称类型。
· index :值为索引类型。
· auto :设备先按名称类型匹配,如果没有匹配到任何信息,再按照索引类型匹配。 如果不指定 valuetype 属性,缺省为 auto 。
例如,假定 IfIndex 元素为 index 类型,值为 1 ,可以下发下面的 XML :
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<getoperation>
<filter>
xmlns="http://www.h3c.com/netconf/config:1.0" xmlns:base=”http://www.h3c.com/netconf/base:1.0”>
<TrunkInterfaces>
<Interface>
<IfIndex base:valuetype="index">1</IfIndex>
</Interface>
</TrunkInterfaces>
</VLAN>
</filter >
</getoperation>
· 对于 get-bulk 、 get-bulk-config 操作,当替换的索引是表的索引,并且当前位置起定位作用时,不能使用一对多转换的功能 。
· 对于 match 过滤,不支持名称到索引的转换功能。
· 对于非索引列, edit-config 时不能进行一对多转换 。
· 对于不同的类型,支持的转换语法不一定完全相同。 比如,接口管理支持 GigabitEthernet 1 /0/1 to GigabitEthernet 1 /0/24 这样的表示大量名称的写法,但 VPN 只支持一次加入一个 VPN 名称。
某些表的列本身是一个列表,比如 VLAN TrunkInterface ,其 PermitVlanList 的表示形式形如 2,3,5-8,9,10-100 。在这个情况下,可能需要在不修改原有取值的情况下,增量下发新的取值。比如,不知道原来有哪些 VLAN 被 permit 了,需要在原来的基础上增加一个 VLAN 105 ,此时就需要下发增量的操作。增量下发的操作方式为:在支持增量下发的节点上指定 incremental=”true” 属性。
要进行增量下发,必须在要增量下发的列上显式指定增量下发属性。例如,当前 VLAN 100 的 permit List 为 10 ,增量下发 VLAN 2 和 3 ,使用如下 XML :
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xmlns:base=”http://www.h3c.com/netconf/base:1.0”
<VLAN xc:operation=" operXXX " >
<TrunkInterfaces>
<Interface>
<IfIndex>100</IfIndex>
<PermitVlanList base:incremental=”true”>2-3</PermitVlanList>
</Interface>
</TrunkInterfaces>
</VLAN>
</config>
</edit-config>
对于不同操作类型,增量下发 VLAN 后的操作结果如 表 4-6 所示。
表4-6 增量下发 VLAN 后 对于不同操作类型的操作结果
cancel-subscription 操作用来取消订阅。在用户向设备订阅事件后,用户可以使用此操作取消已订阅的事件。
取消事件订阅的请求报文格式如下:
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<cancel-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream> XXX_STREAM </stream>
</cancel-subscription>
<error-message xml:lang="en">The subscription stream to be canceled doesn't exist: Stream name=XXX_STREAM.</error-message>
</rpc-error>
</rpc-reply>
createDot1qFlow 操作用来开启子接口的 Dot1q 终结功能,并指定子接口能够终结的 VLAN 报文的最外层 VLAN ID 范围。
该操作必须使用 <ifName> 列指定子接口名称。
该操作使用 <vlanIdBgn> 和 <vlanldEnd> 列指定终结的 VLAN 报文的最外层 VLAN ID 范围。如果 <vlanIdBgn> 和 <vlanldEnd> 列的值相同,表示子接口只终结最外层 VLAN ID 为该值的报文。
<groupId> 列的取值范围为 1 ~ 16 。本设备和第三方厂商设备互连时,该列的值需要和第三方厂商保持一致;不和第三方厂商设备互连时,该列可使用其取值范围内的任意值。。
配置子接口 GigabitEthernet1/0/1.1 能够终结最外层 VLAN ID 在范围 1 ~ 100 内的 VLAN 报文, XML 请求格式如下:
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<createDot1qFlow xmlns="http://www.gsta.com/netconf/gsta-ethernet">
<ifName>GigabitEthernet1/0/1.1</ifName><vlanIdBgn>1</vlanIdBgn>
<vlanIdEnd>100</vlanIdEnd>
<groupId>1</groupId>
</createDot1qFlow>
该操作必须使用 <ifName> 列指定子接口名称。
该操作使用 <vlanIdBgn> 和 <vlanldEnd> 列指定子接口终结的 VLAN 报文的最外层 VLAN ID 范围。如果 <vlanIdBgn> 和 <vlanldEnd> 列的值相同,表示关闭子接口对最外层 VLAN ID 为该值的报文的 Dot1q 终结功能。
<groupId> 列的取值范围为 1 ~ 16 。本设备和第三方厂商设备互连时,该列的值需要和第三方厂商保持一致;不和第三方厂商设备互连时,该列可使用其取值范围内的任意值。
删除子接口 GigabitEthernet1/0/1.1 的对最外层 VLAN ID 在范围 1 ~ 100 内的 VLAN 报文的 Dot1q 终结配置。 XML 请求如下:
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<deleteDot1qFlow xmlns="http://www.gsta.com/netconf/gsta-ethernet">
<ifName>GigabitEthernet1/0/1.1</ifName><vlanIdBgn>1</vlanIdBgn>
<vlanIdEnd>100</vlanIdEnd>
<groupId>1</groupId>
</deleteDot1qFlow>
部分多实例表同时具有索引值和名称值,且两者一一对应,比如 Interfaces 表既有接口索引也有接口名。缺省情况下,执行 get 类操作时,设备根据索引值( IfIndex )对返回数据进行排序后,依次返回各条数据。
如果希望按照名称值( Name )排序并返回数据,则可以在 get 请求中对支持名称排序的表指定 sortByName=“true” 属性。
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0" xmlns:data="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces xc:sortByName="true" >
<Interface>
<IfIndex></IfIndex><Name></Name>
</Interface>
</Interfaces>
</Ifmgr>
</filter>
<rpc-reply message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xc="http://www.h3c.com/netconf/base:1.0">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
其他行实例数据
<Interface>
<IfIndex>1413</IfIndex>
<Name>Route-Aggregation1</Name>
</Interface>
<Interface>
<IfIndex>1412</IfIndex>
<Name>Route-Aggregation10</Name>
</Interface>
</Interfaces>
</Ifmgr>
</data>
</rpc-reply>
XML2CLI 扩展能力是 H3C 提供的私有扩展能力。该能力表示设备支持将客户端的配置报文转换为配置命令行,并返回给客户端。
客户端通过 hello 交换 xml2cli 能力的 URL 为:
urn: $oem :params:netconf:capability: $oem -xml2cli:1.0
其中 $oem 为设备的 OEM 。
当客户端通过 hello 交换的能力集中包含 xml2cli 能力时,设备侧会标记当前会话需要支持 xml2cli 能力。
对于支持 xml2cli 能力的会话,设备侧支持如下能力:
· 设备侧支持在处理 <edit-config> 、 <action> 请求时,除了执行请求配置或请求动作外,还会将请求中的 XML 报文,转换为对应的命令行,作为 rpc-reply 的部分结果返回给客户端。
· 设备侧支持客户端下发 <xml2cli> 私有 RPC 请求,设备侧将 <xml2cli> 中的 XML 报文,转化为对应的命令行,返回给客户端。
设备侧只负责将正确的、合法的 XML 报文转换为对应的命令行。当客户端发送的 XML 报文不正确或者不合法时,设备侧不保证返回命令行的正确性。
· 功能描述
NETCONF 客户端可以通过 <xml2cli> 方法,将 XML 配置数据下发到服务端,服务端需要根据配置数据之间的映射关系,将 XML 配置数据转换为命令行,并通过 <rpc-reply> 返回给客户端。本 RPC 主要应用于控制器审计对账时,以命令行形式显示控制器侧与设备侧之间的配置差异。
· 请求报文格式
XML2CLI RPC 的请求报文格式为:
message-id="100" xmlns=" urn:ietf:params:xml:ns:netconf:base:1.0">
<xml2cli>
XML 报文
</xml2cli>
· 应答报文格式
服务端回复的应答格式为:
<rpc-reply message-id="100" xmlns=" urn:ietf:params:xml:ns:netconf:base:1.0">
<xml2cli>
XML 报文对应的命令行
</xml2cli>
<rpc-reply/>
如果设备侧能够完成配置数据转换,则返回包含命令行配置的 <rpc-reply> 。
如果设备侧由于任何原因不能完成请求,则 <rpc-error> 元素将包含在 <rpc-reply> 中。
· xml2cli 转换报文的规格限制
为了区分数字是名称还是索引,从 h3c-name2index1.1 版本后(版本信息从能力集中获取),可以使用 valuetype 属性指定该值的类型 valuetype 取值包括:
· name :表示数字为名称
· index : 表示数字 为索引
· auto :表示设备先按名称类型匹配,如果没有匹配到任何信息,再按照索引类型匹配。 如果不指定 valuetype 属性,缺省为 auto
<xml2cli xmlns=” urn:ietf:params:xml:ns:netconf:base:1.0”>
<TrunkInterfaces>
<Interface>
<IfIndex valuetype="index">1</IfIndex>
</Interface>
</TrunkInterfaces>
</VLAN>
</xml2cli>
xml2cli RPC 不支持 <error-option> 选项。 <edit-config> 请求中携带的 <error-option> ,也不会在 XML 报文转换命令行流程中生效。设备侧严格按照 continue-on-error 去处理 XML 报文转换命令行的动作
<error-message xml:lang="en">When the create, merge, or replace operation is issued, empty data cannot be assigned to columns.</error-message>
</rpc-error>
<xml2cli>
<Device >
hostname xml2cli
<HostName>xml2cli</HostName>
</Base>
</Device>
</xml2cli>
</rpc-reply>
· 功能 描述
Xml2cli 能力扩展了 <action> 方法的 <rpc-reply> 应答,支持在 <rpc-rely> 应答报文中添加 <xml2cli> 标签,用于设备侧返回 XML 报文对应的命令行。
xmlns="http://www.h3c.com/netconf/action:1.0">
<request-path>/Envelope/Body[1]/rpc[1]/action[1]/top[1]/VLAN[1]/BatchVlans[1]</request-path>
<result-data>
</result-data>
</action-result>
<xml2cli>
<BatchVlans>
vlan 1 to 15
undo vlan 5 to 10
<CreateVlanList>1-15</CreateVlanList><DestroyVlanList>5-10</DestroyVlanList>
</BatchVlans>
</VLAN>
</xml2cli>
</rpc-reply>
· 配置失败举例
客户端下发如下请求:
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<action>
xmlns="http://www.h3c.com/netconf/action:1.0">
<BatchVlans>
<CreateVlanList>5-15</CreateVlanList><DestroyVlanList>5-9</DestroyVlanList>
</BatchVlans>
</VLAN>
</action>
服务端回复应答如下:
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
<rpc-error>
<error-type>rpc</error-type><error-tag>unknown-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Unexpected element 'http://www.h3c.com/netconf/action:1.0':'BatchVlan'(index:0) under element '/rpc/action[1]/top[1]/VLAN[1]</error-message>
<error-info>
<bad-element>BatchVlan</bad-element>
</error-info>
</rpc-error>
<xml2cli>
<BatchVlans>
vlan 1 to 15
undo vlan 5 to 10
<CreateVlanList>1-15</CreateVlanList><DestroyVlanList>5-10</DestroyVlanList>
</BatchVlans>
</VLAN>
</xml2cli>
</rpc-reply>
Comware 支持的所有用来获取和设置数据的操作如 表 4-7 所示。其中,包括 get 、 get-config 、 get-bulk 、 get-bulk-config 、 edit-config 、 action 操作。
表4-7 Comware 支持的获取和设置数据操作
获取 Syslog 模块的全部数据的 XML 请求如下:
<top xmlns="http://www.h3c.com/netconf/data:1.0"
获取接口表内所有配置的 XML 请求如下:
xmlns="http://www.h3c.com/netconf/config:1.0">
从指定索引的下一条开始批量获取后续 N 条数据(索引行数据不返回),包括运行状态数据和配置数据。用户通过 index 属性指定索引,通过 count 属性指定 N 。如未指定索引,则以第一条为索引;如未指定 N ,或者数据表中符合条件的数据记录不足 N 条,则返回表中所有剩余的数据条目
get 操作会返回所有符合条件的数据,这在某些情况下会导致效率问题。 get-bulk 允许用户从固定数据项开始,向后获取指定条目的数据记录
获取全部接口数据的 XML 请求如下:
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Interfaces xc:count=”5” xmlns:xc=” http://www.h3c.com/netconf/base:1.0”>
获取全部接口配置信息的 XML 请求如下:
<rpc message-id ="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" >
xmlns="http://www.h3c.com/netconf/config:1.0">
· 如果指定的对象不存在且不允许创建,则返回 merge 失败
将 BufferSize 设置为 120 的 XML 请求如下:
xmlns="http://www.h3c.com/netconf/config:1.0">
<Syslog xmlns="http://www.h3c.com/netconf/config:1.0" xc:operation="merge">
创建指定对象。 create 操作必须指定配置对象。 create 操作的 XML 数据格式和 merge 类似,只是 operation 属性需要指定为“ create ”
· 如果当前配置表支持创建对象,且当前对象不存在,则先创建配置对象,再创建指定的配置
· 如果配置对象下对应的配置项已经存在,则返回 data-exist 错误
同上,把 merge 修改为 create 即可
· 如果指定的对象不存在,但允许创建,则先创建再配置该对象为当前配置
· 如果指定对象不存在且不允许创建,则不进行 replace 操作,返回 invalid-value 错误,提示用户配置对象不存在
同上,把 merge 修改为 replace 即可
· 当指定的删除对象中只有表索引时,则删除此配置指定对象的所有配置,同时删除指定对象
· 当指定的删除对象中不仅仅有表索引还存在配置项时,则删除此对象下面的指定配置
· 如果系统中指定对象不存在,或者 XML 消息未指定对象,则直接返回成功
同上,把 merge 修改为 remove 即可
· 当指定的删除对象中只有表索引时,则删除此配置指定对象的所有配置,同时删除指定对象
· 当指定的删除对象中不仅仅有表索引还存在配置项时,则删除此对象下面的指定配置
同上,把 merge 修改为 delete 即可
edit-config 操作用于修改当前系统配置。 NETCONF 定制了五种修改配置的方式: merge 、 create 、 delete 、 remove 和 replace 。当 XML 消息中未指定修改配置方式的时候,则使用默认操作做为当前指令的操作方式,不会修改默认操作的缺省值
默认操作的缺省值是 merge ,在 XML 消息中可以通过 <default-operation> 节点来设置默认操作,取值为:
· merge :当配置方式和默认操作方式均未指定时,使用该方式
· replace :当配置方式未指定,默认操作指定为 replace 的时候, edit-config 操作默认为 replace 操作
· none :当配置方式未指定,默认操作指定为 none 的时候, edit-config 操作默认为 none 操作。 none 操作主要用来检查,下发为 none 操作的配置仅仅做 Schema 校验,不进行真正的配置下发。语法检查通过,就返回 ok 成功,否则失败
下发一个空的操作,该操作仅仅验证格式,并不真正下发给系统, XML 请求如下:
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<default-operation>none</default-operation>
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">
<Description>222222</Description>
edit-config 将指定的配置设置到系统上,完成配置设置的操作。在执行 edit-config 的过程中,如果遇到一个实例配置出错,默认情况下会直接返回错误,但是为了使应用更加灵活, edit-config 提供了错误选项,通过错误选项取值的不同,在发生错误的时候进行不同的处理操作
<error-option> 节点用于设置一个实例配置出错后,后续实例配置的处理方式,缺省值为 stop-on-error ,全部取值为:
· stop-on-error :停止处理,返回错误 。此选项为 默认选项
· continue-on-error :继续处理,但是报告错误
· rollback-on-error :停止并回滚配置
下发两个接口的配置,当下发第一个接口的配置发生错误时,继续进行下一个接口配置的下发, XML 请求如下:
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
</target> <error-option>continue-on-error</error-option>
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">
<Description>222</Description>
<ConfigSpeed>1000000</ConfigSpeed>
<ConfigDuplex>1</ConfigDuplex>
<Description>333</Description>
<ConfigSpeed>1000000</ConfigSpeed>
<ConfigDuplex>1</ConfigDuplex>
在真正执行 edit-config 操作时,可指定一个测试选项,使用 <test-option> 节点来决定当前配置是否真正下发。该节点的缺省值为 test-then-set ,全部取值为:
· test-then-set :如果没有错误则将配置设置到系统
· set :将配置设置到系统
· test-only :只测试,并不下发配置到系统。语法检查通过,就返回 ok 成功,否则失败
下发一个接口的配置,仅测试, XML 请求如下:
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<test-option>test-only</test-option>
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">
<Description>222</Description>
<ConfigSpeed>1000000</ConfigSpeed>
<ConfigDuplex>1</ConfigDuplex>
清除全部接口的统计信息, XML 请求如下:
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/action:1.0">
获取数据系列操作包括 get 、 get-bulk 、 get-config 和 get-bulk-config 。本节介绍这些 get 系列操作的返回值。
<get> 和 <get-bulk> 报文的通用格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<getoperation>
<filter>
<top xmlns="http://www.h3c.com/netconf/data:1.0">
指定模块,子模块,表名,列名
</filter>
</getoperation>
<get-config> 和 <get-bulk-config> 报文的通用格式如下:
<?xml version="1.0" encoding="UTF-8"
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<getoperation>
<source>
<running/>
</source>
<filter>
<top xmlns="http://www.h3c.com/netconf/data:1.0">
指定模块,子模块,表名,列名
</filter>
</getoperation>
其中, getoperation 可以为 get 、 get-bulk 、 get-config 或者 get-bulk-config 。 <filter> 选项用于过滤信息, <filter> 中可包括模块名、子模块名、表名和列名。指定不同的 <filter> ,返回值可以是表、行和列:
· 返回值为 表:
¡ 如果 <filter> 中不指定模块(子模块),则表示全部模块(子模块)。一旦指定模块(子模块),则返回数据只包含指定模块(子模块)。
¡ 如果模块下不指定表,则表示全部表。一旦指定表,则返回数据只包含指定表。
· 返回值为行:
¡ 如果表下不指定列名,则表示该表的全部行。
¡ 如果 <filter> 中只指定索引列,则返回与该索引列匹配的行的全部列。如果同时指定了索引列之外的其他列,则返回与索引列匹配的行的索引列和指定的列。
· 返回值为 列:
¡ 如果 <filter> 中只指定索引列,则返回的数据包括全部的列。如果同时指定了索引列之外的其他列,则返回的数据仅包含索引列和指定的列。
¡ 对于多于一个索引的情况,索引列缺失,则返回的数据仅仅包括全部的索引
¡ 对于 get-bulk 操作,前面的连续索引的值作为定位依据,后续不连续索引的值作为过滤条件存在。比如,一个多实例表存在 A 、 B 、 C 、 D 、 E 5 个索引,如果提供 A 、 B 、 D 、 E 4 个索引,则 A 、 B 的值作为定位条件,取满足 A 、 B 条件的第一个 C 、 D 、 E 的数据,同时, D 、 E 的值作为过滤条件存在。
¡ 对于 get 操作,索引不全时,所有的索引列都作为过滤条件存在。
下列情况可能导致返回空数据:
· 配置模块未启动 。
· 无访问对应对象的 RBAC 权限。
· 过滤条件过滤掉全部数据。
· 发生其他非格式约束类的错误。
· 对于 get-config 系列 操作 ,指定表 中 只有默认配置 。
· 在当前设备上,不支持指定的表。
如果表没有授予 read 权限, get 返回结果不包括此表数据。
如果列没有授予 read 权限,那么请求中一定不包括此列。如果请求不明确包括此列,则能返回其他列数据;如果显式包括此列,则此表没有数据可以返回。
对于表中行的实例,如果索引代表的对象没有权限,则对于 get 和 get-config 操作,获取不到此数据;对于 get-bulk 和 get-bulk-config 操作,会跳过此行。
某些模块可能提供自定义的过滤,用来提供更复杂的查询条件,比如 Route 模块的 Ipv4Routes 表,其过滤条件出现在行(多实例表),或者表(单实例表)上。其表现形式如下:
<Route>
<Ipv4Routes>
<RouteEntry h3c:filter=' ip 1.1.1.1' xmlns:h3c='http://www.h3c.com/netconf/base:1.0'
</RouteEntry>
</Ipv4Routes>
</Route>
如果同时出现模块自定义的过滤条件,则此过滤条件会和其他 get 系列的过滤条件共同作用,即模块提供的过滤条件会使返回的过滤结果进一步缩小。
具体哪些模块会提供自定义的过滤条件,需要查看对应的模块的 XML API 编程手册。
当用户执行 <get> 、 <get-bulk> 、 <get-config> 或者 <get-bulk-config> 操作时,在 XML 语言中增加过滤条件,可以使用户只看到自己关心的数据。数据过滤包括严格匹配、正则表达式匹配和条件匹配三种。
同时指定多种过滤条件时,只有一种过滤条件可以生效。过滤条件按照优先级从高到底的顺序,依次为:严格匹配、正则表达式匹配和条件匹配。
严格匹配包括两种匹配方式:元素值方式和属性名方式。 当两者都指定时,优先使用元素值方式。
用户在 XML 语言中直接指定对应的元素值,设备将对这些值进行严格匹配。如果指定了多个元素的值,则返回同时符合这几个条件的数据。只有完全匹配条件才返回成功。
例如,如下为一个 NETCONF 报文示例,用于获取所有状态为 UP 的接口的配置信息 。
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
< AdminStatus > 2 </ AdminStatus >
</Interface>
</Interfaces>
</Ifmgr>
</filter>
当用户在行的位置上放置的某个属性的名称和当前表的某个列的名称一致,则这个属性的值将与用户下发配置中同名称的列的值进行严格匹配。例如,上面例子用属性名方式的等价 XML 请求为:
<rpc message-id ="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0" xmlns:data="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface data: AdminStatus="2" />
</Interfaces>
</Ifmgr>
</filter>
以上两个 NETCONF 报文示例说明:通过两种严格匹配方式均可以获取所有状态为 UP 的接口配置信息。
当过滤条件比较复杂时,可以在指定元素上设置 regExp 属性为一个正则表达式,以达到过滤的目的。 支持正则表达式匹配的数据类型包括:各种整数、各种日期和时间、各种字符串、 IPv4 地址、 IPv4 掩码、 IPv6 地址、 MAC 地址、 OID 、时区。
如下为一个 NETCONF 报文示例,用于获取接口的描述信息,并要求这些描述信息全部为大写字母,不能有其它字符。
<get-config>
<source>
<running/>
</source>
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/config:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<Description h3c:regExp=" ^ [A-Z]* $ " />
</Interface>
</Interfaces>
</Ifmgr>
</filter>
</get-config>
正则表达式中常用的特殊字符匹配规则如 表 5-1 所示。
表5-1 正则表达式中的特殊字符 描述表
表示重复一次指定字符串,字符串是指 \ 前用 () 括起来的字符串, index 对应 \ 前字符串的顺序号按从左至右的顺序从 1 开始编号:如果 \ 前面只有一个字符串,则 index 只能为 1 ;如果 \ 前面有 n 个字符串,则 index 可以为 1 到 n 中的任意整数
(string)\1 表示把 string 重复一次,匹配的字符串必须包含 stringstring ; (string1)(string2)\2 表示把 string2 重复一次,匹配的字符串必须包含 string1string2string2 ; (string1)(string2)\1\2 表示先把 string1 重复一次,再重复一次 string2 ,匹配的字符串必须包含 string1string2string1string2
· [16A] 表示可以匹配到的字符串只需要包含 1 、 6 或 A 中任意一个
· [1-36A] 表示可以匹配到的字符串只需要包含 1 、 2 、 3 、 6 或 A 中任意一个( - 为连接符)
如果 ] 需要作为普通字符出现在 [ ] 内时,必须把 ] 写在 [ ] 中字符的最前面,形如 []string] ,才能匹配到 ] 。 [ 没有这样的限制
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:reg="http://www.h3c.com/netconf/base:1.0">
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<Description reg:regExp=":" />
</Interface>
</Interfaces>
</Ifmgr>
</filter>
# 如果客户端收到类似如下的报文,则表示操作成功。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:reg="http://www.h3c.com/netconf/base:1.0" message-id="100">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<IfIndex>2681</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/49:1 Interface</Description>
</Interface>
<Interface>
<IfIndex>2682</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/49:2 Interface</Description>
</Interface>
<Interface>
<IfIndex>2683</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/49:3 Interface</Description>
</Interface>
<Interface>
<IfIndex>2684</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/49:4 Interface</Description>
</Interface>
<Interface>
<IfIndex>2685</IfIndex>
<Description>Ten- GigabitEthernet 1 /0/50:1 Interface</Description>
</Interface>
<Interface>
<IfIndex>2686</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/50:2 Interface</Description>
</Interface>
<Interface>
<IfIndex>2687</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/50:3 Interface</Description>
</Interface>
<Interface>
<IfIndex>2688</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/50:4 Interface</Des cription>
</Interface>
<Interface>
<IfIndex>2689</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/51:1 Interface</Description>
</Interface>
<Interface>
<IfIndex>2690</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/51:2 Interface</Description>
</Interface>
<Interface>
<IfIndex>2691</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/51:3 Interface</Description>
</Interface>
<Interface>
<IfIndex>2692</IfIndex>
<Description>Ten-GigabitEthernet 1 /0/51:4 Interface</Description>
</Interface>
</Interfaces>
</Ifmgr>
</data>
</rpc-reply>
由于正则表达仅能够完成字符匹配,对于数值逻辑的判断过滤实现起来比较麻烦。此时,可使用条件匹配过滤功能。
条件匹配通过在元素中增加 match 属性完成,属性的值(即过滤条件)可以为数字、字符串。
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Device>
<ExtPhysicalEntities>
<Entity>
< CpuUsage h3c:match="more: 50 "></ CpuUsage >
</Entity>
</ExtPhysicalEntities>
</Device>
</filter>
获取 Ifmgr 模块 Interfaces 表下 IfIndex 值大于等于 5000 的 Name 列信息。
# 进入 XML 视图。
<Sysname> xml
# 进行能力交换。请将以下报文拷贝、粘贴到客户端。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>
urn:ietf:params:netconf:base:1.0
</capability>
</capabilities>
</hello>
# 获取 Ifmgr 模块 Interfaces 表下 IfIndex 值大于等于 5000 的 Name 列信息。请将以下报文拷贝、粘贴到客户端。
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="http://www.h3c.com/netconf/base:1.0">
<filter type="subtree">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
< If Index nc:match="more:5000"/>
<Name/>
</Interface>
</Interfaces>
</Ifmgr>
</filter>
# 如果客户端收到类似如下的报文,则表示操作成功。
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="http://www.h3c.com/netconf/base:1.0" message-id="100">
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface>
< If Index>7241</ If Index>
<Name>NULL0</Name>
</Interface>
<Interface>
< If Index>7243</ If Index>
<Name>Register-Tunnel0</Name>
</Interface>
</Interfaces>
</Ifmgr>
</data>
</rpc-reply>
可重复的列在明确指定过滤条件进行数据过滤时,会只罗列出本行本列中符合过滤条件的列,本行本列中不符合过滤条件的列不会输出,如果一个记录都没有,则本行不输出。
具有可重复的数据结构的情况中,结构分组的成员在明确指定过滤条件进行数据过滤时,会只罗列出所有成员都符合过滤条件的分组,不符合过滤条件或者只有部分符合过滤条件的分组不会输出,如果本行中一个符合输出的分组记录都没有,则本行不输出。
本节以 ncclient 为例,介绍开源工具作为 NETCONF 客户端,与设备(作为 NETCONF 服务器)建立 NETCONF 会话的方法。
ncclient 是一个可以用作 NETCONF 客户端的 Python 库。它为使用者提供了非常直观的 API ,并将 NETCONF 的 XML 编码特性映射到 Python 构造和习语,使得网络管理脚本的编写更加容易。
该库包含的主要功能有:
· 支持 RFC 6241 定义的所有 NETCONF 特性和功能。
· 流水线式请求。
· 支持异步 RPC 请求。
· 与标准 XML 方式一致。除非真正需要,否则无需变更。
· 扩展性强,可以根据需要,灵活添加新的传输映射和功能 / 操作。
ncclient 所需的 Python 版本为 Python 2.7 或 Python 3.5+ 。
ncclient 的运行依赖如下库:
· setuptools 0.6+
· Paramiko 1.7+
· lxml 3.3.0+
· libxml2
· libxslt
如果操作系统为 Debian/Ubuntu ,则还需要通过 aptitude 或者 apt-get 等方式安装如下的库:
· libxml2-dev
· libxslt1-dev
可以通过如下方式安装 ncclient :
· 解压安装包后安装 ncclient 。 以 ncclient-0.6.10.tar.gz 为例 ,具体过程为:
a. 解压下载后的安装包 。
b. 打开 cmd ,切换到解压后 setup.py 文件所在的目录下。
c. 执行 python setup.py build 命令。
d. 执行 python setup.py install 命令。
· pip 方式,即执行 pip install ncclient 命令安装 ncclient 。该方式需要确保主机可以访问到目标 lib 仓库(开发环境可能对默认仓库或公网仓库有访问限制,需要和网络管理员确认)。
安装完成后,需要按照如下步骤检查是否安装成功:
(1) 打开 cmd ,进入 python 视图。
(2) 输入 import ncclient 命令。 如果没有报错 ,则 表示已经安装成功了。
如果需要切换 ncclient 版本,需要先执行 pip uninstall ncclient 命令卸载 ncclient 。
通过 python 命令执行脚本时,需要指定脚本文件所在的路径。例如,脚本文件 *.py 保存在 C/desktop/examples 目录下,在 C/desktop 下执行的 python 命令形式如下:
[ncclient] $ python examples/*.py
本节以 NETCONF over SSH 访问方式为例,介绍如何通过运行 Python 脚本建立 NETCONF 会话。建立 NETCONF 会话的过程通常为:
(1) 配置 NETCONF 访问方式。
(2) 创建一个 *.py 脚本,并 import 依赖库。
(3) 调用 connect 方法,通过 SSH 创建 NETCONF 会话。
选用 NETCONF over SSH 访问方式时,需要在服务端配置 SSH 用户,并开启 NETCONF over SSH 服务。具体配置方法可参见“ 2.4.1 配置 NETCONF over SSH 访问方式 ”。
配置完成后,设备上将具有可用的 SSH 服务(用户名和密码)用于和客户端建立连接。本例中,假设用户名为 ssh ,密码为 00password00connect
在建立 NETCONF 会话之前,需要先检查 NETCONF 客户端和 NETCONF 服务器之间能否 ping 通,确保 ncclient 和设备( Server )三层互通。
在 ncclient 上创建到设备的 SSH 连接。该连接使用基于用户名和密码的身份认证方式,用户名为 ssh ,密码为 00password00connect 。执行脚本调用 connect 函数时,客户端连接到设备,并自动建立一个 NETCONF 会话。
其中,各参数的含义为:
- host :运行 NETCONF 服务器的设备的 IP 地址,推荐使用设备上管理口的 IP 地址。此例中, IP 地址为 192.168.56.120 。
- port :建立 SSH 连接的端口号。默认为 830 。
- username : SSH 用户的用户名。 此例中, 用户名 为 ssh 。
- password : SSH 用户的密码。 此例中,密码为 00password00connect 。
b. 进行 cmd ,并切换到 demo1.py 文件所在的目录,执行以下命令。
>python demo1.py 192.168.56.120 830 ssh 00password00connect
c. 脚本运行结果如 图 6-1 所示。
本节介绍如何在 NETCONF 会话上,执行配置管理、状态查询和事件订阅等基本操作。执行 ncclient 基本操作的过程可以概括为:
(1) 根据需要,构造不同的 RPC 报文。
(2) 执行该 Python 脚本,以完成配置、删除、查询、订阅等操作。
(1) 构造 RPC 报文,本例为创建新的 VLAN 。 RPC 请求报文的 XML 结构 可 参见《 H3C Comware 7 NETCONF XML API Reference 》文档 。
VLAN_RPC = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="create">
<VLANs>
<VLANID>
<ID>3</ID><Name>3</Name>
<Description>2</Description>
</VLANID>
</VLANs>
</VLAN>
</config>
(2) 根据配置的生效模式,选择不同的操作方式。
¡ 立即生效模式: 执行 edit-config 操作 ,指定对服务器端 <running/> 配置集进行修改,并校验返回报文。
rpc_obj = m.edit_config(target='running', config=VLAN_RPC)
_check_response(rpc_obj,'VLAN_MERGE')
¡ 二阶段生效模式: 执行 edit-config 操作 ,指定对服务器端 <candidate/> 配置集进行修改,并校验返回报文。
rpc_obj = m.edit_config(target=' candidate ', config=VLAN_RPC)
_check_response(rpc_obj,'VLAN_MERGE')
完成 edit-config 操作后,通过如下命令执行 commit 操作。
m.commit()
¡ 试运行模式 :执行 edit-config 操作 ,指定对服务器端 <candidate/> 配置集进行修改,并校验返回报文。
rpc_obj = m.edit_config(target=' candidate ', config=VLAN_RPC)
_check_response(rpc_obj,'VLAN_MERGE')
完成 edit-config 操作后,通过如下命令将配置 提交试运行 ,并设置运行时间。
m.commit(confirmed=True, timeout=' 300 ')
完成 edit-config 操作后,也可以执行以下命令 丢弃 <candidate/> 中未提交 的 数据 ,即放弃配置。
m.discard_changes()
上述命令中的 m 为 with h3c_connection(host,port=port,user=user,password=password) as
(1) 以下为通过 edit-config 操作创建 VLAN 的 Python 程序:
# -*- coding:utf-8 -*-
import sys
import logging
from ncclient import manager
from ncclient import operations
log = logging.getLogger(__name__)
# 用于创建 VLAN 的 RPC 报文。
VLAN_RPC = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="create">
<VLANs>
<VLANID>
<ID>3</ID>
<Name>3</Name><Description>2</Description>
</VLANID>
</VLANs>
</VLAN>
</config>
# 建立与设备的连接。
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,password=password,
hostkey_verify = False,
device_params={'name':"h3c"},allow_agent = False,
look_for_keys = False)
# 检查 RPC 回复报文。
def _check_response(rpc_obj, snippet_name):
print("RPC reply for %s is %s" % (snippet_name, rpc_obj.xml))
xml_str = rpc_obj.xml
if "<ok/>" in xml_str:
print("%s successful"%snippet_name)
else:
print("Cannot successfully execute: %s" % snippet_name)
def test_edit_config_running(host, port, user, password):
# 创建 NETCONF 会话。
h3c_connection(host,port=port,user=user,password=password) as m:
# 发送 RPC 请求并检查 RPC 回复报文。
rpc_obj = m.edit_config(target='running', config=VLAN_RPC)
_check_response(rpc_obj,'VLAN_MERGE')
if __name__ == '__main__':
test_edit_config_running("192.168.56.120", 830, "ssh", "00password00connect ")
(2) 以下为通过 edit-config 操作删除 VLAN 的 Python 程序:
# -*- coding:utf-8 -*-
import sys
import logging
from ncclient import manager
from ncclient import operations
log = logging.getLogger(__name__)
# 用于删除 VLAN 的 RPC 报文。
VLAN_RPC_DELETE = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="delete">
<VLANs>
<VLANID>
<ID>4</ID>
</VLANID>
</VLANs>
</VLAN>
</config>
# 建立与设备的连接。
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,password=password,
hostkey_verify = False,
device_params={'name':"h3c"})
# 检查 RPC 回复报文。
def _check_response(rpc_obj, snippet_name):
print("RPC reply for %s is %s" % (snippet_name, rpc_obj.xml))
xml_str = rpc_obj.xml
if "<ok/>" in xml_str:
print("%s successful" % snippet_name)
else:
print("Cannot successfully execute: %s" % snippet_name)
def test_edit_config_running(host, port, user, password):
# 创建 NETCONF 会话。
with h3c_connection(host, port=port, user=user, password=password) as m:
# 发送 RPC 请求并检查 RPC 回复报文。
rpc_obj = m.edit_config(target='running', config=VLAN_RPC_DELETE)
_check_response(rpc_obj, 'VLAN_DELETE')
if __name__ == '__main__':
test_edit_config_running("192.168.56.120", 830, "ssh", "00password00connect")
(1) 构造过滤条件,不同操作方式,报文格式不同:
¡ get 操作 需要指定 的 命名空间为 xmlns= http://www.h3c.com/netconf/data:1.0 。以获取接口信息为例, RPC 报文如下:
IF_GET_RPC = xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr><Interfaces>
<Interface></Interface>
</Interfaces>
</Ifmgr>
¡ get-config 操作 需要指定 的 命名空间为 xmlns= http://www.h3c.com/netconf/config:1.0 。以获取接口信息为例, RPC 报文如下:
IF_GET_CONFIG_RPC = xmlns="http://www.h3c.com/netconf/config:1.0">
<Ifmgr><Interfaces>
<Interface></Interface>
</Interfaces>
</Ifmgr>
(2) 调用对应接口,发送 <get> 或 <get-config> 报文到服务 器 端,查询当前运行数据和配置数据。
¡ 调用 get 接口,发送 get 操作 RPC 请求,并将回复报文写入到 xml 文件中。
get_reply = m.get(("subtree", IF_GET_RPC)).data_xml
print(get_reply)
open("%s_get.xml" % host, 'w') as f:
f.write(get_reply)
¡ 调用 get 或 get-config 接口,发送 get-config 操作 RPC 请求 , 并将回复报文写入到 xml 文件中 。
通过调用 get 和 get-config 接口,均可以执行 get-config 操作。调用 get 接口时,设备通过请求报文中的命令空间判断 当前请求是 get 类型 还是 get-config 类型 。
调用 get 接口,执行 get-config 操作的方法为:
get_reply2 = m.get(("subtree", IF_GET_CONFIG_RPC)).data_xml
print(get_reply2)
with open("%s_getconfig.xml" % host, 'w') as f:
f.write(get_reply2)
调用 get-config 接口,执行 get-config 操作的方法为:
m.get_config(source='running',filter=('subtree',IF_GET_CONFIG_RPC)).data_xmlopen("%s_getconfig2.xml" % host, 'w') as f:
f.write(c)
以下为通过 get 或 get-config 操作获取接口信息的 Python 程序:
# -*- coding:utf-8 -*-
import sys
import logging
from ncclient import manager
from ncclient import operations
log = logging.getLogger(__name__)
# 获取接口信息的 RPC 报文。
IF_GET_RPC = """
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces><Interface></Interface>
</Interfaces>
</Ifmgr>
IF_GET_CONFIG_RPC = xmlns="http://www.h3c.com/netconf/config:1.0">
<Ifmgr>
<Interfaces><Interface></Interface>
</Interfaces>
</Ifmgr>
# 建立与设备的连接。
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,password=password,
hostkey_verify = False,
device_params={'name':"h3c"},
allow_agent = False,
look_for_keys = False)
get-bulk 和 get-bulk-config 操作为 H3C 自行定义的私有操作类型。在 ncclient 中 get-bulk/get-bulk-config 接口和 get 接口的使用方法类似。
(1) 构造过滤条件。
以获取接口数据为例, RPC_GET_BULK 使用 get-bulk 方法 , 获取接口索引为 <IfIndex>1536</IfIndex> 之后的所有接口的数据 , RPC 报文为:
RPC_GET_BULK = xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr><Interfaces>
<Interface>
<IfIndex>1536</IfIndex>
</Interface>
</Interfaces>
</Ifmgr>
使用 get-bulk-config 方法获取所有 接口 的配置数据 ,其报文格式为( RPC_GET_BULK_CONFIG 的 RPC 请求中未指定索引 ):
RPC_GET_BULK_CONFIG = xmlns="http://www.h3c.com/netconf/config:1.0">
<Ifmgr></Ifmgr>
</GRPC>
(2) 调用对应接口,发送 <get-bulk> 或 <get-bulk-config> 报文到服务 器 端, 批量 查询当前运行数据和配置数据。
¡ 调用 get-bulk 接口,发送 get-bulk 操作 RPC 请求。
reply = m.get_bulk(filter=('subtree',RPC_GET_BULK))
print(reply)
¡ 调用 get-bulk-config 接口,发送 get-bulk-config 操作 RPC 请求。
reply = m.get_bulk_config(source= "running", filter=('subtree', RPC_GET_BULK_CONFIG))
print(reply)
以下为通过 get-bulk 或 get-bulk-config 操作批量获取接口信息的 Python 程序:
# -*- coding:utf-8 -*-
import sys
import logging
from ncclient import manager
from ncclient import operations
log = logging.getLogger(__name__)
# 通过 get-bulk 操作获取接口信息的 RPC 报文。
RPC_GET_BULK = """
xmlns="http://www.h3c.com/netconf/data:1.0">
<Ifmgr>
<Interfaces>
<Interface><IfIndex>1536</IfIndex>
</Interface>
</Interfaces>
</Ifmgr>
# 通过 get-bulk-config 操作获取接口信息的 RPC 报文。
RPC_GET_BULK_CONFIG = xmlns="http://www.h3c.com/netconf/config:1.0">
<Ifmgr>
</Ifmgr>
</GRPC>
# 建立与设备的连接。
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,password=password,
hostkey_verify = False,
device_params={'name':"h3c"},
allow_agent = False,
look_for_keys = False)
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream>Ifmgr</stream>
</create-subscription>
(2) 下发事件订阅报文 。
# 为 rpc 设置 Message ID 。
msgid = 100
rpc = Rpc4Subscription.format(msgid)
# 发送订阅报文。
m._session.send(rpc)
m._session.send(RPC4Ifmgr))
(3) 等待事件信息上报 。
m.take_notification(block=True,timeout=100)
以下为订阅设备上接口管理事件的 Python 程序:
# -*- coding:utf-8 -*-
import sys
import logging
import time
from ncclient import manager
from ncclient import operations
from ncclient.operations import CreateSubscription
log = logging.getLogger(__name__)
# 创建 netconf 订阅的 RPC 报文。
Rpc4Subscription = """<rpc message-id="{}" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0"><stream>NETCONF</stream>
</create-subscription>
# 订阅 ifmgr 事件的 RPC 报文。
RPC4Ifmgr = """
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream>Ifmgr</stream>
</create-subscription>
# 建立与设备的连接。
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,password=password,
hostkey_verify = False,
device_params={'name':"h3c"},
allow_agent = False,
look_for_keys = False)
C:\Users\c23406\AppData\Local\Programs\Python\Python37\Lib\site-packages\ncclient\devices\h3c.py
在 H3cDeviceHandler 类的 get_capabilities 方法中添加 xml2cli 能力集,如下:
class H3cDeviceHandler(DefaultDeviceHandler):
def get_capabilities(self):
# Just need to replace a single value in the default capabilities
super(H3cDeviceHandler, self).get_capabilities()
c.append("urn:h3c:params:netconf:capability:h3c-xml2cli:1.0")
return c
(2) 构造订阅报文 , RPC 报文如下:
# merge VLAN 。
VLAN_MERGE_RPC = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="merge">
<VLANs>
<VLANID>
<ID>4</ID><Name>4</Name>
<Description>helloword</Description>
</VLANID>
</VLANs>
</VLAN>
</config>
# delete VLAN 。
VLAN_DEL_RPC = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="delete">
<VLANs>
<VLANID>
<ID>4</ID>
</VLANID>
</VLANs>
</VLAN>
</config>
# merge gRPC 。
GRPC_MERGE_1 =
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xc:operation="merge" xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="merge">
<Subscriptions>
<Subscription>
<SubscriptionName>1</SubscriptionName><SourceAddress>1.1.1.1</SourceAddress>
<SensorProfiles>
<SensorProfile>
<GroupName>1</GroupName>
<SampleInterval>10</SampleInterval>
</SensorProfile>
<SensorProfile>
<GroupName>2</GroupName>
<SampleInterval>20</SampleInterval>
</SensorProfile>
</SensorProfiles>
<DestinationProfiles>
<DestinationProfile>
<GroupName>1</GroupName></DestinationProfile>
<DestinationProfile>
<GroupName>3</GroupName>
</DestinationProfile>
</DestinationProfiles></Subscription>
</Subscriptions>
</GRPC>
</config>
(3) 建立 netconf 连接 。
# 建立与设备的连接 。
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,username=user,
password=password,
hostkey_verify = False,
device_params={'name':"h3c"},
allow_agent = False,
look_for_keys = False)
(4) 下发报文并格式化输出到文件中。
test_edit_config_running(host, port, user, password):
i = 1
if(os.path.exists("%s_xml2cli.xml" % host)):os.remove("%s_xml2cli.xml" % host)
open("%s_xml2cli.xml" % host, 'a')
fd.write("<root>\n")
# 建立 netconf 连接
h3c_connection(host,port=port,user=user,password=password) as m:
# 2. 发送 RPC 请求并检查 RPC 回复报文
while True:
if (i == 1):
rpc_obj = m.edit_config(target='running', config=VLAN_MERGE_RPC)
print(rpc_obj.xml)
if (i == 2):
rpc_obj = m.edit_config(target='running', config=VLAN_DEL_RPC)
print(rpc_obj.xml)
if (i == 3):
rpc_obj = m.edit_config(target='running', config=GRPC_MERGE_1)
print(rpc_obj.xml)
if ((i != 1) and (i != 2) and (i != 3)):
break
i = i+1
# 输出到文件
parseXmlString2File(fd, rpc_obj.xml)fd.write("</root>\n")
fd.close()
以下为订阅设备上接口管理事件的 Python 程序:
# -*- coding:utf-8 -*-
import sys
import logging
from ncclient import manager
from ncclient import operations
import xml.etree.ElementTree as ET
from xml.dom import minidom
import time
import os
log = logging.getLogger(__name__)
# 创建 vlan
VLAN_MERGE_RPC = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="merge">
<VLANs>
<VLANID><ID>4</ID>
<Name>4</Name>
<Description>helloword</Description>
</VLANID>
</VLANs>
</VLAN>
</config>
# 删除 vlan
VLAN_DEL_RPC = """<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="delete">
<VLANs>
<VLANID>
<ID>4</ID>
</VLANID>
</VLANs>
</VLAN>
</config>
# merge GRPC
GRPC_MERGE_1 = """
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xc:operation="merge" xmlns="http://www.h3c.com/netconf/config:1.0">xc:operation="merge">
<Subscriptions>
<Subscription>
<SubscriptionName>1</SubscriptionName>
<SourceAddress>1.1.1.1</SourceAddress><SensorProfiles>
<SensorProfile>
<GroupName>1</GroupName>
<SampleInterval>10</SampleInterval>
</SensorProfile><SensorProfile>
<GroupName>2</GroupName>
<SampleInterval>20</SampleInterval>
</SensorProfile>
</SensorProfiles>
<DestinationProfiles>
<DestinationProfile>
<GroupName>1</GroupName>
</DestinationProfile>
<DestinationProfile>
<GroupName>3</GroupName>
</DestinationProfile>
</DestinationProfiles>
</Subscription></Subscriptions>
</GRPC>
</config>
# 建立与设备的连接
def h3c_connection(host, port, user, password):
return manager.connect(host=host,
port=port,
username=user,password=password,
hostkey_verify = False,
device_params={'name':"h3c"},
allow_agent = False,
look_for_keys = False)
def _check_response(rpc_obj, snippet_name):
print("RPC reply for %s is %s" % (snippet_name, rpc_obj.xml))
xml_str = rpc_obj.xml
if "<ok/>" in xml_str:
print("%s successful"%snippet_name)
else:
print("Cannot successfully execute: %s" % snippet_name)
def parseXmlString2File(fd, xmlstring):
localtime = time.asctime(time.localtime((time.time())))
str = "<!--" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + "-->
fd.write(str)
dom = minidom.parseString(xmlstring)
dom.writexml(fd, ""," ", "\n", "utf-8")
def test_edit_config_running(host, port, user, password):
i = 1
h3c_connection(host,port=port,user=user,password=password) as m:
# 2. 发送 RPC 请求并检查 RPC 回复报文
while True:
if (i == 1):
rpc_obj = m.edit_config(target='running', config=VLAN_MERGE_RPC)
# print(rpc_obj.xml)
if (i == 2):
rpc_obj = m.edit_config(target='running', config=VLAN_DEL_RPC)
# print(rpc_obj.xml)
if (i == 3):
rpc_obj = m.edit_config(target='running', config=GRPC_MERGE_1)
# print(rpc_obj.xml)
if ((i != 1) and (i != 2) and (i != 3)):
break
i = i+1
# 输出到文件
parseXmlString2File(fd, rpc_obj.xml)
· XML 中如果存在 Schema 错误,则请求不继续处理,直接返回错误。 Schema 错误检查中,有些检查可能被多种形式的约束条件来检查,此时返回的错误信息与 XSD 的约束条件有关,具体情况,请参考对应的 XSD 文件。
· 本节列举的错误是常规情况下的返回值。依据模块不同,返回的错误信息可能更加详细。
· 如果 Schema 错误中的值过长,则该值有可能被截断。比如,如下 XML 报文中时间“ 2014-13-18T17:03: ”是被截断的,此时请使用 Xpath 确认错误元素或者属性位置。
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream>NETCONF</stream>
<filter>
<event xmlns="http://www.h3c.com/netconf/event:1.0">
<Code>SHELL_LOGIN</Code>
</event>
</filter>
<startTime>2014-07-13T17:00:59</startTime>
<stopTime>2014-13-18T17:03:05</stopTime>
</create-subscription>
<error-message xml:lang="en">
The value of element '/rpc/create-su
bscription[1]/stopTime[1]' is invalid. 2014-13-18T17:03: is an invalid value of
datetime type value.
</error-message>
Comware 根据 Schema 对用户 XML 请求进行基本的格式验证,保证在大部分情况下请求格式是无误的。
表7-1 Schema 错误说明
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>missing-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Expecting element '/Envelope/Body[1]/rpc[1]/copy-config[1]/target'.</error-message>
<error-info>
<bad-element>target</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>missing-attribute</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The element '/Envelope/Body[1]/rpc[1]' should have an attribute 'message-id'.</error-message>
<error-info>
<bad-element>rpc</bad-element>
<bad-attribute>message-id</bad-attribute>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/SNMP[1]/System[1]/AgentStatus[1]' is invalid. The value does not match the enumeration.</error-message>
<error-info>
<bad-element>AgentStatus</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-attribute</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of attribute 'count' for element '/Envelope/Body[1]/rpc[1]/get-bulk[1]/filter[1]/top[1]' is invalid. aa is an invalid value of unsignedInt type value.</error-message>
<error-info>
<bad-element>top</bad-element>
<bad-attribute>count</bad-attribute>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The number of occurrences of element '/Envelope/Body[1]/rpc[1]/get-config[1]/filter[1]/top[1]/SecurityZone[1]/Interfaces[1]/Interface[1]/ZoneName' is invalid.</error-message>
<error-info>
<bad-element>ZoneName</bad-element>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>unknown-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Unexpected element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/Device[1]/SummerTime[1]'.</error-message>
<error-info>
<bad-element>SummerTime</bad-element>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>unknown-attribute</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Unexpected attribute 'match' of element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/SNMP[1]/System[1]/AgentStatus[1]'.</error-message>
<error-info>
<bad-element>AgentStatus</bad-element>
<bad-attribute>match</bad-attribute>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The child elements of '/Envelope/Body[1]' are invalid.</error-message>
<error-info>
<bad-element>Body</bad-element>
</error-info>
</rpc-error>
version="1.0" encoding="UTF-8"?><rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101"><rpc-error><error-type>rpc</error-type><error-tag>bad-element</error-tag><error-severity>error</error-severity><error-message xml:lang="en">Element '/rpc' can not have a textual child element.</error-message><error-info><bad-element>rpc</bad-element></error-info></rpc-error></rpc-reply>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/License[1]/Systems[1]/System[1]/Max[1]' can not have a child element.</error-message>
<error-info>
<bad-element>Max</bad-element>
</error-info>
</rpc-error>
元素或者属性的值不是一个有效的 XSD 类型的值
· value : XML 中元素或者属性的值,如果值过长,将被截断
· type :当前错误位置的数据类型,报告的类型是 XSD 的数据类型名称
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/action[1]/top[1]/License[1]/Operations[1]/Operation[1]/DeviceNode[1]/Chassis[1]' is invalid. 12345678901234565 is an invalid value of unsignedShort type value.</error-message>
<error-info>
<bad-element>Chassis</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/action[1]/top[1]/License[1]/Operations[1]/Operation[1]/OpType[1]' is invalid. unsignedInt cannot be empty.</error-message>
<error-info>
<bad-element>OpType</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/action[1]/top[1]/License[1]/Operations[1]/Operation[1]/OpTarget[1]/ActivationKey[1]' is invalid. The value does not match the regular expression.</error-message>
<error-info>
<bad-element>ActivationKey</bad-element>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/SNMP[1]/System[1]/AgentStatus[1]' is invalid. The value does not match the enumeration.</error-message>
<error-info>
<bad-element>AgentStatus</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Syslog[1]/LogHosts[1]/Host[1]/VRF[1]' is invalid. The length must be equal to 2.</error-message>
<error-info>
<bad-element>VRF</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Syslog[1]/LogHosts[1]/Host[1]/VRF[1]' is invalid. The total digit length must be equal to 2.</error-message>
<error-info>
<bad-element>VRF</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/action[1]/top[1]/License[1]/Operations[1]/Operation[1]/OpTarget[1]/ActivationFile[1]' is invalid. The length must be less than or equal to 255.</error-message>
<error-info>
<bad-element>ActivationFile</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/action[1]/top[1]/License[1]/Operations[1]/Operation[1]/OpTarget[1]/ActivationKey[1]' is invalid. The length must be greater than or equal to 1.</error-message>
<error-info>
<bad-element>ActivationKey</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Syslog[1]/LogHosts[1]/Host[1]/Port[1]' is invalid. The value must be less than 5.</error-message>
<error-info>
<bad-element>Port</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Syslog[1]/LogHosts[1]/Host[1]/Port[1]' is invalid. The value must be greater than 2.</error-message>
<error-info>
<bad-element>Port</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/ACL[1]/Groups[1]/Group[1]/GroupID[1]' is invalid. The value must be less than or equal to 5999.</error-message>
<error-info>
<bad-element>GroupID</bad-element>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>rpc</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of element '/Envelope/Body[1]/rpc[1]/get[1]/filter[1]/top[1]/ACL[1]/Groups[1]/Group[1]/GroupID[1]' is invalid. The value must be greater than or equal to 2000.</error-message>
<error-info>
<bad-element>GroupID</bad-element>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>invalid-value</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Syslog[1]/LogHosts[1]/Host[1]</error-path>
<error-message xml:lang="en">Invalid value.</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Syslog>
<LogHosts>
<Address>1.#.1.1</Address>
<VRF>aa</VRF>
</Host>
</LogHosts>
</Syslog>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>data-exists</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/SNMP[1]/Communities[1]/Community[1]</error-path>
<error-message xml:lang="en">Configuration already exists.</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Communities>
<Community>
<Name>123</Name>
<Type>1</Type>
</Community>
</Communities>
</SNMP>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>invalid-value</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/SNMP[1]/Communities[1]/Community[1]</error-path>
<error-message xml:lang="en">Configuration target does not exist.</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Communities>
<Community>
<Name>12311</Name>
<Type>1</Type>
</Community>
</Communities>
</SNMP>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>data-missing</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/SNMP[1]/Communities[1]/Community[1]</error-path>
<error-message xml:lang="en">Configuration does not exist.</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Communities>
<Community>
<Name>1231</Name>
<Type/>
</Community>
</Communities>
</SNMP>
</error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>protocol</error-type> <error-tag>lock-denied</error-tag> <error-severity>error</error-severity> <error-message xml:lang="en">Current session has held the lock.</error-message> <error-info> <session-id>1</session-id> </error-info>
</rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>protocol</error-type> <error-tag>operation-failed</error-tag> <error-severity>error</error-severity> <error-message xml:lang="en">Unlock failed because no NETCONF lock exists.</error-message> </rpc-error>xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>protocol</error-type> <error-tag>operation-failed</error-tag> <error-severity>error</error-severity> <error-message xml:lang="en">Unlock Failed because the lock is not held by current session.</error-message> </rpc-error>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>protocol</error-type> <error-tag>lock-denied</error-tag> <error-severity>error</error-severity> <error-message xml:lang="en">Lock failed because the NETCONF lock is held by another session.</error-message> <error-info> <session-id>1</session-id> </error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>invalid-value</error-tag> <error-severity>error</error-severity> <error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Device[1]/Base[1]</error-path>
<error-message xml:lang="en">Can not edit tables with only table names.</error-message> </rpc-error>
When the delete or remove operation is issued, data cannot be assigned to non-index columns.
执行 Delete 或 Remove 操作时,普通列不能带值
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>invalid-value</error-tag> <error-severity>error</error-severity> <error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Device[1]/Base[1]/HostName[1]</error-path>
<error-message xml:lang="en">When the delete or remove operation is issued, data cannot be assigned to non-index columns.</error-message> </rpc-error>
When the delete or remove operation is issued, data cannot be assigned to non-index columns.
下发删除操作时,索引列不可以不指定值
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type><error-tag>invalid-value</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body/rpc/edit-config/config/openconfig-acl:acl/acl-sets/acl-set[name=''][type='ACL_IPV4']/config/description</error-path>
<error-message xml:lang="en">When the delete or remove operation is issued, data cannot be assigned to non-index columns.</error-message>
</rpc-error>
When the create, merge, or replace operation is issued, empty data cannot be assigned to columns.
下发 create/merge/replace 等操作时,列不可以不指定值
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>invalid-value</error-tag><error-severity>error</error-severity>
<error-path>/Envelope/Body/rpc/edit-config/config/openconfig-acl:acl/acl-sets/acl-set[name=''][type='ACL_IPV4']/config/description</error-path>
<error-message xml:lang="en"> When the create, merge, or replace operation is issued, empty data cannot be assigned to columns.</error-message>
</rpc-error>
For a <get-bulk> or <get-bulk-config> operation request, a table can't contain both non-index columns and subtables, and it can contain only one subtable.
执行 get-bulk 操作或 get-bulk-config 操作时,请求报文中同时包含了普通列和子表
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>operation-not-supported</error-tag><error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/get-bulk[1]/filter[1]/top[1]/GRPC[1]/Subscriptions[1]/Subscription[1]/SourceAddress[1]</error-path>
<error-message xml:lang="en">For a <get-bulk> or <get-bulk-config> operation request, a table can't contain both non-index columns and subtables, and it can contain only one subtable.</error-message>
</rpc-error>
When the create, merge, or replace operation is issued, empty data cannot be assigned to columns.
执行 create 、 merge 或 replace 操作时,普通列带空值
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>invalid-value</error-tag> <error-severity>error</error-severity> <error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Fundamentals[1]/WebUI[1]</error-path>
<error-message xml:lang="en">When the create, merge, or replace operation is issued, empty data cannot be assigned to columns.</error-message> </rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>invalid-value</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Ifmgr[1]/Interfaces[1]/Interface[1]/Loopback[1]</error-path>
<error-message xml:lang="en">The configuration not supported on the specified target.</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Ifmgr>
<Interfaces>
<Interface>
<IfIndex>449</IfIndex>
<Loopback>1</Loopback>
</Interface>
</Interfaces>
</Ifmgr>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>resource-denied</error-tag>
<error-severity>error</error-severity><error-path>/rpc/edit-config[1]/config[1]/top[1]/Device[1]/Base[1]/TimeZone[1]/ZoneName[1]</error-path>
<error-message xml:lang="en">The session does not have the privilege to process the request.</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Device>
<TimeZone>
<ZoneName>1</ZoneName>
</TimeZone>
</Base>
</Device>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>resource-denied</error-tag>
<error-severity>error</error-severity><error-path>/rpc/edit-config[1]/config[1]/top[1]/Device[1]/Base[1]/TimeZone[1]/ZoneName[1]</error-path>
<error-message xml:lang="en"> Resources are insufficient for processing the request..</error-message>
<error-info>
xmlns="http://www.h3c.com/netconf/config:1.0">
<Device>
<TimeZone>
<ZoneName>1</ZoneName>
</TimeZone>
</Base>
</Device>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>operation-failed</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/SNMP[1]/System[1]</error-path>
<error-message xml:lang="en">Operation failed.</error-message>
<error-info>
<top xmlns="http://www.h3c.com/netconf/config:1.0">
<System>
<AgentStatus>disable</AgentStatus>
</System>
</SNMP>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>invalid-value</error-tag> <error-severity>error</error-severity> <error-message xml:lang="en">The session cannot kill itself.</error-message> </rpc-error>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>operation-failed</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Hello is required before any other operation.</error-message>
</rpc-error>
</rpc-reply>]]>]
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>operation-failed</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">Event subscription already exists.</error-message>
</rpc-error>
</rpc-reply>
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>operation-not-supported</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The event stream name can't be empty.</error-message>
</rpc-error>
</rpc-reply>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>access-denied</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">You don't have the privilege to perform this NETCONF operation.</error-message>
</rpc-error>
</rpc-reply>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>access-denied</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">You don't have the privilege to subscribe the InterfaceEvent event.</error-message>
</rpc-error>
</rpc-reply>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The element stopTime is required.</error-message>
<error-info><bad-element>stopTime</bad-element>
</error-info>
</rpc-error>
</rpc-reply>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:
base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The startTime should be earlier than the current system time.</error-message>
<error-info>
<bad-element>startTime</bad-element>
</error-info>
</rpc-error>
</rpc-reply>]]>]
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The startTime should be earlier than the stopTime.</error-message>
<error-info>
<bad-element>startTime</bad-element>
</error-info>
</rpc-error>
</rpc-reply>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The stopTime should be later than the current system time.</
error-message>
<error-info>
<bad-element>stopTime</bad-element>
</error-info>
</rpc-error>
</rpc-reply>]]>]
<env:Text xml:lang="en"> Maximum number of NETCONF sessions exceeded.</env:Text> </env:Reason>
</env:Fault>
</env:Body>
</env:Envelope>
Operation failed. flash:/startup.cfg can't be overwritten because the OverWrite flag is false.
执行 NETCONF 的 save 操作时, OverWrite 属性值为 false
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>operation-failed</error-tag> <error-severity>error</error-severity> <error-message xml:lang="en">Operation failed. flash:/startup.cfg can't be overwritten because the OverWrite flag is false.</error-message> </rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>operation-failed</error-tag> <error-severity>error</error-severity> <error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/Fundamentals[1]/WebUI[1]/HTTPS[1]/SSLPolicyName[1]</error-path> <error-message xml:lang="en">Failed to set HTTPS server status because the specified SSL server policy doesn't exist.</error-message> <error-info>
xmlns="http://www.h3c.com/netconf/config:1.0"> <Fundamentals> <WebUI> <HTTPS> <SSLPolicyName>hjhkjhkj</SSLPolicyName> </HTTPS>
</WebUI> </Fundamentals>
</error-info>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>operation-not-supported</error-tag> <error-severity>error</error-severity> <error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/VLAN[1]/TrunkInterfaces[1]/Interface[1]</error-path> <error-message xml:lang="en">The replace operation does not support incremental-edit.</error-message> </rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <error-type>application</error-type> <error-tag>invalid-value</error-tag> <error-severity>error</error-severity> <error-path>/Envelope/Body[1]/rpc[1]/edit-config[1]/config[1]/top[1]/VLAN[1]/TrunkInterfaces[1]/Interface[1]/PermitVlanList[1]</error-path> <error-message xml:lang="en">The incremental column must have value.</error-message> </rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type><error-tag>invalid-value</error-tag>
<error-severity>error</error-severity>
<error-path>/Envelope/Body[1]/rpc[1]/get-bulk[1]/filter[1]/top[1]/GRPC[1]/Subscriptions[1]/Subscription[1]/DestinationProfiles[1]</error-path>
<error-message xml:lang="en">The value of attribute 'count' is invalid. Ancestor node index is incomplete.</error-message>
</rpc-error>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>operation-not-supported</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The NETCONF_MONITOR_EXTENSION stream must include filter information.</error-message>
</rpc-error>
</rpc-reply>
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>operation-not-supported</error-tag><error-severity>error</error-severity>
<error-message xml:lang="en">The NETCONF_MONITOR_EXTENSION stream must have NetconfMonitor information.</error-message>
</rpc-error>
</rpc-reply>]]>]
l:ns:netconf:base:1.0">
<error-type>application</error-type>
<error-tag>operation-not-supported</error-tag><error-severity>error</error-severity><error-message xml:lang="en">Incorrect name for Stream NETCONF_MONITOR_EXTENSIO.</error-message>
</rpc-error>
</rpc-reply>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:xs="http://www.h3c.com/netconf/base:1.0" message-id="100">
<rpc-error xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<error-type>protocol</error-type>
<error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">The subscribing to event time must be in the range of 1970 to 2035.</error-message>
<error-info>
<bad-element>stopTime</bad-element>
</error-info>
</rpc-error>
</rpc-reply>
<error-severity>error</error-severity><error-path>/Envelope/Body/rpc/get/filter/top/Device/ExtPhysicalEntities/Entity[PhysicalIndex='']/MAC</error-path>
<error-message xml:lang="en">The value 50 of attribute 'match' is invalid.</error-message>
</rpc-error>
<error-severity>error</error-severity>
<error-message xml:lang="en">The value of the ColumnValue parameter for column HostName can't be empty.</error-message>
</rpc-error>
</rpc-reply>
<error-severity>error</error-severity><error-path>/Envelope/Body/rpc/edit-config/config/openconfig-acl:acl/acl-sets/acl-set[name='test01'][type='ACL_IPV4']/config/hello</error-path>
<error-message xml:lang="en">Unexpected element 'http://openconfig.net/yang/acl':'hello' under element "/Envelope/Body/rpc/edit-config/config/openconfig-acl:acl/acl-sets/acl-set[name='test01'][type='ACL_IPV4']/config"</error-message>
<error-info>
<bad-element>hello</bad-element>
</error-info>
</rpc-error>
<error-severity>error</error-severity>
<error-message xml:lang="en">Incorrect column name for column 1 of XPath Device/Base.</error-message>
</rpc-error>
</rpc-reply>
version="1.0" encoding="utf-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="34">
<rpc-error>
<error-type>application</error-type><error-tag>bad-element</error-tag>
<error-severity>error</error-severity>
<error-message xml:lang="en">XPath Base is wrong. Valid format is ModuleName[/SubmoduleName]/TableName.</error-message>
</rpc-error>
</rpc-reply>
Comware 系统中,部分数据类型难以使用 Schema 标准方式简单描述。为了方便检查使用,这些类型的检查被作为内置实现,在外表现为 string 类型,但其逻辑检查不是执行的 string 类型。内置类型都定义在 basetype.xsd 中。 Comware 支持的内置类型如 表 7-4 表 7-4 所示。
表7-4 Schema 内置类型
某些表中,存在某些列在部分情况下支持、部分情况下不支持的情况。此时,对于 delete/remove 操作,这些列会返回成功,以便于只下发索引时能够不返回错误。
同时存在 IP 和掩码时,为了不出现错误的结果,建议不要下发 IP 和 Mask 作用后的结果导致 IP 变化的请求。比如,不建议下发如下请求,因为 Mask 影响 IP 的结果,导致 IP 实际为 192.168.0.0 。 IP : 192.168.1.1 Mask : 255.255.0.0
默认情况下, get 、 get-config 、 get-bulk 、 get-bulk-config 、 edit-config 、 action 中的元素可以按照任意顺序下发。但某些表存在可以重复的分组元素,此时这些表中的列必须按照顺序下发。为了保证下发请求时不出现错误,请尽量按照 NETCONF API 文档中 XML 结构里罗列的 XML 出现顺序进行下发。
举例: IRF/IRFPorts 表的 xml api 如下:
<IRFPorts>
<IRFPort>
<MemberID></MemberID>
<Port></Port>
<Interface>
<IfName></IfName>
<MDCName></MDCName>
<Mode></Mode>
</Interface>
</IRFPort></IRFPorts>
其中, IfName 、 MDCName 、 Mode 列均属一个同一个可重复组“ Interface ”,因此客户端下发报文时需要按照 xml api 规定的顺序下发:
<rpc message-id="100" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running/>
</target>
<config xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
xmlns="http://www.h3c.com/netconf/config:1.0">
<IRFPorts xc:operation="merge">
<IRFPort>
<MemberID>1</MemberID>
<Port>2</Port>
<Interface>
<IfName>Ten-GigabitEthernet1/0/48</IfName><Mode>1</Mode>
</Interface>
<Interface>
<IfName>Ten-GigabitEthernet1/0/49</IfName><Mode>1</Mode>
</Interface>
</IRFPort>
</IRFPorts>
</config>
</edit-config>