python自動化運維二:業務服務監控

一文件比較:html

在實際維護過程當中,涉及到許多文件對比的操做。在Linux下,自帶diff命令,比較兩個文件的結果以下。python

其中a,d,c分別表示添加,刪除,及修改操做。1,2c1,2中的1,2表明的是行號。從diff這個命令來看,其實不太直觀。web

咱們用python中自帶的difflib模塊來作下對比:用一樣的兩段文本瀏覽器


import difflib服務器


if __name__=="__main__":運維

text1="""text1:curl

This module provides classes and functions for comparing sequences.ide

including HTML and context and unified diffs函數

difflib document v7.4"""工具

text1_lines=text1.splitlines()

text2="""test2:

This module provides classes and functions for Comparing sequences.

including HTML and context and unified diffs

difflib document v7.5"""

text2_lines=text2.splitlines()

d=difflib.Differ()

diff=d.compare(text1_lines,text2_lines)

print '\n'.join(list(diff))

運行結果:

- text1:

+ test2:

- This module provides classes and functions for comparing sequences.

? ^


+ This module provides classes and functions for Comparing sequences.

? ^


including HTML and context and unified diffs

- difflib document v7.4

? ^


+ difflib document v7.5

? ^

其中-表明包含在第一個序列行中,但不包含在第二個序列行。

+包含在第二個序列行中,但不包含在第一個序列行

‘’兩個序列行 一致

?’兩個序列行存在增量差別

^’兩個序列行存在的差別字符。

difflib的對比結果比diff中的更直觀一些。咱們還能夠將結果更加美化一下。輸出一個HTML文檔


代碼修改成:

d=difflib.HtmlDiff()

print d.make_file(text1_lines,text2_lines)

make_file獲得的是html代碼。將代碼copy到文件中。打開獲得的結果以下:

 

 

 

 

 

 

 

 

 

下面來介紹另外一個比較模塊:filecmp

當進行代碼文件審查時,每每要檢查原始與目標文件的一致性。包括修改時間,訪問時間等等。這裏就要用到filecmp

1 首先來看下單文件對比:

def file_cmp_try():

print 'test os.stat result %s' % os.stat('/home/zhf/zhf/test.txt') #打印出os.stat的結果

print 'test1 os.stat result %s' % os.stat('/home/zhf/zhf/test1.txt')

print filecmp.cmp('/home/zhf/zhf/test.txt','/home/zhf/zhf/test1.txt')



if __name__=="__main__":

file_cmp_try()


test os.stat result posix.stat_result(st_mode=33204, st_ino=6036599L, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=145L, st_atime=1501998994, st_mtime=1501998985, st_ctime=1501998986) #testos.stat結果


test1 os.stat result posix.stat_result(st_mode=33204, st_ino=6037307L, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=154L, st_atime=1501998992, st_mtime=1501998920, st_ctime=1501998920) #test1os.stat結果

False

cmp會根據os.stat的結果來進行比較,若是相等則會返回True,不相等則返回False。 另外cmp還有一個參數shallow. 這個參數默認爲True表示不對文件內容進行對比。若是爲False 則會對文件內容也進行比較。


2 多文件對比filecmp.cmpfiles

def file_cmp_try():

print filecmp.cmpfiles('/home/zhf/zhf','/home/zhf/zhf/python_prj',['test.txt','chapter1.py'])



if __name__=="__main__":

file_cmp_try()

結果爲3個列表,分別表示匹配,不匹配,錯誤。錯誤列表包括了目錄中不存在的文件,不具有讀權限或其餘緣由致使的不能比較的文件清單。從下面的結果來看都是在錯誤的列表。緣由在於/home/zhf/zhf/python_prj中並無包含chapter1.py

([], [], ['test.txt', 'chapter1.py'])


3目錄比較:

tree命令能夠直觀的查看文件路徑的結構,可是不能進行對比輸出

