代码拉取完成,页面将自动刷新
#!/usr/bin/python3
import threading
import time
import os
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border, Side
from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from netmiko.ssh_exception import AuthenticationException
from paramiko.ssh_exception import SSHException
import json
'''
0.1 多线程并发查询华三交换version,并写入同一表格内。
0.2 加入电源和风扇的参数。
0.3 计划使用字典传递命令和存储结果的列表清单。
完成电源、风扇、cpu、内存的表单创建。
复制并匹配异常处理函数。
'''
os.chdir(os.path.dirname(__file__)) #将当前py文件路径设置为工作路径。
wb=Workbook()
filetime=time.strftime('%Y-%m-%d_%H-%M-%S') #以开始时间作为表格文件名;
issue_device = []
# 定义表格样式:
yellowFill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
RedFill = PatternFill(start_color='FF0000', end_color='9AFE2E', fill_type='solid')
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
def getDevList(FilePath): # 获取设备列表。输入文件路径,返回设备列表devList;
f=open(FilePath)
devList=[]
for line in f.readlines():
fLine=line.strip()
sw={
'device_type': fLine.split('---')[5],
'ip': fLine.split('---')[2],
'username': fLine.split('---')[3],
'password': fLine.split('---')[4],
'SNum': fLine.split('---')[0],
'DevName': fLine.split('---')[1]
}
devList.append(sw)
f.close
return devList
def write_issue_device(issue_device): #保存巡检的异常登录信息;
config_path = "巡检设备异常记录"
verify_path = os.path.exists(config_path) #如果目录不存在,就创建一个。
if not verify_path:
os.makedirs(config_path)
config_filename = config_path+"/"+'issue_'+filetime+'.txt'
if len(issue_device) != 0:
with open (config_filename, "w", encoding='utf-8') as issue_facts:
issue_facts.write('\n'.join(issue_device))
def GetDevInfo(devList, ComOutDict): # 巡检获取信息。传递设备列表,"命令:输出"的字典;返回设备信息;
SW2={
'device_type': devList['device_type'],
'ip': devList['ip'],
'username': devList['username'],
'password': devList['password']
}
try:
#使用netmiko连接设备,并输出设备巡检信息:
connect = ConnectHandler(**SW2)
print('成功连接到设备 '+SW2['ip'])
for key in ComOutDict:
version = connect.send_command(key, use_textfsm=True) #从字典中获取“命令”;
DevOutList=ComOutDict.get(key) #从字典中获取存储输出的“列表”;
RList=[devList['SNum'], devList['DevName'], devList['ip']] #每设备初始列表增加“序号、设备名、IP”;
list1=json.loads(json.dumps(version, indent=2)) #将命令输出的json字符串转为python对象;
for dict in list1: #遍历命令输出,追加到列表中;
for item in dict:
RList.append(dict.get(item))
# print(key,' : ',RList)
DevOutList.append(RList)
except AuthenticationException:
issue_message = (SW2['ip'] + ': 认证错误 ')
issue_device.append(issue_message)
except NetMikoTimeoutException:
issue_message = (SW2['ip'] + ': 网络不可达 ')
issue_device.append(issue_message)
except SSHException:
issue_message = (SW2['ip'] +': SSH端口异常 ')
issue_device.append(issue_message)
except Exception as unknown_error:
issue_message = (SW2['ip'] +': 发生未知错误: ')
issue_device.append(issue_message+str(unknown_error))
finally:
write_issue_device(issue_device) #异常处理信息写入文件
def VersionExcel(VersList): #定义版本输出表格。传入设备信息列表;
ws=wb.active
ws.title='Version'
list_title=['序号','设备名','设备IP','设备版本','小版本','设备型号','本次运行时长','上次重启原因']
ws.append(list_title)
for Rows in VersList: #将信息写入表格中;
ws.append(Rows)
for cells in ws[1]: #为第一行增加色彩填充;
cells.fill=yellowFill
for cell in ws['G']:
if '0 week' in str(cell.value).lower(): #判断单元格内容是否有“0 week”,如果有,就修改单元格样式;
cell.fill=RedFill
for row in ws.rows: #为所有单元格增加边框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=5 #调整列宽;
ws.column_dimensions['B'].width=25 #调整列宽;
ws.column_dimensions['C'].width=18 #调整列宽;
ws.column_dimensions['D'].width=10
ws.column_dimensions['E'].width=14
ws.column_dimensions['F'].width=20
ws.column_dimensions['G'].width=40
ws.column_dimensions['H'].width=15
def PowerExcel(PowerList): #定义电源输出表格。传入设备信息列表;
ws=wb.create_sheet('电源状态')
list_title=['序号','设备名','设备IP','电源ID','电源状态','电源ID','电源状态','电源ID','电源状态','电源ID','电源状态','电源ID','电源状态','电源ID','电源状态']
ws.append(list_title)
for Rows in PowerList: #将信息写入表格中;
ws.append(Rows)
StatusCol=['E','G','I','K','M','O'] #判断电源状态是否为normal,不是就填充红色单元格;
for Col1 in StatusCol:
for cell in ws[Col1]:
if 'normal' != str(cell.value).lower() and cell.value!=None: #判断单元格内容是否不为normal,如果是,就修改单元格样式;
cell.fill=RedFill
for cells in ws[1]: #为第一行增加色彩填充;
cells.fill=yellowFill
for row in ws.rows: #为所有单元格增加边框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=5 #调整列宽;
ws.column_dimensions['B'].width=25 #调整列宽;
ws.column_dimensions['C'].width=18 #调整列宽;
def FanExcel(FanList): #定义风扇输出表格。传入设备信息列表;
ws=wb.create_sheet('风扇状态')
list_title=['序号','设备名','设备IP','风扇ID','风扇状态','风扇ID','风扇状态','风扇ID','风扇状态','风扇ID','风扇状态','风扇ID','风扇状态','风扇ID','风扇状态']
ws.append(list_title)
for Rows in FanList: #将信息写入表格中;
ws.append(Rows)
StatusCol=['E','G','I','K','M','O'] #判断风扇状态是否为normal,不是就填充红色单元格;
for Col1 in StatusCol:
for cell in ws[Col1]:
if 'normal' != str(cell.value).lower() and cell.value!=None: #判断单元格内容是否不为normal,如果是,就修改单元格样式;
cell.fill=RedFill
for cells in ws[1]: #为第一行增加色彩填充;
cells.fill=yellowFill
for row in ws.rows: #为所有单元格增加边框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=5 #调整列宽;
ws.column_dimensions['B'].width=25 #调整列宽;
ws.column_dimensions['C'].width=18 #调整列宽;
def CPUExcel(CpuList): #定义CPU输出表格。传入设备信息列表;
ws=wb.create_sheet('CPU状态')
list_title=['序号','设备名','设备IP',
'Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%','Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%',
'Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%','Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%',
'Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%','Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%',
'Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%','Slot-ID','CPU-ID','5s使用%','1m使用%','5m使用%',
]
ws.append(list_title)
for Rows in CpuList: #将信息写入表格中;
ws.append(Rows)
for cols in ws.iter_cols(min_row=2,min_col=4,max_col=43): #选择范围内的单元格,判断CPU使用率;
for cell in cols:
if cell.value != None and 70 < int(cell.value): #如果cpu使用率大于70%,标单元格为红色;
cell.fill=RedFill
for cells in ws[1]: #为第一行增加色彩填充;
cells.fill=yellowFill
for row in ws.rows: #为所有单元格增加边框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=5 #调整列宽;
ws.column_dimensions['B'].width=25 #调整列宽;
ws.column_dimensions['C'].width=18 #调整列宽;
def MemExcel(MemList): #定义内存输出表格。传入设备信息列表;
ws=wb.create_sheet('内存状态')
list_title=['序号','设备名','设备IP',
'Slot-ID','总内存','已使用','使用%','Slot-ID','总内存','已使用','使用%',
'Slot-ID','总内存','已使用','使用%','Slot-ID','总内存','已使用','使用%',
]
ws.append(list_title)
for Rows in MemList: #将信息写入表格中;
ws.append(Rows)
StatusCol=['G','K','O','S'] #如果内存使用率是否大于70%,就填充红色单元格;
for Col1 in StatusCol:
for cell in ws[Col1]:
if cell not in ws[1] and cell.value!=None and 70 < round(float(cell.value)):
cell.fill=RedFill
# print(type(cell.value),cell.value)
# if cell.value!=None and 70 > round(float(cell.value)):
# cell.fill=RedFill
for cells in ws[1]: #为第一行增加色彩填充;
cells.fill=yellowFill
for row in ws.rows: #为所有单元格增加边框;
for cells in row:
cells.border=thin_border
ws.column_dimensions['A'].width=5 #调整列宽;
ws.column_dimensions['B'].width=25 #调整列宽;
ws.column_dimensions['C'].width=18 #调整列宽;
def MultiThread(DevFile): #多线程函数,定义巡检命令和保存设备输出信息的列表。输入设备信息txt,输出设备信息列表;
DevList=getDevList(DevFile)
Threads=[]
VersList=[] #保存设备输出信息的初始空列表;
PowerList=[]
FanList=[]
CpuList=[]
MemList=[]
ComOutDict={ #定义传递给巡检函数的命令和列表;
'disp version':VersList,
'disp power':PowerList,
'disp fan':FanList,
'disp cpu':CpuList,
'disp memory':MemList,
}
for i in DevList:
t=threading.Thread(target=GetDevInfo, args=(i, ComOutDict))
t.start()
Threads.append(t)
for i in Threads:
i.join()
if len(issue_device) != 0:
print(issue_device)
return VersList,PowerList,FanList,CpuList,MemList
def main(DevFile, OutFile):
print('从文件 ' + DevFile + ' 中读取设备信息,并尝试连接。')
VersList,PowerList,FanList,CpuList,MemList=MultiThread(DevFile) #使用多线程获取设备信息;
print('表格信息写入中。')
VersionExcel(VersList) #使用单线程将设备信息写入表格;
PowerExcel(PowerList)
FanExcel(FanList)
CPUExcel(CpuList)
MemExcel(MemList)
wb.save(OutFile)
print('表格信息写入完成,名为:', OutFile)
if __name__=='__main__':
'''
第一个参数为设备地址和用户等信息,第二个参数为要输出的excel文件名:
'''
main('../ip_list.txt', 'test_Get_Version211113.xlsx')
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。