#!/bin/bash set -e mirror_dir='/mnt/archlinux32' website_dir='/usr/src/archlinux32/archweb32' usage() { >&2 echo '' >&2 echo 'get-package-updates: check for packages that need to be built,' >&2 echo ' and build a list in the proper build order' >&2 echo '' >&2 echo 'possible options:' >&2 echo ' -h|--help: Show this help and exit.' >&2 echo ' --magnet-i686 $link:' >&2 echo ' Set archiso-i686 magnet link to $link.' >&2 echo ' --magnet-dual $link:' >&2 echo ' Set archiso-dual magnet link to $link.' >&2 echo ' --torrent-seed-i686 $link:' >&2 echo ' Set archiso-i686 torrent link to $link.' >&2 echo ' --torrent-seed-dual $link:' >&2 echo ' Set archiso-dual torrent link to $link.' >&2 echo ' --website-dir $dir:' >&2 echo ' Set website-dir to $dir.' >&2 echo ' --mirror-dir $dir:' >&2 echo ' Set mirror-dir to $dir.' >&2 echo ' --update-iso:' >&2 echo ' Update information about iso, too.' [ -z "$1" ] && exit 1 || exit "$1" } eval set -- "$( getopt -o h \ --long help \ --long magnet-i686: \ --long magnet-dual: \ --long torrent-seed-i686: \ --long torrent-seed-dual: \ --long mirror-dir: \ --long website-dir: \ --long update-iso \ -n "$(basename "$0")" -- "$@" || \ echo usage )" tmp_dir="$(mktemp -d)" cleanup() { if mountpoint -q "${tmp_dir}"; then sudo umount "${tmp_dir}" fi rm -rf --one-file-system "${tmp_dir}" } trap cleanup EXIT while [ $# -gt 0 ]; do case "$1" in '--magnet-i686') if [ -s "${tmp_dir}/magnet.i686" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi shift echo "$1" | \ tr -d '\n' > \ "${tmp_dir}/magnet.i686" ;; '--magnet-dual') if [ -s "${tmp_dir}/magnet.dual" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi shift echo "$1" | \ tr -d '\n' > \ "${tmp_dir}/magnet.dual" ;; '--torrent-seed-i686') if [ -s "${tmp_dir}/torrent-seed.i686" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi shift echo "$1" | \ tr -d '\n' > \ "${tmp_dir}/torrent-seed.i686" ;; '--torrent-seed-dual') if [ -s "${tmp_dir}/torrent-seed.dual" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi shift echo "$1" | \ tr -d '\n' > \ "${tmp_dir}/torrent-seed.dual" ;; '--mirror-dir') if [ -s "${tmp_dir}/mirror_dir.set" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi shift mirror_dir="$1" echo "$mirror_dir" > "${tmp_dir}/mirror_dir.set" ;; '--website-dir') if [ -s "${tmp_dir}/website_dir.set" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi shift website_dir="$1" echo "$website_dir" > "${tmp_dir}/website_dir.set" ;; '--update-iso') if [ -s "${tmp_dir}/update_iso.set" ]; then printf 'Option %s given multiple times.\n' "$1" usage fi echo "true" > "${tmp_dir}/update_iso.set" ;; '--help'|'-h') usage 0 ;; '--') shift break ;; *) >&2 printf 'Whoops, option "%s" is not yet implemented!\n' "$1" exit 42 ;; esac shift done if [ $# -gt 0 ]; then >&2 echo 'Too many arguments.' exit 2 fi ( printf '
\n' curl -Ss 'https://archlinux32.org/mirrorlist/?country=all&hash='"$( head -c 24 /dev/urandom | \ base64 -w0 )" | \ sed ' 0,/^$/d /^$/d /^## /{ s|^## |\n \n\n
| s|$|
\n\n \n\n' printf '
\n' ) | \ sed -i ' :emptyLines /^\n*$/{ N bemptyLines } /^\(\s*\n\)*\s*
$/{ :a s|^.*
|| tb $!N ba :b r /dev/stdin } ' "${website_dir}/download/index.html" latest_iso_date="$( ls "${mirror_dir}/archisos" | \ grep '^archlinux-[0-9.]\+-\(dual\|i.86\)\.iso$' | \ sed 's@^archlinux-\([0-9.]\+\)-\(dual\|i.86\)\.iso$@\1@' | \ sort -k1,1 -u | \ tail -n1 )" declare -A desc desc['i686']='i686 only' desc['dual']='dual bootable' for arch in "${!desc[@]}"; do if [ ! -s "${tmp_dir}/magnet.${arch}" ]; then continue fi if ! tr '&' '\n' < \ "${tmp_dir}/magnet.${arch}" | \ grep -qxF "dn=archlinux-${latest_iso_date}-${arch}.iso"; then >&2 printf 'Magnet link for %s is not for %s, skipping.\n' "${arch}" "archlinux-${latest_iso_date}-${arch}.iso" continue fi sed -i ' /
  • Magnet link for \S\+ ('"${desc["${arch}"]}"')/ s/>Magnet link for \S\+ />Magnet link for '"${latest_iso_date}"' / ' "${website_dir}/download/index.html" done for arch in "${!desc[@]}"; do if [ ! -s "${tmp_dir}/torrent-seed.${arch}" ]; then continue fi if ! grep -qF "archlinux-${latest_iso_date}-${arch}" "${tmp_dir}/torrent-seed.${arch}"; then >&2 printf 'Torrent seed for %s is not for %s, skipping.\n' "${arch}" "archlinux-${latest_iso_date}-${arch}.iso" continue fi sed -i ' /
  • Torrent for \S\+ ('"${desc["${arch}"]}"')/ s/>Torrent for \S\+ />Torrent for '"${latest_iso_date}"' / ' "${website_dir}/download/index.html" done if [ ! -s "${tmp_dir}/update_iso.set" ]; then exit fi unset kernels unset sizes declare -A sizes declare -A md5 declare -A sha512 for arch in "${!desc[@]}"; do iso="${mirror_dir}/archisos/archlinux-${latest_iso_date}-${arch}.iso" if [ ! -f "${iso}" ]; then >&2 echo "Can't find iso to arch ${arch}." exit 1 fi sudo mount -o loop,ro "${iso}" "${tmp_dir}" kernels="$( printf '%s\n' ${kernels} $( find "${tmp_dir}/arch" \ -maxdepth 1 \ -name 'pkglist.*.txt' \ -not -name 'pkglist.x86_64.txt' \ -execdir cat {} \; \ | sed ' s/^linux\s\+\([^-]\+-[^-]\+\)$/\1/ t d ' ) | \ sort -u )" sudo umount "${tmp_dir}" sizes["${arch}"]="$( printf 'scale=1; %s/1024/1024\n' "$(stat -c'%s' "${iso}")" | \ bc )" md5["${arch}"]="$( grep "\s${iso##*/}\$" "${mirror_dir}/archisos/md5sums" | \ awk '{print $1}' )" sha512["${arch}"]="$( grep "\s${iso##*/}\$" "${mirror_dir}/archisos/sha512sums" | \ awk '{print $1}' )" sign_keys="$( printf '%s\n' ${sign_keys} $( gpg --status-fd=1 --verify "${iso}.sig" "${iso}" 2> /dev/null | \ grep '^\[GNUPG:] VALIDSIG [0-9A-F]\+ ' | \ cut -d' ' -f3 ) | \ sort -u )" done if [ $(echo "${kernels}" | grep -c '\S') -ne 1 ]; then >&2 echo 'Not exactly one kernel on the iso:' >&2 echo "${kernels}" exit 1 fi if [ $(echo "${sign_keys}" | grep -c '\S') -ne 1 ]; then >&2 echo 'Not exactly one key used for signing the iso:' >&2 echo "'${sign_keys}'" exit 1 fi if [ "${sign_keys}" != 'F2955C3B63EE4E421F30670A3B08EFC6BA974CFC' ] && [ "${sign_keys}" != '248BF41F9BDD61D41D060AE774EDA3C6B06D0506' ] && [ "${sign_keys}" != 'DE9F7688CACF04FEB81A6C590AEEC90755DA7B5A' ]; then >&2 echo "Unknown signing key '${sign_keys}'." exit 1 fi values=( 'Current Release' "${latest_iso_date}" 'Included Kernel' "${kernels}" 'PGP Key' ''"${sign_keys}"'' ) for arch in 'i686' 'dual'; do values+=( "ISO Size (${desc["${arch}"]})" "${sizes["${arch}"]} MB" "MD5 (${desc["${arch}"]})" "${md5["${arch}"]}" "SHA512 (${desc["${arch}"]})" "${sha512["${arch}"]}" ) done sed -i "$( printf '/%s:/s|.*
  • | %s|\n' "${values[@]}" printf '/archlinux-[0-9.]\+-%s\.iso\.sig/s@archlinux-[0-9.]\+-%s\.iso\.sig@archlinux-%s-%s.iso.sig@\n' \ 'i686' 'i686' "${latest_iso_date}" 'i686' \ 'dual' 'dual' "${latest_iso_date}" 'dual' ) " \ "${website_dir}/download/index.html"