diff options
author | Lars Wirzenius <liw@liw.fi> | 2013-12-09 13:54:20 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2013-12-28 21:51:24 +0000 |
commit | 63be70ceaf5f844baf737dadf3c3f212e4f66419 (patch) | |
tree | 968216f25a4ecdb5ab88b0a747cbd51d61fa0ba0 /obnamlib/plugins/show_plugin.py | |
parent | de3a2e0998012dcabe49565e7168146f06263e1c (diff) | |
download | obnam-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.py | 198 |
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) |