diff options
Diffstat (limited to 'extras')
-rw-r--r-- | extras/hook-scripts/Makefile.am | 2 | ||||
-rwxr-xr-x | extras/hook-scripts/S30samba-set.sh | 107 | ||||
-rwxr-xr-x | extras/hook-scripts/S30samba-start.sh | 73 | ||||
-rwxr-xr-x | extras/hook-scripts/S30samba-stop.sh | 36 |
4 files changed, 176 insertions, 42 deletions
diff --git a/extras/hook-scripts/Makefile.am b/extras/hook-scripts/Makefile.am index 5c6249de707..924c07c9e8b 100644 --- a/extras/hook-scripts/Makefile.am +++ b/extras/hook-scripts/Makefile.am @@ -1 +1 @@ -EXTRA_DIST = S29CTDBsetup.sh S30samba-start.sh S30samba-stop.sh +EXTRA_DIST = S29CTDBsetup.sh S30samba-start.sh S30samba-stop.sh S30samba-set.sh diff --git a/extras/hook-scripts/S30samba-set.sh b/extras/hook-scripts/S30samba-set.sh new file mode 100755 index 00000000000..33ffca3d741 --- /dev/null +++ b/extras/hook-scripts/S30samba-set.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +#Need to be copied to hooks/<HOOKS_VER>/set/post/ + +#TODO: All gluster and samba paths are assumed for fedora like systems. +#Some efforts are required to make it work on other distros. + +#The preferred way of creating a smb share of a gluster volume has changed. +#The old method was to create a fuse mount of the volume and share the mount +#point through samba. +# +#New method eliminates the requirement of fuse mount and changes in fstab. +#glusterfs_vfs plugin for samba makes call to libgfapi to access the volume. +# +#This hook script enables user to enable or disable smb share by volume set +#option. Keys "user.cifs" and "user.smb" both are valid, but user.smb is +#preferred. + + +PROGNAME="Ssamba-set" +OPTSPEC="volname:" +VOL= + +enable_smb="" + +function parse_args () { + ARGS=$(getopt -l $OPTSPEC -o "o" -name $PROGNAME $@) + eval set -- "$ARGS" + + while true; do + case $1 in + --volname) + shift + VOL=$1 + ;; + *) + shift + for pair in $@; do + read key value < <(echo "$pair" | tr "=" " ") + case "$key" in + "user.cifs") + enable_smb=$value + ;; + "user.smb") + enable_smb=$value + ;; + *) + ;; + esac + done + + shift + break + ;; + esac + shift + done +} + +function add_samba_share () { + volname=$1 + STRING="\n[gluster-$volname]\n" + STRING+="comment = For samba share of volume $volname\n" + STRING+="vfs objects = glusterfs\n" + STRING+="glusterfs:volume = $volname\n" + STRING+="path = /\n" + STRING+="read only = no\n" + STRING+="guest ok = yes\n" + printf "$STRING" >> /etc/samba/smb.conf +} + +function sighup_samba () { + pid=`cat /var/run/smbd.pid` + if [ "$pid" != "" ] + then + kill -HUP "$pid"; + else + /etc/init.d/smb start + fi +} + +function del_samba_share () { + volname=$1 + cp /etc/samba/smb.conf /tmp/smb.conf + sed -i "/gluster-$volname/,/^$/d" /tmp/smb.conf &&\ + cp /tmp/smb.conf /etc/samba/smb.conf +} + +function is_volume_started () { + volname=$1 + echo "$(grep status /var/lib/glusterd/vols/"$volname"/info |\ + cut -d"=" -f2)" +} + +parse_args $@ +if [ "0" = $(is_volume_started "$VOL") ]; then + exit 0 +fi + +if [ "$enable_smb" = "enable" ]; then + add_samba_share $VOL + sighup_samba + +elif [ "$enable_smb" = "disable" ]; then + del_samba_share $VOL + sighup_samba +fi diff --git a/extras/hook-scripts/S30samba-start.sh b/extras/hook-scripts/S30samba-start.sh index 75336e6b496..926fe603534 100755 --- a/extras/hook-scripts/S30samba-start.sh +++ b/extras/hook-scripts/S30samba-start.sh @@ -1,12 +1,28 @@ #!/bin/bash + #Need to be copied to hooks/<HOOKS_VER>/start/post +#TODO: All gluster and samba paths are assumed for fedora like systems. +#Some efforts are required to make it work on other distros. + +#The preferred way of creating a smb share of a gluster volume has changed. +#The old method was to create a fuse mount of the volume and share the mount +#point through samba. +# +#New method eliminates the requirement of fuse mount and changes in fstab. +#glusterfs_vfs plugin for samba makes call to libgfapi to access the volume. +# +#This hook script automagically creates shares for volume on every volume start +#event by adding the entries in smb.conf file and sending SIGHUP to samba. +# +#In smb.conf: +#glusterfs vfs plugin has to be specified as required vfs object. +#Path value is relative to the root of gluster volume;"/" signifies complete +#volume. + PROGNAME="Ssamba-start" -OPTSPEC="volname:,mnt:" +OPTSPEC="volname:" VOL= -#FIXME: glusterd hook interface will eventually provide mntpt prefix as -# command line arg -MNT_PRE="/mnt/samba" function parse_args () { ARGS=$(getopt -l $OPTSPEC -name $PROGNAME $@) @@ -18,10 +34,6 @@ function parse_args () { shift VOL=$1 ;; - --mnt) - shift - MNT_PRE=$1 - ;; *) shift break @@ -31,32 +43,47 @@ function parse_args () { done } -function add_samba_export () { - volname=$1 - mnt_pre=$2 - mkdir -p $mnt_pre/$volname && \ - printf "\n[gluster-$volname]\ncomment=For samba export of volume $volname\npath=$mnt_pre/$volname\nread only=no\nguest ok=yes\n" >> /etc/samba/smb.conf -} - -function mount_volume () { +function add_samba_share () { volname=$1 - mnt_pre=$2 - #Mount shouldn't block on glusterd to fetch volfile, hence the 'bg' - mount -t glusterfs `hostname`:$volname $mnt_pre/$volname & + STRING="\n[gluster-$volname]\n" + STRING+="comment = For samba share of volume $volname\n" + STRING+="vfs objects = glusterfs\n" + STRING+="glusterfs:volume = $volname\n" + STRING+="path = /\n" + STRING+="read only = no\n" + STRING+="guest ok = yes\n" + printf "$STRING" >> /etc/samba/smb.conf } function sighup_samba () { pid=`cat /var/run/smbd.pid` - if [ $pid != "" ] + if [ "$pid" != "" ] then - kill -HUP $pid; + kill -HUP "$pid"; else /etc/init.d/smb condrestart fi } +function get_smb () { + volname=$1 + uservalue= + + usercifsvalue=$(grep user.cifs /var/lib/glusterd/vols/"$volname"/info |\ + cut -d"=" -f2) + usersmbvalue=$(grep user.smb /var/lib/glusterd/vols/"$volname"/info |\ + cut -d"=" -f2) + + if [[ $usercifsvalue = "disable" || $usersmbvalue = "disable" ]]; then + uservalue="disable" + fi + echo "$uservalue" +} parse_args $@ -add_samba_export $VOL $MNT_PRE -mount_volume $VOL $MNT_PRE +if [ $(get_smb "$VOL") = "disable" ]; then + exit 0 +fi + +add_samba_share $VOL sighup_samba diff --git a/extras/hook-scripts/S30samba-stop.sh b/extras/hook-scripts/S30samba-stop.sh index 7e05c2111aa..def87e00ed2 100755 --- a/extras/hook-scripts/S30samba-stop.sh +++ b/extras/hook-scripts/S30samba-stop.sh @@ -1,11 +1,23 @@ #! /bin/bash -#Need to be copied to hooks/<HOOKS_VER>/stop/post + +#Need to be copied to hooks/<HOOKS_VER>/stop/pre + +#TODO: All gluster and samba paths are assumed for fedora like systems. +#Some efforts are required to make it work on other distros. + +#The preferred way of creating a smb share of a gluster volume has changed. +#The old method was to create a fuse mount of the volume and share the mount +#point through samba. +# +#New method eliminates the requirement of fuse mount and changes in fstab. +#glusterfs_vfs plugin for samba makes call to libgfapi to access the volume. +# +#This hook script automagically removes shares for volume on every volume stop +#event by removing the volume related entries(if any) in smb.conf file. PROGNAME="Ssamba-stop" -OPTSPEC="volname:,mnt:" +OPTSPEC="volname:" VOL= -#FIXME: gluster will eventually pass mnt prefix as command line argument -MNT_PRE="/mnt/samba" function parse_args () { ARGS=$(getopt -l $OPTSPEC -name $PROGNAME $@) @@ -17,11 +29,6 @@ function parse_args () { shift VOL=$1 ;; - --mnt) - shift - MNT_PRE=$1 - echo $1 - ;; *) shift break @@ -31,19 +38,13 @@ function parse_args () { done } -function del_samba_export () { +function del_samba_share () { volname=$1 cp /etc/samba/smb.conf /tmp/smb.conf sed -i "/gluster-$volname/,/^$/d" /tmp/smb.conf &&\ cp /tmp/smb.conf /etc/samba/smb.conf } -function umount_volume () { - volname=$1 - mnt_pre=$2 - umount -l $mnt_pre/$volname -} - function sighup_samba () { pid=`cat /var/run/smbd.pid` if [ $pid != "" ] @@ -55,6 +56,5 @@ function sighup_samba () { } parse_args $@ -del_samba_export $VOL -umount_volume $VOL $MNT_PRE +del_samba_share $VOL sighup_samba |