]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/scripts/tahoe_add_alias.py
Aliases are Unicode.
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / scripts / tahoe_add_alias.py
1
2 import os.path
3 import codecs
4
5 from allmydata.util.assertutil import precondition
6
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
12
13
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
17     # filesystem errors.
18     if os.path.exists(aliasfile):
19         f = codecs.open(aliasfile, "r", "utf-8")
20         aliases = f.read()
21         f.close()
22         if not aliases.endswith("\n"):
23             aliases += "\n"
24     else:
25         aliases = ""
26     aliases += "%s: %s\n" % (alias, cap)
27     f = codecs.open(aliasfile+".tmp", "w", "utf-8")
28     f.write(aliases)
29     f.close()
30     move_into_place(aliasfile+".tmp", aliasfile)
31
32 def add_alias(options):
33     nodedir = options['node-directory']
34     alias = options.alias
35     precondition(isinstance(alias, unicode), alias=alias)
36     cap = options.cap
37     stdout = options.stdout
38     stderr = options.stderr
39     if u":" in alias:
40         # a single trailing colon will already have been stripped if present
41         print >>stderr, "Alias names cannot contain colons."
42         return 1
43     if u" " in alias:
44         print >>stderr, "Alias names cannot contain spaces."
45         return 1
46
47     old_aliases = get_aliases(nodedir)
48     if alias in old_aliases:
49         print >>stderr, "Alias %s already exists!" % quote_output(alias)
50         return 1
51     aliasfile = os.path.join(nodedir, "private", "aliases")
52     cap = uri.from_string_dirnode(cap).to_string()
53
54     add_line_to_aliasfile(aliasfile, alias, cap)
55
56     print >>stdout, "Alias %s added" % quote_output(alias)
57     return 0
58
59 def create_alias(options):
60     # mkdir+add_alias
61     nodedir = options['node-directory']
62     alias = options.alias
63     precondition(isinstance(alias, unicode), alias=alias)
64     stdout = options.stdout
65     stderr = options.stderr
66     if u":" in alias:
67         # a single trailing colon will already have been stripped if present
68         print >>stderr, "Alias names cannot contain colons."
69         return 1
70     if u" " in alias:
71         print >>stderr, "Alias names cannot contain spaces."
72         return 1
73
74     old_aliases = get_aliases(nodedir)
75     if alias in old_aliases:
76         print >>stderr, "Alias %s already exists!" % quote_output(alias)
77         return 1
78
79     aliasfile = os.path.join(nodedir, "private", "aliases")
80
81     nodeurl = options['node-url']
82     if not nodeurl.endswith("/"):
83         nodeurl += "/"
84     url = nodeurl + "uri?t=mkdir"
85     resp = do_http("POST", url)
86     rc = check_http_error(resp, stderr)
87     if rc:
88         return rc
89     new_uri = resp.read().strip()
90
91     # probably check for others..
92
93     add_line_to_aliasfile(aliasfile, alias, new_uri)
94
95     print >>stdout, "Alias %s created" % (quote_output(alias),)
96     return 0
97
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"
106     rc = 0
107     for name in alias_names:
108         try:
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]))
112             rc = 1
113
114     if rc == 1:
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."
117     return rc