def file_cmp_try():

dir_ret=filecmp.dircmp('/home/zhf/zhf/python_prj','/home/zhf/zhf/python_source')

print dir_ret.report()


if __name__=="__main__":

file_cmp_try()

輸出結果:report 中輸出了哪些是路徑下特有的文件。

diff /home/zhf/zhf/python_prj /home/zhf/zhf/python_source

Only in /home/zhf/zhf/python_prj : ['auto_manintance', 'test.py']

Only in /home/zhf/zhf/python_source : ['Django-1.10.3', 'Django-1.10.3.tar.gz', 'curl-7.36.0', 'curl-7.36.0.tar.gz', 'dnspython-1.9.4', 'dnspython-1.9.4.tar.gz', 'psutil-2.0.0', 'psutil-2.0.0.tar.gz', 'pycurl-7.19.3.1', 'pycurl-7.19.3.1.tar.gz', 'scapy-2.2.0', 'scapy-2.2.0.tar.gz']

None

 二:發送 郵件

電子郵件是如今工做中不可缺乏的工具。在自動化和運維上,也經常用郵件來發送告警信息,業務質量報表等。電子郵件的協議主要有SMTPPOP3

SMTP 的全稱是「Simple Mail Transfer Protocol」,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址傳輸郵件的規範,經過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。


POP3Post Office Protocol 3的簡稱,即郵局協議的第3個版本,它規定怎樣將我的計算機鏈接到Internet的郵件服務器和下載電子郵件的電子協議。它是因特網電子郵件的第一個離線協議標準,POP3容許用戶從服務器上把郵件存儲到本地主機(即本身的計算機)上,同時刪除保存在郵件服務器上的郵件,而POP3服務器則是遵循POP3協議的接收郵件服務器,用來接收電子郵件的

看了上面的介紹。能夠看出SMTP是發送郵件的,POP3是接受郵件的。首先來看下python發送郵件的幾個步驟和調用的模塊。python調用smtplib模塊來進行郵件發送。

主要是下面的幾個步驟:

1 SMTP.connect(host,port): 遠程鏈接smtp主機,其中host爲主機地址,port爲端口。這個主機地址不是咱們在瀏覽器中輸入的mail.163.com這種地址,而是像smtp.163.com或者smtp.qq.com. 端口都是默認的25

2 SMTP.login(user,password):參數爲用戶名和密碼

3 SMTP.sendmail(from_addr,to_addr, msg): 其中from_addr是發件人,to_addr是收件人。msg是郵件正文。

4 SMTP.quit():斷開smtp服務器的鏈接。

來看一個具體的實例:

def send_email():

server='smtp.163.com'

from_addr='maple412@163.com'

to_addr='179039149@qq.com'

username='xxxxx

password='xxxxx'

subject='python send email test'

content='just for test'

msg=MIMEText(content)

msg['Subject']=Header(subject)

msg['From']=from_addr

msg['To']=to_addr #能夠是多個收件地址,每一個地址間用,分開便可

smtp=smtplib.SMTP()

smtp.connect(server)

smtp.login(username,password)

smtp.sendmail(from_addr,to_addr,msg.as_string())

查看郵件,收到一封來自163的郵件

上面的郵件只是發送的一個普通的文本字符。若是咱們想發送一個網頁版的該如何操做呢。其實只須要修改下MIMEText中的內容便可。總共須要兩次代碼須要修改。將網頁代碼復給content

content='''<html><body><h1>Hello python</h1><p>send by <a href="http://www.python.org">python</a></p></body></html>

'''

msg=MIMEText(content,'html') #MIMEText中第二個參數賦值爲html。參數默認爲plain.

郵件效果以下圖:

接下來再看下郵件中帶附件:帶附件的郵件能夠被看作包含若干部分的郵件。文本和各個附件自己。因此能夠構造一個MIMEMultipart來表明郵件。而後往裏面加上一個MIMEText做爲郵件正文。再繼續往裏面加上表示附件的MIMEApplication對象就能夠了

