#!/usr/bin/env python
# -*- coding: utf-8 -*- """
解析dmidecode命令输出结果,返回JSON格式数据
测试服务器Dell VMware虚拟机
测试系统为CentOS 6.x 7.x
Python版本为Python3.6
原版参考的是 https://pypi.org/project/dmidecode/ 但是在Python3上无法直接使用而且我觉得它有些逻辑问题需要做一些修改
""" import sys
import subprocess __version__ = "0.1.0"
__author__ = "rex.chen" class Dmidecode(object):
def __init__(self):
# 注释掉里面的键值意味着忽略某些类型
self._DMI_TYPE = {
0: "BIOS Information", # BIOS信息 提供商、版本等
1: "System Information", # 系统信息包括服务器厂商、服务器的星号、服务器序列号
2: "Base Board Information",
3: "Chassis Information", # 可以获取服务器的高度,比如1U等。
4: "Processor Information", # 每个逻辑CPU的信息,物理CPU数量*核心数量=逻辑CPU数量
6: "Memory Module Information",
7: "Cache Information",
8: "Port Connector Information",
9: "System Slot Information",
10: "On Board Device Information",
11: "OEM Strings",
15: "System Event Log",
16: "Physical Memory Array",
17: "Memory Device", # 每个内存槽位上查的内存条信息,类型、容量、主频、序列号等
18: "32-bit Memory Error Information",
19: "Memory Array Mapped Address",
20: "Memory Device Mapped Address",
23: "System Reset",
24: "Hardware Security",
30: "Out-of-band Remote Access",
32: "System Boot Information",
33: "64-bit Memory Error Information",
38: "IPMI Device Information",
41: "Onboard Device",
# 126: "Inactive",
# 127: "End Of Table"
} def parse_dmi(self, content):
"""
解析dmidecode命令输出
:param content: 传递进来dmidecode命令执行的原始输出结果
:return: 重新组装后的数据字典
"""
info = {}
try:
"""
这里是一个关键点,dmidecode命令输出其实是层级结构的,它使用制表符\t来表示层级,lines可以列表,但后续处理会比较麻烦
所以这里使用迭代器一个是占用空间少,另外是你每一次传递lines到其他地方当调用next()或者for循环时它都是从上一次的位置
继续向下,这样对于处理这种dmidecode输出的有层级关系的非结构化数据比较方便。
"""
lines = iter(content.strip().splitlines())
while True:
try:
line = next(lines)
if line.startswith(b'Handle 0x'):
typ = int(str(line).split(',', 2)[1].strip()[len('DMI type'):])
if typ in self._DMI_TYPE:
if typ not in info:
info[self._DMI_TYPE[typ]] = []
info[self._DMI_TYPE[typ]].append(self._parse_handle_section(lines))
else:
info[self._DMI_TYPE[typ]].append(self._parse_handle_section(lines))
except StopIteration:
break
return info
except Exception as err:
print("Error occured in Function parse_dmi")
print(err) def _parse_handle_section(self, lines):
"""
解析每个type下面的信息,也就是每一个 Handle 0x 下面的信息
:param lines: 传递所有的内容进来,也就是之前生成的迭代器,而且这个迭代器是接着上面的位置继续向后迭代
:return: 字典,每个type下面的子信息组成的字典
"""
data = {}
title = str(next(lines).strip().decode(encoding='utf-8'))
try:
for line in lines:
line = line.rstrip()
strline = str(line.strip().decode(encoding='utf-8'))
if line.startswith(b'\t\t'):
data[k].append(strline)
elif line.startswith(b'\t'):
k, v = str(line.strip().decode(encoding='utf-8')).split(":", 1)
if v:
data[k] = v.strip()
else:
data[k] = []
else:
break
except Exception as err:
print("Error occured in Function parse_handle_section")
print("Data section is %s " % title)
print(err)
return data def main():
cmd = "sshpass -p 123456 ssh root@172.16.48.171 '/usr/sbin/dmidecode'"
mydmi = Dmidecode()
try:
completed_process = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if completed_process.returncode == 0:
data = completed_process.stdout
print(mydmi.parse_dmi(data))
else:
print("Returncode is not 0")
except Exception as err:
print(err) if __name__ == "__main__":
try:
main()
finally:
sys.exit()

dmidecode的Python解析的更多相关文章

  1. 使用Python解析JSON数据

    使用Python解析百度API返回的JSON格式的数据 # coding:utf-8 # !/usr/bin/env python import matplotlib.pyplot as plt fr ...

  2. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  3. python解析robot framework的output.xml,并生成html

    一.背景 Jenkins自动构建RF脚本,生成的RF特有HTML报告不能正常打开. 需求:用Python解析测试报告的xml数据,放在普通HTML文件中打开 二.output.xml数据 三.用pyh ...

  4. python 解析json loads dumps

    认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...

  5. Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

    摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就 ...

  6. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  7. python解析xml模块封装代码

    在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...

  8. python解析xml之lxml

    虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...

  9. Python解析生成XML-ElementTree VS minidom

    OS:Windows 7 关键字:Python3.4,XML,ElementTree,minidom 本文介绍用Python解析生成以下XML: <Persons> <Person& ...

随机推荐

  1. Go性能优化小结

    1 内存优化 1.1 小对象合并成结构体一次分配,减少内存分配次数 做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间, ...

  2. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. BZOJ_4269_再见Xor_线性基

    BZOJ_4269_再见Xor_线性基 Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行 ...

  4. VMware workstation创建虚拟机console

    1. 使用VMware workstation创建虚拟机硬件2. 安装操作系统3. 操作系统安装过程 1. 使用VMware workstation创建虚拟机硬件 使用VMware workstati ...

  5. i春秋——Misc之百度杯

    今天心里很是不开森,想想往日何必那么努力呢?不如你的比比皆是,可是人家就是因为有关系,你又能怎样呢? 你所有应该有的都被打翻了,别灰心,至少你曾经努力过! 愿我未来的学弟学妹们都能一直开开心心的过好每 ...

  6. Redis+Restful 构造序列号和压力测试【后续】

    大家还记上篇博文https://www.cnblogs.com/itshare/p/8643508.html,测试redis构造流水号的tps是600多/1s. 这个速度显然不能体现redis 集群在 ...

  7. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  8. Docker 配置国内镜像加速器,加速下载速度

    文章首发自个人微信公众号:小哈学Java 个人网站地址:https://www.exception.site/docker/docker-configuration-of-mirror-acceler ...

  9. Visio打开或取消箭头的自动吸附和自动连接

    在用Visio画图时Visio的自动对齐.自动连接.自动吸附功能确实能带了很多便利.但在画连接线时,Visio总是自动连接箭头与图形的固定节点,想要微调一下连接位置,就显得很不方便,需要关闭自动连接功 ...

  10. 使用Ninject的一般步骤

    以下为DI控制反转个人理解烦请各位大牛指教~ 编写程序时我们应当遵循抵耦合高内聚的原则(各个功能模块互不依赖). 我们可以利用面向对象里面接口的特性来进行DI控制反转,让功能模块全部依赖接口,而不依赖 ...