#bass 

Обновление meta4ra, всякие зеркала

Недавно снова (3a1f5e5f8e1280737b635fd50e3a30e501963a7f) занялся
причёсыванием Metalink4 distfiles файлов в BASS. С несколькими проектами
уже случалась недоступность их сайтов. Почти везде где можно надобавлял
ссылок на зеркала. Проекты размещённые на GitHub -- чаще всего не имеют.
У многих есть копия на distcache.FreeBSD.org.

Пока всё это делал, но в один день сильно сбоила работа ftpmirror.gnu.org:
то доступен только HTTP, то только HTTPS, то никто. Тогда как ftp.gnu.org
(основной источник) работал.

Не раз видел, что только HTTP или только HTTPS версии работают. Тоже,
значит, нужно делать две отдельных ссылки. Случайно увидел, что goredo
пакет сделали "deprecated" в Homebrew: мотивировали тем, что он не
доступен по HTTP. Более дебильной причины я ещё не слышал (в контексте
скачивания tarball-ов которые и так аутентифицируются напротив
криптографического хэша). Но, что ожидать от людей macOS экосистемы?
Тогда как в большинстве ресурсов, где есть зеркала, официальные ссылки
ведут только на HTTP, в котором перенаправления на HTTPS почти не идёт.
Проверяя всякие ссылки, поражаюсь скорости работы HTTP: уже просто отвык
от того, насколько быстро, оказывается, может сделаться запрос curl-ом.
С HTTPS это всегда визуально заметное ожидание завершение TLS рукопожатия.

Крайне прискорбна ситуация с засильем CDN. Недавно писал про то, что
CPAN отключил (7cdca15225bce66467cc6aa00c26521af31013e7) свою сеть
зеркал. Действительно, на тот момент rsync не работал. Позже включили,
но официально список зеркал не держат. GNOME перестал. cURL. Python/PyPI
давным давно. PostgreSQL. Ruby.

Теперь у них одна точка отказа, уменьшение доступности. Частенько это
Fastly -- который поддерживает санкции и его сайты в РФ выдают 403.
Пока сами файлы они у нас отдают, но это в любой момент ими может быть
отключено. Я не против CDN, но против убирания зеркал, которые
расположены на совсем других доменах.

В итоге BASS-овские .meta4 содержат например такое:

    <url priority="1">https://sourceforge.net/projects/boost/files/boost/1.86.0/boost_1_86_0.tar.bz2/download</url>
    <url priority="2">https://archives.boost.io/release/1.86.0/source/boost_1_86_0.tar.bz2</url>
    <url priority="20">http://distcache.FreeBSD.org/ports-distfiles/boost_1_86_0.tar.bz2</url>
    <url priority="21" location="eu">http://distcache.eu.FreeBSD.org/ports-distfiles/boost_1_86_0.tar.bz2</url>
    <url priority="21" location="us">http://distcache.us-east.FreeBSD.org/ports-distfiles/boost_1_86_0.tar.bz2</url>
    <url priority="21" location="us">http://distcache.us-west.FreeBSD.org/ports-distfiles/boost_1_86_0.tar.bz2</url>

или

    <url priority="1">https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2</url>
    <url priority="2" location="dk">http://mirrors.dotsrc.org/postgresql/source/v11.22/postgresql-11.22.tar.bz2</url>
    <url priority="2" location="uk">http://mirrorservice.org/sites/ftp.postgresql.org/source/v11.22/postgresql-11.22.tar.bz2</url>
    <url priority="3" location="dk">https://mirrors.dotsrc.org/postgresql/source/v11.22/postgresql-11.22.tar.bz2</url>
    <url priority="3" location="uk">https://mirrorservice.org/sites/ftp.postgresql.org/source/v11.22/postgresql-11.22.tar.bz2</url>
    <url priority="20">http://distcache.FreeBSD.org/ports-distfiles/postgresql/postgresql-11.22.tar.bz2</url>
    <url priority="21" location="eu">http://distcache.eu.FreeBSD.org/ports-distfiles/postgresql/postgresql-11.22.tar.bz2</url>
    <url priority="21" location="us">http://distcache.us-east.FreeBSD.org/ports-distfiles/postgresql/postgresql-11.22.tar.bz2</url>
    <url priority="21" location="us">http://distcache.us-west.FreeBSD.org/ports-distfiles/postgresql/postgresql-11.22.tar.bz2</url>

