具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并结合实施例,对本发明所述方案作进一步地详细说明。
参见图1,为本发明实施例将网络配置协议响应报文转换为命令行的方法流程图。本方法主要应用在NETCONF代理中,包括如下步骤:
步骤101,预先根据建模文件,将网络设备的shell命令行转换为XML格式的shell定义文件。
本步骤中,将网络设备的shell命令按配置模块进行定义,生成XML格式的shell定义文件。可以将多个配置模块相关的shell命令定义到同一个shell定义文件中,如果Shell定义文件比较大,也可以按配置模块生成多个shell定义文件。建模(Schema)文件,是用于描述XML数据约束规则的文件,对NETCONF协议的内容层和操作层进行抽象、建模;在系统启动时,加载到NETCONF代理及NETCONF服务器内存中。由于建模文件的生成和获取,属于现有技术,此处不再赘述。
在Shell定义文件中有两类节点即命令关键字(cmd-key)节点和命令参数(cmd-param)节点,cmd-key节点表示这是一个命令中的关键字,cmd-param节点表示一个命令中的参数。cmd-key节点和cmd-param节点主要包括name属性、help属性,所述name属性表示所属节点的名字,命令关键字节点的name属性表示该节点所对应shell命令行的一个组成部份的名字,命令参数节点的name属性与Schema文件中的节点名一致;help属性表示通过设定的命令格式可以查看到的所属节点的帮助信息。另外,还可以根据需要为shell定义文件的节点定义xpath路径属性、filter路径属性和type类型属性;xpath属性和filter属性都表示路径,与所属节点在建模文件中的路径一致,xpath属性表示配置命令的命令参数节点在建模文件中的路径,filter属性表示获取配置信息命令的相关信息在建模文件中的保存路径;type属性表示参数的类型。还可以定义target-mode属性,一般出现在叶子节点中,表示该命令是一个配置模式切换命令,执行该命令后切换到的目标配置模式。
本实施例中,将网络设备的shell命令行转换为XML格式的shell定义文件的方法,具体包括:
A1.将网络设备的shell命令行按功能划分为配置模块。
A2.将属于同一个配置模块的所有shell命令行定义在同一个shell定义文件中。
A3.在所述shell定义文件中,当shell命令行的组成节点在Schema文件 中有定义时,将该节点定义为shell定义文件的命令参数节点,否则定义为shell定义文件的命令关键字节点;所述命令参数节点和命令关键字节点在shell定义文件的层级关系,由其在shell命令行中的顺序关系确定。
本步骤中,对于同一个配置模块中的多条shell命令行中第一个节点相同,如shell命令“show run”与“show ospf”,仅定义一个show节点;对于多条shell命令中同级节点相同且其所有祖先节点都相同的多个节点,则在所述shell定义文件中对所述节点只定义一个节点,例如Show interface回车、Show interface name,则只需要定义一次show节点和interface节点。
A4.指定所述shell定义文件中各个节点的name属性和help属性。
根据以上式,将模块名为interfaces的配置模块下的interface name、ip address ip subnetmask、mtu mtu、exit等命令生成的Shell定义文件如下:
将模块名为show的配置模块下的show interface、show interface name、show running-config命令生成的Shell定义文件如下:
上述interfaces和show两个配置模块的shell命令行分别生成了一个shell定义文件,当然两个配置模块可以成一个shell定义文件。
步骤102,在系统启动时,将所述shell定义文件加载到内存中生成shell二叉树。
在系统启动时,将Shell定义文件加载到内存,生成Shell二叉树。加载时,不同的配置模块,加载到不同的shell二叉树。本实施例提供以下两种实现方案。
将所述shell定义文件加载到内存中生成shell二叉树的方案一,具体实现步骤如下:将所述shell二叉树的名字命名为所述shell定义文件中配置模块节点的name属性值;将所述shell定义文件中配置模块节点的第一个子节点加载为所述shell二叉树的根节点,将所述shell定义文件中配置模块节点的其余子节点加载为其前一个子节点的兄弟节点,并将shell二叉树中加载的上述节点的父节点指针置为空;将所述shell定义文件中非配置模块节点的第一个子节点加载为shell二叉树中所述节点的左子节点,将shell定义文件中所述非配置模块节点的其余子节点加载为其前一个子节点在所述shell二叉树中对应节点的兄弟节点,并将shell二叉树中加载的上述节点的父节点指针置为其在所述shell定义文件中的父节点在所述shell二叉树中相对应的节点。
将所述shell定义文件加载到内存中生成shell二叉树的方案二,具体实 现步骤如下:将所述shell二叉树的名字命名为所述shell定义文件中配置模块节点的name属性值;将所述shell定义文件中的配置模块节点加载为所述shell二叉树的根节点;将所述shell定义文件中配置模块节点的第一个子节点,加载为所述shell二叉树中根节点的左子节点,将所述shell定义文件中所述配置模块节点的其余子节点,加载为其前一个子节点在所述shell二叉树中对应节点的兄弟节点,并将shell二叉树中加载的上述节点的父节点指针置为空;将所述shell定义文件中非配置模块节点的第一个子节点,加载为所述shell二叉树中所述非配置模块节点的左子节点,将所述shell定义文件中所述非配置模块节点的其余子节点,加载为其前一个子节点在所述shell二叉树中对应节点的兄弟节点,并将shell二叉树中加载的上述节点的父节点指针置为其在所述shell定义文件中的父节点在所述shell二叉树中相对应的节点。如所示为配置模块interfaces的Shell定义文件加载到内存形成的shell二叉树。其加载过程如下:
将配置模块interfaces所对应的shell二叉树的名字命名为所述shell定义文件中配置模块节点的name属性值即interfaces;然后将interfaces加载为所述shell二叉树的根节点;加载interfaces节点的子节点interface及其子节点,因为interface子节点的父节点为根节点interfaces,将interface子节点的父节点指针置为空;加载interface子节点的子节点name;
同理加载interface节点的下一个兄弟节点ip,在二叉树中为interface节点的右子节点,将ip节点的父节点指针置为空,加载ip节点的子节点address,加载address子节点的子节点ip,再加载ip子节点的子节点subnetmask;这里出现了两个ip子节点,前一个的类型是cmd-key,而后一个的类型为cmd-param,在同一条命令中不会出现两个类型都是cmd-key的同名子节点的,但即便两个同名子节点的类型都是cmd-param,也可以根据其xpath加以区分,因为schema文件中不可能在同一路径下出现两个同名的子节点;同理加载ip子节点的下一个兄弟节点mtu及其所有子节点;同理加载mtu子节点的再下一个兄弟节点exit及其所有子节点;所有节点加载完毕,最后形成interfaces配置模块的二叉树,见图3。
同理加载show配置模块shell定义文件生成的shell二叉树,如图4所示。
步骤103,根据内存中shell二叉树中的信息,将收到的来自NETCONF 服务器的与用户获取配置信息命令相对应的响应报文,转换为shell命令行。
当用户在CLI终端执行Shell命令“show interface”来获取网络设备所有接口的配置信息时,NETCONF代理根据加载到系统内存中的Shell二叉树和建模文件将show interface请求命令转换为NETCONF协议的get-config请求报文,并在会话中发送给NETCONF服务器。NETCONF服务器收到该get-config请求报文后,在running数据库中收集与interfaces相关的配置信息,并打包为rpc-reply报文返回给NETCONF代理,该过程为现有技术,此处不再赘述。
当NETCONF代理从NETCONF服务器接收到XML格式的与用户获取配置信息的命令“show interface”对应的rpc-reply响应报文后,可根据报文中的Message ID找到该报文对应的请求报文,得到用户的获取配置命令,从而判断需要将该响应报文转换为Shell命令行以方便用户查看,即根据内存中的Shell二叉树将XML响应报文中的数据转换为Shell命令行。
根据内存中shell二叉树中的信息,将收到的来自NETCONF服务器的与用户获取配置信息命令相对应的响应报文,转换为shell命令行的具体过程如下:C1.解析响应报文,去掉XML报文头部得到数据部分;
C2.根据顶级节点所表示的配置模块名字,找到所述配置模块对应的shell二叉树;
C3.中序遍历所述shell二叉树,遍历到叶子节点时,从该叶子节点开始,依次查找其父节点,以及父节点的父节点,直到查找到祖先节点为空,得到一个节点序列,将所述节点序列倒序排列,如果节点序列中存在命令参数节点,则用所述响应报文中该命令参数节点的值来替换,从而得到一条shell命令行;
C4.从C3中的叶子节点开始,继续按C3的步骤中序遍历所述shell二叉树,直到遍历完所述shell二叉树;
C5.如果还存在步骤C2中所述顶级节点的兄弟节点,则取下一个兄弟节点,继续循环执行步骤C2-C4,否则本流程结束。
下面结合配置模块interfaces的Shell二叉树,具体里说明将与shell命令“show interface”对应的XML响应报文中的数据转换为Shell命令行的过程:
首先解析rpc-reply响应报文,去掉报文头部,得到数据部分;
根据XML的顶级节点interfaces表示的配置模块名字,找到所述 interfaces配置模块对应的shell二叉树;
中序遍历interfaces二叉树,得第一个节点interface,为cmd-key节点,但非叶子节点,再继续遍历,得name节点,为cmd-param,是叶子节点,依次取name节点,name节点的父节点interface(前已述及,interface节点的父节点指针为空),得到一节点序列name interface,倒序之后得interface name,由于name节点是cmd-param类型,于是用响应报文中节点name的值来替换,得Shell命令行:interface eth0。
由name节点的target-mode属性可知,该命令是一个配置模式切换命令,需进行模式切换,所以后面由interface节点解析出来的命令要增加缩进来显示;
继续中序遍历该interfaces二叉树,依次得到ip、address、ip节点,这三个节点都不是叶子节点,再继续遍历,得subnetmask节点,是叶子节点了,于是取subnetmask节点,subnetmask节点的父节点ip,ip节点的父节点address,address节点的父节点ip,ip节点的父节点指针为空,最后得一序列:subnetmask ip address ip,倒序后得ip address ip subnetmask,在该序列中,将cmd-param类型的节点ip用192.168.1.1替换,节点subnetmask用255.255.252.0替换,得Shell命令:ip address 192.168.1.1255.255.252.0;
继续遍历,同理可得Shell命令:mtu 1500;
继续遍历,同理可得Shell命令:exit;
由于exit是一配置模式切换命令,于是对后面的命令要减少缩进显示;
此时二叉树遍历完毕,得到如下命令序列:
interface eth0
ip address 192.168.1.1255.255.252.0
mtu 1500
exit
虽然二叉树遍历完毕,但XML后面还有<interfaces>节点的子节点,因此重新对二叉树进行遍历;同理解析后面的XML报文,NETCONF代理最终解析出对应的Shell命令行为:
interface eth0
ip address 192.168.1.1255.255.252.0
mtu 1500
exit
interface eth1
ip address 128.255.41.209255.255.255.0
mtu 1500
exit
参见图5为本发明实施例将网络配置协议响应报文转换为命令行的装置的结构框图,具体包括:
Shell定义文件生成模块,用于预先根据建模文件,将网络设备的shell命令行转换为XML格式的shell定义文件;
Shell定义文件加载模块,用于在系统启动时,将所述shell定义文件加载到内存中生成Shell二叉树;还用于在shell定义文件发生变化后,重新对shell定义文件进行加载;
Shell命令行转换模块,用于在接收到NETCONF服务器的响应报文后,根据内存中Shell二叉树将响应报文中的数据转换为Shell命令行。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。