def find_versions(dataset, filename, quiet=False): ''' ''' if zettaknight_globs.help_flag: ret = """Find Versions: Usage: zettaknight find_versions zfs_data/<some dataset> <some filename> Searches snapshots of provided dataset for previous versions of filename. Required Arguments: dataset Specifies the dataset whose snapshots will be searched. filename Defines target file(s) to find previous versions of. This can be a full path to a file (/zfs_data/<some dataset>/<some filename>.<ext>), just a filename with or without an extension (<some filename> or <some filename>.<ext>), or just an extension (.<ext>)""" return ret zettaknight_utils.check_quiet(quiet) snaps = {} ret = {} ret[dataset] = {} snaplist_cmd = "/sbin/zfs list -r -t snapshot -o name -H {0}".format(dataset) snaplist_run = subprocess.Popen(shlex.split(snaplist_cmd), stdout = subprocess.PIPE, stderr = subprocess.STDOUT) snaplist_run.wait() snaplist_out = snaplist_run.stdout.read() if not snaplist_out: try: out_dict = {} out_dict[dataset] = {} job = inspect.stack()[0][3] if str(inspect.stack()[1][3]) is 'recover': job = inspect.stack()[1][3] out_dict[dataset][job] = {} out_dict[dataset][job]['1'] = "No snapshots found." raise Exception except Exception as e: zettaknight_utils.parse_output(out_dict) sys.exit(0) for snap in snaplist_out.split(): if snap.startswith("cannot"): try: raise Exception("{0}".format(snaplist_out)) except Exception as e: zettaknight_utils.zlog("{0}".format(e), "ERROR") sys.exit(0) snapdiff_cmd = "/sbin/zfs diff {0}".format(snap) gerp_cmd = "/bin/grep {0}".format(filename) gerp_run = zettaknight_utils.pipe_this(snapdiff_cmd, gerp_cmd) gerp_out = gerp_run.stdout.read() gerp_list = [] if gerp_out: for gerp in gerp_out.split('\n'): if gerp.startswith("-") or gerp.startswith("M") or gerp.startswith("R"): gerp_list.append(gerp) if gerp_list: snaps[snap] = gerp_list gerp_msg = "" for z in gerp_list: if gerp_msg: gerp_msg = "{0}\n{1}".format(gerp_msg, z) else: gerp_msg = str(z) job = "Snapshot: {0}".format(snap) ret[dataset][job] = {} job_out = "Path:\n{0}".format(gerp_msg) ret[dataset][job]['0'] = job_out if not ret[dataset]: ret[dataset]['Snapshot'] = {} ret[dataset]['Snapshot']['1'] = "No modified versions of {0} found.".format(filename, dataset) if not quiet: zettaknight_utils.parse_output(ret) return snaps
def find_versions(dataset, filename, quiet=False): ''' ''' zettaknight_utils.check_quiet(quiet) snaps = {} ret = {} ret[dataset] = {} snaplist_cmd = "/sbin/zfs list -r -t snapshot -o name -H {0}".format(dataset) snaplist_run = subprocess.Popen(shlex.split(snaplist_cmd), stdout = subprocess.PIPE, stderr = subprocess.STDOUT) snaplist_run.wait() snaplist_out = snaplist_run.stdout.read() if not snaplist_out: try: out_dict = {} out_dict[dataset] = {} job = inspect.stack()[0][3] if str(inspect.stack()[1][3]) is 'recover': job = inspect.stack()[1][3] out_dict[dataset][job] = {} out_dict[dataset][job]['1'] = "No snapshots found." raise Exception except Exception as e: zettaknight_utils.parse_output(out_dict) sys.exit(0) for snap in snaplist_out.split(): if snap.startswith("cannot"): try: raise Exception("{0}".format(snaplist_out)) except Exception as e: print(zettaknight_utils.printcolors(e, "FAIL")) sys.exit(0) snapdiff_cmd = "/sbin/zfs diff {0}".format(snap) gerp_cmd = "/bin/grep {0}".format(filename) gerp_run = zettaknight_utils.pipe_this(snapdiff_cmd, gerp_cmd) gerp_out = gerp_run.stdout.read() gerp_list = [] if gerp_out: for gerp in gerp_out.split('\n'): if gerp.startswith("-") or gerp.startswith("M"): gerp_list.append(gerp) if gerp_list: snaps[snap] = gerp_list gerp_msg = "" for z in gerp_list: if gerp_msg: gerp_msg = "{0}\n{1}".format(gerp_msg, z) else: gerp_msg = str(z) job = "Snapshot: {0}".format(snap) ret[dataset][job] = {} job_out = "Path:\n{0}".format(gerp_msg) ret[dataset][job]['0'] = job_out if not ret[dataset]: ret[dataset]['Snapshot'] = {} ret[dataset]['Snapshot']['1'] = "No modified versions of {0} found.".format(filename, dataset) if not quiet: zettaknight_utils.parse_output(ret) return snaps
def find_versions(dataset, filename, quiet=False): ''' ''' if zettaknight_globs.help_flag: ret = """Find Versions: Usage: zettaknight find_versions zfs_data/<some dataset> <some filename> Searches snapshots of provided dataset for previous versions of filename. Required Arguments: dataset Specifies the dataset whose snapshots will be searched. filename Defines target file(s) to find previous versions of. This can be a full path to a file (/zfs_data/<some dataset>/<some filename>.<ext>), just a filename with or without an extension (<some filename> or <some filename>.<ext>), or just an extension (.<ext>)""" return ret zettaknight_utils.check_quiet(quiet) snaps = {} ret = {} ret[dataset] = {} snaplist_cmd = "/sbin/zfs list -r -t snapshot -o name -H {0}".format( dataset) snaplist_run = subprocess.Popen(shlex.split(snaplist_cmd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT) snaplist_run.wait() snaplist_out = snaplist_run.stdout.read() if not snaplist_out: try: out_dict = {} out_dict[dataset] = {} job = inspect.stack()[0][3] if str(inspect.stack()[1][3]) is 'recover': job = inspect.stack()[1][3] out_dict[dataset][job] = {} out_dict[dataset][job]['1'] = "No snapshots found." raise Exception except Exception as e: zettaknight_utils.parse_output(out_dict) sys.exit(0) for snap in snaplist_out.split(): if snap.startswith("cannot"): try: raise Exception("{0}".format(snaplist_out)) except Exception as e: zettaknight_utils.zlog("{0}".format(e), "ERROR") sys.exit(0) snapdiff_cmd = "/sbin/zfs diff {0}".format(snap) gerp_cmd = "/bin/grep {0}".format(filename) gerp_run = zettaknight_utils.pipe_this(snapdiff_cmd, gerp_cmd) gerp_out = gerp_run.stdout.read() gerp_list = [] if gerp_out: for gerp in gerp_out.split('\n'): if gerp.startswith("-") or gerp.startswith( "M") or gerp.startswith("R"): gerp_list.append(gerp) if gerp_list: snaps[snap] = gerp_list gerp_msg = "" for z in gerp_list: if gerp_msg: gerp_msg = "{0}\n{1}".format(gerp_msg, z) else: gerp_msg = str(z) job = "Snapshot: {0}".format(snap) ret[dataset][job] = {} job_out = "Path:\n{0}".format(gerp_msg) ret[dataset][job]['0'] = job_out if not ret[dataset]: ret[dataset]['Snapshot'] = {} ret[dataset]['Snapshot'][ '1'] = "No modified versions of {0} found.".format( filename, dataset) if not quiet: zettaknight_utils.parse_output(ret) return snaps