Skip to content
Snippets Groups Projects
Unverified Commit f0e9dccb authored by RoboMagus's avatar RoboMagus Committed by GitHub
Browse files

Only handle shell commands output when return_response requested (#97777)

parent 07a70155
No related branches found
No related tags found
No related merge requests found
...@@ -105,14 +105,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ...@@ -105,14 +105,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
raise raise
service_response: JsonObjectType = {
"stdout": "",
"stderr": "",
"returncode": process.returncode,
}
if stdout_data: if stdout_data:
service_response["stdout"] = stdout_data.decode("utf-8").strip()
_LOGGER.debug( _LOGGER.debug(
"Stdout of command: `%s`, return code: %s:\n%s", "Stdout of command: `%s`, return code: %s:\n%s",
cmd, cmd,
...@@ -120,7 +113,6 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ...@@ -120,7 +113,6 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
stdout_data, stdout_data,
) )
if stderr_data: if stderr_data:
service_response["stderr"] = stderr_data.decode("utf-8").strip()
_LOGGER.debug( _LOGGER.debug(
"Stderr of command: `%s`, return code: %s:\n%s", "Stderr of command: `%s`, return code: %s:\n%s",
cmd, cmd,
...@@ -132,7 +124,24 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ...@@ -132,7 +124,24 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"Error running command: `%s`, return code: %s", cmd, process.returncode "Error running command: `%s`, return code: %s", cmd, process.returncode
) )
return service_response if service.return_response:
service_response: JsonObjectType = {
"stdout": "",
"stderr": "",
"returncode": process.returncode,
}
try:
if stdout_data:
service_response["stdout"] = stdout_data.decode("utf-8").strip()
if stderr_data:
service_response["stderr"] = stderr_data.decode("utf-8").strip()
return service_response
except UnicodeDecodeError:
_LOGGER.exception(
"Unable to handle non-utf8 output of command: `%s`", cmd
)
raise
return None
for name in conf: for name in conf:
hass.services.async_register( hass.services.async_register(
......
...@@ -174,6 +174,40 @@ async def test_stdout_captured(mock_output, hass: HomeAssistant) -> None: ...@@ -174,6 +174,40 @@ async def test_stdout_captured(mock_output, hass: HomeAssistant) -> None:
assert response["returncode"] == 0 assert response["returncode"] == 0
@patch("homeassistant.components.shell_command._LOGGER.debug")
async def test_non_text_stdout_capture(
mock_output, hass: HomeAssistant, caplog: pytest.LogCaptureFixture
) -> None:
"""Test handling of non-text output."""
assert await async_setup_component(
hass,
shell_command.DOMAIN,
{
shell_command.DOMAIN: {
"output_image": "curl -o - https://raw.githubusercontent.com/home-assistant/assets/master/misc/loading-screen.gif"
}
},
)
# No problem without 'return_response'
response = await hass.services.async_call(
"shell_command", "output_image", blocking=True
)
await hass.async_block_till_done()
assert not response
# Non-text output throws with 'return_response'
with pytest.raises(UnicodeDecodeError):
response = await hass.services.async_call(
"shell_command", "output_image", blocking=True, return_response=True
)
await hass.async_block_till_done()
assert not response
assert "Unable to handle non-utf8 output of command" in caplog.text
@patch("homeassistant.components.shell_command._LOGGER.debug") @patch("homeassistant.components.shell_command._LOGGER.debug")
async def test_stderr_captured(mock_output, hass: HomeAssistant) -> None: async def test_stderr_captured(mock_output, hass: HomeAssistant) -> None:
"""Test subprocess that has stderr.""" """Test subprocess that has stderr."""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment