Commit graph

684 commits

Author SHA1 Message Date
Ondřej Míchal
32d711cc64 Add a --distro option
This is meant to allow the user to create toolbox containers of
operating system distributions that are different from that of the
host and isn't Fedora.

https://github.com/containers/toolbox/pull/667
2021-01-12 02:37:47 +01:00
Ondřej Míchal
c990fb43ca Introduce the concept of a 'distro' for future non-Fedora containers
This shouldn't have any user-visible effect. However, it parametrizes
various code paths that were currently hard-coded to represent Fedora.
Subsequent commits will build upon this to support toolbox containers
of operating system distributions that aren't Fedora.

A map of supported operating system distributions has been introduced
that lists out the necessary bits of metadata needed to work with them.
In the future, it should just be a matter of adding new entries to this
map to add support for distributions that aren't Fedora.

https://github.com/containers/toolbox/pull/667
2021-01-12 02:37:47 +01:00
Debarshi Ray
20ad4c0429 cmd/enter: Add more information to errors on failing to get the host ID
https://github.com/containers/toolbox/pull/667
2021-01-12 01:07:35 +01:00
Debarshi Ray
26ea367ee8 cmd/create: Shuffle some code around
https://github.com/containers/toolbox/pull/667
2021-01-12 01:07:35 +01:00
Debarshi Ray
3994be4c9c cmd/create: Rename a function for clarity
A subsequent commit will add support for toolbox containers of
operating system distributions that aren't Fedora. That will require a
similar function that resolves a short image name to a fully qualified
one, but by iterating through a list of supported images instead of
using the image's RepoTags.

https://github.com/containers/toolbox/pull/667
2021-01-12 01:07:35 +01:00
Debarshi Ray
289c04aa86 cmd/create: Try to avoid 'latest' tags, when looking at RepoTags
The same image ID can be referred to by multiple names. It's common
that one of the names uses the 'latest' tag, while another uses a
specific version number. It's better to resolve a short image name to
one with a specific version number, because the meaning of the tag is
clear and won't change with time.

https://github.com/containers/toolbox/pull/666
2021-01-12 01:05:52 +01:00
Debarshi Ray
b511a76578 Update the labels used for filtering toolbox containers images
The com.github.debarshiray.toolbox label was introduced in commit
0ab6eb7401 to replace the com.redhat.component label for
filtering toolbox containers and images. This happened right before
the release of Fedora 30, which hasn't been supported for a while [1].
Therefore, it's time to stop using the old label.

It's also time to start using the newer com.github.containers.toolbox
label that was introduced in commit de5e5df9b7 to reflect the
project's new home under the Containers organization on GitHub.

[1] https://fedoraproject.org/wiki/Releases/30/Schedule

https://github.com/containers/toolbox/pull/665
2021-01-11 23:38:48 +01:00
Debarshi Ray
7c02f93d68 completion, pkg/utils: Update the range of supported Fedora releases
Rawhide currently points to Fedora 34, and Fedora 30 reached End of
Life on 24th November:
https://fedoraproject.org/wiki/End_of_life

https://github.com/containers/toolbox/pull/663
2021-01-08 01:54:08 +01:00
Ondřej Míchal
af87ede1db completion, doc/toolbox-create: Remove --candidate-registry
The --candidate-registry is a lesser known option only supported by
the POSIX shell implementation. The Go never implementation never
offered it, and nobody has felt its absence so far. So, it's safe to
assume that there's no urgent need to port it to Go, and it's better to
not confuse users by mentioning it.

https://github.com/containers/toolbox/pull/662
2021-01-07 21:11:25 +01:00
Debarshi Ray
dd4829a33c Prepare 0.0.98.1 2021-01-07 20:17:06 +01:00
Debarshi Ray
0b41cc62f4 doc/toolbox-create: Say that --image & --release are mutually exclusive
https://github.com/containers/toolbox/pull/661
2021-01-07 20:08:01 +01:00
Debarshi Ray
88f2916822 profile.d: Restore compatibility with Z shell
Otherwise, every zsh instance was running into:
  zsh: #: command not found...

Fallout from dcdfa3a1f5

