1

处理思科设备 show inventory输出内容

任务目标

通过Python读取show inventory的内容,并将设备的槽位、模块型号和序列号自动写入CVS文件。否则,我需要打开每一个文件,找到设备每一个槽位、母卡、子卡和序列号,并一一填写到表格中。操作繁琐且重复,因此考虑用Python实现。

show inventory 输出内容示例

RP/0/RP0/CPU0:crs-1#admin show inventory 
Thu Jul XX 16:08:46.990 GMT
NAME: "0/1/*", DESCR: "Cisco CRS Series Modular Services Card 400G"
PID: CRS-MSC-X, VID: V03, SN: CAT20XXXX0J

NAME: "ControlEthernet0/1/CPU0", DESCR: "CPU_PORT_0"
PID:    , VID: N/A, SN: 

NAME: "0/PL1/*", DESCR: "Cisco CRS Series 4x100GbE Interface Module"
PID: 4X100GE-LO, VID: V01, SN: CATXXXXT00W

NAME: "HundredGigE0/1/0/0", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4  , VID: V04, SN: FBNXXXX0141

NAME: "HundredGigE0/1/0/1", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4  , VID: V04, SN: FBNXXXX0582

NAME: "HundredGigE0/1/0/2", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4  , VID: V04, SN: FBNXXXX0546

NAME: "HundredGigE0/1/0/3", DESCR: "100GBASE-LR4"
PID: CPAK-100G-LR4  , VID: V04, SN: FBNXXXX0340

NAME: "0/4/*", DESCR: "Cisco CRS-1 Series Modular Services Card revision B"
PID: CRS-MSC-B, VID: V07, SN: SADXXXX020C

NAME: "ControlEthernet0/4/SP", DESCR: "CPU_PORT_0"
PID:    , VID: N/A, SN: 

NAME: "ControlEthernet0/4/CPU0", DESCR: "CPU_PORT_1"
PID:    , VID: N/A, SN: 

NAME: "0/PL4/*", DESCR: "Cisco Carrier Routing System SPA Interface Processor Card"
PID: CRS1-SIP-800, VID: V04, SN: SALXXXXGX57

NAME: "0/4/0", DESCR: "1-port OC192/STM64 POS/RPR XFP Optics"
PID: SPA-OC192POS-XFP, VID: V05, SN: SALXXXXFAN0

Python代码的实现

# 引入re、csv模块
import re
import csv

# 将待处理的文件读入data_buff。
with open(inventory) as file_obj:
data_buff = file_obj.read()

# 定义几个正则表达式对象如下:
mixRegex = re.compile(r'^NAME: .*\n'
r'^PID: .*SN: .*'
,re.MULTILINE)
mix_match = mixRegex.findall(data_buff)

nameRegex = re.compile('^NAME: .*,')
modRegex = re.compile('^PID: .*,',re.MULTILINE)
snRegex = re.compile('SN: .*',re.MULTILINE)

# 以上几个正则表达式的目的如下:
# mixRegex,该表达式匹配以”NAME:”开头,并且,第二行以”PID:”开头,包含”SN:”。
# 通过findall函数找到所有符合上述要求的文本内容,并赋值给mix_match,通过打印,该值是一个list,每一个匹配项作为一个列表单元。
# nameRegex、modRegex和snRegex分别在以下代码中进行过滤
# 初始化两个列表,其中一个作为子列表,最终形成一个二维列表。
slot_map = []
sub_map = []

# for循环遍历上述的查找结果mix_match;
# 通过nameRegex查找出来的内容,使用group()访问,并将”NAME: ”剥去,就变成槽位信息了。字符最后多一个”””是为了防止Excel表自动的把0/4/0改成日期。len(slot) < 10,是去除一些不需要统计的内容,如"ControlEthernet0/4/SP"。
# 通过modRegex查找出来的内容,经过处理后就变成PID信息了。
# 通过snRegex查找出来的内容,经过处理就变成SN信息了。
# 然后分别把这些信息存入list sub_map中,再存到slot_map,变为二维表。

for each_pair in mix_match:
slot = nameRegex.search(each_pair).group()[7:-1]
if len(slot) < 10:
        card = modRegex.search(each_pair).group().split(',')[0][5:].strip()
        sn = snRegex.search(each_pair).group()[4:]
        # print(sn)
        sub_map.append(slot)
        sub_map.append(card)
        sub_map.append(sn)
        slot_map.append(sub_map)
        # print(sub_map)
    sub_map = []

# 以下代码将上述生成的二维列表写入到CSV文件中。
csv_output = inventory + '-slotmap.csv'

with open(csv_output,'w') as file_obj:
    wr = csv.writer(file_obj)
    for list in slot_map:
        wr.writerow(list)

前一篇文章写了处理show ip int brief输出。


Raoweibo
17 声望1 粉丝