2017-01-06 2 views
0

Мой скрипт Python завершает мой сеанс netconf перед возвратом моего запроса XML rpc. Я перехожу к нему. Мой XML rpc работает, когда я подключаюсь непосредственно к сеансу Netconf моего маршрутизатора. Может кто-нибудь, пожалуйста, помогите мне понять это? Я не хочу использовать библиотеку NCCLIENT, я бы скорее открыл сокет для API Netconf напрямую.Соединение Netconf, завершающееся скриптом Python

Router = 5.3.4 XRV 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 

Direct Connect

SSH х.х.х.х -p 830 NETCONF эхо формат

<?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>]]>]]> 

Затем вам нужно ответить с этим

<?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>]]>]]> 

Вам нужно будет отправить обратно к маршрутизатору, прежде чем перейти на ваш RPC.

Все, что сказал, я бы предложил использовать ncclient, поскольку он обрабатывает весь процесс приветствия, а также отправляет и получает RPC от вашего имени. То, что вы сейчас делаете, это просто копировать код в этой библиотеке, но не хватает большого количества синтаксиса и verificaitons, которые включает ncclient.

Смежные вопросы