PageRenderTime 20ms CodeModel.GetById 14ms RepoModel.GetById 2ms app.codeStats 0ms

/silversupport/service/files.py

https://bitbucket.org/ianb/silverlining/
Python | 72 lines | 56 code | 12 blank | 4 comment | 6 complexity | 8ec51f593234c23dcfc9097482dee12d MD5 | raw file
Possible License(s): GPL-2.0
  1. """Gives a persistent location to keep files"""
  2. import os
  3. import pwd
  4. import grp
  5. import shutil
  6. from silversupport.shell import run
  7. from silversupport.abstractservice import AbstractService
  8. class AbstractFileService(AbstractService):
  9. root = None
  10. env_var = None
  11. home_name = None
  12. def dir_for_app_name(self, app_name):
  13. return os.path.join(self.root, app_name)
  14. def install(self):
  15. dir = self.dir_for_app_name(self.app_config.app_name)
  16. if not os.path.exists(dir):
  17. os.makedirs(dir)
  18. uid = pwd.getpwnam('www-data').pw_uid
  19. gid = grp.getgrnam('www-data').gr_gid
  20. os.chown(dir, uid, gid)
  21. def env_setup(self):
  22. environ = {}
  23. app_name = self.app_config.app_name
  24. if not self.devel:
  25. dir = self.dir_for_app_name(app_name)
  26. environ[self.env_var] = dir
  27. else:
  28. environ[self.env_var] = os.path.join(
  29. os.environ['HOME'],
  30. '.silverlining-app-data',
  31. self.home_name,
  32. app_name)
  33. if 'files' in self.devel_config:
  34. environ[self.env_var] = os.path.expanduser(
  35. self.devel_config['files'])
  36. if not os.path.exists(environ[self.env_var]):
  37. print 'Creating file location %s' % environ[self.env_var]
  38. os.makedirs(environ[self.env_var])
  39. return environ
  40. def backup(self, output_dir):
  41. path = self.env[self.env_var]
  42. ## FIXME: should this be compressed, or just rely on that to
  43. ## happen at a higher level?
  44. ## Or should it be a tar at all, or just a copy of the files?
  45. run(['tar', 'fc', os.path.join(output_dir, 'files.tar'), '.'],
  46. cwd=path, fail_on_error=True)
  47. def restore(self, input_dir):
  48. path = self.env[self.env_var]
  49. tar_path = os.path.join(input_dir, 'files.tar')
  50. run(['sudo', '-u', 'www-data', 'tar', 'fx', tar_path],
  51. cwd=path, fail_on_error=True)
  52. def clear(self):
  53. path = self.env[self.env_var]
  54. for p in os.listdir(path):
  55. p = os.path.join(path, p)
  56. shutil.rmtree(p)
  57. class Service(AbstractFileService):
  58. root = '/var/lib/silverlining/apps'
  59. env_var = 'CONFIG_FILES'
  60. home_name = 'files'