diff --git a/board/common/rootfs/usr/sbin/container b/board/common/rootfs/usr/sbin/container index 35df8a2fa..4c7dfbb81 100755 --- a/board/common/rootfs/usr/sbin/container +++ b/board/common/rootfs/usr/sbin/container @@ -63,6 +63,21 @@ calc_sha() sha256sum "$1" 2>/dev/null | awk '{print $1}' } +# Calculate a combined SHA256 over the container script and its +# optional env file. Environment variables are stored separately +# from the script, so both must be included in the checksum to +# detect configuration changes such as added/changed env vars. +calc_config_sha() +{ + _envfile="/run/containers/args/${name}.env" + + if [ -f "$_envfile" ]; then + cat "$1" "$_envfile" | sha256sum | awk '{print $1}' + else + calc_sha "$1" + fi +} + # Check image transport, return 0 if remote, 1 if local is_remote() { @@ -124,7 +139,7 @@ is_uptodate() # If SHA matches, check container instance if [ "$stored_sha" = "$current_sha" ]; then if podman container exists "$name"; then - config_sha=$(calc_sha "$script") + config_sha=$(calc_config_sha "$script") container_sha=$(podman inspect "$name" --format '{{index .Config.Labels "config-sha256"}}' 2>/dev/null) container_img_sha=$(podman inspect "$name" --format '{{index .Config.Labels "meta-image-sha256"}}' 2>/dev/null) @@ -143,7 +158,7 @@ is_uptodate() else # Remote image optimization: check config-sha256 only if podman container exists "$name"; then - config_sha=$(calc_sha "$script") + config_sha=$(calc_config_sha "$script") container_sha=$(podman inspect "$name" --format '{{index .Config.Labels "config-sha256"}}' 2>/dev/null) if [ "$container_sha" = "$config_sha" ]; then @@ -459,7 +474,7 @@ create() fi # Add config checksum label - args="$args --label config-sha256=$(calc_sha "$script")" + args="$args --label config-sha256=$(calc_config_sha "$script")" fi # shellcheck disable=SC2048 diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 7486a2035..bccb60bd6 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -71,6 +71,7 @@ Noteworthy changes and additions in this release are marked below in bold text. similar to IPv4, correctly mapping to the ietf-ip.yang model semantics - Fix #1082: Wi-Fi interfaces always scanned, introduce a `scan-mode` to the Wi-Fi concept in Infix +- Fix #1313: Container is not restarted if environment variable is changed - Fix #1314: Raspberry Pi 4B with 1 or 8 GiB RAM does not boot. This was due newer EEPROM firmware in newer boards require a newer rpi-firmware package - Fix #1345: firewall not updating when interfaces become bridge/lag ports diff --git a/doc/cli/keybindings.md b/doc/cli/keybindings.md index cc85fbcd8..2633ccd9d 100644 --- a/doc/cli/keybindings.md +++ b/doc/cli/keybindings.md @@ -31,6 +31,7 @@ CLI has several keybindings, most significant first: | Ctrl-q | Ctrl-v | Insert next character literally | | Ctrl-r | | History, reversed interactive search (i-search) | | Ctrl-t | | Transpose/Swap characters before and at cursor | +| Meta-# | Alt-Shift-3 | Prepend # to current line and submit to history | ## What is Meta? diff --git a/package/klish/klish.hash b/package/klish/klish.hash index 3fbd5169b..e8e93c693 100644 --- a/package/klish/klish.hash +++ b/package/klish/klish.hash @@ -1,3 +1,3 @@ # Locally calculated sha256 9d9d33b873917ca5d0bdcc47a36d2fd385971ab0c045d1472fcadf95ee5bcf5b LICENCE -sha256 39a73fdaa7e41001e804e2bbdebdc885da79d540f0246777e8fd1c0dd9fc9475 klish-1c31f50ab775d467fa18f2e0a798006949536a2a-git4.tar.gz +sha256 cd9bc969350b8b30d9a7a31b0f19fb3218c602f04fe7e6a1d80682a75ed26d18 klish-3ae496c43d90354ffa94d364d7775c089f0e119a-git4.tar.gz diff --git a/package/klish/klish.mk b/package/klish/klish.mk index 93c86395b..57066b279 100644 --- a/package/klish/klish.mk +++ b/package/klish/klish.mk @@ -4,7 +4,7 @@ # ################################################################################ -KLISH_VERSION = 1c31f50ab775d467fa18f2e0a798006949536a2a +KLISH_VERSION = 3ae496c43d90354ffa94d364d7775c089f0e119a KLISH_SITE = https://github.com/kernelkit/klish.git #KLISH_VERSION = tags/3.0.0 #KLISH_SITE = https://src.libcode.org/pkun/klish.git diff --git a/test/case/containers/environment/test.adoc b/test/case/containers/environment/test.adoc index 4b300a6b6..54b8378b9 100644 --- a/test/case/containers/environment/test.adoc +++ b/test/case/containers/environment/test.adoc @@ -5,11 +5,13 @@ ifdef::topdoc[:imagesdir: {topdoc}../../test/case/containers/environment] ==== Description Verify that environment variables can be set in container configuration -and are available inside the running container. +and are available inside the running container. Also verify that +changing an environment variable triggers a container restart. 1 Set up a container config with multiple environment variables 2. Serve variables back to host using a CGI script in container 3. Verify served content against environment variables +4. Change an environment variable and verify the container restarts ==== Topology @@ -23,5 +25,7 @@ image::topology.svg[Container environment variables topology, align=center, scal . Verify container has started . Verify basic connectivity to data interface . Verify environment variables in CGI response +. Change environment variable and verify container restarts +. Verify container has restarted with updated env diff --git a/test/case/containers/environment/test.py b/test/case/containers/environment/test.py index a10e1a6c1..851d9e3ec 100755 --- a/test/case/containers/environment/test.py +++ b/test/case/containers/environment/test.py @@ -3,11 +3,13 @@ Container environment variables Verify that environment variables can be set in container configuration -and are available inside the running container. +and are available inside the running container. Also verify that +changing an environment variable triggers a container restart. 1 Set up a container config with multiple environment variables 2. Serve variables back to host using a CGI script in container 3. Verify served content against environment variables +4. Change an environment variable and verify the container restarts """ import infamy from infamy.util import until, to_binary, curl @@ -105,4 +107,24 @@ until(lambda: all(string in ns.call(lambda: curl(URL)) for string in expected_strings)) + with test.step("Change environment variable and verify container restarts"): + UPDATED_ENV_VARS = [ + {"key": "TEST_VAR", "value": "updated-value"}, + {"key": "APP_PORT", "value": "8080"}, + {"key": "DEBUG_MODE", "value": "true"}, + {"key": "PATH_WITH_SPACES", "value": "/path with spaces/test"} + ] + + target.put_config_dict("infix-containers", { + "containers": { + "container": [{ + "name": f"{NAME}", + "env": UPDATED_ENV_VARS, + }] + } + }) + + with test.step("Verify container has restarted with updated env"): + until(lambda: "TEST_VAR=updated-value" in ns.call(lambda: curl(URL)), attempts=60) + test.succeed()