geo-rep: rewrite gsyncd wrapper in C

This rewrite does not change functionality;
it's purpose is to prepare followup modifications which will let
all slave side helper programs being dispatched to through
gsyncd. The string processing that's required for that task would
be too much cumbersome in shell.

Change-Id: Ia7858aba5efeb5dcff16a918ea1c02253f0e49ab
BUG: 2825
Reviewed-on: http://review.gluster.com/459
Reviewed-by: Amar Tumballi <amar@gluster.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
This commit is contained in:
Csaba Henk 2011-09-02 19:03:33 +02:00 committed by Vijay Bellur
parent 3672c989f3
commit 1098aaa51d
5 changed files with 153 additions and 61 deletions

View File

@ -109,7 +109,7 @@ AC_CONFIG_FILES([Makefile
xlators/features/marker/Makefile
xlators/features/marker/src/Makefile
xlators/features/marker/utils/Makefile
xlators/features/marker/utils/gsyncd
xlators/features/marker/utils/src/Makefile
xlators/features/marker/utils/syncdaemon/Makefile
xlators/features/read-only/Makefile
xlators/features/read-only/src/Makefile

View File

@ -1,7 +1,3 @@
SUBDIRS = syncdaemon
gsyncddir = $(libexecdir)/glusterfs
gsyncd_SCRIPTS = gsyncd
SUBDIRS = syncdaemon src
CLEANFILES =

View File

@ -1,55 +0,0 @@
#!/bin/sh
prefix="@prefix@"
exec_prefix="@exec_prefix@"
libexecdir=`eval echo "@libexecdir@"`
sbindir=`eval echo "@sbindir@"`
gluster="$sbindir"/gluster
# glusterd service autodetection
config_wanted=1
if [ "$_GLUSTERD_CALLED_" = 1 ]; then
# OK, we know glusterd called us, no need to look for further config
config_wanted=0
# ... altough this conclusion should not inherit to our children
unset _GLUSTERD_CALLED_
else
# look for a -c option -- if present, we are already configured.
for a in "$@"; do
# -c found, see if it has an argument
if [ "$one_more_arg" = 1 ]; then
if echo "$a" | grep -qv ^-; then
config_wanted=0
break
fi
one_more_arg=0
fi
if [ "$a" = -c ] || [ "$a" = --config-file ]; then
one_more_arg=1
continue
fi
if echo $a | grep -qE '^(-c.|--config-file=)'; then
config_wanted=0;
break
fi
done
fi
if [ $config_wanted = 1 ]; then
wd="`${gluster} --log-file=/dev/stderr system:: getwd`"
if [ $? -eq 0 ]; then
config_file="$wd/geo-replication/gsyncd.conf"
fi
fi
if [ -z "$config_file" ]; then
exec @PYTHON@ "$libexecdir"/glusterfs/python/syncdaemon/gsyncd.py "$@"
else
exec @PYTHON@ "$libexecdir"/glusterfs/python/syncdaemon/gsyncd.py -c "$config_file" "$@"
fi

View File

@ -0,0 +1,20 @@
gsyncddir = $(libexecdir)/glusterfs
gsyncd_PROGRAMS = gsyncd
gsyncd_SOURCES = gsyncd.c
gsyncd_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la
gsyncd_LDFLAGS = $(GF_LDFLAGS) $(GF_GLUSTERFS_LDFLAGS)
AM_CFLAGS = -fPIC -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS)\
-I$(top_srcdir)/libglusterfs/src\
-DGSYNCD_PREFIX=\"$(libexecdir)/glusterfs\"\
-DSBIN_DIR=\"$(sbindir)\" -DPYTHON=\"$(PYTHON)\"
CLEANFILES =
$(top_builddir)/libglusterfs/src/libglusterfs.la:
$(MAKE) -C $(top_builddir)/libglusterfs/src/ all

View File

@ -0,0 +1,131 @@
/*
Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
This file is part of GlusterFS.
GlusterFS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 3 of the License,
or (at your option) any later version.
GlusterFS is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see
<http://www.gnu.org/licenses/>.
*/
#ifndef _CONFIG_H
#define _CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "common-utils.h"
#include "run.h"
#define _GLUSTERD_CALLED_ "_GLUSTERD_CALLED_"
#define GSYNCD_CONF "geo-replication/gsyncd.conf"
static int
config_wanted (int argc, char **argv)
{
char *evas = NULL;
char *oa = NULL;
int i = 0;
int one_more_arg = 0;
evas = getenv (_GLUSTERD_CALLED_);
if (evas && strcmp (evas, "1") == 0) {
/* OK, we know glusterd called us, no need to look for further config
* ... altough this conclusion should not inherit to our children
*/
unsetenv (_GLUSTERD_CALLED_);
return 0;
}
for (i = 1; i < argc; i++) {
/* -c found, see if it has an argument */
if (one_more_arg) {
if (argv[i][0] != '-')
return 0;
one_more_arg = 0;
}
if ((strcmp (argv[i], "-c") && strcmp (argv[i], "--config-file")) == 0) {
one_more_arg = 1;
continue;
}
oa = strtail (argv[i], "-c");
if (oa && !*oa)
oa = NULL;
if (!oa)
oa = strtail (argv[i], "--config-file=");
if (oa)
return 0;
}
return 1;
}
int
main(int argc, char **argv)
{
char config_file[PATH_MAX] = {0,};
size_t gluster_workdir_len = 0;
runner_t runner = {0,};
int i = 0;
int j = 0;
char *nargv[argc + 4];
if (config_wanted (argc, argv)) {
runinit (&runner);
runner_add_args (&runner, SBIN_DIR"/gluster",
"--log-file=/dev/stderr", "system::", "getwd",
NULL);
runner_redir (&runner, STDOUT_FILENO, RUN_PIPE);
if (runner_start (&runner) == 0 &&
fgets (config_file, PATH_MAX,
runner_chio (&runner, STDOUT_FILENO)) != NULL &&
config_file[strlen (config_file) - 1] == '\n' &&
runner_end (&runner) == 0)
gluster_workdir_len = strlen (config_file) - 1;
if (gluster_workdir_len) {
if (gluster_workdir_len + 1 + strlen (GSYNCD_CONF) + 1 >
PATH_MAX)
goto error;
config_file[gluster_workdir_len] = '/';
strcat (config_file, GSYNCD_CONF);
} else
config_file[0] = '\0';
}
j = 0;
nargv[j++] = PYTHON;
nargv[j++] = GSYNCD_PREFIX"/python/syncdaemon/gsyncd.py";
if (config_file[0]) {
nargv[j++] = "-c";
nargv[j++] = config_file;
}
for (i = 1; i < argc; i++)
nargv[j++] = argv[i];
nargv[j++] = NULL;
execvp (PYTHON, nargv);
fprintf (stderr, "exec of "PYTHON" failed\n");
return 127;
error:
fprintf (stderr, "gsyncd initializaion failed\n");
return 1;
}