This change implements a full suite of networked tix package management, with support for installation, upgrading, uninstallation; with signed release metadata and support for incompatible changes across releases. Add tix(8) package management program with common subcommands. Add tix-upgrade(8) that upgrades installations via the network. Add tix-autoupgrade(8) daemon for unattended upgrades and offer to enable it during sysinstall(8). Add tix-clean(8) for cleaning temporary and cached tix files. Add tix-collection(8) features and metadata for signing and upgrading. Add tix-fetch(8) that downloads files from releases and channels and verifies the signatures. Add tix-metabuild(8) support for release metadata and signing. Add tix-release(8) that creates releases and channels, and signs their information or publication. Add tix-uninstall(8) for uninstalling packages. Add installtest --network-upgrade test for whether network upgrades work. Move metadata from upgrade.conf(5) to collection.conf(5). Document all the tix package management programs. Promote the libssl, signify, wget, and xz packages to the minimal set, so minimal installations are able to install more packages.
119 lines
3.2 KiB
Bash
Executable file
119 lines
3.2 KiB
Bash
Executable file
#!/bin/sh
|
|
# Copyright (c) 2023, 2024 Jonas 'Sortie' Termansen.
|
|
#
|
|
# Permission to use, copy, modify, and distribute this software for any
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
# copyright notice and this permission notice appear in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
#
|
|
# tix-repository
|
|
# Generate repository metadata.
|
|
|
|
set -e
|
|
|
|
generation=3
|
|
|
|
unset command
|
|
unset directory
|
|
|
|
operand=1
|
|
dashdash=
|
|
previous_option=
|
|
for argument do
|
|
if [ -n "$previous_option" ]; then
|
|
eval $previous_option=\$argument
|
|
previous_option=
|
|
continue
|
|
fi
|
|
|
|
case $argument in
|
|
*=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
|
|
*=) parameter= ;;
|
|
*) parameter=yes ;;
|
|
esac
|
|
|
|
case $dashdash$argument in
|
|
--) dashdash=yes ;;
|
|
--generation=*) generation=$parameter ;;
|
|
--generation) previous_option=generation ;;
|
|
-*) echo "$0: unrecognized option $argument" >&2
|
|
exit 1 ;;
|
|
*)
|
|
if [ $operand = 1 ]; then
|
|
command="$argument"
|
|
operand=2
|
|
elif [ $operand = 2 ]; then
|
|
directory="$argument"
|
|
operand=3
|
|
else
|
|
echo "$0: unexpected extra operand $argument" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -n "$previous_option" ]; then
|
|
echo "$0: option '$argument' requires an argument" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$command" ]; then
|
|
echo "$0: error: No command was specified" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$directory" ]; then
|
|
echo "$0: error: No directory was specified" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$generation" != 3 ]; then
|
|
echo "$0: error: --generation=$generation is not supported by this version" >&2
|
|
exit 1
|
|
fi
|
|
|
|
case "$command" in
|
|
metadata)
|
|
cd "$directory"
|
|
|
|
ls |
|
|
grep -E '\.tix.tar.xz$' |
|
|
grep -Eo '^[^.]*' |
|
|
LC_ALL=C sort -o packages.list
|
|
|
|
true > dependencies.list
|
|
true > renames.list
|
|
true > manifest.list
|
|
true > sets.list
|
|
|
|
for package in $(cat packages.list); do
|
|
tar -xOf "$package.tix.tar.xz" "tix/tixinfo/$package" > "$package.info"
|
|
tar -xOf "$package.tix.tar.xz" "tix/manifest/$package" > "$package.manifest"
|
|
sha256sum "$package.tix.tar.xz" > "$package.tix.tar.xz.sha256sum"
|
|
tix-vars -d '' "$package.info" RENAMES | tr , '\n' | sed -E '/^$/d' >> renames.list
|
|
(printf "%s: " "$package" && tix-vars -d '' "$package.info" RUNTIME_DEPS | sed -E 's/ +$//') >> dependencies.list
|
|
sed -E "s/$/:$package/" "$package.manifest" >> manifest.list
|
|
if [ "$(tix-vars -d false "$package.info" IS_SET)" = true ]; then
|
|
echo "$package" >> sets.list
|
|
fi
|
|
done
|
|
|
|
LC_ALL=C sort -t: -k1,1 manifest.list -o manifest.list
|
|
|
|
find -type f '!' -name 'sha256sum' '!' -name '*.sha256sum' -exec sha256sum '{}' '+' |
|
|
sed -E 's, \./, ,' |
|
|
LC_ALL=C sort -k 2 > sha256sum
|
|
|
|
;;
|
|
*)
|
|
echo "$0: error: unknown command: $command" >&2
|
|
exit 1
|
|
esac
|