]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/scripts/tahoe_add_alias.py
tahoe add-alias/create-alias: don't corrupt non-newline-terminated alias
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / scripts / tahoe_add_alias.py
1
2 import os.path
3 from allmydata import uri
4 from allmydata.scripts.common_http import do_http, check_http_error
5 from allmydata.scripts.common import get_aliases
6 from allmydata.util.fileutil import move_into_place
7
8 def add_alias(options):
9     nodedir = options['node-directory']
10     alias = options.alias
11     cap = options.cap
12     stdout = options.stdout
13     stderr = options.stderr
14     assert ":" not in alias
15     assert " " not in alias
16
17     old_aliases = get_aliases(nodedir)
18     if alias in old_aliases:
19         print >>stderr, "Alias '%s' already exists!" % alias
20         return 1
21     aliasfile = os.path.join(nodedir, "private", "aliases")
22     cap = uri.from_string_dirnode(cap).to_string()
23
24     # we use os.path.exists, rather than catching EnvironmentError, to avoid
25     # clobbering the valuable alias file in case of spurious or transient
26     # filesystem errors.
27     if os.path.exists(aliasfile):
28         f = open(aliasfile, "r")
29         aliases = f.read()
30         f.close()
31         if not aliases.endswith("\n"):
32             aliases += "\n"
33     else:
34         aliases = ""
35     aliases += "%s: %s\n" % (alias, cap)
36     f = open(aliasfile+".tmp", "w")
37     f.write(aliases)
38     f.close()
39     move_into_place(aliasfile+".tmp", aliasfile)
40
41     print >>stdout, "Alias '%s' added" % (alias,)
42     return 0
43
44 def create_alias(options):
45     # mkdir+add_alias
46     nodedir = options['node-directory']
47     alias = options.alias
48     stdout = options.stdout
49     stderr = options.stderr
50     assert ":" not in alias
51     assert " " not in alias
52
53     old_aliases = get_aliases(nodedir)
54     if alias in old_aliases:
55         print >>stderr, "Alias '%s' already exists!" % alias
56         return 1
57
58     aliasfile = os.path.join(nodedir, "private", "aliases")
59
60     nodeurl = options['node-url']
61     if not nodeurl.endswith("/"):
62         nodeurl += "/"
63     url = nodeurl + "uri?t=mkdir"
64     resp = do_http("POST", url)
65     rc = check_http_error(resp, stderr)
66     if rc:
67         return rc
68     new_uri = resp.read().strip()
69
70     # probably check for others..
71
72     # see above about EnvironmentError
73     if os.path.exists(aliasfile):
74         f = open(aliasfile, "r")
75         aliases = f.read()
76         f.close()
77         if not aliases.endswith("\n"):
78             aliases += "\n"
79     else:
80         aliases = ""
81     aliases += "%s: %s\n" % (alias, new_uri)
82     f = open(aliasfile+".tmp", "w")
83     f.write(aliases)
84     f.close()
85     move_into_place(aliasfile+".tmp", aliasfile)
86
87     print >>stdout, "Alias '%s' created" % (alias,)
88     return 0
89
90 def list_aliases(options):
91     nodedir = options['node-directory']
92     stdout = options.stdout
93     aliases = get_aliases(nodedir)
94     alias_names = sorted(aliases.keys())
95     max_width = max([len(name) for name in alias_names] + [0])
96     fmt = "%" + str(max_width) + "s: %s"
97     for name in alias_names:
98         print >>stdout, fmt % (name, aliases[name])
99