-- Recursively snapshot every dataset with a given property -- -- Usage: zfs program autosnap.lua -- [-n] [-p ] results = {} args = ... argv = args["argv"] usage = [[ usage: zfs program autosnap.lua -- [-n] [-p ] -n: performs checks only, does not take snapshots -p : property to check. [default: com.sun:auto-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