본문 바로가기

프로그래밍/Python

Programmability for Networker : Part 2

 

 


 

이번 포스팅은 실제 Python 예제를 통해서 보려고 합니다.

코드에 대한 상세 내용은 내용은 추가적인  포스팅으로 예제들과 함께 다뤄질 예정입니다.

이번 포스팅은 '이런 것도 할 수 있구나?'

 정도의 느낌의 포스팅이라고 보시면 좋을 듯 싶습니다.

이번 포스팅에 사용된 예제는 github.com에서 보실 수 있습니다.

 

[ 예제 링크 ] https://github.com/datacenter/who-moved-my-cli

 

우선 예제를 보기 전에 몇 가지 정리를 해봅니다.

 

※ 본 내용의 진행은 Nexus 5548 6.0(2)N2(4) 기준입니다.

 

 

 


 

Python Script

    •Python ScriptNX-OS의 기본적으로 bootflash://’ 에서 실행된다.

 

   NX-OS# dir

    …

        Mar 10 07:38:37 2009  pingrange.py

    ...

   NS-OS#

 

    기본 CLI Mode에서의 Python Script 실행 시에는 python 키워드를 사용하여 아래와 같이 실행 할 수 있다.

                 NX-OS# python pythonFileName.py { args,.. }

 


 

 

pingragne.

 

    •pIng을 확인할 때, '-'를 사용하여 range를 주어서 확인이 필요한 IP대역에 대해서 확인을 할 수 있다.

    •range는 각 옥텟별로 구성이 가능하다.

             Ex) 1.1.1-2.3-4       : 3번째 옥텍에서 1과 2에 대해서 각각 4번째 옥텟의 3,4번 IP에 대해서 Ping Check.

                                               즉, 1.1.1.3 / 1.1.1.4 / 1.1.2.3 / 1.1.2.4 에 대해서 확인

 

pingrange.py

import re

from cisco import cli

from argparse import ArgumentParser

def expandrange(rangefunc):

    hosts = []

    octets = rangefunc.split('.')

    for i,octet in enumerate(octets):

        if '-' in octet:

            octetrange = octet.split('-')

            for digit in range(int(octetrange[0]), int(octetrange[1])+1):

                ip = '.'.join(octets[:i] + [str(digit)] + octets[i+1:])

                hosts += expandrange(ip)

            break

    else:

        hosts.append(rangefunc)

    return hosts

 

parser = ArgumentParser('pingrange')

parser.add_argument('ip', help='IP range to ping, e.g., 10.1.0-1.0-255 will expand to 10.1.0.0/23')

parser.add_argument('options', nargs='*', help='Options to pass to ping', default=['count 1'])

args = parser.parse_args()

targets = expandrange(args.ip)

for ip in targets:

    tupleping  = cli('ping %s %s' % (ip, ' '.join(args.options)))

    strping = str(tupleping)

    m = re.search('([0-9\.]+)% packet loss',strping )

    print('%s - %s' % (ip, 'UP' if float(m.group(1)) == 0.0 else 'DOWN'))

 

 

pingrange.py 실행결과

NX-OS# python pingrange.py 10.1.1-2.1-3

   10.1.1.1 – UP

   10.1.1.2 – UP

   10.1.1.3 – DOWN

   10.1.2.1 – UP

   10.1.2.2 – UP

   10.1.2.3 – DOWN
NX-OS#

 

 


 

pingrange 이해하기 위한 기반 내용들을 하나씩 볼 예정이며, 이번 내용에서 몇 가지만 살펴보게 됩니다.

    Data type과 제어문에 반복문에 대한 부분은 기존 제 포스팅을 참조하셔도 됩니다.


 

 

○ 패키지 Import

     import 패키지명

         - 모듈 이름으로 Import하며, 사용 시에는 패키지명.멤버메서드명 으로 사용한다.

     from 패키지명 import 멤버

         - 실제 사용하고자 하는 멤버를 Import하며, 해당 멤버가 포함된 패키지도 함께 from 키워드로 지정해준다.

         - 즉 어떤 패키지로부터(from), 사용하고자 하는 멤버를 가져온다(import) 의미로 보며,

           실제 사용 시에는 멤버명으로 바로 사용 한다.

○ 패키지를 Import 시에는 해당 패키지의 멤버를 가져올 수도 있지만, 해당 패키지의 일반 명령어 라인도 함께 실행하게 된다.

    따라서, Import하여 사용하게 될 경우에 의도하지 않은 일반 명령어 라인을 실행하지 않게 하기 위해서는 일반 명령어를

    [ if __name__ == ‘__main__’ : ] 조건 내부에 넣는다.

    그렇게 되면, 해당 패키지는 독립적으로 실행하는 경우에는 해당 일반 명령어 라인으로 실행하고 Import 시에는 조건이 맞지

    않으므로 일반 명령어 부분은 실행되지 않는다.

      ※ 범위 / Scope에 대한 부분은 기존 Python 포스팅을 화면하면 됩니다. 코드상으로 볼 때 동일한 들여쓰기를 한 구간이

          하나의 범위가 되게 됩니다. 세부적인 부분일 수록 들여쓰기가 많아지며, 들여쓰기가 적은 부분은 그 하위 들여쓰기한 부분의

          범위를 포함하게 됩니다.

 

File

npy2.py

npy1.py - 1

npy1.py -2

Source

def sum(a,b):

    return a+b

if __name__ == "__main__":

    print "Non-Import Auto Run"

else:

    print "Import Auto Run"

 

import npy2

print "10 + 20 = %d " % npy2.sum(10,20)

 

from npy2 import sum

print "10 + 20 = %d " % sum(10,20)

 

결과값

Non-Import Auto Run

Import Auto Run

10 + 20 = 30

Import Auto Run

10+20=30