CLIを解析#
IOS-XR#
IOS XRのshow inventoryコマンドの出力は、以下のような形式で表示されます。
NAME: "Chassis", DESCR: "ASR9K Chassis"
PID: ASR-9006-AC , VID: V01, SN: FOX1846GJLB
NAME: "module 0/RSP0/CPU0", DESCR: "ASR9K Route Switch Processor"
PID: A9K-RSP880-SE , VID: V01, SN: FOX18444LZB
NAME: "module 0/0", DESCR: "ASR9K 4x10GE SPA, OTN License"
PID: A9K-40GE-L , VID: V03, SN: FOX1748G61A
NAME: "module 0/1", DESCR: "ASR9K 4x10GE SPA, OTN License"
PID: A9K-40GE-L , VID: V03, SN: FOX1748G60P
NAME: "module mau 0/2", DESCR: "10GBASE-SR SFP+ Transceiver Module"
PID: SFP-10G-SR , VID: V03, SN: FNS18090V2Q
NAME: "module mau 0/3", DESCR: "10GBASE-SR SFP+ Transceiver Module"
PID: SFP-10G-SR , VID: V03, SN: FNS181205YR
この出力をPythonで解析するために、正規表現を使用してパターンにマッチする行を抽出し、辞書に変換することができます。以下は、パターンに基づいて出力を解析して、辞書に格納するサンプルコードです。
import re
def parse_inventory(output):
inventory = {}
pattern = re.compile(r'^NAME:\s+"(?P<name>.*)",\s+DESCR:\s+"(?P<description>.*)"')
for line in output.splitlines():
match = pattern.match(line)
if match:
device = match.groupdict()
pid_line = next(filter(lambda x: x.startswith('PID:'), output.splitlines()), None)
if pid_line:
device['pid'] = pid_line.split(':', 1)[1].strip()
vid_line = next(filter(lambda x: x.startswith('VID:'), output.splitlines()), None)
if vid_line:
device['vid'] = vid_line.split(':', 1)[1].strip()
sn_line = next(filter(lambda x: x.startswith('SN:'), output.splitlines()), None)
if sn_line:
device['sn'] = sn_line.split(':', 1)[1].strip()
inventory[device['name']] = device
return inventory
このコードでは、正規表現パターンを定義し、各行をマッチングします。 マッチした行から必要な情報を抽出して辞書に格納し、最終的に辞書を返します。この例では、各デバイスの名称、説明、PID、VID、SNを辞書に格納しています。
辞書をCSVファイルに書き込むには、Pythonのcsvモジュールを使用します。以下は、先程作成した辞書をCSVファイルに書き込むサンプルコードです。
import csv
def write_to_csv(inventory_dict, output_file):
with open(output_file, mode='w', newline='') as file:
writer = csv.writer(file)
# CSVファイルのヘッダを書き込みます
writer.writerow(['Name', 'Description', 'PID', 'VID', 'SN'])
# 辞書の各要素をCSVファイルに書き込みます
for device in inventory_dict.values():
writer.writerow([device.get('name', ''),
device.get('description', ''),
device.get('pid', ''),
device.get('vid', ''),
device.get('sn', '')])
このコードでは、CSVファイルを作成し、csv.writerオブジェクトを取得しています。CSVファイルのヘッダを書き込み、辞書の各要素をCSVファイルに書き込んでいます。各要素は、リストとしてwriterow()メソッドに渡され、自動的にCSVファイルの1行に書き込まれます。最後に、CSVファイルを閉じます。
使用例:
inventory = {'Chassis': {'name': 'Chassis', 'description': 'ASR9K Chassis', 'pid': 'ASR-9006-AC', 'vid': 'V01', 'sn': 'FOX1846GJLB'},
'module 0/RSP0/CPU0': {'name': 'module 0/RSP0/CPU0', 'description': 'ASR9K Route Switch Processor', 'pid': 'A9K-RSP880-SE', 'vid': 'V01', 'sn': 'FOX18444LZB'},
'module 0/0': {'name': 'module 0/0', 'description': 'ASR9K 4x10GE SPA, OTN License', 'pid': 'A9K-40GE-L', 'vid': 'V03', 'sn': 'FOX1748G61A'},
'module 0/1': {'name': 'module 0/1', 'description': 'ASR9K 4x10GE SPA, OTN License', 'pid': 'A9K-40GE-L', 'vid': 'V03', 'sn': 'FOX1748G60P'},
'module mau 0/2': {'name': 'module mau 0/2', 'description': '10GBASE-SR SFP+ Transceiver Module', 'pid': 'SFP-10G-SR', 'vid': 'V03', 'sn': 'FNS18090V2Q'},
'module mau 0/3': {'name': 'module mau 0/3', 'description': '10GBASE-SR SFP+ Transceiver Module', 'pid': 'SFP-10G-SR', 'vid': 'V03', 'sn': 'FNS181205YR'}}
write_to_csv(inventory, 'inventory.csv')