系统性能信息模块psutil
1.pip安装,安装第三方模块出现问题:

#无法安装psutil
yum install python-devel.x86_64
yum install gcc
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com psutil

2.源码安装地址https://pypi.python.org,搜索psutil
获取系统性能信息
(1)CPU信息
linuxCPU利用率分为:

  • User Time
  • System Time
  • Wait Io
  • Idle
import psutil
psutil.cpu_times()#获取cpu完整信息,percpu=True逻辑cpu
psutil.cpu_times().user#User Time,用户cpu时间比
38.0
psutil.cpu_count()#cpu逻辑个数
psutil.cpu_count(logical=False)#cpu物理个数

(2)内存信息
total(内存总数),used(已使用),free(空闲),buffers(缓冲使用数),cache(缓存使用数)
psutil.virtual_memory()#完整内存信息
psutil.swap_memory()#获取swap分区信息

import psutil
mem = psutil.virtial_memory()
mem.total
mem.free
psutil.swap_memory()

(3)磁盘信息
磁盘利用率:psutil.disk_usage()
IO信息:psutil.disk_io_counters()
read_count,write_count—读写IO数
read_bytes,write_bytes—IO读写字节数
read_time,write_time—磁盘读写时间

psutil.disk_partitions()#完整磁盘信息
psutil.disk_usage('/')#此分区的磁盘使用情况
psutil.disk_io_counters()#硬盘总的IO个数和读写信息
psutil.disk_io_counters(perdisk=True)#获取每个磁盘更详细信息

(4)网络信息
psutil.net_io_counters()
bytes_sent=,bytes_recv=—发送接收字节数
packets_sent=,packets_recv=—发送接收数据包数

psutil.net_io_counters()

(5)其他系统信息

#当前登录的用户信息
psutils.users()
#开机时间,时间戳转化为时间
temp = psutil.boot_time()
import datetime
datetime.datetime.fromtimestamp(temp)

系统进程管理方法
(1)进程信息
psutil.pids()—所有进程PID
psutil.Process()—获取单个进程名称,路径,状态,系统资源利用率等

psutil.pids()
p = psutil.Process(2424)
p.name()#进程名
p.exe()#路径
p.status()#状态
p.create_time()
p.uids()#使用用户
p.gids()#使用用户组
p.cpu_times()
p.memory_percent()#内存利用率
p.io_counters()#IO读写和字节数
p.connections()#打开socker的namedutples列表
p.num_threads()#开启的线程数

(2)popen类的使用
获取用户启动的应用程序的进程信息
popen启动方法可以跟踪应用程序信息

