From 3151a8c9bf94f84ed8eb296a8f7fdcb9beb2f20c Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Thu, 2 Feb 2023 16:04:30 +0100 Subject: [PATCH] python: Report detailed error message when opening fsread1 channel fails Teach check_open() about validating the `message` part of `close`, when given. --- src/cockpit/channels/filesystem.py | 4 ++-- test/pytest/test_bridge.py | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cockpit/channels/filesystem.py b/src/cockpit/channels/filesystem.py index f4e3c2515..1d9279b00 100644 --- a/src/cockpit/channels/filesystem.py +++ b/src/cockpit/channels/filesystem.py @@ -109,8 +109,8 @@ class FsReadChannel(GeneratorChannel): return {'tag': '-'} except PermissionError: raise ChannelError('access-denied') - except OSError: - raise ChannelError('internal-error') + except OSError as error: + raise ChannelError('internal-error', message=str(error)) from error class FsReplaceChannel(Channel): diff --git a/test/pytest/test_bridge.py b/test/pytest/test_bridge.py index 830f92d67..544e11418 100644 --- a/test/pytest/test_bridge.py +++ b/test/pytest/test_bridge.py @@ -510,3 +510,9 @@ class TestBridge(unittest.IsolatedAsyncioTestCase): assert not all(d for d in data[0][0]) # memory.used should be an integer assert isinstance(data[0][1], int) + + async def test_fsread1_errors(self): + await self.start() + await self.transport.check_open('fsread1', path='/etc/shadow', problem='access-denied') + await self.transport.check_open('fsread1', path='/', problem='internal-error', + reply_keys={'message': "[Errno 21] Is a directory: '/'"})