summaryrefslogtreecommitdiff
path: root/setup-apkcache.in
diff options
context:
space:
mode:
Diffstat (limited to 'setup-apkcache.in')
-rw-r--r--setup-apkcache.in117
1 files changed, 117 insertions, 0 deletions
diff --git a/setup-apkcache.in b/setup-apkcache.in
new file mode 100644
index 0000000..89147a3
--- /dev/null
+++ b/setup-apkcache.in
@@ -0,0 +1,117 @@
+#!/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$"
+}
+
+# figure out mount point
+find_mount_point() {
+ local dir="$1"
+ while ! [ -d "$dir" ]; do
+ dir=${dir%/*}
+ done
+ local fs_id=$(stat -f -c %i "$dir")
+ local parent="${dir%/*}"
+ while [ -n "$parent" ] && [ "$(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
+}
+
+while getopts "h" opt; do
+ case $opt in
+ h) usage;;
+ esac
+done
+shift $(( $OPTIND - 1 ))
+
+# try auto detetect what we suggest
+suggestion=
+if [ -L /etc/apk/cache ]; then
+ suggestion=$(readlink $suggestion)
+
+if [ -z "$suggestion" ] && [ -f /etc/lbu/lbu.conf ]; then
+ . /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" ]; then
+ suggestion=none
+fi
+cachedir=$1
+
+while [ -z "$cachedir" ]; do
+ echo -n "Where would you like to store apk cache? (or none) [$suggestion] "
+ default_read cachedir $suggestion
+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 /etc/apk/cache ]; then
+ rm -f /etc/apk/cache
+fi
+ln -s $cachedir /etc/apk/cache
+
+case "$cleanup" in
+ umount) umount $mount;;
+ remount) mount -o remount,ro $mount;;
+esac
+