archiver.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import argparse
  2. import logging
  3. import sys
  4. from .archive import Archive
  5. from .bandstore import BandStore
  6. from .cache import Cache
  7. from .helpers import location_validator, pretty_size, LevelFilter
  8. class Archiver(object):
  9. def open_store(self, location):
  10. store = BandStore(location.path)
  11. return store
  12. def exit_code_from_logger(self):
  13. return 1 if self.level_filter.count.get('ERROR') else 0
  14. def do_create(self, args):
  15. store = self.open_store(args.archive)
  16. archive = Archive(store)
  17. cache = Cache(store, archive.crypt)
  18. archive.create(args.archive.archive, args.paths, cache)
  19. return self.exit_code_from_logger()
  20. def do_extract(self, args):
  21. store = self.open_store(args.archive)
  22. archive = Archive(store, args.archive.archive)
  23. archive.extract(args.dest)
  24. return self.exit_code_from_logger()
  25. def do_delete(self, args):
  26. store = self.open_store(args.archive)
  27. archive = Archive(store, args.archive.archive)
  28. cache = Cache(store, archive.crypt)
  29. archive.delete(cache)
  30. return self.exit_code_from_logger()
  31. def do_list(self, args):
  32. store = self.open_store(args.src)
  33. if args.src.archive:
  34. archive = Archive(store, args.src.archive)
  35. archive.list()
  36. else:
  37. for archive in Archive.list_archives(store):
  38. print archive
  39. return self.exit_code_from_logger()
  40. def do_verify(self, args):
  41. store = self.open_store(args.archive)
  42. archive = Archive(store, args.archive.archive)
  43. archive.verify()
  44. return self.exit_code_from_logger()
  45. def do_info(self, args):
  46. store = self.open_store(args.archive)
  47. archive = Archive(store, args.archive.archive)
  48. cache = Cache(store, archive.crypt)
  49. osize, csize, usize = archive.stats(cache)
  50. print 'Original size:', pretty_size(osize)
  51. print 'Compressed size:', pretty_size(csize)
  52. print 'Unique data:', pretty_size(usize)
  53. return self.exit_code_from_logger()
  54. def run(self, args=None):
  55. parser = argparse.ArgumentParser(description='Dedupestore')
  56. parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
  57. default=False,
  58. help='Verbose output')
  59. subparsers = parser.add_subparsers(title='Available subcommands')
  60. subparser = subparsers.add_parser('create')
  61. subparser.set_defaults(func=self.do_create)
  62. subparser.add_argument('archive', metavar='ARCHIVE',
  63. type=location_validator(archive=True),
  64. help='Archive to create')
  65. subparser.add_argument('paths', metavar='PATH', nargs='+', type=str,
  66. help='Paths to add to archive')
  67. subparser = subparsers.add_parser('extract')
  68. subparser.set_defaults(func=self.do_extract)
  69. subparser.add_argument('archive', metavar='ARCHIVE',
  70. type=location_validator(archive=True),
  71. help='Archive to create')
  72. subparser.add_argument('dest', metavar='DEST', type=str, nargs='?',
  73. help='Where to extract files')
  74. subparser = subparsers.add_parser('delete')
  75. subparser.set_defaults(func=self.do_delete)
  76. subparser.add_argument('archive', metavar='ARCHIVE',
  77. type=location_validator(archive=True),
  78. help='Archive to delete')
  79. subparser = subparsers.add_parser('list')
  80. subparser.set_defaults(func=self.do_list)
  81. subparser.add_argument('src', metavar='SRC', type=location_validator(),
  82. help='Store/Archive to list contents of')
  83. subparser= subparsers.add_parser('verify')
  84. subparser.set_defaults(func=self.do_verify)
  85. subparser.add_argument('archive', metavar='ARCHIVE',
  86. type=location_validator(archive=True),
  87. help='Archive to verity integrity of')
  88. subparser= subparsers.add_parser('info')
  89. subparser.set_defaults(func=self.do_info)
  90. subparser.add_argument('archive', metavar='ARCHIVE',
  91. type=location_validator(archive=True),
  92. help='Archive to display information about')
  93. args = parser.parse_args(args)
  94. if args.verbose:
  95. logging.basicConfig(level=logging.INFO, format='%(message)s')
  96. else:
  97. logging.basicConfig(level=logging.WARNING, format='%(message)s')
  98. self.level_filter = LevelFilter()
  99. logging.getLogger('').addFilter(self.level_filter)
  100. return args.func(args)
  101. def main():
  102. archiver = Archiver()
  103. sys.exit(archiver.run())
  104. if __name__ == '__main__':
  105. main()