4 from nevow import rend, tags as T
5 from nevow.inevow import IRequest
7 from allmydata.util import base32
8 from allmydata.interfaces import IDirectoryNode, IFileNode
9 from allmydata.web.common import getxmlfile
10 from allmydata.mutable.common import UnrecoverableFileError # TODO: move
12 class MoreInfo(rend.Page):
14 docFactory = getxmlfile("info.xhtml")
16 def abbrev(self, storage_index_or_none):
17 if storage_index_or_none:
18 return base32.b2a(storage_index_or_none)[:6]
23 if IDirectoryNode.providedBy(node):
24 if not node.is_mutable():
25 return "immutable directory"
27 if IFileNode.providedBy(node):
28 si = node.get_storage_index()
32 return "immutable file"
33 return "immutable LIT file"
36 def render_title(self, ctx, data):
38 si = node.get_storage_index()
39 t = "More Info for %s" % self.get_type()
41 t += " (SI=%s)" % self.abbrev(si)
44 def render_header(self, ctx, data):
45 return self.render_title(ctx, data)
47 def render_type(self, ctx, data):
48 return ctx.tag[self.get_type()]
50 def render_si(self, ctx, data):
51 si = self.original.get_storage_index()
54 return ctx.tag[base32.b2a(si)]
56 def render_size(self, ctx, data):
58 d = node.get_current_size()
63 d.addCallback(_no_size)
64 def _handle_unrecoverable(f):
65 f.trap(UnrecoverableFileError)
67 d.addErrback(_handle_unrecoverable)
68 d.addCallback(lambda size: ctx.tag[size])
71 def render_directory_writecap(self, ctx, data):
73 if not IDirectoryNode.providedBy(node):
75 if node.is_readonly():
77 return ctx.tag[node.get_uri()]
79 def render_directory_readcap(self, ctx, data):
81 if not IDirectoryNode.providedBy(node):
83 return ctx.tag[node.get_readonly_uri()]
85 def render_directory_verifycap(self, ctx, data):
87 if not IDirectoryNode.providedBy(node):
89 verifier = node.get_verify_cap()
91 return ctx.tag[node.get_verify_cap().to_string()]
94 def render_file_writecap(self, ctx, data):
96 if IDirectoryNode.providedBy(node):
98 write_uri = node.get_write_uri()
101 return ctx.tag[write_uri]
103 def render_file_readcap(self, ctx, data):
105 if IDirectoryNode.providedBy(node):
107 read_uri = node.get_readonly_uri()
110 return ctx.tag[read_uri]
112 def render_file_verifycap(self, ctx, data):
114 if IDirectoryNode.providedBy(node):
116 verifier = node.get_verify_cap()
118 return ctx.tag[node.get_verify_cap().to_string()]
121 def get_root(self, ctx):
123 # the addSlash=True gives us one extra (empty) segment
124 depth = len(req.prepath) + len(req.postpath) - 1
125 link = "/".join([".."] * depth)
128 def render_raw_link(self, ctx, data):
130 if IDirectoryNode.providedBy(node):
132 elif IFileNode.providedBy(node):
136 root = self.get_root(ctx)
137 quoted_uri = urllib.quote(node.get_uri())
138 text_plain_url = "%s/file/%s/@@named=/raw.txt" % (root, quoted_uri)
139 return T.li["Raw data as ", T.a(href=text_plain_url)["text/plain"]]
141 def render_is_checkable(self, ctx, data):
143 si = node.get_storage_index()
146 # don't show checker button for LIT files
149 def render_check_form(self, ctx, data):
151 quoted_uri = urllib.quote(node.get_uri())
152 target = self.get_root(ctx) + "/uri/" + quoted_uri
153 if IDirectoryNode.providedBy(node):
155 check = T.form(action=target, method="post",
156 enctype="multipart/form-data")[
158 T.input(type="hidden", name="t", value="check"),
159 T.input(type="hidden", name="return_to", value="."),
160 T.legend(class_="freeform-form-label")["Check on this object"],
162 "Verify every bit? (EXPENSIVE):",
163 T.input(type="checkbox", name="verify"),
165 T.div["Repair any problems?: ",
166 T.input(type="checkbox", name="repair")],
167 T.div["Add/renew lease on all shares?: ",
168 T.input(type="checkbox", name="add-lease")],
169 T.div["Emit results in JSON format?: ",
170 T.input(type="checkbox", name="output", value="JSON")],
172 T.input(type="submit", value="Check"),
175 return ctx.tag[check]
177 def render_is_mutable_file(self, ctx, data):
179 if IDirectoryNode.providedBy(node):
181 if (IFileNode.providedBy(node)
182 and node.is_mutable() and not node.is_readonly()):
186 def render_overwrite_form(self, ctx, data):
188 root = self.get_root(ctx)
189 action = "%s/uri/%s" % (root, urllib.quote(node.get_uri()))
190 done_url = "%s/uri/%s?t=info" % (root, urllib.quote(node.get_uri()))
191 overwrite = T.form(action=action, method="post",
192 enctype="multipart/form-data")[
194 T.input(type="hidden", name="t", value="upload"),
195 T.input(type='hidden', name='when_done', value=done_url),
196 T.legend(class_="freeform-form-label")["Overwrite"],
197 "Upload new contents: ",
198 T.input(type="file", name="file"),
200 T.input(type="submit", value="Replace Contents")
202 return ctx.tag[overwrite]
204 def render_is_directory(self, ctx, data):
206 if IDirectoryNode.providedBy(node):
210 def render_deep_check_form(self, ctx, data):
211 ophandle = base32.b2a(os.urandom(16))
212 deep_check = T.form(action=".", method="post",
213 enctype="multipart/form-data")[
215 T.input(type="hidden", name="t", value="start-deep-check"),
216 T.input(type="hidden", name="return_to", value="."),
217 T.legend(class_="freeform-form-label")["Run a deep-check operation (EXPENSIVE)"],
219 "Verify every bit? (EVEN MORE EXPENSIVE):",
220 T.input(type="checkbox", name="verify"),
222 T.div["Repair any problems?: ",
223 T.input(type="checkbox", name="repair")],
224 T.div["Add/renew lease on all shares?: ",
225 T.input(type="checkbox", name="add-lease")],
226 T.div["Emit results in JSON format?: ",
227 T.input(type="checkbox", name="output", value="JSON")],
229 T.input(type="hidden", name="ophandle", value=ophandle),
230 T.input(type="submit", value="Deep-Check"),
233 return ctx.tag[deep_check]
235 def render_deep_size_form(self, ctx, data):
236 ophandle = base32.b2a(os.urandom(16))
237 deep_size = T.form(action=".", method="post",
238 enctype="multipart/form-data")[
240 T.input(type="hidden", name="t", value="start-deep-size"),
241 T.legend(class_="freeform-form-label")["Run a deep-size operation (EXPENSIVE)"],
242 T.input(type="hidden", name="ophandle", value=ophandle),
243 T.input(type="submit", value="Deep-Size"),
245 return ctx.tag[deep_size]
247 def render_deep_stats_form(self, ctx, data):
248 ophandle = base32.b2a(os.urandom(16))
249 deep_stats = T.form(action=".", method="post",
250 enctype="multipart/form-data")[
252 T.input(type="hidden", name="t", value="start-deep-stats"),
253 T.legend(class_="freeform-form-label")["Run a deep-stats operation (EXPENSIVE)"],
254 T.input(type="hidden", name="ophandle", value=ophandle),
255 T.input(type="submit", value="Deep-Stats"),
257 return ctx.tag[deep_stats]
259 def render_manifest_form(self, ctx, data):
260 ophandle = base32.b2a(os.urandom(16))
261 manifest = T.form(action=".", method="post",
262 enctype="multipart/form-data")[
264 T.input(type="hidden", name="t", value="start-manifest"),
265 T.legend(class_="freeform-form-label")["Run a manifest operation (EXPENSIVE)"],
266 T.div["Output Format: ",
267 T.select(name="output")
268 [ T.option(value="html", selected="true")["HTML"],
269 T.option(value="text")["text"],
270 T.option(value="json")["JSON"],
273 T.input(type="hidden", name="ophandle", value=ophandle),
274 T.input(type="submit", value="Manifest"),
276 return ctx.tag[manifest]
279 # TODO: edge metadata