diff options
author | Avra Sengupta <asengupt@redhat.com> | 2014-05-12 00:06:32 +0000 |
---|---|---|
committer | Venky Shankar <vshankar@redhat.com> | 2014-05-14 10:24:25 -0700 |
commit | 09e9775127c7def49202e68c923e36a6032a3628 (patch) | |
tree | 4f481e3a6d2375314c78246fe278d7f6d9d81c2d /xlators/mgmt/glusterd/src | |
parent | 48201f4faeef3602cb095bf47d14deebf91899ba (diff) |
glusterd/geo-rep: Allow gverify.sh and S56glusterd-geo-rep-create-post.sh
to operate for non-root privileged slave volume
Mounting the slave-volume on local node, to perform disk checks
in order to allow gverify.sh to operate for non-root privileged
slave volume
Allowing the hook script S56glusterd-geo-rep-create-post.sh
to operate for non-root privileged slave volume
Modified peer_add_secret_pub.in to accept username as argument
and add the pem keys to the users's_home_dir/.ssh/authorized_keys
Wrote set_geo_rep_pem_keys.sh which accepts username as argument
and copies the pem keys from the user's home directory to
$GLUSTERD_WORKING_DIR/geo-replication/ and then copies the keys
to other nodes in the cluster and add them to the respective
authorized keys. The script takes as argument the user name and
assumes that the user will be present in all the nodes in the
cluster. It is not needed for root.
To summarize:
For a privileged slave user, execute the following on master node as super user:
gluster system:: execute gsec_create
gluster volume geo-replication <master_vol> [root@]<slave_ip>::<slave_vol> create push_pem
For a non-privileged slave user execute the following on master node as super user:
gluster system:: execute gsec_create
gluster volume geo-replication <master_vol> <slave_user>@<slave_ip>::<slave_vol> create push_pem
then on the slave node execute the following as super user:
/usr/local/libexec/glusterfs/set_geo_rep_pem_keys.sh <slave_user>
BUG: 1077452
Change-Id: I88020968aa5b13a2c2ab86b1d6661b60071f6f5e
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/7744
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-geo-rep.c | 84 |
1 files changed, 68 insertions, 16 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index a2315f97ef4..3e2e308ec13 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -1948,7 +1948,7 @@ out: } static int -glusterd_verify_slave (char *volname, char *slave_ip, char *slave, +glusterd_verify_slave (char *volname, char *slave_url, char *slave_vol, char **op_errstr, gf_boolean_t *is_force_blocker) { int32_t ret = -1; @@ -1956,17 +1956,38 @@ glusterd_verify_slave (char *volname, char *slave_ip, char *slave, char log_file_path[PATH_MAX] = ""; char buf[PATH_MAX] = ""; char *tmp = NULL; + char *slave_url_buf = NULL; char *save_ptr = NULL; + char *slave_user = NULL; + char *slave_ip = NULL; glusterd_conf_t *priv = NULL; + xlator_t *this = NULL; + this = THIS; + GF_ASSERT (this); + priv = this->private; + GF_ASSERT (priv); GF_ASSERT (volname); - GF_ASSERT (slave_ip); - GF_ASSERT (slave); + GF_ASSERT (slave_url); + GF_ASSERT (slave_vol); - if (THIS) - priv = THIS->private; - if (priv == NULL) { - gf_log ("", GF_LOG_ERROR, "priv of glusterd not present"); + /* Fetch the slave_user and slave_ip from the slave_url. + * If the slave_user is not present. Use "root" + */ + if (strstr(slave_url, "@")) { + slave_url_buf = gf_strdup (slave_url); + if (!slave_url_buf) + goto out; + + slave_user = strtok_r (slave_url_buf, "@", &save_ptr); + slave_ip = strtok_r (NULL, "@", &save_ptr); + } else { + slave_user = "root"; + slave_ip = slave_url; + } + + if (!slave_user || !slave_ip) { + gf_log (this->name, GF_LOG_ERROR, "Invalid slave url."); goto out; } @@ -1976,8 +1997,9 @@ glusterd_verify_slave (char *volname, char *slave_ip, char *slave, runinit (&runner); runner_add_args (&runner, GSYNCD_PREFIX"/gverify.sh", NULL); runner_argprintf (&runner, "%s", volname); + runner_argprintf (&runner, "%s", slave_user); runner_argprintf (&runner, "%s", slave_ip); - runner_argprintf (&runner, "%s", slave); + runner_argprintf (&runner, "%s", slave_vol); runner_argprintf (&runner, "%s", log_file_path); runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); synclock_unlock (&priv->big_lock); @@ -2017,6 +2039,7 @@ glusterd_verify_slave (char *volname, char *slave_ip, char *slave, } ret = 0; out: + GF_FREE (slave_url_buf); unlink (log_file_path); gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; @@ -2102,7 +2125,7 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) char *volname = NULL; char *host_uuid = NULL; char *statefile = NULL; - char *slave_ip = NULL; + char *slave_url = NULL; char *slave_host = NULL; char *slave_vol = NULL; char *conf_path = NULL; @@ -2154,7 +2177,7 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) return -1; } - ret = glusterd_get_slave_details_confpath (volinfo, dict, &slave_ip, + ret = glusterd_get_slave_details_confpath (volinfo, dict, &slave_url, &slave_host, &slave_vol, &conf_path, op_errstr); if (ret) { @@ -2199,7 +2222,7 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) * ssh login setup, slave volume is created, slave vol is empty, * and if it has enough memory and bypass in case of force if * the error is not a force blocker */ - ret = glusterd_verify_slave (volname, slave_host, slave_vol, + ret = glusterd_verify_slave (volname, slave_url, slave_vol, op_errstr, &is_force_blocker); if (ret) { if (is_force && !is_force_blocker) { @@ -5049,7 +5072,11 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) char hooks_args[PATH_MAX] = ""; char uuid_str [64] = ""; char *host_uuid = NULL; + char *slave_url = NULL; + char *slave_url_buf = NULL; + char *slave_user = NULL; char *slave_ip = NULL; + char *save_ptr = NULL; char *slave_host = NULL; char *slave_vol = NULL; char *arg_buf = NULL; @@ -5060,9 +5087,11 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) gf_boolean_t is_force = -1; glusterd_conf_t *conf = NULL; glusterd_volinfo_t *volinfo = NULL; + xlator_t *this = NULL; - GF_ASSERT (THIS); - conf = THIS->private; + this = THIS; + GF_ASSERT (this); + conf = this->private; GF_ASSERT (conf); GF_ASSERT (dict); GF_ASSERT (op_errstr); @@ -5090,7 +5119,7 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) goto out; } - ret = dict_get_str (dict, "slave_ip", &slave_ip); + ret = dict_get_str (dict, "slave_ip", &slave_url); if (ret) { snprintf (errmsg, sizeof (errmsg), "Unable to fetch slave IP."); @@ -5099,6 +5128,28 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) goto out; } + /* Fetch the slave_user and slave_ip from the slave_url. + * If the slave_user is not present. Use "root" + */ + if (strstr(slave_url, "@")) { + slave_url_buf = gf_strdup (slave_url); + if (!slave_url_buf) { + ret = -1; + goto out; + } + slave_user = strtok_r (slave_url, "@", &save_ptr); + slave_ip = strtok_r (NULL, "@", &save_ptr); + } else { + slave_user = "root"; + slave_ip = slave_url; + } + + if (!slave_user || !slave_ip) { + gf_log (this->name, GF_LOG_ERROR, "Invalid slave url."); + ret = -1; + goto out; + } + ret = dict_get_str (dict, "slave_host", &slave_host); if (ret) { snprintf (errmsg, sizeof (errmsg), @@ -5121,8 +5172,8 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) is_pem_push = 0; snprintf(hooks_args, sizeof(hooks_args), - "is_push_pem=%d pub_file=%s slave_ip=%s", - is_pem_push, common_pem_file, slave_host); + "is_push_pem=%d,pub_file=%s,slave_user=%s,slave_ip=%s", + is_pem_push, common_pem_file, slave_user, slave_ip); } else snprintf(hooks_args, sizeof(hooks_args), @@ -5170,6 +5221,7 @@ create_essentials: } out: + GF_FREE (slave_url_buf); gf_log ("", GF_LOG_DEBUG,"Returning %d", ret); return ret; } |