def short_desc(self): """ Return a short one-line description of the chain, suitable for log messages. """ return "[%s]-[%s]" % (dup_time.timetopretty(self.start_time), dup_time.timetopretty(self.end_time))
def __str__(self): """ Return string representation, for testing purposes """ set_schema = "%20s %30s %15s" l = ["-------------------------", _("Chain start time: ") + dup_time.timetopretty(self.start_time), _("Chain end time: ") + dup_time.timetopretty(self.end_time), _("Number of contained backup sets: %d") % (len(self.incset_list)+1,), _("Total number of contained volumes: %d") % (self.get_num_volumes(),), set_schema % (_("Type of backup set:"), _("Time:"), _("Num volumes:"))] for s in self.get_all_sets(): if s.time: type = _("Full") time = s.time else: type = _("Incremental") time = s.end_time l.append(set_schema % (type, dup_time.timetopretty(time), len(s))) l.append("-------------------------") return "\n".join(l)
def add_inc(self, incset): u""" Add incset to self. Return False if incset does not match """ if self.end_time == incset.start_time: self.incset_list.append(incset) else: if (self.incset_list and incset.start_time == self.incset_list[-1].start_time and incset.end_time > self.incset_list[-1].end_time): log.Info(_(u"Preferring Backupset over previous one!")) self.incset_list[-1] = incset else: log.Info( _(u"Ignoring incremental Backupset (start_time: %s; needed: %s)" ) % (dup_time.timetopretty(incset.start_time), dup_time.timetopretty(self.end_time))) return False self.end_time = incset.end_time log.Info( _(u"Added incremental Backupset (start_time: %s / end_time: %s)") % (dup_time.timetopretty( incset.start_time), dup_time.timetopretty(incset.end_time))) assert self.end_time return True
def short_desc(self): """ Return a short one-line description of the chain, suitable for log messages. """ return "[%s]-[%s]" % (dup_time.timetopretty(self.start_time), dup_time.timetopretty(self.end_time))
def __str__(self): """ Return string representation, for testing purposes """ set_schema = "%20s %30s %15s" l = ["-------------------------", _("Chain start time: ") + dup_time.timetopretty(self.start_time), _("Chain end time: ") + dup_time.timetopretty(self.end_time), _("Number of contained backup sets: %d") % (len(self.incset_list) + 1,), _("Total number of contained volumes: %d") % (self.get_num_volumes(),), set_schema % (_("Type of backup set:"), _("Time:"), _("Num volumes:"))] for s in self.get_all_sets(): if s.time: type = _("Full") time = s.time else: type = _("Incremental") time = s.end_time l.append(set_schema % (type, dup_time.timetopretty(time), len(s))) l.append("-------------------------") return "\n".join(l)
def add_inc(self, incset): """ Add incset to self. Return False if incset does not match """ if self.end_time == incset.start_time: self.incset_list.append(incset) else: if ( self.incset_list and incset.start_time == self.incset_list[-1].start_time and incset.end_time > self.incset_list[-1] ): log.Info(_("Preferring Backupset over previous one!")) self.incset_list[-1] = incset else: log.Info( _("Ignoring incremental Backupset (start_time: %s; needed: %s)") % (dup_time.timetopretty(incset.start_time), dup_time.timetopretty(self.end_time)) ) return False self.end_time = incset.end_time log.Info( _("Added incremental Backupset (start_time: %s / end_time: %s)") % (dup_time.timetopretty(incset.start_time), dup_time.timetopretty(incset.end_time)) ) assert self.end_time return True
def get_signature_chain_at_time(self, time): """ Return signature chain covering specified time Tries to find the signature chain covering the given time. If there is none, return the earliest chain before, and failing that, the earliest chain. """ if not self.all_sig_chains: raise CollectionsError("No signature chains found") covering_chains = [c for c in self.all_sig_chains if c.start_time <= time <= c.end_time] if covering_chains: return covering_chains[-1] # prefer local if multiple sig chains old_chains = [c for c in self.all_sig_chains if c.end_time < time] if old_chains: return old_chains[-1] else: # no chains are old enough, give oldest and warn user oldest = self.all_sig_chains[0] if time < oldest.start_time: log.Warn(_("No signature chain for the requested time. " "Using oldest available chain, starting at time %s.") % dup_time.timetopretty(oldest.start_time), log.WarningCode.no_sig_for_time, dup_time.timetostring(oldest.start_time)) return oldest
def get_timestats_string(self): u"""Return portion of statistics string dealing with time""" timelist = [] if self.StartTime is not None: timelist.append(u"StartTime %.2f (%s)\n" % (self.StartTime, dup_time.timetopretty(self.StartTime))) if self.EndTime is not None: timelist.append(u"EndTime %.2f (%s)\n" % (self.EndTime, dup_time.timetopretty(self.EndTime))) if self.ElapsedTime or (self.StartTime is not None and self.EndTime is not None): if self.ElapsedTime is None: self.ElapsedTime = self.EndTime - self.StartTime timelist.append(u"ElapsedTime %.2f (%s)\n" % (self.ElapsedTime, dup_time.inttopretty(self.ElapsedTime))) return u"".join(timelist)
def get_signature_chain_at_time(self, time): """ Return signature chain covering specified time Tries to find the signature chain covering the given time. If there is none, return the earliest chain before, and failing that, the earliest chain. """ if not self.all_sig_chains: raise CollectionsError("No signature chains found") covering_chains = [c for c in self.all_sig_chains if c.start_time <= time <= c.end_time] if covering_chains: return covering_chains[-1] # prefer local if multiple sig chains old_chains = [c for c in self.all_sig_chains if c.end_time < time] if old_chains: return old_chains[-1] else: # no chains are old enough, give oldest and warn user oldest = self.all_sig_chains[0] if time < oldest.start_time: log.Warn(_("No signature chain for the requested time. " "Using oldest available chain, starting at time %s.") % dup_time.timetopretty(oldest.start_time), log.WarningCode.no_sig_for_time, dup_time.timetostring(oldest.start_time)) return oldest
def get_timestats_string(self): """Return portion of statistics string dealing with time""" timelist = [] if self.StartTime is not None: timelist.append("StartTime %.2f (%s)\n" % (self.StartTime, dup_time.timetopretty(self.StartTime))) if self.EndTime is not None: timelist.append("EndTime %.2f (%s)\n" % (self.EndTime, dup_time.timetopretty(self.EndTime))) if self.ElapsedTime or (self.StartTime is not None and self.EndTime is not None): if self.ElapsedTime is None: self.ElapsedTime = self.EndTime - self.StartTime timelist.append("ElapsedTime %.2f (%s)\n" % (self.ElapsedTime, dup_time.inttopretty(self.ElapsedTime))) return "".join(timelist)
def get_timestats_string(self): u"""Return portion of statistics string dealing with time""" timelist = [] if self.StartTime is not None: timelist.append( u"StartTime %.2f (%s)\n" % # pylint: disable=bad-string-format-type (self.StartTime, dup_time.timetopretty(self.StartTime))) if self.EndTime is not None: timelist.append( u"EndTime %.2f (%s)\n" % # pylint: disable=bad-string-format-type (self.EndTime, dup_time.timetopretty(self.EndTime))) if self.ElapsedTime or (self.StartTime is not None and # pylint:disable=access-member-before-definition self.EndTime is not None): if self.ElapsedTime is None: # pylint:disable=access-member-before-definition self.ElapsedTime = self.EndTime - self.StartTime timelist.append( u"ElapsedTime %.2f (%s)\n" % (self.ElapsedTime, dup_time.inttopretty(self.ElapsedTime))) return u"".join(timelist)
def __str__(self): set_schema = u"%20s %30s %20s" l = [u"-------------------------", _(u"File: %s") % (self.filepath), _(u"Total number of backup: %d") % len(self.fileinfo_list), set_schema % (_(u"Type of backup set:"), _(u"Time:"), _(u"Type of file change:"))] for s in self.fileinfo_list: backup_type = s[0] backup_set = s[1] if backup_set.time: type = _(u"Full") # pylint: disable=redefined-builtin else: type = _(u"Incremental") l.append(set_schema % (type, dup_time.timetopretty(backup_set.get_time()), backup_type.title())) l.append(u"-------------------------") return u"\n".join(l)
def __unicode__(self): set_schema = "%20s %30s %20s" l = ["-------------------------", _("File: %s") % (self.filepath), _("Total number of backup: %d") % len(self.fileinfo_list), set_schema % (_("Type of backup set:"), _("Time:"), _("Type of file change:"))] for s in self.fileinfo_list: backup_type = s[0] backup_set = s[1] if backup_set.time: type = _("Full") else: type = _("Incremental") l.append(set_schema % (type, dup_time.timetopretty(backup_set.get_time()), backup_type.title())) l.append("-------------------------") return "\n".join(l)
def __unicode__(self): set_schema = "%20s %30s %20s" l = ["-------------------------", _("File: %s") % (self.filepath), _("Total number of backup: %d") % len(self.fileinfo_list), set_schema % (_("Type of backup set:"), _("Time:"), _("Type of file change:"))] for s in self.fileinfo_list: backup_type = s[0] backup_set = s[1] if backup_set.time: type = _("Full") else: type = _("Incremental") l.append(set_schema % (type, dup_time.timetopretty(backup_set.get_time()), backup_type.title())) l.append("-------------------------") return "\n".join(l)
def get_timestr(self): """ Return time string suitable for log statements """ return dup_time.timetopretty(self.time or self.end_time)
def compare_verbose(self, other, include_data = 0): """Compare ROPaths like __eq__, but log reason if different This is placed in a separate function from __eq__ because __eq__ should be very time sensitive, and logging statements would slow it down. Used when verifying. If include_data is true, also read all the data of regular files and see if they differ. """ def log_diff(log_string): log_str = _("Difference found:") + " " + log_string log.Notice(log_str % (self.get_relative_path(),)) if not self.type and not other.type: return 1 if not self.stat and other.stat: log_diff(_("New file %s")) return 0 if not other.stat and self.stat: log_diff(_("File %s is missing")) return 0 if self.type != other.type: log_diff(_("File %%s has type %s, expected %s") % (other.type, self.type)) return 0 if self.isreg() or self.isdir() or self.isfifo(): if not self.perms_equal(other): log_diff(_("File %%s has permissions %s, expected %s") % (other.getperms(), self.getperms())) return 0 if ((int(self.stat.st_mtime) != int(other.stat.st_mtime)) and (self.stat.st_mtime > 0 or other.stat.st_mtime > 0)): log_diff(_("File %%s has mtime %s, expected %s") % (dup_time.timetopretty(int(other.stat.st_mtime)), dup_time.timetopretty(int(self.stat.st_mtime)))) return 0 if self.isreg() and include_data: if self.compare_data(other): return 1 else: log_diff(_("Data for file %s is different")) return 0 else: return 1 elif self.issym(): if self.symtext == other.symtext: return 1 else: log_diff(_("Symlink %%s points to %s, expected %s") % (other.symtext, self.symtext)) return 0 elif self.isdev(): if not self.perms_equal(other): log_diff(_("File %%s has permissions %s, expected %s") % (other.getperms(), self.getperms())) return 0 if self.devnums != other.devnums: log_diff(_("Device file %%s has numbers %s, expected %s") % (other.devnums, self.devnums)) return 0 return 1 assert 0
def compare_verbose(self, other, include_data=0): """Compare ROPaths like __eq__, but log reason if different This is placed in a separate function from __eq__ because __eq__ should be very time sensitive, and logging statements would slow it down. Used when verifying. Only run if include_data is true. """ def log_diff(log_string): log_str = _("Difference found:") + u" " + log_string log.Notice(log_str % (util.ufn(self.get_relative_path()))) if include_data is False: return True if not self.type and not other.type: return 1 if not self.stat and other.stat: log_diff(_("New file %s")) return 0 if not other.stat and self.stat: log_diff(_("File %s is missing")) return 0 if self.type != other.type: log_diff( _("File %%s has type %s, expected %s") % (other.type, self.type)) return 0 if self.isreg() or self.isdir() or self.isfifo(): if not self.perms_equal(other): log_diff( _("File %%s has permissions %s, expected %s") % (other.getperms(), self.getperms())) return 0 if ((int(self.stat.st_mtime) != int(other.stat.st_mtime)) and (self.stat.st_mtime > 0 or other.stat.st_mtime > 0)): log_diff( _("File %%s has mtime %s, expected %s") % (dup_time.timetopretty(int(other.stat.st_mtime)), dup_time.timetopretty(int(self.stat.st_mtime)))) return 0 if self.isreg(): if self.compare_data(other): return 1 else: log_diff(_("Data for file %s is different")) return 0 else: return 1 elif self.issym(): if self.symtext == other.symtext: return 1 else: log_diff( _("Symlink %%s points to %s, expected %s") % (other.symtext, self.symtext)) return 0 elif self.isdev(): if not self.perms_equal(other): log_diff( _("File %%s has permissions %s, expected %s") % (other.getperms(), self.getperms())) return 0 if self.devnums != other.devnums: log_diff( _("Device file %%s has numbers %s, expected %s") % (other.devnums, self.devnums)) return 0 return 1 assert 0
def get_timestr(self): """ Return time string suitable for log statements """ return dup_time.timetopretty(self.time or self.end_time)