示例#1
0
    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)
示例#2
0
    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()