From 484c091c622511d190a155a96bd2b1a8836a8642 Mon Sep 17 00:00:00 2001 From: Martin Hostettler Date: Mon, 22 Aug 2016 19:48:39 +0200 Subject: [PATCH 1/3] =?UTF-8?q?RepositoryServer:=20Don=E2=80=98t=20try=20t?= =?UTF-8?q?o=20close=20the=20repository=20if=20it=20was=20not=20yet=20open?= =?UTF-8?q?ed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- borg/remote.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/borg/remote.py b/borg/remote.py index 472d1ac36..5c42b58a1 100644 --- a/borg/remote.py +++ b/borg/remote.py @@ -79,12 +79,14 @@ class RepositoryServer: # pragma: no cover if r: data = os.read(stdin_fd, BUFSIZE) if not data: - self.repository.close() + if self.repository is not None: + self.repository.close() return unpacker.feed(data) for unpacked in unpacker: if not (isinstance(unpacked, tuple) and len(unpacked) == 4): - self.repository.close() + if self.repository is not None: + self.repository.close() raise Exception("Unexpected RPC data format.") type, msgid, method, args = unpacked method = method.decode('ascii') From 79de73685bc6b25607833b04aa8f619ebb381945 Mon Sep 17 00:00:00 2001 From: Martin Hostettler Date: Mon, 22 Aug 2016 19:50:53 +0200 Subject: [PATCH 2/3] remote: Change exception message for unexpected RPC data format to indicate dataflow direction don't print stacktraces to clean up error messages when sshing into a forces command to borg serve. --- borg/remote.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/borg/remote.py b/borg/remote.py index 5c42b58a1..debb003fe 100644 --- a/borg/remote.py +++ b/borg/remote.py @@ -37,6 +37,14 @@ class InvalidRPCMethod(Error): """RPC method {} is not valid""" +class UnexpectedRPCDataFormatFromClient(Error): + """Borg {}: Got unexpected RPC data format from client.""" + + +class UnexpectedRPCDataFormatFromServer(Error): + """Got unexpected RPC data format from server.""" + + class RepositoryServer: # pragma: no cover rpc_methods = ( '__len__', @@ -87,7 +95,7 @@ class RepositoryServer: # pragma: no cover if not (isinstance(unpacked, tuple) and len(unpacked) == 4): if self.repository is not None: self.repository.close() - raise Exception("Unexpected RPC data format.") + raise UnexpectedRPCDataFormatFromClient(__version__) type, msgid, method, args = unpacked method = method.decode('ascii') try: @@ -328,7 +336,7 @@ This problem will go away as soon as the server has been upgraded to 1.0.7+. self.unpacker.feed(data) for unpacked in self.unpacker: if not (isinstance(unpacked, tuple) and len(unpacked) == 4): - raise Exception("Unexpected RPC data format.") + raise UnexpectedRPCDataFormatFromServer() type, msgid, error, res = unpacked if msgid in self.ignore_responses: self.ignore_responses.remove(msgid) From 549be2129a8ac207df79abda6d0a21cdefc570dc Mon Sep 17 00:00:00 2001 From: Martin Hostettler Date: Mon, 22 Aug 2016 20:22:02 +0200 Subject: [PATCH 3/3] RepositoryServer: Add error message when connection was closed before opening repo. --- borg/remote.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/borg/remote.py b/borg/remote.py index debb003fe..20d0c1857 100644 --- a/borg/remote.py +++ b/borg/remote.py @@ -89,6 +89,9 @@ class RepositoryServer: # pragma: no cover if not data: if self.repository is not None: self.repository.close() + else: + os.write(stderr_fd, "Borg {}: Got connection close before repository was opened.\n" + .format(__version__).encode()) return unpacker.feed(data) for unpacked in unpacker: