118 lines
2.7 KiB
Bash
Executable File
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
|