kongou-ae
4/6/2014 - 10:52 AM

show_ip_route.py

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()