From 7cbade2f8c117fcab59b9dbbb0152e28ea6abd11 Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Thu, 23 Feb 2017 11:54:57 +0100 Subject: [PATCH] create: add --json option --- src/borg/archive.py | 21 +++++++++++++++++++++ src/borg/archiver.py | 25 +++++++++++++++++-------- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index 07d62e168..2073080a6 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -68,6 +68,14 @@ def __repr__(self): return "<{cls} object at {hash:#x} ({self.osize}, {self.csize}, {self.usize})>".format( cls=type(self).__name__, hash=id(self), self=self) + def as_dict(self): + return { + 'original_size': self.osize, + 'compressed_size': self.csize, + 'deduplicated_size': self.usize, + 'nfiles': self.nfiles, + } + @property def osize_fmt(self): return format_file_size(self.osize) @@ -343,6 +351,19 @@ def duration(self): def duration_from_meta(self): return format_timedelta(self.ts_end - self.ts) + def info(self): + return { + 'name': self.name, + 'id': self.fpr, + 'start': format_time(to_localtime(self.start.replace(tzinfo=timezone.utc))), + 'end': format_time(to_localtime(self.end.replace(tzinfo=timezone.utc))), + 'duration': (self.end - self.start).total_seconds(), + 'nfiles': self.stats.nfiles, + 'limits': { + 'max_archive_size': self.cache.chunks[self.id].csize / MAX_DATA_SIZE, + }, + } + def __str__(self): return '''\ Archive name: {0.name} diff --git a/src/borg/archiver.py b/src/borg/archiver.py index f45ef2ab0..76ea89927 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -369,13 +369,20 @@ def create_inner(archive, cache): if args.progress: archive.stats.show_progress(final=True) if args.stats: - log_multi(DASHES, - str(archive), - DASHES, - STATS_HEADER, - str(archive.stats), - str(cache), - DASHES, logger=logging.getLogger('borg.output.stats')) + if args.json: + print_as_json({ + 'cache_stats': cache.stats(), + 'stats': archive.stats.as_dict(), + 'archive': archive.info(), + }) + else: + log_multi(DASHES, + str(archive), + DASHES, + STATS_HEADER, + str(archive.stats), + str(cache), + DASHES, logger=logging.getLogger('borg.output.stats')) self.output_filter = args.output_filter self.output_list = args.output_list @@ -1027,7 +1034,7 @@ def _info_repository(self, args, repository, key, cache): } if args.json: - info['cache-stats'] = cache.stats() + info['cache_stats'] = cache.stats() print_as_json(info) else: print(textwrap.dedent(""" @@ -2174,6 +2181,8 @@ def process_epilog(epilog): help='output verbose list of items (files, dirs, ...)') subparser.add_argument('--filter', dest='output_filter', metavar='STATUSCHARS', help='only display items with the given status characters') + subparser.add_argument('--json', action='store_true', + help='output stats as JSON') exclude_group = subparser.add_argument_group('Exclusion options') exclude_group.add_argument('-e', '--exclude', dest='patterns',