[CentOS] proper recipe for local mirror

Thu Mar 4 15:01:19 UTC 2021
Simon Matter <simon.matter at invoca.ch>

> Hi! What is the proper solution for a local mirror for centos 7 (or oven
> 8) repositories?
>
> trying with rsync, while the packages are downloaded but the repodata is
> not and is actually impossible to be used by clients. while i try to

Hi,

The script below is how I sync CentOS to a local mirror which is then used
directly by the clients, no createrepo needed.

Please note that the exclude list is something to adjust to your needs to
save space and traffic. Also the $MIRRORS list should be changed to use
best mirrors for your situation.

Hope this helps,
Simon

---%<---
#!/bin/bash

RELEASES="{7,8}"
MIRRORS="rsync://mirrors.kernel.org rsync://mirror.xxxxxxx.xxx"
TOUT=60

LOCALDIR=$(readlink -f $(dirname $0))
MODULE=${LOCALDIR##*/}
RETVAL=1

# find a usable mirror
echo "list of mirrors \`${MIRRORS}'"
for TESTURL in $MIRRORS; do
  echo "testing mirror \`${TESTURL}/${MODULE}'"
  if rsync -qn ${TESTURL}/${MODULE}/ .; then
    # this mirror _should_ work ...
    echo "using mirror \`${TESTURL}/${MODULE}'"
    RSYNCURLS=$(eval echo ${TESTURL}/${MODULE}/RPM-GPG-KEY-CentOS-\*
${TESTURL}/${MODULE}/${RELEASES})
    echo "syncing \`${RSYNCURLS}'"
    # ... but it can still fail here
    if rsync -rtv --timeout=$TOUT --copy-links --delete --delete-excluded
--progress --no-motd \
      --exclude "aarch*/" \
      --exclude "alpha/" \
      --exclude "ia64/" \
      --exclude "ppc*/" \
      --exclude "s390*/" \
      --exclude "SRPMS/" \
      --exclude "debug/" \
      --exclude "*~" \
      --exclude ".*info" \
      --exclude "kickstart/" \
      --exclude "?/apt/" \
      --exclude "?/atomic/" \
      --exclude "?/build/" \
      --exclude "?/cloud/" \
      --exclude "?/docs/" \
      --exclude "?/dotnet/" \
      --exclude "?/isos/" \
      --exclude "?/nfv/" \
      --exclude "?/opstools/" \
      --exclude "?/os/" \
      --exclude "?/paas/" \
      --exclude "?/rt/" \
      --exclude "?/virt/" \
      "$@" $RSYNCURLS ${LOCALDIR}/
    then
      RETVAL=0
      break
    else
      echo "mirror \`${TESTURL}/${MODULE}' failed"
      RETVAL=1
    fi
  fi
done

exit $RETVAL
---%<---