https://github.com/containers/toolbox/pull/660
2021-01-07 20:03:56 +01:00
Kan Li
f850f1efa4 pkg/utils, sh: Pass the USER environment variable to the container
The USER environment variable is set in different ways on different
operating system distributions. It's usually set when logging into a
new user session, but thereafter it may or may not get propagated into
new instances of a shell depending on how it's getting set. eg.,
Fedora sets USER in /etc/profile, but Ubuntu doesn't. This means that
shells running on a Fedora host and a Fedora toolbox container will
automatically have the USER environment variable set. However, it's
only available on Ubuntu hosts, but not on Ubuntu toolbox containers.

Passing the USER environment variable to the container, if it's set on
the host, will avoid such inconsistencies in the environment.

https://github.com/containers/toolbox/pull/609
2021-01-07 15:42:27 +01:00
Debarshi Ray
f92f2182a3 Prepare 0.0.98 2021-01-05 17:59:07 +01:00
Debarshi Ray
d231919f54 cmd/initContainer: Unbreak 'enter' on hosts without a /etc/localtime
It's not mandatory to have a /etc/localtime. If it's absent then it
means that the UTC timezone is being used. One such example of an
operating system is Fedora CoreOS.

Fallout from b9a0bd5f0c

https://github.com/containers/toolbox/pull/656
2021-01-05 00:44:33 +01:00
Ondřej Míchal
a0b59871ef build: Explicitly specify final binary name
In some environments, 'go build' uses the basename of the path passed
to the -o option for the final binary name instead of using the
project's name. eg., in Fedora's build system the binary will be called
src/src, not src/toolbox.

https://github.com/containers/toolbox/pull/584
2021-01-04 21:00:32 +01:00
Ondřej Míchal
1a5acddca2 Correctly check validity of container name
regexp.MatchString() only returns an error if the pattern can't be
parsed. In this case, the pattern is a constant string literal, so
unless there's a programming mistake, the pattern should always be
parsable and there should never be an error.

What really needs to be checked is whether the 'containerName' matched
the pattern or not. That's indicated by the bool return value
'matched'.

https://github.com/containers/toolbox/pull/639
2020-12-27 00:36:59 +01:00
Ondřej Míchal
467492619a cmd/create: Make options --image and --release mutually exclusive
... because that's what they inherently are.

https://github.com/containers/toolbox/pull/637
2020-12-26 23:33:08 +01:00
Ondřej Míchal
db448ed9ce cmd: Remove periods at the end of flag descriptions
Most tools (e.g. git, podman, skopeo, buildah, coreutils, etc.) do not
put periods at the end of descriptions of flags. Let's not deviate :).

https://github.com/containers/toolbox/pull/636
2020-12-26 22:24:53 +01:00
Debarshi Ray
a05830893a playbooks: Don't use a separate file to pull the images
The Ansible playbooks are small enough as they are. Splitting things
across too many files makes it harder to remember which file does what.

https://github.com/containers/toolbox/pull/653
2020-12-21 16:41:17 +01:00
Juanje Ojeda
cf256870ce playbooks: Improve how 'systemd-tmpfiles --create' is invoked
The most important bit is the use of the 'creates' parameter of the
'command' module [1] because it conditionalizes the invocation of
'systemd-tmpfiles' on the presence of /run/media and self-documents its
purpose.

[1] https://docs.ansible.com/ansible/2.4/command_module.html

https://github.com/containers/toolbox/pull/652
2020-12-21 15:01:38 +01:00
Francis Laniel
48fb219ffe Make coredumpctl(1) 'dump' and 'debug' work inside toolbox containers
https://github.com/containers/toolbox/issues/543
2020-12-18 23:38:37 +01:00
Debarshi Ray
969e8c17ed cmd/run: Notify the terminal about the real UID of 'toolbox enter'
This will let GNOME Terminal handle toolbox(1) running as root, by not
trying to preserve the current toolbox container if it's running as
root. This is similar to how terminals don't preserve the current
working directory for interactive shells running as root.

This needs a VTE that supports the UID parameter in the OSC 777 escape
sequence, as given below:
  OSC 777 ; container ; push ; NAME ; RUNTIME ; UID BEL
  OSC 777 ; container ; push ; NAME ; RUNTIME ; UID ST
  OSC 777 ; container ; pop ; NAME ; RUNTIME ; UID BEL
  OSC 777 ; container ; pop ; NAME ; RUNTIME ; UID ST

https://github.com/containers/toolbox/pull/649
2020-12-16 22:23:07 +01:00
Debarshi Ray
0af82ab339 playbooks/fedora-33: Fix the image URLs by adding the version suffix
The system tests for Fedora 33 were failing:
  not ok 21 Remove all images (2 should be present; --force should not
    be necessary)
  # (from function `is' in file test/system/helpers.bash, line 287,
  #  in test file test/system/302-rmi.bats, line 7)
  #   `is "$output" "" "The output should be empty"' failed
  # $ /usr/local/bin/toolbox rmi --all
  # Error: image
    3ac100502d2123aff1cf6314760c7a89c55108b8de6ea3c10ddc79a1479f0fca
    has dependent children
  # Error: image
    4a6adf1f2a96adf5ea0c02b61f9fa574306f77fc522f39c2ce6bb164daead882
    has dependent children
  # #/vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  # #|     FAIL: The output should be empty
  # #| expected: '[no output]'
  # #|   actual: 'Error: image
    3ac100502d2123aff1cf6314760c7a89c55108b8de6ea3c10ddc79a1479f0fca
    has dependent children'
  # #|         > 'Error: image
    4a6adf1f2a96adf5ea0c02b61f9fa574306f77fc522f39c2ce6bb164daead882
    has dependent children'
  # #\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Fallout from ff4e4905da

https://github.com/containers/toolbox/pull/642
2020-12-02 18:45:01 +01:00
Debarshi Ray
dcdfa3a1f5 profile.d: Don't leak all the os-release fields into the shell
All the fields defined in /usr/lib/os-release were being injected into
the shell as environment variables. This is unintentional. Some of the
variables have relatively generic names, and having them in the
environment can lead to unexpected surprises.

Fallout from c6e37cdef3

https://github.com/containers/toolbox/pull/623
2020-11-17 00:30:29 +01:00
Fabiano Fidêncio
f6985abf70 images: Add nss-mdns to all images
The nss-mdns plugin for the GNU Name Service Switch (or NSS)
functionality of the GNU C Library is necessary to resolve the .local
mDNS domain. The plugin talks to the Avahi daemon running on the host
to resolve the names.

https://github.com/containers/toolbox/issues/209

Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
2020-11-15 22:50:09 +01:00
Fabiano Fidêncio
29c155f1ac cmd/create: Give access to Avahi to resolve the .local mDNS domain
https://github.com/containers/toolbox/issues/209

Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
2020-11-15 22:46:16 +01:00
Debarshi Ray
09d2c46b21 cmd/create: Use the host's user namespace when running as root
One of the biggest advantages of running as root is the ability to have
all the UIDs from the host operating system mapped into the container
by using the host's user namespace.

This can be a big help when faced with permission problems.

https://github.com/containers/toolbox/issues/267
2020-11-03 22:02:02 +01:00
Debarshi Ray
25b647d635 Don't rely on XDG_RUNTIME_DIR when running as root
This is one more step towards enabling toolbox(1) to be run as root.
When invoked as 'sudo toolbox' there's no XDG_RUNTIME_DIR available for
the root user. Neither the environment variable nor the directory are
present.

XDG_RUNTIME_DIR is used for two reasons. First, to place the 'lock'
file to synchronize Podman migrations and the initialization stamp
file to synchronize the container's entry point with the user-facing
'enter' command running on the host. Second, it's used to propagate
things like the user D-Bus, Pipewire and Wayland sockets.

The first use-case is important for toolbox(1) itself to work. When
running as root, XDG_RUNTIME_DIR is replaced with /run/toolbox for this
purpose.

The second use-case is mostly ignored because sudo(8) doesn't create
a full-fledged user session. Graphical applications can still work by
connecting to a X11 server over the local abstract socket or the file
system socket in /tmp/.X11-unix.

https://github.com/containers/toolbox/issues/267
2020-11-03 20:22:42 +01:00
Debarshi Ray
de2101464c cmd/create: Set XDG_RUNTIME_DIR when creating the toolbox container
Currently, XDG_RUNTIME_DIR only gets propagated into the toolbox
container from the host during 'enter'. This means that the
container's entry point doesn't know about it. So, there's code in
'init-container' that sets XDG_RUNTIME_DIR to /run/user/UID.

