#!/bin/sh PREFIX= . "$PREFIX/lib/libalpine.sh" usage() { cat <<-__EOF__ usage: setup-lbu [-hq] [MEDIA] Setup lbu media settings. MEDIA is optional mountpoint under /media options: -h Show this help -q Quietly pick best suggestion. Only prompts user if unsure. __EOF__ exit 1 } get_mnt_line() { local mntpoint="$1" local mnttab="$2" local media=${mntpoint#/media/} local uuid= # replace the device with UUID since the device is in /proc/mounts # and we want the UUID in fstab if [ "${media#UUID}" != "$media" ]; then uuid="$media" fi # we need filter out codepage=... in mount option as it makes # mount fail if its there. awk -v uuid="$uuid" "\$2 == \"$mntpoint\" { if (uuid) \$1 = uuid; gsub(/,codepage=.*,/, \",\", \$4); print \$0; }" "$mnttab" } is_mounted() { test -n "$(get_mnt_line $1 /proc/mounts)" } is_in_fstab() { test -n "$(get_mnt_line $1 /etc/fstab)" } set_media() { local media="${1%/}" # strip trailing / local mnt=/media/$media if [ -d "$media" ] && [ "${media#/media/}" != "$media" ]; then mnt="$media" media=${mnt#/media/} fi if [ "$ROOT" = "/" ] && ! [ -d "$mnt" ]; then echo "$mnt: not a directory" >&2 exit 1 fi # set LBU_MEDIA in /etc/lbu/lbu.conf if [ -f "${ROOT}"etc/lbu/lbu.conf ]; then sed -e "/^\#\?[[:space:]]*LBU_MEDIA=.*/s/.*/LBU_MEDIA=$media/" \ -i "${ROOT}"etc/lbu/lbu.conf if ! egrep -q '^LBU_MEDIA=' "${ROOT}"etc/lbu/lbu.conf; then echo "LBU_MEDIA=$media" >> "${ROOT}"etc/lbu/lbu.conf fi else mkdir -p "${ROOT}"etc/lbu echo "LBU_MEDIA=$media" >> "${ROOT}"etc/lbu/lbu.conf fi if [ -n "$ROOT" ] && [ "$ROOT" != "/" ]; then return fi # append to fstab if its missing if ! is_in_fstab $mnt && is_mounted $mnt; then get_mnt_line "$mnt" /proc/mounts >> /etc/fstab fi # hack in case we have alpine_dev mounted on /media/usbdisk but # lbu is stored on /media/usb # Otherwise we get issues when we do lbu commit. if [ "$media" = "usb" ] && is_mounted /media/usbdisk; then mount --move /media/usbdisk /media/usb elif [ "$media" = "usbdisk" ] && is_mounted /media/usb; then mount --move /media/usb /media/usbdisk fi } while getopts "hq" opt; do case $opt in h) usage;; q) quiet=1;; esac done shift $(($OPTIND - 1)) # check if MEDIA option was given if [ -n "$1" ]; then set_media "$1" exit fi alternatives= suggestion="none" for dir in /media/*; do [ -d "$dir" ] || continue [ "$dir" = "/media/cdrom" ] && continue alternatives="$alternatives, '${dir#/media/}'" if is_mounted $dir; then suggestion=${dir#/media/} [ -n "$quiet" ] && media=$suggestion fi done # strip leading , + space alternatives=${alternatives#, } # if nothing is mounted (or boot from cdrom) usbmnt=$(awk '$1 == "/dev/usbdisk" {print $2}' /proc/mounts) if [ -z "$suggestion" ] && [ -n "$usbmnt" ]; then suggestion=${usbmnt#/media/} if [ -n "$quiet" ] && [ -e /dev/usbdisk ]; then media=$suggestion fi fi while [ -z "$media" ]; do ask "Enter where to store configs ($alternatives or 'none')" "$suggestion" media="$resp" if [ "$media" = "none" ] || [ -d "/media/$media" ]; then break fi echo "/media/$media is not a directory. Please try again." media= done if [ "$media" = "none" ]; then exit 0 fi set_media "$media"