def do_dbrecover(self, arg, opts=None): '''Load a db backup to file or stdout.''' if not opts.id and not opts.job: sys.stderr.write("Please specify either -j or -i options.\n") else: if opts.id: r = Report(None) dmp = r.get_catalogs(catalog=opts.id)[0] else: r = Report(opts.job) dmp = r.get_catalogs(entries=1, types=('MysqlDump', 'gzMysqlDump'))[0] cs = getattr(self.cf, dmp.job.name) if dmp.enc and not cs.encryption: raise RecoverException( 'Archive %s is encrypted, you must ' 'provide proper credentials in order to recover, or ' 'recover manually.' % dmp.id) dmp_file = os.path.join( cs.archive_store, dmp.job.name.encode(), "%s.1.%s" % ( dmp.id.encode(), find_ext(dmp.type.name) ) ) #unencrypted types if not cs.encryption: if dmp.type.name == "gzMysqlDump": comm = 'zcat %s' % dmp_file elif dmp.type.name == "MysqlDump": comm = 'cat %s' % dmp_file #encrypted types elif cs.encryption: pfile = mk_ssl_auth_file(cs.encryption.split(":")[1]) if dmp.type.name == "gzMysqlDump": comm = 'openssl enc -in %s -d -aes-256-cbc -pass '\ 'file:%s | gunzip' % (dmp_file, pfile) elif dmp.type.name == "MysqlDump": comm = 'openssl enc -in %s -d -aes-256-cbc -pass '\ 'file:%s' % (dmp_file, pfile) if opts.filename == "-": retcode = subprocess.call(comm, shell=True) else: if os.path.exists(opts.filename): raise BackupDBException('Cowardly refusing to overwrite' ' %s.' % opts.filename) fd = os.open(opts.filename, os.O_WRONLY | os.O_CREAT, 0600) with os.fdopen(fd, 'w') as out: retcode = subprocess.call(comm, stdout=out, shell=True) if cs.encryption: os.unlink(pfile) if retcode != 0: sys.stderr.write("Recovery failed with status %s.\n" % retcode)
if sect is None: cf = Config("~/.dardrive/jobs.cfg", DARDRIVE_DEFAULTS) try: sect = getattr(cf, opts.job) except ConfigSectionException, e: sys.stderr.write('Invalid job name "%s"\n' % opts.job) sys.exit(1) r = Report(opts.job) try: cat = r.get_catalogs(catalog=opts.id).one() except NoResultFound, e: sys.stderr.write('Invalid backup id "%s"\n' % opts.id) sys.exit(1) fname = "%s.%s.%s" % (cat.id, opts.slice, find_ext(cat.type.name)) origin = os.path.join(sect.local_store, opts.job, fname) dest = os.path.join(sect.archive_store, opts.job) start_time = time.time() for each in glob.glob("%s*" % origin): if os.path.isdir(sect.archive_store): shutil.move(each, dest) sys.stdout.write("%s moved to %s\n" % (os.path.basename(each), dest)) else: sys.stderr.write("%s's archive_store (%s) must be a directory\n" % sect.archive_store) sys.exit(1) end_time = time.time()