From 39f4d803f93ec05b7ef51682da32de676e791974 Mon Sep 17 00:00:00 2001
From: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Date: Tue, 13 Dec 2016 15:36:23 +0100
Subject: [PATCH] Raise an exception if an ssh command fails

ade install failed for me as my target device doesn't have
ribchester-bundle, however it did so without giving any indication
something was wrong at all.

Sort this out by raising an exception if the remote command returns a
non-zero exit status.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>

Differential Revision: https://phabricator.apertis.org/D5260
---
 tools/ade | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/tools/ade b/tools/ade
index 7cda4e3..70ab3ee 100755
--- a/tools/ade
+++ b/tools/ade
@@ -105,6 +105,19 @@ class NotSupportedError(Exception):
     def __init__(self):
         pass
 
+class CommandFailedError(Exception):
+    def __init__(self, stdout, stderr, exit_status):
+        self.stdout = stdout
+        self.stderr = stderr
+        self.exit_status = exit_status
+
+    def __str__(self):
+        return """Exit code: {}
+                  Stdout: {}
+                  Stderr: {}""".format(self.exit_status,
+                                       self.stdout,
+                                       self.stderr)
+
 
 def is_valid_url(url):
     result = urlparse(url)
@@ -221,7 +234,13 @@ class Device:
     def _exec(self, *args):
         with closing(self._connect()) as ssh:
             stdin, stdout, stderr = ssh.exec_command(' '.join(args))
-            return stdout.read().decode().strip()
+            out = stdout.read().decode().strip()
+            err = stderr.read().decode().strip()
+            status = stdout.channel.recv_exit_status ()
+            if status != 0:
+                raise CommandFailedError(out, err, status)
+
+            return out
 
     def load_sysroot_version(self):
         try:
-- 
GitLab