mkimage-profiles/bin/mktmpdir
Michael Shigorin b3caf70fa9 mktmpdir: refer to docs
Manual BUILDDIR specification isn't exactly obvious
from this script (aiming to derive it automatically),
so at least point those interested at QUICKSTART
they might have long forgotten already or, gasp,
not even started reading.
2016-12-26 15:56:46 +03:00

98 lines
2.6 KiB
Bash
Executable File

#!/bin/sh
# analyze free space, preferring tmpfs over really many gigaz
# and taking into account configured hasher workdir prefices
# NB: use BUILDDIR to override autodetection (see ../QUICKSTART)
# hope there aren't spaces in RM's $HOME are they?
DIRS="$TMP $TMPDIR $HOME/hasher /tmp /var/tmp .."
MINSIZE=262144 # face control criterion
# mkimage needs /proc among those, be clear about that
check_allowed_mountpoints()
{
grep -wqs "^allowed_mountpoints=[^#]*/proc" \
/etc/hasher-priv/system \
`/usr/libexec/hasher-priv/getconf.sh`
}
# poor man's SourceIfExists()
try_source() { [ -f "$1" ] && . "$1"; }
# hasher accepted ones
get_prefices()
{
try_source /etc/hasher-priv/system || exit 1
try_source `/usr/libexec/hasher-priv/getconf.sh`
echo "$prefix" | tr ':' '\n' | while read i; do realpath "$i"; done
}
# drop candidates that hasher won't handle anyways
# NB: doesn't take --number into account,
# prefix lists are defined by the primary configuration
contemplate_dirs()
{
for d in "$@"; do
D="`realpath "$d"`";
for p in `get_prefices`; do
[ "${D#$p}" = "$D" ] || echo "$D";
done;
done \
| uniq # _not_ sort -u
}
# hasher emits no meaningful errors regarding those, sigh
check_options()
{
! egrep -q "^$1 $2 .*no(dev|exec)" /proc/mounts
}
# pick existing, writeable, >256M free space dirs
# rank them wrt type: tmpfs > realfs > rootfs
choose_tmpdir() {
for i in "$@"; do
[ -d "$i" -a -w "$i" ] || continue
echo -n "$i "
df -PT "$i" | tail -1
done \
| sort -unk5 \
| while read dir dev fstype size used free percent mnt; do
check_options "$dev" "$mnt" || continue
[ "$free" -gt "$MINSIZE" ] || continue
[ "$fstype" = "tmpfs" ] && { echo "2 $dir $free"; continue; }
[ "$mnt" = "/" ] && { echo "0 $dir $free"; continue; }
echo "1 $dir $free"
done \
| sort -n \
| tail -1 \
| cut -f2 -d' '
}
# bringing it all together
if ! check_allowed_mountpoints; then
echo "error: hasher's allowed_mountpoints do not include /proc;"
echo "please check hasher docs and /etc/hasher-priv/system"
exit 1
fi >&2
TMPDIRS="`contemplate_dirs $DIRS`"
if [ -z "$TMPDIRS" ]; then
echo "error: no suitable directories found;"
echo "please check QUICKSTART, filesystem and hasher setup"
echo "(mount enough tmpfs into /tmp or fix hasher-priv prefix?)"
exit 1
fi >&2
TEMP="`choose_tmpdir $TMPDIRS`"
if [ -z "$TEMP" ]; then
echo "error: no suitable directories found;"
echo "please check hasher docs and filesystem setup"
echo "(nodev and/or noexec on an otherwise suitable filesystem?)"
exit 1
fi >&2
DIR="$TEMP/`dirname "$1"`"
NAME="`basename "${1:-tmpdir}"`"
mkdir -p "$DIR" # in case $1 contains slash(es)
mktemp -d "$NAME.XXXXXXX" --tmpdir="${DIR%/.}"