3 # Unix SMB/CIFS implementation.
4 # Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2009
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 from samba
import getopt
as options
, Ldb
25 class Option(optparse
.Option
):
29 class Command(object):
32 def _get_description(self
):
33 return self
.__doc
__.splitlines()[0].rstrip("\n")
36 name
= self
.__class
__.__name
__
37 if name
.startswith("cmd_"):
41 name
= property(_get_name
)
43 def usage(self
, *args
):
44 parser
, _
= self
._create
_parser
()
47 description
= property(_get_description
)
49 def _get_synopsis(self
):
52 ret
+= " " + " ".join([x
.upper() for x
in self
.takes_args
])
55 synopsis
= property(_get_synopsis
)
59 takes_optiongroups
= {}
61 def _create_parser(self
):
62 parser
= optparse
.OptionParser(self
.synopsis
)
64 parser
.add_options(self
.takes_options
)
66 for name
, optiongroup
in self
.takes_optiongroups
.iteritems():
67 optiongroups
[name
] = optiongroup(parser
)
68 parser
.add_option_group(optiongroups
[name
])
69 return parser
, optiongroups
71 def message(self
, text
):
74 def _run(self
, *argv
):
75 parser
, optiongroups
= self
._create
_parser
()
76 opts
, args
= parser
.parse_args(list(argv
))
77 # Filter out options from option groups
79 kwargs
= dict(opts
.__dict
__)
80 for option_group
in parser
.option_groups
:
81 for option
in option_group
.option_list
:
82 del kwargs
[option
.dest
]
83 kwargs
.update(optiongroups
)
86 for i
, arg
in enumerate(self
.takes_args
):
87 if arg
[-1] not in ("?", "*"):
92 if len(args
) < min_args
or (max_args
!= -1 and len(args
) > max_args
):
96 return self
.run(*args
, **kwargs
)
97 except CommandError
, e
:
98 print >>sys
.stderr
, "ERROR: %s" % e
102 """Run the command. This should be overriden by all subclasses."""
103 raise NotImplementedError(self
.run
)
106 class SuperCommand(Command
):
107 """A command with subcommands."""
111 def _run(self
, myname
, subcommand
=None, *args
):
112 if subcommand
is None:
113 print "Available subcommands:"
114 for subcommand
in self
.subcommands
:
115 print "\t%s" % subcommand
117 if not subcommand
in self
.subcommands
:
118 raise CommandError("No such subcommand '%s'" % subcommand
)
119 return self
.subcommands
[subcommand
]._run
(subcommand
, *args
)
121 def usage(self
, myname
, subcommand
=None, *args
):
122 if subcommand
is None or not subcommand
in self
.subcommands
:
123 print "Usage: %s (%s) [options]" % (myname
,
124 " | ".join(self
.subcommands
.keys()))
126 return self
.subcommands
[subcommand
].usage(*args
)
129 class CommandError(Exception):
134 from samba
.netcmd
.pwsettings
import cmd_pwsettings
135 commands
["pwsettings"] = cmd_pwsettings()
136 from samba
.netcmd
.domainlevel
import cmd_domainlevel
137 commands
["domainlevel"] = cmd_domainlevel()
138 from samba
.netcmd
.setpassword
import cmd_setpassword
139 commands
["setpassword"] = cmd_setpassword()
140 from samba
.netcmd
.setexpiry
import cmd_setexpiry
141 commands
["setexpiry"] = cmd_setexpiry()
142 from samba
.netcmd
.enableaccount
import cmd_enableaccount
143 commands
["enableaccount"] = cmd_enableaccount()
144 from samba
.netcmd
.newuser
import cmd_newuser
145 commands
["newuser"] = cmd_newuser()
146 from samba
.netcmd
.ntacl
import cmd_acl
147 commands
["acl"] = cmd_acl()
148 from samba
.netcmd
.fsmo
import cmd_fsmo
149 commands
["fsmo"] = cmd_fsmo()