diff --git a/.gitignore b/.gitignore index fc1b678..0bec8c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ SOURCES/toolbox-0.0.99.3-vendored.tar.xz /toolbox-0.0.99.3-vendored.tar.xz +/toolbox-0.0.99.5-vendored.tar.xz diff --git a/sources b/sources index a8351c5..df91c99 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (toolbox-0.0.99.4-vendored.tar.xz) = 882cd6ec1c1a193af8774dfdfd0aff72d376c4fec3e0cc702e2d524353c051e408eab2ac3fb43ec00fe622b46ac89fdbe97aca2f7cfbe3822e5d3ff1743f2fd0 +SHA512 (toolbox-0.0.99.5-vendored.tar.xz) = d82666e9abcbac2d01de440dfb8d57801bb97ec0854a9859c64689c47c6a1344b846fb151ffa9371d0a9a2c85c8f61c96cf8f546449ec63c9a44d85ef328b745 diff --git a/toolbox-Add-migration-paths-for-coreos-toolbox-users.patch b/toolbox-Add-migration-paths-for-coreos-toolbox-users.patch index 31a301f..1e3e254 100644 --- a/toolbox-Add-migration-paths-for-coreos-toolbox-users.patch +++ b/toolbox-Add-migration-paths-for-coreos-toolbox-users.patch @@ -1,4 +1,4 @@ -From 4b60bfc74678f8d5fb779be5c0fc0bc8e892d247 Mon Sep 17 00:00:00 2001 +From 4587b6e9240bf936b760e901435c4cfdd9c582b6 Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Wed, 18 Aug 2021 17:55:21 +0200 Subject: [PATCH 1/2] cmd/run: Make sosreport work by setting the HOST @@ -10,10 +10,10 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1940037 1 file changed, 1 insertion(+) diff --git a/src/cmd/run.go b/src/cmd/run.go -index 7657ffa50821..23d422623b14 100644 +index e2e31d9da4e6..84ad46518bfc 100644 --- a/src/cmd/run.go +++ b/src/cmd/run.go -@@ -501,6 +501,7 @@ func constructExecArgs(container, preserveFDs string, +@@ -498,6 +498,7 @@ func constructExecArgs(container, preserveFDs string, execArgs = append(execArgs, envOptions...) execArgs = append(execArgs, []string{ @@ -22,10 +22,10 @@ index 7657ffa50821..23d422623b14 100644 "--preserve-fds", preserveFDs, }...) -- -2.41.0 +2.43.0 -From 4ae3f7afc777dce2fe3b03198e0987507c049258 Mon Sep 17 00:00:00 2001 +From 892c33ed75443de90a2caa90959387bbc270c564 Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Fri, 10 Dec 2021 13:42:15 +0100 Subject: [PATCH 2/2] test/system: Update to test the migration path for @@ -36,33 +36,36 @@ This reverts the changes to the tests made in commit ca899c8a561f357ae32c6ba6813520fd8b682abb and the parts of commit 3aeb7cf288319e35eb9c5e26ea18d97452462c1e that were removed. --- - test/system/002-help.bats | 11 ----------- + test/system/002-help.bats | 14 -------------- test/system/100-root.bats | 27 +++++++++++++++++++++++++++ - 2 files changed, 27 insertions(+), 11 deletions(-) + 2 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 test/system/100-root.bats diff --git a/test/system/002-help.bats b/test/system/002-help.bats -index 7e4565e9d23d..58a4c2c87ece 100644 +index 695c51f92e7e..5fa4c6fe0b4c 100644 --- a/test/system/002-help.bats +++ b/test/system/002-help.bats -@@ -23,17 +23,6 @@ setup() { +@@ -23,20 +23,6 @@ setup() { _setup_environment } --@test "help: Try to run toolbox with no command" { -- run $TOOLBOX +-@test "help: Smoke test" { +- run --keep-empty-lines --separate-stderr "$TOOLBOX" - - assert_failure +- assert [ ${#lines[@]} -eq 0 ] +- lines=("${stderr_lines[@]}") - assert_line --index 0 "Error: missing command" -- assert_line --index 1 "create Create a new toolbox container" -- assert_line --index 2 "enter Enter an existing toolbox container" -- assert_line --index 3 "list List all existing toolbox containers and images" -- assert_line --index 4 "Run 'toolbox --help' for usage." +- assert_line --index 2 "create Create a new toolbox container" +- assert_line --index 3 "enter Enter an existing toolbox container" +- assert_line --index 4 "list List all existing toolbox containers and images" +- assert_line --index 6 "Run 'toolbox --help' for usage." +- assert [ ${#stderr_lines[@]} -eq 7 ] -} - - @test "help: Run command 'help'" { + @test "help: Command 'help'" { if ! command -v man 2>/dev/null; then - skip "Test works only if man is in PATH" + skip "not found man(1)" diff --git a/test/system/100-root.bats b/test/system/100-root.bats new file mode 100644 index 000000000000..32d87904213e @@ -97,5 +100,5 @@ index 000000000000..32d87904213e + skip "Testing of entering toolboxes is not implemented" +} -- -2.41.0 +2.43.0 diff --git a/toolbox-Build-fixes.patch b/toolbox-Build-fixes.patch deleted file mode 100644 index 32164ef..0000000 --- a/toolbox-Build-fixes.patch +++ /dev/null @@ -1,240 +0,0 @@ -From 424cc42fba3cb182a360dcdda68caf20d9141ae6 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Tue, 28 Feb 2023 17:12:04 +0100 -Subject: [PATCH 1/4] cmd/root: Don't use podman(1) when generating the - completions - -Ever since commit bafbbe81c9220cb3, the shell completions are generated -while building Toolbx using the 'completion' command. This involves -running toolbox(1) itself, and hence invoking 'podman version' to decide -if 'podman system migrate' is needed or not. - -Unfortunately, some build environments, like Fedora's, are set up inside -a chroot(2) or systemd-nspawn(1) or similar, where 'podman version' may -not work because it does various things with namespaces(7) and clone(2) -that can, under certain circumstances, encounter an EPERM. - -Therefore, it's better to avoid using podman(1) when generating the -shell completions, especially, since they are generated by Cobra itself -and podman(1) is not involved at all. - -Note that podman(1) is needed when the generated shell completions are -actually used in interactive command line environments. The shell -completions invoke the hidden '__complete' command to get the results -that are presented to the user, and, if needed, 'podman system migrate' -will continue to be run as part of that. - -This partially reverts commit f3e005d0142d7ec76d5ac8f0a2f331a52fd46011 -because podman(1) is now only an optional runtime dependency for the -system tests. - -https://github.com/containers/podman/issues/17657 ---- - meson.build | 2 +- - src/cmd/root.go | 9 +++++++-- - 2 files changed, 8 insertions(+), 3 deletions(-) - -diff --git a/meson.build b/meson.build -index 6f044bb204e3..653a3d3ac588 100644 ---- a/meson.build -+++ b/meson.build -@@ -18,12 +18,12 @@ subid_dep = cc.find_library('subid', has_headers: ['shadow/subid.h']) - - go = find_program('go') - go_md2man = find_program('go-md2man') --podman = find_program('podman') - - bats = find_program('bats', required: false) - codespell = find_program('codespell', required: false) - htpasswd = find_program('htpasswd', required: false) - openssl = find_program('openssl', required: false) -+podman = find_program('podman', required: false) - shellcheck = find_program('shellcheck', required: false) - skopeo = find_program('skopeo', required: false) - -diff --git a/src/cmd/root.go b/src/cmd/root.go -index 304b03dcd889..9975ccc7a4c8 100644 ---- a/src/cmd/root.go -+++ b/src/cmd/root.go -@@ -166,7 +166,7 @@ func preRun(cmd *cobra.Command, args []string) error { - - logrus.Debugf("TOOLBOX_PATH is %s", toolboxPath) - -- if err := migrate(); err != nil { -+ if err := migrate(cmd, args); err != nil { - return err - } - -@@ -211,13 +211,18 @@ func rootRun(cmd *cobra.Command, args []string) error { - return rootRunImpl(cmd, args) - } - --func migrate() error { -+func migrate(cmd *cobra.Command, args []string) error { - logrus.Debug("Migrating to newer Podman") - - if utils.IsInsideContainer() { - return nil - } - -+ if cmdName, completionCmdName := cmd.Name(), completionCmd.Name(); cmdName == completionCmdName { -+ logrus.Debugf("Migration not needed: command %s doesn't need it", cmdName) -+ return nil -+ } -+ - configDir, err := os.UserConfigDir() - if err != nil { - logrus.Debugf("Migrating to newer Podman: failed to get the user config directory: %s", err) --- -2.41.0 - - -From 0723706168a1bde708bc9acc203c5e9870bc94d5 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 1 Mar 2023 19:41:56 +0100 -Subject: [PATCH 2/4] cmd/root: Sprinkle a debug log - -https://github.com/containers/toolbox/pull/1251 ---- - src/cmd/root.go | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/cmd/root.go b/src/cmd/root.go -index 9975ccc7a4c8..2e7428a20b24 100644 ---- a/src/cmd/root.go -+++ b/src/cmd/root.go -@@ -215,6 +215,7 @@ func migrate(cmd *cobra.Command, args []string) error { - logrus.Debug("Migrating to newer Podman") - - if utils.IsInsideContainer() { -+ logrus.Debug("Migration not needed: running inside a container") - return nil - } - --- -2.41.0 - - -From 0736db58456bb635854493e28a0c36bda49988ce Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 1 Mar 2023 19:46:11 +0100 -Subject: [PATCH 3/4] cmd/root: Shuffle some code around and sprinkle some - debug logs - -Having a separate convenience function reduces the indentation levels by -at least one, and sometimes two, and makes it easy to have more detailed -debug logs. - -This will make the subsequent commit easier to read. - -https://github.com/containers/toolbox/issues/1246 ---- - src/cmd/root.go | 32 ++++++++++++++++++++++++-------- - 1 file changed, 24 insertions(+), 8 deletions(-) - -diff --git a/src/cmd/root.go b/src/cmd/root.go -index 2e7428a20b24..9aafe3e0d3be 100644 ---- a/src/cmd/root.go -+++ b/src/cmd/root.go -@@ -1,5 +1,5 @@ - /* -- * Copyright © 2019 – 2022 Red Hat Inc. -+ * Copyright © 2019 – 2023 Red Hat Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -@@ -139,13 +139,8 @@ func preRun(cmd *cobra.Command, args []string) error { - if !utils.IsInsideContainer() { - logrus.Debugf("Running on a cgroups v%d host", cgroupsVersion) - -- if currentUser.Uid != "0" { -- logrus.Debugf("Looking for sub-GID and sub-UID ranges for user %s", currentUser.Username) -- -- if _, err := utils.ValidateSubIDRanges(currentUser); err != nil { -- logrus.Debugf("Looking for sub-GID and sub-UID ranges: %s", err) -- return newSubIDError() -- } -+ if _, err := validateSubIDRanges(cmd, args, currentUser); err != nil { -+ return err - } - } - -@@ -392,3 +387,24 @@ func setUpLoggers() error { - - return nil - } -+ -+func validateSubIDRanges(cmd *cobra.Command, args []string, user *user.User) (bool, error) { -+ logrus.Debugf("Looking for sub-GID and sub-UID ranges for user %s", user.Username) -+ -+ if user.Uid == "0" { -+ logrus.Debugf("Look-up not needed: user %s doesn't need them", user.Username) -+ return true, nil -+ } -+ -+ if utils.IsInsideContainer() { -+ logrus.Debug("Look-up not needed: running inside a container") -+ return true, nil -+ } -+ -+ if _, err := utils.ValidateSubIDRanges(user); err != nil { -+ logrus.Debugf("Looking for sub-GID and sub-UID ranges: %s", err) -+ return false, newSubIDError() -+ } -+ -+ return true, nil -+} --- -2.41.0 - - -From 02537eac420f49e96110663794ef5f2511eb6860 Mon Sep 17 00:00:00 2001 -From: Jan Zerebecki -Date: Wed, 1 Mar 2023 19:52:28 +0100 -Subject: [PATCH 4/4] cmd/root: Don't validate subordinate IDs when generating - the completions - -Ever since commit bafbbe81c9220cb3, the shell completions are generated -while building Toolbx using the 'completion' command. This involves -running toolbox(1) itself, and hence validating the subordinate user and -group ID ranges. - -Unfortunately, some build environments, like openSUSE's, don't have -subordinate ID ranges set up. Therefore, it's better to not validate -the subordinate ID ranges when generating the shell completions, since -they are generated by Cobra itself and subordinate ID ranges are not -involved at all. - -Note that subordinate ID ranges may be needed when the generated shell -completions are actually used in interactive command line environments. -The shell completions invoke the hidden '__complete' command to get the -results that are presented to the user, and, if needed, the subordinate -ID ranges will continue to be used by podman(1) as part of that. - -Some changes by Debarshi Ray. - -https://github.com/containers/toolbox/issues/1246 -https://github.com/containers/toolbox/pull/1249 ---- - src/cmd/root.go | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/cmd/root.go b/src/cmd/root.go -index 9aafe3e0d3be..aee9fe026ac3 100644 ---- a/src/cmd/root.go -+++ b/src/cmd/root.go -@@ -401,6 +401,11 @@ func validateSubIDRanges(cmd *cobra.Command, args []string, user *user.User) (bo - return true, nil - } - -+ if cmdName, completionCmdName := cmd.Name(), completionCmd.Name(); cmdName == completionCmdName { -+ logrus.Debugf("Look-up not needed: command %s doesn't need them", cmdName) -+ return true, nil -+ } -+ - if _, err := utils.ValidateSubIDRanges(user); err != nil { - logrus.Debugf("Looking for sub-GID and sub-UID ranges: %s", err) - return false, newSubIDError() --- -2.41.0 - diff --git a/toolbox-Make-the-build-flags-match-RHEL-s-gobuild-for-PPC64.patch b/toolbox-Make-the-build-flags-match-RHEL-s-gobuild-for-PPC64.patch index 096df45..40ace44 100644 --- a/toolbox-Make-the-build-flags-match-RHEL-s-gobuild-for-PPC64.patch +++ b/toolbox-Make-the-build-flags-match-RHEL-s-gobuild-for-PPC64.patch @@ -1,4 +1,4 @@ -From c943fe330ddfb91b94efb22a450e491316d2173c Mon Sep 17 00:00:00 2001 +From 3b5b5b2ca2e284d83275ffb73bc413c9234d7b0a Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 29 Jun 2020 17:57:47 +0200 Subject: [PATCH] build: Make the build flags match RHEL's %{gobuildflags} for @@ -51,5 +51,5 @@ index c572d6dfb02b..1addef1f186b 100755 exit "$?" -- -2.39.2 +2.43.0 diff --git a/toolbox-Make-the-build-flags-match-RHEL-s-gobuild.patch b/toolbox-Make-the-build-flags-match-RHEL-s-gobuild.patch index 48ccc76..c373c7a 100644 --- a/toolbox-Make-the-build-flags-match-RHEL-s-gobuild.patch +++ b/toolbox-Make-the-build-flags-match-RHEL-s-gobuild.patch @@ -1,4 +1,4 @@ -From 606f135e4900c7d808341515b74811e3a3714cff Mon Sep 17 00:00:00 2001 +From 2ecd1ac4d83844d5b6314762587fc2347adfdd0f Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 29 Jun 2020 17:57:47 +0200 Subject: [PATCH] build: Make the build flags match RHEL's %{gobuildflags} @@ -51,5 +51,5 @@ index c572d6dfb02b..c492a4e73445 100755 exit "$?" -- -2.39.2 +2.43.0 diff --git a/toolbox-Simplify-removing-the-user-s-password.patch b/toolbox-Simplify-removing-the-user-s-password.patch deleted file mode 100644 index d10d870..0000000 --- a/toolbox-Simplify-removing-the-user-s-password.patch +++ /dev/null @@ -1,1056 +0,0 @@ -From 07d5c061eacec0a3b145947a9b95a11b705ea5d3 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Sat, 12 Aug 2023 14:26:22 +0200 -Subject: [PATCH 1/5] test/system: Test that group and user IDs work - -These tests assume that the group and user information on the host -operating system can be provided by different plugins for the GNU Name -Service Switch (or NSS) functionality of the GNU C Library. eg., on -enterprise FreeIPA set-ups. However, it's expected that everything -inside the Toolbx container will be provided by /etc/group, /etc/passwd, -/etc/shadow, etc.. - -While /etc/group and /etc/passwd can be read by any user, /etc/shadow -can only be read by root. However, it's awkward to use sudo(8) in the -test cases involving /etc/shadow, because they ensure that root and -$USER don't need passwords to authenticate inside the container, and -sudo(8) itself depends on that. If sudo(8) is used, the test suite can -behave unexpectedly if Toolbx didn't set up the container correctly. -eg., it can get blocked waiting for a password. - -Hence, 'podman unshare' is used instead to enter the container's initial -user namespace, where $USER from the host appears as root. This is -sufficient because the test cases only need to read /etc/shadow inside -the Toolbx container. - -https://github.com/containers/toolbox/pull/1355 ---- - test/system/206-user.bats | 520 ++++++++++++++++++++++++++++++++++++++ - 1 file changed, 520 insertions(+) - create mode 100644 test/system/206-user.bats - -diff --git a/test/system/206-user.bats b/test/system/206-user.bats -new file mode 100644 -index 000000000000..fdb2a33da88c ---- /dev/null -+++ b/test/system/206-user.bats -@@ -0,0 +1,520 @@ -+# shellcheck shell=bats -+# -+# Copyright © 2023 Red Hat, Inc. -+# -+# Licensed under the Apache License, Version 2.0 (the "License"); -+# you may not use this file except in compliance with the License. -+# You may obtain a copy of the License at -+# -+# http://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, -+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+# See the License for the specific language governing permissions and -+# limitations under the License. -+# -+ -+load 'libs/bats-support/load' -+load 'libs/bats-assert/load' -+load 'libs/helpers' -+ -+setup() { -+ bats_require_minimum_version 1.7.0 -+ _setup_environment -+ cleanup_containers -+} -+ -+teardown() { -+ cleanup_containers -+} -+ -+@test "user: separate namespace" { -+ local ns_host -+ ns_host=$(readlink /proc/$$/ns/user) -+ -+ create_default_container -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run sh -c 'readlink /proc/$$/ns/user' -+ -+ assert_success -+ assert_line --index 0 --regexp '^user:\[[[:digit:]]+\]$' -+ refute_line --index 0 "$ns_host" -+ -+ if check_bats_version 1.10.0; then -+ assert [ ${#lines[@]} -eq 1 ] -+ else -+ assert [ ${#lines[@]} -eq 2 ] -+ fi -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside the default container" { -+ local default_container -+ default_container="$(get_system_id)-toolbox-$(get_system_version)" -+ -+ create_default_container -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount "$default_container")" -+ -+ "$TOOLBOX" run true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount "$default_container" -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside Arch Linux" { -+ create_distro_container arch latest arch-toolbox-latest -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount arch-toolbox-latest)" -+ -+ "$TOOLBOX" run --distro arch true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount arch-toolbox-latest -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside Fedora 34" { -+ create_distro_container fedora 34 fedora-toolbox-34 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount fedora-toolbox-34)" -+ -+ "$TOOLBOX" run --distro fedora --release 34 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount fedora-toolbox-34 -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside RHEL 8.7" { -+ create_distro_container rhel 8.7 rhel-toolbox-8.7 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount rhel-toolbox-8.7)" -+ -+ "$TOOLBOX" run --distro rhel --release 8.7 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount rhel-toolbox-8.7 -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside Ubuntu 16.04" { -+ create_distro_container ubuntu 16.04 ubuntu-toolbox-16.04 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount ubuntu-toolbox-16.04)" -+ -+ "$TOOLBOX" run --distro ubuntu --release 16.04 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount ubuntu-toolbox-16.04 -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside Ubuntu 18.04" { -+ create_distro_container ubuntu 18.04 ubuntu-toolbox-18.04 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount ubuntu-toolbox-18.04)" -+ -+ "$TOOLBOX" run --distro ubuntu --release 18.04 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount ubuntu-toolbox-18.04 -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: root in shadow(5) inside Ubuntu 20.04" { -+ create_distro_container ubuntu 20.04 ubuntu-toolbox-20.04 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount ubuntu-toolbox-20.04)" -+ -+ "$TOOLBOX" run --distro ubuntu --release 20.04 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount ubuntu-toolbox-20.04 -+ -+ assert_success -+ assert_line --regexp '^root::.+$' -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside the default container" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_default_container -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside Arch Linux" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_distro_container arch latest arch-toolbox-latest -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro arch sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside Fedora 34" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_distro_container fedora 34 fedora-toolbox-34 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro fedora --release 34 sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside RHEL 8.7" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_distro_container rhel 8.7 rhel-toolbox-8.7 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro rhel --release 8.7 sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside Ubuntu 16.04" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_distro_container ubuntu 16.04 ubuntu-toolbox-16.04 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro ubuntu --release 16.04 sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside Ubuntu 18.04" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_distro_container ubuntu 18.04 ubuntu-toolbox-18.04 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro ubuntu --release 18.04 sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in passwd(5) inside Ubuntu 20.04" { -+ local user_gecos -+ user_gecos="$(getent passwd "$USER" | cut --delimiter : --fields 5)" -+ -+ local user_id_real -+ user_id_real="$(id --real --user)" -+ -+ create_distro_container ubuntu 20.04 ubuntu-toolbox-20.04 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro ubuntu --release 20.04 sh -c 'cat /etc/passwd' -+ -+ assert_success -+ assert_line --regexp "^$USER::$user_id_real:$user_id_real:$user_gecos:$HOME:$SHELL$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside the default container" { -+ local default_container -+ default_container="$(get_system_id)-toolbox-$(get_system_version)" -+ -+ create_default_container -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount "$default_container")" -+ -+ "$TOOLBOX" run true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount "$default_container" -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside Arch Linux" { -+ create_distro_container arch latest arch-toolbox-latest -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount arch-toolbox-latest)" -+ -+ "$TOOLBOX" run --distro arch true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount arch-toolbox-latest -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside Fedora 34" { -+ create_distro_container fedora 34 fedora-toolbox-34 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount fedora-toolbox-34)" -+ -+ "$TOOLBOX" run --distro fedora --release 34 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount fedora-toolbox-34 -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside RHEL 8.7" { -+ create_distro_container rhel 8.7 rhel-toolbox-8.7 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount rhel-toolbox-8.7)" -+ -+ "$TOOLBOX" run --distro rhel --release 8.7 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount rhel-toolbox-8.7 -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside Ubuntu 16.04" { -+ create_distro_container ubuntu 16.04 ubuntu-toolbox-16.04 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount ubuntu-toolbox-16.04)" -+ -+ "$TOOLBOX" run --distro ubuntu --release 16.04 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount ubuntu-toolbox-16.04 -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside Ubuntu 18.04" { -+ create_distro_container ubuntu 18.04 ubuntu-toolbox-18.04 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount ubuntu-toolbox-18.04)" -+ -+ "$TOOLBOX" run --distro ubuntu --release 18.04 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount ubuntu-toolbox-18.04 -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in shadow(5) inside Ubuntu 20.04" { -+ create_distro_container ubuntu 20.04 ubuntu-toolbox-20.04 -+ container_root_file_system="$("$PODMAN" unshare "$PODMAN" mount ubuntu-toolbox-20.04)" -+ -+ "$TOOLBOX" run --distro ubuntu --release 20.04 true -+ -+ run --keep-empty-lines --separate-stderr "$PODMAN" unshare cat "$container_root_file_system/etc/shadow" -+ "$PODMAN" unshare "$PODMAN" unmount ubuntu-toolbox-20.04 -+ -+ assert_success -+ refute_line --regexp "^$USER:.*$" -+ assert [ ${#lines[@]} -gt 0 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside the default container" { -+ create_default_container -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^(sudo|wheel):x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside Arch Linux" { -+ create_distro_container arch latest arch-toolbox-latest -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro arch sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^wheel:x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside Fedora 34" { -+ create_distro_container fedora 34 fedora-toolbox-34 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro fedora --release 34 sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^wheel:x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside RHEL 8.7" { -+ create_distro_container rhel 8.7 rhel-toolbox-8.7 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro rhel --release 8.7 sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^wheel:x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside Ubuntu 16.04" { -+ create_distro_container ubuntu 16.04 ubuntu-toolbox-16.04 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro ubuntu --release 16.04 sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^sudo:x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside Ubuntu 18.04" { -+ create_distro_container ubuntu 18.04 ubuntu-toolbox-18.04 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro ubuntu --release 18.04 sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^sudo:x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} -+ -+@test "user: $USER in group(5) inside Ubuntu 20.04" { -+ create_distro_container ubuntu 20.04 ubuntu-toolbox-20.04 -+ -+ run --keep-empty-lines --separate-stderr "$TOOLBOX" run --distro ubuntu --release 20.04 sh -c 'cat /etc/group' -+ -+ assert_success -+ assert_line --regexp "^sudo:x:[[:digit:]]+:$USER$" -+ assert [ ${#lines[@]} -gt 1 ] -+ -+ # shellcheck disable=SC2154 -+ assert [ ${#stderr_lines[@]} -eq 0 ] -+} --- -2.41.0 - - -From 22ba72f3152650d538437bf298ebde4a63e2adc9 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 4 Nov 2020 00:55:31 +0100 -Subject: [PATCH 2/5] Deprecate the --monitor-host option of 'init-container' - -The --monitor-host option was added to the 'init-container' command in -commit 8b84b5e4604921fa to accommodate Podman versions older than 1.2.0 -that didn't have the '--dns none' and '--no-hosts' options for -'podman create'. These options are necessary to keep the Toolbx -container's /etc/resolv.conf and /etc/hosts files synchronized with -those of the host. - -Note that Podman 1.2.0 was already available a few months before -commit 8b84b5e4604921fa introduced the --monitor-host option. The -chances of someone using an older Podman back then was already on the -decline, and it's very unlikely that a container created with such a -Podman has survived till this date. - -Commit b6b484fa792b442a raised the minimum required Podman version to -1.4.0, and made the '--dns none' and '--no-hosts' options a hard -requirement. The minimum required Podman version was again raised -recently in commit 8e80dd5db1e6f40b to 1.6.4. Therefore, these days, -there's no need to separately use the --monitor-host option of -'init-container' for newly created containers to indicate that the -Podman version wasn't older than 1.2.0. - -Given all this, it's time to stop using the --monitor-host option of -'init-container', and assume that it's always set. The option is still -accepted to retain compatibility with existing Toolbx containers. - -For containers that were created with the --monitor-host option, a -deprecation notice will be shown as: - $ podman start --attach CONTAINER - Flag --monitor-host has been deprecated, it does nothing - ... - -https://github.com/containers/toolbox/pull/617 ---- - doc/toolbox-init-container.1.md | 32 +++--------- - src/cmd/create.go | 1 - - src/cmd/initContainer.go | 86 ++++++++++++++++----------------- - 3 files changed, 49 insertions(+), 70 deletions(-) - -diff --git a/doc/toolbox-init-container.1.md b/doc/toolbox-init-container.1.md -index 45c9a77939f2..51a7b1ee643d 100644 ---- a/doc/toolbox-init-container.1.md -+++ b/doc/toolbox-init-container.1.md -@@ -9,7 +9,6 @@ toolbox\-init\-container - Initialize a running container - *--home-link* - *--media-link* - *--mnt-link* -- *--monitor-host* - *--shell SHELL* - *--uid UID* - *--user USER* -@@ -76,31 +75,12 @@ Make `/mnt` a symbolic link to `/var/mnt`. - - **--monitor-host** - --Ensures that certain configuration files inside the toolbox container are kept --synchronized with their counterparts on the host, and bind mounts some paths --from the host's file system into the container. -- --The synchronized files are: -- --- `/etc/host.conf` --- `/etc/hosts` --- `/etc/localtime` --- `/etc/resolv.conf` --- `/etc/timezone` -- --The bind mounted paths are: -- --- `/etc/machine-id` --- `/run/libvirt` --- `/run/systemd/journal` --- `/run/systemd/resolve` --- `/run/udev/data` --- `/tmp` --- `/var/lib/flatpak` --- `/var/lib/libvirt` --- `/var/lib/systemd/coredump` --- `/var/log/journal` --- `/var/mnt` -+Deprecated, does nothing. -+ -+Crucial configuration files inside the toolbox container are always kept -+synchronized with their counterparts on the host, and various subsets of the -+host's file system hierarchy are always bind mounted to their corresponding -+locations inside the toolbox container. - - **--shell** SHELL - -diff --git a/src/cmd/create.go b/src/cmd/create.go -index 2a103f01ed2d..6cec99258847 100644 ---- a/src/cmd/create.go -+++ b/src/cmd/create.go -@@ -393,7 +393,6 @@ func createContainer(container, image, release, authFile string, showCommandToEn - "--shell", userShell, - "--uid", currentUser.Uid, - "--user", currentUser.Username, -- "--monitor-host", - } - - entryPoint = append(entryPoint, slashHomeLink...) -diff --git a/src/cmd/initContainer.go b/src/cmd/initContainer.go -index c4cd1b02d298..cb132bffc817 100644 ---- a/src/cmd/initContainer.go -+++ b/src/cmd/initContainer.go -@@ -107,8 +107,12 @@ func init() { - - flags.BoolVar(&initContainerFlags.monitorHost, - "monitor-host", -- false, -- "Ensure that certain configuration files inside the toolbox container are in sync with the host") -+ true, -+ "Deprecated, does nothing") -+ if err := flags.MarkDeprecated("monitor-host", "it does nothing"); err != nil { -+ panicMsg := fmt.Sprintf("cannot mark --monitor-host as deprecated: %s", err) -+ panic(panicMsg) -+ } - - flags.StringVar(&initContainerFlags.shell, - "shell", -@@ -163,59 +167,55 @@ func initContainer(cmd *cobra.Command, args []string) error { - - defer toolboxEnvFile.Close() - -- if initContainerFlags.monitorHost { -- logrus.Debug("Monitoring host") -- -- if utils.PathExists("/run/host/etc") { -- logrus.Debug("Path /run/host/etc exists") -- -- if _, err := os.Readlink("/etc/host.conf"); err != nil { -- if err := redirectPath("/etc/host.conf", -- "/run/host/etc/host.conf", -- false); err != nil { -- return err -- } -- } -+ if utils.PathExists("/run/host/etc") { -+ logrus.Debug("Path /run/host/etc exists") - -- if _, err := os.Readlink("/etc/hosts"); err != nil { -- if err := redirectPath("/etc/hosts", -- "/run/host/etc/hosts", -- false); err != nil { -- return err -- } -+ if _, err := os.Readlink("/etc/host.conf"); err != nil { -+ if err := redirectPath("/etc/host.conf", -+ "/run/host/etc/host.conf", -+ false); err != nil { -+ return err - } -+ } - -- if localtimeTarget, err := os.Readlink("/etc/localtime"); err != nil || -- localtimeTarget != "/run/host/etc/localtime" { -- if err := redirectPath("/etc/localtime", -- "/run/host/etc/localtime", -- false); err != nil { -- return err -- } -+ if _, err := os.Readlink("/etc/hosts"); err != nil { -+ if err := redirectPath("/etc/hosts", -+ "/run/host/etc/hosts", -+ false); err != nil { -+ return err - } -+ } - -- if err := updateTimeZoneFromLocalTime(); err != nil { -+ if localtimeTarget, err := os.Readlink("/etc/localtime"); err != nil || -+ localtimeTarget != "/run/host/etc/localtime" { -+ if err := redirectPath("/etc/localtime", -+ "/run/host/etc/localtime", -+ false); err != nil { - return err - } -+ } -+ -+ if err := updateTimeZoneFromLocalTime(); err != nil { -+ return err -+ } - -- if _, err := os.Readlink("/etc/resolv.conf"); err != nil { -- if err := redirectPath("/etc/resolv.conf", -- "/run/host/etc/resolv.conf", -- false); err != nil { -- return err -- } -+ if _, err := os.Readlink("/etc/resolv.conf"); err != nil { -+ if err := redirectPath("/etc/resolv.conf", -+ "/run/host/etc/resolv.conf", -+ false); err != nil { -+ return err - } -+ } - -- for _, mount := range initContainerMounts { -- if err := mountBind(mount.containerPath, mount.source, mount.flags); err != nil { -- return err -- } -+ for _, mount := range initContainerMounts { -+ if err := mountBind(mount.containerPath, mount.source, mount.flags); err != nil { -+ return err - } -+ } - -- if utils.PathExists("/sys/fs/selinux") { -- if err := mountBind("/sys/fs/selinux", "/usr/share/empty", ""); err != nil { -- return err -- } -+ if utils.PathExists("/sys/fs/selinux") { -+ if err := mountBind("/sys/fs/selinux", "/usr/share/empty", ""); err != nil { -+ return err - } - } - } --- -2.41.0 - - -From 66a791ff10234023b858b7a28dd98985b054eca1 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Tue, 7 Mar 2023 16:13:04 +0100 -Subject: [PATCH 3/5] cmd/initContainer: Bind mount locations regardless of - /run/host/etc - -Bind mounting the locations at runtime doesn't really have anything to -do with whether /run/host/etc is present inside the Toolbx container. - -The only possible exception could have been /etc/machine-id, but it -isn't, because the bind mount is only performed if the source at -/run/host/etc/machine-id is present. - -This is a historical mistake that has persisted for a long time, since, -in practice, /run/host/etc will almost always exist inside the Toolbx -container. It's time to finally correct it. - -Fallout from 9436bbece01d7aa4dc91b4013ed9f80d0b8d34f4 - -https://github.com/containers/toolbox/pull/1255 ---- - src/cmd/initContainer.go | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - -diff --git a/src/cmd/initContainer.go b/src/cmd/initContainer.go -index cb132bffc817..153e5ccb824e 100644 ---- a/src/cmd/initContainer.go -+++ b/src/cmd/initContainer.go -@@ -206,18 +206,6 @@ func initContainer(cmd *cobra.Command, args []string) error { - return err - } - } -- -- for _, mount := range initContainerMounts { -- if err := mountBind(mount.containerPath, mount.source, mount.flags); err != nil { -- return err -- } -- } -- -- if utils.PathExists("/sys/fs/selinux") { -- if err := mountBind("/sys/fs/selinux", "/usr/share/empty", ""); err != nil { -- return err -- } -- } - } - - if initContainerFlags.mediaLink { -@@ -236,6 +224,18 @@ func initContainer(cmd *cobra.Command, args []string) error { - } - } - -+ for _, mount := range initContainerMounts { -+ if err := mountBind(mount.containerPath, mount.source, mount.flags); err != nil { -+ return err -+ } -+ } -+ -+ if utils.PathExists("/sys/fs/selinux") { -+ if err := mountBind("/sys/fs/selinux", "/usr/share/empty", ""); err != nil { -+ return err -+ } -+ } -+ - if _, err := user.Lookup(initContainerFlags.user); err != nil { - if err := configureUsers(initContainerFlags.uid, - initContainerFlags.user, --- -2.41.0 - - -From d416f1b4abd0782526c011b078442856c733e718 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Tue, 15 Aug 2023 20:57:46 +0200 -Subject: [PATCH 4/5] cmd/initContainer: Simplify code by removing a function - parameter - -Until now, configureUsers() was pushing the burden of deciding whether -to add a new user or modify an existing one on the callers, even though -it can trivially decide itself. Involving the caller loosens the -encapsulation of the user configuration logic by spreading it across -configureUsers() and it's caller, and adds an extra function parameter -that needs to be carefully set and is vulnerable to programmer errors. - -Fallout from 9ea6fe5852ea8f5225114d825e8e6813e2a3cfea - -https://github.com/containers/toolbox/pull/1356 ---- - src/cmd/initContainer.go | 62 ++++++++++++++++------------------------ - 1 file changed, 24 insertions(+), 38 deletions(-) - -diff --git a/src/cmd/initContainer.go b/src/cmd/initContainer.go -index 153e5ccb824e..02c389635378 100644 ---- a/src/cmd/initContainer.go -+++ b/src/cmd/initContainer.go -@@ -236,24 +236,12 @@ func initContainer(cmd *cobra.Command, args []string) error { - } - } - -- if _, err := user.Lookup(initContainerFlags.user); err != nil { -- if err := configureUsers(initContainerFlags.uid, -- initContainerFlags.user, -- initContainerFlags.home, -- initContainerFlags.shell, -- initContainerFlags.homeLink, -- false); err != nil { -- return err -- } -- } else { -- if err := configureUsers(initContainerFlags.uid, -- initContainerFlags.user, -- initContainerFlags.home, -- initContainerFlags.shell, -- initContainerFlags.homeLink, -- true); err != nil { -- return err -- } -+ if err := configureUsers(initContainerFlags.uid, -+ initContainerFlags.user, -+ initContainerFlags.home, -+ initContainerFlags.shell, -+ initContainerFlags.homeLink); err != nil { -+ return err - } - - if utils.PathExists("/etc/krb5.conf.d") && !utils.PathExists("/etc/krb5.conf.d/kcm_default_ccache") { -@@ -386,9 +374,7 @@ func initContainerHelp(cmd *cobra.Command, args []string) { - } - } - --func configureUsers(targetUserUid int, -- targetUser, targetUserHome, targetUserShell string, -- homeLink, targetUserExists bool) error { -+func configureUsers(targetUserUid int, targetUser, targetUserHome, targetUserShell string, homeLink bool) error { - if homeLink { - if err := redirectPath("/home", "/var/home", true); err != nil { - return err -@@ -400,45 +386,45 @@ func configureUsers(targetUserUid int, - return fmt.Errorf("failed to get group for sudo: %w", err) - } - -- if targetUserExists { -- logrus.Debugf("Modifying user %s with UID %d:", targetUser, targetUserUid) -+ if _, err := user.Lookup(targetUser); err != nil { -+ logrus.Debugf("Adding user %s with UID %d:", targetUser, targetUserUid) - -- usermodArgs := []string{ -- "--append", -+ useraddArgs := []string{ - "--groups", sudoGroup, -- "--home", targetUserHome, -+ "--home-dir", targetUserHome, -+ "--no-create-home", - "--shell", targetUserShell, - "--uid", fmt.Sprint(targetUserUid), - targetUser, - } - -- logrus.Debug("usermod") -- for _, arg := range usermodArgs { -+ logrus.Debug("useradd") -+ for _, arg := range useraddArgs { - logrus.Debugf("%s", arg) - } - -- if err := shell.Run("usermod", nil, nil, nil, usermodArgs...); err != nil { -- return fmt.Errorf("failed to modify user %s with UID %d: %w", targetUser, targetUserUid, err) -+ if err := shell.Run("useradd", nil, nil, nil, useraddArgs...); err != nil { -+ return fmt.Errorf("failed to add user %s with UID %d: %w", targetUser, targetUserUid, err) - } - } else { -- logrus.Debugf("Adding user %s with UID %d:", targetUser, targetUserUid) -+ logrus.Debugf("Modifying user %s with UID %d:", targetUser, targetUserUid) - -- useraddArgs := []string{ -+ usermodArgs := []string{ -+ "--append", - "--groups", sudoGroup, -- "--home-dir", targetUserHome, -- "--no-create-home", -+ "--home", targetUserHome, - "--shell", targetUserShell, - "--uid", fmt.Sprint(targetUserUid), - targetUser, - } - -- logrus.Debug("useradd") -- for _, arg := range useraddArgs { -+ logrus.Debug("usermod") -+ for _, arg := range usermodArgs { - logrus.Debugf("%s", arg) - } - -- if err := shell.Run("useradd", nil, nil, nil, useraddArgs...); err != nil { -- return fmt.Errorf("failed to add user %s with UID %d: %w", targetUser, targetUserUid, err) -+ if err := shell.Run("usermod", nil, nil, nil, usermodArgs...); err != nil { -+ return fmt.Errorf("failed to modify user %s with UID %d: %w", targetUser, targetUserUid, err) - } - } - --- -2.41.0 - - -From e673dc792438c64683237d26b21d005ffb008fd5 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Tue, 22 Aug 2023 23:29:43 +0200 -Subject: [PATCH 5/5] cmd/initContainer: Simplify removing the user's password - -It's one less invocation of an external command, which is good because -spawning a new process is generally expensive. - -One positive side-effect of this is that on some Active Directory -set-ups, the entry point no longer fails with: - Error: failed to remove password for user login@company.com: failed - to invoke passwd(1) - -... because of: - # passwd --delete login@company.com - passwd: Libuser error at line: 210 - name contains invalid char `@'. - -This is purely an accident, and isn't meant to be an intential change to -support Active Directory. Tools like useradd(8) and usermod(8) from -Shadow aren't meant to work with Active Directory users, and, hence, it -can still break in other ways. For that, one option is to expose $USER -from the host operating system to the Toolbx container through a Varlink -interface that can be used by nss-systemd inside the container. - -Based on an idea from Si. - -https://github.com/containers/toolbox/issues/585 ---- - src/cmd/initContainer.go | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -diff --git a/src/cmd/initContainer.go b/src/cmd/initContainer.go -index 02c389635378..91b53cee7d0d 100644 ---- a/src/cmd/initContainer.go -+++ b/src/cmd/initContainer.go -@@ -393,6 +393,7 @@ func configureUsers(targetUserUid int, targetUser, targetUserHome, targetUserShe - "--groups", sudoGroup, - "--home-dir", targetUserHome, - "--no-create-home", -+ "--password", "", - "--shell", targetUserShell, - "--uid", fmt.Sprint(targetUserUid), - targetUser, -@@ -413,6 +414,7 @@ func configureUsers(targetUserUid int, targetUser, targetUserHome, targetUserShe - "--append", - "--groups", sudoGroup, - "--home", targetUserHome, -+ "--password", "", - "--shell", targetUserShell, - "--uid", fmt.Sprint(targetUserUid), - targetUser, -@@ -428,12 +430,6 @@ func configureUsers(targetUserUid int, targetUser, targetUserHome, targetUserShe - } - } - -- logrus.Debugf("Removing password for user %s", targetUser) -- -- if err := shell.Run("passwd", nil, nil, nil, "--delete", targetUser); err != nil { -- return fmt.Errorf("failed to remove password for user %s: %w", targetUser, err) -- } -- - logrus.Debug("Removing password for user root") - - if err := shell.Run("passwd", nil, nil, nil, "--delete", "root"); err != nil { --- -2.41.0 - diff --git a/toolbox-cmd-initContainer-Be-aware-of-security-hardened-moun.patch b/toolbox-cmd-initContainer-Be-aware-of-security-hardened-moun.patch deleted file mode 100644 index adf39a3..0000000 --- a/toolbox-cmd-initContainer-Be-aware-of-security-hardened-moun.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 1fde98456652ddbcb750ade2121c5ceec93fbfae Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Thu, 13 Jul 2023 13:08:40 +0200 -Subject: [PATCH] cmd/initContainer: Be aware of security hardened mount points - -Sometimes locations such as /var/lib/flatpak, /var/lib/systemd/coredump -and /var/log/journal sit on security hardened mount points that are -marked as 'nosuid,nodev,noexec' [1]. In such cases, when Toolbx is used -rootless, an attempt to bind mount these locations read-only at runtime -with mount(8) fails because of permission problems: - # mount --rbind -o ro - mount: : filesystem was mounted, but any subsequent - operation failed: Unknown error 5005. - -(Note that the above error message from mount(8) was subsequently -improved to show something more meaningful than 'Unknown error' [2].) - -The problem is that 'init-container' is running inside the container's -mount and user namespace, and the source paths were mounted inside the -host's namespace with 'nosuid,nodev,noexec'. The above mount(8) call -tries to remove the 'nosuid,nodev,noexec' flags from the mount point and -replace them with only 'ro', which is something that can't be done from -a child namespace. - -Note that this doesn't fail when Toolbx is running as root. This is -because the container uses the host's user namespace and is able to -remove the 'nosuid,nodev,noexec' flags from the mount point and replace -them with only 'ro'. Even though it doesn't fail, the flags shouldn't -get replaced like that inside the container, because it removes the -security hardening of those mount points. - -There's actually no benefit in bind mounting these paths as read-only. -It was historically done this way 'just to be safe' because a user isn't -expected to write to these locations from inside a container. However, -Toolbx doesn't intend to provide any heightened security beyond what's -already available on the host. - -Hence, it's better to get out of the way and leave it to the permissions -on the source location from the host operating system to guard the -castle. This is accomplished by not passing any file system options to -mount(8) [1]. - -Based on an idea from Si. - -[1] https://man7.org/linux/man-pages/man8/mount.8.html - -[2] util-linux commit 9420ca34dc8b6f0f - https://github.com/util-linux/util-linux/commit/9420ca34dc8b6f0f - https://github.com/util-linux/util-linux/pull/2376 - -https://github.com/containers/toolbox/issues/911 ---- - src/cmd/initContainer.go | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/cmd/initContainer.go b/src/cmd/initContainer.go -index 465ac063b210..c4cd1b02d298 100644 ---- a/src/cmd/initContainer.go -+++ b/src/cmd/initContainer.go -@@ -62,10 +62,10 @@ var ( - {"/run/udev/data", "/run/host/run/udev/data", ""}, - {"/run/udev/tags", "/run/host/run/udev/tags", ""}, - {"/tmp", "/run/host/tmp", "rslave"}, -- {"/var/lib/flatpak", "/run/host/var/lib/flatpak", "ro"}, -+ {"/var/lib/flatpak", "/run/host/var/lib/flatpak", ""}, - {"/var/lib/libvirt", "/run/host/var/lib/libvirt", ""}, -- {"/var/lib/systemd/coredump", "/run/host/var/lib/systemd/coredump", "ro"}, -- {"/var/log/journal", "/run/host/var/log/journal", "ro"}, -+ {"/var/lib/systemd/coredump", "/run/host/var/lib/systemd/coredump", ""}, -+ {"/var/log/journal", "/run/host/var/log/journal", ""}, - {"/var/mnt", "/run/host/var/mnt", "rslave"}, - } - ) --- -2.41.0 - diff --git a/toolbox.spec b/toolbox.spec index 3c926ca..9a65c85 100644 --- a/toolbox.spec +++ b/toolbox.spec @@ -1,13 +1,13 @@ %global __brp_check_rpaths %{nil} Name: toolbox -Version: 0.0.99.4 +Version: 0.0.99.5 %global goipath github.com/containers/%{name} %gometa -Release: 8%{?dist} -Summary: Tool for containerized command line environments on Linux +Release: 1%{?dist} +Summary: Tool for interactive command line environments on Linux License: ASL 2.0 URL: https://containertoolbx.org/ @@ -15,11 +15,6 @@ URL: https://containertoolbx.org/ Source0: https://github.com/containers/%{name}/releases/download/%{version}/%{name}-%{version}-vendored.tar.xz Source1: %{name}.conf -# Upstream -Patch0: toolbox-Build-fixes.patch -Patch1: toolbox-cmd-initContainer-Be-aware-of-security-hardened-moun.patch -Patch2: toolbox-Simplify-removing-the-user-s-password.patch - # RHEL specific Patch100: toolbox-Make-the-build-flags-match-RHEL-s-gobuild.patch Patch101: toolbox-Make-the-build-flags-match-RHEL-s-gobuild-for-PPC64.patch @@ -34,14 +29,23 @@ BuildRequires: shadow-utils-subid-devel BuildRequires: systemd BuildRequires: systemd-rpm-macros +Recommends: skopeo +Recommends: subscription-manager + Requires: containers-common -Requires: podman >= 1.4.0 +Requires: podman >= 1.6.4 %description -Toolbox is a tool for Linux operating systems, which allows the use of -containerized command line environments. It is built on top of Podman and -other standard container technologies from OCI. +Toolbx is a tool for Linux, which allows the use of interactive command line +environments for development and troubleshooting the host operating system, +without having to install software on the host. It is built on top of Podman +and other standard container technologies from OCI. + +Toolbx environments have seamless access to the user's home directory, the +Wayland and X11 sockets, networking (including Avahi), removable devices (like +USB sticks), systemd journal, SSH agent, D-Bus, ulimits, /dev and the udev +database, etc.. %package tests @@ -49,7 +53,6 @@ Summary: Tests for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} Requires: coreutils -Requires: gawk Requires: grep Requires: httpd-tools Requires: openssl @@ -62,9 +65,6 @@ The %{name}-tests package contains system tests for %{name}. %prep %setup -q -%patch0 -p1 -%patch1 -p1 -%patch2 -p1 %ifnarch ppc64 %patch100 -p1 @@ -131,6 +131,10 @@ install -m0644 %{SOURCE1} %{buildroot}%{_sysconfdir}/containers/%{name}.conf %changelog +* Mon Jan 15 2024 Debarshi Ray - 0.0.99.5-1 +- Update to 0.0.99.5 +Resolves: RHEL-19773 + * Fri Dec 08 2023 Debarshi Ray - 0.0.99.4-8 - Rebuild for CVE-2023-39325 and CVE-2023-44487 Resolves: RHEL-12620