From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: luca fancellu <luca.fancellu@arm.com>
Cc: openembedded-core@lists.openembedded.org, diego.sueiro@arm.com,
rahul.singh@arm.com
Subject: Re: [OE-core] [PATCH] oeqa,ssh: Handle SSHCall timeout error code
Date: Thu, 9 Nov 2023 10:35:06 +0100 [thread overview]
Message-ID: <20231109093506c1313530@mail.local> (raw)
In-Reply-To: <20231108112547.3599563-1-luca.fancellu@arm.com>
On 08/11/2023 11:25:47+0000, luca fancellu wrote:
> The current code in ssh.py is terminating the ssh process that
> does not finish its computation in a given timeout (when timeout
> is passed), the SSHCall function is returning the process error
> code.
>
> The Openssl ssh before version 8.6_p1 is returning 0 when it is
> terminated, from commit 8a9520836e71830f4fccca066dba73fea3d16bda
> onwards (version >= 8.6_p1) ssh is returning 255 instead.
>
> So for version of ssh older than 8.6_p1 when the SSHCall time out,
> the return code will be 0, meaning success, which is wrong.
>
> Fix this issue checking if the process has timeout (hence it's been
> terminated) and checking if the returned code is 0, in that case
> set it to 255 to advertise that an error occurred.
>
> Add a test case exercising the timeout in the SSHTest, test_ssh
> test function.
>
> Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
> ---
> meta/lib/oeqa/core/target/ssh.py | 21 ++++++++++++++++++++-
> meta/lib/oeqa/runtime/cases/ssh.py | 3 +++
> 2 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/core/target/ssh.py
> index f22836d390ac..4fe763aaefba 100644
> --- a/meta/lib/oeqa/core/target/ssh.py
> +++ b/meta/lib/oeqa/core/target/ssh.py
> @@ -224,6 +224,11 @@ class OESSHTarget(OETarget):
> remoteDir = os.path.join(remotePath, tmpDir.lstrip("/"))
> self.deleteDir(remoteDir)
>
> +
> +class SSHCallTimeout(Exception):
> + pass
> +
> +
> def SSHCall(command, logger, timeout=None, **opts):
>
> def run():
> @@ -232,9 +237,9 @@ def SSHCall(command, logger, timeout=None, **opts):
> output_raw = b''
> starttime = time.time()
> process = subprocess.Popen(command, **options)
> + eof = False
> if timeout:
> endtime = starttime + timeout
> - eof = False
> os.set_blocking(process.stdout.fileno(), False)
> while time.time() < endtime and not eof:
> try:
> @@ -293,6 +298,11 @@ def SSHCall(command, logger, timeout=None, **opts):
> pass
> process.wait()
>
> + # Process has timed out, raise exception here so that the process at
> + # this point is already terminated/killed
> + if not eof:
> + raise SSHCallTimeout
> +
> options = {
> "stdout": subprocess.PIPE,
> "stderr": subprocess.STDOUT,
> @@ -313,6 +323,15 @@ def SSHCall(command, logger, timeout=None, **opts):
>
> try:
> run()
> + except SSHCallTimeout:
> + # Version of openssh before 8.6_p1 returns error code 0 when killed by
> + # a signal, when the timeout occurs we will receive a 0 error code
> + # because the process is been terminated and it's wrong because that
> + # value means success, but the process timed out.
> + # Afterwards, from version 8.6_p1 onwards, the returned code is 255.
> + # Fix this behaviour by checking the return code
> + if process.returncode == 0:
> + process.returncode = 255
This breaks most of our tests:
https://autobuilder.yoctoproject.org/typhoon/#/builders/40/builds/8103/steps/13/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/76/builds/8054/steps/21/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/87/builds/6037/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/72/builds/8106/steps/15/logs/stdio
and more...
> except:
> # Need to guard against a SystemExit or other exception ocurring
> # whilst running and ensure we don't leave a process behind.
> diff --git a/meta/lib/oeqa/runtime/cases/ssh.py b/meta/lib/oeqa/runtime/cases/ssh.py
> index 13aac5439698..cdbef595008c 100644
> --- a/meta/lib/oeqa/runtime/cases/ssh.py
> +++ b/meta/lib/oeqa/runtime/cases/ssh.py
> @@ -13,6 +13,9 @@ class SSHTest(OERuntimeTestCase):
> @OETestDepends(['ping.PingTest.test_ping'])
> @OEHasPackage(['dropbear', 'openssh-sshd'])
> def test_ssh(self):
> + (status, output) = self.target.run('sleep 20', timeout=2)
> + msg='run() timed out but return code was zero.'
> + self.assertNotEqual(status, 0, msg=msg)
> (status, output) = self.target.run('uname -a')
> self.assertEqual(status, 0, msg='SSH Test failed: %s' % output)
> (status, output) = self.target.run('cat /etc/controllerimage')
>
> base-commit: 6806bd23499aa66942c2b6b8fbc52dbec8ff8483
> --
> 2.34.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#190319): https://lists.openembedded.org/g/openembedded-core/message/190319
> Mute This Topic: https://lists.openembedded.org/mt/102461629/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2023-11-09 9:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-08 11:25 [PATCH] oeqa,ssh: Handle SSHCall timeout error code Luca Fancellu
2023-11-09 9:35 ` Alexandre Belloni [this message]
2023-11-09 12:23 ` [OE-core] " Luca Fancellu
-- strict thread matches above, loose matches on Subject: below --
2023-11-08 11:08 luca fancellu
2023-11-08 13:22 ` [OE-core] " Luca Fancellu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231109093506c1313530@mail.local \
--to=alexandre.belloni@bootlin.com \
--cc=diego.sueiro@arm.com \
--cc=luca.fancellu@arm.com \
--cc=openembedded-core@lists.openembedded.org \
--cc=rahul.singh@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox