summaryrefslogtreecommitdiff
path: root/obnamlib/plugins/show_plugin.py
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2013-12-09 13:54:20 +0000
committerLars Wirzenius <liw@liw.fi>2013-12-28 21:51:24 +0000
commit63be70ceaf5f844baf737dadf3c3f212e4f66419 (patch)
tree968216f25a4ecdb5ab88b0a747cbd51d61fa0ba0 /obnamlib/plugins/show_plugin.py
parentde3a2e0998012dcabe49565e7168146f06263e1c (diff)
downloadobnam-63be70ceaf5f844baf737dadf3c3f212e4f66419.tar.gz
First, incomplete step to using rep interface in show
Diffstat (limited to 'obnamlib/plugins/show_plugin.py')
-rw-r--r--obnamlib/plugins/show_plugin.py198
1 files changed, 117 insertions, 81 deletions
diff --git a/obnamlib/plugins/show_plugin.py b/obnamlib/plugins/show_plugin.py
index b48f2534..e680797d 100644
--- a/obnamlib/plugins/show_plugin.py
+++ b/obnamlib/plugins/show_plugin.py
@@ -68,35 +68,48 @@ class ShowPlugin(obnamlib.ObnamPlugin):
self.app.settings.require('repository')
if require_client:
self.app.settings.require('client-name')
- self.repo = self.app.open_repository()
+ self.repo = self.app.get_repository_object()
if require_client:
- self.repo.open_client(self.app.settings['client-name'])
+ client = self.app.settings['client-name']
+ clients = self.repo.get_client_names()
+ if client not in clients:
+ raise obnamlib.Error(
+ 'Client %s does not exist in repository %s' %
+ (client, self.app.settings['repository']))
def clients(self, args):
'''List clients using the repository.'''
self.open_repository(require_client=False)
- for client_name in self.repo.list_clients():
+ for client_name in self.repo.get_client_names():
self.app.output.write('%s\n' % client_name)
- self.repo.fs.close()
+ self.repo.close()
def generations(self, args):
'''List backup generations for client.'''
self.open_repository()
- for gen in self.repo.list_generations():
- start, end = self.repo.get_generation_times(gen)
- is_checkpoint = self.repo.get_is_checkpoint(gen)
+ client_name = self.app.settings['client-name']
+ for gen_id in self.repo.get_client_generation_ids(client_name):
+ # FIXME: Need to query generation times and whether the
+ # generation is a checkpointand the generation file count
+ # and data size here using generation keys. This is not
+ # yet implemented in the interface.
+ start, end = 0, 0
+ is_checkpoint = False
+ file_count = 0
+ data_size = 0
+
if is_checkpoint:
checkpoint = ' (checkpoint)'
else:
checkpoint = ''
sys.stdout.write('%s\t%s .. %s (%d files, %d bytes) %s\n' %
- (gen,
+ (self.repo.make_generation_spec(gen_id),
self.format_time(start),
self.format_time(end),
- self.repo.client.get_generation_file_count(gen),
- self.repo.client.get_generation_data(gen),
+ file_count,
+ data_size,
checkpoint))
- self.repo.fs.close()
+ self.repo.close()
def nagios_last_backup_age(self, args):
'''Check if the most recent generation is recent enough.'''
@@ -111,10 +124,13 @@ class ShowPlugin(obnamlib.ObnamPlugin):
warn_age = self._convert_time(self.app.settings['warn-age'])
critical_age = self._convert_time(self.app.settings['critical-age'])
- for gen in self.repo.list_generations():
- start, end = self.repo.get_generation_times(gen)
- if most_recent is None or start > most_recent: most_recent = start
- self.repo.fs.close()
+ client_name = self.app.settings['client-name']
+ for gen_id in self.repo.get_client_generation_ids(client_name):
+ # FIXME: get generation start, end times here.
+ start, end = 0, 0
+ if most_recent is None or start > most_recent:
+ most_recent = start
+ self.repo.close()
now = self.app.time()
if most_recent is None:
@@ -138,28 +154,33 @@ class ShowPlugin(obnamlib.ObnamPlugin):
def genids(self, args):
'''List generation ids for client.'''
self.open_repository()
- for gen in self.repo.list_generations():
- sys.stdout.write('%s\n' % gen)
- self.repo.fs.close()
+ client_name = self.app.settings['client-name']
+ for gen_id in self.repo.get_client_generation_ids(client_name):
+ sys.stdout.write('%s\n' % self.repo.make_generation_spec(gen_id))
+ self.repo.close()
def ls(self, args):
'''List contents of a generation.'''
+
self.open_repository()
if len(args) is 0:
args = ['/']
- for gen in self.app.settings['generation']:
- gen = self.repo.genspec(gen)
- started, ended = self.repo.client.get_generation_times(gen)
+ for genspec in self.app.settings['generation']:
+ gen_id = self.repo.interpret_generation_spec(gen_spec)
+ # FIXME: Get generation start, end times here.
+ started, ended = 0, 0
started = self.format_time(started)
ended = self.format_time(ended)
self.app.output.write(
- 'Generation %s (%s - %s)\n' % (gen, started, ended))
+ 'Generation %s (%s - %s)\n' %
+ (self.repo.make_generation_spec(gen_id), started, ended))
for ls_file in args:
ls_file = self.remove_trailing_slashes(ls_file)
- self.show_objects(gen, ls_file)
- self.repo.fs.close()
+ self.show_objects(gen_id, ls_file)
+
+ self.repo.close()
def remove_trailing_slashes(self, filename):
while filename.endswith('/') and filename != '/':
@@ -169,25 +190,25 @@ class ShowPlugin(obnamlib.ObnamPlugin):
def format_time(self, timestamp):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))
- def isdir(self, gen, filename):
- metadata = self.repo.get_metadata(gen, filename)
- return metadata.isdir()
+ def isdir(self, gen_id, filename):
+ mode = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_MODE)
+ return stat.S_ISDIR(mode)
- def show_objects(self, gen, dirname):
- self.show_item(gen, dirname)
+ def show_objects(self, gen_id, dirname):
+ self.show_item(gen_id, dirname)
subdirs = []
- for basename in sorted(self.repo.listdir(gen, dirname)):
- full = os.path.join(dirname, basename)
- if self.isdir(gen, full):
- subdirs.append(full)
+ for filename in sorted(self.repo.get_file_children(gen_id, dirname)):
+ if self.isdir(gen_id, filename):
+ subdirs.append(filename)
else:
- self.show_item(gen, full)
+ self.show_item(gen_id, filename)
for subdir in subdirs:
- self.show_objects(gen, subdir)
+ self.show_objects(gen_id, subdir)
- def show_item(self, gen, filename):
- fields = self.fields(gen, filename)
+ def show_item(self, gen_id, filename):
+ fields = self.fields(gen_id, filename)
widths = [
1, # mode
5, # nlink
@@ -207,7 +228,7 @@ class ShowPlugin(obnamlib.ObnamPlugin):
result.append(fmt % (abs(widths[i]), fields[i]))
self.app.output.write('%s\n' % ' '.join(result))
- def show_diff_for_file(self, gen, fullname, change_char):
+ def show_diff_for_file(self, gen_id, fullname, change_char):
'''Show what has changed for a single file.
change_char is a single char (+,- or *) indicating whether a file
@@ -220,47 +241,50 @@ class ShowPlugin(obnamlib.ObnamPlugin):
if self.app.settings['verbose']:
sys.stdout.write('%s ' % change_char)
- self.show_item(gen, fullname)
+ self.show_item(gen_id, fullname)
else:
self.app.output.write('%s %s\n' % (change_char, fullname))
- def show_diff_for_common_file(self, gen1, gen2, fullname, subdirs):
+ def show_diff_for_common_file(self, gen_id1, gen_id2, fullname, subdirs):
changed = False
- if self.isdir(gen1, fullname) != self.isdir(gen2, fullname):
+ if self.isdir(gen_id1, fullname) != self.isdir(gen_id2, fullname):
changed = True
- elif self.isdir(gen2, fullname):
+ elif self.isdir(gen_id2, fullname):
subdirs.append(fullname)
else:
- # Files are both present and neither is a directory
- # Check md5 sums
- md5_1 = self.repo.get_metadata(gen1, fullname)
- md5_2 = self.repo.get_metadata(gen2, fullname)
+ # Files are both present and neither is a directory.
+ # Compare md5
+ # FIXME: not sure this logic is correct --liw
+ def get_md5(gen_id):
+ return self.repo.get_file_key(
+ gen_id, fullname, obnamlib.REPO_FILE_MD5)
+ md5_1 = get_md5(gen_id1)
+ md5_2 = get_md5(gen_id2)
if md5_1 != md5_2:
changed = True
if changed:
- self.show_diff_for_file(gen2, fullname, '*')
+ self.show_diff_for_file(gen_id2, fullname, '*')
- def show_diff(self, gen1, gen2, dirname):
+ def show_diff(self, gen_id1, gen_id2, dirname):
# This set contains the files from the old/src generation
- set1 = self.repo.listdir(gen1, dirname)
+ set1 = self.repo.get_file_children(gen_id1, dirname)
subdirs = []
# These are the new/dst generation files
- for basename in sorted(self.repo.listdir(gen2, dirname)):
- full = os.path.join(dirname, basename)
- if basename in set1:
+ for filename in sorted(self.repo.get_file_children(gen_id2, dirname)):
+ if filename in set1:
# Its in both generations
- set1.remove(basename)
- self.show_diff_for_common_file(gen1, gen2, full, subdirs)
+ set1.remove(filename)
+ self.show_diff_for_common_file(
+ gen_id1, gen_id2, filename, subdirs)
else:
# Its only in set2 - the file/dir got added
- self.show_diff_for_file(gen2, full, '+')
- for basename in sorted(set1):
+ self.show_diff_for_file(gen_id2, full, '+')
+ for filename in sorted(set1):
# This was only in gen1 - it got removed
- full = os.path.join(dirname, basename)
- self.show_diff_for_file(gen1, full, '-')
+ self.show_diff_for_file(gen_id1, filename, '-')
for subdir in subdirs:
- self.show_diff(gen1, gen2, subdir)
+ self.show_diff(gen_id1, gen_id2, subdir)
def diff(self, args):
'''Show difference between two generations.'''
@@ -270,24 +294,38 @@ class ShowPlugin(obnamlib.ObnamPlugin):
self.open_repository()
if len(args) == 1:
- gen2 = self.repo.genspec(args[0])
+ gen_id2 = self.repo.interpret_generation_spec(args[0])
# Now we have the dst/second generation for show_diff. Use
# genids/list_generations to find the previous generation
- genids = self.repo.list_generations()
- index = genids.index(gen2)
+ client_name = self.app.settings['client-name']
+ genids = self.repo.get_client_generation_ids(client_name)
+ index = genids.index(gen_id2)
if index == 0:
raise obnamlib.Error(
'Can\'t show first generation. Use \'ls\' instead')
- gen1 = genids[index - 1]
+ gen_id1 = genids[index - 1]
else:
- gen1 = self.repo.genspec(args[0])
- gen2 = self.repo.genspec(args[1])
-
- self.show_diff(gen1, gen2, '/')
- self.repo.fs.close()
-
- def fields(self, gen, full):
- metadata = self.repo.get_metadata(gen, full)
+ gen_id1 = self.repo.interpret_generation_spec(args[0])
+ gen_id2 = self.repo.interpret_generation_specb(args[1])
+
+ self.show_diff(gen_id1, gen_id2, '/')
+ self.repo.close()
+
+ def fields(self, gen_id, filename):
+ mode = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_MODE)
+ mtime_sec = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_MTIME_SEC)
+ target = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_SYMLINK_TARGET)
+ nlink = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_NLINK)
+ username = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_USERNAME)
+ groupname = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_GROUPNAME)
+ size = self.repo.get_file_key(
+ gen_id, filename, obnamlib.REPO_FILE_SIZE)
perms = ['?'] + ['-'] * 9
tab = [
@@ -305,25 +343,23 @@ class ShowPlugin(obnamlib.ObnamPlugin):
(stat.S_IWOTH, 8, 'w'),
(stat.S_IXOTH, 9, 'x'),
]
- mode = metadata.st_mode or 0
for bitmap, offset, char in tab:
if (mode & bitmap) == bitmap:
perms[offset] = char
perms = ''.join(perms)
- timestamp = time.strftime('%Y-%m-%d %H:%M:%S',
- time.gmtime(metadata.st_mtime_sec))
+ timestamp = time.strftime('%Y-%m-%d %H:%M:%S', mtime_sec)
- if metadata.islink():
- name = '%s -> %s' % (full, metadata.target)
+ if stat.S_ISLNK(mode):
+ name = '%s -> %s' % (filename, target)
else:
- name = full
+ name = filename
return (perms,
- str(metadata.st_nlink or 0),
- metadata.username or '',
- metadata.groupname or '',
- str(metadata.st_size or 0),
+ str(nlink),
+ username,
+ groupname,
+ str(size),
timestamp,
name)