backup.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/env python
  2. import os,sys,json
  3. from datetime import datetime
  4. from filecmp import cmp
  5. from subprocess import check_call
  6. from boto.s3.key import Key
  7. from boto.s3.connection import S3Connection
  8. def ENV(x):
  9. '''Promote an environment variable for global use returning its value'''
  10. retval = os.environ.get(x, '')
  11. globals()[x] = retval
  12. return retval
  13. ROOT_PATH = '/data/backup/docker-ci'
  14. TODAY = str(datetime.today())[:10]
  15. BACKUP_FILE = '{}/docker-ci_{}.tgz'.format(ROOT_PATH, TODAY)
  16. BACKUP_LINK = '{}/docker-ci.tgz'.format(ROOT_PATH)
  17. ENV('BACKUP_BUCKET')
  18. ENV('BACKUP_AWS_ID')
  19. ENV('BACKUP_AWS_SECRET')
  20. '''Create full master buildbot backup, avoiding duplicates'''
  21. # Ensure backup path exist
  22. if not os.path.exists(ROOT_PATH):
  23. os.makedirs(ROOT_PATH)
  24. # Make actual backups
  25. check_call('/bin/tar czf {} -C /data --exclude=backup --exclude=buildbot/slave'
  26. ' . 1>/dev/null 2>&1'.format(BACKUP_FILE),shell=True)
  27. # remove previous dump if it is the same as the latest
  28. if (os.path.exists(BACKUP_LINK) and cmp(BACKUP_FILE, BACKUP_LINK) and
  29. os.path._resolve_link(BACKUP_LINK) != BACKUP_FILE):
  30. os.unlink(os.path._resolve_link(BACKUP_LINK))
  31. # Recreate backup link pointing to latest backup
  32. try:
  33. os.unlink(BACKUP_LINK)
  34. except:
  35. pass
  36. os.symlink(BACKUP_FILE, BACKUP_LINK)
  37. # Make backup on S3
  38. bucket = S3Connection(BACKUP_AWS_ID,BACKUP_AWS_SECRET).get_bucket(BACKUP_BUCKET)
  39. k = Key(bucket)
  40. k.key = BACKUP_FILE
  41. k.set_contents_from_filename(BACKUP_FILE)
  42. bucket.copy_key(os.path.basename(BACKUP_LINK),BACKUP_BUCKET,BACKUP_FILE[1:])