However, this assumption might not always hold true for all host
operating systems. Given that XDG_RUNTIME_DIR plays a crucial role in
synchronizing the container's entry point with the user-facing 'enter'
command running on the host, it's wise to try a bit harder to
propagate the value of XDG_RUNTIME_DIR into the container.

Note that it can still go wrong if the value of XDG_RUNTIME_DIR
changes after the container was created because the entry point will
still have the old value. Fortunately, this isn't something that
happens too often under normal operation.

The value of XDG_RUNTIME_DIR is still propagated during 'enter' to
retain compatibility with existing toolbox containers.

https://github.com/containers/toolbox/issues/267
2020-11-03 20:22:42 +01:00
Debarshi Ray
3cbd2a1343 Prepare 0.0.97 2020-11-03 20:15:39 +01:00
Debarshi Ray
f49df914f4 cmd/list: Color the output only when displaying on a terminal
https://github.com/containers/toolbox/issues/596
2020-11-03 02:03:14 +01:00
Debarshi Ray
e1635c06f3 Make locate(1) work inside toolbox containers
... by running updatedb(8) on start-up and then at 24 hour intervals
from there on.

This isn't as nice as using a systemd.timer(5) because the current
timer goes away when the toolbox container is stopped and is rearmed
when it's started. Therefore, repeatedly restarting a container will
also run updatedb(8) again and again.

Fortunately, this isn't so bad with updatedb(5) implementations that
are able to incrementally update the database [1], which is what Fedora
uses.

The 24 hour interval was chosen based on the systemd.timer(5) settings
used by Fedora's mlocate RPM.

[1] https://pagure.io/mlocate

https://github.com/containers/toolbox/issues/391
2020-11-03 01:41:41 +01:00
Debarshi Ray
18e3955fc0 cmd/create: Expose the host's /boot inside the container at /run/host
As requested by Colin Walters.

https://github.com/containers/toolbox/pull/606
2020-10-29 17:58:10 +01:00
Debarshi Ray
d065ca460a cmd/run: Run a login shell when falling back to Bash during 'enter'
'toolbox enter' attempts to run the user's preferred shell as a login
shell by passing it the '-l' argument. However, when the user's
preferred shell is missing from the toolbox container and it falls
back to Bash, then it was no longer a login shell because the '-l'
argument went missing.

https://github.com/containers/toolbox/pull/588
2020-10-29 17:10:06 +01:00
Kan Li
fca24b213e images, pkg/utils: Allow X11 clients to run as root
It's necessary to propagate the XAUTHORITY environment variable from
the host when an X11 client is run as 'sudo <some-client>'. If an X11
client is started inside a 'su -' session, then xauth(1) needs to be
present so that pam_xauth.so can add a new XAUTHORITY environment
variable to the 'su -' session.

https://github.com/containers/toolbox/pull/572
2020-10-29 16:08:32 +01:00
Allan Day
fb11b7e067 README.md: Improve the introductory paragraph
Using the word 'unprivileged' confuses readers because it means
different things to different people. eg., it can mean 'rootless' or
'sandboxed', which are quite different things. It becomes even more
confusing given the ongoing work to make 'sudo toolbox ...' work.

It's nice to mention that Toolbox is targetted at Linux operating
systems and that it relies on standard container technologies from OCI.

https://github.com/containers/toolbox/pull/597
2020-10-27 19:38:30 +01:00
Ondřej Míchal
30fef1edd6 README.md: Enable syntax highlighting in code blocks
Based on this list of langauges:
https://github.com/github/linguist/blob/master/lib/linguist/languages.yml

https://github.com/containers/toolbox/pull/598
2020-10-27 16:49:31 +01:00
Debarshi Ray
82c32bea74 cmd/run: Start o.fd.Flatpak.SessionHelper only for old containers
... that were created to have a bind mount at /run/host/monitor. Newly
created containers no longer need org.freedesktop.Flatpak.SessionHelper
and hence the D-Bus service doesn't need to be started for them.

