一、系统基础信息模块(cpu,内存,ip,dns)模块


1、系统性能信息模块psutil


a、(cpu信息)


# yum -y install python-devel

# wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate

# tar -zxvf psutil-2.0.0.tar.gz

# cd psutil-2.0.0.tar.gz

# python setup.py install

# python

>>> import psutil


>>> psutil.cpu_times()   # 使用cpu_times方法获取cpu完整信息,需要显示所有逻辑cpu信息指定变量percpu=True


>>> psutil.cpu_times(percpu=True)  


>>> psutil.cpu_times().user  #获取单项数据信息,如用户user的CPU时间比


>>> psutil.cpu_count()       #获取CPU的逻辑个数,默认logical=True4

2


>>> psutil.cpu_count(logical=False)  #获取CPU的物理个数

1


b、(内存信息)


>>> psutil.virtual_memory()


>>> psutil.virtual_memory().total

1036869632L


>>> psutil.virtual_memory().free

177897472L


>>> psutil.swap_memory()


c、(磁盘信息)


>>> psutil.disk_partitions()   #获取磁盘的完整信息


>>> psutil.disk_usage('/')     #使用psutil.disk_usage方法获取分区(参数)的使用情况


>>> psutil.disk_io_counters()  #获取磁盘IO个数、读写信息


>>> psutil.disk_io_counters(perdisk=True) #"perdisk=True"参数获取单个分区IO个数、读写信息


>>> psutil.net_io_counters(pernic=True)    # pernic=True 输出每个网络接口的IO信息


>>> psutil.users()  #返回当前登陆系统用户信息



>>> import psutil, datetime  

>>> psutil.boot_time()  #获取开机时间,以linux时间戳格式返回

1450153735.0

>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y%m%d%H%M%S")  #转换成自然时间格式

'20151215122855'



2、系统进程管理方法


a、(进程信息)

>>> import psutil

>>> psutil.pids()   #列出所有进程PID


>>> psutil.Process(2156).name()  #实例化一个Process对象,参数为一进程PID,进程名

'nginx'

>>> psutil.Process(2156).exe()   # 进程bin路径

'/usr/sbin/nginx'

>>> psutil.Process(2156).cwd()  # 进程工作目录绝对路径

'/'

>>> psutil.Process(2156).status()  # 进程状态

'sleeping'

>>> psutil.Process(2156).create_time() #进程创建时间,时间戳格式

1450167098.7

>>> psutil.Process(2156).uids()  #进程uid信息


>>> psutil.Process(2156).gids()


>>> psutil.Process(2156).cpu_times()


>>> psutil.Process(2156).cpu_affinity()


>>> psutil.Process(2156).memory_percent()  #进程内存利用率

0.46100607564133966

>>> psutil.Process(2156).memory_info()


>>> psutil.Process(2156).io_counters()  #进程IO信息


>>> psutil.Process(2156).connections()


>>> psutil.Process(2156).num_threads() #进程开启的线程数


3、ip地址处理模块IPy

# wget https://pypi.python.org/packages/source/I/IPy/IPy-0.81.tar.gz --no-check-certificate

# tar -zxvf IPy-0.81.tar.gz

# cd IPy-0.81

# python setup.py install


通过指定网段输出该网段的Ip个数及所有ip地址清单

>>> from IPy import IP

>>> ip = IP('192.168.0.0/16')

>>> print ip.len()

>>> for x in ip:

>>>     print x


#反向解析地址格式

>>> ip = IP('192.168.1.20')

>>> ip .reverseName()     

'20.1.168.192.in-addr.arpa.'


#根据ip与掩码计算出网段

>>> from IPy import IP        

>>> print(IP('192.168.1.11').make_net('255.255.255.0'))   

192.168.1.0/24

>>> print(IP('192.168.1.11/255.255.255.0',make_net=True))

192.168.1.0/24

>>> print(IP('192.168.1.11/24',make_net=True))

192.168.1.0/24

>>> print(IP('192.168.1.0-192.168.1.255',make_net=True))

192.168.1.0/24


#通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段

>>> IP('192.168.1.0/24').strNormal(0)   #wantprefixlen = 0  无返回

'192.168.1.0'

>>> IP('192.168.1.0/24').strNormal(1)   #wantprefixlen = 1  prefix格式

'192.168.1.0/24'

>>> IP('192.168.1.0/24').strNormal(2)   #wantprefixlen = 2  decimalnetmask格式

'192.168.1.0/255.255.255.0'

>>> IP('192.168.1.0/24').strNormal(3)   #wantprefixlen = 3  lastIP格式

'192.168.1.0-192.168.1.255'



#多网络比较/计算方法详解

>>> IP('10.0.0.0/24') < IP('12.0.0.0/24')   #数值型数据比较

True

>>> IP('10.0.0.0/24') in IP('12.0.0.0/24')  #网段包含关系

False

>>> IP("192.168.0.0/23").overlaps("192.168.1.0/24")  #网段是否存在重叠  1 表示存在重叠,0 表示不存在重叠

1

>>> IP("192.168.0.0/23").overlaps("192.168.2.0")

0



#!/usr/bin/env/ python

