【Python收集系统信息】 Dmidecode系统信息

一、 Dmidecode综述:

1、通过 dmidecode 命令可以获取到 Linux 系统的包括 BIOS、 CPU、内存等系统的硬件信息,这里使用 python 代码来通过调用 dmidecode 命令来获取 Linux 必要的系统信息,更多的信息都可以通过这种方式去获取。

2、Dmidecode 工具主要是将系统的DMI数据库的信息进行解码,并以可读的信息显示。输出的信息包括了BIOS、系统、主板、处理器、内存、缓存、***、产品名称和厂家信息等。DMI就是收集系统信息的管理系统,它遵循SMBOIS协议,是主板制造商需严格遵守的协议。

3、安装的方式也很简单,用命令:yum  install -y  dmidecode 即可。

【Python收集系统信息】 Dmidecode系统信息

二、使用dmidecode 输出的信息实现抓取,获取Manufacturer、Product Name和 Serial Number。这里多说两句,对于输出的参数,通过一定的方式进行抓取,然后过滤,其实适合很多场景。

(1)对dmidecode 中以System Information开头的信息整体保存,然后逐行遍历。

#!/usr/bin/python

from subprocess import Popen,PIPE

p = Popen(['dmidecode'],stdout=PIPE,stderr=PIPE)
line_in = False
lines =[]
dmi_dic={}

while True:
    line = p.stdout.readline()        #逐行遍历
    if line.startswith('System Information'):   #找到"System Information" 的开始
        line_in =True
        continue
    if line_in:                     #在"System Information" 里遍历
        if line != '\n':
            lines.append(line)
        else:
            break               #如果到了"System Information" 的换行,则退出while 循环

print lines

【Python收集系统信息】 Dmidecode系统信息

(2)如上图,输出的列表,最好能将它变成字典保存,变成字典的形式就很方便输出了。

转换成字典时,需要将每个元素头尾的'\t'和'\n'去除,然后按":"符号分割,分别就是字典的key 和value了。

继续完善上面的脚本:

#!/usr/bin/python

from subprocess import Popen,PIPE

p = Popen(['dmidecode'],stdout=PIPE,stderr=PIPE)
line_in = False
lines =[]
dmi_dic={}

while True:
    line = p.stdout.readline()
    if line.startswith('System Information'):
        line_in =True
        continue
    if line_in:
        if line != '\n':
            lines.append(line)
        else:
            break

#print lines

"""
这里用到列表生成式,遍历lines, 对元素i 去除头尾的'\t'和'\n',然后以‘:’分割,得到两个元素的列表,
对于[['a', '1'], ['b', '2']]这种形式的列表,用dict()方法就可以构造出一个字典,如下:
dmi_dic = dict([i.strip().split(':')  for i in lines ])   
现在的dmi_dic 字典已经很接近最终的结果了,但是它的每个value 的最前面还带有空格,所以还需要将value 前的空格去除"""

dmi_dic = dict([i.strip().split(':') for i in lines])
for k,v in dmi_dic.items():
    dmi_dic[k] = v.strip()

dmi ={}
dmi['Manufacturer'] = dmi_dic['Manufacturer']

print dmi

【Python收集系统信息】 Dmidecode系统信息

三、上述的功能已经实现了,为了代码的规整性,使用模块化的方式实现

#!/usr/bin/env  python

from subprocess import Popen, PIPE

def  getData():
    p = Popen(['dmidecode'], stdout=PIPE, stderr=PIPE)
    data = p.stdout.read().split()
    return data

def  parseData(data):
    line_in = False
    lines = []
    for line  in data:
        if line.starswith('System Information'):
            line_in = True
            continue
        if line_in:
            if not line.strip():  #如果遍历到空行,即新的一段信息前,则可以退出循环了
                break
            else:
                lines.append(line)    

def  getDmi(lines):
    dmi_dic = {}
    dmi = {}
    dmi_dic = dict([i.strip().split(":")  for i in lines ])
    for k, v in dmi_dic.items():
        dmi_dic[k] = v.strip()

    dmi['Manufacturer'] = dmi_dic['Manufacturer']    
    dmi['Product Name'] = dmi_dic['Product Name']
    dmi['Serial Number'] = dmi_dic['Serial Number']

    return dmi                    

if  __name__ == '__main__':
    data   =  getData()
    lines = parseData(data)
    print getDmi(lines)