mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Only handle shell commands output when return_response requested (#97777)
This commit is contained in:
parent
07a701551b
commit
f0e9dccb58
@ -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:
|
|||||||
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:
|
|||||||
"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:
|
|||||||
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."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user