Packages/istoreos-files/files/usr/libexec/blockmount.sh
2025-02-16 22:20:56 +08:00

118 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
DETECT=0
if [ -z "$ACTION" ]; then
log() {
echo "$*" >&2
}
else
log() {
logger -t "blockmount" "$*"
}
fi
# uci_section UUID LABEL DEVICE MOUNTPOINT
check_mount() {
local uuid
local label
local device
local target
config_get uuid $1 uuid
config_get label $1 label
config_get device $1 device
config_get target $1 target
if [ "$DEVICE_CONFIGURED" = "0" -a \( "$uuid" = "$2" -o "$device" = "$4" -o "$target" = "$5" -o \( -n "$3" -a "$3" = "$label" \) \) ]; then
export -n DEVICE_CONFIGURED=1
[ -z "$ACTION" ] && log "found $1 ($uuid, $label, $device, $target) matches ($2, $3, $4, $5)"
fi
}
# UUID LABEL DEVICE MOUNTPOINT
check_configured() {
local DEVICE_CONFIGURED=0
config_foreach check_mount mount "$1" "$2" "$3" "$4"
return $DEVICE_CONFIGURED
}
handle_part() {
[ -z "$ACTION" ] && log "$1 UUID=$UUID TYPE=$TYPE LABEL=$LABEL MOUNT=$MOUNT"
[ -n "$1" ] || return 1
# ignore mounted device, unknown fs type, swap or raid member
[ -z "$UUID" -o -z "$TYPE" \
-o "$TYPE" = "swap" \
-o "$TYPE" = "linux_raid_member" \
] && return 0
if [ "$DETECT" = "1" ]; then
[ -z "$MOUNT" ] && return 0
# in this case, only add mounted device: boot,root,overlayfs, and disable them
log "add mount $UUID => $MOUNT"
uci -q batch <<-EOF >/dev/null
add fstab mount
set fstab.@mount[-1].uuid=$UUID
set fstab.@mount[-1].target=$MOUNT
set fstab.@mount[-1].enabled=0
EOF
elif [ -z "$MOUNT" ]; then
local DEVICENAME="${1#/dev/}"
local candidate="`/usr/libexec/blockphy.sh "$DEVICENAME"`"
[ -z "$candidate" ] && return 0
candidate="/mnt/$candidate"
# check if candidate mount point is busy
mountpoint -q "$candidate" && return 0
# check if configured
check_configured "$UUID" "$LABEL" "$1" "$candidate" || return 0
# log "add mount $UUID => $candidate"
mkdir -p "$candidate" && mount "$1" "$candidate"
fi
}
scan_all() {
local line
local dev
if [ "$DETECT" = "0" -a -n "$DEVNAME" ]; then
dev="/dev/$DEVNAME"
fi
block info $dev | while read; do
line="$REPLY"
eval "${line##*: } handle_part ${line%%: *}"
done
}
if [ "$1" = "detect" ]; then
DETECT=1
cat <<-EOF >/etc/config/fstab
config global
option anon_swap '0'
option anon_mount '0'
option port_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
EOF
fi
. /lib/functions.sh
config_load fstab
scan_all
if [ "$DETECT" = "1" ]; then
uci -q batch <<-EOF >/dev/null
set fstab.@global[0].port_mount=1
commit fstab
EOF
fi