#!/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. MAC下的mysql忘记密码该怎么办??

    不要着急,不要慌,好多人会忙手忙脚,以为自己安装了一个假软件,其实是你打开的方式不对而已! step1: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击 ...

  2. Instrumentation(3)

    摘要: Instrumentation  类加载过程  Instrumentation与Transformer  Instrumentation与Transformer的关系  Instrumenta ...

  3. multiWriter.go

    package blog4go import ( "errors" "fmt" ) var ( // ErrFilePathNotFound 文件路径找不到 E ...

  4. Clean http handlers in Go

    Introduction For this blog post we are going to take a look at the http.HandlerFunc type and how we ...

  5. 一个C++程序中有多个cin输入的情况

    在很多C++程序中,我们都会有几次输入的操作.这种情况下,会遇到只有第一个cin语句被执行了,而后面的cin都没有执行.这是因为cin所输入的数据都放在cin缓冲区中,当第一次使用cin后,缓冲区中已 ...

  6. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  7. BZOJ_1369_[Baltic2003]Gem_树形DP

    BZOJ_1369_[Baltic2003]Gem_树形DP Description 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值, ...

  8. 【机器学习基础】对 softmax 和 cross-entropy 求导

    目录 符号定义 对 softmax 求导 对 cross-entropy 求导 对 softmax 和 cross-entropy 一起求导 References 在论文中看到对 softmax 和 ...

  9. mysql怎样配置ODBC数据源

      一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成.所以说mysql配置ODBC数据源也很重要. 工具/原料 ...

  10. Linux上删除大量文件几种方式对比

    目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...