show_ip_route.py
#/usr/bin/env python
# -*- coding: utf-8 -*-
from onep.element import *
from onep.interfaces import *
from onep.routing import *
def getRouteList(network_element):
# 対象機器のルーティングオブジェクトを取得する
route = RoutingClass.Routing.get_instance(network_element)
# ルーティングオブジェクトからRIBを取得する
rib = route.rib
# get_route_listの引数を定義していく
# 範囲はオプションなし=IPv4のみ
scope = L3UnicastScope()
# フィルターはなし
rib_filter = L3UnicastRIBFilter()
# 引数のL3UnicastRouteRangeの引数を定義する。
# 範囲は0.0.0.0/0からスタートする
start_prefix = NetworkPrefix('0.0.0.0', 0)
# 範囲のタイプはよりイコールを含む
route_type = RouteRange.RangeType.EQUAL_OR_LARGER
# 定義した引数を利用して、RIBから取得する範囲を定義する
rib_range = L3UnicastRouteRange(start_prefix, route_type, 0)
# 定義した引数を利用してRIBからルーティングを取得する
routeList = rib.get_route_list(scope, rib_filter, rib_range)
# 取得したルーティングを戻す。
return routeList
def showIpRoute(routeList):
# owner_typeの戻り値が数字なので、ルーティングのタイプと紐づけるEnumを作る
type_enum = ('NONE', 'APP', 'CONNECTED', 'STATIC', 'BGP', 'MOBILE', 'RIP','OSPF', 'ISIS', 'EIGRP', 'IGRP2', 'OSPFV3', 'ODR', 'HSRP', 'NHRP', 'LISP','NEMO', 'ND', 'RPL', 'LOCAL', 'MAX')
# 出力の1行目
print(" {:20} {:10} {:20} {:20} ".format(
'Prefix','Category','Nexthop_Address','Outgoing_Interface'))
# 出力の2行目
print(" {:20} {:10} {:20} {:20} ".format(
'-------------------','---------',
'-------------------','-------------------'))
# ルーティングを一つずつ処理する
for route in routeList:
# ルーティングからNexthopのアドレスを取得する
next_address = list(route.next_hop_list)[0].address
# ルーティングからNexthopのインターフェースを取得する。
next_interface = list(route.next_hop_list)[0].network_interface.name
# ルーティング情報を出力する
print(" {:20} {:10} {:20} {:20} ".format(
route.prefix.address+'/'+str(route.prefix.prefix_length),
type_enum[route.owner_type],
next_address,
next_interface
))
# メイン処理
if __name__ == '__main__':
#対象機器をNetworkElementにする
network_element = NetworkElement('10.10.10.110','testapp')
# 対象機器用のSessionConfigを定義する
session_config = SessionConfig(SessionConfig.SessionTransportMode.TLS)
session_config.ca_certs = '/home/cisco/ca.pem'
try:
# 作成したNetworkElementとsession_configを利用して、対象機器に接続する
session_handle = network_element.connect('username','password',session_config)
# ルーティングリストを取得する
routeList = getRouteList(network_element)
# 取得したリストを整形して出力する
showIpRoute(routeList)
# 対象機器から切断する
network_element.disconnect()
# エラー処理(エラー処理内でもdisconnectしないと、onepのコネクションが切れない)
except Exception as e:
print( 'type:' + str(type(e)))
print( 'args:' + str(e.args))
print( 'message:' + e.message)
network_element.disconnect()