from subprocess import PIPE
p = psutil.Popen(["/usr/bin/python3","-c","print('hello')"],stdout=PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times()

实用的IP地址处理模块IPy
安装方式:pip安装

IP地址、网段的基本处理

from IP import IPy
IP('10.0.0.0/8').version()
4 #ipv4
IP('::1').version()
6 #ipv6
#输出该网段的IP个数和所有IP地址
ip = IP('192.168.0.0/16')
len(ip)
for x in ip:print(x)

ip1 = IP('192.168.1.20')
ip1.reverseNames()#反向解析地址格式
ip1.iptype()#PRIVATE
ip2 = IP('8.8.8.8')
ip2.iptype()#PUBLIC
ip2.int()
ip2.strHex()#16进制
ip2.strBin()#2进制

IP与子网掩码转化成同样的格式

IP('192.168.1.0').make_net('255.255.255.0')
IP('192.168.1.0/255.255.255.0',make_net=True)
IP('192.168.1.0-192.168.1.255',make_net=True)
IP('192.168.1.0/24')

IP与子网掩码转化成不同的格式
wantprefixlen取值0,1,2,3。

ip = IP('192.168.1.0/24')
ip.strNormal(0)#无返回
'192.168.1.0'
ip.strNormal(1)#prefix格式
'192.168.1.0/24'
ip.strNormal(2)#decimalnetmask格式
'192.168.1.0/255.255.255.0'
ip.strNormal(3)#lastIP格式
'192.168.1.0-192.168.1.255'

多网络计算方法详解
即使prefixlen相同:10.0.0.0/16 192.0.0.0/16 不相同
即使prefixlen不相同:10.0.0.0/16 与 10.0.0.0/24不相同
大小比较

IP('10.0.0.0/24')<IP('12.0.0.0/24')

是否包含于另一个网段中

'192.168.1.100' in IP('192.168.1.0/24')
True
IP('192.168.1.0/24') in IP('192.168.0.0/16')
True

是否重叠overlaps()

IP('192.168.0.0/23').overlaps('192.168.1.0/24')
1
IP('192.168.1.0/24').overlaps('192.168.2.0')
0

实例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息.

# coding: utf-8
from IPy import IP
ip_s = input('Please input an IP or net-range: ')
ips = IP(ip_s)
ips
if len(ips) > 1:
    print('net: %s'% ips.net())
    print('netmask: %s'% ips.netmask())
    print('broadcast: %s' % ips.broadcast())
if len(ips) > 1:
    print('net: %s'% ips.net())
    print('netmask: %s'% ips.netmask())
    print('broadcast: %s' % ips.broadcast())
    print('reverse address: %s' % reverseNames()[0])
    print('subnet: %s' % len(ips))
else:
    print('reverse address: %s' % ips.reverseNames()[0])    
print('hexDecimal: %s' % ips.strHex())
print('binary ip: %s' % ips.strBin())
print('iptype: %s' % ips.iptype())

DNS处理模块dnspython
安装方式:pip安装
模块域名解析方法详解
dnspython模块提供了大量的DNS处理方法,最常用的方法是域名查询。
dnspython提供了一个DNS解析器类–resolver,使用它的query方法来实现域名的查询功能。
query方法的定义如下:

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

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

  • A记录,将主机名转换成IP地址;
  • MX记录,右键交换记录,定义邮件服务器的域名;
  • CNAME记录,指别名记录,实现域名间的映射;
  • NS记录,标记区域的域名服务器及授权子域;
  • PTR记录,反向解析,与A记录相反,将IP转换为主机名;
  • SOA记录,SOA标记,一个起始授权区的定义。
    rdclass参数用于指定网络类型,可选IN(默认)、CH、HS。
    tcp参数用于是否启用tcp协议,默认False。
    source、source_port指定查询源地址与端口,默认为查询设备IP地址和0。
    raise_on_no_answer指定当查询无应答是是否触发异常,默认False。

常见解析类型实例说明
dns.resolver.query方法可以简单实现这些DNS类型的查询。
(1)A记录
作用: 将字典类型转换为可遍历的元组
用法: dict.items()
for key,values in dict.items():print(key,values)

#simple1.py
import dns.resolver
domain = 'www.baidu.com'#输入一个域名
A = dns.resolver.query(domain,'A')  
for i in A.response.answer:#返回的i=www.baidu.com 393 IN CNAME www.a.shifen.com
    for j in i.items:#取出dict的键
        print(j)
       	#j.address错误

(2)MX记录查询(eg:baidu.com)

#simple2.py
import dns.resolver
domain = 'baidu.com'
MX = dns.resolver.query(domain, 'MX')
for i in MX:#返回的i==20 jpmx.baidu.com
	print(i)
	#i.exchange错误

(3)NS记录查询

#simple3.py
import dns.resolver
domain = '163.com'
ns = dns.resolver.query(domain, 'NS')
for i in ns.response.answer:
	for j in i.items:
		print j.to_text()

(4)CNAME记录查询

#simple4.py
import dns.resolver
domain = 'www.baidu.com'
cname = dns.resolver.query(domain, 'CNAME')
for i in cname.response.answer:
	for j in i.items:
		print j.to_text()

DNS域名轮询业务监控

import dns.resolver
import os
import httplib2
iplist=[] #定义域名IP列表变量
appdomain="www.baidu.com" #定义业务域名
def get_iplist(domain=""): #域名解析函数,解析成功IP将追加到iplist
	try:
		A = dns.resolver.query(domain, 'A') #解析A记录类型
	except Exception as e:
		print "dns resolver error:"+str(e)
		return
	for i in A.response.answer:
		for j in i.items:
			iplist.append(j.address) #address错误
	return True
def checkip(ip):
	checkurl=ip+":80"
	getcontent=""
	httplib2.socket.setdefaulttimeout(5) #定义http连接超时时间(5秒)
	conn=httplib2.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>": #监控URL页的内容一般是事先定义好,比如“HTTP200”等
		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)#检查IP是否正常
		else:
			print "dns resolver error."