python3自动化运维学习笔记(2)

文件差异对比方法

#pip加速命令如下:
pip3 install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com packagename # packagename是要下载的包的名字
pip3 install -i http://e.pypi.python.org --trusted-host e.pypi.python.org --upgrade pip # 升级pip

difflib模块(自带)
示例一:两个字符串的差异对比

# coding: utf-8
import difflib
text1 = '''text1:'''
text1 = '''text1:
222
2222
22222
add string
'''
text2 = '''text2:
222
2222
22222
'''
text1Lines = text1.splitlines()
text2Lines = text2.splitlines()
d = difflib.Differ()
diff = d.compare(text1Lines,text2Lines)
print('\n'.join(list(diff)))

符号含义说明:

‘-’		包含在第一个序列行,不在二
‘+’		包含在第二个序列行,不在一
‘’		两个序列行一致
‘?’		标志两个序列行存在增量差异
'^'		标志出两个序列行存在的差异字符

生成美观的HTML格式文档

text1Lines = text1.splitlines()
text2Lines = text2.splitlines()
#d = difflib.Differ()
#diff = d.compare(text1Lines,text2Lines)
#print('\n'.join(list(diff)))
d = difflib.HtmlDiff()
print(d.make_file(text1Lines,text2Lines))

事例二:对比nginx文件差异

# coding: utf-8
import difflib
import sys
try:
    textFile1='nginx01.txt'
    textFile2='nginx02.txt'
except Exception as e:
    print('Error:'+str(e))   
    sys.exit() 
def readfile(filename):
    try:
        fileHandle = open(filename)
        text=fileHandle.read().splitlines()
        fileHandle.close()
        return text
    except IOError as error:
        print('Read file error:'+str(error))
        sys.exit()
if textFile1=='' or textFile2=='':
    print('file is enpty.')
    sys.exit()
text1Lines=readfile(textFile1)
text2Lines=readfile(textFile2)
d = difflib.HtmlDiff()
print(d.make_file(text1Lines,text2Lines))

文件与目录差异对比方法
filecmp模块(自带)可以实现文件、目录、遍历子目录的差异对比功能。
模块常用方法说明:
cmp单文件对比:
filecmp.cmp(f1,f2[,shallow])shallow==True,只根据os.sstat()方法返回的文件基本信息进行对比,比如最后的访问时间、修改时间、状态改变时间等,会忽略文件内容的对比。当shallow为False时,则os.stat()与文件内容同时进行校验。

filecmp.cmp('f1','f3')
True
filecmp.cmp('f1','f2')
False

cmpfiles多文件对比:
filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,对比dir1和dir2目录给定的文件清单。该方法返回文件名的三个列表(匹配,不匹配,错误),错误列表包括了目录不存在文件、不具备读权限或其他原因导致的不能比较的文件清单。

md5sum *
#返回当前目录的MD5值
filecmp.cmpfiles('dir1','dir2',['f1','f2','f3','f4','f5'])

dircmp目录对比:
dircmp(a,b[,ignore[,hide]])类创建一个目录比较对象,其中a和b是参加比较的目录名。
ignore代表文件名忽略的列表,并默认为[‘RCS’,‘CVS’,‘tags’];
hide代表隐藏的列表,默认为[os.curdir,os.pardir]。
dircmp提供了三个输出报告的方法:

  • report(),比较当前指定目录中的内容。
  • report_partial_closure(),比较当前指定目录及第一级子目录中的内容。
  • report_full_closure(),递归比较所有指定目录的内容。

dircmp类还提供了以下属性:

  • left,左边目录
  • right,右边目录
  • left_list,左边目录中的文件及目录列表
  • right_list,右边目录中的文件及目录列表
  • common,两边目录共有的文件及目录列表
  • left_only只在左边目录中的文件或目录
  • right_only只在右边目录中的文件或目录
  • common_dirs两边目录都存在的子目录
  • common_files两边目录都存在的子文件
  • common_funny两边目录都存在的子目录(不同目录类型或os.stat()记录的错误)
  • same_files,匹配相同的文件
  • diff_files,不匹配的文件
  • funny_files,两边目录中都存在,但无法比较的文件
  • subdirs,将common_dirs目录名映射到新的dircmp对象,格式为字典类型。
