使用python腳本配合cygwin自動備份文件搭配文件服務器

1. 需求

   公司是做在線教育的,所以老師的錄課視頻是很重要的文件。需要把視頻從錄課的PC每天同步到文件服務器,並保證文件文件的完整性。

2. 文件同步軟件選擇

   最開始使用的是allway sync。同步速度還不錯,大概11m左右,但是有是會同步失敗,使用計劃任務不是每次都能成功。還有一個問題就是用的太頻繁就提示授權,沒有找到什麼好的破解。

   第二個軟件是freefilesync。免費軟件,使用sftp協議,缺點是速度太慢2m左右,而且因爲是win的服務器所以需要安裝ssh軟件打開22端口。而且也有同步失敗的問題。

   在測試freefilesync的時候發現了cygwin這個神器,後開乾脆考慮是不是使用cygwin的rsync配合計劃任務同步視頻文件。測試結果很滿意速度16m左右,配合計劃任務使用了兩週左右沒有發現同步失敗的現象。

3. 環境要求

   文件服務器安裝cygwin,並安裝openssh和rsync服務

   錄課PC安裝cygwin並安裝openssh服務,打開22端口

   配置錄課室ssh信任文件服務器

   怎麼使用cygwin並打開openssh百度資料有不少很容易找到

4. python腳本介紹

   其實腳本比較簡單大概分爲主文件、日誌函數、郵件函數以及配置文件幾部分。使用計劃任務定期執行,可以做到自動同步文件,判斷同步執行與否,執行結果寫入日誌,執行不成功發郵件給運維人員排查故障。

5. 時序圖

image

6. 腳本源碼及說明

1)主文件

#!/usr/bin/env python
#coding:utf-8
#auther:Bran Guo
#date:11/07/2015 
#description:視頻文件同步腳本,添加定時任務後自動運行
#version:V1.0

import os,ConfigParser,logger

conf = ConfigParser.ConfigParser()
conf.read("bakconf.ini")

dst_user = conf.get('destination','dst_user')
dst_ip = conf.get('destination','dst_ip')
dst_dir = conf.get('destination','dst_dir')
src_dir = conf.get('source','src_dir')

ret = os.system('rsync  -Paz %s@%s:%s %s' %(dst_user,dst_ip,dst_dir,src_dir))
logger.logger(ret)
os.system('chmod -R 777 %s/* ' % src_dir)
exit()

   特別簡單的一個腳本就是使用configparser讀取配置文件然後使用rsync同步目錄,最後修改權限和寫日誌。

2)日誌文件

#!/usr/bin/python

import datetime,os,ConfigParser,sendmail

conf = ConfigParser.ConfigParser()
conf.read("bakconf.ini")
dst_ip = conf.get('destination','dst_ip')
bak_log = conf.get("log_file","bak_log")
sender = conf.get('mail','sender')
receiver = conf.get('mail','receiver')
subject = conf.get('mail','subject')
smtpserver = conf.get('mail','smtpserver')
username = conf.get('mail','username')
password = conf.get('mail','password')

def logger(ret):
	if ret == 0:
		echo_line = "%s\tBackup video file succes\n" % datetime.datetime.now()
	else:
		echo_line = "%s\tBackup video file failed, plz check.\n" % datetime.datetime.now()
		sendmail.sendmail(sender,receiver,subject,smtpserver,username,password,echo_line,dst_ip)
	f = file(bak_log,'a')
	f.write(echo_line)
	f.flush()
	f.close()

   同樣的讀取配置文件,然後通過主文件傳給的ret參數盤算命令執行結果,然後做相應的操作。從sender到password的參數是郵件的配置參數。

3)郵件文件

import smtplib,datetime
from email.mime.text import MIMEText

def sendmail(sender,receiver,subject,smtpserver,username,password,content,dsthost):
	time = str(datetime.datetime.now)
	msg = MIMEText(
	'''
	
	<body>  
	HOST: %s <br/>
	DESCRIPON: %s <br/>
	</body>
	<pre>
	''' %(dsthost,content),'html','ascii') 
	msg['From'] = sender
	msg['To'] = receiver
	msg['Subject'] = subject
	smtp = smtplib.SMTP()  
	smtp.connect('smtp.exmail.qq.com')  
	smtp.login(username, password)  
	smtp.sendmail(sender, receiver, msg.as_string())  
	smtp.quit()

   使用smtplib模塊的函數,所有參數都是在logger中讀取的配置文件賦值的,msg是郵件內容。

4)配置文件

[source]
src_dir = /cygdrive/d/video

[destination]
dst_user =  destination host username
dst_ip = destination ip address
dst_dir = /cygdrive/d/video/

[log_file]
bak_log = backuplog.txt

[mail]
sender = [email protected]
receiver = [email protected]
subject = backup video failed
smtpserver = smtp.exmail.qq.com
username = [email protected] 
password = password

   配置文件需要注意的地方就是源路徑和目的路徑要是使用/cygdrive/d/video而不要用windows風格的d:\video。    

5)目錄結構

  image

7.遇到的坑

   配置文件中的用戶要和錄課PC中啓動sshd服務的用戶一直否則會報錯。

   不要使用Administrator,使用名全是小寫的用戶,linux是嚴格區分大小寫的所以會出問題,ssh信任驗證過不去。

   文件服務器要修改PATH路徑把cgywin的目錄放到默認目錄的前邊這樣可以優先使用cygwin的命令,或者只用全路徑。

   配置計劃任務的時候的 ‘起始於’ 一定要寫腳本所在的目錄,否則會報錯。

     image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章