From b98ffec10c8a1fd0e3e945a4e5ce36b9a9465948 Mon Sep 17 00:00:00 2001 From: Edwin Eefting Date: Sat, 19 Oct 2019 19:04:13 +0200 Subject: [PATCH] wip --- zfs_autobackup | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/zfs_autobackup b/zfs_autobackup index 2a73489..1725925 100755 --- a/zfs_autobackup +++ b/zfs_autobackup @@ -191,10 +191,11 @@ class ZfsDataset(): def __str__(self): return(self.name) - # def invalidate(self): - # """invalidate cached data""" - # for d in self.__dict__: - # if (self.__getattribute__) + def verbose(self,txt): + self.zfs_node.verbose("{}: {}".format(self.name, txt)) + + def debug(self,txt): + self.zfs_node.debug("{}: {}".format(self.name, txt)) def invalidate(self): @@ -273,10 +274,13 @@ class ZfsDataset(): def is_changed_ours(self): """dataset is changed since OUR latest snapshot?""" - latest_snapshot=self.snapshots[:-1] - cmd=[ "zfs", "get","-H" ,"-ovalue", "written@"+latest_snapshot, self.name ] - output=self.zfs_node.run(tab_split=False, cmd=cmd, valid_exitcodes=[ 0 ]) + if not self.our_snapshots: + return(True) + latest_snapshot=self.snapshots[-1] + + cmd=[ "zfs", "get","-H" ,"-ovalue", "written@"+str(latest_snapshot), self.name ] + output=self.zfs_node.run(readonly=True, tab_split=False, cmd=cmd, valid_exitcodes=[ 0 ]) if output[0]=="0B" or output[0]=="0": return(False) @@ -296,10 +300,19 @@ class ZfsDataset(): class ZfsNode(ExecuteNode): """a node that contains zfs datasets. implements global lowlevel zfs commands""" - def __init__(self, backup_name, ssh_to=None, readonly=False): + def __init__(self, backup_name, ssh_to=None, readonly=False, description=""): self.backup_name=backup_name + if not description: + self.description=ssh_to + ExecuteNode.__init__(self, ssh_to=ssh_to, readonly=readonly) + def verbose(self,txt): + verbose("{}: {}".format(self.description, txt)) + + def debug(self,txt): + debug("{}: {}".format(self.description, txt)) + def new_snapshotname(self): """determine uniq new snapshotname""" return(self.backup_name+"-"+time.strftime("%Y%m%d%H%M%S")) @@ -315,12 +328,19 @@ class ZfsNode(ExecuteNode): noop=True for dataset in datasets: - if allow_empty or dataset.is_changed_ours(): - cmd.append(str(dataset)+"@"+snapshot_name) - dataset.invalidate() - noop=False + if not allow_empty: + if not dataset.is_changed_ours: + dataset.verbose("No changes, not snapshotting") + continue - if not noop: + cmd.append(str(dataset)+"@"+snapshot_name) + dataset.invalidate() + noop=False + + if noop: + self.verbose("No changes, not creating snapshot.") + else: + self.verbose("Creating snapshot {}".format(snapshot_name)) self.run(cmd, readonly=False) @@ -340,8 +360,10 @@ class ZfsNode(ExecuteNode): direct_filesystems=[] for line in lines: (name,value,source)=line + dataset=ZfsDataset(self, name) + if value=="false": - verbose("* Ignored : {0} (disabled)".format(name)) + dataset.verbose("Ignored (disabled)") else: if source=="local" and ( value=="true" or value=="child"):