2017-01-06 3 views
0

私のPythonスクリプトは、私のXML rpc要求を返す前に自分のnetconfセッションを終了しています。私のXML rpcは、ルータのNetconfセッションに直接接続すると動作します。誰かが私にこれを理解させるのを助けてくれますか? NCCLIENTライブラリを使用したくない場合は、Netconf APIへのソケットを直接オープンします。Pythonスクリプトから終了するNetconf接続

ルータ= 5.3.4のX rv のPython = 2.7

Pythonのコード:

import paramiko 
import socket 
import time 
import sys 

ROUTER_IP = 'x.x.x.x' 
USERNAME = 'adrian' 
PASSWORD = 'xxxxxx' 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(
    paramiko.AutoAddPolicy()) 


Send_XML = """ 
<?xml version="1.0" encoding="UTF-8"?> 
<rpc message-id="106" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> 
    <get-config> 
     <source> 
      <running/> 
     </source> 
     <filter> 
      <Configuration> 
       <InterfaceConfigurationTable/> 
      </Configuration> 
     </filter> 
     </get-config> 
</rpc> 
]]>]]>""" 

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
socket.connect((ROUTER_IP, 830)) 

trans = paramiko.Transport(socket) 
trans.connect(username=USERNAME, password=PASSWORD) 

# CREATE CHANNEL FOR DATA COMM 
ch = trans.open_session() 
name = ch.set_name('netconf') 

# Invoke NETCONF 
ch.invoke_subsystem('netconf echo format') 

# SEND COMMAND 
ch.send(Send_XML) 

# Recieve data returned 
data = ch.recv(2048) 
while data: 
    data = ch.recv(1024) 
    print data, 
    if data.find('</rpc-reply>') == 0: 
     # We have reached the end of reply 
     print "END!!" 
     break 

ch.close() 
trans.close() 
socket.close() 

出力

C:\Python27\python.exe "C:/Users/adrian/OneDrive/Python/DevNet/XR NCClient.py" 
g/Cisco-IOS-XR-ha-eem-cfg?module=Cisco-IOS-XR-ha-eem-cfg&amp;revision=2013-07-22</capability> 
    <capability>http://cisco.com/ns/yang/Cisco-IOS-XR-ha-eem-oper? 
. 
. 
. 
    <capability>urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&amp;revision=2013-07-15</capability> 
</capabilities> 
<session-id>21415</session-id> 
</hello> 
]]>]]> 

Process finished with exit code 0 

ダイレクトコネクト

SSH x.x.x.x -p 830 NETCONFエコー形式のPythonスクリプトからの出力に基づいて

<?xml version="1.0" encoding="UTF-8"?> 
<rpc message-id="106" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> 
    <get-config> 
     <source> 
      <running/> 
     </source> 
     <filter> 
      <Configuration> 
       <InterfaceConfigurationTable/> 
      </Configuration> 
     </filter> 
     </get-config> 
</rpc> 

]]>]]> 
<?xml version="1.0" encoding="UTF-8"?> 
<rpc-reply message-id="106" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> 
    <data> 
     <Configuration> 
      <InterfaceConfigurationTable MajorVersion="5" MinorVersion="4"> 
       <InterfaceConfiguration> 
        <Naming> 
. 
. 
. 

      </InterfaceConfigurationTable> 
     </Configuration> 
    </data> 
</rpc-reply> 
]]>]]> 

答えて

1

は、ルータを使用すると、RPCを送信しているときに、プロセスを完了しようとしています。たとえば、セッションの開始はSSHのようになります。

$ ssh [email protected] -p 830 -s netconf 
[email protected]'s password: 

ルータはこれを送信します。

<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> 
<capabilities> 
    <capability>urn:ietf:params:netconf:base:1.1</capability> 
    <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability> 
    <capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring</capability> 
    <capability>urn:ietf:params:xml:ns:yang:ietf-interfaces</capability> 
    [output omitted and edited for clarity] 
</capabilities> 
<session-id>19150</session-id></hello>]]>]]> 

次に、あなたはあなたがあなたのRPC上に移動する前に、ルータに背中を送信する必要があります。この

<?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> 
</capabilities> 
    </hello>]]>]]> 

で応答する必要があります。

ncclientはhelloプロセス全体を処理するだけでなく、あなたの代わりにRPCを送信して受信することを強くお勧めします。現在のところ、そのライブラリのコードを複製するだけですが、ncclientに含まれる多くの構文と検証がありません。

関連する問題