from IPy import IP

ip_s = raw_input('Please input an IP or net_range:')

ips = IP(ip_s)

if len(ips) > 1:   # 为一个网络地址

    print ('net:  %s' % ips.net())                 #网络地址

    print ('netmask:  %s' % ips.netmask())         #子网掩码

    print ('broadcast:  %s' % ips.broadcast())     #广播地址

    print ('reverse address:  %s' % ips.reverseNames()[0])   #反向地址解析

    print ('subnet:  %s' % len(ips))     #输出网络子网数

else:

    print ('reverse address:  %s' % ips.reverseNames()[0])

print('hexadecimal:  %s' % ips.strHex())    #输出十六进制地址

print('binary ip:  %s' % ips.strBin())      #输出二进制地址

print('iptype:  %s' % ips.iptype())         #输出地址类型,PRIVATE\PUBLIC\LOOPBACK


4、DNS处理模块


dnspython提供了一个DNS解析器类:resolver,使用它的query方法来实现域名的查询功能。query方法的定义如下:

query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)

其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:


A记录:将主机名转换成IP地址

MX记录:邮件交换记录,定义邮件服务器的域名

CNAME记录:指别名记录,实现域名间的映射

NS记录:标记区域的域名服务器及授权子域

PTR记录:反向解析,与A记录相反,将IP转换成成主机名

SOA记录:SOA记录,一个起始授权区的定义


# wget http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz

# tar -zxvf dnspython-1.9.4.tar.gz

# cd dnspython-1.9.4

# python setup.py install


(1)A记录

#! /usr/bin/env python

import dns.resolver

domain = raw_input('Please input an domain:')

A = dns.resolver.query(domain,'A')       #指定查询类型为A记录

for i in A.response.answer:

    for j in i.items:

        print j


(2)MX记录

#! /usr/bin/env python

import dns.resolver

domain = raw_input('Please input an domain:')

MX = dns.resolver.query(domain,'MX')      #指定查询类型为MX记录

for i in MX:

print 'MX preference = ', i.preference,'mail exchanger = ', i.exchange


(3)NS记录

#! /usr/bin/env python

import dns.resolver

domain = raw_input('Please input an domain:')

NS = dns.resolver.query(domain,'NS')       #指定查询类型为NS记录

for i in NS.response.answer:

    for j in i.items:

        print j

(4)CNAME记录

#! /usr/bin/env python

import dns.resolver

domain = raw_input('Please input an domain:')

CNAME = dns.resolver.query(domain,'CNAME')       #指定查询类型为CNAME记录

for i in CNAME.response.answer:

    for j in i.items:

        print j





练习:


1、根据输入的Ip地址,跟子网掩码 计算出网络段


#!/usr/bin/env python

#_*_encoding:utf-8_*_

#Input your ip address and netmask to figure out your network .

#申明:此脚本为交互式,默认情况下请执行python network.py

from IPy import IP

input_IP = raw_input('请输入ip地址:')

list1 = input_IP.split('.')

if len(list1) != 4:

  print "您输入的ip地址不合法,请重新输入!"

  exit()

for i in list1:

  if i.isdigit() == True and int(i) >=0 and int(i) <= 255:

    pass

  else:

    print "您输入的ip地址不合法,请重新输入!"

    exit()

input_Netmask = raw_input('请输入子网掩码:')

list2 = input_Netmask.split('.')

if len(list2) != 4:

  print "您输入的子网掩码不合法,请重新输入!"

  exit()

for i in list2:

  if i.isdigit() == True and int(i) >=0 and int(i) <= 255:

    pass

  else:

    print "您输入的子网掩码不合法,请重新输入!"

    exit()

print "您所在的网段为:%s" % (IP(input_IP).make_net(input_Netmask))



2、dns域名解析后台服务器健康检查


import dns.resolver

import os

import httplib


iplist = []      #定义域名IP列表变量

appdomain = 'www.google.com.hk'    # 定义业务域名


def get_iplist(domain=""):       #域名解析函数,解析成功IP将被追加到iplist

    try:

        A = dns.resolver.query(domain, 'A')  #解析A记录类型

    except Exception,e:

        print "dns resolver error:"+str(e)

        return

    for i in A.response.answer:

        for j in i.items:

            iplist.append(j)   #追加到Iplist

    return True


def checkip(ip):

    checkurl = ip+":80"

    getcontent = ""

    httplib.socket.setdefaulttimeout(5)   #定义http连接超时时间5秒

    conn=httplib.HTTPConnection(checkurl) #创建http连接对象

    

    try:

        conn.request("GET","/",headers = {"Host": appdomain}) #发起URL请求,添加host主机头

        r = conn.getresponse()

        getcontent = r.read(15)   #获取URL页面前15个字符,以便做可用性校验

    finally:

        if getcontent == "<!doctype html>":

            print ip+" [OK]"

        else:

            print ip+" [Error]"     #此处可放告警程序,可以是邮件,短信通知


if __name__=="__main__":

    if get_iplist(appdomain) and len(iplist)>0:    #条件:域名解析正确且至少返回一个IP

        for ip in iplist:

            checkip(ip)

        else:

            print "dns resolver error"