이번 포스팅은 실제 Python 예제를 통해서 보려고 합니다.
코드에 대한 상세 내용은 내용은 추가적인 포스팅으로 예제들과 함께 다뤄질 예정입니다.
이번 포스팅은 '이런 것도 할 수 있구나?'
정도의 느낌의 포스팅이라고 보시면 좋을 듯 싶습니다.
이번 포스팅에 사용된 예제는 github.com에서 보실 수 있습니다.
[ 예제 링크 ] https://github.com/datacenter/who-moved-my-cli
우선 예제를 보기 전에 몇 가지 정리를 해봅니다.
※ 본 내용의 진행은 Nexus 5548 6.0(2)N2(4) 기준입니다.
○ Python Script
•Python Script는 NX-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 |
○ 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 |