3 from twisted.python import usage
8 ["quiet", "q", "Operate silently."],
9 ["version", "V", "Display version numbers and exit."],
12 def opt_version(self):
14 print allmydata.get_package_versions_string()
20 ["multiple", "m", "allow multiple basedirs to be specified at once"],
23 def postOptions(self):
25 raise usage.UsageError("<basedir> parameter is required")
28 self['basedirs'] = [os.path.abspath(os.path.expanduser(b))
29 for b in self.basedirs]
31 def parseArgs(self, *args):
34 self.basedirs.append(self['basedir'])
36 self.basedirs.extend(args)
38 if len(args) == 0 and not self.basedirs:
39 if sys.platform == 'win32':
40 from allmydata.windows import registry
41 self.basedirs.append(registry.get_base_dir_path())
43 self.basedirs.append(os.path.expanduser("~/.tahoe"))
45 self.basedirs.append(args[0])
47 raise usage.UsageError("I wasn't expecting so many arguments")
49 class NoDefaultBasedirMixin(BasedirMixin):
50 def parseArgs(self, *args):
51 # create-client won't default to --basedir=~/.tahoe
54 self.basedirs.append(self['basedir'])
56 self.basedirs.extend(args)
59 self.basedirs.append(args[0])
61 raise usage.UsageError("I wasn't expecting so many arguments")
63 raise usage.UsageError("--basedir must be provided")
65 DEFAULT_ALIAS = "tahoe"
68 def get_aliases(nodedir):
69 from allmydata import uri
71 aliasfile = os.path.join(nodedir, "private", "aliases")
72 rootfile = os.path.join(nodedir, "private", "root_dir.cap")
74 f = open(rootfile, "r")
75 rootcap = f.read().strip()
77 aliases["tahoe"] = uri.from_string_dirnode(rootcap).to_string()
78 except EnvironmentError:
81 f = open(aliasfile, "r")
82 for line in f.readlines():
84 if line.startswith("#"):
86 name, cap = line.split(":", 1)
87 # normalize it: remove http: prefix, urldecode
89 aliases[name] = uri.from_string_dirnode(cap).to_string()
90 except EnvironmentError:
94 def get_alias(aliases, path, default):
95 # transform "work:path/filename" into (aliases["work"], "path/filename")
96 # We special-case URI:
97 if path.startswith("URI:"):
98 # The only way to get a sub-path is to use URI:blah:./foo, and we
99 # strip out the :./ sequence.
100 sep = path.find(":./")
102 return path[:sep], path[sep+3:]
104 colon = path.find(":")
107 return aliases[default], path
110 # no alias, but there's a colon in a dirname/filename, like
112 return aliases[default], path
113 return aliases[alias], path[colon+1:]
115 def escape_path(path):
116 segments = path.split("/")
117 return "/".join([urllib.quote(s) for s in segments])