Merge pull request #81 from travier/stderrfix
diff --git a/rhcos-toolbox b/rhcos-toolbox
index c1fb3b0..5e21800 100755
--- a/rhcos-toolbox
+++ b/rhcos-toolbox
@@ -10,59 +10,69 @@
TOOLBOX_NAME=toolbox-"$(whoami)"
TOOLBOXRC="${HOME}"/.toolboxrc
+errecho() {
+ >&2 echo "${@}"
+}
+
setup() {
# Allow user overrides
if [ -f "${TOOLBOXRC}" ]; then
- echo ".toolboxrc file detected, overriding defaults..."
+ errecho ".toolboxrc file detected, overriding defaults..."
source "${TOOLBOXRC}"
fi
TOOLBOX_IMAGE="${REGISTRY}"/"${IMAGE}"
}
run() {
+ # Pull the container image if it does not exists yet
if ! image_exists; then
image_pull
if container_exists; then
sudo podman rm "${TOOLBOX_NAME}"
fi
+ # If it already exists, make sure it is up-to-date
elif ! image_fresh; then
- read -r -p "There is a newer version of ${TOOLBOX_IMAGE} available. Would you like to pull it? [y/N] "
-
+ >&2 read -r -p "There is a newer version of ${TOOLBOX_IMAGE} available. Would you like to pull it? [y/N] "
if [[ ${REPLY} =~ ^([Yy][Ee][Ss]|[Yy])+$ ]]; then
image_pull
if container_exists; then
sudo podman rm "${TOOLBOX_NAME}"
fi
else
- echo "Skipping retrieval of new image.."
+ errecho "Skipping retrieval of new image.."
fi
fi
+ # If the container does not already exists, create it, while making sure to
+ # use the option from the RUN label if provided
local runlabel=$(image_runlabel)
if ! container_exists; then
- echo "Spawning a container '${TOOLBOX_NAME}' with image '${TOOLBOX_IMAGE}'"
+ errecho "Spawning a container '${TOOLBOX_NAME}' with image '${TOOLBOX_IMAGE}'"
if [[ -z "${runlabel}" ]] || [[ "${runlabel}" == "<no value>" ]]; then
container_create
else
- echo "Detected RUN label in the container image. Using that as the default..."
+ errecho "Detected RUN label in the container image. Using that as the default..."
container_create_runlabel
fi
else
- echo "Container '${TOOLBOX_NAME}' already exists. Trying to start..."
- echo "(To remove the container and start with a fresh toolbox, run: sudo podman rm '${TOOLBOX_NAME}')"
+ errecho "Container '${TOOLBOX_NAME}' already exists. Trying to start..."
+ errecho "(To remove the container and start with a fresh toolbox, run: sudo podman rm '${TOOLBOX_NAME}')"
fi
+ # Start our freshly created container
local state=$(container_state)
if [[ "${state}" == configured ]] || [[ "${state}" == created ]] || [[ "${state}" == exited ]] || [[ "${state}" == stopped ]]; then
container_start
elif [[ "${state}" != running ]]; then
- echo "Container '${TOOLBOX_NAME}' in unknown state: '$state'"
+ errecho "Container '${TOOLBOX_NAME}' in unknown state: '$state'"
return 1
fi
if [[ "$#" -eq "0" ]]; then
- echo "Container started successfully. To exit, type 'exit'."
+ errecho "Container started successfully. To exit, type 'exit'."
fi
+ # Attach to the interactive shell in the container or directly execute the
+ # command passed as argument
container_exec "$@"
}
@@ -85,11 +95,11 @@
# returns 0 if the image on disk is "fresh", i.e. no newer image on remote
# registry. (or if we couldn't inspect the registry successfully)
image_fresh() {
- echo "Checking if there is a newer version of ${TOOLBOX_IMAGE} available..."
+ errecho "Checking if there is a newer version of ${TOOLBOX_IMAGE} available..."
local_date=$(sudo podman image inspect "${TOOLBOX_IMAGE}" --format '{{.Created}}')
if ! remote_date=$(sudo skopeo inspect --authfile "${AUTHFILE}" docker://"${TOOLBOX_IMAGE}" --format '{{.Created}}'); then
- echo "Error inspecting ${TOOLBOX_IMAGE} via skopeo"
+ errecho "Error inspecting ${TOOLBOX_IMAGE} via skopeo"
return
fi
# if the date on the registry is *NOT* newer than the local image date
@@ -105,19 +115,20 @@
image_pull() {
if ! sudo --preserve-env podman pull --authfile "${AUTHFILE}" "${TOOLBOX_IMAGE}"; then
- read -r -p "Would you like to manually authenticate to registry: '${REGISTRY}' and try again? [y/N] "
+ >&2 read -r -p "Would you like to manually authenticate to registry: '${REGISTRY}' and try again? [y/N] "
if [[ ${REPLY} =~ ^([Yy][Ee][Ss]|[Yy])+$ ]]; then
sudo --preserve-env podman login --authfile "${AUTHFILE}" "${REGISTRY}"
sudo --preserve-env podman pull --authfile "${AUTHFILE}" "${TOOLBOX_IMAGE}"
else
- echo "Exiting..."
+ errecho "Exiting..."
exit 1
fi
fi
}
container_create() {
+ local -r cmd=$(sudo podman image inspect "${TOOLBOX_IMAGE}" | jq -re ".[].Config.Cmd[0]") || cmd="/bin/sh"
if ! sudo podman create \
--hostname toolbox \
--name "${TOOLBOX_NAME}" \
@@ -127,24 +138,24 @@
--ipc=host \
--tty \
--interactive \
- -e HOST=/host \
- -e NAME="${TOOLBOX_NAME}" \
- -e IMAGE="${IMAGE}" \
+ --env HOST=/host \
+ --env NAME="${TOOLBOX_NAME}" \
+ --env IMAGE="${IMAGE}" \
--security-opt label=disable \
--volume /run:/run \
--volume /var/log:/var/log \
--volume /etc/machine-id:/etc/machine-id \
--volume /etc/localtime:/etc/localtime \
--volume /:/host \
- "${TOOLBOX_IMAGE}" 2>&1; then
- echo "$0: failed to create container '${TOOLBOX_NAME}'"
+ "${TOOLBOX_IMAGE}" "${cmd}"; then
+ errecho "$0: failed to create container '${TOOLBOX_NAME}'"
exit 1
fi
}
container_start() {
- if ! sudo podman start "${TOOLBOX_NAME}" 2>&1; then
- echo "$0: failed to start container '${TOOLBOX_NAME}'"
+ if ! sudo podman start "${TOOLBOX_NAME}"; then
+ errecho "$0: failed to start container '${TOOLBOX_NAME}'"
exit 1
fi
}
@@ -160,34 +171,21 @@
| sed 's/IMAGE=IMAGE/IMAGE=${TOOLBOX_IMAGE}/' \
| sed 's/host IMAGE/host ${TOOLBOX_IMAGE}/')"
if ! eval "${pod}" ; then
- echo "$0: failed to create container from runlabel '${TOOLBOX_NAME}'"
+ errecho "$0: failed to create container from runlabel '${TOOLBOX_NAME}'"
exit 1
fi
}
container_exec() {
if [[ "$#" -eq 0 ]]; then
- cmd=$(sudo podman image inspect "${TOOLBOX_IMAGE}" | jq -re ".[].Config.Cmd[0]") || cmd="/bin/sh"
- sudo podman exec \
- --env LANG="${LANG}" \
- --env TERM="${TERM}" \
- --tty \
- --interactive \
- "${TOOLBOX_NAME}" \
- "${cmd}"
+ sudo podman attach "${TOOLBOX_NAME}"
else
- sudo podman exec \
- --env LANG="${LANG}" \
- --env TERM="${TERM}" \
- --tty \
- --interactive \
- "${TOOLBOX_NAME}" \
- "$@"
+ echo "${@}; exit" | sudo podman attach "${TOOLBOX_NAME}"
fi
}
show_help() {
- echo "USAGE: toolbox [-h/--help] [command]
+ errecho "USAGE: toolbox [-h/--help] [command]
toolbox is a small script that launches a container to let you bring in your favorite debugging or admin tools.
The toolbox container is a pet container and will be restarted on following runs.
To remove the container and start fresh, do sudo podman rm ${TOOLBOX_NAME}.