default_nodedir = _default_nodedir
optParameters = [
- ["basedir", "C", None, "Same as --node-directory (default %s)."
+ ["basedir", "C", None, "Specify which Tahoe base directory should be used. [default: %s]"
% get_default_nodedir()],
]
if not self['basedir']:
raise usage.UsageError("A base directory for the node must be provided.")
+class NoDefaultBasedirOptions(BasedirOptions):
+ default_nodedir = None
+
+ optParameters = [
+ ["basedir", "C", None, "Specify which Tahoe base directory should be used."],
+ ]
+
+ # This is overridden in order to ensure we get a "Wrong number of arguments."
+ # error when more than one argument is given.
+ def parseArgs(self, basedir=None):
+ BasedirOptions.parseArgs(self, basedir)
+
+ def getSynopsis(self):
+ return "Usage: %s [global-opts] %s [options] NODEDIR" % (self.command_name, self.subcommand_name)
+
DEFAULT_ALIAS = u"tahoe"
import os, sys
-from allmydata.scripts.common import BasedirOptions
+from allmydata.scripts.common import BasedirOptions, NoDefaultBasedirOptions
from allmydata.util.assertutil import precondition
from allmydata.util.encodingutil import listdir_unicode, argv_to_unicode, quote_output
import allmydata
def getSynopsis(self):
return "Usage: %s [global-opts] create-client [options] [NODEDIR]" % (self.command_name,)
+ # This is overridden in order to ensure we get a "Wrong number of arguments."
+ # error when more than one argument is given.
+ def parseArgs(self, basedir=None):
+ BasedirOptions.parseArgs(self, basedir)
+
class CreateNodeOptions(CreateClientOptions):
optFlags = [
return "Usage: %s [global-opts] create-node [options] [NODEDIR]" % (self.command_name,)
-class CreateIntroducerOptions(BasedirOptions):
- default_nodedir = None
-
- def getSynopsis(self):
- return "Usage: %s [global-opts] create-introducer [options] NODEDIR" % (self.command_name,)
+class CreateIntroducerOptions(NoDefaultBasedirOptions):
+ subcommand_name = "create-introducer"
client_tac = """
import os, sys
-from allmydata.scripts.common import BasedirOptions
+from allmydata.scripts.common import NoDefaultBasedirOptions
from allmydata.util.assertutil import precondition
from allmydata.util.encodingutil import listdir_unicode, quote_output
-class CreateKeyGeneratorOptions(BasedirOptions):
- default_nodedir = None
- def getSynopsis(self):
- return "Usage: %s [global-opts] create-key-generator [options] NODEDIR" % (self.command_name,)
+class CreateKeyGeneratorOptions(NoDefaultBasedirOptions):
+ subcommand_name = "create-key-generator"
keygen_tac = """
class StartOptions(BasedirOptions):
+ subcommand_name = "start"
+
def parseArgs(self, basedir=None, *twistd_args):
- # this can't handle e.g. 'tahoe start --nodaemon', since then
- # --nodaemon looks like a basedir. So you can either use 'tahoe
- # start' or 'tahoe start BASEDIR --TWISTD-OPTIONS'.
+ # This can't handle e.g. 'tahoe start --nodaemon', since '--nodaemon'
+ # looks like an option to the tahoe subcommand, not to twistd.
+ # So you can either use 'tahoe start' or 'tahoe start NODEDIR --TWISTD-OPTIONS'.
+ # Note that 'tahoe --node-directory=NODEDIR start --TWISTD-OPTIONS' also
+ # isn't allowed, unfortunately.
+
BasedirOptions.parseArgs(self, basedir)
self.twistd_args = twistd_args
def getSynopsis(self):
- return "Usage: %s [global-opts] start [options] [NODEDIR]" % (self.command_name,)
+ return "Usage: %s [global-opts] %s [options] [NODEDIR [twistd-options]]" % (self.command_name, self.subcommand_name)
+
+ def getUsage(self, width=None):
+ t = BasedirOptions.getUsage(self, width) + "\n"
+ twistd_options = str(MyTwistdConfig()).partition("\n")[2].partition("\n\n")[0]
+ t += twistd_options.replace("Options:", "twistd-options:", 1)
+ t += """
+Note that if any twistd-options are used, NODEDIR must be specified explicitly
+(not by default or using -C/--basedir or -d/--node-directory), and followed by
+the twistd-options.
+"""
+ return t
class StopOptions(BasedirOptions):
+ def parseArgs(self, basedir=None):
+ BasedirOptions.parseArgs(self, basedir)
+
def getSynopsis(self):
return "Usage: %s [global-opts] stop [options] [NODEDIR]" % (self.command_name,)
-
class RestartOptions(StartOptions):
- def getSynopsis(self):
- return "Usage: %s [global-opts] restart [options] [NODEDIR]" % (self.command_name,)
-
+ subcommand_name = "restart"
class RunOptions(StartOptions):
- def getSynopsis(self):
- return "Usage: %s [global-opts] run [options] [NODEDIR]" % (self.command_name,)
+ subcommand_name = "run"
class MyTwistdConfig(twistd.ServerOptions):
twistd_config.parseOptions(twistd_args)
except usage.error, ue:
# these arguments were unsuitable for 'twistd'
- print >>err, twistd_config
- print >>err, "tahoe start: %s" % (config.subCommand, ue)
+ print >>err, config
+ print >>err, "tahoe %s: usage error from twistd: %s\n" % (config.subcommand_name, ue)
return 1
twistd_config.loadedPlugins = {"StartTahoeNode": StartTahoeNodePlugin(nodetype, basedir)}
import os, sys
-from allmydata.scripts.common import BasedirOptions
+from allmydata.scripts.common import NoDefaultBasedirOptions
from allmydata.util.assertutil import precondition
from allmydata.util.encodingutil import listdir_unicode, quote_output
-class CreateStatsGathererOptions(BasedirOptions):
- default_nodedir = None
- def getSynopsis(self):
- return "Usage: %s [global-opts] create-stats-gatherer [options] NODEDIR" % (self.command_name,)
+class CreateStatsGathererOptions(NoDefaultBasedirOptions):
+ subcommand_name = "create-stats-gatherer"
stats_gatherer_tac = """
def test_start(self):
help = str(startstop_node.StartOptions())
- self.failUnlessIn(" [global-opts] start [options] [NODEDIR]", help)
+ self.failUnlessIn(" [global-opts] start [options] [NODEDIR [twistd-options]]", help)
def test_stop(self):
help = str(startstop_node.StopOptions())
def test_restart(self):
help = str(startstop_node.RestartOptions())
- self.failUnlessIn(" [global-opts] restart [options] [NODEDIR]", help)
+ self.failUnlessIn(" [global-opts] restart [options] [NODEDIR [twistd-options]]", help)
def test_run(self):
help = str(startstop_node.RunOptions())
- self.failUnlessIn(" [global-opts] run [options] [NODEDIR]", help)
+ self.failUnlessIn(" [global-opts] run [options] [NODEDIR [twistd-options]]", help)
def test_create_client(self):
help = str(create_node.CreateClientOptions())
o = self.parse(["--node-directory", "there", "start"])
self.failUnlessEqual(o["basedir"], os.path.abspath("there"))
+ o = self.parse(["start", "here", "--nodaemon"])
+ self.failUnlessEqual(o["basedir"], os.path.abspath("here"))
+
self.failUnlessRaises(usage.UsageError, self.parse,
["--basedir", "there", "start"])
self.failUnlessRaises(usage.UsageError, self.parse,
["--node-directory=there",
"start", "--basedir=here", "anywhere"])
+ self.failUnlessRaises(usage.UsageError, self.parse,
+ ["--node-directory=there", "start", "--nodaemon"])
+ self.failUnlessRaises(usage.UsageError, self.parse,
+ ["start", "--basedir=here", "--nodaemon"])