150 # done |
150 # done |
151 print '-> backup file', backupfile |
151 print '-> backup file', backupfile |
152 |
152 |
153 def restore_database(self, backupfile, drop=True, systemonly=True, |
153 def restore_database(self, backupfile, drop=True, systemonly=True, |
154 askconfirm=True): |
154 askconfirm=True): |
155 config = self.config |
|
156 repo = self.repo_connect() |
|
157 # check |
155 # check |
158 if not osp.exists(backupfile): |
156 if not osp.exists(backupfile): |
159 raise Exception("Backup file %s doesn't exist" % backupfile) |
157 raise Exception("Backup file %s doesn't exist" % backupfile) |
160 return |
158 return |
161 if askconfirm and not self.confirm('Restore %s database from %s ?' |
159 if askconfirm and not self.confirm('Restore %s database from %s ?' |
162 % (config.appid, backupfile)): |
160 % (self.config.appid, backupfile)): |
163 return |
161 return |
164 # unpack backup |
162 # unpack backup |
165 bkup = tarfile.open(backupfile, 'r|gz') |
163 bkup = tarfile.open(backupfile, 'r|gz') |
166 for name in bkup.getnames(): |
164 for name in bkup.getnames(): |
167 if name[0] in '/.': |
165 if name[0] in '/.': |
168 raise Exception('Security check failed, path starts with "/" or "."') |
166 raise Exception('Security check failed, path starts with "/" or "."') |
169 bkup.close() # XXX seek error if not close+open !?! |
167 bkup.close() # XXX seek error if not close+open !?! |
170 bkup = tarfile.open(backupfile, 'r|gz') |
168 bkup = tarfile.open(backupfile, 'r|gz') |
171 tmpdir = tempfile.mkdtemp() |
169 tmpdir = tempfile.mkdtemp() |
172 bkup.extractall(path=tmpdir) |
170 bkup.extractall(path=tmpdir) |
|
171 |
|
172 self.config.open_connections_pools = False |
|
173 repo = self.repo_connect() |
173 for source in repo.sources: |
174 for source in repo.sources: |
174 if systemonly and source.uri != 'system': |
175 if systemonly and source.uri != 'system': |
175 continue |
176 continue |
176 try: |
177 try: |
177 source.restore(osp.join(tmpdir, source.uri), drop=drop) |
178 source.restore(osp.join(tmpdir, source.uri), drop=drop) |
180 if not self.confirm('Continue anyway?', default='n'): |
181 if not self.confirm('Continue anyway?', default='n'): |
181 raise SystemExit(1) |
182 raise SystemExit(1) |
182 bkup.close() |
183 bkup.close() |
183 shutil.rmtree(tmpdir) |
184 shutil.rmtree(tmpdir) |
184 # call hooks |
185 # call hooks |
|
186 repo.open_connections_pools() |
185 repo.hm.call_hooks('server_restore', repo=repo, timestamp=backupfile) |
187 repo.hm.call_hooks('server_restore', repo=repo, timestamp=backupfile) |
186 print '-> database restored.' |
188 print '-> database restored.' |
187 |
189 |
188 @property |
190 @property |
189 def cnx(self): |
191 def cnx(self): |