PageRenderTime 27ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/silverlining/commands/backup.py

https://bitbucket.org/ianb/silverlining/
Python | 50 lines | 50 code | 0 blank | 0 comment | 0 complexity | 3a2f26c5c3166a32f9e7db8f9da214f1 MD5 | raw file
Possible License(s): GPL-2.0
  1. """Cleans out unused instances from a server"""
  2. import re
  3. from cmdutils import CommandError
  4. from silversupport.shell import ssh, run
  5. from silversupport.appdata import normalize_location
  6. from silversupport import transfermethods
  7. _backup_path_re = re.compile(r'backup="(.*?)"')
  8. _scheme_re = re.compile(r'^[a-z]+:')
  9. _archive_path_re = re.compile(r'archive="(.*?)"')
  10. def command_backup(config):
  11. hostname, path = normalize_location(config.args.location)
  12. stdout, stderr, returncode = ssh(
  13. 'www-mgr', hostname,
  14. '/usr/local/share/silverlining/mgr-scripts/backup-services.py %s' % config.args.location,
  15. capture_stdout=True)
  16. match = _backup_path_re.search(stdout)
  17. if not match:
  18. config.logger.fatal("Unexpected output from backup-services.py: %r" % stdout)
  19. raise CommandError("Bad output")
  20. backup_path = match.group(1)
  21. config.logger.notify("Backed up to %s:%s" % (hostname, backup_path))
  22. if not _scheme_re.search(config.args.destination):
  23. copy_local(hostname, backup_path, config.args.destination)
  24. else:
  25. ssh('www-mgr', hostname,
  26. '/usr/local/share/silverlining/mgr-scripts/transfer-backup.py %s %s'
  27. % (backup_path, config.args.destination))
  28. def copy_local(hostname, backup_path, dest):
  29. clean_paths = [backup_path]
  30. if transfermethods.is_archive(dest):
  31. stdout, stderr, returncode = ssh(
  32. 'www-mgr', hostname,
  33. '/usr/local/share/silverlining/mgr-scripts/transfer-backup.py --archive %s %s'
  34. % (backup_path, transfermethods.extension(dest)),
  35. capture_stdout=True)
  36. match = _archive_path_re.search(stdout)
  37. if not match:
  38. raise CommandError("Bad output from transfer-backup.py: %r" % stdout)
  39. backup_path = match.group(1)
  40. clean_paths.append(backup_path)
  41. stdout, stderr, returncode = run(['scp', '-r', 'www-mgr@%s:%s' % (hostname, backup_path), dest])
  42. if returncode:
  43. raise CommandError("Error copying locally (scp exited with code %s); %s remains on server"
  44. % (returncode, ' '.join(clean_paths)))
  45. ssh('www-mgr', hostname, 'rm -r %s' % ' '.join(clean_paths))