import filecmp
a='/home/test/filecmp/dir1'
b='/home/test/filecmp/dir2'
dirObj=filecmp.dircmp(a,b,['test.py'])
dirObj.report()
dirObj.report_partial_closure()
dirObj.report_full_closure()
print str(dirObj.left_list)
print str(dirObj.right_list)
print str(dirObj.common)
print str(dirObj.left_only)
print str(dirObj.right_only)
print str(dirObj.common_dirs)
print str(dirObj.common_files)
print str(dirObj.common_funny)
print str(dirObj.same_files)
print str(dirObj.diff_files)
print str(dirObj.funny_files)

实践:校验源与备份目录差异

# coding: utf-8
import os,sys
import filecmp,re,shutil
holderlist=[]
def compareme(dir1,dir2):
    dircomp=filecmp.dircmp(dir1,dir2)
    only_in_one=dircomp.left_only
    diff_in_one=dircomp.diff_files
    dirpath=os.path.abspath(dir1)
    [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in only_in_one]
    [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:
        for item in dircomp.common_dirs:
            compareme(os.path.abspath(os.path.join(dir1,item)),\
            os.path.abspath(os.path.join(dir2,item)))
        return holderlist
def main():
    dir1='/home/datebase/dir1'
    dir2='/home/datebase/dir2'
    source_files=compareme(dir1,dir2)
    dir1 = os.path.abspath(dir1)
    if not dir2.endswith('/'):dir2=dir2+'/'
    dir2=os.path.abspath(dir2)
    destination_files=[]
    createdir_bool=False
    for item in source_files:
        destination_dir=re.sub(dir1,dir2,item)
        destination_files.append(destination_dir)
        if os.path.isdir(item):
            if not os.path.exists(destination_dir):
                os.makedirs(destination_dir)
                createdir_bool=True
    if createdir_bool:
        destination_files=[]
        source_files=[]
        source_files=compareme(dir1,dir2)
        for item in source_files:
            destination_dir=re.sub(dir1,dir2,item)
            destination_files.append(destination_dir)
    print('update item:')
    print(source_files)
    copy_pair=zip(source_files,destination_files)
    for item in copy_paair:
        if os.path.isfile(item[0]):
            shutil.copyfile(item[0],item[1])
if __name__=='__main__':
    main()

发送电子邮件模块smtplib

# coding: utf-8
import smtplib
import string
HOST = 'smtp.163.com'
SUBJECT = 'Test email from Python'
TO = "111@qq.com"
FROM = '222@163.com'
text = 'Python rules them all!'
BODY = '\r\n'.join("From: %s\nTo: %s \nSubject: %s \n%s"%(FROM,TO,SUBJECT,text))
server = smtplib.SMTP()
server.connect(HOST,'25')
server.starttls()
mypasswd=open('temp.txt').read()
server.login(FROM,mypasswd)
server.sendmail(FROM,[TO],BODY)#失败554错误
server.quit()

事例一:定制个性化的有间隔是方法

  • email.mime.audio.MIMEAudio(_audiodata[,_subtype[,**_params]]]),创建包含音频数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串。
  • email.mime.image.MIMEImage(_imagedata[,_subtype[,_encoder[,**_params]]]),创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。
  • email.mime.text.MIMEText(_text[,subtype[,charset]]),创建包含文本数据的邮件体,_text是包含信息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。
# coding: utf-8
import smtplib
from email.mime.text import MIMEText
HOST='smtp.163.com'
SUBJECT = u'IS a table'
TO = 'xx1@qq.com'
FROM='xx2@163.com'
htmlfile = open('sendmail.html').read()
msg = MIMEText(htmlfile,"html","utf-8")
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To'] = TO
passwd = open('temp.txt').read()
try:
    server = smtplib.SMTP()
    server.connect(HOST,'25')
    server.starttls()
    server.login(FROM,passwd)
    server.sendmail(FROM,TO,msg.as_string())
    server.quit()
    print('sussful')
except Exception as e:
    print('false')
