freebsd-ports/Tools/portbuild/scripts/clean-chroot
Mark Linimon ecc847e0d6 Generalize the packge building scripts to be able to be run on more than
one 'head' node, rather than just pointyhat itself.

Constants are factored out into installation-specific files known as
portbuild/conf/server.conf and portbuild/conf/client.conf.  There is
only one server.conf file.  Individual <arch> directories may have
their own client.conf files, or may symlink to ../conf/client.conf.

While here, rework the code a bit to parameterize arch-specific tasks.

Feature safe:	yes
2010-06-25 23:04:53 +00:00

123 lines
3.1 KiB
Bash
Executable file

#!/bin/sh
# $FreeBSD$
# client-side script to clean up a chroot
kill_procs()
{
dir=$1
mount=$2
pids="XXX"
while [ ! -z "${pids}" ]; do
pids=$(fstat -f "${dir}${mount}" | tail +2 | awk '{print $3}' | sort -u)
if [ ! -z "${pids}" ]; then
echo "Killing off pids in ${dir}"
ps -p $pids
kill -KILL ${pids} 2> /dev/null
sleep 2
fi
done
}
cleanup_mount() {
chroot=$1
mount=$2
if [ -d ${chroot}${mount} ]; then
mdir=$(fstat -f ${chroot}${mount} | head -2 | tail -1 | awk '{print $5}')
if [ "${mdir}" = "MOUNT" ]; then
umount -f ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} on $(hostname) failed!"
fi
if [ "${mdir}" = "${chroot}${mount}" ]; then
kill_procs ${chroot} ${mount}
umount -f ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} on $(hostname) failed!"
fi
fi
}
arch=$1
branch=$2
buildid=$3
chroot=$4
clean=$5
pb=/var/portbuild
. ${pb}/${arch}/client.conf
. ${pb}/${arch}/portbuild.conf
. ${pb}/${arch}/portbuild.$(hostname)
# directories to clean
cleandirs="${LOCALBASE} /compat /var/db/pkg"
if [ ! -d "${chroot}" ]; then
exit 0
fi
if [ `realpath ${chroot}` = "/" ]; then
# Don't spam the root file system if something has gone wrong!
exit 1
fi
if [ -f ${chroot}/tmp/jail.id ]; then
pgrep -lfj `awk '{print $1}' ${chroot}/tmp/jail.id`
pkill -j `awk '{print $1}' ${chroot}/tmp/jail.id`
fi
#umount ${chroot}/proc
for i in ${ARCHS_REQUIRING_LINPROCFS}; do
if [ ${i} = ${arch} ]; then
cleanup_mount ${chroot} /compat/linux/proc
break
fi
done
for i in /a/ports /usr/src /dev /root/.ccache; do
cleanup_mount ${chroot} ${i}
done
if [ "${use_zfs}" = "1" ]; then
cleanup_mount ${chroot} ""
zfs destroy -f ${chroot#/}
elif [ "${use_tmpfs}" = "1" -a "${clean}" = "2" ]; then
cleanup_mount ${chroot} ""
if ! rm -rf ${chroot} >/dev/null 2>&1; then
chflags -R noschg ${chroot} >/dev/null 2>&1
rm -rf ${chroot} >/dev/null 2>&1
fi
# XXX possible race from cleanup and claim by next build?
elif [ "${use_md_swap}" = "1" -a \( "${md_persistent}" != "1" -a "${clean}" -gt "0" \) -o "${clean}" = "2" ]; then
cleanup_mount ${chroot} /used > /dev/null 2>&1
cleanup_mount ${chroot} ""
mdconfig -d -u $(basename ${chroot})
if ! rm -rf ${chroot} >/dev/null 2>&1; then
chflags -R noschg ${chroot} >/dev/null 2>&1
rm -rf ${chroot} >/dev/null 2>&1
fi
else
if [ "${clean}" = 1 ]; then
rm -rf ${chroot}/tmp/*
for dir in ${cleandirs}; do
if ! rm -rf ${chroot}${dir} >/dev/null 2>&1; then
chflags -R noschg ${chroot}${dir} >/dev/null 2>&1
rm -rf ${chroot}${dir} >/dev/null 2>&1
fi
done
test -x ${chroot}/sbin/ldconfig && chroot ${chroot} /sbin/ldconfig -R
for i in ${ARCHS_REQUIRING_AOUT_COMPAT}; do
if [ ${i} = ${arch} ]; then
test -x ${chroot}/sbin/ldconfig && chroot ${chroot} /sbin/ldconfig -aout -R
break
fi
done
rm -rf ${chroot}/var/db/pkg/*
rm -rf ${chroot}/used
elif [ "${clean}" = 2 ]; then
if ! rm -rf ${chroot} >/dev/null 2>&1; then
chflags -R noschg ${chroot} >/dev/null 2>&1
rm -rf ${chroot} >/dev/null 2>&1
fi
fi
fi