76 lines
1.5 KiB
Lua
76 lines
1.5 KiB
Lua
|
-- 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
|