当前位置: 首页 > news >正文

通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存

通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存

  • 版本信息
  • 代码

新开发的PCIE设备在做服务器适配时,有时需要服务器厂家更新BMC或BIOS固件。同时,我们也希望对PCIE设备做一些检测,最后收集一些信息存档。如果需要处理的服务器很多,通过BMC的界面进行人工操作就会比较麻烦。以下提供了一个脚本,供参考。

主要思路:

  • 采用haneWIN NFS Server搭建一个NFS服务,目录为nfs,里面存放着boot.iso(设备检测镜像)
  • 通过redfish协议登录BMC,获取PCIE设备信息,服务器信息,升级固件,重启服务器,挂iso,设置启动方式
  • 截屏获取KVM的内容,通过图片相似度的方法判断ISO里的检测程序是否运行完成.

版本信息

属性
NFS服务器haneWIN NFS Server
服务器型号NF5270M6

代码

# -*- coding: utf-8 -*-from queue import Queue
from skimage.metrics import structural_similarity
import traceback
import cv2
import codecs
import csv
import argparse
import shutil
import json
import time
import redfish
import sys
import os
import uuid
import threading
import warnings
warnings.filterwarnings("ignore")
import loggingparser = argparse.ArgumentParser()
parser.add_argument('-server_list', type=str,required=True, help="server_list")
parser.add_argument('-nfs_server', type=str, required=True, help="nfs server")
parser.add_argument('-threads', type=int, required=True, help="nfs server")
parser.add_argument('-checkonly', type=int, required=True, help="check only")args = parser.parse_args()class TimeSpan:"""统计代码段的耗时"""    def __init__(self,logger,prefix=""):self.prefix = prefixself.logger=loggerdef __enter__(self):self.end = Noneself.start = time.time()def __exit__(self, exc_type, exc_val, exc_tb):self.end = time.time()interval = self.end - self.startunit = "sec"if interval > 60:unit = "min"interval = interval/60self.logger.info('%-64s:%.3f(%s)' % (self.prefix, interval, unit))def isSimilarity(filename):"""判断自检程序是否运行完成Args:filename ([string]): [截屏图片路径]Returns:[bool]: [是否完成]"""    last_image = cv2.imread('target_image.jpg', cv2.IMREAD_GRAYSCALE)img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)cell_h, cell_w = last_image.shapehoff = 280h, w = img.shapewhile hoff < 320:img2 = img[hoff:hoff+cell_h, 0:cell_w]ssim = structural_similarity(last_image, img2)if ssim > 0.5:# cv2.imwrite("{}_{}.jpg".format(hoff,int(ssim)),img2)return Truehoff += 3return Falseclass RedFishProxy:def __init__(self,handle,retry_count=3):self.handle=handleself.retry_count=retry_countdef post(self, path, args=None, body=None, headers=None):count=0while True:response=self.handle.post(path,args,body,headers)if response._status == 500 and count<self.retry_count:time.sleep(2)count+=1continueelse:return response            def get(self, path, args=None, headers=None):count=0while True:response=self.handle.get(path,args,headers)if response._status == 500 and count<self.retry_count:time.sleep(2)count+=1continueelse:return response   def delete(self,path, args=None, headers=None):count=0while True:response=self.handle.delete(path,args,headers)if response._status == 500 and count<self.retry_count:time.sleep(2)count+=1continueelse:return response   def patch(self, path, args=None, body=None, headers=None):count=0while True:response=self.handle.patch(path,args,body,headers)if response._status == 500 and count<self.retry_count:time.sleep(2)count+=1continueelse:return response        class InspurVA1Query:def __init__(self,logger,index,bmc_host, username, password, nfs_server, try_count):self.logger=loggerself.nfs_server = nfs_serverself.username = usernameself.password = passwordself.try_count = try_countself.bmc_host = bmc_hostself.seq = 0self.token=Noneself.index=indexself.redfish_client=RedFishProxy(redfish.redfish_client(base_url=self.bmc_host, username=self.username, password=self.password))def Login(self):url = '/redfish/v1/SessionService/Sessions'req_body = {"UserName": self.username,"Password": self.password, "SessionTimeOut": 300}req_headers = {"Content-Type": "application/json"}response = self.redfish_client.post(url, headers=req_headers, body=req_body)if response._status == 201:session = json.loads(response._read.decode())self.token = session["Oem"]['Public']['X-Auth-Token']self.Id = session["Id"]return Trueelse:self.logger.error("Thermal:{}".format(response))return Falsedef Logout(self):if self.token:url = '/redfish/v1/SessionService/Sessions/{}'.format(self.Id)req_headers = {"X-Auth-Token": self.token}response = self.redfish_client.delete(url, headers=req_headers)self.token
http://www.lryc.cn/news/306772.html

相关文章:

  • ARM 版银河麒麟桌面系统下 Qt 开发环境搭建指南
  • 架构面试题汇总:缓存(二)
  • 【docker入门】1-
  • 微信小程序-全局配置
  • 【Android】性能优化之内存、网络、布局、卡顿、安装包、启动速度优化
  • 第3.6章:StarRocks数据导入——DataX StarRocksWriter
  • 【非递归版】归并排序算法(2)
  • [C++]C++实现本地TCP通讯的示例代码
  • Sora - 探索AI视频模型的无限可能
  • 【JavaScript 漫游】【022】事件模型
  • 【加密算法】RSA非对称加密算法简介
  • 深入理解 JavaScript 对象原型,解密原型链之谜(上)
  • 产品经理学习-产品运营《什么是SOP》
  • 大数据Hadoop生态圈
  • 算法简介:查找与算法运行时间
  • 零基础C++开发上位机--基于QT5.15的串口助手(三)
  • Facebook的虚拟社交愿景:元宇宙时代的新起点
  • 【深度学习笔记】4_6 模型的GPU计算
  • 留学申请过程中如何合理使用AI?大学招生官怎么看?
  • vue2与vue3的diff算法有什么区别
  • ES小总结
  • vue2与vue3中父子组件传参的区别
  • 使用vuetify实现全局v-alert消息通知
  • CentOS 7.9上编译wireshark 3.6
  • 初学学习408之数据结构--数据结构基本概念
  • Java项目中必须使用本地缓存的几种情况
  • 【鸿蒙 HarmonyOS 4.0】TypeScript开发语言
  • Android java基础_异常
  • 高数考研 -- 公式总结(更新中)
  • 详解顺序结构滑动窗口处理算法