diff options
Diffstat (limited to 'extras')
27 files changed, 986 insertions, 61 deletions
diff --git a/extras/LinuxRPM/Makefile.am b/extras/LinuxRPM/Makefile.am index 09d2f9e42..1dafa982b 100644 --- a/extras/LinuxRPM/Makefile.am +++ b/extras/LinuxRPM/Makefile.am @@ -1,6 +1,5 @@ -GFS_TAR = ../../glusterfs-*git.tar.gz -GFS_SPEC = ../../glusterfs.spec +GFS_TAR = ../../glusterfs-$(VERSION).tar.gz .PHONY: all @@ -12,9 +11,9 @@ all: glusterrpms: prep srcrpm rpms -rm -rf rpmbuild -prep:: - if [ ! -e $(GFS_TAR) -a ! -e $(GFS_SPEC) ]; then \ - $(MAKE) -c ../.. dist; \ +prep: + if [ ! -e $(GFS_TAR) ]; then \ + $(MAKE) -C ../.. dist; \ fi -mkdir -p rpmbuild/SPECS -mkdir -p rpmbuild/RPMS diff --git a/extras/Makefile.am b/extras/Makefile.am index 7b55ef2ee..cf619329b 100644 --- a/extras/Makefile.am +++ b/extras/Makefile.am @@ -2,13 +2,19 @@ EditorModedir = $(docdir) EditorMode_DATA = glusterfs-mode.el glusterfs.vim -SUBDIRS = init.d benchmarking hook-scripts $(OCF_SUBDIR) LinuxRPM +SUBDIRS = init.d systemd benchmarking hook-scripts $(OCF_SUBDIR) LinuxRPM geo-rep confdir = $(sysconfdir)/glusterfs -conf_DATA = glusterfs-logrotate +conf_DATA = glusterfs-logrotate gluster-rsyslog-7.2.conf gluster-rsyslog-5.8.conf \ + logger.conf.example glusterfs-georep-logrotate + +voldir = $(sysconfdir)/glusterfs +vol_DATA = glusterd.vol EXTRA_DIST = specgen.scm MacOSX/Portfile glusterfs-mode.el glusterfs.vim \ migrate-unify-to-distribute.sh backend-xattr-sanitize.sh \ backend-cleanup.sh disk_usage_sync.sh quota-remove-xattr.sh \ - quota-metadata-cleanup.sh glusterfs-logrotate clear_xattrs.sh \ - group-virt.example glusterd-sysconfig + quota-metadata-cleanup.sh glusterfs-logrotate clear_xattrs.sh \ + group-virt.example glusterd-sysconfig gluster-rsyslog-7.2.conf \ + gluster-rsyslog-5.8.conf logger.conf.example glusterd.vol \ + glusterfs-georep-logrotate diff --git a/extras/geo-rep/Makefile.am b/extras/geo-rep/Makefile.am new file mode 100644 index 000000000..fc5f56d54 --- /dev/null +++ b/extras/geo-rep/Makefile.am @@ -0,0 +1,2 @@ +EXTRA_DIST = gsync-sync-gfid.c gsync-upgrade.sh generate-gfid-file.sh \ + get-gfid.sh slave-upgrade.sh diff --git a/extras/geo-rep/generate-gfid-file.sh b/extras/geo-rep/generate-gfid-file.sh new file mode 100644 index 000000000..c6739fbf1 --- /dev/null +++ b/extras/geo-rep/generate-gfid-file.sh @@ -0,0 +1,53 @@ +#!/bin/bash +#Usage: generate-gfid-file.sh <master-volfile-server:master-volume> <path-to-get-gfid.sh> <output-file> + +function get_gfids() +{ + GET_GFID_CMD=$1 + OUTPUT_FILE=$2 + find . -exec $GET_GFID_CMD {} \; > $OUTPUT_FILE +} + +function mount_client() +{ + local T; # temporary mount + local i; # inode number + + VOLFILE_SERVER=$1; + VOLUME=$2; + GFID_CMD=$3; + OUTPUT=$4; + + T=$(mktemp -d); + + glusterfs -s $VOLFILE_SERVER --volfile-id $VOLUME $T; + + i=$(stat -c '%i' $T); + + [ "x$i" = "x1" ] || fatal "could not mount volume $MASTER on $T"; + + cd $T; + + get_gfids $GFID_CMD $OUTPUT + + cd -; + + umount $T || fatal "could not umount $MASTER from $T"; + + rmdir $T || warn "rmdir of $T failed"; +} + + +function main() +{ + SLAVE=$1 + GET_GFID_CMD=$2 + OUTPUT=$3 + + VOLFILE_SERVER=`echo $SLAVE | sed -e 's/\(.*\):.*/\1/'` + VOLUME_NAME=`echo $SLAVE | sed -e 's/.*:\(.*\)/\1/'` + + mount_client $VOLFILE_SERVER $VOLUME_NAME $GET_GFID_CMD $OUTPUT +} + +main "$@"; diff --git a/extras/geo-rep/get-gfid.sh b/extras/geo-rep/get-gfid.sh new file mode 100755 index 000000000..a4d609b0b --- /dev/null +++ b/extras/geo-rep/get-gfid.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +ATTR_STR=`getfattr -h $1 -n glusterfs.gfid.string` +GLFS_PATH=`echo $ATTR_STR | sed -e 's/# file: \(.*\) glusterfs.gfid.string*/\1/g'` +GFID=`echo $ATTR_STR | sed -e 's/.*glusterfs.gfid.string="\(.*\)"/\1/g'` + +echo "$GFID $GLFS_PATH" diff --git a/extras/geo-rep/gsync-sync-gfid.c b/extras/geo-rep/gsync-sync-gfid.c new file mode 100644 index 000000000..601f4720e --- /dev/null +++ b/extras/geo-rep/gsync-sync-gfid.c @@ -0,0 +1,106 @@ + +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <limits.h> +#include <sys/types.h> +#include <attr/xattr.h> +#include <libgen.h> +#include <ctype.h> +#include <stdlib.h> + +#ifndef UUID_CANONICAL_FORM_LEN +#define UUID_CANONICAL_FORM_LEN 36 +#endif + +#ifndef GF_FUSE_AUX_GFID_HEAL +#define GF_FUSE_AUX_GFID_HEAL "glusterfs.gfid.heal" +#endif + +#define GLFS_LINE_MAX (PATH_MAX + (2 * UUID_CANONICAL_FORM_LEN)) + +int +main (int argc, char *argv[]) +{ + char *file = NULL; + char *tmp = NULL; + char *tmp1 = NULL; + char *parent_dir = NULL; + char *gfid = NULL; + char *bname = NULL; + int ret = -1; + int len = 0; + FILE *fp = NULL; + char line[GLFS_LINE_MAX] = {0,}; + char *path = NULL; + void *blob = NULL; + void *tmp_blob = NULL; + + if (argc != 2) { + /* each line in the file has the following format + * uuid-in-canonical-form path-relative-to-gluster-mount. + * Both uuid and relative path are from master mount. + */ + fprintf (stderr, "usage: %s <file-of-paths-to-be-synced>\n", + argv[0]); + goto out; + } + + file = argv[1]; + + fp = fopen (file, "r"); + if (fp == NULL) { + fprintf (stderr, "cannot open %s for reading (%s)\n", + file, strerror (errno)); + goto out; + } + + while (fgets (line, GLFS_LINE_MAX, fp) != NULL) { + tmp = line; + path = gfid = line; + + path += UUID_CANONICAL_FORM_LEN + 1; + + while(isspace (*path)) + path++; + + if ((strlen (line) < GLFS_LINE_MAX) && + (line[strlen (line) - 1] == '\n')) + line[strlen (line) - 1] = '\0'; + + line[UUID_CANONICAL_FORM_LEN] = '\0'; + + tmp = strdup (path); + tmp1 = strdup (path); + parent_dir = dirname (tmp); + bname = basename (tmp1); + + /* gfid + '\0' + bname + '\0' */ + len = UUID_CANONICAL_FORM_LEN + 1 + strlen (bname) + 1; + + blob = calloc (1, len); + + memcpy (blob, gfid, UUID_CANONICAL_FORM_LEN); + + tmp_blob = blob + UUID_CANONICAL_FORM_LEN + 1; + + memcpy (tmp_blob, bname, strlen (bname)); + + ret = setxattr (parent_dir, GF_FUSE_AUX_GFID_HEAL, blob, len, + 0); + if (ret < 0) { + fprintf (stderr, "setxattr on %s/%s failed (%s)\n", + parent_dir, bname, strerror (errno)); + } + memset (line, 0, GLFS_LINE_MAX); + + free (blob); + free (tmp); free (tmp1); + blob = NULL; + } + + ret = 0; +out: + return ret; +} + diff --git a/extras/geo-rep/gsync-upgrade.sh b/extras/geo-rep/gsync-upgrade.sh new file mode 100644 index 000000000..b17948736 --- /dev/null +++ b/extras/geo-rep/gsync-upgrade.sh @@ -0,0 +1,123 @@ +#!/bin/bash +#usage: gsync-upgrade.sh <slave-volfile-server:slave-volume> <gfid-file> +# <path-to-gsync-sync-gfid> <ssh-identity-file> +#<slave-volfile-server>: a machine on which gluster cli can fetch slave volume info. +# slave-volfile-server defaults to localhost. +# +#<gfid-file>: a file containing paths and their associated gfids +# on master. The paths are relative to master mount point +# (not absolute). An example extract of <gfid-file> can be, +# +# <extract> +# 22114455-57c5-46e9-a783-c40f83a72b09 /dir +# 25772386-3eb8-4550-a802-c3fdc938ca80 /dir/file +# </extract> +# +#<ssh-identity-file>: file from which the identity (private key) for public key authentication is read. + +SLAVE_MOUNT='/tmp/glfs_slave' + +function SSH() +{ + HOST=$1 + SSHKEY=$2 + + shift 2 + + ssh -qi $SSHKEY \ + -oPasswordAuthentication=no \ + -oStrictHostKeyChecking=no \ + "$HOST" "$@"; +} + +function get_bricks() +{ + SSHKEY=$3 + + SSH $1 $SSHKEY "gluster volume info $2" | grep -E 'Brick[0-9]+' | sed -e 's/[^:]*:\(.*\)/\1/g' +} + +function cleanup_brick() +{ + HOST=$1 + BRICK=$2 + SSHKEY=$3 + + # TODO: write a C program to receive a list of files and does cleanup on + # them instead of spawning a new setfattr process for each file if + # performance is bad. + SSH -i $SSHKEY $HOST "rm -rf $BRICK/.glusterfs/* && find $BRICK -exec setfattr -x trusted.gfid {} \;" +} + +function cleanup_slave() +{ + SSHKEY=$2 + + VOLFILE_SERVER=`echo $1 | sed -e 's/\(.*\):.*/\1/'` + VOLUME_NAME=`echo $1 | sed -e 's/.*:\(.*\)/\1/'` + + BRICKS=`get_bricks $VOLFILE_SERVER $VOLUME_NAME $SSHKEY` + + for i in $BRICKS; do + HOST=`echo $i | sed -e 's/\(.*\):.*/\1/'` + BRICK=`echo $i | sed -e 's/.*:\(.*\)/\1/'` + cleanup_brick $HOST $BRICK $SSHKEY + done + + SSH -i $SSHKEY $VOLFILE_SERVER "gluster --mode=script volume stop $VOLUME_NAME; gluster volume start $VOLUME_NAME"; + +} + +function mount_client() +{ + local T; # temporary mount + local i; # inode number + GFID_FILE=$3 + SYNC_CMD=$4 + + T=$(mktemp -d); + + glusterfs --aux-gfid-mount -s $1 --volfile-id $2 $T; + + i=$(stat -c '%i' $T); + + [ "x$i" = "x1" ] || fatal "could not mount volume $MASTER on $T"; + + cd $T; + + $SYNC_CMD $GFID_FILE + + cd -; + + umount -l $T || fatal "could not umount $MASTER from $T"; + + rmdir $T || warn "rmdir of $T failed"; +} + +function sync_gfids() +{ + SLAVE=$1 + GFID_FILE=$2 + + SLAVE_VOLFILE_SERVER=`echo $SLAVE | sed -e 's/\(.*\):.*/\1/'` + SLAVE_VOLUME_NAME=`echo $SLAVE | sed -e 's/.*:\(.*\)/\1/'` + + if [ "x$SLAVE_VOLFILE_SERVER" = "x" ]; then + SLAVE_VOLFILE_SERVER="localhost" + fi + + mount_client $SLAVE_VOLFILE_SERVER $SLAVE_VOLUME_NAME $GFID_FILE $3 +} + +function upgrade() +{ + SLAVE=$1 + GFID_FILE=$2 + SYNC_CMD=$3 + SSHKEY=$4 + + cleanup_slave $SLAVE $SSHKEY + sync_gfids $SLAVE $GFID_FILE $SYNC_CMD +} + +upgrade "$@" diff --git a/extras/geo-rep/slave-upgrade.sh b/extras/geo-rep/slave-upgrade.sh new file mode 100644 index 000000000..6198f408a --- /dev/null +++ b/extras/geo-rep/slave-upgrade.sh @@ -0,0 +1,102 @@ +#!/bin/bash +#usage: slave-upgrade.sh <volfile-server:volname> <gfid-file> +# <path-to-gsync-sync-gfid> +#<slave-volfile-server>: a machine on which gluster cli can fetch slave volume info. +# slave-volfile-server defaults to localhost. +# +#<gfid-file>: a file containing paths and their associated gfids +# on master. The paths are relative to master mount point +# (not absolute). An example extract of <gfid-file> can be, +# +# <extract> +# 22114455-57c5-46e9-a783-c40f83a72b09 /dir +# 25772386-3eb8-4550-a802-c3fdc938ca80 /dir/file +# </extract> + +function get_bricks() +{ + gluster volume info $1 | grep -E 'Brick[0-9]+' | sed -e 's/[^:]*:\(.*\)/\1/g' +} + +function cleanup_brick() +{ + HOST=$1 + BRICK=$2 + + # TODO: write a C program to receive a list of files and does cleanup on + # them instead of spawning a new setfattr process for each file if + # performance is bad. + ssh $HOST "rm -rf $BRICK/.glusterfs/* && find $BRICK -exec setfattr -x trusted.gfid {} \; 2>/dev/null" +} + +function cleanup_slave() +{ + VOLUME_NAME=`echo $1 | sed -e 's/.*:\(.*\)/\1/'` + + BRICKS=`get_bricks $VOLUME_NAME` + + for i in $BRICKS; do + HOST=`echo $i | sed -e 's/\(.*\):.*/\1/'` + BRICK=`echo $i | sed -e 's/.*:\(.*\)/\1/'` + cleanup_brick $HOST $BRICK + done + + # Now restart the volume + gluster --mode=script volume stop $VOLUME_NAME; + gluster volume start $VOLUME_NAME; +} + +function mount_client() +{ + local T; # temporary mount + local i; # inode number + + VOLUME_NAME=$2; + GFID_FILE=$3 + SYNC_CMD=$4 + + T=$(mktemp -d); + + glusterfs --aux-gfid-mount -s $1 --volfile-id $VOLUME_NAME $T; + + i=$(stat -c '%i' $T); + + cd $T; + + $SYNC_CMD $GFID_FILE + + cd -; + + umount $T || fatal "could not umount $MASTER from $T"; + + rmdir $T || warn "rmdir of $T failed"; +} + +function sync_gfids() +{ + SLAVE=$1 + GFID_FILE=$2 + SYNC_CMD=$3 + + SLAVE_VOLFILE_SERVER=`echo $SLAVE | sed -e 's/\(.*\):.*/\1/'` + SLAVE_VOLUME_NAME=`echo $SLAVE | sed -e 's/.*:\(.*\)/\1/'` + + if [ "x$SLAVE_VOLFILE_SERVER" = "x" ]; then + SLAVE_VOLFILE_SERVER="localhost" + fi + + mount_client $SLAVE_VOLFILE_SERVER $SLAVE_VOLUME_NAME $GFID_FILE $SYNC_CMD +} + +function upgrade() +{ + SLAVE=$1 + GFID_FILE=$2 + SYNC_CMD=$3 + + cleanup_slave $SLAVE + + sync_gfids $SLAVE $GFID_FILE $SYNC_CMD +} + +upgrade "$@" diff --git a/extras/gluster-rsyslog-5.8.conf b/extras/gluster-rsyslog-5.8.conf new file mode 100644 index 000000000..2519999bc --- /dev/null +++ b/extras/gluster-rsyslog-5.8.conf @@ -0,0 +1,51 @@ +##### gluster.conf ##### + +# +## If you want to log every message to the log file instead of +## intelligently suppressing repeated messages, set off to +## RepeatedMsgReduction. This change requires rsyslog restart +## (eg. run 'service rsyslog restart') +# +#$RepeatedMsgReduction off +$RepeatedMsgReduction on + +# +## The mmcount module provides the capability to count log messages by +## severity or json property of given app-name. The count value is added +## into the log message as json property named '$msgid' +# +$ModLoad mmcount +$mmcountKey gf_code # start counting value of gf_code + +$template Glusterfsd_dynLogFile,"/var/log/glusterfs/bricks/%app-name%.log" +$template Gluster_dynLogFile,"/var/log/glusterfs/%app-name%.log" + +$template GLFS_Template,"%msgid%/%syslogfacility-text:::uppercase%/%syslogseverity-text:::uppercase% [%TIMESTAMP:::date-rfc3339%] %msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" + +# +## Pass logs to mmcount if app-name is 'gluster' +# +if $app-name contains 'gluster' then :mmcount: + +if $app-name contains 'glusterfsd' then ?Glusterfsd_dynLogFile;GLFS_Template +if $app-name contains 'gluster' and not ( $app-name contains 'glusterfsd' ) then ?Gluster_dynLogFile;GLFS_Template + +# +## Sample configuration to send a email alert for every 50th mmcount +# +#$ModLoad ommail +#$ActionMailSMTPServer smtp.example.com +#$ActionMailFrom rsyslog@example.com +#$ActionMailTo glusteradmin@example.com +#$template mailSubject,"50th message of gf_code=9999 on %hostname%" +#$template mailBody,"RSYSLOG Alert\r\nmsg='%msg%'" +#$ActionMailSubject mailSubject +#$ActionExecOnlyOnceEveryInterval 30 +#if $app-name == 'glusterfsd' and $msgid != 0 and $msgid % 50 == 0 \ +#then :ommail:;RSYSLOG_SyslogProtocol23Format +# + +# +## discard logs where app-name is 'gluster' as we processed already +# +if $app-name contains 'gluster' then ~ diff --git a/extras/gluster-rsyslog-7.2.conf b/extras/gluster-rsyslog-7.2.conf new file mode 100644 index 000000000..8b2841543 --- /dev/null +++ b/extras/gluster-rsyslog-7.2.conf @@ -0,0 +1,76 @@ +##### gluster.conf ##### +# +## If you want to log every message to the log file instead of +## intelligently suppressing repeated messages, set off to +## RepeatedMsgReduction. This change requires rsyslog restart +## (eg. run 'service rsyslog restart') +# +#$RepeatedMsgReduction off +$RepeatedMsgReduction on + +$ModLoad mmjsonparse +*.* :mmjsonparse: + +# +## The mmcount module provides the capability to count log messages by +## severity or json property of given app-name. The count value is added +## into the log message as json property named 'mmcount' +## +## More info at http://www.rsyslog.com/doc/mmcount.html +# +#module(load="mmcount") +#action(type="mmcount" appname="glusterd" key="!gf_code") # count each value of gf_code of appname glusterd +#action(type="mmcount" appname="glusterfsd" key="!gf_code") # count each value of gf_code of appname glusterfsd +#action(type="mmcount" appname="glusterfs" key="!gf_code") # count each value of gf_code of appname glusterfs + +template (name="Glusterfsd_dynLogFile" type="string" string="/var/log/glusterfs/bricks/%app-name%.log") +template (name="Gluster_dynLogFile" type="string" string="/var/log/glusterfs/%app-name%.log") + +template(name="GLFS_template" type="list") { + property(name="$!mmcount") + constant(value="/") + property(name="syslogfacility-text" caseConversion="upper") + constant(value="/") + property(name="syslogseverity-text" caseConversion="upper") + constant(value=" ") + constant(value="[") + property(name="timereported" dateFormat="rfc3339") + constant(value="] ") + constant(value="[") + property(name="$!gf_code") + constant(value="] ") + constant(value="[") + property(name="$!gf_message") + constant(value="] ") + property(name="$!msg") + constant(value="\n") +} + +if $app-name contains 'glusterfsd' then { + action(type="omfile" + DynaFile="Glusterfsd_dynLogFile" + Template="GLFS_template") + stop +} + +if $app-name contains 'gluster' then { + action(type="omfile" + DynaFile="Gluster_dynLogFile" + Template="GLFS_template") + stop +} + +# +## send email for every 50th mmcount +#$ModLoad ommail +#if $app-name == 'glusterfsd' and $!mmcount <> 0 and $!mmcount % 50 == 0 then { +# $ActionMailSMTPServer smtp.example.com +# $ActionMailFrom rsyslog@example.com +# $ActionMailTo glusteradmin@example.com +# $template mailSubject,"50th message of gf_code=9999 on %hostname%" +# $template mailBody,"RSYSLOG Alert\r\nmsg='%msg%'" +# $ActionMailSubject mailSubject +# $ActionExecOnlyOnceEveryInterval 30 +# :ommail:;RSYSLOG_SyslogProtocol23Format +#} +# diff --git a/extras/glusterd.vol b/extras/glusterd.vol new file mode 100644 index 000000000..9bac52ab7 --- /dev/null +++ b/extras/glusterd.vol @@ -0,0 +1,9 @@ +volume management + type mgmt/glusterd + option working-directory /var/lib/glusterd + option transport-type socket,rdma + option transport.socket.keepalive-time 10 + option transport.socket.keepalive-interval 2 + option transport.socket.read-fail-log off +# option base-port 49152 +end-volume diff --git a/extras/glusterfs-georep-logrotate b/extras/glusterfs-georep-logrotate new file mode 100644 index 000000000..6a69ab1e3 --- /dev/null +++ b/extras/glusterfs-georep-logrotate @@ -0,0 +1,18 @@ + +rotate 52 +missingok + +compress +delaycompress +notifempty + +/var/log/glusterfs/geo-replication/*/*.log { +} + + +/var/log/glusterfs/geo-replication-slaves/*.log { +} + + +/var/log/glusterfs/geo-replication-slaves/*/*.log { +} diff --git a/extras/hook-scripts/Makefile.am b/extras/hook-scripts/Makefile.am index 5c6249de7..f6bded20c 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 S56glusterd-geo-rep-create-post.sh diff --git a/extras/hook-scripts/S30samba-set.sh b/extras/hook-scripts/S30samba-set.sh new file mode 100755 index 000000000..6b11f5a4f --- /dev/null +++ b/extras/hook-scripts/S30samba-set.sh @@ -0,0 +1,109 @@ +#!/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+="glusterfs:logfile = /var/log/samba/glusterfs-$volname.%%M.log\n" + STRING+="glusterfs:loglevel = 7\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 [ "x$pid" != "x" ] + then + kill -HUP "$pid"; + else + /etc/init.d/smb start + fi +} + +function del_samba_share () { + volname=$1 + sed -i "/\[gluster-$volname\]/,/^$/d" /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 + if ! grep --quiet "\[gluster-$VOL\]" /etc/samba/smb.conf ; then + add_samba_share $VOL + sighup_samba + fi + +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 75336e6b4..34fde0ef8 100755 --- a/extras/hook-scripts/S30samba-start.sh +++ b/extras/hook-scripts/S30samba-start.sh @@ -1,12 +1,31 @@ #!/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" +CONFIGFILE= +LOGFILEBASE= +PIDDIR= function parse_args () { ARGS=$(getopt -l $OPTSPEC -name $PROGNAME $@) @@ -18,10 +37,6 @@ function parse_args () { shift VOL=$1 ;; - --mnt) - shift - MNT_PRE=$1 - ;; *) shift break @@ -31,32 +46,65 @@ 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 find_config_info () { + cmdout=`smbd -b | grep smb.conf` + if [ $? -ne 0 ];then + echo "Samba is not installed" + exit 1 + fi + CONFIGFILE=`echo $cmdout | awk {'print $2'}` + PIDDIR=`smbd -b | grep PIDDIR | awk {'print $2'}` + LOGFILEBASE=`smbd -b | grep 'LOGFILEBASE' | awk '{print $2}'` } -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+="glusterfs:logfile = $LOGFILEBASE/glusterfs-$volname.%%M.log\n" + STRING+="glusterfs:loglevel = 7\n" + STRING+="path = /\n" + STRING+="read only = no\n" + STRING+="guest ok = yes\n" + printf "$STRING" >> ${CONFIGFILE} } function sighup_samba () { - pid=`cat /var/run/smbd.pid` - if [ $pid != "" ] + pid=`cat ${PIDDIR}/smbd.pid` + if [ "x$pid" != "x" ] 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 -sighup_samba +if [ $(get_smb "$VOL") = "disable" ]; then + exit 0 +fi + +#Find smb.conf, smbd pid directory and smbd logfile path +find_config_info + +if ! grep --quiet "\[gluster-$VOL\]" ${CONFIGFILE} ; then + add_samba_share $VOL + sighup_samba +fi diff --git a/extras/hook-scripts/S30samba-stop.sh b/extras/hook-scripts/S30samba-stop.sh index 7e05c2111..8950eea43 100755 --- a/extras/hook-scripts/S30samba-stop.sh +++ b/extras/hook-scripts/S30samba-stop.sh @@ -1,11 +1,25 @@ #! /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" +CONFIGFILE= +PIDDIR= function parse_args () { ARGS=$(getopt -l $OPTSPEC -name $PROGNAME $@) @@ -17,11 +31,6 @@ function parse_args () { shift VOL=$1 ;; - --mnt) - shift - MNT_PRE=$1 - echo $1 - ;; *) shift break @@ -31,22 +40,24 @@ function parse_args () { done } -function del_samba_export () { - 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 find_config_info () { + cmdout=`smbd -b | grep smb.conf` + if [ $? -ne 0 ];then + echo "Samba is not installed" + exit 1 + fi + CONFIGFILE=`echo $cmdout | awk {'print $2'}` + PIDDIR=`smbd -b | grep PIDDIR | awk {'print $2'}` } -function umount_volume () { +function del_samba_share () { volname=$1 - mnt_pre=$2 - umount -l $mnt_pre/$volname + sed -i "/\[gluster-$volname\]/,/^$/d" ${CONFIGFILE} } function sighup_samba () { - pid=`cat /var/run/smbd.pid` - if [ $pid != "" ] + pid=`cat ${PIDDIR}/smbd.pid` + if [ "x$pid" != "x" ] then kill -HUP $pid; else @@ -55,6 +66,6 @@ function sighup_samba () { } parse_args $@ -del_samba_export $VOL -umount_volume $VOL $MNT_PRE +find_config_info +del_samba_share $VOL sighup_samba diff --git a/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh b/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh new file mode 100755 index 000000000..1369c22fc --- /dev/null +++ b/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +key_val_pair1=`echo $2 | cut -d ' ' -f 1` +key_val_pair2=`echo $2 | cut -d ' ' -f 2` +key_val_pair3=`echo $2 | cut -d ' ' -f 3` + +key=`echo $key_val_pair1 | cut -d '=' -f 1` +val=`echo $key_val_pair1 | cut -d '=' -f 2` +if [ "$key" != "is_push_pem" ]; then + exit; +fi +if [ "$val" != '1' ]; then + exit; +fi + +key=`echo $key_val_pair2 | cut -d '=' -f 1` +val=`echo $key_val_pair2 | cut -d '=' -f 2` +if [ "$key" != "pub_file" ]; then + exit; +fi +if [ "$val" == "" ]; then + exit; +fi +pub_file=`echo $val` +pub_file_tmp=`echo $val`_tmp + +key=`echo $key_val_pair3 | cut -d '=' -f 1` +val=`echo $key_val_pair3 | cut -d '=' -f 2` +if [ "$key" != "slave_ip" ]; then + exit; +fi +if [ "$val" == "" ]; then + exit; +fi +slave_ip=`echo $val` + +if [ -f $pub_file ]; then + scp $pub_file $slave_ip:$pub_file_tmp + ssh $slave_ip "mv $pub_file_tmp $pub_file" + ssh $slave_ip "gluster system:: copy file /geo-replication/common_secret.pem.pub > /dev/null" + ssh $slave_ip "gluster system:: execute add_secret_pub > /dev/null" +fi diff --git a/extras/init.d/Makefile.am b/extras/init.d/Makefile.am index 7c26a0e8e..38898fddd 100644 --- a/extras/init.d/Makefile.am +++ b/extras/init.d/Makefile.am @@ -3,17 +3,20 @@ EXTRA_DIST = glusterd-Debian glusterd-Redhat glusterd-SuSE glusterd.plist rhel5- CLEANFILES = -initdir = @initdir@ -launchddir = @launchddir@ +INIT_DIR = @initdir@ +SYSTEMD_DIR = @systemddir@ +LAUNCHD_DIR = @launchddir@ $(GF_DISTRIBUTION): - $(mkdir_p) $(DESTDIR)$(initdir) - $(INSTALL_PROGRAM) glusterd-$(GF_DISTRIBUTION) $(DESTDIR)$(initdir)/glusterd + @if [ ! -d $(SYSTEMD_DIR) ]; then \ + $(mkdir_p) $(DESTDIR)$(INIT_DIR); \ + $(INSTALL_PROGRAM) glusterd-$(GF_DISTRIBUTION) $(DESTDIR)$(INIT_DIR)/glusterd; \ + fi install-exec-local: $(GF_DISTRIBUTION) install-data-local: if GF_DARWIN_HOST_OS - $(mkdir_p) $(DESTDIR)$(launchddir) - $(INSTALL_PROGRAM) glusterd.plist $(DESTDIR)$(launchddir)/com.gluster.glusterd.plist + $(mkdir_p) $(DESTDIR)$(LAUNCHD_DIR) + $(INSTALL_PROGRAM) glusterd.plist $(DESTDIR)$(LAUNCHD_DIR)/com.gluster.glusterd.plist endif diff --git a/extras/init.d/glusterd-Redhat.in b/extras/init.d/glusterd-Redhat.in index 7db7e1be7..e320708ae 100755 --- a/extras/init.d/glusterd-Redhat.in +++ b/extras/init.d/glusterd-Redhat.in @@ -72,7 +72,6 @@ stop() echo -n $"Stopping $BASE:" if pidofproc -p $PIDFILE $GLUSTERD_BIN &> /dev/null; then killproc -p $PIDFILE $BASE - [ -w $PIDFILE ] && rm -f $PIDFILE else killproc $BASE fi diff --git a/extras/logger.conf.example b/extras/logger.conf.example new file mode 100644 index 000000000..248be5bda --- /dev/null +++ b/extras/logger.conf.example @@ -0,0 +1,13 @@ +# +# Sample logger.conf file to configure enhanced Logging in GlusterFS +# +# To enable enhanced logging capabilities, +# +# 1. rename this file to /etc/glusterfs/logger.conf +# +# 2. rename /etc/rsyslog.d/gluster.conf.example to +# /etc/rsyslog.d/gluster.conf +# +# This change requires restart of all gluster services/volumes and +# rsyslog. +# diff --git a/extras/systemd/Makefile.am b/extras/systemd/Makefile.am new file mode 100644 index 000000000..3fc656b82 --- /dev/null +++ b/extras/systemd/Makefile.am @@ -0,0 +1,11 @@ + +CLEANFILES = + +SYSTEMD_DIR = @systemddir@ + +install-exec-local: + @if [ -d $(SYSTEMD_DIR) ]; then \ + $(mkdir_p) $(DESTDIR)$(SYSTEMD_DIR); \ + $(INSTALL_PROGRAM) glusterd.service $(DESTDIR)$(SYSTEMD_DIR)/; \ + fi + diff --git a/extras/systemd/glusterd.service.in b/extras/systemd/glusterd.service.in new file mode 100644 index 000000000..fc8d8c9a2 --- /dev/null +++ b/extras/systemd/glusterd.service.in @@ -0,0 +1,14 @@ +[Unit] +Description=GlusterFS, a clustered file-system server +After=network.target rpcbind.service +Before=network-online.target + +[Service] +Type=forking +PIDFile=/run/glusterd.pid +LimitNOFILE=65536 +ExecStart=@prefix@/sbin/glusterd -p /run/glusterd.pid +KillMode=process + +[Install] +WantedBy=multi-user.target diff --git a/extras/test/test-ffop.c b/extras/test/test-ffop.c index 6ce7097d5..2d174d452 100644 --- a/extras/test/test-ffop.c +++ b/extras/test/test-ffop.c @@ -777,6 +777,7 @@ test_open_modes (char *filename) goto out; } +#if 0 /* undefined behaviour, unable to reliably test */ ret = creat (filename, 0644); close (ret); ret = generic_open_read_write (filename, O_TRUNC|O_RDONLY); @@ -784,6 +785,7 @@ test_open_modes (char *filename) fprintf (stderr, "flag O_TRUNC|O_RDONLY failed\n"); goto out; } +#endif ret = generic_open_read_write (filename, O_CREAT|O_RDWR|O_SYNC); if (0 != ret) { diff --git a/extras/who-wrote-glusterfs/gitdm.aliases b/extras/who-wrote-glusterfs/gitdm.aliases new file mode 100644 index 000000000..784a3e3bc --- /dev/null +++ b/extras/who-wrote-glusterfs/gitdm.aliases @@ -0,0 +1,48 @@ +# +# This is the email aliases file, mapping secondary addresses onto a single, +# canonical address. This file should probably match the contents of .mailmap +# in the root of the git repository. +# +# Format: <alias> <real> + +amar@gluster.com amarts@redhat.com +amar@del.gluster.com amarts@redhat.com +avati@amp.gluster.com avati@redhat.com +avati@blackhole.gluster.com avati@redhat.com +avati@dev.gluster.com avati@redhat.com +avati@gluster.com avati@redhat.com +wheelear@gmail.com awheeler@redhat.com +anush@gluster.com ashetty@redhat.com +csaba@gluster.com csaba@redhat.com +csaba@lowlife.hu csaba@redhat.com +csaba@zresearch.com csaba@redhat.com +harsha@gluster.com fharshav@redhat.com +harsha@zresearch.com fharshav@redhat.com +harsha@dev.gluster.com fharshav@redhat.com +harsha@harshavardhana.net fharshav@redhat.com +kkeithle@f16node1.kkeithle.usersys.redhat.com kkeithle@redhat.com +kaushal@gluster.com kaushal@redhat.com +kaushikbv@gluster.com kbudiger@redhat.com +krishna@gluster.com ksriniva@redhat.com +krishna@zresearch.com ksriniva@redhat.com +krishna@guest-laptop ksriniva@redhat.com +kp@gluster.com kparthas@redhat.com +me@louiszuckerman.com louiszuckerman@gmail.com +msvbhat@gmail.com vbhat@redhat.com +vishwanath@gluster.com vbhat@redhat.com +pavan@dev.gluster.com pavan@gluster.com +zaitcev@yahoo.com zaitcev@kotori.zaitcev.us +pranithk@gluster.com pkarampu@redhat.com +raghavendrabhat@gluster.com raghavendra@redhat.com +raghavendra@gluster.com rgowdapp@redhat.com +raghavendra@zresearch.com rgowdapp@redhat.com +rahulcssjce@gmail.com rahulcs@redhat.com +rajesh@gluster.com rajesh@redhat.com +rajesh.amaravathi@gmail.com rajesh@redhat.com +shehjart@zresearch.com shehjart@gluster.com +venky@gluster.com vshankar@redhat.com +vijay@gluster.com vbellur@redhat.com +vijay@dev.gluster.com vbellur@redhat.com +vijaykumar.koppad@gmail.com vkoppad@redhat.com +vikas@zresearch.com vikas@gluster.com +shishirng@gluster.com sgowda@redhat.com diff --git a/extras/who-wrote-glusterfs/gitdm.config b/extras/who-wrote-glusterfs/gitdm.config new file mode 100644 index 000000000..e1ff2bd5b --- /dev/null +++ b/extras/who-wrote-glusterfs/gitdm.config @@ -0,0 +1,8 @@ +# +# This is the gitdm configuration file for GlusterFS. +# See the gitdm.config in the gitdm repositofy for additional options and +# comments. +# + +EmailAliases gitdm.aliases +EmailMap gitdm.domain-map diff --git a/extras/who-wrote-glusterfs/gitdm.domain-map b/extras/who-wrote-glusterfs/gitdm.domain-map new file mode 100644 index 000000000..f1c305898 --- /dev/null +++ b/extras/who-wrote-glusterfs/gitdm.domain-map @@ -0,0 +1,15 @@ +# +# Here is a set of mappings of domain names onto employer names. +# +active.by ActiveCloud +cern.ch CERN +gluster.com Red Hat +gooddata.com GoodData +hastexo.com hastexo +ibm.com IBM +linbit.com LINBIT +netbsd.org NetBSD +netdirect.ca Net Direct +redhat.com Red Hat +stepping-stone.ch stepping stone GmbH +zresearch.com Red Hat diff --git a/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh b/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh new file mode 100755 index 000000000..487f5874b --- /dev/null +++ b/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Gather statistics on "Who wrote GlusterFS". The idea comes from the excellent +# articles on http://lwn.net/ named "Who wrote <linux-version>?". +# +# gitdm comes from git://git.lwn.net/gitdm.git by Jonathan Corbet. +# +# Confguration files used: +# - gitdm.config: main configuration file, pointing to the others +# - gitdm.aliases: merge users with different emailaddresses into one +# - gitdm.domain-map: map domain names from emailaddresses to companies +# + +DIRNAME=$(dirname $0) + +GITDM_REPO=git://git.lwn.net/gitdm.git +GITDM_DIR=${DIRNAME}/gitdm +GITDM_CMD="python ${GITDM_DIR}/gitdm" + +error() +{ + local ret=${?} + printf "${@}\n" > /dev/stderr + return ${ret} +} + +check_gitdm() +{ + if [ ! -e "${GITDM_DIR}/gitdm" ] + then + git clone --quiet git://git.lwn.net/gitdm.git ${DIRNAME}/gitdm + fi +} + +# The first argument is the revision-range (see 'git rev-list --help'). +# REV can be empty, and the statistics will be calculated over the whole +# current branch. +REV=${1} +shift +# all remaining options are passed to gitdm, see the gitdm script for an +# explanation of the accepted options. +GITDM_OPTS=${@} + +if ! check_gitdm +then + error "Could not find 'gitdm', exiting..." + exit 1 +fi + +git log --numstat -M ${REV} | ${GITDM_CMD} -b ${DIRNAME} -n ${GITDM_OPTS} |
