From 370cde9b685e61c448351196b86ca43b55549024 Mon Sep 17 00:00:00 2001 From: thelamer <ryankuba@gmail.com> Date: Fri, 30 Oct 2020 13:47:50 -0700 Subject: [PATCH] update mods logic to support ghcr --- root/docker-mods | 67 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/root/docker-mods b/root/docker-mods index c90e5a4..e6de313 100755 --- a/root/docker-mods +++ b/root/docker-mods @@ -20,15 +20,59 @@ if [ ! -f /usr/bin/curl ]; then fi fi +## Functions + +# Use different filtering depending on URL +get_blob_sha () { + if [[ $1 == "ghcr" ]]; then + curl \ + --silent \ + --location \ + --request GET \ + --header "Authorization: Bearer $2" \ + $3 |\ + grep -A4 'layers' |\ + grep -m1 'digest' |\ + awk -F'"' '{print $4}' + else + curl \ + --silent \ + --location \ + --request GET \ + --header "Authorization: Bearer $2" \ + $3 |\ + grep -m1 "blobSum" |\ + awk -F'"' '{print $4}' + fi +} + # Main run logic echo "[mod-init] Attempting to run Docker Modification Logic" IFS='|' DOCKER_MODS=(${DOCKER_MODS}) for DOCKER_MOD in "${DOCKER_MODS[@]}"; do - FILENAME=$(echo ${DOCKER_MOD} | sed 's/[:\/]/./g') - ENDPOINT=$(echo ${DOCKER_MOD} | awk -F: '{print $1}') - USERNAME=$(echo ${ENDPOINT} | awk -F/ '{print $1}') - TAG=$(echo ${DOCKER_MOD} | awk -F: '{print $2}') + # Support alternative endpoints + if [[ ${DOCKER_MOD} == ghcr.io/* ]] || [[ ${DOCKER_MOD} == linuxserver/* ]]; then + DOCKER_MOD=$(echo ${DOCKER_MOD} | sed 's/ghcr.io\///g') + FILENAME=$(echo ${DOCKER_MOD} | sed 's/[:\/]/./g') + REPO=$(echo ${DOCKER_MOD} | awk -F'(/|:)' '{print $2}') + ENDPOINT=$(echo ${DOCKER_MOD} | awk -F: '{print $1}') + USERNAME=$(echo ${ENDPOINT} | awk -F/ '{print $1}') + TAG=$(echo ${DOCKER_MOD} | awk -F: '{print $2}') + AUTH_URL="https://ghcr.io/token?scope=repository%3A${USERNAME}%2F${REPO}%3Apull" + MANIFEST_URL="https://ghcr.io/v2/${ENDPOINT}/manifests/${TAG}" + BLOB_URL="https://ghcr.io/v2/${ENDPOINT}/blobs/" + MODE="ghcr" + else + FILENAME=$(echo ${DOCKER_MOD} | sed 's/[:\/]/./g') + ENDPOINT=$(echo ${DOCKER_MOD} | awk -F: '{print $1}') + USERNAME=$(echo ${ENDPOINT} | awk -F/ '{print $1}') + TAG=$(echo ${DOCKER_MOD} | awk -F: '{print $2}') + AUTH_URL="https://auth.docker.io/token?service=registry.docker.io&scope=repository:${ENDPOINT}:pull" + MANIFEST_URL="https://registry-1.docker.io/v2/${ENDPOINT}/manifests/${TAG}" + BLOB_URL="https://registry-1.docker.io/v2/${ENDPOINT}/blobs/" + MODE="dockerhub" + fi # Kill off modification logic if any of the usernames are banned BLACKLIST=$(curl -s https://raw.githubusercontent.com/linuxserver/docker-mods/master/blacklist.txt) IFS=$'\n' @@ -49,20 +93,11 @@ for DOCKER_MOD in "${DOCKER_MODS[@]}"; do "$(curl \ --silent \ --header 'GET' \ - "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${ENDPOINT}:pull" \ + "${AUTH_URL}" \ | awk -F'"' '{print $4}' \ )" # Determine first and only layer of image - SHALAYER=\ -"$(curl \ - --silent \ - --location \ - --request GET \ - --header "Authorization: Bearer ${TOKEN}" \ - https://registry-1.docker.io/v2/${ENDPOINT}/manifests/${TAG} \ - |grep -m1 "blobSum" \ - | awk -F'"' '{print $4}' \ - )" + SHALAYER=$(get_blob_sha "${MODE}" "${TOKEN}" "${MANIFEST_URL}") # Check if we have allready applied this layer if [ -f "/${FILENAME}" ] && [ "${SHALAYER}" == "$(cat /${FILENAME})" ]; then echo "[mod-init] ${DOCKER_MOD} at ${SHALAYER} has been previously applied skipping" @@ -73,7 +108,7 @@ for DOCKER_MOD in "${DOCKER_MODS[@]}"; do --location \ --request GET \ --header "Authorization: Bearer ${TOKEN}" \ - "https://registry-1.docker.io/v2/${ENDPOINT}/blobs/${SHALAYER}" \ + "${BLOB_URL}${SHALAYER}" \ | tar xz -C / echo ${SHALAYER} > "/${FILENAME}" fi -- GitLab