mirror_provider.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import sh
  4. import os
  5. from datetime import datetime
  6. class MirrorProvider(object):
  7. '''
  8. Mirror method class, can be `rsync', `debmirror', etc.
  9. '''
  10. def __init__(self, name, local_dir, log_file="/dev/null",
  11. interval=120, hooks=[]):
  12. self.name = name
  13. self.local_dir = local_dir
  14. self.log_file = log_file
  15. self.interval = interval
  16. self.hooks = hooks
  17. self.p = None
  18. def run(self):
  19. raise NotImplementedError("run method should be implemented")
  20. def terminate(self):
  21. if self.p is not None:
  22. self.p.process.terminate()
  23. print("{} terminated".format(self.name))
  24. self.p = None
  25. def wait(self):
  26. if self.p is not None:
  27. self.p.wait()
  28. self.p = None
  29. class RsyncProvider(MirrorProvider):
  30. _default_options = "-av --delete-after"
  31. def __init__(self, name, upstream_url, local_dir, useIPv6=True,
  32. exclude_file=None, log_file="/dev/null", interval=120,
  33. hooks=[]):
  34. super(RsyncProvider, self).__init__(name, local_dir, log_file,
  35. interval, hooks)
  36. self.upstream_url = upstream_url
  37. self.useIPv6 = useIPv6
  38. self.exclude_file = exclude_file
  39. @property
  40. def options(self):
  41. _options = self._default_options.split()
  42. if self.useIPv6:
  43. _options.append("-6")
  44. else:
  45. _options.append("-4")
  46. if self.exclude_file:
  47. _options.append("--exclude-from")
  48. _options.append(self.exclude_file)
  49. return _options
  50. def run(self):
  51. _args = self.options
  52. _args.append(self.upstream_url)
  53. _args.append(self.local_dir)
  54. now = datetime.now().strftime("%Y-%m-%d_%H")
  55. log_file = self.log_file.format(date=now)
  56. self.p = sh.rsync(*_args, _out=log_file, _err=log_file,
  57. _out_bufsize=1, _bg=True)
  58. class ShellProvider(MirrorProvider):
  59. def __init__(self, name, command, local_dir,
  60. log_file="/dev/null", interval=120, hooks=[]):
  61. super(ShellProvider, self).__init__(name, local_dir, log_file,
  62. interval, hooks)
  63. self.command = command.split()
  64. def run(self):
  65. now = datetime.now().strftime("%Y-%m-%d_%H")
  66. log_file = self.log_file.format(date=now)
  67. new_env = os.environ.copy()
  68. new_env["TUNASYNC_MIRROR_NAME"] = self.name
  69. new_env["TUNASYNC_LOCAL_DIR"] = self.local_dir
  70. new_env["TUNASYNC_LOG_FILE"] = log_file
  71. _cmd = self.command[0]
  72. _args = [] if len(self.command) == 1 else self.command[1:]
  73. cmd = sh.Command(_cmd)
  74. self.p = cmd(*_args, _env=new_env, _out=log_file,
  75. _err=log_file, _out_bufsize=1, _bg=True)
  76. # vim: ts=4 sw=4 sts=4 expandtab