summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-ganesha.c
diff options
context:
space:
mode:
authorKaleb S. KEITHLEY <kkeithle@redhat.com>2017-02-01 06:39:03 -0500
committerKaleb KEITHLEY <kkeithle@redhat.com>2017-03-21 13:13:44 -0400
commit843e1b04b554ab887ec656ae7b468bb93ee4e2f7 (patch)
tree59f9b9fa44e0fbba2f6cf7076f7a7df45f58bdc8 /xlators/mgmt/glusterd/src/glusterd-ganesha.c
parentf21fd308fcfab6151e7c8f60642d8dfcbec0cc48 (diff)
glusterd: (storhaug) remove ganesha
remove all vestiges of ganesha The storhaug CLI is used to manage ganesha and Samba. Also any setup and teardown of the ganesha HA is initiated using storhaug to preserve the proper layering. Change-Id: I0eec0016a1b7802a36e7b2d92896b86fdf8607d5 BUG: 1420713 Signed-off-by: Kaleb S. KEITHLEY <kkeithle@redhat.com> Reviewed-on: https://review.gluster.org/16504 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-ganesha.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-ganesha.c898
1 files changed, 0 insertions, 898 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-ganesha.c b/xlators/mgmt/glusterd/src/glusterd-ganesha.c
deleted file mode 100644
index 4346bad4e2a..00000000000
--- a/xlators/mgmt/glusterd/src/glusterd-ganesha.c
+++ /dev/null
@@ -1,898 +0,0 @@
-/*
- Copyright (c) 2015 Red Hat, Inc. <http://www.redhat.com>
- This file is part of GlusterFS.
-
- This file is licensed to you under your choice of the GNU Lesser
- General Public License, version 3 or any later version (LGPLv3 or
- later), or the GNU General Public License, version 2 (GPLv2), in all
- cases as published by the Free Software Foundation.
-*/
-
-
-
-#include "common-utils.h"
-#include "glusterd.h"
-#include "glusterd-op-sm.h"
-#include "glusterd-store.h"
-#include "glusterd-utils.h"
-#include "glusterd-nfs-svc.h"
-#include "glusterd-volgen.h"
-#include "glusterd-messages.h"
-#include "syscall.h"
-
-#include <ctype.h>
-
-int start_ganesha (char **op_errstr);
-
-
-typedef struct service_command {
- char *binary;
- char *service;
- int (*action) (struct service_command *, char *);
-} service_command;
-
-/* parsing_ganesha_ha_conf will allocate the returned string
- * to be freed (GF_FREE) by the caller
- * return NULL if error or not found */
-static char*
-parsing_ganesha_ha_conf(const char *key) {
-#define MAX_LINE 1024
- char scratch[MAX_LINE * 2] = {0,};
- char *value = NULL, *pointer = NULL, *end_pointer = NULL;
- FILE *fp;
-
- fp = fopen (GANESHA_HA_CONF, "r");
- if (fp == NULL) {
- gf_msg (THIS->name, GF_LOG_ERROR, errno,
- GD_MSG_FILE_OP_FAILED, "couldn't open the file %s",
- GANESHA_HA_CONF);
- goto end_ret;
- }
- while ((pointer = fgets (scratch, MAX_LINE, fp)) != NULL) {
- /* Read config file until we get matching "^[[:space:]]*key" */
- if (*pointer == '#') {
- continue;
- }
- while (isblank(*pointer)) {
- pointer++;
- }
- if (strncmp (pointer, key, strlen (key))) {
- continue;
- }
- pointer += strlen (key);
- /* key found : if we fail to parse, we'll return an error
- * rather than trying next one
- * - supposition : conf file is bash compatible : no space
- * around the '=' */
- if (*pointer != '=') {
- gf_msg (THIS->name, GF_LOG_ERROR, errno,
- GD_MSG_GET_CONFIG_INFO_FAILED,
- "Parsing %s failed at key %s",
- GANESHA_HA_CONF, key);
- goto end_close;
- }
- pointer++; /* jump the '=' */
-
- if (*pointer == '"' || *pointer == '\'') {
- /* dont get the quote */
- pointer++;
- }
- end_pointer = pointer;
- /* stop at the next closing quote or blank/newline */
- do {
- end_pointer++;
- } while (!(*end_pointer == '\'' || *end_pointer == '"' ||
- isspace(*end_pointer) || *end_pointer == '\0'));
- *end_pointer = '\0';
-
- /* got it. copy it and return */
- value = gf_strdup (pointer);
- break;
- }
-
-end_close:
- fclose(fp);
-end_ret:
- return value;
-}
-
-static int
-sc_systemctl_action (struct service_command *sc, char *command)
-{
- runner_t runner = {0,};
-
- runinit (&runner);
- runner_add_args (&runner, sc->binary, command, sc->service, NULL);
- return runner_run (&runner);
-}
-
-static int
-sc_service_action (struct service_command *sc, char *command)
-{
- runner_t runner = {0,};
-
- runinit (&runner);
- runner_add_args (&runner, sc->binary, sc->service, command, NULL);
- return runner_run (&runner);
-}
-
-static int
-manage_service (char *action)
-{
- struct stat stbuf = {0,};
- int i = 0;
- int ret = 0;
- struct service_command sc_list[] = {
- { .binary = "/usr/bin/systemctl",
- .service = "nfs-ganesha",
- .action = sc_systemctl_action
- },
- { .binary = "/sbin/invoke-rc.d",
- .service = "nfs-ganesha",
- .action = sc_service_action
- },
- { .binary = "/sbin/service",
- .service = "nfs-ganesha",
- .action = sc_service_action
- },
- { .binary = NULL
- }
- };
-
- while (sc_list[i].binary != NULL) {
- ret = sys_stat (sc_list[i].binary, &stbuf);
- if (ret == 0) {
- gf_msg_debug (THIS->name, 0,
- "%s found.", sc_list[i].binary);
- if (strcmp (sc_list[i].binary, "/usr/bin/systemctl") == 0)
- ret = sc_systemctl_action (&sc_list[i], action);
- else
- ret = sc_service_action (&sc_list[i], action);
-
- return ret;
- }
- i++;
- }
- gf_msg (THIS->name, GF_LOG_ERROR, 0,
- GD_MSG_UNRECOGNIZED_SVC_MNGR,
- "Could not %s NFS-Ganesha.Service manager for distro"
- " not recognized.", action);
- return ret;
-}
-
-/*
- * Check if the cluster is a ganesha cluster or not *
- */
-gf_boolean_t
-glusterd_is_ganesha_cluster () {
- int ret = -1;
- glusterd_conf_t *priv = NULL;
- xlator_t *this = NULL;
- gf_boolean_t ret_bool = _gf_false;
-
- this = THIS;
- GF_VALIDATE_OR_GOTO ("ganesha", this, out);
- priv = this->private;
- GF_VALIDATE_OR_GOTO (this->name, priv, out);
-
- ret = dict_get_str_boolean (priv->opts,
- GLUSTERD_STORE_KEY_GANESHA_GLOBAL,
- _gf_false);
- if (ret == _gf_true) {
- ret_bool = _gf_true;
- gf_msg_debug (this->name, 0,
- "nfs-ganesha is enabled for the cluster");
- } else
- gf_msg_debug (this->name, 0,
- "nfs-ganesha is disabled for the cluster");
-
-out:
- return ret_bool;
-
-}
-
-/* Check if ganesha.enable is set to 'on', that checks if
- * a particular volume is exported via NFS-Ganesha */
-gf_boolean_t
-glusterd_check_ganesha_export (glusterd_volinfo_t *volinfo) {
-
- char *value = NULL;
- gf_boolean_t is_exported = _gf_false;
- int ret = 0;
-
- ret = glusterd_volinfo_get (volinfo, "ganesha.enable", &value);
- if ((ret == 0) && value) {
- if (strcmp (value, "on") == 0) {
- gf_msg_debug (THIS->name, 0, "ganesha.enable set"
- " to %s", value);
- is_exported = _gf_true;
- }
- }
- return is_exported;
-}
-
-/* *
- * The below function is called as part of commit phase for volume set option
- * "ganesha.enable". If the value is "on", it creates export configuration file
- * and then export the volume via dbus command. Incase of "off", the volume
- * will be already unexported during stage phase, so it will remove the conf
- * file from shared storage
- */
-int
-glusterd_check_ganesha_cmd (char *key, char *value, char **errstr, dict_t *dict)
-{
- int ret = 0;
- char *volname = NULL;
-
- GF_ASSERT (key);
- GF_ASSERT (value);
- GF_ASSERT (dict);
-
- if ((strcmp (key, "ganesha.enable") == 0)) {
- if ((strcmp (value, "on")) && (strcmp (value, "off"))) {
- gf_asprintf (errstr, "Invalid value"
- " for volume set command. Use on/off only.");
- ret = -1;
- goto out;
- }
- if (strcmp (value, "on") == 0) {
- ret = glusterd_handle_ganesha_op (dict, errstr, key,
- value);
-
- } else if (is_origin_glusterd (dict)) {
- ret = dict_get_str (dict, "volname", &volname);
- if (ret) {
- gf_msg ("glusterd-ganesha", GF_LOG_ERROR, errno,
- GD_MSG_DICT_GET_FAILED,
- "Unable to get volume name");
- goto out;
- }
- ret = manage_export_config (volname, "off", errstr);
- }
- }
-out:
- if (ret) {
- gf_msg ("glusterd-ganesha", GF_LOG_ERROR, 0,
- GD_MSG_NFS_GNS_OP_HANDLE_FAIL,
- "Handling NFS-Ganesha"
- " op failed.");
- }
- return ret;
-}
-
-int
-glusterd_op_stage_set_ganesha (dict_t *dict, char **op_errstr)
-{
- int ret = -1;
- int value = -1;
- gf_boolean_t option = _gf_false;
- char *str = NULL;
- glusterd_conf_t *priv = NULL;
- xlator_t *this = NULL;
-
- GF_ASSERT (dict);
- this = THIS;
- GF_ASSERT (this);
- priv = this->private;
- GF_ASSERT (priv);
-
- value = dict_get_str_boolean (dict, "value", _gf_false);
- if (value == -1) {
- gf_msg (this->name, GF_LOG_ERROR, errno,
- GD_MSG_DICT_GET_FAILED,
- "value not present.");
- goto out;
- }
- /* This dict_get will fail if the user had never set the key before */
- /*Ignoring the ret value and proceeding */
- ret = dict_get_str (priv->opts, GLUSTERD_STORE_KEY_GANESHA_GLOBAL, &str);
- if (ret == -1) {
- gf_msg (this->name, GF_LOG_WARNING, errno,
- GD_MSG_DICT_GET_FAILED, "Global dict not present.");
- ret = 0;
- goto out;
- }
- /* Validity of the value is already checked */
- ret = gf_string2boolean (str, &option);
- /* Check if the feature is already enabled, fail in that case */
- if (value == option) {
- gf_asprintf (op_errstr, "nfs-ganesha is already %sd.", str);
- ret = -1;
- goto out;
- }
-
- if (value) {
- ret = start_ganesha (op_errstr);
- if (ret) {
- gf_msg (THIS->name, GF_LOG_ERROR, 0,
- GD_MSG_NFS_GNS_START_FAIL,
- "Could not start NFS-Ganesha");
-
- }
- } else {
- ret = stop_ganesha (op_errstr);
- if (ret)
- gf_msg_debug (THIS->name, 0, "Could not stop "
- "NFS-Ganesha.");
- }
-
-out:
-
- if (ret) {
- if (!(*op_errstr)) {
- *op_errstr = gf_strdup ("Error, Validation Failed");
- gf_msg_debug (this->name, 0,
- "Error, Cannot Validate option :%s",
- GLUSTERD_STORE_KEY_GANESHA_GLOBAL);
- } else {
- gf_msg_debug (this->name, 0,
- "Error, Cannot Validate option");
- }
- }
- return ret;
-}
-
-int
-glusterd_op_set_ganesha (dict_t *dict, char **errstr)
-{
- int ret = 0;
- xlator_t *this = NULL;
- glusterd_conf_t *priv = NULL;
- char *key = NULL;
- char *value = NULL;
- char *next_version = NULL;
-
- this = THIS;
- GF_ASSERT (this);
- GF_ASSERT (dict);
-
- priv = this->private;
- GF_ASSERT (priv);
-
-
- ret = dict_get_str (dict, "key", &key);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, errno,
- GD_MSG_DICT_GET_FAILED,
- "Couldn't get key in global option set");
- goto out;
- }
-
- ret = dict_get_str (dict, "value", &value);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, errno,
- GD_MSG_DICT_GET_FAILED,
- "Couldn't get value in global option set");
- goto out;
- }
-
- ret = glusterd_handle_ganesha_op (dict, errstr, key, value);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, 0,
- GD_MSG_NFS_GNS_SETUP_FAIL,
- "Initial NFS-Ganesha set up failed");
- ret = -1;
- goto out;
- }
- ret = dict_set_dynstr_with_alloc (priv->opts,
- GLUSTERD_STORE_KEY_GANESHA_GLOBAL,
- value);
- if (ret) {
- gf_msg (this->name, GF_LOG_WARNING, errno,
- GD_MSG_DICT_SET_FAILED, "Failed to set"
- " nfs-ganesha in dict.");
- goto out;
- }
- ret = glusterd_get_next_global_opt_version_str (priv->opts,
- &next_version);
- if (ret) {
- gf_msg_debug (THIS->name, 0, "Could not fetch "
- " global op version");
- goto out;
- }
- ret = dict_set_str (priv->opts, GLUSTERD_GLOBAL_OPT_VERSION,
- next_version);
- if (ret)
- goto out;
-
- ret = glusterd_store_options (this, priv->opts);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, 0,
- GD_MSG_STORE_FAIL, "Failed to store options");
- goto out;
- }
-
-out:
- gf_msg_debug (this->name, 0, "returning %d", ret);
- return ret;
-}
-
-/* Following function parse GANESHA_HA_CONF
- * The sample file looks like below,
- * HA_NAME="ganesha-ha-360"
- * HA_VOL_NAME="ha-state"
- * HA_CLUSTER_NODES="server1,server2"
- * VIP_rhs_1="10.x.x.x"
- * VIP_rhs_2="10.x.x.x." */
-
-/* Check if the localhost is listed as one of nfs-ganesha nodes */
-gf_boolean_t
-check_host_list (void)
-{
-
- glusterd_conf_t *priv = NULL;
- char *hostname, *hostlist;
- gf_boolean_t ret = _gf_false;
- xlator_t *this = NULL;
-
- this = THIS;
- priv = THIS->private;
- GF_ASSERT (priv);
-
- hostlist = parsing_ganesha_ha_conf ("HA_CLUSTER_NODES");
- if (hostlist == NULL) {
- gf_msg (this->name, GF_LOG_INFO, errno,
- GD_MSG_GET_CONFIG_INFO_FAILED,
- "couldn't get HA_CLUSTER_NODES from file %s",
- GANESHA_HA_CONF);
- return _gf_false;
- }
-
- /* Hostlist is a comma separated list now */
- hostname = strtok (hostlist, ",");
- while (hostname != NULL) {
- ret = gf_is_local_addr (hostname);
- if (ret) {
- gf_msg (this->name, GF_LOG_INFO, 0,
- GD_MSG_NFS_GNS_HOST_FOUND,
- "ganesha host found "
- "Hostname is %s", hostname);
- break;
- }
- hostname = strtok (NULL, ",");
- }
-
- GF_FREE (hostlist);
- return ret;
-
-}
-
-int
-manage_export_config (char *volname, char *value, char **op_errstr)
-{
- runner_t runner = {0,};
- int ret = -1;
-
- GF_ASSERT(volname);
- runinit (&runner);
- runner_add_args (&runner, "sh",
- GANESHA_PREFIX"/create-export-ganesha.sh",
- CONFDIR, value, volname, NULL);
- ret = runner_run(&runner);
-
- if (ret)
- gf_asprintf (op_errstr, "Failed to create"
- " NFS-Ganesha export config file.");
-
- return ret;
-}
-
-/* Exports and unexports a particular volume via NFS-Ganesha */
-int
-ganesha_manage_export (dict_t *dict, char *value, char **op_errstr)
-{
- runner_t runner = {0,};
- int ret = -1;
- glusterd_volinfo_t *volinfo = NULL;
- dict_t *vol_opts = NULL;
- char *volname = NULL;
- xlator_t *this = NULL;
- glusterd_conf_t *priv = NULL;
- gf_boolean_t option = _gf_false;
-
- runinit (&runner);
- this = THIS;
- GF_ASSERT (this);
- priv = this->private;
-
- GF_ASSERT (value);
- GF_ASSERT (dict);
- GF_ASSERT (priv);
-
- ret = dict_get_str (dict, "volname", &volname);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, errno,
- GD_MSG_DICT_GET_FAILED,
- "Unable to get volume name");
- goto out;
- }
- ret = gf_string2boolean (value, &option);
- if (ret == -1) {
- gf_msg (this->name, GF_LOG_ERROR, EINVAL,
- GD_MSG_INVALID_ENTRY, "invalid value.");
- goto out;
- }
-
- ret = glusterd_volinfo_find (volname, &volinfo);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, EINVAL,
- GD_MSG_VOL_NOT_FOUND,
- FMTSTR_CHECK_VOL_EXISTS, volname);
- goto out;
- }
-
- ret = glusterd_check_ganesha_export (volinfo);
- if (ret && option) {
- gf_asprintf (op_errstr, "ganesha.enable "
- "is already 'on'.");
- ret = -1;
- goto out;
-
- } else if (!option && !ret) {
- gf_asprintf (op_errstr, "ganesha.enable "
- "is already 'off'.");
- ret = -1;
- goto out;
- }
-
- /* Check if global option is enabled, proceed only then */
- ret = dict_get_str_boolean (priv->opts,
- GLUSTERD_STORE_KEY_GANESHA_GLOBAL, _gf_false);
- if (ret == -1) {
- gf_msg_debug (this->name, 0, "Failed to get "
- "global option dict.");
- gf_asprintf (op_errstr, "The option "
- "nfs-ganesha should be "
- "enabled before setting ganesha.enable.");
- goto out;
- }
- if (!ret) {
- gf_asprintf (op_errstr, "The option "
- "nfs-ganesha should be "
- "enabled before setting ganesha.enable.");
- ret = -1;
- goto out;
- }
-
- /* *
- * Create the export file from the node where ganesha.enable "on"
- * is executed
- * */
- if (option) {
- ret = manage_export_config (volname, "on", op_errstr);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, 0,
- GD_MSG_EXPORT_FILE_CREATE_FAIL,
- "Failed to create"
- "export file for NFS-Ganesha\n");
- goto out;
- }
- }
-
- if (check_host_list()) {
- runner_add_args (&runner, "sh", GANESHA_PREFIX"/dbus-send.sh",
- CONFDIR, value, volname, NULL);
- ret = runner_run (&runner);
- if (ret) {
- gf_asprintf(op_errstr, "Dynamic export"
- " addition/deletion failed."
- " Please see log file for details");
- goto out;
- }
- }
-
- vol_opts = volinfo->dict;
- ret = dict_set_dynstr_with_alloc (vol_opts,
- "features.cache-invalidation", value);
- if (ret)
- gf_asprintf (op_errstr, "Cache-invalidation could not"
- " be set to %s.", value);
- ret = glusterd_store_volinfo (volinfo,
- GLUSTERD_VOLINFO_VER_AC_INCREMENT);
- if (ret)
- gf_asprintf (op_errstr, "failed to store volinfo for %s"
- , volinfo->volname);
-
-out:
- return ret;
-}
-
-int
-tear_down_cluster(gf_boolean_t run_teardown)
-{
- int ret = 0;
- runner_t runner = {0,};
- struct stat st = {0,};
- DIR *dir = NULL;
- struct dirent *entry = NULL;
- struct dirent scratch[2] = {{0,},};
- char path[PATH_MAX] = {0,};
-
- if (run_teardown) {
- runinit (&runner);
- runner_add_args (&runner, "sh",
- GANESHA_PREFIX"/ganesha-ha.sh", "teardown",
- CONFDIR, NULL);
- ret = runner_run(&runner);
- /* *
- * Remove all the entries in CONFDIR expect ganesha.conf and
- * ganesha-ha.conf
- */
- dir = sys_opendir (CONFDIR);
- if (!dir) {
- gf_msg_debug (THIS->name, 0, "Failed to open directory %s. "
- "Reason : %s", CONFDIR, strerror (errno));
- ret = 0;
- goto out;
- }
-
- GF_FOR_EACH_ENTRY_IN_DIR (entry, dir, scratch);
- while (entry) {
- snprintf (path, PATH_MAX, "%s/%s", CONFDIR, entry->d_name);
- ret = sys_lstat (path, &st);
- if (ret == -1) {
- gf_msg_debug (THIS->name, 0, "Failed to stat entry %s :"
- " %s", path, strerror (errno));
- goto out;
- }
-
- if (strcmp(entry->d_name, "ganesha.conf") == 0 ||
- strcmp(entry->d_name, "ganesha-ha.conf") == 0)
- gf_msg_debug (THIS->name, 0, " %s is not required"
- " to remove", path);
- else if (S_ISDIR (st.st_mode))
- ret = recursive_rmdir (path);
- else
- ret = sys_unlink (path);
-
- if (ret) {
- gf_msg_debug (THIS->name, 0, " Failed to remove %s. "
- "Reason : %s", path, strerror (errno));
- }
-
- gf_msg_debug (THIS->name, 0, "%s %s", ret ?
- "Failed to remove" : "Removed", entry->d_name);
- GF_FOR_EACH_ENTRY_IN_DIR (entry, dir, scratch);
- }
-
- ret = sys_closedir (dir);
- if (ret) {
- gf_msg_debug (THIS->name, 0, "Failed to close dir %s. Reason :"
- " %s", CONFDIR, strerror (errno));
- }
- }
-
-out:
- return ret;
-}
-
-
-int
-setup_cluster(gf_boolean_t run_setup)
-{
- int ret = 0;
- runner_t runner = {0,};
-
- if (run_setup) {
- runinit (&runner);
- runner_add_args (&runner, "sh", GANESHA_PREFIX"/ganesha-ha.sh",
- "setup", CONFDIR, NULL);
- ret = runner_run (&runner);
- }
- return ret;
-}
-
-
-static int
-teardown (gf_boolean_t run_teardown, char **op_errstr)
-{
- runner_t runner = {0,};
- int ret = 1;
- glusterd_volinfo_t *volinfo = NULL;
- glusterd_conf_t *priv = NULL;
- dict_t *vol_opts = NULL;
-
- priv = THIS->private;
-
- ret = tear_down_cluster (run_teardown);
- if (ret == -1) {
- gf_asprintf (op_errstr, "Cleanup of NFS-Ganesha"
- " HA config failed.");
- goto out;
- }
-
- runinit (&runner);
- runner_add_args (&runner, "sh", GANESHA_PREFIX"/ganesha-ha.sh",
- "cleanup", CONFDIR, NULL);
- ret = runner_run (&runner);
- if (ret)
- gf_msg_debug (THIS->name, 0, "Could not clean up"
- " NFS-Ganesha related config");
-
- cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) {
- vol_opts = volinfo->dict;
- /* All the volumes exported via NFS-Ganesha will be
- unexported, hence setting the appropriate keys */
- ret = dict_set_str (vol_opts, "features.cache-invalidation",
- "off");
- if (ret)
- gf_msg (THIS->name, GF_LOG_WARNING, errno,
- GD_MSG_DICT_SET_FAILED,
- "Could not set features.cache-invalidation "
- "to off for %s", volinfo->volname);
-
- ret = dict_set_str (vol_opts, "ganesha.enable", "off");
- if (ret)
- gf_msg (THIS->name, GF_LOG_WARNING, errno,
- GD_MSG_DICT_SET_FAILED,
- "Could not set ganesha.enable to off for %s",
- volinfo->volname);
-
- ret = glusterd_store_volinfo (volinfo,
- GLUSTERD_VOLINFO_VER_AC_INCREMENT);
- if (ret)
- gf_msg (THIS->name, GF_LOG_WARNING, 0,
- GD_MSG_VOLINFO_SET_FAIL,
- "failed to store volinfo for %s",
- volinfo->volname);
- }
-out:
- return ret;
-}
-
-int
-stop_ganesha (char **op_errstr) {
-
- int ret = 0;
- runner_t runner = {0,};
-
- runinit (&runner);
- runner_add_args (&runner, "sh", GANESHA_PREFIX"/ganesha-ha.sh",
- "--setup-ganesha-conf-files", CONFDIR, "no", NULL);
- ret = runner_run (&runner);
- if (ret) {
- gf_asprintf (op_errstr, "removal of symlink ganesha.conf "
- "in /etc/ganesha failed");
- }
-
- if (check_host_list ()) {
- ret = manage_service ("stop");
- if (ret)
- gf_asprintf (op_errstr, "NFS-Ganesha service could not"
- "be stopped.");
- }
- return ret;
-
-}
-
-int
-start_ganesha (char **op_errstr)
-{
- int ret = -1;
- dict_t *vol_opts = NULL;
- glusterd_volinfo_t *volinfo = NULL;
- glusterd_conf_t *priv = NULL;
- runner_t runner = {0,};
-
- priv = THIS->private;
- GF_ASSERT (priv);
-
- cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) {
- vol_opts = volinfo->dict;
- /* Gluster-nfs has to be disabled across the trusted pool */
- /* before attempting to start nfs-ganesha */
- ret = dict_set_str (vol_opts, NFS_DISABLE_MAP_KEY, "on");
- if (ret)
- goto out;
-
- ret = glusterd_store_volinfo (volinfo,
- GLUSTERD_VOLINFO_VER_AC_INCREMENT);
- if (ret) {
- *op_errstr = gf_strdup ("Failed to store the "
- "Volume information");
- goto out;
- }
- }
-
- /* If the nfs svc is not initialized it means that the service is not
- * running, hence we can skip the process of stopping gluster-nfs
- * service
- */
- if (priv->nfs_svc.inited) {
- ret = priv->nfs_svc.stop (&(priv->nfs_svc), SIGKILL);
- if (ret) {
- ret = -1;
- gf_asprintf (op_errstr, "Gluster-NFS service could"
- "not be stopped, exiting.");
- goto out;
- }
- }
-
- if (check_host_list()) {
- runinit (&runner);
- runner_add_args (&runner, "sh", GANESHA_PREFIX"/ganesha-ha.sh",
- "--setup-ganesha-conf-files", CONFDIR, "yes",
- NULL);
- ret = runner_run (&runner);
- if (ret) {
- gf_asprintf (op_errstr, "creation of symlink ganesha.conf "
- "in /etc/ganesha failed");
- goto out;
- }
- ret = manage_service ("start");
- if (ret)
- gf_asprintf (op_errstr, "NFS-Ganesha failed to start."
- "Please see log file for details");
- }
-
-out:
- return ret;
-}
-
-static int
-pre_setup (gf_boolean_t run_setup, char **op_errstr)
-{
- int ret = 0;
-
- ret = check_host_list();
-
- if (ret) {
- ret = setup_cluster(run_setup);
- if (ret == -1)
- gf_asprintf (op_errstr, "Failed to set up HA "
- "config for NFS-Ganesha. "
- "Please check the log file for details");
- }
-
- return ret;
-}
-
-int
-glusterd_handle_ganesha_op (dict_t *dict, char **op_errstr,
- char *key, char *value)
-{
-
- int32_t ret = -1;
- gf_boolean_t option = _gf_false;
-
- GF_ASSERT (dict);
- GF_ASSERT (op_errstr);
- GF_ASSERT (key);
- GF_ASSERT (value);
-
-
- if (strcmp (key, "ganesha.enable") == 0) {
- ret = ganesha_manage_export (dict, value, op_errstr);
- if (ret < 0)
- goto out;
- }
-
- /* It is possible that the key might not be set */
- ret = gf_string2boolean (value, &option);
- if (ret == -1) {
- gf_asprintf (op_errstr, "Invalid value in key-value pair.");
- goto out;
- }
-
- if (strcmp (key, GLUSTERD_STORE_KEY_GANESHA_GLOBAL) == 0) {
- /* *
- * The set up/teardown of pcs cluster should be performed only
- * once. This will done on the node in which the cli command
- * 'gluster nfs-ganesha <enable/disable>' got executed. So that
- * node should part of ganesha HA cluster
- */
- if (option) {
- ret = pre_setup (is_origin_glusterd (dict), op_errstr);
- if (ret < 0)
- goto out;
- } else {
- ret = teardown (is_origin_glusterd (dict), op_errstr);
- if (ret < 0)
- goto out;
- }
- }
-
-out:
- return ret;
-}
-