#!/bin/bash set -eE -o pipefail shopt -s extglob globstar nullglob source "$(librelib messages)" setup_traps # usage: fetch_dbs fetch_dbs() { rsync --no-motd -mrtLH --no-p \ --include="*/" \ --include="*.db" \ --exclude="*" \ --delete-after \ "$1" "$2" } list_found() { local ret=0 local dbfile repo re arch tag while read -r -d '' dbfile; do repo=${dbfile##*/} repo=${repo%.db} re=$(repo=$repo arch='(.*)' envsubst '$repo $arch' <<<"$ARCHPATH") arch=$(sed -rn "s,^$re\$,\1,p" <<<"${dbfile%/*}") if [[ -z $arch ]]; then error 'Could not figure out architecture for %q' "$dbfile" ret=1 continue fi printf '%s\n' "$repo-$arch" done < <(find "$WORKDIR" -name '*.db' -printf '%P\0') | sort -u return $ret } list_configured() { printf '%s\n' "${ARCHTAGS[@]}" | sort -u } main() { if [[ $# -ne 0 ]] || [[ -z "$DBSCRIPTS_CONFIG" ]] || ! grep -q ARCHMIRROR -- "$DBSCRIPTS_CONFIG"; then msg 'usage: DBSCRIPTS_CONFIG=/path/to/file %s' "${0##*/}" exit $EXIT_INVALIDARGUMENT fi local config_file config_file="$(dirname "$(readlink -e "$0")")/config" source "$config_file" WORKDIR=$(mktemp -dt "${0##*/}.XXXXXXXXXX") readonly WORKDIR trap "rm -rf -- ${WORKDIR@Q}" EXIT fetch_dbs "${ARCHMIRROR}/" "$WORKDIR" y="${GREEN}✓${ALL_OFF}" n="${RED}✗${ALL_OFF}" while IFS='' read -r line; do case "$line" in $'\t\t'*) rmt=$y cfg=$y val=${line#$'\t\t'} ;; $'\t'*) rmt=$n cfg=$y val=${line#$'\t'} ;; *) rmt=$y cfg=$n val=$line ;; esac printf '%s:%s:%s\n' "$val" "$rmt" "$cfg" done < <(comm <(list_found) <(list_configured)) | column -t -s: } main "$@"