Skip to content

Commit

Permalink
Add channel program for property based snapshots
Browse files Browse the repository at this point in the history
Channel programs that many users find useful should be included with zfs
in the /contrib directory. This is the first of these contributions. A
channel program to recursively take snapshots of datasets with the
property com.sun:auto-snapshot=true.

Reviewed-by: Kash Pande <kash@tripleback.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Clint Armstrong <clint@clintarmstrong.net>
Closes openzfs#8443
Closes openzfs#9050
  • Loading branch information
clinta authored and tonyhutter committed Dec 23, 2019
1 parent 87f9d30 commit 258a004
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 2 deletions.
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ AC_CONFIG_FILES([
contrib/initramfs/scripts/local-top/Makefile
contrib/pyzfs/Makefile
contrib/pyzfs/setup.py
contrib/zcp/Makefile
module/Makefile
module/avl/Makefile
module/nvpair/Makefile
Expand Down
4 changes: 2 additions & 2 deletions contrib/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
SUBDIRS = bash_completion.d dracut initramfs pyzfs
DIST_SUBDIRS = bash_completion.d dracut initramfs pyzfs
SUBDIRS = bash_completion.d dracut initramfs pyzfs zcp
DIST_SUBDIRS = bash_completion.d dracut initramfs pyzfs zcp
1 change: 1 addition & 0 deletions contrib/zcp/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
+EXTRA_DIST = autosnap.lua
75 changes: 75 additions & 0 deletions contrib/zcp/autosnap.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
-- Recursively snapshot every dataset with a given property
--
-- Usage: zfs program <pool> autosnap.lua -- [-n] [-p <property>] <snapshot>

results = {}

args = ...
argv = args["argv"]
usage = [[
usage: zfs program <pool> autosnap.lua -- [-n] [-p <property>] <snapshot>
-n: performs checks only, does not take snapshots
-p <property>: property to check. [default: com.sun:auto-snapshot]
<snapshot>: root snapshot to create [example: tank/data@backup]
]]

property = "com.sun:auto-snapshot"
noop = false
root_snap = nil

for i, arg in ipairs(argv) do
if arg == "-n" then
noop = true
elseif arg == "-p" then
elseif argv[i-1] == "-p" then
property = arg
else
root_snap = arg
end
end

if root_snap == nil or property == nil then
error(usage)
end

root_ds_name = ""
snap_name = ""
for i = 1, #root_snap do
if root_snap:sub(i, i) == "@" then
root_ds_name = root_snap:sub(1, i-1)
snap_name = root_snap:sub(i+1, root_snap:len())
end
end

function auto_snap(root)
auto, source = zfs.get_prop(root, property)
if auto == "true" then
ds_snap_name = root .. "@" .. snap_name
err = 0
if noop then
err = zfs.check.snapshot(ds_snap_name)
else
err = zfs.sync.snapshot(ds_snap_name)
end
results[ds_snap_name] = err
end
for child in zfs.list.children(root) do
auto_snap(child)
end
end

auto_snap(root_ds_name)
err_txt = ""
for ds, err in pairs(results) do
if err ~= 0 then
err_txt = err_txt .. "failed to create " .. ds .. ": " .. err .. "\n"
end
end
if err_txt ~= "" then
error(err_txt)
end

return results

0 comments on commit 258a004

Please sign in to comment.