class SshHandler(object): def __init__(self, user, password, host, port, remote_dir, backup_folder_mirror, backup_folder_diff, backup_folder_archive, logger = None): self.logger = logger or MyLogger() self.user = user self.password = password self.host = host self.port = port self.remote_dir = remote_dir self.backup_folder_mirror = backup_folder_mirror self.backup_folder_diff = backup_folder_diff self.backup_folder_archive = backup_folder_archive self.paramiko = None self.stat = None self.BackupUtils = BackupUtils() self.paramiko = __import__('paramiko') self.sftpHandler = SFtpHandler(logger) #self.pexpect = __import__('pexpect') """ Basic function to be called to do mirroring """ def doMirror(self): s = self.paramiko.SSHClient() s.set_missing_host_key_policy(self.paramiko.AutoAddPolicy()) s.connect(self.host,self.port,username=self.user,password=self.password,timeout=4) sftp = s.open_sftp() self.sftpHandler.sftpWalk(sftp, self.remote_dir, self.remote_dir, self.backup_folder_mirror) sftp.close() s.close() def doDiff(self): self.BackupUtils.doRdiffBackupCall(self.backup_folder_mirror, self.backup_folder_diff) def doBackup(self): # Generate monthly archive name current_year, current_month = self.BackupUtils.returnBasicDateInfo() monthly_archive = self.retriveMonthlyArchive(current_year, current_month) print monthly_archive snapshot_date = "%04d-%02d-01" % (current_year, current_month) self.BackupUtils.doBackup(monthly_archive, snapshot_date, self.backup_folder_diff, self.backup_folder_archive) def retriveMonthlyArchive(self, currentYear, currentMonth): return self.BackupUtils.returnFormatedMonthlyArchive(self.backup_folder_archive, currentYear, currentMonth)
class FtpHandler(object): def __init__(self, user, password, host, port, remote_dir, is_ftps, backup_folder_mirror, backup_folder_diff, backup_folder_archive, logger = None): self.logger = logger or MyLogger() self.user = user self.password = password self.host = host self.port = port self.remote_dir = remote_dir self.is_ftps = is_ftps self.backup_folder_mirror = backup_folder_mirror self.backup_folder_diff = backup_folder_diff self.backup_folder_archive = backup_folder_archive self.urllib = __import__('urllib') self.paramiko = None self.stat = None self.BackupUtils = BackupUtils() self.sftpHandler = None self.ftputil = None if self.is_ftps: self.paramiko = __import__('paramiko') self.stat = __import__('stat') self.os = __import__('os') self.sftpHandler = SFtpHandler(logger) else: self.ftputil = __import__('ftputil') """ Basic function to be called to do mirroring """ def doMirror(self): remote_url = "ftp://%s:%s@%s:%s/%s" % ( self.urllib.quote_plus(self.user) , self.urllib.quote_plus(self.password) , self.urllib.quote_plus(self.host) , self.port , self.urllib.quote(self.remote_dir) ) # Force SSL layer for secure FTP secure_options = '' if self.is_ftps: secure_options = 'set ftp:ssl-force true && set ftp:ssl-protect-data true && ' # Get a copy of the remote directory ftp_backup = """lftp -c '%sset ftp:list-options -a && open -e "mirror -e --verbose=3 --parallel=2 . %s" %s'""" % (secure_options, self.backup_folder_mirror, remote_url) self.logger.doLog("Going to mirror with command: %s " % ftp_backup) #print self.getstatusoutput(ftp_backup) if self.is_ftps: #do ftps things self.doMirrorSFtp() else: #do non ftps things self.doMirrorFtp() #finishing do mirror """ Actual Ftp mirroring """ def doMirrorFtp(self): if int(self.port) != 21: self.logger.doLog("For now only port 21") else: with self.ftputil.FTPHost(self.host, self.user, self.password) as host: print host.curdir for root, dirs, files in host.walk(self.remote_dir): localDirectoryRoot = root.replace(self.remote_dir, self.backup_folder_mirror) for directory in dirs: if directory != ".svn": self.BackupUtils.createDirectory(localDirectoryRoot + "/" + directory) for remoteFile in files: if remoteFile not in ['.ftpquota', '.DS_Store']: if not remoteFile.startswith("log-"): try: self.logger.doLog("Retrieving file from %s to %s" % (root + "/" + remoteFile, localDirectoryRoot + "/" + remoteFile)) host.download(root + "/" + remoteFile, localDirectoryRoot + "/" + remoteFile) except Exception as fileE: print fileE else: self.logger.doLog("Log file %s will not be downloaded" % remoteFile) print " =============================== " """ Actual SFtp mirroring """ def doMirrorSFtp(self): #doing stuff transport = self.paramiko.Transport((self.host, int(self.port))) transport.connect(username = self.user, password = self.password) sftp = self.paramiko.SFTPClient.from_transport(transport) print self.remote_dir #print sftp.listdir(self.remote_dir) self.sftpHandler.sftpWalk(sftp, self.remote_dir, self.remote_dir, self.backup_folder_mirror) #Do full backup sftp.close() transport.close() def doDiff(self): self.BackupUtils.doRdiffBackupCall(self.backup_folder_mirror, self.backup_folder_diff) def retriveMonthlyArchive(self, currentYear, currentMonth): return self.BackupUtils.returnFormatedMonthlyArchive(self.backup_folder_archive, currentYear, currentMonth) def doBackup(self): # Generate monthly archive name current_year, current_month = self.BackupUtils.returnBasicDateInfo() monthly_archive = self.retriveMonthlyArchive(current_year, current_month) print monthly_archive snapshot_date = "%04d-%02d-01" % (current_year, current_month) self.BackupUtils.doBackup(monthly_archive, snapshot_date, self.backup_folder_diff, self.backup_folder_archive)