CLI: add create-alias command, to merge mkdir and add-alias into a single (secure-from-argv-snooping) step

This commit is contained in:
Brian Warner 2008-08-01 19:10:41 -07:00
parent dc57ab4d36
commit 2eec38279d
4 changed files with 75 additions and 2 deletions

View File

@ -199,11 +199,15 @@ tahoe add-alias fun DIRCAP
tahoe add-alias fun URI:DIR2:ovjy4yhylqlfoqg2vcze36dhde:4d4f47qko2xm5g7osgo2yyidi5m4muyo2vjjy53q4vjju2u55mfa
This create an alias "fun:" and configures it to use the given directory
This creates an alias "fun:" and configures it to use the given directory
cap. Once this is done, "tahoe ls fun:" will list the contents of this
directory. Use "tahoe add-alias tahoe DIRCAP" to set the contents of the
default "tahoe:" alias.
tahoe create-alias fun
This combines 'tahoe mkdir' and 'tahoe add-alias' into a single step.
tahoe list-aliases
This displays a table of all configured aliases.

View File

@ -56,6 +56,10 @@ class AddAliasOptions(VDriveOptions):
self.alias = alias
self.cap = cap
class CreateAliasOptions(VDriveOptions):
def parseArgs(self, alias):
self.alias = alias
class ListAliasOptions(VDriveOptions):
pass
@ -192,6 +196,7 @@ class ReplOptions(usage.Options):
subCommands = [
["mkdir", None, MakeDirectoryOptions, "Create a new directory"],
["add-alias", None, AddAliasOptions, "Add a new alias cap"],
["create-alias", None, CreateAliasOptions, "Create a new alias cap"],
["list-aliases", None, ListAliasOptions, "List all alias caps"],
["ls", None, ListOptions, "List a directory"],
["get", None, GetOptions, "Retrieve a file from the virtual drive."],
@ -214,6 +219,11 @@ def add_alias(options):
rc = tahoe_add_alias.add_alias(options)
return rc
def create_alias(options):
from allmydata.scripts import tahoe_add_alias
rc = tahoe_add_alias.create_alias(options)
return rc
def list_aliases(options):
from allmydata.scripts import tahoe_add_alias
rc = tahoe_add_alias.list_aliases(options)
@ -282,6 +292,7 @@ def repl(options):
dispatch = {
"mkdir": mkdir,
"add-alias": add_alias,
"create-alias": create_alias,
"list-aliases": list_aliases,
"ls": list,
"get": get,

View File

@ -1,6 +1,7 @@
import os.path
from allmydata import uri
from allmydata.scripts.common_http import do_http, check_http_error
from allmydata.scripts.common import get_aliases
def add_alias(options):
@ -20,6 +21,33 @@ def add_alias(options):
print >>stdout, "Alias '%s' added" % (alias,)
return 0
def create_alias(options):
# mkdir+add_alias
nodedir = options['node-directory']
alias = options.alias
stdout = options.stdout
stderr = options.stderr
aliasfile = os.path.join(nodedir, "private", "aliases")
assert ":" not in alias
assert " " not in alias
nodeurl = options['node-url']
if not nodeurl.endswith("/"):
nodeurl += "/"
url = nodeurl + "uri?t=mkdir"
resp = do_http("POST", url)
rc = check_http_error(resp, stderr)
if rc:
return rc
new_uri = resp.read().strip()
# probably check for others..
f = open(aliasfile, "a")
f.write("%s: %s\n" % (alias, new_uri))
f.close()
print >>stdout, "Alias '%s' created" % (alias,)
return 0
def list_aliases(options):
nodedir = options['node-directory']
stdout = options.stdout

View File

@ -1,4 +1,5 @@
import os.path
from twisted.trial import unittest
from cStringIO import StringIO
import urllib
@ -9,7 +10,7 @@ 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 tahoe_ls, tahoe_get, tahoe_put, tahoe_rm
from allmydata.scripts.common import DEFAULT_ALIAS
from allmydata.scripts.common import DEFAULT_ALIAS, get_aliases
_hush_pyflakes = [tahoe_ls, tahoe_get, tahoe_put, tahoe_rm]
from allmydata.scripts import cli, debug, runner
@ -216,6 +217,35 @@ class CLI(unittest.TestCase):
self.failUnless("storage index: nt4fwemuw7flestsezvo2eveke" in output, output)
self.failUnless("fingerprint: 737p57x6737p57x6737p57x6737p57x6737p57x6737p57x6737a" in output, output)
class CreateAlias(SystemTestMixin, unittest.TestCase):
def do_cli(self, verb, *args, **kwargs):
nodeargs = [
"--node-directory", self.getdir("client0"),
]
argv = [verb] + nodeargs + list(args)
stdin = kwargs.get("stdin", "")
stdout, stderr = StringIO(), StringIO()
d = threads.deferToThread(runner.runner, argv, run_by_human=False,
stdin=StringIO(stdin),
stdout=stdout, stderr=stderr)
def _done(res):
return stdout.getvalue(), stderr.getvalue()
d.addCallback(_done)
return d
def test_create(self):
self.basedir = os.path.dirname(self.mktemp())
d = self.set_up_nodes()
d.addCallback(lambda res: self.do_cli("create-alias", "tahoe"))
def _done((stdout,stderr)):
self.failUnless("Alias 'tahoe' created" in stdout)
self.failIf(stderr)
aliases = get_aliases(self.getdir("client0"))
self.failUnless("tahoe" in aliases)
self.failUnless(aliases["tahoe"].startswith("URI:DIR2:"))
d.addCallback(_done)
return d
class Put(SystemTestMixin, unittest.TestCase):