server/migractions.py
branchstable
changeset 2959 daabb9bc5233
parent 2926 4484387ed012
child 2960 1c6eafc68586
equal deleted inserted replaced
2958:44e5446b649b 2959:daabb9bc5233
   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):