#!/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. storage.go

    package storage import (     "fmt"     "os" ) const DEFAULT_STORAGE_ENGINE = &qu ...

  2. 一类SG函数递推性质的深入分析——2018ACM陕西邀请赛H题

    题目描述 定义一种有根二叉树\(T(n)\)如下: (1)\(T(1)\)是一条长度为\(p\)的链: (2)\(T(2)\)是一条长度为\(q\)的链: (3)\(T(i)\)是一棵二叉树,它的左子 ...

  3. BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心

    BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...

  4. iPhone6 AirDrop找不到我的mac解决方法!注销mac和iPhone的icloud账号

    注销mac和iPhone的icloud账号,icloud 会自动同步个人热点,个人热点开启状态,mac 和 iPhone 无法看到对方!

  5. PyQt5嵌入matplotlib动画

    # -*- coding: utf-8 -*- import sys from PyQt5 import QtWidgets import numpy as np from matplotlib.ba ...

  6. MySQL · 引擎特性 · 临时表那些事儿

    前言 相比于普通的用户数据表,MySQL/InnoDB中的临时表,大家应该会陌生很多.再加上不同的临时表创建的时机和创建的位置都不固定,这也进一步加大神秘感.最让人捉摸不透的是,临时表很多时候会先创建 ...

  7. 钉钉开发获取APPKEY, APPSECRET, CorpId和SSOSecret

    首先用自己的钉钉账号注册一个企业: https://oa.dingtalk.com/index.htm 一.获取应用APPKEY及APPSECRET方法: 1.登录钉钉开放平台创建应用: https: ...

  8. Spark学习之在集群上运行Spark

    一.简介 Spark 的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力.好在编写用于在集群上并行执行的 Spark 应用所使用的 API 跟本地单机模式下的完全一样.也就是说 ...

  9. 彻底理解浏览器的缓存机制(http缓存机制)

    一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...

  10. Python-定时爬取指定城市天气(二)-邮件提醒

    目录 一.概述 二.模块重新划分 三.优化定时任务 四.发送邮件 五.源代码 一.概述 上一篇文章python-定时爬取指定城市天气(一)-发送给关心的微信好友中我们讲述了怎么定时爬取城市天气,并发送 ...