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. 時序圖
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)目錄結構
7.遇到的坑
配置文件中的用戶要和錄課PC中啓動sshd服務的用戶一直否則會報錯。
不要使用Administrator,使用名全是小寫的用戶,linux是嚴格區分大小寫的所以會出問題,ssh信任驗證過不去。
文件服務器要修改PATH路徑把cgywin的目錄放到默認目錄的前邊這樣可以優先使用cygwin的命令,或者只用全路徑。
配置計劃任務的時候的 ‘起始於’ 一定要寫腳本所在的目錄,否則會報錯。