Use CommandError exception to deal with problems during net commands.
authorJelmer Vernooij <jelmer@samba.org>
Mon, 28 Dec 2009 15:05:04 +0000 (16:05 +0100)
committerJelmer Vernooij <jelmer@ganieda.vernstok.nl>
Tue, 29 Dec 2009 15:26:19 +0000 (16:26 +0100)
source4/scripting/python/samba/getopt.py
source4/scripting/python/samba/netcmd/__init__.py

index 8b756b2d6fcf26225bd28e78aff721e12d16da67..48d48dc260ed925b981a5849942807829bbb1c97 100644 (file)
@@ -2,17 +2,17 @@
 
 # Samba-specific bits for optparse
 # Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
-#   
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
-#   
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-#   
+#
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
@@ -30,7 +30,7 @@ class SambaOptions(optparse.OptionGroup):
     def __init__(self, parser):
         optparse.OptionGroup.__init__(self, parser, "Samba Common Options")
         self.add_option("-s", "--configfile", action="callback",
-                        type=str, metavar="FILE", help="Configuration file", 
+                        type=str, metavar="FILE", help="Configuration file",
                         callback=self._load_configfile)
         self._configfile = None
 
@@ -73,15 +73,15 @@ class CredentialsOptions(optparse.OptionGroup):
                         help="DN to use for a simple bind")
         self.add_option("--password", metavar="PASSWORD", action="callback",
                         help="Password", type=str, callback=self._set_password)
-        self.add_option("-U", "--username", metavar="USERNAME", 
+        self.add_option("-U", "--username", metavar="USERNAME",
                         action="callback", type=str,
                         help="Username", callback=self._parse_username)
-        self.add_option("-W", "--workgroup", metavar="WORKGROUP", 
+        self.add_option("-W", "--workgroup", metavar="WORKGROUP",
                         action="callback", type=str,
                         help="Workgroup", callback=self._parse_workgroup)
         self.add_option("-N", "--no-pass", action="store_true",
                         help="Don't ask for a password")
-        self.add_option("-k", "--kerberos", metavar="KERBEROS", 
+        self.add_option("-k", "--kerberos", metavar="KERBEROS",
                         action="callback", type=str,
                         help="Use Kerberos", callback=self._set_kerberos)
         self.creds = Credentials()
index 16f19f8b24913e5c23f3585f56d0ef24eada8f31..4be8977b452306e2755b6adddd916d19184ffd65 100644 (file)
@@ -29,7 +29,7 @@ class Command(object):
     """A net command."""
 
     def _get_description(self):
-        return self.__doc__.splitlines()[-1].rstrip("\n")
+        return self.__doc__.splitlines()[0].rstrip("\n")
 
     def _get_name(self):
         name = self.__class__.__name__
@@ -44,15 +44,26 @@ class Command(object):
 
     description = property(_get_description)
 
+    def _get_synopsis(self):
+        ret = self.name
+        if self.takes_args:
+            ret += " " + " ".join(self.takes_args)
+        return ret
+
+    synopsis = property(_get_synopsis)
+
     takes_args = []
     takes_options = []
+    takes_optiongroups = []
 
     def __init__(self):
-        synopsis = self.name
-        if self.takes_args:
-            synopsis += " " + " ".join(self.takes_args)
-        self.parser = optparse.OptionParser(synopsis)
+        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))
+
+    def message(self, text):
+        print text
 
     def _run(self, *argv):
         opts, args = self.parser.parse_args(list(argv))
@@ -70,8 +81,12 @@ class SuperCommand(Command):
 
     def run(self, subcommand, *args, **kwargs):
         if not subcommand in subcommands:
-            print >>sys.stderr, "No such subcommand '%s'" % subcommand
-        return subcommands[subcommand].run(*args, **kwargs)
+            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):
         if subcommand is None:
@@ -81,15 +96,14 @@ class SuperCommand(Command):
             return 0
         else:
             if not subcommand in subcommands:
-                print >>sys.stderr, "No such subcommand '%s'" % subcommand
+                print >>sys.stderr, "ERROR: No such subcommand '%s'" % subcommand
             return subcommands[subcommand].usage(*args, **kwargs)
 
 
-class FooCommand(Command):
+class CommandError(Exception):
+    pass
 
-    def run(self, bar):
-        print "LALALA" + bar
-        return 0
 
 commands = {}
-commands["foo"] = FooCommand()
+from samba.netcmd.pwsettings import cmd_pwsettings
+commands["pwsettings"] = cmd_pwsettings()