2010-10-15 18:35:49 +00:00
|
|
|
import argparse
|
2010-10-20 17:59:15 +00:00
|
|
|
import logging
|
2010-10-16 09:45:36 +00:00
|
|
|
import sys
|
2010-02-23 21:12:22 +00:00
|
|
|
|
2010-10-20 17:59:15 +00:00
|
|
|
from .archive import Archive
|
2010-10-19 19:12:12 +00:00
|
|
|
from .bandstore import BandStore
|
2010-10-20 17:59:15 +00:00
|
|
|
from .cache import Cache
|
|
|
|
from .helpers import location_validator, pretty_size, LevelFilter
|
2010-03-15 20:23:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Archiver(object):
|
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def open_store(self, location):
|
|
|
|
store = BandStore(location.path)
|
2010-10-21 19:21:43 +00:00
|
|
|
return store
|
2010-02-23 20:34:28 +00:00
|
|
|
|
2010-10-16 09:45:36 +00:00
|
|
|
def exit_code_from_logger(self):
|
2010-10-20 17:59:15 +00:00
|
|
|
return 1 if self.level_filter.count.get('ERROR') else 0
|
2010-10-16 09:45:36 +00:00
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def do_create(self, args):
|
2010-10-21 19:21:43 +00:00
|
|
|
store = self.open_store(args.archive)
|
|
|
|
archive = Archive(store)
|
2010-10-23 17:41:31 +00:00
|
|
|
cache = Cache(store, archive.crypto)
|
2010-10-15 18:35:49 +00:00
|
|
|
archive.create(args.archive.archive, args.paths, cache)
|
2010-10-16 09:45:36 +00:00
|
|
|
return self.exit_code_from_logger()
|
2010-02-20 21:28:46 +00:00
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def do_extract(self, args):
|
2010-10-21 19:21:43 +00:00
|
|
|
store = self.open_store(args.archive)
|
|
|
|
archive = Archive(store, args.archive.archive)
|
2010-10-15 18:35:49 +00:00
|
|
|
archive.extract(args.dest)
|
2010-10-16 09:45:36 +00:00
|
|
|
return self.exit_code_from_logger()
|
2010-02-24 22:24:19 +00:00
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def do_delete(self, args):
|
2010-10-21 19:21:43 +00:00
|
|
|
store = self.open_store(args.archive)
|
|
|
|
archive = Archive(store, args.archive.archive)
|
2010-10-23 17:41:31 +00:00
|
|
|
cache = Cache(store, archive.crypto)
|
2010-10-15 18:35:49 +00:00
|
|
|
archive.delete(cache)
|
2010-10-16 09:45:36 +00:00
|
|
|
return self.exit_code_from_logger()
|
2010-02-24 22:24:19 +00:00
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def do_list(self, args):
|
2010-10-21 19:21:43 +00:00
|
|
|
store = self.open_store(args.src)
|
2010-10-15 18:35:49 +00:00
|
|
|
if args.src.archive:
|
2010-10-21 19:21:43 +00:00
|
|
|
archive = Archive(store, args.src.archive)
|
2010-10-15 18:35:49 +00:00
|
|
|
archive.list()
|
|
|
|
else:
|
2010-10-21 19:21:43 +00:00
|
|
|
for archive in Archive.list_archives(store):
|
2010-10-15 18:35:49 +00:00
|
|
|
print archive
|
2010-10-16 09:45:36 +00:00
|
|
|
return self.exit_code_from_logger()
|
2010-02-24 22:24:19 +00:00
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def do_verify(self, args):
|
2010-10-21 19:21:43 +00:00
|
|
|
store = self.open_store(args.archive)
|
|
|
|
archive = Archive(store, args.archive.archive)
|
2010-10-15 18:35:49 +00:00
|
|
|
archive.verify()
|
2010-10-16 09:45:36 +00:00
|
|
|
return self.exit_code_from_logger()
|
2010-02-27 22:23:39 +00:00
|
|
|
|
2010-10-15 18:35:49 +00:00
|
|
|
def do_info(self, args):
|
2010-10-21 19:21:43 +00:00
|
|
|
store = self.open_store(args.archive)
|
|
|
|
archive = Archive(store, args.archive.archive)
|
2010-10-23 17:41:31 +00:00
|
|
|
cache = Cache(store, archive.crypto)
|
2010-10-20 19:08:46 +00:00
|
|
|
osize, csize, usize = archive.stats(cache)
|
|
|
|
print 'Original size:', pretty_size(osize)
|
|
|
|
print 'Compressed size:', pretty_size(csize)
|
|
|
|
print 'Unique data:', pretty_size(usize)
|
2010-10-16 09:45:36 +00:00
|
|
|
return self.exit_code_from_logger()
|
2010-04-18 20:34:21 +00:00
|
|
|
|
2010-10-16 09:45:36 +00:00
|
|
|
def run(self, args=None):
|
2010-10-15 18:35:49 +00:00
|
|
|
parser = argparse.ArgumentParser(description='Dedupestore')
|
|
|
|
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
|
|
|
|
default=False,
|
|
|
|
help='Verbose output')
|
|
|
|
|
|
|
|
subparsers = parser.add_subparsers(title='Available subcommands')
|
|
|
|
subparser = subparsers.add_parser('create')
|
|
|
|
subparser.set_defaults(func=self.do_create)
|
|
|
|
subparser.add_argument('archive', metavar='ARCHIVE',
|
|
|
|
type=location_validator(archive=True),
|
|
|
|
help='Archive to create')
|
|
|
|
subparser.add_argument('paths', metavar='PATH', nargs='+', type=str,
|
|
|
|
help='Paths to add to archive')
|
|
|
|
|
|
|
|
subparser = subparsers.add_parser('extract')
|
|
|
|
subparser.set_defaults(func=self.do_extract)
|
|
|
|
subparser.add_argument('archive', metavar='ARCHIVE',
|
|
|
|
type=location_validator(archive=True),
|
|
|
|
help='Archive to create')
|
|
|
|
subparser.add_argument('dest', metavar='DEST', type=str, nargs='?',
|
|
|
|
help='Where to extract files')
|
|
|
|
|
|
|
|
subparser = subparsers.add_parser('delete')
|
|
|
|
subparser.set_defaults(func=self.do_delete)
|
|
|
|
subparser.add_argument('archive', metavar='ARCHIVE',
|
|
|
|
type=location_validator(archive=True),
|
|
|
|
help='Archive to delete')
|
|
|
|
|
|
|
|
subparser = subparsers.add_parser('list')
|
|
|
|
subparser.set_defaults(func=self.do_list)
|
|
|
|
subparser.add_argument('src', metavar='SRC', type=location_validator(),
|
|
|
|
help='Store/Archive to list contents of')
|
|
|
|
|
|
|
|
subparser= subparsers.add_parser('verify')
|
|
|
|
subparser.set_defaults(func=self.do_verify)
|
|
|
|
subparser.add_argument('archive', metavar='ARCHIVE',
|
|
|
|
type=location_validator(archive=True),
|
|
|
|
help='Archive to verity integrity of')
|
|
|
|
|
|
|
|
subparser= subparsers.add_parser('info')
|
|
|
|
subparser.set_defaults(func=self.do_info)
|
|
|
|
subparser.add_argument('archive', metavar='ARCHIVE',
|
|
|
|
type=location_validator(archive=True),
|
|
|
|
help='Archive to display information about')
|
|
|
|
|
2010-10-16 09:45:36 +00:00
|
|
|
args = parser.parse_args(args)
|
2010-10-15 18:35:49 +00:00
|
|
|
if args.verbose:
|
2010-10-13 21:28:40 +00:00
|
|
|
logging.basicConfig(level=logging.INFO, format='%(message)s')
|
|
|
|
else:
|
|
|
|
logging.basicConfig(level=logging.WARNING, format='%(message)s')
|
2010-10-16 09:45:36 +00:00
|
|
|
self.level_filter = LevelFilter()
|
|
|
|
logging.getLogger('').addFilter(self.level_filter)
|
|
|
|
return args.func(args)
|
2010-03-06 17:25:35 +00:00
|
|
|
|
2010-02-20 17:23:46 +00:00
|
|
|
def main():
|
|
|
|
archiver = Archiver()
|
2010-10-16 09:45:36 +00:00
|
|
|
sys.exit(archiver.run())
|
2010-02-20 17:23:46 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2010-03-06 17:25:35 +00:00
|
|
|
main()
|