samba36: add hotplug support
authorRosy Song <rosysong@rosinson.com>
Wed, 2 May 2018 02:48:36 +0000 (10:48 +0800)
committerJohn Crispin <john@phrozen.org>
Wed, 2 May 2018 07:18:27 +0000 (09:18 +0200)
Add hotplug handle script for storage devices,
  this will add corresponding option in the
  /etc/config/samba file automatically.

Signed-off-by: Rosy Song <rosysong@rosinson.com>
package/network/services/samba36/Makefile
package/network/services/samba36/files/lib/samba.sh [new file with mode: 0644]
package/network/services/samba36/files/samba.hotplug [new file with mode: 0644]

index 30e26195ffbcf6a6974870d616a7ab9f0090af22..39bfcc6c4f7d2af03fa53d85916decdd0f803b4b 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
+  DEPENDS:=+block-mount
+endef
+
 define Package/samba36-client
   $(call Package/samba/Default)
   TITLE+= client
@@ -159,6 +165,13 @@ define Package/samba36-server/install
        $(LN) samba_multicall $(1)/usr/sbin/smbpasswd
 endef
 
+define Package/samba36-hotplug/install
+       $(INSTALL_DIR) $(1)/lib/samba
+       $(INSTALL_DATA) ./files/lib/samba.sh $(1)/lib/samba/samba.sh
+       $(INSTALL_DIR) $(1)/etc/hotplug.d/block
+       $(INSTALL_DATA) ./files/samba.hotplug $(1)/etc/hotplug.d/block/60-samba
+endef
+
 define Package/samba36-client/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) $(PKG_BUILD_BIN)/smbclient $(1)/usr/sbin
@@ -172,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/lib/samba.sh b/package/network/services/samba36/files/lib/samba.sh
new file mode 100644 (file)
index 0000000..a72a2a1
--- /dev/null
@@ -0,0 +1,89 @@
+#!/bin/sh
+#
+# Copyright (C) 2018 OpenWrt.org
+# Copyright (C) 2018 rosysong@rosinson.com
+#
+
+. /lib/functions.sh
+
+FLAG_DEV_TYPE=
+FLAG_DEV_MOPT=
+FLAG_HAS_SECT=
+
+samba_dev_filter() { # <devname> <[path,/dev/]>
+       case $1 in
+       ${2}mtdblock*|\
+       ${2}ubi*)
+               FLAG_DEV_TYPE="mtd"
+               ;;
+       ${2}loop*|\
+       ${2}mmcblk*|\
+       ${2}sd*|\
+       ${2}hd*|\
+       ${2}md*|\
+       ${2}nvme*|\
+       ${2}vd*|\
+       ${2}xvd*)
+               FLAG_DEV_TYPE="not-mtd"
+               ;;
+       *)
+               [ -b ${2}${1} ] && FLAG_DEV_TYPE="not-mtd"
+               [ -b /dev/mapper/$1 ] && FLAG_DEV_TYPE="not-mtd"
+               ;;
+       esac
+}
+
+samba_cfg_lookup() { # <section> <name>
+       config_get name $1 name
+       [ "$name" = "$2" ] || return
+       FLAG_HAS_SECT=y
+}
+
+samba_cfg_delete() { # <section> <name>
+       config_get name $1 name
+       [ "$name" = "$2" ] || return
+       uci -q delete samba.$1
+}
+
+samba_find_mount_point() { # <devname>
+       # search mount point in /proc/mounts
+       while read l; do
+               local d=$(echo $l | awk '/^\/dev/ {print $1}')
+               [ "$d" = "/dev/$1" ] || continue
+
+               FLAG_DEV_MOPT=$(echo $l | awk '/^\/dev/ {print $2}')
+               break
+       done < /proc/mounts
+}
+
+_samba_add_section() { # <devname> <mount point>
+       uci -q batch <<-EOF
+               add samba sambashare
+               set samba.@sambashare[-1].browseable='yes'
+               set samba.@sambashare[-1].name='$1'
+               set samba.@sambashare[-1].path='$2'
+               set samba.@sambashare[-1].users='root'
+               set samba.@sambashare[-1].read_only='no'
+               set samba.@sambashare[-1].guest_ok='yes'
+               set samba.@sambashare[-1].create_mask='0755'
+               set samba.@sambashare[-1].dir_mask='0755'
+       EOF
+}
+
+samba_add_section() { # <devname> [<mount point>]
+       FLAG_HAS_SECT=
+       FLAG_DEV_MOPT=
+
+       config_foreach samba_cfg_lookup sambashare $1
+       [ -z "$FLAG_HAS_SECT" ] || return
+
+       samba_find_mount_point $1
+       [ -n "$FLAG_DEV_MOPT" ] || return
+
+       [ -n "$2" -a "$2" = "$FLAG_DEV_MOPT" ] || \
+               _samba_add_section $1 $FLAG_DEV_MOPT
+}
+
+samba_delete_section() { # <devname>
+       config_foreach samba_cfg_delete sambashare $1
+}
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..9c6dbe5
--- /dev/null
@@ -0,0 +1,11 @@
+. /lib/samba/samba.sh
+
+samba_dev_filter $DEVNAME
+[ "$FLAG_DEV_TYPE" = "not-mtd" ]  || exit
+
+config_load samba
+case $ACTION in
+       add) samba_add_section $DEVNAME;;
+       remove) samba_delete_section $DEVNAME;;
+esac
+uci commit samba