samba36: add package with hotplug.d script for auto sharing
authorRafał Miłecki <rafal@milecki.pl>
Wed, 26 Dec 2018 09:51:28 +0000 (10:51 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Thu, 10 Jan 2019 09:33:40 +0000 (10:33 +0100)
The new samba36-hotplug package provides a hotplug.d script for the
"mount" subsystem. It automatically shares every mounted block device.

It works by updating /var/run/config/samba file which:
1) Is read by procd init script
2) Gets wiped on reboot providing a consistent state
3) Can be safely updated without flash wearing or conflicting with user
   changes being made in /etc/config/samba

Cc: Rosy Song <rosysong@rosinson.com>
Cc: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
package/network/services/samba36/Makefile
package/network/services/samba36/files/samba.hotplug [new file with mode: 0644]

index b63c2ea..a08b51b 100644 (file)
@@ -43,6 +43,12 @@ define Package/samba36-server
   DEPENDS:=+USE_GLIBC:librt $(ICONV_DEPENDS)
 endef
 
+define Package/samba36-hotplug
+  $(call Package/samba/Default)
+  TITLE+= hotplug script for auto sharing
+  DEPENDS:=+blockd
+endef
+
 define Package/samba36-client
   $(call Package/samba/Default)
   TITLE+= client
@@ -161,6 +167,11 @@ define Package/samba36-server/install
        $(LN) samba_multicall $(1)/usr/sbin/smbpasswd
 endef
 
+define Package/samba36-hotplug/install
+       $(INSTALL_DIR) $(1)/etc/hotplug.d/mount
+       $(INSTALL_CONF) ./files/samba.hotplug $(1)/etc/hotplug.d/mount/60-samba
+endef
+
 define Package/samba36-client/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) $(PKG_BUILD_BIN)/smbclient $(1)/usr/sbin
@@ -174,5 +185,6 @@ endef
 
 $(eval $(call BuildPackage,samba36-client))
 $(eval $(call BuildPackage,samba36-server))
+$(eval $(call BuildPackage,samba36-hotplug))
 $(eval $(call BuildPackage,samba36-net))
 
diff --git a/package/network/services/samba36/files/samba.hotplug b/package/network/services/samba36/files/samba.hotplug
new file mode 100644 (file)
index 0000000..e1ae64e
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+device_get_vars() {
+       json_init
+       json_load "$(ubus call block info)"
+
+       json_select devices
+
+       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 ..
+                       break
+               }
+
+               json_select ..
+       done
+
+       json_select ..
+}
+
+[ -f /var/run/config/samba ] || {
+       mkdir -p /var/run/config && touch /var/run/config/samba
+}
+
+[ "$ACTION" = "add" ] && {
+       device_get_vars $DEVICE label mount
+       [ -n "$mount" ] && {
+               uci -c /var/run/config batch <<-EOF
+                       set samba.$DEVICE="sambashare"
+                       set samba.$DEVICE.name="$label"
+                       set samba.$DEVICE.path="$mount"
+                       set samba.$DEVICE.browseable="yes"
+                       set samba.$DEVICE.read_only="yes"
+                       set samba.$DEVICE.guest_ok="yes"
+                       commit samba
+               EOF
+               /etc/init.d/samba reload
+       }
+}
+
+[ "$ACTION" = "remove" ] && {
+       uci -c /var/run/config batch <<-EOF
+               delete samba.$DEVICE
+               commit samba
+       EOF
+       /etc/init.d/samba reload
+}