From 5b28411b04f04056be5818a184728aeebf1f352a Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Thu, 11 Oct 2007 00:30:36 -0700 Subject: [PATCH] cli: add --node-directory and --root-uri to all commands --- src/allmydata/scripts/cli.py | 58 +++++++++++++++++++++++++--- src/allmydata/scripts/tahoe_get.py | 10 +++-- src/allmydata/scripts/tahoe_ls.py | 12 ++++-- src/allmydata/scripts/tahoe_put.py | 10 +++-- src/allmydata/scripts/tahoe_rm.py | 10 +++-- src/allmydata/test/test_cli.py | 62 ++++++++++++++++++++++++++++++ 6 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 src/allmydata/test/test_cli.py diff --git a/src/allmydata/scripts/cli.py b/src/allmydata/scripts/cli.py index de394d35..7b2a7d32 100644 --- a/src/allmydata/scripts/cli.py +++ b/src/allmydata/scripts/cli.py @@ -7,14 +7,56 @@ NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") class VDriveOptions(BaseOptions, usage.Options): optParameters = [ + ["node-directory", "d", "~/.tahoe", + "Look here to find out which Tahoe node should be used for all " + "operations. The directory should either contain a full Tahoe node, " + "or a file named node.url which points to some other Tahoe node. " + "It should also contain a file named my_vdrive.uri which contains " + "the root dirnode URI that should be used, and a file named " + "global_root.uri which contains the public global root dirnode URI." + ], ["node-url", "u", None, - "URL of the tahoe node to use, a URL like \"http://127.0.0.1:8123\""], + "URL of the tahoe node to use, a URL like \"http://127.0.0.1:8123\". " + "This overrides the URL found in the --node-directory ."], + ["root-uri", "r", "private", + "Which dirnode URI should be used as a root directory. The string " + "'public' is special, and means we should use the public global root " + "as found in the global_root.uri file in the --node-directory . The " + "string 'private' is also special, and means we should use the " + "private vdrive as found in the my_vdrive.uri file in the " + "--node-directory ."], ] def postOptions(self): - if not isinstance(self['node-url'], basestring) or not NODEURL_RE.match(self['node-url']): - raise usage.UsageError("--node-url is required to be a string and look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (self['node-url'],)) - + # compute a node-url from the existing options, put in self['node-url'] + if self['node-directory']: + self['node-directory'] = os.path.expanduser(self['node-directory']) + if self['node-url']: + if (not isinstance(self['node-url'], basestring) + or not NODEURL_RE.match(self['node-url'])): + msg = ("--node-url is required to be a string and look like " + "\"http://HOSTNAMEORADDR:PORT\", not: %r" % + (self['node-url'],)) + raise usage.UsageError(msg) + else: + node_url_file = os.path.join(self['node-directory'], "node.url") + self['node-url'] = open(node_url_file, "r").read().strip() + + # also compute self['root-uri'] + if self['root-uri'] == "private": + uri_file = os.path.join(self['node-directory'], "my_vdrive.uri") + self['root-uri'] = open(uri_file, "r").read().strip() + elif self['root-uri'] == "public": + uri_file = os.path.join(self['node-directory'], "global_root.uri") + self['root-uri'] = open(uri_file, "r").read().strip() + else: + from allmydata import uri + parsed = uri.from_string(self['root-uri']) + if not uri.IDirnodeURI.providedBy(parsed): + raise usage.UsageError("--root-uri must be a dirnode URI, or " + "'public' or 'private'") + + class ListOptions(VDriveOptions): def parseArgs(self, vdrive_pathname=""): self['vdrive_pathname'] = vdrive_pathname @@ -63,6 +105,7 @@ subCommands = [ def list(config, stdout, stderr): from allmydata.scripts import tahoe_ls rc = tahoe_ls.list(config['node-url'], + config['root-uri'], config['vdrive_pathname']) return rc @@ -71,6 +114,7 @@ def get(config, stdout, stderr): vdrive_filename = config['vdrive_filename'] local_filename = config['local_filename'] rc = tahoe_get.get(config['node-url'], + config['root-uri'], vdrive_filename, local_filename) if rc == 0: @@ -93,6 +137,7 @@ def put(config, stdout, stderr): else: verbosity = 2 rc = tahoe_put.put(config['node-url'], + config['root-uri'], local_filename, vdrive_filename, verbosity) @@ -106,8 +151,9 @@ def rm(config, stdout, stderr): else: verbosity = 2 rc = tahoe_rm.rm(config['node-url'], - vdrive_pathname, - verbosity) + config['root-uri'], + vdrive_pathname, + verbosity) return rc dispatch = { diff --git a/src/allmydata/scripts/tahoe_get.py b/src/allmydata/scripts/tahoe_get.py index 2bcf2ee4..ddc18d21 100644 --- a/src/allmydata/scripts/tahoe_get.py +++ b/src/allmydata/scripts/tahoe_get.py @@ -2,10 +2,10 @@ import sys, urllib -def get(nodeurl, vdrive_fname, local_file): +def get(nodeurl, root_uri, vdrive_fname, local_file): if nodeurl[-1] != "/": nodeurl += "/" - url = nodeurl + "vdrive/global/" + url = nodeurl + "uri/%s/" % root_uri.replace("/","!") if vdrive_fname: url += vdrive_fname @@ -28,19 +28,23 @@ def main(): import optparse, re parser = optparse.OptionParser() parser.add_option("-u", "--nodeurl", dest="nodeurl") + parser.add_option("-r", "--root-uri", dest="rooturi") (options, args) = parser.parse_args() NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") if not isinstance(options.nodeurl, basestring) or not NODEURL_RE.match(options.nodeurl): raise ValueError("--node-url is required to be a string and look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (options.nodeurl,)) + + if not options.rooturi: + raise ValueError("must provide --root-uri") vdrive_fname = args[0] local_file = None if len(args) > 1: local_file = args[1] - get(options.nodeurl, vdrive_fname, local_file) + get(options.nodeurl, options.rooturi, vdrive_fname, local_file) if __name__ == '__main__': main() diff --git a/src/allmydata/scripts/tahoe_ls.py b/src/allmydata/scripts/tahoe_ls.py index 9b3e75e7..21ad1017 100644 --- a/src/allmydata/scripts/tahoe_ls.py +++ b/src/allmydata/scripts/tahoe_ls.py @@ -3,10 +3,10 @@ import urllib import simplejson -def list(nodeurl, vdrive_pathname): +def list(nodeurl, root_uri, vdrive_pathname): if nodeurl[-1] != "/": nodeurl += "/" - url = nodeurl + "vdrive/global/" + url = nodeurl + "uri/%s/" % root_uri.replace("/","!") if vdrive_pathname: url += vdrive_pathname url += "?t=json" @@ -32,18 +32,22 @@ def main(): import optparse, re parser = optparse.OptionParser() parser.add_option("-u", "--node-url", dest="nodeurl") + parser.add_option("-r", "--root-uri", dest="rooturi") (options, args) = parser.parse_args() NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") if not isinstance(options.nodeurl, basestring) or not NODEURL_RE.match(options.nodeurl): raise ValueError("--node-url is required to be a string and look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (options.nodeurl,)) - + + if not options.rooturi: + raise ValueError("must provide --root-uri") + vdrive_pathname = "" if args: vdrive_pathname = args[0] - list(options.nodeurl, vdrive_pathname) + list(options.nodeurl, options.rooturi, vdrive_pathname) if __name__ == '__main__': main() diff --git a/src/allmydata/scripts/tahoe_put.py b/src/allmydata/scripts/tahoe_put.py index 4496239b..8089078d 100644 --- a/src/allmydata/scripts/tahoe_put.py +++ b/src/allmydata/scripts/tahoe_put.py @@ -4,7 +4,7 @@ import re, socket NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") -def put(nodeurl, local_fname, vdrive_fname, verbosity): +def put(nodeurl, root_uri, local_fname, vdrive_fname, verbosity): """ @param verbosity: 0, 1, or 2, meaning quiet, verbose, or very verbose @@ -14,7 +14,7 @@ def put(nodeurl, local_fname, vdrive_fname, verbosity): host = mo.group(1) port = int(mo.group(3)) - url = "/vdrive/global/" + url = "/uri/%s/" % root_uri.replace("/","!") if vdrive_fname: url += vdrive_fname @@ -76,19 +76,23 @@ def main(): import optparse, re parser = optparse.OptionParser() parser.add_option("-u", "--node-url", dest="nodeurl") + parser.add_option("-r", "--root-uri", dest="rooturi") (options, args) = parser.parse_args() NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") if not isinstance(options.nodeurl, basestring) or not NODEURL_RE.match(options.nodeurl): raise ValueError("--node-url is required to be a string and look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (options.nodeurl,)) + + if not options.rooturi: + raise ValueError("must provide --root-uri") local_file = args[0] vdrive_fname = None if len(args) > 1: vdrive_fname = args[1] - return put(options.nodeurl, vdrive_fname, local_file) + return put(options.nodeurl, options.rooturi, vdrive_fname, local_file) if __name__ == '__main__': main() diff --git a/src/allmydata/scripts/tahoe_rm.py b/src/allmydata/scripts/tahoe_rm.py index 92618fd2..ebd1ced0 100644 --- a/src/allmydata/scripts/tahoe_rm.py +++ b/src/allmydata/scripts/tahoe_rm.py @@ -4,7 +4,7 @@ import re, socket NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") -def rm(nodeurl, vdrive_pathname, verbosity): +def rm(nodeurl, root_uri, vdrive_pathname, verbosity): """ @param verbosity: 0, 1, or 2, meaning quiet, verbose, or very verbose @@ -14,7 +14,7 @@ def rm(nodeurl, vdrive_pathname, verbosity): host = mo.group(1) port = int(mo.group(3)) - url = "/vdrive/global/" + url = "/uri/%s/" % root_uri.replace("/","!") if vdrive_pathname: url += vdrive_pathname @@ -61,16 +61,20 @@ def main(): import optparse, re parser = optparse.OptionParser() parser.add_option("-u", "--node-url", dest="nodeurl") + parser.add_option("-r", "--root-uri", dest="rooturi") (options, args) = parser.parse_args() NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?") if not isinstance(options.nodeurl, basestring) or not NODEURL_RE.match(options.nodeurl): raise ValueError("--node-url is required to be a string and look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (options.nodeurl,)) + + if not options.rooturi: + raise ValueError("must provide --root-uri") vdrive_pathname = args[0] - return rm(options.nodeurl, vdrive_pathname, 0) + return rm(options.nodeurl, options.rooturi, vdrive_pathname, 0) if __name__ == '__main__': main() diff --git a/src/allmydata/test/test_cli.py b/src/allmydata/test/test_cli.py new file mode 100644 index 00000000..e675d232 --- /dev/null +++ b/src/allmydata/test/test_cli.py @@ -0,0 +1,62 @@ + +from twisted.trial import unittest + +from allmydata.util import fileutil +from allmydata import uri + +# at least import the CLI scripts, even if we don't have any real tests for +# them yet. + +from allmydata.scripts import cli, tahoe_ls, tahoe_get, tahoe_put, tahoe_rm + + +class CLI(unittest.TestCase): + def test_options(self): + fileutil.rm_dir("cli/test_options") + fileutil.make_dirs("cli/test_options") + open("cli/test_options/node.url","w").write("http://localhost:8080/\n") + private_uri = uri.DirnodeURI("furl", "key").to_string() + public_uri = uri.DirnodeURI("furl", "publickey").to_string() + open("cli/test_options/my_vdrive.uri", "w").write(private_uri + "\n") + open("cli/test_options/global_root.uri", "w").write(public_uri + "\n") + o = cli.ListOptions() + o.parseOptions(["--node-directory", "cli/test_options"]) + self.failUnlessEqual(o['node-url'], "http://localhost:8080/") + self.failUnlessEqual(o['root-uri'], private_uri) + self.failUnlessEqual(o['vdrive_pathname'], "") + + o = cli.ListOptions() + o.parseOptions(["--node-directory", "cli/test_options", + "--node-url", "http://example.org:8111/"]) + self.failUnlessEqual(o['node-url'], "http://example.org:8111/") + self.failUnlessEqual(o['root-uri'], private_uri) + self.failUnlessEqual(o['vdrive_pathname'], "") + + o = cli.ListOptions() + o.parseOptions(["--node-directory", "cli/test_options", + "--root-uri", "private"]) + self.failUnlessEqual(o['node-url'], "http://localhost:8080/") + self.failUnlessEqual(o['root-uri'], private_uri) + self.failUnlessEqual(o['vdrive_pathname'], "") + + o = cli.ListOptions() + o.parseOptions(["--node-directory", "cli/test_options", + "--root-uri", "public"]) + self.failUnlessEqual(o['node-url'], "http://localhost:8080/") + self.failUnlessEqual(o['root-uri'], public_uri) + self.failUnlessEqual(o['vdrive_pathname'], "") + + o = cli.ListOptions() + other_uri = uri.DirnodeURI("furl", "otherkey").to_string() + o.parseOptions(["--node-directory", "cli/test_options", + "--root-uri", other_uri]) + self.failUnlessEqual(o['node-url'], "http://localhost:8080/") + self.failUnlessEqual(o['root-uri'], other_uri) + self.failUnlessEqual(o['vdrive_pathname'], "") + + o = cli.ListOptions() + o.parseOptions(["--node-directory", "cli/test_options", + "--root-uri", other_uri, "subdir"]) + self.failUnlessEqual(o['node-url'], "http://localhost:8080/") + self.failUnlessEqual(o['root-uri'], other_uri) + self.failUnlessEqual(o['vdrive_pathname'], "subdir") -- 2.45.2