Files
bpfire/config/extrahd/extrahd.pl
Arne Fitzenreiter 90147c2c33 extrahd: add forgotten udev_event handler to mount partitions via udev
Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
2023-09-28 09:17:46 +00:00

171 lines
4.3 KiB
Bash

#!/bin/bash
###############################################################################
# #
# IPFire.org - A linux based firewall #
# Copyright (C) 2023 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
###############################################################################
log() {
local message="${@}"
logger -t "extrahd" "${message}"
}
extrahd_mount() {
local _mountpoint="${1}"
local device
local filesystem
local mountpoint
local rest
local failed=0
while IFS=';' read -r device filesystem mountpoint rest; do
# Filter by UUID or mountpoint
case "${_mountpoint}" in
UUID=*)
if [ "${device}" != "${_mountpoint}" ]; then
continue
fi
;;
/*)
if [ -n "${_mountpoint}" ] && [ "${mountpoint}" != "${_mountpoint}" ]; then
continue
fi
;;
esac
# Check that the mountpoint starts with a slash
if [ "${mountpoint:0:1}" != "/" ]; then
log "Skipping invalid mountpoint: ${mountpoint}"
continue
fi
# Skip mounting if something is already mounted at the mountpoint
if mountpoint "${mountpoint}" &>/dev/null; then
continue
fi
# Ensure the mountpoint exists
mkdir --parents --mode=777 "${mountpoint}" &>/dev/null
if mount --types "${filesystem}" "${device}" "${mountpoint}"; then
log "Successfully mounted ${device} to ${mountpoint}"
else
log "Could not mount ${device} to ${mountpoint}: $?"
failed=1
fi
done < /var/ipfire/extrahd/devices
return ${failed}
}
extrahd_umount() {
local _mountpoint="${1}"
local device
local filesystem
local mountpoint
local rest
local failed=0
while IFS=';' read -r device filesystem mountpoint rest; do
# Filter by UUID or mountpoint
case "${_mountpoint}" in
UUID=*)
if [ "${device}" != "${_mountpoint}" ]; then
continue
fi
;;
/*)
if [ -n "${_mountpoint}" ] && [ "${mountpoint}" != "${_mountpoint}" ]; then
continue
fi
;;
esac
# Do not try to umount if nothing is mounted
if ! mountpoint "${mountpoint}" &>/dev/null; then
continue
fi
# Umount and try lazy umount if failed
if umount --quiet --recursive "${mountpoint}" || \
umount --quiet --recursive --lazy "${mountpoint}"; then
log "Successfully umounted ${device} from ${mountpoint}"
else
log "Could not umount ${device} from ${mountpoint}: $?"
failed=1
fi
done < /var/ipfire/extrahd/devices
}
handle_udev_event() {
case "${ACTION}" in
add)
if [ -n "${ID_FS_UUID}" ]; then
extrahd_mount "UUID=${ID_FS_UUID}" || return $?
fi
;;
esac
return 0
}
main() {
( echo "$@"; set ) > /tmp/extrahd.$$
local command="${1}"
shift
local rc=0
case "${command}" in
mount)
extrahd_mount "${@}" || rc="${?}"
;;
umount)
extrahd_umount "${@}" || rc="${rc}"
;;
udev-event)
handle_udev_event "${@}" || rc="${rc}"
;;
scanhd)
exec /usr/local/bin/scanhd "${@}"
;;
# No command
"")
echo "${0}: No command given" >&2
rc=2
;;
# Unknown command
*)
echo "${0}: Unsupported command: ${command}" >&2
rc=2
;;
esac
return ${rc}
}
# Call main()
main "${@}" || exit ${?}