码迷,mamicode.com
首页 > 编程语言 > 详细

机器信息采集脚本(python)

时间:2015-03-28 21:49:34      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:脚本   python   系统管理员   命令行解析器   操作系统   

机器信息采集脚本(python)

源代码位置:https://github.com/caidao/ugetinfo-1.0.0  (希望大家能多多star收藏和fork改进程序)

一、做什么的?
   (1)主要用于采集服务器的相关信息,提供两种交互方式,一种是将服务器信息汇总至xml文件中,便于软件开发者使用(图1);另一种方式通过命令行交互的方式,通过输入参数信息查询相关信息(图2)。     
技术分享
                                                          图1
技术分享
                                                         图2
(2)主要功能
  •   uname  : 操作系统版本 、型号 、处理器、机器名等
  •   CPU :型号 、数量 、使用率等
  •   network : 网卡信息、MAC、IP、子网掩码、网络I/O等
  • memory :  内存大小、使用率、可用大小等
  • 存储   :  类型、大小、使用情况、磁盘I/O等
  • 数据库版本和安装路径:Mysql、oracle、sqlserver、sybase、db2

二、怎么做?

(1)、依赖的库
       psutil库      下载地址:https://pypi.python.org/pypi/psutil
       windows系统需要安装WMI库  下载地址:https://pypi.python.org/pypi/WMI/#downloads  这个库在安装之前要安装pywin32

(2)、命令行解析模块 optparse
         功能强大,且易于使用,可以方便地生成标准的、符合Unix/Posix规范的命令行说明。
文档说明中文翻译:http://blog.csdn.net/caidaoqq/article/details/44706005(英语水平有限)

(3)windows系统信息
   WMI 最初于1998年作为一个附加组件与 Windows NT 4.0 Service Pack 4 一起发行,是内置在Windows 2000、 Windows XP和Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI是一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源。大多用户习惯于使用众多的图形化管理工 具来管理Windows资源,在WMI之前这些工具都是通过 Win32应用程序编程接口(Application ProgrammingInterfaces,API)来访问和管理Windows资源的。只要你熟悉系统编程你就知道API有多么重要。但是大多数脚本 语言都不能直接调用Win32 API,WMI的出现使得系统管理员可以通过一种简便的方法即利用常见的脚本语言实现常用的系统管理任务。利用WMI需要和脚本如WSH和VBScript结合起来,可以实现的功能大家可以看微软的MSDN文档。
  因此基本上windows系统能表现出来,你都可以通过这个模块获取,具体的可参考下面代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
try:
    import wmi
    import win32api
except ImportError:
    wmi = None
import sys,platform
import subprocess
import os


def get_system_info(c,sys):
    if sys == "Windows":
        for sys in c.Win32_OperatingSystem():
            print  "Version :\t%s" % sys.Caption.encode( "GBK")
            print  "Vernum :\t%s" % sys.BuildNumber
           
def get_memory_info(c,sys):
    if sys == "Windows":
        for mem in c.Win32_MemoryArray():
            print ‘\t‘ + str(mem.Caption)  + ‘\t‘ + str(mem.Name)
        cs = c.Win32_ComputerSystem()
        pfu = c.Win32_PageFileUsage()
        MemTotal = int(cs[ 0].TotalPhysicalMemory)/ 1024/1024
        print  "TotalPhysicalMemory :" + ‘\t‘ + str(MemTotal) + "M"
        #tmpdict ["MemFree"] = int( sys[0].FreePhysicalMemory)/1024
        SwapTotal = int(pfu[ 0].AllocatedBaseSize)
        print  "SwapTotal :" + ‘\t‘ + str(SwapTotal) + "M"
        #tmpdict ["SwapFree"] = int( pfu[0].AllocatedBaseSize - pfu[0].CurrentUsage)
 
def get_disk_info(c,sys,infolist):
    if sys == "Windows":
        tmpdict = dict()
        tmplist=list()
        for physical_disk in c.Win32_DiskDrive():
            if physical_disk.Size:
                tmpdict[ "disk"]=str(physical_disk.Caption)
                tmpdict["size" ]=str(long(physical_disk.Size)/1024/1024/1024)+"G"
                tmpdict[ "dev"] = str(physical_disk.MediaType)
                tmplist.append(tmpdict)
                print tmpdict["dev" ]+":\t"+tmpdict["disk"] + ‘ :\t‘ + tmpdict["size" ]
        infolist.append(tmplist)       
               
