def rollback_files(self): if not exists(self.paths.fsdelta): return changes = Changes.fromfile(self.paths.fsdelta) dirindex = DirIndex(self.paths.dirindex) exceptions = 0 for change in changes: try: if change.path not in dirindex: utils.remove_any(change.path) continue if change.OP in ('o', 'd'): try: self._move_from_originals(change.path) except self.Error: continue dirindex_rec = dirindex[change.path] local_rec = DirIndex.Record.frompath(change.path) if dirindex_rec.uid != local_rec.uid or \ dirindex_rec.gid != local_rec.gid: os.lchown(change.path, dirindex_rec.uid, dirindex_rec.gid) if dirindex_rec.mod != local_rec.mod: mod = stat.S_IMODE(dirindex_rec.mod) os.chmod(change.path, mod) except: exceptions += 1 # fault-tolerance: warn and continue, don't die traceback.print_exc(file=sys.stderr) for fname in ('passwd', 'group'): shutil.copy(join(self.paths.etc, fname), "/etc") if exceptions: raise Error("caught %d exceptions during rollback_files" % exceptions)
uidmap = parse_idmap(val) elif opt in ('-g', '--gid-map'): gidmap = parse_idmap(val) elif opt in ('-s', '--simulate'): simulate = True elif opt in ('-v', '--verbose'): verbose = True else: usage() if len(args) < 1: usage() delta = args[0] paths = args[1:] changes = Changes.fromfile(delta, paths) if simulate: verbose = True for action in changes.statfixes(uidmap, gidmap): if verbose: print action if not simulate: action() if __name__=="__main__": main()
def files(self): extras = self.extras if not exists(extras.fsdelta): return overlay = self.backup_extract_path simulate = self.simulate rollback = self.rollback limits = self.limits.fs print "\n" + self._title("Restoring filesystem") passwd, group, uidmap, gidmap = self._userdb_merge(extras.etc, "/etc") if uidmap or gidmap: print "MERGING USERS AND GROUPS\n" for olduid in uidmap: print "UID %d => %d" % (olduid, uidmap[olduid]) for oldgid in gidmap: print "GID %d => %d" % (oldgid, gidmap[oldgid]) print changes = Changes.fromfile(extras.fsdelta, limits) deleted = list(changes.deleted()) if rollback: rollback.save_files(changes, overlay) fsdelta_olist = self._get_fsdelta_olist(extras.fsdelta_olist, limits) if fsdelta_olist: print "OVERLAY:\n" print "\n".join(fsdelta_olist) if not simulate: self._apply_overlay(overlay, '/', fsdelta_olist) statfixes = list(changes.statfixes(uidmap, gidmap)) if statfixes or deleted: print "\nPOST-OVERLAY FIXES:\n" for action in statfixes: print action if not simulate: action() for action in deleted: print action # rollback moves deleted to 'originals' if not simulate and not rollback: action() def w(path, s): file(path, "w").write(str(s)) if not simulate: w("/etc/passwd", passwd) w("/etc/group", group)
simulate = False verbose = False for opt, val in opts: if opt in ('-s', '--simulate'): simulate = True elif opt in ('-v', '--verbose'): verbose = True else: usage() if len(args) < 1: usage() delta = args[0] paths = args[1:] changes = Changes.fromfile(delta, paths) if simulate: verbose = True for action in changes.deleted(): if verbose: print action if not simulate: action() if __name__ == "__main__": main()
def files(self): extras = self.extras if not exists(extras.fsdelta): return overlay = self.backup_extract_path simulate = self.simulate rollback = self.rollback limits = self.limits.fs print fmt_title("FILES - restoring files, ownership and permissions", '-') passwd, group, uidmap, gidmap = self._userdb_merge(extras.etc, "/etc") if uidmap or gidmap: print "MERGING USERS AND GROUPS:\n" for olduid in uidmap: print " UID %d => %d" % (olduid, uidmap[olduid]) for oldgid in gidmap: print " GID %d => %d" % (oldgid, gidmap[oldgid]) print changes = Changes.fromfile(extras.fsdelta, limits) deleted = list(changes.deleted()) if rollback: rollback.save_files(changes, overlay) fsdelta_olist = self._get_fsdelta_olist(extras.fsdelta_olist, limits) if fsdelta_olist: print "OVERLAY:\n" for fpath in fsdelta_olist: print " " + fpath if not simulate: self._apply_overlay(overlay, '/', fsdelta_olist) print statfixes = list(changes.statfixes(uidmap, gidmap)) if statfixes or deleted: print "POST-OVERLAY FIXES:\n" for action in statfixes: print " " + str(action) if not simulate: action() for action in deleted: print " " + str(action) # rollback moves deleted to 'originals' if not simulate and not rollback: action() if statfixes or deleted: print def w(path, s): file(path, "w").write(str(s)) if not simulate: w("/etc/passwd", passwd) w("/etc/group", group)