5 from allmydata.util.assertutil import precondition
7 from allmydata import uri
8 from allmydata.scripts.common_http import do_http, check_http_error
9 from allmydata.scripts.common import get_aliases
10 from allmydata.util.fileutil import move_into_place
11 from allmydata.util.encodingutil import unicode_to_output, quote_output
14 def add_line_to_aliasfile(aliasfile, alias, cap):
15 # we use os.path.exists, rather than catching EnvironmentError, to avoid
16 # clobbering the valuable alias file in case of spurious or transient
18 if os.path.exists(aliasfile):
19 f = codecs.open(aliasfile, "r", "utf-8")
22 if not aliases.endswith("\n"):
26 aliases += "%s: %s\n" % (alias, cap)
27 f = codecs.open(aliasfile+".tmp", "w", "utf-8")
30 move_into_place(aliasfile+".tmp", aliasfile)
32 def add_alias(options):
33 nodedir = options['node-directory']
35 precondition(isinstance(alias, unicode), alias=alias)
37 stdout = options.stdout
38 stderr = options.stderr
40 # a single trailing colon will already have been stripped if present
41 print >>stderr, "Alias names cannot contain colons."
44 print >>stderr, "Alias names cannot contain spaces."
47 old_aliases = get_aliases(nodedir)
48 if alias in old_aliases:
49 print >>stderr, "Alias %s already exists!" % quote_output(alias)
51 aliasfile = os.path.join(nodedir, "private", "aliases")
52 cap = uri.from_string_dirnode(cap).to_string()
54 add_line_to_aliasfile(aliasfile, alias, cap)
56 print >>stdout, "Alias %s added" % quote_output(alias)
59 def create_alias(options):
61 nodedir = options['node-directory']
63 precondition(isinstance(alias, unicode), alias=alias)
64 stdout = options.stdout
65 stderr = options.stderr
67 # a single trailing colon will already have been stripped if present
68 print >>stderr, "Alias names cannot contain colons."
71 print >>stderr, "Alias names cannot contain spaces."
74 old_aliases = get_aliases(nodedir)
75 if alias in old_aliases:
76 print >>stderr, "Alias %s already exists!" % quote_output(alias)
79 aliasfile = os.path.join(nodedir, "private", "aliases")
81 nodeurl = options['node-url']
82 if not nodeurl.endswith("/"):
84 url = nodeurl + "uri?t=mkdir"
85 resp = do_http("POST", url)
86 rc = check_http_error(resp, stderr)
89 new_uri = resp.read().strip()
91 # probably check for others..
93 add_line_to_aliasfile(aliasfile, alias, new_uri)
95 print >>stdout, "Alias %s created" % (quote_output(alias),)
98 def list_aliases(options):
99 nodedir = options['node-directory']
100 stdout = options.stdout
101 stderr = options.stderr
102 aliases = get_aliases(nodedir)
103 alias_names = sorted(aliases.keys())
104 max_width = max([len(quote_output(name)) for name in alias_names] + [0])
105 fmt = "%" + str(max_width) + "s: %s"
107 for name in alias_names:
109 print >>stdout, fmt % (unicode_to_output(name), unicode_to_output(aliases[name].decode('utf-8')))
110 except (UnicodeEncodeError, UnicodeDecodeError):
111 print >>stderr, fmt % (quote_output(name), quote_output(aliases[name]))
115 print >>stderr, "\nThis listing included aliases or caps that could not be converted to the terminal" \
116 "\noutput encoding. These are shown using backslash escapes and in quotes."