3 from twisted.python import usage
7 # unit tests can override these to point at StringIO instances
13 ["quiet", "q", "Operate silently."],
14 ["version", "V", "Display version numbers and exit."],
15 ["version-and-path", "v", "Display version numbers and paths to their locations and exit."],
18 def opt_version(self):
20 print allmydata.get_package_versions_string()
23 def opt_version_and_path(self):
25 print allmydata.get_package_versions_string(show_paths=True)
31 ["multiple", "m", "allow multiple basedirs to be specified at once"],
34 def postOptions(self):
36 raise usage.UsageError("<basedir> parameter is required")
39 self['basedirs'] = [os.path.abspath(os.path.expanduser(b))
40 for b in self.basedirs]
42 def parseArgs(self, *args):
45 self.basedirs.append(self['basedir'])
47 self.basedirs.extend(args)
49 if len(args) == 0 and not self.basedirs:
50 if sys.platform == 'win32':
51 from allmydata.windows import registry
52 self.basedirs.append(registry.get_base_dir_path())
54 self.basedirs.append(os.path.expanduser("~/.tahoe"))
56 self.basedirs.append(args[0])
58 raise usage.UsageError("I wasn't expecting so many arguments")
60 class NoDefaultBasedirMixin(BasedirMixin):
61 def parseArgs(self, *args):
62 # create-client won't default to --basedir=~/.tahoe
65 self.basedirs.append(self['basedir'])
67 self.basedirs.extend(args)
70 self.basedirs.append(args[0])
72 raise usage.UsageError("I wasn't expecting so many arguments")
74 raise usage.UsageError("--basedir must be provided")
76 DEFAULT_ALIAS = "tahoe"
79 def get_aliases(nodedir):
80 from allmydata import uri
82 aliasfile = os.path.join(nodedir, "private", "aliases")
83 rootfile = os.path.join(nodedir, "private", "root_dir.cap")
85 f = open(rootfile, "r")
86 rootcap = f.read().strip()
88 aliases["tahoe"] = uri.from_string_dirnode(rootcap).to_string()
89 except EnvironmentError:
92 f = open(aliasfile, "r")
93 for line in f.readlines():
95 if line.startswith("#") or not line:
97 name, cap = line.split(":", 1)
98 # normalize it: remove http: prefix, urldecode
100 aliases[name] = uri.from_string_dirnode(cap).to_string()
101 except EnvironmentError:
105 class DefaultAliasMarker:
108 def get_alias(aliases, path, default):
109 # transform "work:path/filename" into (aliases["work"], "path/filename").
110 # If default=None, then an empty alias is indicated by returning
111 # DefaultAliasMarker. We special-case "URI:" to make it easy to access
112 # specific files/directories by their read-cap.
114 if path.startswith("URI:"):
115 # The only way to get a sub-path is to use URI:blah:./foo, and we
116 # strip out the :./ sequence.
117 sep = path.find(":./")
119 return path[:sep], path[sep+3:]
121 colon = path.find(":")
125 return DefaultAliasMarker, path
126 return aliases[default], path
129 # no alias, but there's a colon in a dirname/filename, like
132 return DefaultAliasMarker, path
133 return aliases[default], path
134 return aliases[alias], path[colon+1:]
136 def escape_path(path):
137 segments = path.split("/")
138 return "/".join([urllib.quote(s) for s in segments])