server/migractions.py
branchstable
changeset 3105 b788903e77d5
parent 2963 12ad88615a12
child 3120 57ceabc6dfbc
equal deleted inserted replaced
3104:8881e45f55e3 3105:b788903e77d5
   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.'