ksmbd-tools: add package with hotplug.d script for auto sharing
authorRafał Miłecki <rafal@milecki.pl>
Wed, 10 Aug 2022 12:23:44 +0000 (14:23 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Sat, 10 Sep 2022 14:04:37 +0000 (16:04 +0200)
One of common use cases for SMB3 server in routers is sharing hotplugged
drives. Users make many attempts setting that up which often are not
optimal.

This script handles it in the cleanest way by using:
1. hotplug.d mount subsystem
2. runtime config in the /var/run/config/

It provides a working basic solution that can be later adjusted by
modifying provided hotplug script.

A pretty much idential solution was part of the samba36 package. It was
added in the OpenWrt commit ef1efa756e0d0 ("samba36: add package with
hotplug.d script for auto sharing") as an answer for feature required by
the Rosinson company.

Cc: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit d0406d4c956e92f979802640832180eedd1a6efe)

net/ksmbd-tools/Makefile
net/ksmbd-tools/files/ksmbd.hotplug [new file with mode: 0644]

index a6e56331e200715fcf259e0417f28a627fba6ce6..618971dafc9483b977d778724df29b67667e6976 100644 (file)
@@ -89,6 +89,12 @@ define Package/ksmbd-avahi-service/description
   Ksmbd (smb/445) Daemon service via mDNS/DNS-SD.
 endef
 
+define Package/ksmbd-hotplug
+  $(call Package/ksmbd-tools/Default)
+  TITLE+= hotplug script for auto sharing
+  DEPENDS:=+blockd
+endef
+
 CONFIGURE_ARGS += \
        --disable-shared \
        --enable-static
diff --git a/net/ksmbd-tools/files/ksmbd.hotplug b/net/ksmbd-tools/files/ksmbd.hotplug
new file mode 100644 (file)
index 0000000..114bfa9
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+device_get_vars() {
+       json_init
+       json_load "$(ubus call block info)"
+
+       json_select devices || return 1
+
+       json_get_keys keys
+       for key in $keys
+       do
+               json_select $key
+
+               json_get_var device device
+               [ "$device" = "$1" ] && {
+                       shift
+                       json_get_vars $@
+                       json_select ..
+                       json_select ..
+                       return 0
+               }
+
+               json_select ..
+       done
+
+       json_select ..
+
+       return 2
+}
+
+[ -f /var/run/config/ksmbd ] || {
+       mkdir -p /var/run/config && touch /var/run/config/ksmbd
+}
+
+[ "$ACTION" = "add" ] && {
+       device_get_vars $DEVICE label mount || {
+               logger -t ksmbd-hotplug "Failed to get $DEVICE info"
+               exit 1
+       }
+       [ -n "$mount" ] && {
+               uci -c /var/run/config batch <<-EOF
+                       set ksmbd.$DEVICE="share"
+                       set ksmbd.$DEVICE.name="${label:-$DEVICE}"
+                       set ksmbd.$DEVICE.path="$mount"
+                       set ksmbd.$DEVICE.browseable="yes"
+                       set ksmbd.$DEVICE.read_only="yes"
+                       set ksmbd.$DEVICE.guest_ok="yes"
+                       commit ksmbd
+               EOF
+               /etc/init.d/ksmbd reload
+       }
+}
+
+[ "$ACTION" = "remove" ] && {
+       uci -c /var/run/config batch <<-EOF
+               delete ksmbd.$DEVICE
+               commit ksmbd
+       EOF
+       /etc/init.d/ksmbd reload
+}