Skip to content

Instantly share code, notes, and snippets.

@Lizdo
Created February 23, 2010 12:56
Show Gist options
  • Save Lizdo/312142 to your computer and use it in GitHub Desktop.
Save Lizdo/312142 to your computer and use it in GitHub Desktop.
#! /usr/bin/python
### Copy everything on a FTP server to a local folder
from ftplib import FTP
import os.path
import datetime
def main():
#fill in the parameters here
ftpaddress = '1.1.1.1'
username = 'user'
password = 'pass'
backupfolder = '~/backup'
#create dir for today
backupfolder = os.path.expanduser(backupfolder)
if not os.path.exists(backupfolder):
os.makedirs(backupfolder)
os.chdir(backupfolder)
d = datetime.date.today()
localdir = d.strftime("%Y%m%d")
if not os.path.exists(localdir):
os.mkdir(localdir)
os.chdir(localdir)
#login FTP
f = FTP(ftpaddress)
f.login(username,password)
print ('logging in')
backupdir(f,'htdocs','htdocs')
if not os.path.exists('done'):
os.makedirs('done')
f.close()
def backupdir(f, remotedir, localdir):
print 'current remote dir: ', remotedir
print 'current local dir: ', os.path.abspath(localdir)
try:
f.cwd(remotedir)
except ftplib.error_perm, msg:
print "Can't chdir to", remotedir, ":", msg
else:
#prepare local dir
if not os.path.exists(localdir):
os.mkdir(localdir)
os.chdir(localdir)
subdirs = []
listing = []
filesfound = []
f.retrlines('LIST', listing.append)
for line in listing:
words = line.split(None, 8)
filename = words[-1].lstrip()
mode = words[0]
if mode[0] == 'd':
subdirs.append(filename)
continue
else:
filesfound.append(filename)
for file in filesfound:
savefile(f, file)
for subdir in subdirs:
backupdir(f, subdir, subdir)
f.cwd('..')
os.chdir('..')
def savefile(f, filename):
print "copying:", os.path.abspath(filename)
#delete local copy first
if(os.path.exists(filename)):
os.remove(filename)
#then duplicate
try:
fp = open(filename, 'wb')
except IOError, msg:
print "Can't create %r: %s" % (filename, msg)
else:
try:
f.retrbinary('RETR ' + filename, fp.write)
except ftplib.error_perm, msg:
print msg
fp.close()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment