summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2014-03-08 10:02:26 +0000
committerLars Wirzenius <liw@liw.fi>2014-03-08 13:42:16 +0000
commita07037694888a2ba69cc18c0935e6bfaba120b77 (patch)
treead2057f7badae2b12b93a53ad3366eceea36a4ed
parentfebf13461193c4feb5e7a2923288fb5086086dfe (diff)
downloadobnam-a07037694888a2ba69cc18c0935e6bfaba120b77.tar.gz
Add a repository dumper plugin
This is useful for debugging errors in what is in the repository. It's just a start, for now, and can be added to later, as needed.
-rw-r--r--obnamlib/plugins/dump_repo_plugin.py119
-rw-r--r--without-tests1
2 files changed, 120 insertions, 0 deletions
diff --git a/obnamlib/plugins/dump_repo_plugin.py b/obnamlib/plugins/dump_repo_plugin.py
new file mode 100644
index 00000000..7379ba39
--- /dev/null
+++ b/obnamlib/plugins/dump_repo_plugin.py
@@ -0,0 +1,119 @@
+# Copyright (C) 2014 Lars Wirzenius
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import yaml
+
+import obnamlib
+
+
+class DumpRepositoryPlugin(obnamlib.ObnamPlugin):
+
+ def enable(self):
+ self.app.add_subcommand(
+ 'dump-repo', self.cmd_dump_repo, arg_synopsis='')
+
+ self.app.settings.boolean(
+ ['dump-repo-file-metadata'],
+ 'dump metadata about files?')
+
+ def cmd_dump_repo(self, args):
+ repo = self.app.get_repository_object()
+ yaml.safe_dump_all(
+ self.dump_repository(repo),
+ stream=self.app.output,
+ default_flow_style=False)
+ repo.close()
+
+ def dump_repository(self, repo):
+ yield self.dump_client_list(repo)
+ yield self.dump_chunk_ids(repo)
+ for client_name in repo.get_client_names():
+ for x in self.dump_client(repo, client_name):
+ yield x
+
+ def dump_client_list(self, repo):
+ return {
+ 'client-list': list(repo.get_client_names()),
+ }
+
+ def dump_chunk_ids(self, repo):
+ return {
+ 'chunk-ids': list(repo.get_chunk_ids()),
+ }
+
+ def dump_client(self, repo, client_name):
+ yield {
+ 'client-name': client_name,
+ 'encryption-key': repo.get_client_encryption_key_id(client_name),
+ 'client-keys': self.dump_client_keys(repo, client_name),
+ }
+
+ for gen_id in repo.get_client_generation_ids(client_name):
+ yield self.dump_generation(repo, client_name, gen_id)
+
+ def dump_client_keys(self, repo, client_name):
+ return dict(
+ (obnamlib.repo_key_name(key),
+ repo.get_client_key(client_name, key))
+ for key in repo.get_allowed_client_keys()
+ if key != obnamlib.REPO_CLIENT_TEST_KEY
+ )
+
+ def dump_client_generation_ids(self, repo, client_name):
+ return [
+ repo.make_generation_spec(gen_id)
+ for gen_id in repo.get_client_generation_ids(client_name)
+ ]
+
+ def dump_generation(self, repo, client_name, gen_id):
+ obj = {
+ 'client-name': client_name,
+ 'generation-id': repo.make_generation_spec(gen_id),
+ 'generation-keys': self.dump_generation_keys(repo, gen_id),
+ 'generation-chunk-ids':
+ self.dump_generation_chunk_ids(repo, gen_id),
+ }
+ if self.app.settings['dump-repo-file-metadata']:
+ obj['files'] = self.dump_generation_files(repo, gen_id)
+ return obj
+
+ def dump_generation_keys(self, repo, gen_id):
+ return dict(
+ (obnamlib.repo_key_name(key),
+ repo.get_generation_key(gen_id, key))
+ for key in repo.get_allowed_generation_keys()
+ if key != obnamlib.REPO_GENERATION_TEST_KEY
+ )
+
+ def dump_generation_chunk_ids(self, repo, gen_id):
+ return repo.get_generation_chunk_ids(gen_id)
+
+ def dump_generation_files(self, repo, gen_id):
+ result = {}
+ for filename in repo.walk_generation(gen_id, '/'):
+ result[filename] = {
+ 'file-chunk-ids': repo.get_file_chunk_ids(gen_id, filename),
+ 'file-keys': self.dump_file_keys(repo, gen_id, filename),
+ }
+ return result
+
+ def dump_file_keys(self, repo, gen_id, filename):
+ return dict(
+ (obnamlib.repo_key_name(key),
+ repo.get_file_key(gen_id, filename, key))
+ for key in repo.get_allowed_file_keys()
+ if key != obnamlib.REPO_FILE_TEST_KEY
+ )
diff --git a/without-tests b/without-tests
index b198157b..0cd579f5 100644
--- a/without-tests
+++ b/without-tests
@@ -24,3 +24,4 @@ test-plugins/hello_plugin.py
test-plugins/oldhello_plugin.py
test-plugins/aaa_hello_plugin.py
test-plugins/wrongversion_plugin.py
+obnamlib/plugins/dump_repo_plugin.py