| 70 # Let _fifo_thread proceed to next action |
72 # Let _fifo_thread proceed to next action |
| 71 self._cond.notify() |
73 self._cond.notify() |
| 72 |
74 |
| 73 return ev._goodtogo |
75 return ev._goodtogo |
| 74 |
76 |
| |
77 repositories=weakref.WeakValueDictionary() |
| |
78 |
| 75 class Repository(FIFO): |
79 class Repository(FIFO): |
| 76 def __init__(self, name): |
80 def __decode_config(self, cfg): |
| 77 super().__init__(name = 'RepositoryThread %s' % name) |
81 loc0='Repository %d' % self.identifier |
| 78 self.repository_name=name |
82 |
| |
83 self.repository_name=config.check_string(cfg, 'name', 'Name', loc0) |
| |
84 |
| |
85 logger.debug("Configuring repository '%s'" % self.repository_name) |
| |
86 |
| |
87 loc = 'Repository "%s"' |
| |
88 |
| |
89 self.logger=logger.getChild(self.repository_name) |
| |
90 |
| |
91 self.location=config.check_string(cfg, 'location', |
| |
92 'Target repository location', loc) |
| |
93 |
| |
94 self.borg_parameters=config.BorgParameters.from_config(cfg, loc) |
| |
95 |
| |
96 self.__keychain_account=config.check_string(cfg, 'keychain_account', |
| |
97 'Keychain account', loc, |
| |
98 default='') |
| |
99 |
| |
100 self.__passphrase=None |
| |
101 |
| |
102 if config.settings['extract_passphrases_at_startup']: |
| |
103 try: |
| |
104 self.extract_passphrase() |
| |
105 except Exception: |
| |
106 pass |
| |
107 |
| |
108 def __init__(self, identifier, cfg): |
| |
109 self.identifier=identifier |
| |
110 self.__decode_config(cfg) |
| |
111 super().__init__(name = 'RepositoryThread %s' % self.repository_name) |
| |
112 repositories[self.repository_name]=self |
| |
113 |
| |
114 def __extract_passphrase(self): |
| |
115 acc=self.__keychain_account |
| |
116 if not self.__passphrase: |
| |
117 if acc and acc!='': |
| |
118 self.logger.debug('Requesting passphrase') |
| |
119 try: |
| |
120 pw=keyring.get_password("borg-backup", acc) |
| |
121 except Exception as err: |
| |
122 self.logger.error('Failed to retrieve passphrase') |
| |
123 raise err |
| |
124 else: |
| |
125 self.logger.debug('Received passphrase') |
| |
126 self.__passphrase=pw |
| |
127 else: |
| |
128 self.__passphrase=None |
| |
129 return self.__passphrase |
| |
130 |
| |
131 def launch_borg_instance(self, inst): |
| |
132 passphrase=self.__extract_passphrase() |
| |
133 inst.launch(passphrase=passphrase) |
| |
134 |
| |
135 def find_repository(name): |
| |
136 if name in repositories: |
| |
137 return repositories[name] |
| |
138 else: |
| |
139 return None |
| 79 |
140 |
| 80 |
141 |
| 81 # TODO: Should use weak references but they give KeyError |
|
| 82 repositories=weakref.WeakValueDictionary() |
|
| 83 |
|
| 84 def get_controller(name): |
|
| 85 if name in repositories: |
|
| 86 repo = repositories[name] |
|
| 87 else: |
|
| 88 repo = Repository(name) |
|
| 89 repo.start() |
|
| 90 repositories[name] = repo |
|
| 91 return repo |
|
| 92 |
|