archiver.py 4.8 KB

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