Files

121 lines
3.4 KiB
Bash

#!/bin/sh
. /lib/functions.sh
. /lib/functions/service.sh
global=0
config_file="/etc/config/samba4"
# 若 Samba 服务本身未开机自启,则无需处理
/etc/init.d/samba4 enabled 2>/dev/null || exit 0
chk_en() {
config_get_bool autoshare "$1" autoshare 1
[ "$autoshare" -eq 0 ] && exit 0
}
config_load samba4
config_foreach chk_en samba4
wait_for_init() {
# 1. 开机引导期等待 procd 就绪
for _ in $(seq 30); do
[ -e /tmp/procd.done ] && break
sleep 1
done
# 2. 确认 samba4 实例已注入 procd
for _ in $(seq 30); do
if ubus call service list '{"name":"samba4"}' 2>/dev/null | grep -q "samba4"; then
sleep 1
return 0
fi
sleep 1
done
}
smb_handle() {
local path
config_get path "$1" path
[ -z "$path" ] && return
case "$path" in
"$2" | "$2"/*) global=1 ;;
esac
case "$2" in
"$path" | "$path"/*) global=1 ;;
esac
}
device="${DEVPATH##*/}"
case "$ACTION" in
add)
case "$device" in
sd*|md*|hd*|mmcblk*|nvme*) ;;
*) return 0 ;;
esac
path="/dev/$device"
wait_for_init
grep -v '/boot\|/opt' /proc/mounts | while read -r j; do
str="${j%% *}"
if [ "$str" = "$path" ]; then
strr="${j#* }"
target="${strr%% *}"
global=0
config_load samba4
config_foreach smb_handle sambashare "$target"
# 提取共享名:优先提取 /mnt/ 后的目录名,异常情况下取末级路径名
name="${target#*/mnt/}"
name="${name#/}"
[ -z "$name" ] || [ "$name" = "$target" ] && name="${target##*/}"
if [ "$global" -eq 0 ]; then
printf "\n\nconfig sambashare\n" >> "$config_file"
printf "\toption auto '1'\n" >> "$config_file"
printf "\toption name '%s'\n" "$name" >> "$config_file"
printf "\toption path '%s'\n" "$target" >> "$config_file"
printf "\toption read_only 'no'\n" >> "$config_file"
printf "\toption guest_ok 'yes'\n" >> "$config_file"
printf "\toption create_mask '0666'\n" >> "$config_file"
printf "\toption dir_mask '0777'\n" >> "$config_file"
printf "\toption device '%s'\n" "$device" >> "$config_file"
printf "\toption force_root '1'\n" >> "$config_file"
printf "\toption inherit_owner 'yes'\n" >> "$config_file"
/etc/init.d/samba4 reload
return 0
fi
fi
done
;;
remove)
changed=0
i=0
while true; do
if ! uci -q get "samba4.@sambashare[$i]" >/dev/null; then
break
fi
dev=$(uci -q get "samba4.@sambashare[$i].device")
auto=$(uci -q get "samba4.@sambashare[$i].auto")
if [ "$dev" = "$device" ] && [ "$auto" = "1" ]; then
uci -q delete "samba4.@sambashare[$i]"
changed=1
# 删除当前节点后后续元素索引前移,保持 i 不变继续扫描
continue
fi
i=$((i + 1))
done
if [ "$changed" -eq 1 ]; then
uci commit samba4
/etc/init.d/samba4 reload
fi
;;
esac