def get_cpu_info(c,sys,infolist):
    if sys == "Windows":
        tmplist=list()
        tmpdict=dict()
        tmpdict[ "CpuCores"] = 0
        for cpu in c.Win32_Processor():           
            tmpdict[ "model name"] = cpu.Name
        try:
            tmpdict[ "CpuCores"] = cpu.NumberOfCores
        except:
            tmpdict[ "CpuCores"] += 1
            tmpdict[ "CpuClock"] = cpu.MaxClockSpeed   
        print  ‘CpuType :\t‘ + str(tmpdict["model name"])
        print  ‘CpuCores :\t‘ + str(tmpdict["CpuCores"])
        tmplist.append(tmpdict)
        #infolist.append(tmplist)
        return tmplist
 
 
def get_network_info(c,sys,infolist):
    if sys == "Windows":
        tmplist=list()
        for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):
                tmpdict=dict()
                tmpdict[ "Description"] = interface.Description
                tmpdict[ "IPAddress"] = interface.IPAddress[0 ]
                tmpdict[ "IPSubnet"] = interface.IPSubnet[0 ]
                tmpdict[ "MAC"] = interface.MACAddress
                tmplist.append(tmpdict)
        for i in tmplist:
            print  i["Description"]
            print   ‘\t‘ + "MAC :" + ‘\t‘ + i["MAC" ]
            print  ‘\t‘ + "IPAddress :" + ‘\t‘ + i["IPAddress" ]
            print   ‘\t‘ + "IPSubnet :" + ‘\t‘ + i["IPSubnet" ]
        infolist.append(tmplist)
        for interfacePerfTCP in c.Win32_PerfRawData_Tcpip_TCPv4():
                print  ‘TCP Connect :\t‘ + str(interfacePerfTCP.ConnectionsEstablished)

def get_Proceess_cmd(c,process_name):
    cmd = ""
    for process in c.Win32_Process():
        temp =   unicode(process.CommandLine)
        name = process.Name
        if name.find(process_name) >= 0:
            cmd = temp
    return cmd
   

    
def get_info(cmd):
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell= False)
    return p.communicate()[ 0].split( "\n")[0 ]

if __name__ == "__main__":
    sys = platform.system()
    infolist = list()
    c = wmi.WMI ()
  
   

(4)Linux系统信息
    4.1 cpu信息
     在linux系统中,提供了proc文件系统显示系统的软硬件信息.CPU的信息在启动的过程中被装载到虚拟目录/proc下的cpuinfo文件中,我们可以通过cat /proc/cpuinfo查看一下:
技术分享
这样我们只需要通过分析这个文件来获取cpu的相关信息,代码如下:
ef get_cpu_info(sys,infolist):
    cpuinfo=dict()
    procinfo=dict()
    tempdict = dict()
    templist = list()
    if sys == "Linux":
        ‘‘‘ Return the information in /proc/cpuinfo
    as a dictionary in the following format:
    cpu_info[‘proc0‘]={...}
    cpu_info[‘proc1‘]={...}
    ‘‘‘
        nprocs = 0
        f = file( "/proc/cpuinfo",‘r‘)
        while True :
            line = f.readline()
            if len(line) == 0:
                break
            if not line.strip():
                # end of one processor
                cpuinfo[ proc %s‘ % nprocs] = procinfo
                nprocs=nprocs+ 1
                # Reset
                procinfo=dict()
            else:
                if len(line.split( ‘:‘)) == 2 :
                    temp1 = line.split( ‘:‘)[0 ].strip()
                    temp2 = line.split( ‘:‘)[1 ].strip()
                    tempdict[temp1] = temp2
                    print temp1+" : "+temp2
                else:
                    procinfo[line.split( ‘:‘)[0 ].strip()] = ‘‘
        templist.append(tempdict)
       # infolist.append(tempdict)
        return templist

4.2 network信息
   想实现一个类似ifconfig命令,查了一下资料没有找到好的方法,所以干脆就直接直接调用ifconfig。
