source file: /home/buildslave/tahoe/edgy/build/src/allmydata/scripts/common.py
file stats: 95 lines, 81 executed: 85.3% covered
   1. 
   2. import os, sys, urllib
   3. from twisted.python import usage
   4. 
   5. 
   6. class BaseOptions:
   7.     # unit tests can override these to point at StringIO instances
   8.     stdin = sys.stdin
   9.     stdout = sys.stdout
  10.     stderr = sys.stderr
  11. 
  12.     optFlags = [
  13.         ["quiet", "q", "Operate silently."],
  14.         ["version", "V", "Display version numbers and exit."],
  15.         ]
  16. 
  17.     def opt_version(self):
  18.         import allmydata
  19.         print allmydata.get_package_versions_string()
  20.         sys.exit(0)
  21. 
  22. 
  23. class BasedirMixin:
  24.     optFlags = [
  25.         ["multiple", "m", "allow multiple basedirs to be specified at once"],
  26.         ]
  27. 
  28.     def postOptions(self):
  29.         if not self.basedirs:
  30.             raise usage.UsageError("<basedir> parameter is required")
  31.         if self['basedir']:
  32.             del self['basedir']
  33.         self['basedirs'] = [os.path.abspath(os.path.expanduser(b))
  34.                             for b in self.basedirs]
  35. 
  36.     def parseArgs(self, *args):
  37.         self.basedirs = []
  38.         if self['basedir']:
  39.             self.basedirs.append(self['basedir'])
  40.         if self['multiple']:
  41.             self.basedirs.extend(args)
  42.         else:
  43.             if len(args) == 0 and not self.basedirs:
  44.                 if sys.platform == 'win32':
  45.                     from allmydata.windows import registry
  46.                     self.basedirs.append(registry.get_base_dir_path())
  47.                 else:
  48.                     self.basedirs.append(os.path.expanduser("~/.tahoe"))
  49.             if len(args) > 0:
  50.                 self.basedirs.append(args[0])
  51.             if len(args) > 1:
  52.                 raise usage.UsageError("I wasn't expecting so many arguments")
  53. 
  54. class NoDefaultBasedirMixin(BasedirMixin):
  55.     def parseArgs(self, *args):
  56.         # create-client won't default to --basedir=~/.tahoe
  57.         self.basedirs = []
  58.         if self['basedir']:
  59.             self.basedirs.append(self['basedir'])
  60.         if self['multiple']:
  61.             self.basedirs.extend(args)
  62.         else:
  63.             if len(args) > 0:
  64.                 self.basedirs.append(args[0])
  65.             if len(args) > 1:
  66.                 raise usage.UsageError("I wasn't expecting so many arguments")
  67.         if not self.basedirs:
  68.             raise usage.UsageError("--basedir must be provided")
  69. 
  70. DEFAULT_ALIAS = "tahoe"
  71. 
  72. 
  73. def get_aliases(nodedir):
  74.     from allmydata import uri
  75.     aliases = {}
  76.     aliasfile = os.path.join(nodedir, "private", "aliases")
  77.     rootfile = os.path.join(nodedir, "private", "root_dir.cap")
  78.     try:
  79.         f = open(rootfile, "r")
  80.         rootcap = f.read().strip()
  81.         if rootcap:
  82.             aliases["tahoe"] = uri.from_string_dirnode(rootcap).to_string()
  83.     except EnvironmentError:
  84.         pass
  85.     try:
  86.         f = open(aliasfile, "r")
  87.         for line in f.readlines():
  88.             line = line.strip()
  89.             if line.startswith("#") or not line:
  90.                 continue
  91.             name, cap = line.split(":", 1)
  92.             # normalize it: remove http: prefix, urldecode
  93.             cap = cap.strip()
  94.             aliases[name] = uri.from_string_dirnode(cap).to_string()
  95.     except EnvironmentError:
  96.         pass
  97.     return aliases
  98. 
  99. class DefaultAliasMarker:
 100.     pass
 101. 
 102. def get_alias(aliases, path, default):
 103.     # transform "work:path/filename" into (aliases["work"], "path/filename").
 104.     # If default=None, then an empty alias is indicated by returning
 105.     # DefaultAliasMarker. We special-case "URI:" to make it easy to access
 106.     # specific files/directories by their read-cap.
 107.     path = path.strip()
 108.     if path.startswith("URI:"):
 109.         # The only way to get a sub-path is to use URI:blah:./foo, and we
 110.         # strip out the :./ sequence.
 111.         sep = path.find(":./")
 112.         if sep != -1:
 113.             return path[:sep], path[sep+3:]
 114.         return path, ""
 115.     colon = path.find(":")
 116.     if colon == -1:
 117.         # no alias
 118.         if default == None:
 119.             return DefaultAliasMarker, path
 120.         return aliases[default], path
 121.     alias = path[:colon]
 122.     if "/" in alias:
 123.         # no alias, but there's a colon in a dirname/filename, like
 124.         # "foo/bar:7"
 125.         if default == None:
 126.             return DefaultAliasMarker, path
 127.         return aliases[default], path
 128.     return aliases[alias], path[colon+1:]
 129. 
 130. def escape_path(path):
 131.     segments = path.split("/")
 132.     return "/".join([urllib.quote(s) for s in segments])