본문 바로가기

프로그래밍/Python

Programmability for Networker : Part 6

 


이번 포스팅은  Python으로 만들어 보는 예제입니다.

 

제가 Test 가능한 환경이 Cisco Nexus이기 때문에  Cisco Nexus 5548 기준으로 작성된 예제입니다만,

 

기본 CLI명령을 입력하는 부분에서만 Cisco 패키지의 명령을 사용하였기 때문에 변형을 한다면,

 

다른 곳에서 충분히 활용이 가능한(?) 예제가 될 수 있을 듯 싶습니다. 

 

(물론 출력된 문자열이 Nexus 기준에서 가공하여 만든 예제라 문자열 가공을 각 상황에 맞게 일부 변형이 필요합니다)

 

IP를 입력하면, 해당 IP의 MAC주소와 VLAN, Interface, Description 정보를 한 번에 확인할 수 있는 내용입니다.

 

추후에 아래 코드는 조금씩 변형되서 업데이트 버전이 만들 계획이지만, 언제 어떻게 될지는 아직은 알 수 없습니다! ^^;

 

아래 코드는 Github에서도 함께 볼 수 있습니다. 

 

Github 에서 보기 


 

 

 ○ IP Info

 __author__ = 'Network ZIGI - Ko Jae Sung'

  # 2014.07.19. First Version
  #
  # ================================================
  #      IP Info : NetworkZIGI   2014.07.19
  #================================================
  #IP-Address      : 10.0.0.1
  #Mac-Address     : 0012.3456.abcd
  #Vlan            : 11
  #Interface       : Eth14/2
  #Description     : NetworkZIGI Blog Server
  #
  # Blog : http://ThePlmingspace.tistory.com
  #
  # Tested : Cisco Nexus 5548  : 6.0(2)N2(4)

 

  import argparse
  import sys
  import cisco

  IP = 'IP-Address'
  MAC = 'Mac-Address'
  Vlan = 'Vlan'
  Int = 'Interface'
  Desc = 'Description'

  
  IP_info = {IP:'None', MAC:'None', Vlan:'None', Int:'None', Desc:'None'}    # IP정보를 저장할 Dict type 변수

 

  # ARP 정보를 가져오는 메서드

  def get_ARP_Table(ipaddr):
      arpCmd = 'sh ip arp ' + ipaddr
      arpCmdResult = cisco.CLI(arpCmd, False)
      arpCmdResultList = arpCmdResult.get_output()
      for arp in arpCmdResultList:
          if (-1<arp.find(args.ip)):
              return arp
      else:
          print ' %s : Not found IP Address Infomation' % args.ip
          sys.exit()

 

  # IP와 MAC, VLAN 정보를 가져오는 메서드

  def get_IP_MAC_info(info):
      info_list = info.split()
      IP_info[IP] = info_list[0]
      IP_info[MAC] = info_list[2]
      IP_info[Vlan] = info_list[3][4:]

 

  # Interface 정보를 가져오는 메서드

  def get_Interface_info():
      macCmd = 'sh mac address-table addr ' + IP_info[MAC]
      macCmdResult = cisco.CLI(macCmd, False)
      macCmdResultList = macCmdResult.get_output()
      if (len(macCmdResultList) > 6):                                                
          IP_info[Int] = macCmdResultList[5][58:]
          get_Description_info(IP_info[Int])

 

  # Description 정보를 가져오는 메서드

  def get_Description_info(iInfo):
      if(iInfo.find('Eth') == 0 or iInfo.find('Po')==0): 

          intCmd = 'sh int desc | inc ' + iInfo
          intCmdResult = cisco.CLI(intCmd, False)
          intCmdResultList = intCmdResult.get_output()
          IP_info[Desc] = intCmdResultList[0][25:]

 

  # IP 정보 출력

  def show_IP_info():
      print '================================================'
      print '             IP Info : NetworkZIGI              '
      print '================================================'
      print '%-15s : %s' % (IP,IP_info[IP])
      print '%-15s : %s' % (MAC,IP_info[MAC])
      print '%-15s : %s' % (Vlan, IP_info[Vlan])
      print '%-15s : %s' % (Int, IP_info[Int])
      print '%-15s : %s' % (Desc,IP_info[Desc])

 

  # 프로그램 시작 지점

  parser = argparse.ArgumentParser('Args',description='Args Desc')
  parser.add_argument('ip')
  args = parser.parse_args()

  iparp = get_ARP_Table(args.ip)
  get_IP_MAC_info(iparp)
  get_Interface_info()
  show_IP_info()

 

 

 ○ IP Info : 결과

NX-OS# python ipinfo.py 10.10.10.11
================================================
      IP Info : NetworkZIGI   2014.07.19       
================================================
IP-Address                                : 10.10.10.11
Mac-Address                           : 0012.3456.789A
Vlan                                           : 20
Interface                                  : E12/3
Description                              : NetworkZIGI Blog Web Server