mirror of
https://github.com/zerotier/edge.git
synced 2026-05-22 16:25:05 -07:00
168 lines
3.1 KiB
Bash
Executable File
168 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
PREFIX=
|
|
|
|
. "$PREFIX/lib/libalpine.sh"
|
|
|
|
usage() {
|
|
cat <<-__EOF__
|
|
usage: setup-apkcache [-h] [DIR]
|
|
|
|
Setup apk caching.
|
|
|
|
If DIR is not specified user will be asked for location.
|
|
|
|
options:
|
|
-h Show this help
|
|
__EOF__
|
|
exit 1
|
|
}
|
|
|
|
is_mounted() {
|
|
awk '{print $2}' /proc/mounts | grep -q "^$1$"
|
|
}
|
|
|
|
find_fstab_mount_point() {
|
|
local dir="$1"
|
|
local res=
|
|
if ! [ -r "${ROOT}"etc/fstab ]; then
|
|
return
|
|
fi
|
|
while [ -n "$dir" ]; do
|
|
res=$(awk "\$2 == \"$dir\" {print \$2}" "${ROOT}"etc/fstab)
|
|
if [ -n "$res" ]; then
|
|
echo $res
|
|
return
|
|
fi
|
|
dir=${dir%/*}
|
|
done
|
|
}
|
|
|
|
# figure out mount point
|
|
find_mount_point() {
|
|
local dir=$(find_fstab_mount_point $1)
|
|
if [ -d "$dir" ] && [ "$dir" != "/" ]; then
|
|
echo $dir
|
|
return
|
|
fi
|
|
|
|
local dir="$1"
|
|
while [ -n "$dir" ] && ! [ -d "$dir" ]; do
|
|
dir=${dir%/*}
|
|
done
|
|
local fs_id=$(stat -f -c %i "${dir:-/}")
|
|
local parent="${dir%/*}"
|
|
while [ -n "$dir" ] && [ "$(stat -f -c %i $parent/)" = "$fs_id" ]; do
|
|
dir=$parent
|
|
parent=${parent%/*}
|
|
done
|
|
[ -z "$dir" ] && dir=/
|
|
echo $dir
|
|
}
|
|
|
|
get_mount_opts() {
|
|
local mnt="$1"
|
|
awk "\$2 == \"$mnt\" {gsub(/,/, \" \", \$4); print \$4}" /proc/mounts
|
|
}
|
|
|
|
is_mounted_ro() {
|
|
local mnt="$1"
|
|
local opts=$(get_mount_opts $mnt)
|
|
local opt=
|
|
for opt in $opts; do
|
|
if [ "$opt" = "ro" ]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# get the fstype of the given mount point
|
|
mount_fstype() {
|
|
# we only want the last mount in case there are several
|
|
awk -v mnt="$1" '$2 == "/" {fstype = mnt} END {print fstype}' \
|
|
/proc/mounts
|
|
}
|
|
|
|
apk_cache_help() {
|
|
cat <<-__EOF__
|
|
|
|
Packages installed from network can be cached locally to be available during
|
|
boot, before the network is started. Specifying a directory here will make apk
|
|
cache the packages locally in this directory.
|
|
|
|
Enter 'none' if you do not want to cache packages from network.
|
|
|
|
__EOF__
|
|
}
|
|
|
|
while getopts "h" opt; do
|
|
case $opt in
|
|
h) usage;;
|
|
esac
|
|
done
|
|
shift $(( $OPTIND - 1 ))
|
|
|
|
# try auto detetect what we suggest
|
|
suggestion=
|
|
if [ -L "${ROOT}"etc/apk/cache ]; then
|
|
suggestion=$(readlink "${ROOT}"etc/apk/cache)
|
|
fi
|
|
|
|
if [ -z "$suggestion" ] && [ -f "${ROOT}"etc/lbu/lbu.conf ]; then
|
|
. "${ROOT}"etc/lbu/lbu.conf
|
|
if [ -n "$LBU_MEDIA" ]; then
|
|
suggestion=/media/$LBU_MEDIA/cache
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$suggestion" ] && [ -L /dev/usbdisk ]; then
|
|
suggestion=/media/usb/cache
|
|
fi
|
|
|
|
if [ -z "$suggestion" ] && [ "$(mount_fstype /)" != "tmpfs" ]; then
|
|
suggestion=/var/cache/apk
|
|
fi
|
|
|
|
if [ -z "$suggestion" ]; then
|
|
suggestion=none
|
|
fi
|
|
cachedir=$1
|
|
|
|
while [ -z "$cachedir" ]; do
|
|
echo -n "Enter apk cache directory (or '?' or 'none') [$suggestion]: "
|
|
default_read cachedir $suggestion
|
|
if [ "$cachedir" = "?" ]; then
|
|
apk_cache_help
|
|
cachedir=
|
|
fi
|
|
done
|
|
|
|
if [ "$cachedir" = "none" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
mount=$(find_mount_point $cachedir)
|
|
|
|
cleanup=
|
|
|
|
if ! is_mounted $mount; then
|
|
mount $mount || exit 1
|
|
cleanup="umount"
|
|
elif is_mounted_ro $mount; then
|
|
mount -o remount,rw $mount || exit 1
|
|
cleanup="remount"
|
|
fi
|
|
|
|
mkdir -p $cachedir
|
|
if [ -L "${ROOT}"etc/apk/cache ]; then
|
|
rm -f "${ROOT}"etc/apk/cache
|
|
fi
|
|
mkdir -p "${ROOT}"etc/apk
|
|
ln -s $cachedir "${ROOT}"etc/apk/cache
|
|
|
|
case "$cleanup" in
|
|
umount) umount $mount;;
|
|
remount) mount -o remount,ro $mount;;
|
|
esac
|