9f9230833b50b8271840dc2c12bd1e94d9df7d12Alexander Pyhalov#!@PYTHON@
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# CDDL HEADER START
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# The contents of this file are subject to the terms of the
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# Common Development and Distribution License (the "License").
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# You may not use this file except in compliance with the License.
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# or http://www.opensolaris.org/os/licensing.
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# See the License for the specific language governing permissions
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# and limitations under the License.
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# When distributing Covered Code, include this CDDL HEADER in each
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# If applicable, add the following below this CDDL HEADER, with the
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# fields enclosed by brackets "[]" replaced with your own identifying
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# information: Portions Copyright [yyyy] [name of copyright owner]
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby# CDDL HEADER END
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
6d52f363e3b2c0c5da672c5b8c8adec99d345f38Lori Alt# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby#
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby"""This module implements the "zfs holds" subcommand.
842727c2f41f01b380de4f5e787d905702870f23Chris KirbyThe only public interface is the zfs.holds.do_holds() function."""
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport optparse
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport sys
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport errno
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport time
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport zfs.util
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport zfs.dataset
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbyimport zfs.table
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby_ = zfs.util._
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirbydef do_holds():
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby """Implements the "zfs holds" subcommand."""
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby def usage(msg=None):
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby parser.print_help()
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby if msg:
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby print
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby parser.exit("zfs: error: " + msg)
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby else:
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby parser.exit()
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby u = _("""holds [-r] <snapshot> ...""")
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby parser = optparse.OptionParser(usage=u, prog="zfs")
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby parser.add_option("-r", action="store_true", dest="recursive",
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby help=_("list holds recursively"))
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby (options, args) = parser.parse_args(sys.argv[2:])
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby if len(args) < 1:
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby usage(_("missing snapshot argument"))
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby fields = ("name", "tag", "timestamp")
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby rjustfields = ()
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby printing = False
d7747cbcf0e2da91e8d0e3dfd6d3ac45da469773Chris Kirby gotone = False
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby t = zfs.table.Table(fields, rjustfields)
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby for ds in zfs.dataset.snapshots_fromcmdline(args, options.recursive):
d7747cbcf0e2da91e8d0e3dfd6d3ac45da469773Chris Kirby gotone = True
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby for tag, tm in ds.get_holds().iteritems():
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby val = {"name": ds.name, "tag": tag,
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby "timestamp": time.ctime(tm)}
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby t.addline(ds.name, val)
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby printing = True
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby if printing:
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby t.printme()
d7747cbcf0e2da91e8d0e3dfd6d3ac45da469773Chris Kirby elif not gotone:
d7747cbcf0e2da91e8d0e3dfd6d3ac45da469773Chris Kirby raise zfs.util.ZFSError(errno.ENOENT, _("no matching datasets"))