1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 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
|