s4 net: Add spn module to list/add/remove spn on objects
[samba.git] / source4 / scripting / python / samba / netcmd / __init__.py
index 4be8977b452306e2755b6adddd916d19184ffd65..08ddcefe910adb2aa63e914880f5bfc4bcb2e9ea 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 # Unix SMB/CIFS implementation.
 # Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2009
@@ -18,7 +18,8 @@
 #
 
 import optparse
-from samba import getopt as options, Ldb
+from samba import getopt as options
+import sys
 
 
 class Option(optparse.Option):
@@ -39,35 +40,66 @@ class Command(object):
 
     name = property(_get_name)
 
-    def usage(self):
-        self.parser.print_usage()
+    def usage(self, *args):
+        parser, _ = self._create_parser()
+        parser.print_usage()
 
     description = property(_get_description)
 
     def _get_synopsis(self):
         ret = self.name
         if self.takes_args:
-            ret += " " + " ".join(self.takes_args)
+            ret += " " + " ".join([x.upper() for x in self.takes_args])
         return ret
 
     synopsis = property(_get_synopsis)
 
+    outf = sys.stdout
+
     takes_args = []
     takes_options = []
-    takes_optiongroups = []
-
-    def __init__(self):
-        self.parser = optparse.OptionParser(self.synopsis)
-        self.parser.add_options(self.takes_options)
-        for optiongroup in self.takes_optiongroups:
-            self.parser.add_option_group(optiongroup(self.parser))
+    takes_optiongroups = {}
+
+    def _create_parser(self):
+        parser = optparse.OptionParser(self.synopsis)
+        parser.prog = "net"
+        parser.add_options(self.takes_options)
+        optiongroups = {}
+        for name, optiongroup in self.takes_optiongroups.iteritems():
+            optiongroups[name] = optiongroup(parser)
+            parser.add_option_group(optiongroups[name])
+        return parser, optiongroups
 
     def message(self, text):
         print text
 
     def _run(self, *argv):
-        opts, args = self.parser.parse_args(list(argv))
-        return self.run(*args, **opts.__dict__)
+        parser, optiongroups = self._create_parser()
+        opts, args = parser.parse_args(list(argv))
+        # Filter out options from option groups
+        args = args[1:]
+        kwargs = dict(opts.__dict__)
+        for option_group in parser.option_groups:
+            for option in option_group.option_list:
+                if option.dest is not None:
+                    del kwargs[option.dest]
+        kwargs.update(optiongroups)
+        min_args = 0
+        max_args = 0
+        for i, arg in enumerate(self.takes_args):
+            if arg[-1] not in ("?", "*"):
+                min_args += 1
+            max_args += 1
+            if arg[-1] == "*":
+                max_args = -1
+        if len(args) < min_args or (max_args != -1 and len(args) > max_args):
+            self.usage(*args)
+            return -1
+        try:
+            return self.run(*args, **kwargs)
+        except CommandError, e:
+            print >>sys.stderr, "ERROR: %s" % e
+            return -1
 
     def run(self):
         """Run the command. This should be overriden by all subclasses."""
@@ -79,25 +111,22 @@ class SuperCommand(Command):
 
     subcommands = {}
 
-    def run(self, subcommand, *args, **kwargs):
-        if not subcommand in subcommands:
-            print >>sys.stderr, "ERROR: No such subcommand '%s'" % subcommand
-        try:
-            return subcommands[subcommand].run(*args, **kwargs)
-        except CommandError, e:
-            print >>sys.stderr, "ERROR: %s" % e.message
-            return -1
-
-    def usage(self, subcommand=None, *args, **kwargs):
+    def _run(self, myname, subcommand=None, *args):
         if subcommand is None:
-            print "Available subcommands"
-            for subcommand in subcommands:
+            print "Available subcommands:"
+            for subcommand in self.subcommands:
                 print "\t%s" % subcommand
             return 0
+        if not subcommand in self.subcommands:
+            raise CommandError("No such subcommand '%s'" % subcommand)
+        return self.subcommands[subcommand]._run(subcommand, *args)
+
+    def usage(self, myname, subcommand=None, *args):
+        if subcommand is None or not subcommand in self.subcommands:
+            print "Usage: %s (%s) [options]" % (myname,
+                " | ".join(self.subcommands.keys()))
         else:
-            if not subcommand in subcommands:
-                print >>sys.stderr, "ERROR: No such subcommand '%s'" % subcommand
-            return subcommands[subcommand].usage(*args, **kwargs)
+            return self.subcommands[subcommand].usage(*args)
 
 
 class CommandError(Exception):
@@ -107,3 +136,31 @@ class CommandError(Exception):
 commands = {}
 from samba.netcmd.pwsettings import cmd_pwsettings
 commands["pwsettings"] = cmd_pwsettings()
+from samba.netcmd.domainlevel import cmd_domainlevel
+commands["domainlevel"] = cmd_domainlevel()
+from samba.netcmd.setpassword import cmd_setpassword
+commands["setpassword"] = cmd_setpassword()
+from samba.netcmd.setexpiry import cmd_setexpiry
+commands["setexpiry"] = cmd_setexpiry()
+from samba.netcmd.enableaccount import cmd_enableaccount
+commands["enableaccount"] = cmd_enableaccount()
+from samba.netcmd.newuser import cmd_newuser
+commands["newuser"] = cmd_newuser()
+from samba.netcmd.netacl import cmd_acl
+commands["acl"] = cmd_acl()
+from samba.netcmd.fsmo import cmd_fsmo
+commands["fsmo"] = cmd_fsmo()
+from samba.netcmd.export import cmd_export
+commands["export"] = cmd_export()
+from samba.netcmd.time import cmd_time
+commands["time"] = cmd_time()
+from samba.netcmd.user import cmd_user
+commands["user"] = cmd_user()
+from samba.netcmd.vampire import cmd_vampire
+commands["vampire"] = cmd_vampire()
+from samba.netcmd.machinepw import cmd_machinepw
+commands["machinepw"] = cmd_machinepw()
+from samba.netcmd.spn import cmd_spn
+commands["spn"] = cmd_spn()
+from samba.netcmd.group import cmd_group
+commands["group"] = cmd_group()