xref: /freebsd/cddl/contrib/opensolaris/cmd/pyzfs/pyzfs.py (revision 8fc257994d0ce2396196d7a06d50d20c8015f4b7)
1*8fc25799SMartin Matuska#! /usr/bin/python2.4 -S
2*8fc25799SMartin Matuska#
3*8fc25799SMartin Matuska# CDDL HEADER START
4*8fc25799SMartin Matuska#
5*8fc25799SMartin Matuska# The contents of this file are subject to the terms of the
6*8fc25799SMartin Matuska# Common Development and Distribution License (the "License").
7*8fc25799SMartin Matuska# You may not use this file except in compliance with the License.
8*8fc25799SMartin Matuska#
9*8fc25799SMartin Matuska# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*8fc25799SMartin Matuska# or http://www.opensolaris.org/os/licensing.
11*8fc25799SMartin Matuska# See the License for the specific language governing permissions
12*8fc25799SMartin Matuska# and limitations under the License.
13*8fc25799SMartin Matuska#
14*8fc25799SMartin Matuska# When distributing Covered Code, include this CDDL HEADER in each
15*8fc25799SMartin Matuska# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*8fc25799SMartin Matuska# If applicable, add the following below this CDDL HEADER, with the
17*8fc25799SMartin Matuska# fields enclosed by brackets "[]" replaced with your own identifying
18*8fc25799SMartin Matuska# information: Portions Copyright [yyyy] [name of copyright owner]
19*8fc25799SMartin Matuska#
20*8fc25799SMartin Matuska# CDDL HEADER END
21*8fc25799SMartin Matuska#
22*8fc25799SMartin Matuska# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*8fc25799SMartin Matuska# Use is subject to license terms.
24*8fc25799SMartin Matuska#
25*8fc25799SMartin Matuska
26*8fc25799SMartin Matuska# Note, we want SIGINT (control-c) to exit the process quietly, to mimic
27*8fc25799SMartin Matuska# the standard behavior of C programs.  The best we can do with pure
28*8fc25799SMartin Matuska# Python is to run with -S (to disable "import site"), and start our
29*8fc25799SMartin Matuska# program with a "try" statement.  Hopefully nobody hits ^C before our
30*8fc25799SMartin Matuska# try statement is executed.
31*8fc25799SMartin Matuska
32*8fc25799SMartin Matuskatry:
33*8fc25799SMartin Matuska	import site
34*8fc25799SMartin Matuska	import gettext
35*8fc25799SMartin Matuska	import zfs.util
36*8fc25799SMartin Matuska	import zfs.ioctl
37*8fc25799SMartin Matuska	import sys
38*8fc25799SMartin Matuska	import errno
39*8fc25799SMartin Matuska
40*8fc25799SMartin Matuska	"""This is the main script for doing zfs subcommands.  It doesn't know
41*8fc25799SMartin Matuska	what subcommands there are, it just looks for a module zfs.<subcommand>
42*8fc25799SMartin Matuska	that implements that subcommand."""
43*8fc25799SMartin Matuska
44*8fc25799SMartin Matuska	_ = gettext.translation("SUNW_OST_OSCMD", "/usr/lib/locale",
45*8fc25799SMartin Matuska	    fallback=True).gettext
46*8fc25799SMartin Matuska
47*8fc25799SMartin Matuska	if len(sys.argv) < 2:
48*8fc25799SMartin Matuska		sys.exit(_("missing subcommand argument"))
49*8fc25799SMartin Matuska
50*8fc25799SMartin Matuska	zfs.ioctl.set_cmdstr(" ".join(["zfs"] + sys.argv[1:]))
51*8fc25799SMartin Matuska
52*8fc25799SMartin Matuska	try:
53*8fc25799SMartin Matuska		# import zfs.<subcommand>
54*8fc25799SMartin Matuska		# subfunc =  zfs.<subcommand>.do_<subcommand>
55*8fc25799SMartin Matuska
56*8fc25799SMartin Matuska		subcmd = sys.argv[1]
57*8fc25799SMartin Matuska		__import__("zfs." + subcmd)
58*8fc25799SMartin Matuska		submod = getattr(zfs, subcmd)
59*8fc25799SMartin Matuska		subfunc = getattr(submod, "do_" + subcmd)
60*8fc25799SMartin Matuska	except (ImportError, AttributeError):
61*8fc25799SMartin Matuska		sys.exit(_("invalid subcommand"))
62*8fc25799SMartin Matuska
63*8fc25799SMartin Matuska	try:
64*8fc25799SMartin Matuska		subfunc()
65*8fc25799SMartin Matuska	except zfs.util.ZFSError, e:
66*8fc25799SMartin Matuska		print(e)
67*8fc25799SMartin Matuska		sys.exit(1)
68*8fc25799SMartin Matuska
69*8fc25799SMartin Matuskaexcept IOError, e:
70*8fc25799SMartin Matuska	import errno
71*8fc25799SMartin Matuska	import sys
72*8fc25799SMartin Matuska
73*8fc25799SMartin Matuska	if e.errno == errno.EPIPE:
74*8fc25799SMartin Matuska		sys.exit(1)
75*8fc25799SMartin Matuska	raise
76*8fc25799SMartin Matuskaexcept KeyboardInterrupt:
77*8fc25799SMartin Matuska	import sys
78*8fc25799SMartin Matuska
79*8fc25799SMartin Matuska	sys.exit(1)
80