mirror_config.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import os
  4. from .mirror_provider import RsyncProvider, ShellProvider
  5. from .btrfs_snapshot import BtrfsHook
  6. class MirrorConfig(object):
  7. _valid_providers = set(("rsync", "debmirror", "shell", ))
  8. def __init__(self, parent, options):
  9. self._parent = parent
  10. self._popt = self._parent._settings
  11. self.options = dict(options.items()) # copy
  12. self._validate()
  13. def _validate(self):
  14. provider = self.options.get("provider", None)
  15. assert provider in self._valid_providers
  16. if provider == "rsync":
  17. assert "upstream" in self.options
  18. elif provider == "shell":
  19. assert "command" in self.options
  20. local_dir_tmpl = self.options.get(
  21. "local_dir", self._popt["global"]["local_dir"])
  22. self.options["local_dir"] = local_dir_tmpl.format(
  23. mirror_root=self._popt["global"]["mirror_root"],
  24. mirror_name=self.name,
  25. )
  26. if "interval" not in self.options:
  27. self.options["interval"] = self._popt["global"]["interval"]
  28. assert isinstance(self.options["interval"], int)
  29. log_dir = self._popt["global"]["log_dir"]
  30. if "log_file" not in self.options:
  31. self.options["log_file"] = os.path.join(
  32. log_dir, self.name, "{date}.log")
  33. if "use_btrfs" not in self.options:
  34. self.options["use_btrfs"] = self._parent.use_btrfs
  35. assert self.options["use_btrfs"] in (True, False)
  36. def __getattr__(self, key):
  37. if key in self.__dict__:
  38. return self.__dict__[key]
  39. else:
  40. return self.__dict__["options"].get(key, None)
  41. def to_provider(self, hooks=[]):
  42. if self.provider == "rsync":
  43. provider = RsyncProvider(
  44. self.name,
  45. self.upstream,
  46. self.local_dir,
  47. self.use_ipv6,
  48. self.exclude_file,
  49. self.log_file,
  50. self.interval,
  51. hooks,
  52. )
  53. elif self.options["provider"] == "shell":
  54. provider = ShellProvider(
  55. self.name,
  56. self.command,
  57. self.local_dir,
  58. self.log_file,
  59. self.interval,
  60. hooks
  61. )
  62. return provider
  63. def compare(self, other):
  64. assert self.name == other.name
  65. for key, val in self.options.iteritems():
  66. if other.options.get(key, None) != val:
  67. return False
  68. return True
  69. def hooks(self):
  70. hooks = []
  71. parent = self._parent
  72. if self.options["use_btrfs"]:
  73. working_dir = parent.btrfs_working_dir_tmpl.format(
  74. mirror_root=parent.mirror_root,
  75. mirror_name=self.name
  76. )
  77. service_dir = parent.btrfs_service_dir_tmpl.format(
  78. mirror_root=parent.mirror_root,
  79. mirror_name=self.name
  80. )
  81. gc_dir = parent.btrfs_gc_dir_tmpl.format(
  82. mirror_root=parent.mirror_root,
  83. mirror_name=self.name
  84. )
  85. hooks.append(BtrfsHook(service_dir, working_dir, gc_dir))
  86. return hooks
  87. # vim: ts=4 sw=4 sts=4 expandtab