#!/usr/bin/python  
#coding=gbk  
''''' 
    ftp自动下载、自动上传脚本,可以递归目录操作 
''' 
 
from ftplib import FTP
from functools import partial
import os,sys,string,datetime,time
import Tkinter
import socket  
 
class MYFTP:  
    def __init__(self, hostaddr, username, password, remotedir, port=21):  
        self.hostaddr = hostaddr  
        self.username = username  
        self.password = password  
        self.remotedir  = remotedir  
        self.port     = port  
        self.ftp      = FTP()  
        self.file_list = []  
        # self.ftp.set_debuglevel(2)  
    def __del__(self):  
        self.ftp.close()  
        # self.ftp.set_debuglevel(0)  
    def login(self):  
        ftp = self.ftp  
        try:   
            timeout = 10 
            socket.setdefaulttimeout(timeout)  
            ftp.set_pasv(True)  
            print '开始连接到 %s' %(self.hostaddr)  
            ftp.connect(self.hostaddr, self.port)  
            print '成功连接到 %s' %(self.hostaddr)  
            print '开始登录到 %s' %(self.hostaddr)  
            ftp.login(self.username, self.password)  
            print '成功登录到 %s' %(self.hostaddr)  
            debug_print(ftp.getwelcome())  
        except Exception:  
            deal_error("连接或登录失败")
        try:  
            ftp.cwd(self.remotedir)  
        except(Exception):
            deal_error('切换目录失败')  
 
    def is_same_size(self, localfile, remotefile):  
        try:  
            remotefile_size = self.ftp.size(remotefile)  
        except:  
            remotefile_size = -1 
        try:  
            localfile_size = os.path.getsize(localfile)  
        except:  
            localfile_size = -1 
        debug_print('lo:%d  re:%d' %(localfile_size, remotefile_size),)  
        if remotefile_size == localfile_size:  
            return 1 
        else:  
            return 0 
    def download_file(self, localfile, remotefile):  
        if self.is_same_size(localfile, remotefile):  
            debug_print('%s 文件大小相同,无需下载' %localfile)  
            return 
        else:  
            debug_print('>>>>>>>>>>>>下载文件 %s ... ...' %localfile)  
        #return  
        file_handler = open(localfile, 'wb')  
        self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)  
        file_handler.close()  
 
    def download_files(self, localdir='./', remotedir='./'):  
        try:  
            self.ftp.cwd(remotedir)  
        except:  
            debug_print('目录%s不存在,继续...' %remotedir)  
            return 
        if not os.path.isdir(localdir):  
            os.makedirs(localdir)  
        debug_print('切换至目录 %s' %self.ftp.pwd())  
        self.file_list = []  
        self.ftp.dir(self.get_file_list)  
        remotenames = self.file_list  
        #print(remotenames)  
        #return  
        for item in remotenames:  
            filetype = item[0]  
            filename = item[1]  
            local = os.path.join(localdir, filename)  
            if filetype == 'd':  
                self.download_files(local, filename)  
            elif filetype == '-':  
                self.download_file(local, filename)  
        self.ftp.cwd('..')  
        debug_print('返回上层目录 %s' %self.ftp.pwd())  
    def upload_file(self, localfile, remotefile):  
        if not os.path.isfile(localfile):
            print '本地文件不存在'
            return 
        if self.is_same_size(localfile, remotefile):  
            debug_print('跳过[相等]: %s' %localfile)  
            return 
        file_handler = open(localfile, 'rb')
        print '打开本地文件'
        print '开始上传:'
        self.ftp.storbinary('STOR %s' %remotefile, file_handler)
        print '上传完毕'
        file_handler.close()  
        debug_print('已传送: %s' %localfile)  
    def upload_files(self, localdir='./', remotedir = './'):  
        if not os.path.isdir(localdir):  
            return 
        localnames = os.listdir(localdir)  
        self.ftp.cwd(remotedir)  
        for item in localnames:  
            src = os.path.join(localdir, item)  
            if os.path.isdir(src):  
                try:  
                    self.ftp.mkd(item)  
                except:  
                    debug_print('目录已存在 %s' %item)  
                self.upload_files(src, item)  
            else:  
                self.upload_file(src, item)  
        self.ftp.cwd('..')  
 
    def get_file_list(self, line):  
        ret_arr = []  
        file_arr = self.get_filename(line)  
        if file_arr[1] not in ['.', '..']:  
            self.file_list.append(file_arr)  
              
    def get_filename(self, line):  
        pos = line.rfind(':')  
        while(line[pos] != ' '):  
            pos += 1 
        while(line[pos] == ' '):  
            pos += 1 
        file_arr = [line[0], line[pos:]]  
        return file_arr
   
