From 59028c4800075cb455fa3837adcbd0dd83d9484d Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 19 Apr 2026 21:52:12 +0200 Subject: [PATCH] Fix #1466: 'show container' shows no output A container's command line, as reported by podman, may comtain environment variables, which the current regexp (added in ed4fe58) does not support. Extend the regexp to allow environment variables and add an operational, config false, 'cmdline' leaf node to allow any characters to be reported for the full command line in the operational output. Signed-off-by: Joachim Wiberg --- src/confd/yang/confd/infix-containers.yang | 18 +++++++++++++++++- ...3.yang => infix-containers@2026-04-20.yang} | 0 src/confd/yang/containers.inc | 2 +- src/statd/python/yanger/infix_containers.py | 13 +++++++++---- .../statd/containers/infix-containers.json | 3 +++ test/case/statd/containers/operational.json | 3 +++ 6 files changed, 33 insertions(+), 6 deletions(-) rename src/confd/yang/confd/{infix-containers@2026-02-23.yang => infix-containers@2026-04-20.yang} (100%) diff --git a/src/confd/yang/confd/infix-containers.yang b/src/confd/yang/confd/infix-containers.yang index f0950002..401ed643 100644 --- a/src/confd/yang/confd/infix-containers.yang +++ b/src/confd/yang/confd/infix-containers.yang @@ -22,6 +22,13 @@ module infix-containers { prefix infix-sys; } + revision 2026-04-20 { + description "Add cmdline operational leaf showing the full process command line + (entrypoint + args) from 'podman inspect'. Allow environment variable + references (dollar sign, braces) in the command override."; + reference "internal"; + } + revision 2026-02-23 { description "Input validation improvements"; reference "internal"; @@ -257,10 +264,19 @@ module infix-containers { leaf command { description "Override ENTRYPOINT from image and run command + args."; type string { - pattern '[a-zA-Z0-9_./ :=@%^,+-]+'; + pattern '[a-zA-Z0-9_./ :=@%^,${}()+-]+'; } } + leaf cmdline { + description "Full process command line currently executing in the container, + combining the entrypoint and its arguments as reported by + 'podman inspect'. May differ from the configured 'command' + override when the image provides its own entrypoint wrapper."; + config false; + type string; + } + leaf hostname { description "Sets the container host name, available inside the container. diff --git a/src/confd/yang/confd/infix-containers@2026-02-23.yang b/src/confd/yang/confd/infix-containers@2026-04-20.yang similarity index 100% rename from src/confd/yang/confd/infix-containers@2026-02-23.yang rename to src/confd/yang/confd/infix-containers@2026-04-20.yang diff --git a/src/confd/yang/containers.inc b/src/confd/yang/containers.inc index dc629ad9..1daa36d3 100644 --- a/src/confd/yang/containers.inc +++ b/src/confd/yang/containers.inc @@ -1,5 +1,5 @@ # -*- sh -*- MODULES=( "infix-interfaces -e containers" - "infix-containers@2026-02-23.yang" + "infix-containers@2026-04-20.yang" ) diff --git a/src/statd/python/yanger/infix_containers.py b/src/statd/python/yanger/infix_containers.py index bf065416..df14f248 100644 --- a/src/statd/python/yanger/infix_containers.py +++ b/src/statd/python/yanger/infix_containers.py @@ -223,16 +223,21 @@ def container(ps): "status": ps["Status"] } - # Bonus information, may not be available - if ps["Command"]: - out["command"] = " ".join(ps["Command"]) - inspect = podman_inspect(out["name"]) if inspect and isinstance(inspect, list) and len(inspect) > 0: inspect = inspect[0] else: inspect = {} + path = inspect.get("Path", "") + args = inspect.get("Args", []) + if path: + out["cmdline"] = " ".join([path] + args) + + cmd = inspect.get("Config", {}).get("Cmd", []) + if cmd: + out["command"] = " ".join(cmd) + net = network(ps, inspect) if net: out["network"] = net diff --git a/test/case/statd/containers/infix-containers.json b/test/case/statd/containers/infix-containers.json index b9bd654d..45833df4 100644 --- a/test/case/statd/containers/infix-containers.json +++ b/test/case/statd/containers/infix-containers.json @@ -8,6 +8,7 @@ "image-id": "d6930d60a73be9980f8e19b4b4f63586a6d3492178e20bea962e4e9b8c654033", "running": true, "status": "Up About a minute", + "cmdline": "/usr/bin/tini -- /usr/sbin/httpd -f -v", "command": "/usr/sbin/httpd -f -v", "network": { "interface": [ @@ -28,6 +29,7 @@ "image-id": "d6930d60a73be9980f8e19b4b4f63586a6d3492178e20bea962e4e9b8c654033", "running": true, "status": "Up About a minute", + "cmdline": "/usr/bin/tini -- /usr/sbin/httpd -f -v -p 91", "command": "/usr/sbin/httpd -f -v -p 91", "network": { "interface": [ @@ -50,6 +52,7 @@ "image-id": "7a3cc502436250357a6664100a600f306334b4d7203890b85b7ea9b8da6b5665", "running": true, "status": "Up About a minute", + "cmdline": "/usr/bin/tini -- /usr/sbin/nft-helper /etc/nftables.conf", "command": "/usr/sbin/nft-helper /etc/nftables.conf", "network": { "host": true diff --git a/test/case/statd/containers/operational.json b/test/case/statd/containers/operational.json index cfa06ffe..23198c4a 100644 --- a/test/case/statd/containers/operational.json +++ b/test/case/statd/containers/operational.json @@ -1187,6 +1187,7 @@ "infix-containers:containers": { "container": [ { + "cmdline": "/usr/bin/tini -- /usr/sbin/httpd -f -v", "command": "/usr/sbin/httpd -f -v", "id": "78d28082c2e5d494c82aa181c95118ce498e25930ad9e288ba010257ca336378", "image": "localhost/curios-httpd-oci-amd64-v24.11.0:latest", @@ -1207,6 +1208,7 @@ "status": "Up About a minute" }, { + "cmdline": "/usr/bin/tini -- /usr/sbin/httpd -f -v -p 91", "command": "/usr/sbin/httpd -f -v -p 91", "id": "3451cfceca4eee1091c1dfedece2faee99bc8a729e781799d9c0b4368a31d86d", "image": "localhost/curios-httpd-oci-amd64-v24.11.0:latest", @@ -1229,6 +1231,7 @@ "status": "Up About a minute" }, { + "cmdline": "/usr/bin/tini -- /usr/sbin/nft-helper /etc/nftables.conf", "command": "/usr/sbin/nft-helper /etc/nftables.conf", "id": "4e7c3daeba15546e7640014b9ee46e389737ed36583e5cb2f8b75a07a82e8523", "image": "localhost/curios-nftables-oci-amd64-v24.11.0:latest",