#!/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. I/O-----字符输出流

    package io.day04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileR ...

  2. Leetcode解题思路总结(Easy篇)

    终于刷完了leetcode的前250道题的easy篇.好吧,其实也就60多道题,但是其中的套路还是值得被记录的. 至于全部code,请移步github,题目大部分采用python3,小部分使用C,如有 ...

  3. 深度学习之Batch Normalization

    在机器学习领域中,有一个重要的假设:独立同分布假设,也就是假设训练数据和测试数据是满足相同分布的,否则在训练集上学习到的模型在测试集上的表现会比较差.而在深层神经网络的训练中,当中间神经层的前一层参数 ...

  4. APP测试要点—UI、功能测试

    一.UI测试 测试用户界面(如菜单.对话框.窗口和其它可规控件)布局.风格是否满足客户要求.文字是否正确.页面是否美观.文字.图片组合是否完美.操作是否友好等. UI测试的目标是确保用户界面会通过测试 ...

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

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

  6. ABP学习笔记(1)-使用mysql

    前言 开始学习ABP啦 下载官方模板 ​ 下载地址: https://aspnetboilerplate.com/Templates ​ 我这边选择的是.NET Core+VUE 移除SqlServe ...

  7. 【坑】解决CentOS 7.1版本以上安装好zabbix 3.4 无法重启zabbix-server的问题

    1. 问题所在 报错信息:zabbix_server[]: segfault at ip 00007f78842b4bd0 sp 00007fff1995a818 error ] 2. 产生原因 Ce ...

  8. 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解

    背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...

  9. 死磕 java集合之PriorityBlockingQueue源码分析

    问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的 ...

  10. asp.net core系列 58 IS4 基于浏览器的JavaScript客户端应用程序

    一. 概述 本篇探讨使用"基于浏览器的JavaScript客户端应用程序".与上篇实现功能一样,只不过这篇使用JavaScript作为客户端程序,而非core mvc的后台代码Ht ...