3 from cStringIO import StringIO
6 pkg_resources.require('twisted')
7 from twisted.python import usage
10 pkg_resources.require(allmydata.__appname__)
11 from allmydata.scripts.common import BaseOptions
12 from allmydata.scripts import debug, create_node, startstop_node, cli, keygen, stats_gatherer
13 from allmydata.util.encodingutil import quote_output, get_argv_encoding
16 # Usage.parseOptions compares argv[1] against command[0], so it will
17 # effectively ignore any "subcommand" that starts with a newline. We use
18 # these to insert section headers into the --help output.
19 return [("\n" + s, None, None, None)]
22 class Options(BaseOptions, usage.Options):
23 synopsis = "\nUsage: tahoe <command> [command options]"
24 subCommands = ( GROUP("Administration")
25 + create_node.subCommands
27 + stats_gatherer.subCommands
28 + GROUP("Controlling a node")
29 + startstop_node.subCommands
32 + GROUP("Using the filesystem")
36 def getUsage(self, **kwargs):
37 t = usage.Options.getUsage(self, **kwargs)
38 return t + "\nPlease run 'tahoe <command> --help' for more details on each command.\n"
40 def postOptions(self):
41 if not hasattr(self, 'subOptions'):
42 raise usage.UsageError("must specify a command")
46 stdin=None, stdout=None, stderr=None,
47 install_node_control=True, additional_commands=None):
49 stdin = stdin or sys.stdin
50 stdout = stdout or sys.stdout
51 stderr = stderr or sys.stderr
54 if install_node_control:
55 config.subCommands.extend(startstop_node.subCommands)
58 if additional_commands:
59 for ac in additional_commands:
60 config.subCommands.extend(ac.subCommands)
61 ac_dispatch.update(ac.dispatch)
64 config.parseOptions(argv)
65 except usage.error, e:
69 while hasattr(c, 'subOptions'):
71 print >>stdout, str(c)
73 msg = e.args[0].decode(get_argv_encoding())
76 print >>stdout, "%s: %s\n" % (sys.argv[0], quote_output(msg, quotemarks=False))
79 command = config.subCommand
80 so = config.subOptions
90 if command in create_node.dispatch:
91 for basedir in so.basedirs:
92 f = create_node.dispatch[command]
93 rc = f(basedir, so, stdout, stderr) or rc
94 elif command in startstop_node.dispatch:
95 rc = startstop_node.dispatch[command](so, stdout, stderr)
96 elif command in debug.dispatch:
97 rc = debug.dispatch[command](so)
98 elif command in cli.dispatch:
99 rc = cli.dispatch[command](so)
100 elif command in keygen.dispatch:
101 rc = keygen.dispatch[command](so, stdout, stderr)
102 elif command in stats_gatherer.dispatch:
103 rc = stats_gatherer.dispatch[command](so)
104 elif command in ac_dispatch:
105 rc = ac_dispatch[command](so, stdout, stderr)
107 raise usage.UsageError()
112 def run(install_node_control=True):
113 if sys.platform == "win32":
114 from allmydata.windows.fixups import initialize
117 rc = runner(sys.argv[1:], install_node_control=install_node_control)