def debug_print(s):  
    print (s)
   
def deal_error(e):  
    timenow  = time.localtime()  
    datenow  = time.strftime('%Y-%m-%d', timenow)  
    logstr = '%s 发生错误: %s' %(datenow, e)  
    debug_print(logstr)  
    file.write(logstr)  
    sys.exit()  

#获取指定文件夹下所有文件及文件夹
def listdir(dir_path):
    if os.path.exists(dir_path):
        return os.listdir(dir_path)
    else:
        return '目录' + dir_path + '不存在'

def put_rru():
    hostaddr = '200.51.1.17' # ftp地址  
    username = 'zte' # 用户名  
    password = 'zte' # 密码  
    port  =  21   # 端口号
   
    #获取本地文件的路径,先获取文件名,再与文件夹路径合并
    file_dir_local = 'D:\putcpu\\rru'
    file_name = listdir(file_dir_local)
    rootdir_local = file_dir_local + '\\' + str(file_name[0])
    #rootdir_local = 'D:\putcpu\\rru\\aaa.txt'
    rootdir_remote = './ata/rru/ddd.txt'
   
    f = MYFTP(hostaddr, username, password, rootdir_remote, port)  
    f.login()    
    #ftp上传文件
    f.upload_file(rootdir_local, rootdir_remote)

def put_cc():
    print 'not yet!'

if __name__ == '__main__':
   
    root = Tkinter.Tk()
   
    file = open("log.txt", "a")  
    timenow  = datetime.datetime.now()
    #datenow  = time.strftime('%Y-%m-%d, timenow)  
    logstr = "  %s 开始执行备份:\n" %timenow
    debug_print(logstr)
    # 配置如下变量  
#    hostaddr = '192.254.1.1' # ftp地址  
#    username = 'test' # 用户名  
#    password = 'test' # 密码  
#    port  =  21   # 端口号    

    #获取本地文件的路径,先获取文件名,再与文件夹路径合并
#    file_dir_local = 'D:\putcpu'
#    file_name = listdir(file_dir_local)
#    rootdir_local = file_dir_local + '\\' + str(file_name[0])
    #rootdir_local = 'D:\putcpu\\rru\\aaa.txt'
#    rootdir_remote = './ata/ddd.txt'
   
#    f = MYFTP(hostaddr, username, password, rootdir_remote, port)  
#    f.login()    
#    #ftp上传文件
#    f.upload_file(rootdir_local, rootdir_remote)

    MyButton = partial(Tkinter.Button, root, fg='white', bg='blue')
    b1 = MyButton(text='put rru!', bg = 'blue', command = put_rru)
    b2 = MyButton(text='put cc!', bg = 'blue', command = put_cc)
    qb = MyButton(text='QUIT', bg='red', command=root.quit)
    b1.pack()
    b2.pack()

    qb.pack(fill=Tkinter.X, expand=True)
    root.title('putcpu!')
    root.mainloop()
   
    timenow  = datetime.datetime.now()
    #datenow  = time.strftime('%Y-%m-%d', timenow)  
    logstr = "  %s 成功执行了备份\n" %timenow  
    debug_print(logstr)  
      
    file.write(logstr)  
    file.close()