Skip to content

Instantly share code, notes, and snippets.

@tawateer
Last active August 29, 2015 14:21
Show Gist options
  • Save tawateer/aba6e3af1b020574b716 to your computer and use it in GitHub Desktop.
Save tawateer/aba6e3af1b020574b716 to your computer and use it in GitHub Desktop.
机器信息获取
#/usr/bin/python
#-*- coding: utf-8 -*-
import re
import os
import subprocess
def shell(cmd):
process = subprocess.Popen(\
args=cmd, stdout=subprocess.PIPE, \
stderr=subprocess.PIPE, shell=True)
std_out, std_err = process.communicate()
return_code = process.poll()
# return return_code, std_out, std_err
if return_code == 0:
return std_out.strip()
else:
return False
class ServerInfo(object):
def __init__(self):
self.shell = shell
@property
def sn(self):
_sn = self.shell("dmidecode -s system-serial-number")
# 物理机.
if "Specified" not in _sn:
return _sn
# 此处可能是虚拟机.
if os.path.exists("/etc/sn"):
with open("/etc/sn", "r") as f:
return f.read().strip()
else:
# 生成序列号.
_sn = "v-" + self.shell("/usr/bin/uuidgen")
with open("/etc/sn", "w") as f:
f.write(_sn)
return _sn
@property
def hostname(self):
return self.shell("hostname")
@property
def lastreport(self):
return self.shell("date +%Y%m%d%H%M%S")
@property
def macs(self):
cmd = "ls /sys/class/net/ |egrep 'em1|em2|eth0|eth1'"
devs = self.shell(cmd).splitlines()
cmd = "cat /sys/class/net/{%s}/address" % ",".join(devs)
return self.shell(cmd).splitlines()
@property
def vmacs(self):
cmd = r"grep -hPo '[0-9a-f:]{17}' /etc/libvirt/qemu/*.xml"
ret = self.shell(cmd)
if ret:
return ret.splitlines()
else:
return []
@property
def vms(self):
if self.shell("ls /etc/libvirt/qemu/*.xml"):
cmd = """for i in /etc/libvirt/qemu/*.xml
do
basename ${i%.*};
grep -Po '[0-9a-f:]{17}' $i;
done | awk '{if (NR%3==0){print $0} else {printf"%s ",$0}}'
"""
ret = self.shell(cmd)
return [{"vm_name":i.split()[0], "mac": i.split()[1:]} \
for i in ret.splitlines()]
else:
return []
@property
def amp(self):
cmd = "ipmitool sdr |grep Current |grep ok |"\
"awk -F'|' '{print $2}'|awk '{s+=$1}END{print s}'"
ret = self.shell(cmd)
return ret if ret else ""
@property
def pdisk(self):
cmd = "MegaCli -PDList -aALL -NoLog|"\
"grep 'Raw Size' |egrep -o '[0-9.]+\ GB' |"\
"tr -d ' ' |sort |uniq -c|sed 's/^\s*//g' | tr ' ' 'X'"
return self.shell(cmd).splitlines()
@property
def product_name(self):
return self.shell("dmidecode -s system-product-name")
@property
def manufacturer(self):
return self.shell("dmidecode -s system-manufacturer")
@property
def cpu_model(self):
return self.shell("dmidecode -s processor-version |sort -u")
@property
def cpu_cores(self):
return self.shell("grep processor /proc/cpuinfo |wc -l")
@property
def memory(self):
return self.shell("free -g |grep -i Mem |awk '{print $2}'")
@property
def swap(self):
return self.shell("free -g |grep -i Swap |awk '{print $2}'")
@property
def os(self):
return self.shell("cat /etc/issue |egrep -i 'redhat|centos'")
@property
def kernel(self):
return self.shell("/bin/uname -r")
@property
def ips(self):
cmd = r"ip a |grep -Po 'inet \d+\.\d+\.\d+\.\d+' "\
"|awk '{print $2}'"
return self.shell(cmd).splitlines()
@property
def ilo_ip(self):
cmd = r"ipmitool lan print |grep 'IP Address' |"\
"grep -Po '\d+\.\d+\.\d+\.\d+'"
ret = self.shell(cmd)
return ret if ret else ""
if __name__ == "__main__":
attrs = [ i for i in ServerInfo.__dict__.keys() \
if i not in ["__dict__", "__doc__", "__weakref__", \
"__init__", "__module__"]
]
# print attrs
oj = ServerInfo()
# print oj.sn
# ServerInfo 使用了 @property, 函数就可以当做属性一样引用.
_dict = dict()
for i in attrs:
_dict[i] = getattr(oj, i)
print _dict
# 如果 ServerInfo 不用 @property, 那么像下面这么写.
# _dict = dict()
# for i in attrs:
# _dict[i] = getattr(oj, i)()
# print _dict
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment