You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
98 lines
2.6 KiB
3 years ago
|
#!/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%/.}"
|