#sendmail.html
<table width="800" border="0" cellspacing="0" cellpadding="4">
	<tr><td bgcolor="#CECFAD" height="20" style="font-size: 14px">官网数据</td><a href="monitor.domain.com">更多>></a>
	</tr>
	<tr>
		<td bgcolor="#EFEBDB" height="100" style="font-size: 13px">
			1)日访问量:<font color="red">152433</font>访问次数:23651<br>
			2)状态码信息<br>
			&nbsp;&nbsp;500:105<br>
			3)访问浏览器信息<br>
			&nbsp;&nbsp;IE:50%<br>
			4)页面信息<br>
			&nbsp;&nbsp;/index.php 42444<br>
			&nbsp;&nbsp;/view.php 23233<br>
			&nbsp;&nbsp;/login.php 2332<br>
		</td>
	</tr>
</table>

示例二:实现图文格式的服务器性能报表邮件。
#在img文件夹下方4张图片

# coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
HOST='smtp.163.com'
SUBJECT='Data report'
TO = '1772040722@qq.com'
FROM = 'become_hero1198@163.com'
passwd = open('passwd.txt').read()
htmlObj = open('simple3.html')
def addimg(src,imgid):
    fp = open(src,'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID',imgid)
    return msgImage
msg = MIMEMultipart('related')   
msgtext = MIMEText(htmlObj.read(),"html","utf-8")
msg.attach(msgtext)
msg.attach(addimg('img/test1.jpg','io'))
msg.attach(addimg('img/test2.jpg','men'))
msg.attach(addimg('img/test3.jpg','swap'))
msg.attach(addimg('img/test4.jpg','key_hit'))
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To']=TO
try:
    server = smtplib.SMTP()
    server.connect(HOST,'25')
    server.starttls()
    server.login(FROM,passwd)
    server.sendmail(FROM,TO,msg.as_string())
    server.quit()
    print('sussesful')
except Exception as e:
    print('Falsed'+str(e))  

示例二:实现图文格式的服务器性能报表邮件。
#增加附件

# coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
HOST = 'smtp.163.com'
SUBJECT = 'This is my report'
TO = '1772040722@qq.com'
FROM = 'become_hero1198@163.com'
def addimg(src,imgid):
    fp = open(src,'rb')
    msgImage = MIMEImage(fp.read())
    msgImage.add_header('Content-ID',imgid)
    return msgImage
    
msg = MIMEMultipart('related')
htmlObj = open('simple4.html','rb').read()
msgtext = MIMEText(htmlObj,"html","utf-8")
msg.attach(msgtext)
msg.attach(addimg('img/test1.jpg','weekly'))
attach = MIMEText(open('simple4.xlsx','rb').read(),'base64','utf-8')
attach["Content-Type"] = 'application/octet-stream'
#attach['Content-Disposition'] = "attachment;filename=\"myReport.xlsx\"".decode("utf-8").encode("gb18030")
msg.attach(attach)
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To'] = TO
passwd = open('passwd.txt').read()
try:
    server = smtplib.SMTP()
    server.connect(HOST,'25')
    server.starttls()
    server.login(FROM,passwd)
    server.sendmail(FROM,TO,msg.as_string())
    server.quit()
    print('sussesful')
except Exception as e:
    print('Falsed'+str(e))

探测web服务质量方法
问题一:安装报错

centos 安装pycurl
yum install python-devel curl-devel
pip3 install pycurl

问题二:导入pycurl报错问题:import pycurl
(1)源码安装curl(2)源码安装pycurl

wget http://curl.haxx.se/download/curl-7.63.0.tar.gz
tar -xvf curl-7.63.0.tar.gz#解压
cd curl.7.63.0#指定安装目录
./configure
make&&make install#编译安装
export LD_LIBRARY_PATH=/usr/local/bin#添加命令的环境变量
#在pypi上搜索pycurl,找到tar包
wget tar包路径 --no-check-certificate
cd pycurl-7.19.3.1
python3 setup.py install --curl-config=/usr/local/bin/curl-config

模块常用方法说明

  • close()关闭Curl对象。
  • perform()实现Curl对象请求的提交。
  • setopt(option,value)对应libcurl包中的curl_easy_setopt方法,参数option通过libcurl的常量来指定的,参数的值会依赖option。常用的常量列表:
