3 from allmydata.scripts.common import get_alias, DEFAULT_ALIAS, escape_path
4 from allmydata.scripts.common_http import do_http
5 from allmydata.util import base32
6 from allmydata import uri
10 class ManifestGrabber:
11 def run(self, options):
12 stderr = options.stderr
13 self.options = options
14 self.ophandle = ophandle = base32.b2a(os.urandom(16))
15 nodeurl = options['node-url']
16 if not nodeurl.endswith("/"):
18 self.nodeurl = nodeurl
20 rootcap, path = get_alias(options.aliases, where, DEFAULT_ALIAS)
23 url = nodeurl + "uri/%s" % urllib.quote(rootcap)
25 url += "/" + escape_path(path)
26 # todo: should it end with a slash?
27 url += "?t=start-manifest&ophandle=" + ophandle
28 resp = do_http("POST", url)
29 if resp.status not in (200, 302):
30 print >>stderr, "ERROR", resp.status, resp.reason, resp.read()
32 # now we poll for results. We nominally poll at t=1, 5, 10, 30, 60,
33 # 90, k*120 seconds, but if the poll takes non-zero time, that will
34 # be slightly longer. I'm not worried about trying to make up for
37 return self.wait_for_results()
40 for i in (1,5,10,30,60,90):
47 def wait_for_results(self):
49 for next in self.poll_times():
57 url = self.nodeurl + "operations/" + self.ophandle
58 url += "?t=status&output=JSON&release-after-complete=true"
59 stdout = self.options.stdout
60 stderr = self.options.stderr
61 resp = do_http("GET", url)
62 if resp.status != 200:
63 print >>stderr, "ERROR", resp.status, resp.reason, resp.read()
65 data = simplejson.loads(resp.read())
66 if not data["finished"]:
68 self.write_results(data)
71 def write_results(self, data):
72 stdout = self.options.stdout
73 stderr = self.options.stderr
74 if self.options["storage-index"]:
75 for (path, cap) in data["manifest"]:
76 u = uri.from_string(str(cap))
77 si = u.get_storage_index()
79 print >>stdout, base32.b2a(si)
81 for (path, cap) in data["manifest"]:
83 print >>stdout, cap, "/".join(path)
84 except UnicodeEncodeError:
85 print >>stdout, cap, "/".join([p.encode("utf-8")
90 def manifest(options):
91 return ManifestGrabber().run(options)