TextFSM 및 itertools를 사용하여 NEC IX2105 일반 판정에 필요한 값을 가져옴
개시하다
며칠 전에 참가한 인터넷 프로그래밍 학습회에서
Ansible과 TextFSM 조합이 show 명령의 값을 얻었다는 말을 들은 계기.
수많은 NW 기기를 한 명씩 확인하는 Operation log
기계의 이상을 발견하는 것은 매우 어려운 일이다
Pythhon3에서 TextFSM과itertools를 사용하면 NEC IX2105 정상 판정에 필요한 값만 좋은 느낌으로 얻을 수 있습니다.
참고 자료
참고TextFSM을 사용하여 시스템 라우터의 모델 및 시퀀스를 추출하는 방법
http://kooshin.hateblo.jp/entry/2017/11/28/000800
참고Show 명령 결과를 지우는 다양한 방법#npsstudy
https://www.slideshare.net/akira6592/npstudy18-command-parser
IX2105용 템플릿을 만들어 봤어요.
시스코의 템플릿을 참고해 IX용 템플릿을 만들어 시행해보니 쉽게 가치를 얻었다.
템플릿은 다음과 같습니다.
IX2105_tmp.txtValue VERSION (.+?)
Value SYSTEM_START_TIME (.*)
Value VERSION_FILE (.*)
Value VERSION_FILE2 (.*)
Value SN (.*)
Value LINK_STATUS0 (\w+)
Value LINK_STATUS1 (\w+)
Value PORT_STATUS1 (\w+)
Value PORT_STATUS2 (\w+)
Value PORT_STATUS3 (\w+)
Value PORT_STATUS4 (\w+)
Value STATUS_1V (.*)
Value STATUS_1_8V (.*)
Value STATUS_2_5V (.*)
Value STATUS_3_3V (.*)
Value STATUS_5V (.*)
Value TEMPERTURE_STATUS (.*)
Start
^.*Software,\s+Version\s+${VERSION},\s+MAINTENANCE\s+RELEASE\s+SOFTWARE
^.*System\s+started\s+at\s+${SYSTEM_START_TIME}
^.*System\s+image\s+file\s+is\s+"+${VERSION_FILE}"
^.*S/N:\s+${SN}
^.*1.0\s+volt\s+line\s+${STATUS_1V}
^.*1.8\s+volt\s+line\s+${STATUS_1_8V}
^.*2.5\s+volt\s+line\s+${STATUS_2_5V}
^.*3.3\s+volt\s+line\s+${STATUS_3_3V}
^.*5.0\s+volt\s+line\s+${STATUS_5V}
^.*Internal\s+temperature\s+measured\s+${TEMPERTURE_STATUS}
^.*Interface\s+GigaEthernet0.0\s+is\s+${LINK_STATUS0}
^.*Interface\s+GigaEthernet1.0\s+is\s+${LINK_STATUS1}
^.*Port\s+1\s+status\s+is\s+${PORT_STATUS1}
^.*Port\s+2\s+status\s+is\s+${PORT_STATUS2}
^.*Port\s+3\s+status\s+is\s+${PORT_STATUS3}
^.*Port\s+4\s+status\s+is\s+${PORT_STATUS4}
^.*\s+\s+\s+\s+${VERSION_FILE2}\s+\s+\s+\s+\s+\s+\s+\s+MA
외관 모방을 통해 템플릿을 만들 수 있어 실제 가치를 얻을 수 있다면 기쁘다.
실제 얻은 값은 다음과 같다.
①기계의 uptime
② Version
③ Serial Number
④ IF의 링크 상태
⑤ show env의 값
당분간 ③에 대한 S/N 값은 빼지 않은 것처럼 보이지만 일부러 마스크를 착용하고 있다.
TextFSM 및 itertools 조합 사용
지정된 디렉토리에 여러 Operation log가 있는 경우 연속적으로 값을 가져올 수 있습니다.
다음 파이썬 코드의 내용은 이런 느낌입니다.
- 장서 itertools 사용, Operation log
"show tech"명령의 값만,test.txt에 저장
-2. test.TextFSM의 IX를 템플릿(IX2105 tmp.txt)으로 txt 읽기
- 가져온 값을 CSV에 저장import textfsm,pprint,itertools,os,csv
datafolder = directory ### opelogがあるDirectoryを指定
textfms = "IX2105_tmp.txt" ### 上記のテンプレートを指定
testfile = "test.txt" ### opelogから”show tech”の値を貼り付けるテキストファイル名
csvfile = "inventory.csv" ### 取得した値を貼り付けるcsvファイル名
files=os.listdir(datafolder) ### 指定したDirectoryのopelog情報を取得
count=0
if files != []:
while count < len(files):
data=datafolder+files[count]
with open(data) as f_in:
lines = [line for line in f_in]
for i in lines:
if "show tech-support" in i:
startpoint=lines.index(i)
for i2 in lines:
if "(config)# " in i2:
if lines.index(i2) > startpoint:
endpoint=lines.index(i2)
if startpoint != [] and endpoint != []:
with open(data) as f:
user_list=[line for line in itertools.islice(f, startpoint, endpoint)]
p=open(testfile, 'w')
p.write(pprint.pformat(user_list))
p.close()
with open(testfile) as f:
inventory_text=f.read()
with open(textfms) as f:
table=textfsm.TextFSM(f)
result=table.ParseText(inventory_text)
pprint.pprint(result)
with open(csvfile, 'w', newline='') as f:
w=csv.writer(f)
w.writerow(table.header)
w.writerows(result)
count=count+1
else:
count=count+1
else:
print("done")
얻은 값은 CSV에 저장되어 장치의 직렬, Version, 정상(IF의 링크 상태, 전원 주위의 상태 등)을 증거로 남긴다.
그리고 함수 등의 구조를 통해 얻은 값이 이상 상태인지 아닌지를 판단할 수 있다.
Reference
이 문제에 관하여(TextFSM 및 itertools를 사용하여 NEC IX2105 일반 판정에 필요한 값을 가져옴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shom_Roba/items/48b8f4edee040819608a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
참고TextFSM을 사용하여 시스템 라우터의 모델 및 시퀀스를 추출하는 방법
http://kooshin.hateblo.jp/entry/2017/11/28/000800
참고Show 명령 결과를 지우는 다양한 방법#npsstudy
https://www.slideshare.net/akira6592/npstudy18-command-parser
IX2105용 템플릿을 만들어 봤어요.
시스코의 템플릿을 참고해 IX용 템플릿을 만들어 시행해보니 쉽게 가치를 얻었다.
템플릿은 다음과 같습니다.
IX2105_tmp.txtValue VERSION (.+?)
Value SYSTEM_START_TIME (.*)
Value VERSION_FILE (.*)
Value VERSION_FILE2 (.*)
Value SN (.*)
Value LINK_STATUS0 (\w+)
Value LINK_STATUS1 (\w+)
Value PORT_STATUS1 (\w+)
Value PORT_STATUS2 (\w+)
Value PORT_STATUS3 (\w+)
Value PORT_STATUS4 (\w+)
Value STATUS_1V (.*)
Value STATUS_1_8V (.*)
Value STATUS_2_5V (.*)
Value STATUS_3_3V (.*)
Value STATUS_5V (.*)
Value TEMPERTURE_STATUS (.*)
Start
^.*Software,\s+Version\s+${VERSION},\s+MAINTENANCE\s+RELEASE\s+SOFTWARE
^.*System\s+started\s+at\s+${SYSTEM_START_TIME}
^.*System\s+image\s+file\s+is\s+"+${VERSION_FILE}"
^.*S/N:\s+${SN}
^.*1.0\s+volt\s+line\s+${STATUS_1V}
^.*1.8\s+volt\s+line\s+${STATUS_1_8V}
^.*2.5\s+volt\s+line\s+${STATUS_2_5V}
^.*3.3\s+volt\s+line\s+${STATUS_3_3V}
^.*5.0\s+volt\s+line\s+${STATUS_5V}
^.*Internal\s+temperature\s+measured\s+${TEMPERTURE_STATUS}
^.*Interface\s+GigaEthernet0.0\s+is\s+${LINK_STATUS0}
^.*Interface\s+GigaEthernet1.0\s+is\s+${LINK_STATUS1}
^.*Port\s+1\s+status\s+is\s+${PORT_STATUS1}
^.*Port\s+2\s+status\s+is\s+${PORT_STATUS2}
^.*Port\s+3\s+status\s+is\s+${PORT_STATUS3}
^.*Port\s+4\s+status\s+is\s+${PORT_STATUS4}
^.*\s+\s+\s+\s+${VERSION_FILE2}\s+\s+\s+\s+\s+\s+\s+\s+MA
외관 모방을 통해 템플릿을 만들 수 있어 실제 가치를 얻을 수 있다면 기쁘다.
실제 얻은 값은 다음과 같다.
①기계의 uptime
② Version
③ Serial Number
④ IF의 링크 상태
⑤ show env의 값
당분간 ③에 대한 S/N 값은 빼지 않은 것처럼 보이지만 일부러 마스크를 착용하고 있다.
TextFSM 및 itertools 조합 사용
지정된 디렉토리에 여러 Operation log가 있는 경우 연속적으로 값을 가져올 수 있습니다.
다음 파이썬 코드의 내용은 이런 느낌입니다.
- 장서 itertools 사용, Operation log
"show tech"명령의 값만,test.txt에 저장
-2. test.TextFSM의 IX를 템플릿(IX2105 tmp.txt)으로 txt 읽기
- 가져온 값을 CSV에 저장import textfsm,pprint,itertools,os,csv
datafolder = directory ### opelogがあるDirectoryを指定
textfms = "IX2105_tmp.txt" ### 上記のテンプレートを指定
testfile = "test.txt" ### opelogから”show tech”の値を貼り付けるテキストファイル名
csvfile = "inventory.csv" ### 取得した値を貼り付けるcsvファイル名
files=os.listdir(datafolder) ### 指定したDirectoryのopelog情報を取得
count=0
if files != []:
while count < len(files):
data=datafolder+files[count]
with open(data) as f_in:
lines = [line for line in f_in]
for i in lines:
if "show tech-support" in i:
startpoint=lines.index(i)
for i2 in lines:
if "(config)# " in i2:
if lines.index(i2) > startpoint:
endpoint=lines.index(i2)
if startpoint != [] and endpoint != []:
with open(data) as f:
user_list=[line for line in itertools.islice(f, startpoint, endpoint)]
p=open(testfile, 'w')
p.write(pprint.pformat(user_list))
p.close()
with open(testfile) as f:
inventory_text=f.read()
with open(textfms) as f:
table=textfsm.TextFSM(f)
result=table.ParseText(inventory_text)
pprint.pprint(result)
with open(csvfile, 'w', newline='') as f:
w=csv.writer(f)
w.writerow(table.header)
w.writerows(result)
count=count+1
else:
count=count+1
else:
print("done")
얻은 값은 CSV에 저장되어 장치의 직렬, Version, 정상(IF의 링크 상태, 전원 주위의 상태 등)을 증거로 남긴다.
그리고 함수 등의 구조를 통해 얻은 값이 이상 상태인지 아닌지를 판단할 수 있다.
Reference
이 문제에 관하여(TextFSM 및 itertools를 사용하여 NEC IX2105 일반 판정에 필요한 값을 가져옴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shom_Roba/items/48b8f4edee040819608a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Value VERSION (.+?)
Value SYSTEM_START_TIME (.*)
Value VERSION_FILE (.*)
Value VERSION_FILE2 (.*)
Value SN (.*)
Value LINK_STATUS0 (\w+)
Value LINK_STATUS1 (\w+)
Value PORT_STATUS1 (\w+)
Value PORT_STATUS2 (\w+)
Value PORT_STATUS3 (\w+)
Value PORT_STATUS4 (\w+)
Value STATUS_1V (.*)
Value STATUS_1_8V (.*)
Value STATUS_2_5V (.*)
Value STATUS_3_3V (.*)
Value STATUS_5V (.*)
Value TEMPERTURE_STATUS (.*)
Start
^.*Software,\s+Version\s+${VERSION},\s+MAINTENANCE\s+RELEASE\s+SOFTWARE
^.*System\s+started\s+at\s+${SYSTEM_START_TIME}
^.*System\s+image\s+file\s+is\s+"+${VERSION_FILE}"
^.*S/N:\s+${SN}
^.*1.0\s+volt\s+line\s+${STATUS_1V}
^.*1.8\s+volt\s+line\s+${STATUS_1_8V}
^.*2.5\s+volt\s+line\s+${STATUS_2_5V}
^.*3.3\s+volt\s+line\s+${STATUS_3_3V}
^.*5.0\s+volt\s+line\s+${STATUS_5V}
^.*Internal\s+temperature\s+measured\s+${TEMPERTURE_STATUS}
^.*Interface\s+GigaEthernet0.0\s+is\s+${LINK_STATUS0}
^.*Interface\s+GigaEthernet1.0\s+is\s+${LINK_STATUS1}
^.*Port\s+1\s+status\s+is\s+${PORT_STATUS1}
^.*Port\s+2\s+status\s+is\s+${PORT_STATUS2}
^.*Port\s+3\s+status\s+is\s+${PORT_STATUS3}
^.*Port\s+4\s+status\s+is\s+${PORT_STATUS4}
^.*\s+\s+\s+\s+${VERSION_FILE2}\s+\s+\s+\s+\s+\s+\s+\s+MA
지정된 디렉토리에 여러 Operation log가 있는 경우 연속적으로 값을 가져올 수 있습니다.
다음 파이썬 코드의 내용은 이런 느낌입니다.
- 장서 itertools 사용, Operation log
"show tech"명령의 값만,test.txt에 저장
-2. test.TextFSM의 IX를 템플릿(IX2105 tmp.txt)으로 txt 읽기
- 가져온 값을 CSV에 저장
import textfsm,pprint,itertools,os,csv
datafolder = directory ### opelogがあるDirectoryを指定
textfms = "IX2105_tmp.txt" ### 上記のテンプレートを指定
testfile = "test.txt" ### opelogから”show tech”の値を貼り付けるテキストファイル名
csvfile = "inventory.csv" ### 取得した値を貼り付けるcsvファイル名
files=os.listdir(datafolder) ### 指定したDirectoryのopelog情報を取得
count=0
if files != []:
while count < len(files):
data=datafolder+files[count]
with open(data) as f_in:
lines = [line for line in f_in]
for i in lines:
if "show tech-support" in i:
startpoint=lines.index(i)
for i2 in lines:
if "(config)# " in i2:
if lines.index(i2) > startpoint:
endpoint=lines.index(i2)
if startpoint != [] and endpoint != []:
with open(data) as f:
user_list=[line for line in itertools.islice(f, startpoint, endpoint)]
p=open(testfile, 'w')
p.write(pprint.pformat(user_list))
p.close()
with open(testfile) as f:
inventory_text=f.read()
with open(textfms) as f:
table=textfsm.TextFSM(f)
result=table.ParseText(inventory_text)
pprint.pprint(result)
with open(csvfile, 'w', newline='') as f:
w=csv.writer(f)
w.writerow(table.header)
w.writerows(result)
count=count+1
else:
count=count+1
else:
print("done")
얻은 값은 CSV에 저장되어 장치의 직렬, Version, 정상(IF의 링크 상태, 전원 주위의 상태 등)을 증거로 남긴다.그리고 함수 등의 구조를 통해 얻은 값이 이상 상태인지 아닌지를 판단할 수 있다.
Reference
이 문제에 관하여(TextFSM 및 itertools를 사용하여 NEC IX2105 일반 판정에 필요한 값을 가져옴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shom_Roba/items/48b8f4edee040819608a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)