164 return |
164 return |
165 if askconfirm and not self.confirm('Restore %s database from %s ?' |
165 if askconfirm and not self.confirm('Restore %s database from %s ?' |
166 % (self.config.appid, backupfile)): |
166 % (self.config.appid, backupfile)): |
167 return |
167 return |
168 # unpack backup |
168 # unpack backup |
169 bkup = tarfile.open(backupfile, 'r|gz') |
|
170 for name in bkup.getnames(): |
|
171 if name[0] in '/.': |
|
172 raise Exception('Security check failed, path starts with "/" or "."') |
|
173 bkup.close() # XXX seek error if not close+open !?! |
|
174 bkup = tarfile.open(backupfile, 'r|gz') |
|
175 tmpdir = tempfile.mkdtemp() |
169 tmpdir = tempfile.mkdtemp() |
176 bkup.extractall(path=tmpdir) |
170 try: |
|
171 bkup = tarfile.open(backupfile, 'r|gz') |
|
172 except tarfile.ReadError: |
|
173 # assume restoring old backup |
|
174 shutil.copy(backupfile, osp.join(tmpdir, 'system')) |
|
175 else: |
|
176 for name in bkup.getnames(): |
|
177 if name[0] in '/.': |
|
178 raise Exception('Security check failed, path starts with "/" or "."') |
|
179 bkup.close() # XXX seek error if not close+open !?! |
|
180 bkup = tarfile.open(backupfile, 'r|gz') |
|
181 bkup.extractall(path=tmpdir) |
|
182 bkup.close() |
177 |
183 |
178 self.config.open_connections_pools = False |
184 self.config.open_connections_pools = False |
179 repo = self.repo_connect() |
185 repo = self.repo_connect() |
180 for source in repo.sources: |
186 for source in repo.sources: |
181 if systemonly and source.uri != 'system': |
187 if systemonly and source.uri != 'system': |
184 source.restore(osp.join(tmpdir, source.uri), drop=drop) |
190 source.restore(osp.join(tmpdir, source.uri), drop=drop) |
185 except Exception, exc: |
191 except Exception, exc: |
186 print '-> error trying to restore [%s]' % exc |
192 print '-> error trying to restore [%s]' % exc |
187 if not self.confirm('Continue anyway?', default='n'): |
193 if not self.confirm('Continue anyway?', default='n'): |
188 raise SystemExit(1) |
194 raise SystemExit(1) |
189 bkup.close() |
|
190 shutil.rmtree(tmpdir) |
195 shutil.rmtree(tmpdir) |
191 # call hooks |
196 # call hooks |
192 repo.open_connections_pools() |
197 repo.open_connections_pools() |
193 repo.hm.call_hooks('server_restore', repo=repo, timestamp=backupfile) |
198 repo.hm.call_hooks('server_restore', repo=repo, timestamp=backupfile) |
194 print '-> database restored.' |
199 print '-> database restored.' |