From 192c161be7eab64c83f1ea12e9c9be8c239b4170 Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Sat, 7 Mar 2009 05:40:51 -0700 Subject: [PATCH] tahoe_cp.py: improve error reporting slightly: don't json-interpret HTTP errors, pass through tahoe webapi error messages --- src/allmydata/scripts/tahoe_cp.py | 60 ++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/allmydata/scripts/tahoe_cp.py b/src/allmydata/scripts/tahoe_cp.py index 08654e56..26ec3515 100644 --- a/src/allmydata/scripts/tahoe_cp.py +++ b/src/allmydata/scripts/tahoe_cp.py @@ -2,6 +2,7 @@ import os.path import urllib import simplejson +from twisted.python.failure import Failure from allmydata.scripts.common import get_alias, escape_path, DefaultAliasMarker from allmydata.scripts.common_http import do_http from allmydata import uri @@ -11,10 +12,17 @@ def ascii_or_none(s): return s return str(s) -class WriteError(Exception): - pass -class ReadError(Exception): - pass +class TahoeError(Exception): + def __init__(self, msg, resp): + self.msg = msg + self.status = resp.status + self.reason = resp.reason + self.body = resp.read() + + def display(self, err): + print >>err, "%s: %s %s" % (self.msg, self.status, self.reason) + print >>err, self.body + class MissingSourceError(Exception): pass @@ -22,9 +30,8 @@ def GET_to_file(url): resp = do_http("GET", url) if resp.status == 200: return resp - raise ReadError("Error during GET: %s %s %s" % (resp.status, - resp.reason, - resp.read())) + raise TahoeError("Error during GET", resp) + def GET_to_string(url): f = GET_to_file(url) return f.read() @@ -33,23 +40,20 @@ def PUT(url, data): resp = do_http("PUT", url, data) if resp.status in (200, 201): return resp.read() - raise WriteError("Error during PUT: %s %s %s" % (resp.status, resp.reason, - resp.read())) + raise TahoeError("Error during PUT", resp) def POST(url, data): resp = do_http("POST", url, data) if resp.status in (200, 201): return resp.read() - raise WriteError("Error during POST: %s %s %s" % (resp.status, resp.reason, - resp.read())) + raise TahoeError("Error during POST", resp) def mkdir(targeturl): url = targeturl + "?t=mkdir" resp = do_http("POST", url) if resp.status in (200, 201): return resp.read().strip() - raise WriteError("Error during mkdir: %s %s %s" % (resp.status, resp.reason, - resp.read())) + raise TahoeError("Error during mkdir", resp) def make_tahoe_subdirectory(nodeurl, parent_writecap, name): url = nodeurl + "/".join(["uri", @@ -59,8 +63,7 @@ def make_tahoe_subdirectory(nodeurl, parent_writecap, name): resp = do_http("POST", url) if resp.status in (200, 201): return resp.read().strip() - raise WriteError("Error during mkdir: %s %s %s" % (resp.status, resp.reason, - resp.read())) + raise TahoeError("Error during mkdir", resp) class LocalFileSource: @@ -219,7 +222,8 @@ class TahoeDirectorySource: bestcap = writecap or readcap url = self.nodeurl + "uri/%s" % urllib.quote(bestcap) resp = do_http("GET", url + "?t=json") - assert resp.status == 200 + if resp.status != 200: + raise TahoeError("Error examining source directory", resp) parsed = simplejson.loads(resp.read()) nodetype, d = parsed assert nodetype == "dirnode" @@ -311,7 +315,8 @@ class TahoeDirectoryTarget: bestcap = writecap or readcap url = self.nodeurl + "uri/%s" % urllib.quote(bestcap) resp = do_http("GET", url + "?t=json") - assert resp.status == 200 + if resp.status != 200: + raise TahoeError("Error examining target directory", resp) parsed = simplejson.loads(resp.read()) nodetype, d = parsed assert nodetype == "dirnode" @@ -431,8 +436,17 @@ class Copier: print >>self.stderr, message self.progressfunc = progress self.cache = {} - source_specs = options.sources - destination_spec = options.destination + try: + self.try_copy() + except TahoeError, te: + Failure().printTraceback(self.stderr) + print >>self.stderr + te.display(self.stderr) + return 1 + + def try_copy(self): + source_specs = self.options.sources + destination_spec = self.options.destination recursive = self.options["recursive"] target = self.get_target_info(destination_spec) @@ -510,7 +524,7 @@ class Copier: if resp.status == 404: # doesn't exist yet t = TahoeMissingTarget(url) - else: + elif resp.status == 200: parsed = simplejson.loads(resp.read()) nodetype, d = parsed if nodetype == "dirnode": @@ -523,6 +537,9 @@ class Copier: mutable = d.get("mutable", False) t = TahoeFileTarget(self.nodeurl, mutable, writecap, readcap, url) + else: + raise TahoeError("Error examining target '%s'" + % destination_spec, resp) return t def get_source_info(self, source_spec): @@ -552,6 +569,9 @@ class Copier: resp = do_http("GET", url + "?t=json") if resp.status == 404: raise MissingSourceError(source_spec) + elif resp.status != 200: + raise TahoeError("Error examining source '%s'" % source_spec, + resp) parsed = simplejson.loads(resp.read()) nodetype, d = parsed if nodetype == "dirnode": -- 2.45.2