def get_network_info(sys1,infolist):
    if sys1 == ‘Linux‘:
        tmplist=list()
        ethlist = get_info( ifconfig -s|grep -v Iface|grep -v lo|awk \‘{print $1}\‘‘).split("\n")
        ethInfsys = get_info( "lspci | grep Ethernet").split("\n")
        i = 0
        for ethi in ethlist:
            if ethi != "":
                tmpdict = dict()
                tmpdict[ "Description"] = ethInfsys[i].split(":")[2]
                tmpdict[ "IPAddress"] = get_info(ifconfig %s | awk \‘/inet addr:/{ print $2 }\‘‘%(ethi)).split( ":")[1 ]
                tmpdict[ "IPSubnet"] = get_info(ifconfig %s | awk \‘/Mask/{print $4}\‘‘%(ethi)).split( ":")[1 ]
                tmpdict[ "MAC"] = get_info(ifconfig %s | awk \‘/HWaddr/{ print $5 }\‘‘%(ethi))
                tmplist.append(tmpdict)
                i = i + 1
        for i in tmplist:
            print  i["Description"]
            print   ‘\t‘ + "MAC :" + ‘\t‘ + i["MAC" ]
            print  ‘\t‘ + "IPAddress :" + ‘\t‘ + i["IPAddress" ]
            print   ‘\t‘ + "IPSubnet :" + ‘\t‘ + i["IPSubnet" ]
        infolist.append(tmplist)    

4.3 存储信息
  其实我首先想到的是fdisk这个命令,但是它有一个权限:无法支持超过2TB的硬盘分区,这个在当今情况下几乎是不可能。
   那么就用第二种分区命令了parted,由于我只想知道分区和大小,所以就在命令后面加了个过滤。如下
技术分享
技术分享
后面再通过hdparm获取挂载盘的一些其他信息,代码如下:
def get_disk_info(sys,infolist):
    if sys == "Linux":
        tmplist=list()
        devlist = get_info( "parted -l |grep Disk").split( "\n")
        for dev in devlist:
            if dev != "":
                tmpdict = dict()
                tmpdict[ "dev"] = dev.split()[ 1].split( ":")[0 ]
                tmpdict[ "size"] = dev.split()[2 ]
                temp = get_info( "hdparm -I  %s |awk \‘/Model Number:/\‘"%(tmpdict["dev"]))
                if temp != "":
                    tmpdict[ "disk"] = temp.split(":")[1]
                else:
                    tmpdict[ "disk"] = ""
                tmplist.append(tmpdict)
                print tmpdict["dev" ]+":\t"+tmpdict["disk"] + ‘ :\t‘ + tmpdict["size" ]
        infolist.append(tmplist)

(5)数据库信息
原理其实很简单,每个数据库启动后都会有后台进程,只要能获取到进程,就能查到它的启动参数信息,然后根据参数信息就能查到数据库的安装位置,然后通过数据库的bin目录中的程序获取该数据库的一些配置信息,比如版本号等,所以这个方法有时候不准。

数据库 支持系统 获取方式
Mysql  windows 通过查找mysqld进程,获取安装路径和数据库的配置信息
Mysql linux 通过ps -ef |grep mysqld |grep basedir来定位进程
oracle windows 通过查找oracle进程,获取安装路径,然后在运行sqlplus就能获取版本信息了
oracle linux 通过ps -ef |grep oracle |awk \‘/LISTENER/{print $8}\‘来定位置进程,在通过sqlplus获取版本信息
sqlserver windows 通过查找sqlserver进程,获取相关信息
syabse windwos 通过sqlsrc进程,获取相关信息

 (6)已经测试环境
1.win7 mysql5.1  正常           (mysql是通过mysqld程序获取信息的)

2.readhat5.6  mysql5.0.77 正常

3.windwos server 2008   oracle11.2.0.1.0 正常 (在windows系统下是通过查询oracl.exe程序来获取信息的)

4.centos6.4  oracle11.2.0.1.0 正常 (在linux系统下是通过查询oracle的监听进程来做获取信息的 )

5.windows server 2003  sqlserver2005  正常(通过检测sqlservr.exe程序来获取安装路径)

6.windows server 2003  sybase ase1254 正常(通过检测sqlsrvr.exe程序来获取安装路径)

7.SunOS  sunv440        不支持


机器信息采集脚本(python)

标签:脚本   python   系统管理员   命令行解析器   操作系统   

原文地址:http://blog.csdn.net/caidaoqq/article/details/44706159

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!