https://github.com/containers/toolbox/issues/267
2020-10-26 16:00:25 +01:00
Debarshi Ray
71b5c8c0a2 cmd/create: Don't set up org.freedesktop.Flatpak.SessionHelper
It's no longer used to keep /etc/localtime and /etc/timezone
synchronized with the host.

https://github.com/containers/toolbox/issues/267
2020-10-26 16:00:25 +01:00
Debarshi Ray
b9a0bd5f0c cmd/initContainer, test/system: Don't rely on D-Bus for /etc/timezone
This is one more step towards enabling toolbox(1) to be run as root.
When invoked as 'sudo toolbox ...' there's no user or session D-Bus
instance available for the root user, which prevents the use of D-Bus
services like org.freedesktop.Flatpak.SessionHelper.

The code is forgiving to runtime errors when reacting to file system
events because it's not worth abruptly terminating the entry point
because of what might be a passing error. However, it's a lot stricter
when initially configuring the container because the failure mode isn't
as surprising for the user and it's worth starting from a valid state.

https://github.com/containers/toolbox/issues/267
2020-10-26 16:00:07 +01:00
Debarshi Ray
4c9b80aee2 cmd/initContainer: Don't rely on user D-Bus to track /etc/localtime
This is one more step towards enabling toolbox(1) to be run as root.
When invoked as 'sudo toolbox ...' there's no user or session D-Bus
instance available for the root user, which prevents the use of D-Bus
services like org.freedesktop.Flatpak.SessionHelper.

https://github.com/containers/toolbox/issues/267
2020-10-26 15:37:17 +01:00
Ondřej Míchal
083aec96f2 test/system: Rework check if toolbox started successfully
When I added the test that looked at the logs of a toolbox, I did not
realize that the startup of a toolbox takes some time. That caused the
CI to flake even more than usual.

The solution I used was inspired by a helper function in Podman's test
suite (WaitContainerReady()).

https://github.com/containers/toolbox/pull/594
2020-10-24 17:32:15 +02:00
Debarshi Ray
1ec57425f4 README.md: Update the example Fedora versions
https://github.com/containers/toolbox/pull/590
2020-10-22 18:12:37 +02:00
Ondřej Míchal
06d423c631 README.md: Mention how to remove a toolbox container
https://github.com/containers/toolbox/pull/590
2020-10-22 18:08:55 +02:00
Ondřej Míchal
1bd4400329 README.md: Add badges for CI status and downstream packages
https://github.com/containers/toolbox/pull/589
2020-10-22 17:27:56 +02:00
Debarshi Ray
a8a774269b cmd/initContainer: Enable running minikube on Silverblue
... by giving access to /var/lib/libvirt from the host operating
system.

Discussed with Daniel P. Berrangé.

https://github.com/containers/toolbox/issues/379
2020-10-21 16:13:07 +02:00
Debarshi Ray
494007b6ca cmd/create: Make pseudo-terminal devices be owned by the 'tty' group
When the host's /dev directory is bind mounted into the toolbox
container, then pseudo-terminal devices created for the container have
their group ownership set to 'nobody'.

This is because bind mounting /dev also pulls in the devpts file
system at the host's /dev/pts, which is owned by the 'tty' group on the
host. Since this GID is not available inside the container, it's
represented as 'nobody'.

This can be addressed by mounting a fresh devpts file system inside the
toolbox container. It ensures that pseudo-terminal devices created for
the container are owned by the container's 'tty' group.

As suggested by Giuseppe Scrivano.

https://github.com/containers/toolbox/pull/581
2020-10-20 16:18:32 +02:00
Kan Li
30ee7d9a38 Fix warning for Ubuntu containers: "Error: terminfo entry not found for xterm-256color"
On Ubuntu, both /usr/share/terminfo and /lib/terminfo can have contents, and xterm-256color is at /lib/terminfo (provided by ncurses-base package) while xterm+256color is at /usr/share/terminfo (provided by ncurses-term package). This PR checks both directory to suppress the warning.
2020-10-17 14:07:15 +02:00
Alex Crawford
c3264abc96 docs: fix reference to Fedora CoreOS
CoreOS hasn't existed since late 2016 and refers to the now-defunct
Container Linux. Fedora CoreOS is an entirely separate project.
2020-10-15 17:17:30 +02:00