app-admin/toolbox: fix access to private toolbox image on GCR

Use docker-credential-gcr to generate credentials string for
the containers from gcr.io registry and mirrors to authorize
access to private images.

BUG=b/211904749
TEST=presubmit
RELEASE_NOTE=Fix access to private toolbox images hosted on GCR.

Change-Id: Iaf275ec47ef01eb3fc3428669ebc94c5244aa90f
Reviewed-on: https://cos-review.googlesource.com/c/cos/overlays/board-overlays/+/26860
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Reviewed-by: Varsha Teratipally <teratipally@google.com>
Reviewed-by: Rayan Dasoriya <dasoriya@google.com>
diff --git a/project-lakitu/app-admin/toolbox/files/0001-Added-containerd-support.patch b/project-lakitu/app-admin/toolbox/files/0001-Added-containerd-support.patch
index dd6b860..0e7f251 100644
--- a/project-lakitu/app-admin/toolbox/files/0001-Added-containerd-support.patch
+++ b/project-lakitu/app-admin/toolbox/files/0001-Added-containerd-support.patch
@@ -1,14 +1,14 @@
-From fc9fea5b5b47686f9e841d4b7d0105e06960c112 Mon Sep 17 00:00:00 2001
+From 1e3d36e86b30ed217172a47c55c64e1d76e5b99d Mon Sep 17 00:00:00 2001
 From: Rayan Dasoriya <dasoriya@google.com>
 Date: Tue, 20 Jul 2021 02:32:45 +0000
 Subject: [PATCH] Added containerd support
 
 ---
- toolbox | 19 +++++++++++++++----
- 1 file changed, 15 insertions(+), 4 deletions(-)
+ toolbox | 32 ++++++++++++++++++++++++++++----
+ 1 file changed, 28 insertions(+), 4 deletions(-)
 
 diff --git a/toolbox b/toolbox
-index f101cf1..fcd2102 100755
+index f101cf1..ede3b31 100755
 --- a/toolbox
 +++ b/toolbox
 @@ -10,6 +10,8 @@ TOOLBOX_DIRECTORY="/var/lib/toolbox"
@@ -20,7 +20,7 @@
  
  toolboxrc="${HOME}"/.toolboxrc
  
-@@ -28,18 +30,27 @@ machinepath="${TOOLBOX_DIRECTORY}/${machinename}"
+@@ -28,18 +30,40 @@ machinepath="${TOOLBOX_DIRECTORY}/${machinename}"
  osrelease="${machinepath}/etc/os-release"
  if [ ! -f ${osrelease} ] || systemctl is-failed -q ${machinename} ; then
  	sudo mkdir -p "${machinepath}"
@@ -32,10 +32,23 @@
 -	docker export ${machinename} | sudo tar -x -C "${machinepath}" -f -
 -	docker rm ${machinename}
 +	if [ ! -z "${TOOLBOX_DOCKER_IMAGE_TARBALL}" ] ; then
-+                sudo ctr image import "${TOOLBOX_DOCKER_IMAGE_TARBALL}"
-+        else
-+                sudo ctr image pull "${TOOLBOX_DOCKER_IMAGE}:${TOOLBOX_DOCKER_TAG}"
-+        fi
++		sudo ctr image import "${TOOLBOX_DOCKER_IMAGE_TARBALL}"
++	else
++		if [[ "${TOOLBOX_DOCKER_IMAGE}" =~ ^[a-z.]*gcr.io/ ]]; then
++			# Get a host part of the container name
++			registry_host="${TOOLBOX_DOCKER_IMAGE/gcr.io*/gcr.io}"
++			# docker-credential-gcr can fail if it runs in a
++			# non-GCP env, so let it fail and proceed without
++			# --user flag in this case
++			credentials=$(echo "${registry_host}" | \
++				(/usr/bin/docker-credential-gcr get || true) 2>/dev/null | \
++				jq -r '.Username + ":" + .Secret')
++			if [[ -n "${credentials}" ]]; then
++				user_flags=('--user' "${credentials}")
++			fi
++		fi
++		sudo ctr image pull "${user_flags[@]}" "${TOOLBOX_DOCKER_IMAGE}:${TOOLBOX_DOCKER_TAG}"
++	fi
 +	sudo ctr containers create "${TOOLBOX_DOCKER_IMAGE}:${TOOLBOX_DOCKER_TAG}" ${machinename} /bin/true
 +	sudo ctr snapshot mounts "${TOOLBOX_TEMP_DIR}" ${machinename} | xargs sudo
 +	sudo rsync -a "${TOOLBOX_TEMP_DIR}/" "${machinepath}"
@@ -53,5 +66,5 @@
          ${TOOLBOX_BIND} \
          ${TOOLBOX_ENV} \
 -- 
-2.32.0.402.g57bb445576-goog
+2.34.1.448.ga2b2bfdf31-goog
 
diff --git a/project-lakitu/app-admin/toolbox/toolbox-0.0.1-r29.ebuild b/project-lakitu/app-admin/toolbox/toolbox-0.0.1-r30.ebuild
similarity index 100%
rename from project-lakitu/app-admin/toolbox/toolbox-0.0.1-r29.ebuild
rename to project-lakitu/app-admin/toolbox/toolbox-0.0.1-r30.ebuild
diff --git a/project-lakitu/app-admin/toolbox/toolbox-0.0.1.ebuild b/project-lakitu/app-admin/toolbox/toolbox-0.0.1.ebuild
index 77c9471..f485602 100644
--- a/project-lakitu/app-admin/toolbox/toolbox-0.0.1.ebuild
+++ b/project-lakitu/app-admin/toolbox/toolbox-0.0.1.ebuild
@@ -18,7 +18,7 @@
 IUSE=""
 
 DEPEND=""
-RDEPEND="${DEPEND}"
+RDEPEND="${DEPEND} app-misc/jq"
 
 src_prepare() {
 	epatch "${FILESDIR}"/0001-Added-containerd-support.patch