diff options
Diffstat (limited to 'geo-replication/src')
| -rw-r--r-- | geo-replication/src/Makefile.am | 7 | ||||
| -rw-r--r-- | geo-replication/src/gsyncd.c | 45 | ||||
| -rwxr-xr-x | geo-replication/src/gverify.sh | 142 | ||||
| -rw-r--r-- | geo-replication/src/peer_add_secret_pub | 3 | ||||
| -rwxr-xr-x | geo-replication/src/peer_gsec_create.in | 12 | 
5 files changed, 207 insertions, 2 deletions
diff --git a/geo-replication/src/Makefile.am b/geo-replication/src/Makefile.am index 9e410cda633..6feeda8e68c 100644 --- a/geo-replication/src/Makefile.am +++ b/geo-replication/src/Makefile.am @@ -1,5 +1,12 @@ +  gsyncddir = $(libexecdir)/glusterfs +gsyncd_SCRIPTS = gverify.sh peer_add_secret_pub peer_gsec_create + +# peer_gsec_create is not added to EXTRA_DIST as it's derived +# from a .in file +EXTRA_DIST = gverify.sh peer_add_secret_pub +  gsyncd_PROGRAMS = gsyncd  gsyncd_SOURCES = gsyncd.c procdiggy.c diff --git a/geo-replication/src/gsyncd.c b/geo-replication/src/gsyncd.c index 9c4a5bdffb3..68446d9ad34 100644 --- a/geo-replication/src/gsyncd.c +++ b/geo-replication/src/gsyncd.c @@ -285,6 +285,46 @@ invoke_rsync (int argc, char **argv)          return 1;  } +static int +invoke_gluster (int argc, char **argv) +{ +        int i = 0; +        int j = 0; +        int optsover = 0; +        char *ov = NULL; + +        for (i = 1; i < argc; i++) { +                ov = strtail (argv[i], "--"); +                if (ov && !optsover) { +                        if (*ov == '\0') +                                optsover = 1; +                        continue; +                } +                switch (++j) { +                case 1: +                        if (strcmp (argv[i], "volume") != 0) +                                goto error; +                        break; +                case 2: +                        if (strcmp (argv[i], "info") != 0) +                                goto error; +                        break; +                case 3: +                        break; +                default: +                        goto error; +                } +        } + +        argv[0] = "gluster"; +        execvp (SBIN_DIR"/gluster", argv); +        fprintf (stderr, "exec of gluster failed\n"); +        return 127; + + error: +        fprintf (stderr, "disallowed gluster invocation\n"); +        return 1; +}  struct invocable {          char *name; @@ -292,8 +332,9 @@ struct invocable {  };  struct invocable invocables[] = { -        { "rsync",  invoke_rsync  }, -        { "gsyncd", invoke_gsyncd }, +        { "rsync",   invoke_rsync  }, +        { "gsyncd",  invoke_gsyncd }, +        { "gluster", invoke_gluster },          { NULL, NULL}  }; diff --git a/geo-replication/src/gverify.sh b/geo-replication/src/gverify.sh new file mode 100755 index 00000000000..186af53a407 --- /dev/null +++ b/geo-replication/src/gverify.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# Script to verify the Master and Slave Gluster compatibility. +# To use ./gverify <master volume> <slave host> <slave volume> +# Returns 0 if master and slave compatible. + +BUFFER_SIZE=1000; +slave_log_file=`gluster --print-logdir`/geo-replication-slaves/slave.log + +function SSHM() +{ +    ssh -q \ +	-oPasswordAuthentication=no \ +	-oStrictHostKeyChecking=no \ +	-oControlMaster=yes \ +	"$@"; +} + +function cmd_master() +{ +    VOL=$1; +    local cmd_line; +    cmd_line=$(cat <<EOF +function do_verify() { +v=\$1; +d=\$(mktemp -d 2>/dev/null); +glusterfs -s localhost --xlator-option="*dht.lookup-unhashed=off" --volfile-id \$v -l $slave_log_file \$d; +i=\$(stat -c "%i" \$d); +if [[ "\$i" -ne "1" ]]; then +echo 0:0; +exit 1; +fi; +cd \$d; +available_size=\$(df \$d | tail -1 | awk "{print \\\$2}"); +umount -l \$d; +rmdir \$d; +ver=\$(gluster --version | head -1 | cut -f2 -d " "); +echo \$available_size:\$ver; +}; +cd /tmp; +[ x$VOL != x ] && do_verify $VOL; +EOF +); + +echo $cmd_line; +} + +function cmd_slave() +{ +    VOL=$1; +    local cmd_line; +    cmd_line=$(cat <<EOF +function do_verify() { +v=\$1; +d=\$(mktemp -d 2>/dev/null); +glusterfs -s localhost --xlator-option="*dht.lookup-unhashed=off" --volfile-id \$v -l $slave_log_file \$d; +i=\$(stat -c "%i" \$d); +if [[ "\$i" -ne "1" ]]; then +echo 0:0; +exit 1; +fi; +cd \$d; +available_size=\$(df \$d | tail -1 | awk "{print \\\$4}"); +umount -l \$d; +rmdir \$d; +ver=\$(gluster --version | head -1 | cut -f2 -d " "); +echo \$available_size:\$ver; +}; +cd /tmp; +[ x$VOL != x ] && do_verify $VOL; +EOF +); + +echo $cmd_line; +} + +function master_stats() +{ +    MASTERVOL=$1; +    local cmd_line; +    cmd_line=$(cmd_master $MASTERVOL); +    bash -c "$cmd_line"; +} + + +function slave_stats() +{ +    SLAVEHOST=$1; +    SLAVEVOL=$2; +    local cmd_line; +    cmd_line=$(cmd_slave $SLAVEVOL); +    SSHM $SLAVEHOST bash -c "'$cmd_line'"; +} + + +function main() +{ +    ERRORS=0; +    master_data=$(master_stats $1); +    slave_data=$(slave_stats $2 $3); +    master_size=$(echo $master_data | cut -f1 -d':'); +    slave_size=$(echo $slave_data | cut -f1 -d':'); +    master_version=$(echo $master_data | cut -f2 -d':'); +    slave_version=$(echo $slave_data | cut -f2 -d':'); +    log_file=$4 + +    if [[ "x$master_size" = "x" || "x$master_version" = "x" || "$master_size" -eq "0" ]]; then +	echo "Unable to fetch master volume details." > $log_file; +	exit 1; +    fi; + +    if [[ "x$slave_size" = "x" || "x$slave_version" = "x" || "$slave_size" -eq "0" ]]; then +        ping -w 5 $2; +        if [ $? -ne 0 ]; then +            echo "$2 not reachable." > $log_file +            exit 1; +        fi; +	echo "Unable to fetch slave volume details." > $log_file; +	exit 1; +    fi; + +    if [ $slave_size -ge $(($master_size - $BUFFER_SIZE )) ]; then +	echo "Total size of master is lesser than available size of slave." > $log_file; +    else +	echo "Total size of master is greater than available size of slave." > $log_file; +	ERRORS=$(($ERRORS + 1)); +	exit $ERRORS; +    fi; + +    if [[ $master_version < $slave_version || $master_version == $slave_version ]]; then +	echo "Gluster version of master and slave matches." > $log_file; +    else +	echo "Gluster version mismatch between master and slave." > $log_file; +	ERRORS=$(($ERRORS + 1)); +	exit $ERRORS; +    fi; + +    exit $ERRORS; +} + + +main "$@"; diff --git a/geo-replication/src/peer_add_secret_pub b/geo-replication/src/peer_add_secret_pub new file mode 100644 index 00000000000..1ce040d4419 --- /dev/null +++ b/geo-replication/src/peer_add_secret_pub @@ -0,0 +1,3 @@ +#!/bin/bash + +cat $1 >> ~/.ssh/authorized_keys diff --git a/geo-replication/src/peer_gsec_create.in b/geo-replication/src/peer_gsec_create.in new file mode 100755 index 00000000000..ef630bd4417 --- /dev/null +++ b/geo-replication/src/peer_gsec_create.in @@ -0,0 +1,12 @@ +#!/bin/bash + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +if [ ! -f "$GLUSTERD_WORKING_DIR"/geo-replication/secret.pem.pub ]; then +    \rm -rf "$GLUSTERD_WORKING_DIR"/geo-replication/secret.pem* +    ssh-keygen -N '' -f "$GLUSTERD_WORKING_DIR"/geo-replication/secret.pem > /dev/null +fi + +output=`echo command=\"@libexecdir@/glusterfs/gsyncd\" " "``cat "$GLUSTERD_WORKING_DIR"/geo-replication/secret.pem.pub` +echo $output  | 
