commit 8f09cfff84a8e7ee24a622bb32f99b4af5d58f52 Author: Arnaud Ysmal Date: Sat Nov 9 17:46:25 2019 +0100 Initial import diff --git a/freebsd-sets-update.sh b/freebsd-sets-update.sh new file mode 100644 index 0000000..dbdc8c6 --- /dev/null +++ b/freebsd-sets-update.sh @@ -0,0 +1,186 @@ +#!/bin/sh + +set -e + +if [ "$(id -u)" != "0" ]; then + echo "Must be root." >&2 + exit 1 +fi + +WORKDIR="/var/cache/freebsd-sets-update" +ARCH=$(uname -p) +BRANCH="head" +REVISION="latest_tested" +SETS="base kernel" + +URL= +DO_DEBUG= +DO_LOCAL= +DO_ETCUPDATE= + +usage() +{ + echo "Usage: $0 [-b branch] [-l localdir] [-r revision] [-dev]" + echo " -b: branch (head, stable-11 or stable-12)" + echo " -d: add debug sets" + echo " -e: execute etcupdate" + echo " -l: directory where sets are located" + echo " -r: try to find sets for this revision" + echo " -v: show executed commands" +} + +while getopts b:del:r:v OPT; do + case ${OPT} in + b) + BRANCH=${OPTARG} + ;; + d) + DO_DEBUG="1" + SETS="${SETS} base-dbg kernel-dbg" + ;; + e) + DO_ETCUPDATE="1" + ;; + l) + DO_LOCAL="1" + WORKDIR=${OPTARG} + ;; + r) + REVISION=${OPTARG} + ;; + v) + set -x + ;; + *) + usage + exit 1 + ;; + esac +done + +shift $((${OPTIND} - 1)) + +if [ -n "${*}" ]; then + echo "Arguments are not supported" >&2 + exit 1 +fi + + +get_url() +{ + echo "http://artifacts.ci.freebsd.org/snapshot/${BRANCH}/${1}/${ARCH}/${ARCH}" +} + +exit_msg() +{ + if [ -n "${1}" ]; then + echo "${1}" + fi + exit 1 +} + +fetch_sets() +{ + url=$(get_url $REVISION) + fetch -o ${WORKDIR}/MANIFEST ${url}/MANIFEST + for set in $SETS; do + fetch -o ${WORKDIR}/${set}.txz ${url}/${set}.txz + done +} + +install_kernel() +{ + echo -n "Installing ${REVISION} kernel.txz..." + + if ! mkdir -p /boot/kernel /boot/kernel.old /usr/lib/debug/boot/kernel /usr/lib/debug/boot/kernel.old; then + exit_msg " failed, mkdir error ${?}" + fi + + if ! rm -r /boot/kernel.old /usr/lib/debug/boot/kernel.old; then + exit_msg " failed, rm error ${?}" + fi + + if ! mv /boot/kernel /boot/kernel.old; then + exit_msg " failed, mv error ${?}" + fi + + if ! mv /usr/lib/debug/boot/kernel /usr/lib/debug/boot/kernel.old; then + exit_msg " failed, mv error ${?}" + fi + if ! tar -C / -xpf ${WORKDIR}/kernel.txz; then + exit_msg " failed, tar error ${?}" + fi + + if [ -n "${DO_DEBUG}" ]; then + echo -n " and kernel-dbg.txz..." + if ! tar -C / -xpf ${WORKDIR}/kernel-dbg.txz; then + exit_msg " failed, tar error ${?}" + fi + fi + + if ! kldxref /boot/kernel; then + exit_msg " failed, kldxref error ${?}" + fi + + echo " done" +} + +install_base() +{ + NOSCHGDIRS="/bin /sbin /lib /libexec /usr/bin /usr/sbin /usr/lib /var/empty" + + echo -n "Installing ${REVISION} base.txz..." + + if ! mkdir -p ${NOSCHGDIRS}; then + exit_msg " failed, mkdir error ${?}" + fi + + if ! chflags -R noschg ${NOSCHGDIRS}; then + exit_msg " failed, chflags error ${?}" + fi + + if ! tar -C / -xpf ${WORKDIR}/base.txz --exclude="^etc" ; then + exit_msg " failed, tar error ${?}" + fi + if [ -n "$DO_ETCUPDATE" ]; then + if ! mkdir ${WORKDIR}/etc; then + exit_msg " failed, mkdir error ${?}" + fi + if ! tar -C ${WORKDIR}/etc --include "^etc" -xpf ${WORKDIR}/base.txz; then + exit_msg " failed, tar error ${?}" + fi + if ! tar -C ${WORKDIR}/etc -cJf ${WORKDIR}/etc.txz .; then + exit_msg " failed, tar error ${?}" + fi + if ! etcupdate -I "/[^e][^t][^c]*" -t ${WORKDIR}/etc.txz ; then + exit_msg " failed, etcupdate error ${?}" + fi + fi + if [ -n "${DO_DEBUG}" ]; then + echo -n " and base-dbg.txz..." + if ! tar -C / -xpf ${WORKDIR}/base-dbg.txz; then + exit_msg " failed, tar error ${?}" + fi + fi + + echo " done" +} + +if [ -z "$DO_LOCAL" ]; then + REVISION=$(fetch -o - -q "$(get_url ${REVISION})/revision.txt") + WORKDIR="${WORKDIR}/${REVISION}" + if uname -v | grep -q "${REVISION}" ; then + exit_msg "Already at version ${REVISION}" + fi + if [ ! -d "${WORKDIR}" ]; then + if ! mkdir -p ${WORKDIR}; then + exit_msg " failed, mkdir error ${?}" + fi + fetch_sets + fi +fi + +install_kernel +install_base + +echo "Upgrade done"