pycurl.Curl()    #创建一个curl对象 
c.setopt(pycurl.CONNECTTIMEOUT,5)    #连接的等待时间,设置为0则不等待 
c.setopt(pycurl.TIMEOUT,5)    #请求超时时间 
c.setopt(pycurl.NOPROGRESS,0)    #是否屏蔽下载进度条,非0则屏蔽 
c.setopt(pycurl.MAXREDIRS,5)    #指定HTTP重定向的最大数 
c.setopt(pycurl.FORBID_REUSE,1)    #完成交互后强制断开连接,不重用 
c.setopt(pycurl.FRESH_CONNECT,1)    #强制获取新的连接,即替代缓存中的连接 
c.setopt(pycurl.DNS_CACHE_TIMEOUT,60)    #设置保存DNS信息的时间,默认为120秒 
c.setopt(pycurl.URL,"http://www.baidu.com")    #指定请求的URL 
c.setopt(pycurl.USERAGENT,"Mozilla/5.2(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50324)")#配置请求HTTP头的User-Agent 
c.setopt(pycurl.HEADERFUNCTION,getheader)    #将返回的HTTPHEADER定向到回调函数getheader 
c.setopt(pycurl.WRITEFUNCTION,getbody)    #将返回的内容定向到回调函数getbody 
c.setopt(pycurl.WRITEHEADER,fileobj)    #将返回的HTTPHEADER定向到fileobj文件对象 
c.setopt(pycurl.WRITEDATA,fileobj)    #将返回的HTML内容定向到fileobj文件对象
  • getinfo(option)
    常用的常量列表:
c=pycurl.Curl()    #创建一个curl对象 
c.getinfo(pycurl.HTTP_CODE)    #返回的HTTP状态码 
c.getinfo(pycurl.TOTAL_TIME)    #传输结束所消耗的总时间 
c.getinfo(pycurl.NAMELOOKUP_TIME)    #DNS解析所消耗的时间 
c.getinfo(pycurl.CONNECT_TIME)    #建立连接所消耗的时间 
c.getinfo(pycurl.PRETRANSFER_TIME)    #从建立连接到准备传输所消耗的时间 
c.getinfo(pycurl.STARTTRANSFER_TIME)    #从建立连接到传输开始消耗的时间 
c.getinfo(pycurl.REDIRECT_TIME)    #重定向所消耗的时间 
c.getinfo(pycurl.SIZE_UPLOAD)    #上传数据包大小 
c.getinfo(pycurl.SIZE_DOWNLOAD)    #下载数据包大小 
c.getinfo(pycurl.SPEED_DOWNLOAD)    #平均下载速度 
c.getinfo(pycurl.SPEED_UPLOAD)    #平均上传速度 
c.getinfo(pycurl.HEADER_SIZE)    #HTTP头部大小

我们利用这些常量来达到探测web服务服务质量的目的。
实践:实现探测web服务质量

# coding: utf-8
import os,sys,time,pycurl
URL='http://www.baidu.com'
c=pycurl.Curl()
c.setopt(pycurl.URL,URL)
c.setopt(pycurl.CONNECTTIMEOUT,5)
c.setopt(pycurl.TIMEOUT,5)
c.setopt(pycurl.NOPROGRESS,1)
c.setopt(pycurl.FORBID_REUSE,1)
c.setopt(pycurl.MAXREDIRS,1)
c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)
indexfile = open('content.txt','wb')
c.setopt(pycurl.WRITEHEADER,indexfile)
c.setopt(pycurl.WRITEDATA,indexfile)
try:
    c.perform()
except Exception as e:
    print('connection error:'+str(e))
    indexfile.close()
    c.close()
    sys.exit()
print('namelookup_time:%s'%(c.getinfo(c.NAMELOOKUP_TIME)))
print('connect_time:%s'%(c.getinfo(c.CONNECT_TIME)))
print(c.getinfo(c.PRETRANSFER_TIME))
print(c.getinfo(c.STARTTRANSFER_TIME))
print(c.getinfo(c.TOTAL_TIME))
print(c.getinfo(c.HTTP_CODE))
print(c.getinfo(c.SIZE_DOWNLOAD))
print(c.getinfo(c.HEADER_SIZE))
print(c.getinfo(c.SPEED_DOWNLOAD))
indexfile.close()
c.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值