index : releng | |
Archlinux32 release engineering | gitolite user |
summaryrefslogtreecommitdiff |
-rwxr-xr-x | build-torrent | 146 |
diff --git a/build-torrent b/build-torrent new file mode 100755 index 0000000..b3a842d --- /dev/null +++ b/build-torrent @@ -0,0 +1,146 @@ +#!/bin/bash + +# parameters and default values +CONFIG="releng" +ARCH="i686" +DATE=$(date +%Y.%m.%d) +MIRROR_DIR="/srv/http/mirror/mirror.archlinux32.org" +TORRENT_SERVER="archlinux32.org" +TORRENT_USER="hefur" +HEFUR_DIR="/var/lib/hefurd" + +base_dir=$( + readlink -e "${0%/*}" +) + +usage() { + >&2 echo "" + >&2 echo "build-torrent: seed torrents for Archlinux32 ISOs" + >&2 echo "" + >&2 echo "possible options:" + >&2 echo " -h|--help: show this help and exit." + >&2 echo " --arch architecture of the ISO, default is '$ARCH'." + >&2 echo " --date date of the ISO for, default is '$DATE'." + >&2 echo " --mirror-dir where are the ISOs stored on the mirror, default is '$MIRROR_DIR'." + >&2 echo " --torrent-server the name of the server hosting torrents with hefurd, default is '$TORRENT_SERVER'." + >&2 echo " --torrent-user the user hefurd is running as, default is '$TORRENT_USER'." + >&2 echo " --magnet-link retrieve magnet link of an already published torrent." + [ -z "$1" ] && exit 1 || exit "$1" +} + +# fail on first error +set -e + +# cleanup hook +tmp_dir="$(mktemp -d)" +cleanup() { + if [ "${no_cleanup}" = 0 ]; then + if mountpoint -q "${tmp_dir}"; then + sudo umount "${tmp_dir}" + fi + rm -rf --one-file-system "${tmp_dir}" + fi +} +trap cleanup EXIT + +eval set -- "$( + getopt -o h \ + --long help \ + --long arch: \ + --long date: \ + --long mirror-dir: \ + --long torrent-server: \ + --long torrent-user: \ + --long magnet-link \ + -n "$(basename "$0")" -- "$@" || \ + echo usage +)" + +arch="$ARCH" +date="$DATE" +mirror_dir="$MIRROR_DIR" +iso="${iso}" +torrent_server="$TORRENT_SERVER" +torrent_user="$TORRENT_USER" +hefur_dir="$HEFUR_DIR" +magnet_link=0 + +while [ $# -gt 0 ]; do + case "$1" in + '--arch') + shift + arch="$1" + ;; + '--date') + shift + date="$1" + ;; + '--mirror-dir') + shift + mirror_dir="$1" + ;; + '--torrent-server') + shift + torrent_server="$1" + ;; + '--torrent-user') + shift + torrent_user="$1" + ;; + '--magnet-link') + magnet_link=1 + ;; + '--help'|'-h') + usage 0 + ;; + '--') + shift + break + ;; + *) + >&2 printf 'Whoops, option "%s" is not yet implemented!\n' "$1" >&2 + exit 42 + ;; + esac + shift +done + +if [ $# -gt 0 ]; then + >&2 echo 'Too many arguments.' + exit 2 +fi + +archiso_dir="$mirror_dir/archisos" +iso="archlinux32-$date-$arch.iso" + +# retrieve the magnet link (for publishing on the webpage) +if [ $magnet_link = 1 ]; then + magnet_link="$(transmission-show --magnet "$archiso_dir/${iso}.torrent")" + echo "$magnet_link" + exit 0 +fi + +declare -a available_mirrors +mirrorlist="$(cat /etc/pacman.d/mirrorlist32 | grep Server | cut -d '=' -f 2 | sed -e 's/\s//g;s_$arch/$repo_archisos/_')" +available_mirrors=($mirrorlist) + +if [ ! -f "$archiso_dir/${iso}" ] ; then + >&2 echo "'${iso}' not found." + exit 1 +fi + +# create web seed as the list of all mirrors and create the torrent +# file, announce it on the torrent server +function join_by { local IFS="$1"; shift; echo "$*"; } +web_seed="$(join_by ',' "${available_mirrors[@]}")" +torrent_file="${iso}.torrent" + +rm -f "${archiso_dir}/${torrent_file}" +mktorrent --announce=http://${torrent_server}:6969/announce \ + --web-seed="${web_seed}" \ + --output="${archiso_dir}/${torrent_file}" \ + "${archiso_dir}/${iso}" + +scp "${archiso_dir}/${torrent_file}" "${torrent_user}@${torrent_server}:${hefur_dir}" + +exit 0 |