from ftplib import FTP
import re
import sys,os

class ftputil(object):
    def __init__(self, host='127.0.0.1', port=21, user=None, passwd=None, timeout=60):
        self.host = host
        self.port = port
        self.user = user
        self.passwd = passwd
        self.timeout = timeout
        self.client = None
        self.path = '/'
        self.filelist = []
        self.result = []

    def login(self):
        self.client = FTP()
        if self.user is not None and self.passwd is not None:
            try:
                self.client.connect(self.host, self.port, self.timeout)
            except Exception as e:
                print "%s connect error" % self.host
                raise Exception("%s connect error" % self.host)

            try:
                self.client.login(self.user, self.passwd)
            except Exception as e:
                print "login fail: user: %s or password:%s is not correct!" % (self.user, self.passwd)
                raise Exception("login fail: user or password is not correct!")
        else:
            print "user or password is null!"
            raise Exception("user or password is null!")

    def opData(self, data):
        line = re.split(" +", data)
        # file: ('-rw-rw-rw-', '51455', 'taglist_46.zip','/test')
        file = (line[0], line[4], line[8], self.path)
        self.filelist.append(file)

    def getlist(self):
        self.filelist = []
        self.client.retrlines('LIST', self.opData)
        return self.filelist

    def chgdir(self, path=None):
        self.client.cwd(path)
        self.path = self.client.pwd()
        return self.path

    def ftplist(self, filelist):
        '''
        result: [(51455, 'taglist_46_zip', '/test'), (2307, 'vimrc', '/')]
        '''
        if filelist:
            for item in filelist:
                if item[2] == '.' or item[2] == '..':
                    continue
                

                if item[0][:1] == "-":
                     if not int(item[1]) == 0:
                          self.result.append((int(item[1]), item[2], item[3]))
                else:
                    self.chgdir(item[3]+"/"+item[2]))
                    filelist = self.getlist()
                    self.ftplist(filelist)
        return self.result

    def downfile(self, filepath, resvData):
        fp = open(resvData, 'wb')
        self.client.retrbinary("RETR %s" % filepath, fp.write)
        fp.close()

    def delfile(self, filepath):
        res_flag = False
        try:
            resp = self.client.delete(filepath)
            res_flag = True
        except Exception as e:
            resp = "Delete %s is Failed! " % filepath
            res_flag = False
            return resp + str(e)
        return res_flag, resp

    def close(self):
        self.client.close()