openbsd-mirrors.sh 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/env bash
  2. # Retrieves OpenBSD official mirrors, ranks them based on speed
  3. # License: CC0
  4. MIRROR_HTML='/tmp/openbsd-mirrors.html'
  5. TESTFILE="/doc/obsd-faq.txt"
  6. TIMEOUT=10
  7. BYTES=300000 # 300KB
  8. if [ ! -f "$MIRROR_HTML" ]; then
  9. curl -L -o "$MIRROR_HTML" 'https://www.openbsd.org/ftp.html' && echo "== Downloaded mirrors html to: $MIRROR_HTML"
  10. else
  11. echo "== Found previously downloaded mirrors html: $MIRROR_HTML"
  12. fi
  13. echo '== Checking HTTP(s) and FTP mirror speeds...'
  14. echo '== This may take a long time...'
  15. MIRRORS="$(sed -ne 's|.*href=\"\(.*:\/\/.*\/pub/OpenBSD\).*|\1|p' "$MIRROR_HTML")"
  16. # rsync mirrors - not yet supported
  17. #MIRRORS+="
  18. #$(sed -ne 's|.*\(rsync:\/\/.*\/\).*|\1|p' "$MIRROR_HTML")"
  19. MIRROR_TIME=''
  20. MIRROR_TOTAL=$(echo "$MIRRORS" | wc -l | awk '{print $1}')
  21. declare -i MIRROR_COUNT
  22. for MIRROR in $MIRRORS
  23. do
  24. MIRROR_COUNT+=1
  25. time=$(curl -r 0-$BYTES --max-time $TIMEOUT --fail --silent --output /dev/null --write-out %{time_total} ${MIRROR}${TESTFILE})
  26. if [ $? -eq 0 ]; then
  27. echo -n " [${MIRROR_COUNT}/${MIRROR_TOTAL}] ${MIRROR} = ${time}" $'\r'
  28. MIRROR_TIME+="
  29. ${MIRROR} = ${time}"
  30. else
  31. echo -n " [${MIRROR_COUNT}/${MIRROR_TOTAL}] ${MIRROR} = [FAIL]" $'\r'
  32. fi
  33. done
  34. echo -n "-- Finished testing --" $'\r'
  35. echo '== Here are the about 10 fastest mirrors:'
  36. echo "$MIRROR_TIME" | sort -n -k 3 | head -n 10
  37. echo ''
  38. echo '== You can use these in /etc/installurl or use in PKG_PATH env var:'
  39. echo ' $ export PKG_PATH=ftp://your.ftp.mirror/pub/OpenBSD/`uname -r`/packages/`machine -a`/'