server='smtp.163.com'

from_addr='maple412@163.com'

to_addr='179039149@qq.com'

username='xxxxxxx'

password='xxxxxxx'

subject='python send email test'

msg=MIMEMultipart() #在這裏,msg是一個多部分組成的

msg['Subject']=subject

msg['From']=from_addr

msg['To']=to_addr

att1=MIMEApplication(open('/home/zhf/zhf/test.txt','rb').read())

att1.add_header('Content-Disposition','attachment',filename='test.txt')

msg.attach(att1)

try:

smtp=smtplib.SMTP()

smtp.connect(server)

smtp.login(username,password)

smtp.sendmail(from_addr,to_addr,msg.as_string())

smtp.quit()

except BaseException,e:

print e

效果以下。


固然 也能夠既然發送截圖,有發送正文。只須要另外再加上一個MIMEText就能夠了:

att2=MIMEText(content,'html')

msg.attach(att2)

一樣的這個附件能夠是XLSX,jpg以及MP3的文件。

在定製報表的時候,常常在郵件正文中發送圖片。咱們來看下這是如何實現的:

def send_email_with_picture():

server='smtp.163.com'

from_addr='maple412@163.com'

to_addr='179039149@qq.com'

username='xxxxxxxxx'

password='xxxxxxxxx'

subject='python send email test'

content='''<html><body><h1>Hello python</h1><img src="cid:io"></body></html>

'''

#在網頁代碼中,src=」cid:io」,網頁中嵌入圖片是經過cid來索引到具體的圖片,在這裏cid引用的是io的圖片。

msg=MIMEMultipart()

msg['Subject']=subject

msg['From']=from_addr

msg['To']=to_addr

p=open('/home/zhf/Pictures/1.jpg','rb')

msgimage=MIMEImage(p.read()) #建立一個圖片對象

p.close()

msgimage.add_header('Content-ID','io') #在這裏設置圖片對象的cidio. 便於被網頁代碼引用

msg.attach(msgimage)

msgtext=MIMEText(content,'html','utf-8')

msg.attach(msgtext)

try:

smtp=smtplib.SMTP()

smtp.connect(server)

smtp.login(username,password)

smtp.sendmail(from_addr,to_addr,msg.as_string())

smtp.quit()

except BaseException,e:

print e

效果以下:

最後介紹一個web監控函數:pycurl. 這至關於Linux命令curlpython實現

def web_detect_function():

url="www.sina.com.cn"

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)

#setopt是設置各項下載的參數

try:

c.perform()

except Exception,e:

print e

NAMELOOKUP_TIME=c.getinfo(c.NAMELOOKUP_TIME)

CONNECT_TIME=c.getinfo(c.CONNECT_TIME)

TOTAL_TIME=c.getinfo(c.TOTAL_TIME)

HTTP_CODE=c.getinfo(c.HTTP_CODE)

HEADER_SIZE=c.getinfo(c.HEADER_SIZE)

SPEED_DOWNLOAD=c.getinfo(c.SPEED_DOWNLOAD)

#getinfo是獲得網頁瀏覽的各項參數

print 'NAMELOOKUP TIME:%d' % NAMELOOKUP_TIME

print 'CONNECT TIME:%d' % CONNECT_TIME

print 'TOTAL TIME:%d' % TOTAL_TIME

print 'HTTP_CODE:%s' % HTTP_CODE

print 'HEADER_SIZE:%d' % HEADER_SIZE

print 'SPEED_DOWNLOAD:%d' % SPEED_DOWNLOAD

c.close()


運行結果:

NAMELOOKUP TIME:0

CONNECT TIME:0

TOTAL TIME:0

HTTP_CODE:200

HEADER_SIZE:709

SPEED_DOWNLOAD:1145386

相關文章
相關標籤/搜索