diff options
Diffstat (limited to 'glusterfsd/src')
| -rw-r--r-- | glusterfsd/src/Makefile.am | 6 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 241 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.h | 2 | 
3 files changed, 246 insertions, 3 deletions
diff --git a/glusterfsd/src/Makefile.am b/glusterfsd/src/Makefile.am index 66ede7a336f..0f83622bb37 100644 --- a/glusterfsd/src/Makefile.am +++ b/glusterfsd/src/Makefile.am @@ -10,8 +10,10 @@ noinst_HEADERS = glusterfsd.h glusterfsd-mem-types.h glusterfsd-messages.h  AM_CPPFLAGS = $(GF_CPPFLAGS) \  	-I$(top_srcdir)/libglusterfs/src -DDATADIR=\"$(localstatedir)\" \ -	-DCONFDIR=\"$(sysconfdir)/glusterfs\" \ -	-I$(top_srcdir)/rpc/rpc-lib/src -I$(top_srcdir)/rpc/xdr/src +	-DCONFDIR=\"$(sysconfdir)/glusterfs\" $(GF_GLUSTERFS_CFLAGS) \ +	-DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" \ +	-I$(top_srcdir)/rpc/rpc-lib/src -I$(top_srcdir)/rpc/xdr/src \ +	-I$(top_srcdir)/xlators/nfs/server/src  AM_CFLAGS = -Wall $(GF_CFLAGS) diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index c410ffd40d9..9a174c4bdae 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -19,6 +19,7 @@  #include <netdb.h>  #include <signal.h>  #include <libgen.h> +#include <dlfcn.h>  #include <sys/utsname.h> @@ -69,6 +70,8 @@  #include "rpc-clnt.h"  #include "syncop.h"  #include "client_t.h" +#include "netgroups.h" +#include "exports.h"  #include "daemon.h" @@ -152,6 +155,12 @@ static struct argp_option gf_options[] = {           "Mount the filesystem with POSIX ACL support"},          {"selinux", ARGP_SELINUX_KEY, 0, 0,           "Enable SELinux label (extened attributes) support on inodes"}, + +        {"print-netgroups", ARGP_PRINT_NETGROUPS, "NETGROUP-FILE", 0, +         "Validate the netgroups file and print it out"}, +        {"print-exports", ARGP_PRINT_EXPORTS, "EXPORTS-FILE", 0, +        "Validate the exports file and print it out"}, +          {"volfile-max-fetch-attempts", ARGP_VOLFILE_MAX_FETCH_ATTEMPTS, "0",           OPTION_HIDDEN, "Maximum number of attempts to fetch the volfile"},          {"aux-gfid-mount", ARGP_AUX_GFID_MOUNT_KEY, 0, 0, @@ -787,6 +796,14 @@ parse_opts (int key, char *arg, struct argp_state *state)                  cmd_args->worm = 1;                  break; +        case ARGP_PRINT_NETGROUPS: +                cmd_args->print_netgroups = arg; +                break; + +        case ARGP_PRINT_EXPORTS: +                cmd_args->print_exports = arg; +                break; +          case ARGP_MAC_COMPAT_KEY:                  if (!arg)                          arg = "on"; @@ -1519,6 +1536,195 @@ gf_check_and_set_mem_acct (int argc, char *argv[])          }  } +/** + * print_exports_file - Print out & verify the syntax + *                      of the exports file specified + *                      in the parameter. + * + * @exports_file : Path of the exports file to print & verify + * + * @return : success: 0 when successfully parsed + *           failure: 1 when failed to parse one or more lines + *                   -1 when other critical errors (dlopen () etc) + * Critical errors are treated differently than parse errors. Critical + * errors terminate the program immediately here and print out different + * error messages. Hence there are different return values. + */ +int +print_exports_file (const char *exports_file) +{ +        void                   *libhandle = NULL; +        char                   *libpathfull = NULL; +        struct exports_file    *file = NULL; +        int                     ret = 0; + +        int  (*exp_file_parse)(const char *filepath, +                               struct exports_file **expfile, +                               struct mount3_state *ms) = NULL; +        void (*exp_file_print)(const struct exports_file *file) = NULL; +        void (*exp_file_deinit)(struct exports_file *ptr) = NULL; + +        /* XLATORDIR passed through a -D flag to GCC */ +        ret = gf_asprintf (&libpathfull, "%s/%s/server.so", XLATORDIR, +                           "nfs"); +        if (ret < 0) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, "asprintf () failed."); +                ret = -1; +                goto out; +        } + +        /* Load up the library */ +        libhandle = dlopen (libpathfull, RTLD_NOW); +        if (!libhandle) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error loading NFS server library : " +                        "%s\n", dlerror ()); +                ret = -1; +                goto out; +        } + +        /* Load up the function */ +        exp_file_parse = dlsym (libhandle, "exp_file_parse"); +        if (!exp_file_parse) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error finding function exp_file_parse " +                        "in symbol."); +                ret = -1; +                goto out; +        } + +        /* Parse the file */ +        ret = exp_file_parse (exports_file, &file, NULL); +        if (ret < 0) { +                ret = 1;        /* This means we failed to parse */ +                goto out; +        } + +        /* Load up the function */ +        exp_file_print = dlsym (libhandle, "exp_file_print"); +        if (!exp_file_print) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error finding function exp_file_print in symbol."); +                ret = -1; +                goto out; +        } + +        /* Print it out to screen */ +        exp_file_print (file); + +        /* Load up the function */ +        exp_file_deinit = dlsym (libhandle, "exp_file_deinit"); +        if (!exp_file_deinit) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error finding function exp_file_deinit in lib."); +                ret = -1; +                goto out; +        } + +        /* Free the file */ +        exp_file_deinit (file); + +out: +        if (libhandle) +                dlclose(libhandle); +        GF_FREE (libpathfull); +        return ret; +} + + +/** + * print_netgroups_file - Print out & verify the syntax + *                        of the netgroups file specified + *                        in the parameter. + * + * @netgroups_file : Path of the netgroups file to print & verify + * @return : success: 0 when successfully parsed + *           failure: 1 when failed to parse one more more lines + *                   -1 when other critical errors (dlopen () etc) + * + * We have multiple returns here because for critical errors, we abort + * operations immediately and exit. For example, if we can't load the + * NFS server library, then we have a real bad problem so we don't continue. + * Or if we cannot allocate anymore memory, we don't want to continue. Also, + * we want to print out a different error messages based on the ret value. + */ +int +print_netgroups_file (const char *netgroups_file) +{ +        void                   *libhandle = NULL; +        char                   *libpathfull = NULL; +        struct netgroups_file  *file = NULL; +        int                     ret = 0; + +        struct netgroups_file  *(*ng_file_parse)(const char *file_path) = NULL; +        void         (*ng_file_print)(const struct netgroups_file *file) = NULL; +        void         (*ng_file_deinit)(struct netgroups_file *ptr) = NULL; + +        /* XLATORDIR passed through a -D flag to GCC */ +        ret = gf_asprintf (&libpathfull, "%s/%s/server.so", XLATORDIR, +                        "nfs"); +        if (ret < 0) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, "asprintf () failed."); +                ret = -1; +                goto out; +        } +        /* Load up the library */ +        libhandle = dlopen (libpathfull, RTLD_NOW); +        if (!libhandle) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error loading NFS server library : %s\n", dlerror ()); +                ret = -1; +                goto out; +        } + +        /* Load up the function */ +        ng_file_parse = dlsym (libhandle, "ng_file_parse"); +        if (!ng_file_parse) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error finding function ng_file_parse in symbol."); +                ret = -1; +                goto out; +        } + +        /* Parse the file */ +        file = ng_file_parse (netgroups_file); +        if (!file) { +                ret = 1;        /* This means we failed to parse */ +                goto out; +        } + +        /* Load up the function */ +        ng_file_print = dlsym (libhandle, "ng_file_print"); +        if (!ng_file_print) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error finding function ng_file_print in symbol."); +                ret = -1; +                goto out; +        } + +        /* Print it out to screen */ +        ng_file_print (file); + +        /* Load up the function */ +        ng_file_deinit = dlsym (libhandle, "ng_file_deinit"); +        if (!ng_file_deinit) { +                gf_log ("glusterfs", GF_LOG_CRITICAL, +                        "Error finding function ng_file_deinit in lib."); +                ret = -1; +                goto out; +        } + +        /* Free the file */ +        ng_file_deinit (file); + +out: +        if (libhandle) +                dlclose(libhandle); +        GF_FREE (libpathfull); +        return ret; +} + +  int  parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)  { @@ -1539,6 +1745,22 @@ parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)          }          argp_parse (&argp, argc, argv, ARGP_IN_ORDER, NULL, cmd_args); +        if (cmd_args->print_netgroups) { +                /* When this option is set we don't want to do anything else +                 * except for printing & verifying the netgroups file. +                 */ +                ret = 0; +                goto out; +        } + +        if (cmd_args->print_exports) { +                /* When this option is set we don't want to do anything else +                 * except for printing & verifying the exports file. +                  */ +                ret = 0; +                goto out; +        } +          ctx->secure_mgmt = cmd_args->secure_mgmt; @@ -2006,6 +2228,7 @@ main (int argc, char *argv[])          glusterfs_ctx_t  *ctx = NULL;          int               ret = -1;          char              cmdlinestr[PATH_MAX] = {0,}; +        cmd_args_t       *cmd = NULL;  	gf_check_and_set_mem_acct (argc, argv); @@ -2029,6 +2252,23 @@ main (int argc, char *argv[])          ret = parse_cmdline (argc, argv, ctx);          if (ret)                  goto out; +        cmd = &ctx->cmd_args; +        if (cmd->print_netgroups) { +                /* If this option is set we want to print & verify the file, +                 * set the return value (exit code in this case) and exit. +                 */ +                ret =  print_netgroups_file (cmd->print_netgroups); +                goto out; +        } + +        if (cmd->print_exports) { +                /* If this option is set we want to print & verify the file, +                 * set the return value (exit code in this case) +                 * and exit. +                 */ +                ret = print_exports_file (cmd->print_exports); +                goto out; +        }          ret = logging_init (ctx, argv[0]);          if (ret) @@ -2074,6 +2314,5 @@ main (int argc, char *argv[])  out:  //        glusterfs_ctx_destroy (ctx); -          return ret;  } diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index 41f7b1d9a38..a16e0a65254 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -52,6 +52,8 @@ enum argp_option_keys {          ARGP_SOCK_FILE_KEY                = 'S',          ARGP_NO_DAEMON_KEY                = 'N',          ARGP_RUN_ID_KEY                   = 'r', +        ARGP_PRINT_NETGROUPS              = 'n', +        ARGP_PRINT_EXPORTS                = 'e',          ARGP_DEBUG_KEY                    = 133,          ARGP_NEGATIVE_TIMEOUT_KEY         = 134,          ARGP_ENTRY_TIMEOUT_KEY            = 135,  | 
