使用 NETCONF Java 工具包执行操作任务
使用设备对象方法执行 RPC 和操作命令
NETCONF Java 工具包 Device
对象具有向远程设备请求信息和执行操作任务的方法。在适当时,方法将过载,以采用大量不同格式。
执行 RPC
要执行远程过程调用 (RPC),请对 executeRPC()
对象调用 Device
方法。 executeRPC()
该方法已过载,接受对象、对象 String
net.juniper.netconf.XML
或 org.w3c.dom.Document
对象作为参数。RPC 由 NETCONF 服务器处理,该服务器将 RPC 回复作为 XML 对象返回。
方法语法为:
public XML executeRPC (String rpcContent) public XML executeRPC (net.juniper.netconf.XML rpc) public XML executeRPC (org.w3c.dom.Document rpcDoc)
以下代码片段使用字符串Junos执行 Junos XML API get-chassis-inventory
RPC。 get-chassis-inventory
RPC 等同于 Junos OS 命令行界面 show chassis hardware
(CLI)。
Device device = new Device("10.10.1.1","admin","PaSsWoRd",null); device.connect(); try { XML rpc_reply = device.executeRPC("get-chassis-inventory"); System.out.println(rpc_reply.toString()); } catch (Exception e) { System.out.println("exception: " + e.getMessage()); // additional processing for exception } device.close();
执行操作模式命令
要执行操作模式命令,向运行 Junos OS 的设备上请求信息或在设备上执行操作任务,请对对象 runCliCommand()
调用 Device
方法。 runCliCommand()
此方法将一Junos OS操作模式命令发送到远程设备的 NETCONF 服务器。参数是表示将在命令中输入的操作模式命令的Junos OS CLI。RPC 由 NETCONF 服务器处理,然后返回 RPC 回复。从Junos OS 11.4 版开始,返回字符串与在命令中所看到的 ASCII 格式Junos OS CLI。对于运行早期版本的 Junos OS,返回字符串包含Junos XML 标记元素。
方法语法为:
public String runCLICommand (String command)
以下代码片段将 CLI 操作模式命令发送到运行以下命令的 show chassis hardware
设备的 NETCONF Junos OS:
Device device = new Device("10.10.1.1","admin","PaSsWoRd",null); device.connect(); try { cli_reply = device.runCliCommand("show chassis hardware"); System.out.println(cli_reply); } catch (Exception e) { System.out.println("exception: " + e.getMessage()); // additional processing for exception } device.close();
示例:用于执行操作请求 RPC 的 NETCONF Java 应用程序
此 NETCONF Java 工具包程序执行 RPC 从设备获取操作信息,然后打印至标准输出。此示例用作创建和执行基本 NETCONF Java 工具包程序的指令示例。
要求
NETCONF Java 工具包安装在配置管理服务器上。
客户端应用程序可以登录 NETCONF 服务器所在的设备。
NETCONF 服务器所在的设备上启用了 SSH 上的 NETCONF 服务。
概述
您可以使用 NETCONF Java 工具包从远程设备请求操作信息。以下示例说明了如何创建 NETCONF Java 工具包程序,以在运行 Junos 的设备上从 Junos XML API 执行操作Junos OS。该示例还介绍如何编译代码、执行程序以及验证结果。
配置
创建 Java 程序
逐步过程
要构建包含操作请求代码的 Java 程序文件:
为文件指定一个描述性名称。
文件名必须与类名称相同。此示例将文件和类命名为 GetChassisInventory。
包括相应的导入语句、类声明和 Java 方法的代码
main()
。import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import net.juniper.netconf.Device; import net.juniper.netconf.NetconfException; import net.juniper.netconf.XML; import org.xml.sax.SAXException; public class GetChassisInventory { public static void main(String args[]) throws NetconfException, ParserConfigurationException, SAXException, IOException { } }
在
main()
中,创建Device
对象并调用connect()
方法。这会在 SSHv2 上与 NETCONF 服务器创建默认 NETCONF 会话。您必须使用特定设备的连接和身份验证参数更新代码。
Device device = new Device("10.10.1.1", "admin", "PaSsWoRd", null); device.connect();
建立对象
Device
后,您可以在设备上执行 NETCONF 操作。有关与 NETCONF 操作对应的可用方法的完整列表,请参阅 NETCONF Java 工具包 Javadocs。调用
executeRPC()
方法,将操作 request RPC 命令作为参数。此示例使用 Junos XML API
get-chassis-inventory
RPC。在 XML 中返回的回复存储在变量rpc_reply
中。XML rpc_reply = device.executeRPC(“get-chassis-inventory”);
添加代码,对 RPC 回复采取措施。
以下代码转换 NETCONF 服务器对字符串的回复,并打印至屏幕:
System.out.println(rpc_reply.toString());
通过呼叫设备对象上的方法关闭
close()
设备和释放资源。device.close();
结果
完整计划包括:
/*GetChassisInventory*/ import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import net.juniper.netconf.Device; import net.juniper.netconf.NetconfException; import net.juniper.netconf.XML; import org.xml.sax.SAXException; public class GetChassisInventory { public static void main(String args[]) throws NetconfException, ParserConfigurationException, SAXException, IOException { Device device = new Device("10.10.1.1","admin","PaSsWoRd",null); device.connect(); XML rpc_reply = device.executeRPC("get-chassis-inventory"); System.out.println(rpc_reply.toString()); device.close(); } }
编译和运行 Java 程序
逐步过程
您需要一个 Java 编译器来编译源代码和创建可执行程序。
要编译代码,在配置管理服务器上运行程序:
编译 GetChassisInventory.java 文件。
> javac GetChassisInventory.java
执行 GetChassisInventory 计划。
> java GetChassisInventory
验证
验证程序执行
目的
验证 GetChassisInventory 程序是否正常运行。
行动
如果程序成功执行,则建立连接,并创建与指定设备的 NETCONF 会话。程序将 RPC 发送到 NETCONF 服务器,服务器会使用标记元素中随附的请求的操作信息 get-chassis-inventory
<rpc-reply>
做出响应。程序会打印标准回复。下面是示例 RPC 回复,其中省略了一些输出,简洁性。
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/11.2R1/junos"> <chassis-inventory xmlns="http://xml.juniper.net/junos/11.2R1/junos-chassis"> <chassis junos:style="inventory"> <name>Chassis</name> <serial-number>12345</serial-number> <description>M7i</description> <chassis-module> ...output omitted... </chassis> </chassis-inventory> </rpc-reply>
故障 排除
NETCONF 异常故障排除
问题
NETCONF 例外,您看到以下错误消息:
Exception in thread "main" net.juniper.netconf.NetconfException: There was a problem while connecting to 10.10.1.1:830 at net.juniper.netconf.Device.createNetconfSession(Device.java:344) at net.juniper.netconf.Device.connect(Device.java:225) at GetChassisInventory.main(GetChassisInventory.java:14)
NETCONF over SSH 的 NETCONF 可能未在 NETCONF 服务器所在的设备上启用,也可能在不同的端口上启用。
解决 方案
确保您在 NETCONF 服务器所在的设备上在 SSH 上启用了 NETCONF。由于示例程序在参数中未指定特定端口号,因此 Device
NETCONF 会话在默认 NETCONF-over-SSH 端口 830 上建立。要验证运行 SSH 的设备的默认端口上是否启用了 SSH 上的 NETCONF Junos OS,请在远程设备上输入以下操作模式命令:
user@host> show configuration system services ftp; netconf { ssh; }
如果缺少配置层次结构,在配置模式下发出以下语句以在默认端口上的 netconf
SSH 上启用 NETCONF:
[edit] user@host# set system services netconf ssh user@host# commit
如果配置层次结构指定了非默认端口的端口,在对象构造参数中包括 netconf
Device
新端口号。例如,为端口 12345 上的 SSH 上的 NETCONF 配置了以下设备:
user@host> show configuration system services netconf { ssh { port 12345; } }
要纠正连接问题,在参数中包括新端口 Device
号。
Device device = new Device("10.10.1.1", "admin", "PaSsWoRd", null, 12345);
示例:用于执行命令的 NETCONF Java CLI应用程序
此 NETCONF Java 工具包程序演示了此方法,此方法将指定的 Junos OS 操作模式命令发送到 NETCONF 服务器,向运行 Junos OS 的设备上请求信息或 runCLICommand()
执行操作Junos OS。
要求
路由、交换或运行安全Junos OS。
NETCONF Java 工具包安装在配置管理服务器上。
客户端应用程序可以登录 NETCONF 服务器所在的设备。
NETCONF 服务器所在的设备上启用了 SSH 上的 NETCONF 服务。
概述
NETCONF Java 工具包类包含方法,此方法Junos OS CLI操作模式命令并将其转换为 XML 中的等效 Device
runCliCommand()
RPC,然后由 NETCONF 服务器处理。 runCLICommand()
此方法作为参数,表示在命令中输入的操作模式命令Junos OS CLI。
以下示例在运行 Junos OS show chassis hardware
的设备上执行 命令。方法的返回值是一个字符串。从Junos OS 11.4 版开始,返回字符串与在命令中所看到的 ASCII 格式Junos OS CLI。对于运行早期版本的 Junos OS,返回字符串包含一Junos XML 标记元素。
配置
创建 Java 程序
逐步过程
要构建 Java 程序文件:
为文件指定一个描述性名称。
文件名必须与类名称相同。此示例将文件和类命名为 ExecuteCLICommand。
将代码添加到文件中并更新环境特定变量,例如远程主机 IP 地址、用户名、密码和
<rpc-reply>
标记元素。ExecuteCLICommand.java程序的完整 Java 代码在这里展示。
/*ExecuteCLICommand*/ import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import net.juniper.netconf.Device; import net.juniper.netconf.NetconfException; import net.juniper.netconf.XML; import org.xml.sax.SAXException; public class ExecuteCLICommand { public static void main(String args[]) throws NetconfException, ParserConfigurationException, SAXException, IOException { String cli = "show chassis hardware"; Device device = new Device("10.10.1.1","admin","PaSsWoRd",null); device.connect(); try { String cli_reply = device.runCliCommand(cli); System.out.println(cli_reply); } catch (Exception e) { System.out.println("exception: " + e.getMessage()); // additional processing for exception } device.close(); } }
编译和运行 Java 程序
逐步过程
您需要一个 Java 编译器来编译源代码和创建可执行程序。
要编译代码,在配置管理服务器上运行程序:
编译 ExecuteCLICommand.java 文件。
> javac ExecuteCLICommand.java
执行 ExecuteCLICommand 程序。
> java ExecuteCLICommand
验证
验证程序执行
目的
验证 ExecuteCLICommand 程序是否正确运行。
行动
如果程序成功执行,则建立连接并创建与指定设备的 NETCONF 会话。程序会将 Junos OS CLI 操作模式命令 show chassis hardware
转换为 RPC,并将 RPC 发送到 NETCONF 服务器。服务器响应标记元素中随附的所请求操作信息 程序将解析 <rpc-reply>
RPC 回复并打印生成的机箱清单。以下样本输出来自 瞻博网络 m7i 路由器。
在运行 Junos OS 11.4 或更高版本的设备上,输出采用 ASCII 格式的文本,与应用程序的输出CLI。
Hardware inventory: Item Version Part number Serial number Description Chassis 30010 M7I Midplane REV 03 710-008761 CB3874 M7i Midplane Power Supply 0 Rev 04 740-008537 PG10715 AC Power Supply Routing Engine REV 07 740-009459 1000445584 RE-5.0 CFEB REV 07 750-010464 CM4612 Internet Processor II FPC 0 E-FPC PIC 0 REV 06 750-002971 CB0032 4x OC-3 SONET, MM PIC 1 REV 02 750-002982 HS2878 1x Tunnel PIC 2 REV 08 750-005724 CL9084 2x OC-3 ATM-II IQ, MM PIC 3 REV 12 750-012838 DJ1107 4x 1GE(LAN), IQ2 Xcvr 0 REV 01 740-013111 7303405 SFP-T Xcvr 1 REV 01 740-013111 7303391 SFP-T Xcvr 2 REV 01 740-013111 7303350 SFP-T Xcvr 3 REV 01 740-013111 7303420 SFP-T FPC 1 E-FPC PIC 2 REV 07 750-009487 CL5745 ASP - Integrated (Layer-2-3) PIC 3 REV 07 750-009098 CB7256 2x F/E, 100 BASE-TX Fan Tray Rear Fan Tray
在运行 11.3 Junos OS 版本上运行的设备上,输出包含Junos XML 标记元素。
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/11.2R1/junos"> <chassis-inventory xmlns="http://xml.juniper.net/junos/11.2R1/junos-chassis"> <chassis junos:style="inventory"> <name>Chassis</name> <serial-number>30010</serial-number> <description>M7I</description> <chassis-module> <name>Midplane</name> <version>REV 03</version> <part-number>710-008761</part-number> <serial-number>CB3874</serial-number> <description>M7i Midplane</description> <model-number>CHAS-MP-M7i-1GE-S</model-number> </chassis-module> /* Output omitted for brevity */ </chassis> </chassis-inventory> </rpc-reply>
示例:用于打印组件温度的 NETCONF Java 应用程序
此 NETCONF Java 工具包程序将运行该组件的设备上组件的名称和Junos OS。
要求
路由、交换或运行安全Junos OS。
NETCONF Java 工具包安装在配置管理服务器上。
客户端应用程序可以登录 NETCONF 服务器所在的设备。
NETCONF 服务器所在的设备上启用了 SSH 上的 NETCONF 服务。
概述
以下示例将执行 Junos XML API RPC,这相当于运行 Junos OS get-environment-information
show chassis environment
的设备的操作模式Junos OS。程序将解析 RPC 回复,而对于列出温度的所有组件,程序将打印组件名称和相应的温度。
RPC 请求的 get-environment-information
RPC 回复格式为:
<rpc-reply> <environment-information> <environment-item> <name>item-name</name> ... <temperature>temperature</temperature> </environment-item> <environment-item> <name>item-name2</name> ... <temperature>temperature</temperature> </environment-item> ... </environment-information> </rpc-reply>
要解析回复,程序将使用 findNodes()
该方法返回对象 org.w3c.dom.Node
列表。对于每个 <environment-item>
节点,程序获取子节点列表。如果子节点列表中存在温度元素,程序将打印此环境项目的名称和温度。
配置
创建 Java 程序
逐步过程
要构建 Java 程序文件:
为文件指定一个描述性名称。
文件名必须与类名称相同。此示例将该文件和类命名为 ShowTemps。
将代码添加到文件中并更新环境特定变量,例如远程主机 IP 地址、用户名、密码和
<rpc-reply>
标记元素。ShowTemps.java程序的完整 Java 代码在这里展示。
import java.io.IOException; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import net.juniper.netconf.CommitException; import net.juniper.netconf.Device; import net.juniper.netconf.LoadException; import net.juniper.netconf.NetconfException; import net.juniper.netconf.XML; import net.juniper.netconf.XMLBuilder; import org.xml.sax.SAXException; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class showTemps { public static void main(String[] args) throws LoadException, IOException, NetconfException, ParserConfigurationException, SAXException { String name="", temp=""; //Create the device Device device = new Device("10.10.1.1","admin","PaSsWoRd",null); device.connect(); //Call executeRPC(String rpc) to send RPC and receive RPC reply XML rpc_reply = device.executeRPC("get-environment-information"); // Parse reply and only print items that have a temperature element List<String> list = Arrays.asList("environment-information","environment-item"); List itemlist = rpc_reply.findNodes(list); Iterator iter = itemlist.iterator(); while (iter.hasNext()) { Node item_node = (Node) iter.next(); NodeList child_nodes = item_node.getChildNodes(); // child_nodes contains nodes like <name> and <temperature> for (int i = 0; i < child_nodes.getLength(); i++) { Node child = child_nodes.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { if (child.getNodeName().equals("name")) // Capture the text value in <name> node name = child.getTextContent(); if (child.getNodeName().equals("temperature")) { // Capture the text value in <temperature> node temp = child.getTextContent(); System.out.println(name + ": " + temp); } } } } device.close(); } }
编译和运行 Java 程序
逐步过程
您需要一个 Java 编译器来编译源代码和创建可执行程序。
要编译代码,在配置管理服务器上运行程序:
编译 ShowTemps.java 文件。
> javac ShowTemps.java
执行 ShowTemps 程序。
> java ShowTemps
验证
验证结果
目的
验证 ShowTemps 程序是否正确运行。
行动
如果程序成功执行,则建立连接,并创建与指定设备的 NETCONF 会话。然后,程序执行 Junos XML API RPC、解析 RPC 回复,以及打印包含子节点 get-environment-information
的所有环境项目 <temperature>
。
以下示例输出来自 m7i 瞻博网络:
Intake: 25 degrees C / 77 degrees F FPC 0: 26 degrees C / 78 degrees F Power Supplies: 28 degrees C / 82 degrees F CFEB Intake: 22 degrees C / 71 degrees F CFEB Exhaust: 30 degrees C / 86 degrees F Routing Engine: 28 degrees C / 82 degrees F Routing Engine CPU: 28 degrees C / 82 degrees F