diff --git a/zfs_autobackup b/zfs_autobackup index 91cb521..447326d 100755 --- a/zfs_autobackup +++ b/zfs_autobackup @@ -12,6 +12,14 @@ import time import argparse from pprint import pprint as p +import imp +try: + import colorama + use_color=True +except ImportError: + use_color=False + + class Log: def __init__(self, show_debug=False, show_verbose=False): self.last_log="" @@ -37,15 +45,24 @@ class Log: # return(str) def error(self, txt): - print("! "+txt, file=sys.stderr) + if use_color: + print(colorama.Fore.RED+colorama.Style.BRIGHT+ "! "+txt+colorama.Style.RESET_ALL, file=sys.stderr) + else: + print("! "+txt, file=sys.stderr) def verbose(self, txt): if self.show_verbose: - print(" "+txt) + if use_color: + print(colorama.Style.NORMAL+ " "+txt+colorama.Style.RESET_ALL) + else: + print(" "+txt) def debug(self, txt): if self.show_debug: - print("# "+txt) + if use_color: + print(colorama.Fore.BLUE+ "# "+txt+colorama.Style.RESET_ALL) + else: + print("# "+txt) @@ -144,13 +161,13 @@ class ExecuteNode: p=subprocess.Popen(encoded_cmd, env=os.environ, stdout=subprocess.PIPE, stdin=stdin, stderr=subprocess.PIPE) (output, errors)=p.communicate(input=input) - if p.returncode not in valid_exitcodes: - raise(subprocess.CalledProcessError(p.returncode, encoded_cmd)) - if not hide_errors: for line in errors.splitlines(): self.error(line) + if p.returncode not in valid_exitcodes: + raise(subprocess.CalledProcessError(p.returncode, encoded_cmd)) + lines=output.splitlines() if not tab_split: return(lines) @@ -229,7 +246,7 @@ class ZfsDataset(): def exists(self): """check if dataset exists""" self.debug("Checking if filesystem exists") - return(self.zfs_node.run(tab_split=True, cmd=[ "zfs", "list", self.name], readonly=True, valid_exitcodes=[ 0,1 ], hide_errors=True)!="") + return(self.zfs_node.run(tab_split=True, cmd=[ "zfs", "list", self.name], readonly=True, valid_exitcodes=[ 0,1 ], hide_errors=True) and True) def is_changed(self): @@ -261,6 +278,9 @@ class ZfsDataset(): """get all snapshots of this dataset""" self.debug("Getting snapshots") + if not self.exists: + return([]) + cmd=[ "zfs", "list", "-d", "1", "-r", "-t" ,"snapshot", "-H", "-o", "name", self.name ] @@ -374,10 +394,10 @@ class ZfsDataset(): if (prev_snapshot): target_dataset.verbose("receiving @{}...@{} {}".format(prev_snapshot.snapshot_name, self.snapshot_name, resumed)) else: - target_dataset.verbose("receiving @{} {}".format(snapshot.snapshot_name, resumed)) - - target_dataset.invalidate() + target_dataset.verbose("receiving @{} {}".format(self.snapshot_name, resumed)) + #update cache + target_dataset.snapshots.append(ZfsDataset(target_dataset.zfs_node, target_dataset.name+"@"+self.snapshot_name)) def sync_snapshots(self, target_dataset): """sync our snapshots to target_dataset""" @@ -420,13 +440,13 @@ class ZfsNode(ExecuteNode): ExecuteNode.__init__(self, ssh_to=ssh_to, readonly=readonly) def verbose(self,txt): - self.zfs_autobackup.verbose("{}: {}".format(self.description, txt)) + self.zfs_autobackup.verbose("{} {}".format(self.description, txt)) def error(self,txt,titles=[]): - self.zfs_autobackup.error("{}: {}".format(self.description, txt)) + self.zfs_autobackup.error("{} {}".format(self.description, txt)) def debug(self,txt, titles=[]): - self.zfs_autobackup.debug("{}: {}".format(self.description, txt)) + self.zfs_autobackup.debug("{} {}".format(self.description, txt)) def new_snapshotname(self): """determine uniq new snapshotname""" @@ -562,13 +582,14 @@ class ZfsAutobackup: self.log.debug(txt) def set_title(self, title): + self.log.verbose("") self.log.verbose("#### "+title) def run(self): - description="Source {}".format(self.args.ssh_source or "(local)") + description="[Source]" source_node=ZfsNode(self.args.backup_name, self, ssh_to=self.args.ssh_source, readonly=self.args.test, description=description) - description="Target {}".format(self.args.ssh_target or "(local)") + description="[Target]" target_node=ZfsNode(self.args.backup_name, self, ssh_to=self.args.ssh_target, readonly=self.args.test, description=description) self.set_title("Selecting") @@ -583,7 +604,7 @@ class ZfsAutobackup: self.set_title("Transferring") - target_root=ZfsDataset(target_node, self.args.target_path) + # target_root=ZfsDataset(target_node, self.args.target_path) for source_dataset in source_datasets: