public-image-mirror/hack/diff.sh

77 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
source "$(dirname "${BASH_SOURCE}")/helper.sh"
cd "${ROOT}"
DEBUG="${DEBUG:-}"
INCREMENTAL="${INCREMENTAL:-}"
QUICKLY="${QUICKLY:-}"
SYNC="${SYNC:-}"
PARALLET="${PARALLET:-0}"
PARALLET_JOBS="${PARALLET_JOBS:-4}"
EXCLUDE="$(helper::exclude)"
declare -A DOMAIN_MAP=()
function wait_jobs() {
local job_num=${1:-3}
local perc=$(jobs -p | wc -l)
while [ "${perc}" -gt "${job_num}" ]; do
sleep 1
perc=$(jobs -p | wc -l)
done
}
function sync_with_domain() {
local domain="${1}"
local list=$(echo ${DOMAIN_MAP[${domain}]} | tr ' ' '\n' | shuf)
for image in ${list}; do
regex="${DEFAULT_REGEX}"
if [[ "${image#*/}" =~ ":" ]]; then
regex="${image##*:}"
image="${image%:*}"
fi
local to="$(helper::replace_domain "${domain}/${image}")"
local logfile="${to//\//_}_sync.log"
echo >"${logfile}"
DEBUG="${DEBUG}" SYNC="${SYNC}" QUICKLY="${QUICKLY}" INCREMENTAL="${INCREMENTAL}" PARALLET="${PARALLET}" FOCUS="${regex}" SKIP="${EXCLUDE}" ./hack/diff-image.sh "${domain}/${image}" "${to}" 2>&1 | tee -a "${logfile}" || {
echo "Error: diff image ${domain}/${image} $(helper::replace_domain "${domain}/${image}")"
}
done
}
function main() {
for image in $(helper::get_source); do
key="${image%%/*}"
val="${image#*/}"
if [[ -v "DOMAIN_MAP[${key}]" ]]; then
DOMAIN_MAP["${key}"]+=" ${val}"
else
DOMAIN_MAP["${key}"]="${val}"
fi
done
for domain in "${!DOMAIN_MAP[@]}"; do
if [[ "${PARALLET_JOBS}" -eq 0 ]]; then
sync_with_domain "${domain}"
else
wait_jobs "${PARALLET_JOBS}"
sync_with_domain "${domain}" &
fi
done
wait
}
trap "trap - SIGTERM && kill 0 && echo exit..." SIGTERM SIGINT
main