Last active
August 29, 2015 14:21
-
-
Save tawateer/aba6e3af1b020574b716 to your computer and use it in GitHub Desktop.
机器信息获取
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/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