CDN-ы идут первыми, далее зеркала, с указанием расположения. HTTP идут
отдельной группой приоритетом выше. distcache.FreeBSD в качестве
запасного плана. GNU софт:

    <url priority="1">http://ftpmirror.gnu.org/m4/m4-1.4.19.tar.xz</url>
    <url priority="2">https://ftpmirror.gnu.org/m4/m4-1.4.19.tar.xz</url>
    <url priority="3" location="at">http://mirror.easyname.at/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="3" location="at">http://mirror.kumi.systems/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="3" location="br">http://gnu.c3sl.ufpr.br/ftp/m4/m4-1.4.19.tar.xz</url>
    [...]
    <url priority="4" location="at">https://mirror.easyname.at/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="4" location="at">https://mirror.kumi.systems/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="4" location="za">https://mirror.ufs.ac.za/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="5" location="us">http://ftp.gnu.org/pub/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="6" location="us">https://ftp.gnu.org/pub/gnu/m4/m4-1.4.19.tar.xz</url>
    <url priority="20">http://distcache.FreeBSD.org/ports-distfiles/m4-1.4.19.tar.xz</url>
    [...]

Балансировщик ftpmirror как точка входа, с HTTP приоритетом. Далее уже
зеркала, тоже разделённые на HTTP/HTTP, потом fallback до ftp.gnu.org.

less проект заявлял о том, что есть копии на ftp.gnu.org. Но не было
последних. Написал ему -- появились.

Увидел, что зеркало для NNCP недоступно на практике ни с одного
компьютера/VPS. .meta4 ещё могут просочиться, но tarball-ы уже нет.
Потому что расположен в OVH SAS в Канаде. Написал его владельцу, но пока
ответа не получил. Вижу, что там файлы не обновлялись, как минимум,
неделю -- или он не по cron запускается или и по SSH нет связи. Видимо,
исчезнет это зеркало.

Но нужно же как-то использовать весь этот функционал метаданных.
Доработал meta4ra. Во-первых появилась meta4ra-list утилита:
    meta4ra-list .meta4
выдаст список файлов Metalink4 файла.
    meta4ra-list .meta4 -size fn
выдаст размер указанного файла.
    meta4ra-list .meta4 fn
выдаст список URL указанного файла. Причём в таком формате:
    1||http://mirror.planetunix.net/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    1||http://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    1||http://openbsd.as250.net/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    2||https://mirror.planetunix.net/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    2||https://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    2||https://openbsd.as250.net/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    3|at|http://ftp2.eu.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
    3|au|http://mirror.aarnet.edu.au/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
где есть приоритет и местоположение. В этом же формате умеет принимать
данные и meta4ra-create утилита. Тут уже sed-ом можно бы было убрать
какие-нибудь множества ссылок.
    meta4ra-list .meta4 fn | meta4ra-url-sort
сортирует ссылки по приоритетам. Опционально аргументами можно указать и
сортировку по местоположениям.
    | meta4ra-url-sort ru "de fr" c:eu c:na "" rand
сначала поместит Россию в начало, дальше одинаковым приоритетом Германию
и Финляндию, далее оставшиеся европейские страны, далее североамериканские,
потом ссылки без указанного location (по сути это CDN всегда), а оставшееся
перемешать. В конце всегда делается сортировка по приоритетам: то есть,
сортировка по странам будет идти внутри групп-приоритетов.

Ну а дальше можно сделать цикл по отсортированным ссылкам и вызывать
meta4ra-dl утилиту, которая ничего не делает, кроме как скачивает по
HTTP(S). Чем лучше cURL? Ничем, просто встроенным в единый бинарник
функционалом, что полезно для bootstrap-а BASS.

    size=$(meta4ra-list -size $meta4 $fn)
    meta4ra-list $meta4 $fn |
    meta4ra-url-sort ${META4RA_CC_SORT:-"" rand} |
    while read url ; do
        echo "trying ${url}..." >&2
        meta4ra-dl -progress -size $size "$url" |
        meta4ra-check -pipe $meta4 $fn >$fn || {
            rm $fn
            continue
        }
        break
    done
    [ -s $fn ]

    [оставить комментарий]