You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1892 lines
53 KiB
1892 lines
53 KiB
diff -up nfs-utils-1.3.0/configure.ac.orig nfs-utils-1.3.0/configure.ac |
|
--- nfs-utils-1.3.0/configure.ac.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/configure.ac 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -23,6 +23,12 @@ AC_ARG_WITH(statedir, |
|
statedir=$withval, |
|
statedir=/var/lib/nfs) |
|
AC_SUBST(statedir) |
|
+AC_ARG_WITH(nfsconfig, |
|
+ [AC_HELP_STRING([--with-nfsconfig=/config/file], |
|
+ [use general config file /config/file @<:@default=/etc/nfs.conf@:>@])], |
|
+ nfsconfig=$withval, |
|
+ nfsconfig=/etc/nfs.conf) |
|
+ AC_SUBST(nfsconfig) |
|
AC_ARG_WITH(statdpath, |
|
[AC_HELP_STRING([--with-statdpath=/foo], |
|
[define the statd state dir as /foo instead of the NFS statedir @<:@default=/var/lib/nfs@:>@])], |
|
@@ -442,6 +448,7 @@ dnl Export some path names to config.h |
|
dnl ************************************************************* |
|
AC_DEFINE_UNQUOTED(NFS_STATEDIR, "$statedir", [This defines the location of the NFS state files. Warning: this must match definitions in config.mk!]) |
|
AC_DEFINE_UNQUOTED(NSM_DEFAULT_STATEDIR, "$statdpath", [Define this to the pathname where statd keeps its state file]) |
|
+AC_DEFINE_UNQUOTED(NFS_CONFFILE, "$nfsconfig", [This defines the location of NFS daemon config file]) |
|
|
|
if test "x$cross_compiling" = "xno"; then |
|
CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD-"$CFLAGS"} |
|
diff -up nfs-utils-1.3.0/support/include/conffile.h.orig nfs-utils-1.3.0/support/include/conffile.h |
|
--- nfs-utils-1.3.0/support/include/conffile.h.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/support/include/conffile.h 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -35,6 +35,8 @@ |
|
|
|
#include <sys/queue.h> |
|
#include <ctype.h> |
|
+#include <stdint.h> |
|
+#include <stdbool.h> |
|
|
|
struct conf_list_node { |
|
TAILQ_ENTRY(conf_list_node) link; |
|
@@ -56,6 +58,7 @@ extern struct sockaddr *conf_get_address |
|
extern struct conf_list *conf_get_list(char *, char *); |
|
extern struct conf_list *conf_get_tag_list(char *, char *); |
|
extern int conf_get_num(char *, char *, int); |
|
+extern _Bool conf_get_bool(char *, char *, _Bool); |
|
extern char *conf_get_str(char *, char *); |
|
extern char *conf_get_section(char *, char *, char *); |
|
extern void conf_init(void); |
|
diff -up nfs-utils-1.3.0/support/include/xlog.h.orig nfs-utils-1.3.0/support/include/xlog.h |
|
--- nfs-utils-1.3.0/support/include/xlog.h.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/support/include/xlog.h 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -41,6 +41,7 @@ void xlog_stderr(int on); |
|
void xlog_syslog(int on); |
|
void xlog_config(int fac, int on); |
|
void xlog_sconfig(char *, int on); |
|
+void xlog_from_conffile(char *); |
|
int xlog_enabled(int fac); |
|
void xlog(int fac, const char *fmt, ...); |
|
void xlog_warn(const char *fmt, ...); |
|
diff -up nfs-utils-1.3.0/support/nfs/conffile.c.orig nfs-utils-1.3.0/support/nfs/conffile.c |
|
--- nfs-utils-1.3.0/support/nfs/conffile.c.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/support/nfs/conffile.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -52,6 +52,7 @@ |
|
#pragma GCC visibility push(hidden) |
|
|
|
static void conf_load_defaults(void); |
|
+static int conf_load(int trans, char *path); |
|
static int conf_set(int , char *, char *, char *, |
|
char *, int , int ); |
|
|
|
@@ -107,8 +108,6 @@ struct conf_binding { |
|
char *conf_path; |
|
LIST_HEAD (conf_bindings, conf_binding) conf_bindings[256]; |
|
|
|
-static char *conf_addr; |
|
- |
|
static __inline__ u_int8_t |
|
conf_hash(char *s) |
|
{ |
|
@@ -213,7 +212,7 @@ static void |
|
conf_parse_line(int trans, char *line, size_t sz) |
|
{ |
|
char *val, *ptr; |
|
- size_t i, valsize; |
|
+ size_t i; |
|
size_t j; |
|
static char *section = 0; |
|
static char *arg = 0; |
|
@@ -300,18 +299,32 @@ conf_parse_line(int trans, char *line, s |
|
} |
|
line[strcspn (line, " \t=")] = '\0'; |
|
val = line + i + 1 + strspn (line + i + 1, " \t"); |
|
- valsize = 0; |
|
- while (val[valsize++]); |
|
|
|
- /* Skip trailing spaces and comments */ |
|
- for (j = 0; j < valsize; j++) { |
|
- if (val[j] == '#' || val[j] == ';' || isspace(val[j])) { |
|
- val[j] = '\0'; |
|
- break; |
|
+ if (val[0] == '"') { |
|
+ val ++; |
|
+ j = strcspn(val, "\""); |
|
+ val[j] = 0; |
|
+ } else if (val[0] == '\'') { |
|
+ val ++; |
|
+ j = strcspn(val, "'"); |
|
+ val[j] = 0; |
|
+ } else { |
|
+ /* Skip trailing spaces and comments */ |
|
+ for (j = 0; val[j]; j++) { |
|
+ if ((val[j] == '#' || val[j] == ';') |
|
+ && (j == 0 || isspace(val[j-1]))) { |
|
+ val[j] = '\0'; |
|
+ break; |
|
+ } |
|
} |
|
+ while (j && isspace(val[j-1])) |
|
+ val[--j] = '\0'; |
|
} |
|
- /* XXX Perhaps should we not ignore errors? */ |
|
- conf_set(trans, section, arg, line, val, 0, 0); |
|
+ if (strcasecmp(line, "include") == 0) |
|
+ conf_load(trans, val); |
|
+ else |
|
+ /* XXX Perhaps should we not ignore errors? */ |
|
+ conf_set(trans, section, arg, line, val, 0, 0); |
|
return; |
|
} |
|
} |
|
@@ -368,23 +381,18 @@ conf_init (void) |
|
conf_reinit(); |
|
} |
|
|
|
-/* Open the config file and map it into our address space, then parse it. */ |
|
-void |
|
-conf_reinit(void) |
|
+static int |
|
+conf_load(int trans, char *path) |
|
{ |
|
- struct conf_binding *cb = 0; |
|
- int fd, trans; |
|
- unsigned int i; |
|
- size_t sz; |
|
- char *new_conf_addr = 0; |
|
struct stat sb; |
|
+ if ((stat (path, &sb) == 0) || (errno != ENOENT)) { |
|
+ char *new_conf_addr; |
|
+ size_t sz = sb.st_size; |
|
+ int fd = open (path, O_RDONLY, 0); |
|
|
|
- if ((stat (conf_path, &sb) == 0) || (errno != ENOENT)) { |
|
- sz = sb.st_size; |
|
- fd = open (conf_path, O_RDONLY, 0); |
|
if (fd == -1) { |
|
- xlog_warn("conf_reinit: open (\"%s\", O_RDONLY) failed", conf_path); |
|
- return; |
|
+ xlog_warn("conf_reinit: open (\"%s\", O_RDONLY) failed", path); |
|
+ return -1; |
|
} |
|
|
|
new_conf_addr = malloc(sz); |
|
@@ -396,39 +404,46 @@ conf_reinit(void) |
|
/* XXX I assume short reads won't happen here. */ |
|
if (read (fd, new_conf_addr, sz) != (int)sz) { |
|
xlog_warn("conf_reinit: read (%d, %p, %lu) failed", |
|
- fd, new_conf_addr, (unsigned long)sz); |
|
+ fd, new_conf_addr, (unsigned long)sz); |
|
goto fail; |
|
} |
|
close(fd); |
|
|
|
- trans = conf_begin(); |
|
/* XXX Should we not care about errors and rollback? */ |
|
conf_parse(trans, new_conf_addr, sz); |
|
+ free(new_conf_addr); |
|
+ return 0; |
|
+ fail: |
|
+ close(fd); |
|
+ free(new_conf_addr); |
|
} |
|
- else |
|
- trans = conf_begin(); |
|
+ return -1; |
|
+} |
|
+ |
|
+/* Open the config file and map it into our address space, then parse it. */ |
|
+void |
|
+conf_reinit(void) |
|
+{ |
|
+ struct conf_binding *cb = 0; |
|
+ int trans; |
|
+ unsigned int i; |
|
+ |
|
+ trans = conf_begin(); |
|
+ if (conf_load(trans, conf_path) < 0) |
|
+ return; |
|
|
|
/* Load default configuration values. */ |
|
conf_load_defaults(); |
|
|
|
/* Free potential existing configuration. */ |
|
- if (conf_addr) { |
|
- for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++) { |
|
- cb = LIST_FIRST (&conf_bindings[i]); |
|
- for (; cb; cb = LIST_FIRST (&conf_bindings[i])) |
|
- conf_remove_now(cb->section, cb->tag); |
|
- } |
|
- free (conf_addr); |
|
+ for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++) { |
|
+ cb = LIST_FIRST (&conf_bindings[i]); |
|
+ for (; cb; cb = LIST_FIRST (&conf_bindings[i])) |
|
+ conf_remove_now(cb->section, cb->tag); |
|
} |
|
|
|
conf_end(trans, 1); |
|
- conf_addr = new_conf_addr; |
|
return; |
|
- |
|
-fail: |
|
- if (new_conf_addr) |
|
- free(new_conf_addr); |
|
- close (fd); |
|
} |
|
|
|
/* |
|
@@ -446,6 +461,38 @@ conf_get_num(char *section, char *tag, i |
|
return def; |
|
} |
|
|
|
+/* |
|
+ * Return the Boolean value denoted by TAG in section SECTION, or DEF |
|
+ * if that tags does not exist. |
|
+ * FALSE is returned for case-insensitve comparisons with 0, f, false, n, no, off |
|
+ * TRUE is returned for 1, t, true, y, yes, on |
|
+ * A failure to match one of these results in DEF |
|
+ */ |
|
+_Bool |
|
+conf_get_bool(char *section, char *tag, _Bool def) |
|
+{ |
|
+ char *value = conf_get_str(section, tag); |
|
+ |
|
+ if (!value) |
|
+ return def; |
|
+ if (strcasecmp(value, "1") == 0 || |
|
+ strcasecmp(value, "t") == 0 || |
|
+ strcasecmp(value, "true") == 0 || |
|
+ strcasecmp(value, "y") == 0 || |
|
+ strcasecmp(value, "yes") == 0 || |
|
+ strcasecmp(value, "on") == 0) |
|
+ return true; |
|
+ |
|
+ if (strcasecmp(value, "0") == 0 || |
|
+ strcasecmp(value, "f") == 0 || |
|
+ strcasecmp(value, "false") == 0 || |
|
+ strcasecmp(value, "n") == 0 || |
|
+ strcasecmp(value, "no") == 0 || |
|
+ strcasecmp(value, "off") == 0) |
|
+ return false; |
|
+ return def; |
|
+} |
|
+ |
|
/* Validate X according to the range denoted by TAG in section SECTION. */ |
|
int |
|
conf_match_num(char *section, char *tag, int x) |
|
@@ -476,12 +523,24 @@ char * |
|
conf_get_str(char *section, char *tag) |
|
{ |
|
struct conf_binding *cb; |
|
- |
|
+retry: |
|
cb = LIST_FIRST (&conf_bindings[conf_hash (section)]); |
|
for (; cb; cb = LIST_NEXT (cb, link)) { |
|
if (strcasecmp (section, cb->section) == 0 |
|
- && strcasecmp (tag, cb->tag) == 0) |
|
+ && strcasecmp (tag, cb->tag) == 0) { |
|
+ if (cb->value[0] == '$') { |
|
+ /* expand $name from [environment] section, |
|
+ * or from environment |
|
+ */ |
|
+ char *env = getenv(cb->value+1); |
|
+ if (env && *env) |
|
+ return env; |
|
+ section = "environment"; |
|
+ tag = cb->value + 1; |
|
+ goto retry; |
|
+ } |
|
return cb->value; |
|
+ } |
|
} |
|
return 0; |
|
} |
|
@@ -705,6 +764,8 @@ conf_set(int transaction, char *section, |
|
{ |
|
struct conf_trans *node; |
|
|
|
+ if (!value || !*value) |
|
+ return 0; |
|
node = conf_trans_node(transaction, CONF_SET); |
|
if (!node) |
|
return 1; |
|
diff -up nfs-utils-1.3.0/support/nfs/xlog.c.orig nfs-utils-1.3.0/support/nfs/xlog.c |
|
--- nfs-utils-1.3.0/support/nfs/xlog.c.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/support/nfs/xlog.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -29,6 +29,7 @@ |
|
#include <syslog.h> |
|
#include <errno.h> |
|
#include "nfslib.h" |
|
+#include "conffile.h" |
|
|
|
#undef VERBOSE_PRINTF |
|
|
|
@@ -125,6 +126,19 @@ xlog_sconfig(char *kind, int on) |
|
xlog_config(tbl->df_fac, on); |
|
} |
|
|
|
+void |
|
+xlog_from_conffile(char *service) |
|
+{ |
|
+ struct conf_list *kinds; |
|
+ struct conf_list_node *n; |
|
+ |
|
+ kinds = conf_get_list(service, "debug"); |
|
+ if (!kinds || !kinds->cnt) |
|
+ return; |
|
+ TAILQ_FOREACH(n, &(kinds->fields), link) |
|
+ xlog_sconfig(n->field, 1); |
|
+} |
|
+ |
|
int |
|
xlog_enabled(int fac) |
|
{ |
|
diff -up nfs-utils-1.3.0/systemd/Makefile.am.orig nfs-utils-1.3.0/systemd/Makefile.am |
|
--- nfs-utils-1.3.0/systemd/Makefile.am.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/systemd/Makefile.am 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -20,7 +20,9 @@ unit_files = \ |
|
proc-fs-nfsd.mount \ |
|
var-lib-nfs-rpc_pipefs.mount |
|
|
|
-EXTRA_DIST = $(unit_files) |
|
+man5_MANS = nfs.conf.man |
|
+man7_MANS = nfs.systemd.man |
|
+EXTRA_DIST = $(unit_files) $(man5_MANS) $(man7_MANS) |
|
|
|
unit_dir = /usr/lib/systemd/system |
|
|
|
diff -up nfs-utils-1.3.0/systemd/nfs.conf.man.orig nfs-utils-1.3.0/systemd/nfs.conf.man |
|
--- nfs-utils-1.3.0/systemd/nfs.conf.man.orig 2017-03-28 13:43:53.000000000 -0400 |
|
+++ nfs-utils-1.3.0/systemd/nfs.conf.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -0,0 +1,231 @@ |
|
+.TH NFS.CONF 5 |
|
+.SH NAME |
|
+nfs.conf \- general configuration for NFS daemons and tools |
|
+.SH SYNOPSIS |
|
+.I /etc/nfs.conf |
|
+.SH DESCRIPTION |
|
+.PP |
|
+This file contains site-specific configuration for various NFS daemons |
|
+and other processes. Most configuration can also be passed to |
|
+processes via command line arguments, but it can be more convenient to |
|
+have a central file. In particular, this encourages consistent |
|
+configuration across different processes. |
|
+.PP |
|
+When command line options are provided, they override values set in |
|
+this file. When this file does not specify a particular parameter, |
|
+and no command line option is provided, each tool provides its own |
|
+default values. |
|
+.PP |
|
+The file format supports multiple sections, each of which can contain |
|
+multiple value assignments. A section is introduced by a line |
|
+containing the section name enclosed in square brackets, so |
|
+.RS |
|
+.B [global] |
|
+.RE |
|
+would introduce a section called |
|
+.BR global . |
|
+A value assignment is a single line that has the name of the value, an |
|
+equals sign, and a setting for the value, so |
|
+.RS |
|
+.B threads = 4 |
|
+.RE |
|
+would set the value named |
|
+.B threads |
|
+in the current section to |
|
+.BR 4 . |
|
+Leading and trailing spaces and tab |
|
+are ignored, as are spaces and tabs surrounding the equals sign. |
|
+Single and double quotes surrounding the assigned value are also |
|
+removed. If the resulting string is empty, the whole assignment |
|
+is ignored. |
|
+.PP |
|
+Any line starting with |
|
+.RB \*(lq # \*(rq |
|
+or |
|
+.RB \*(lq ; \*(rq |
|
+is ignored, as is any blank line. |
|
+.PP |
|
+If the assigned value started with a |
|
+.RB \*(lq $ \*(rq |
|
+then the remainder is treated as a name and looked for in the section |
|
+.B [environment] |
|
+or in the processes environment (see |
|
+.BR environ (7)). |
|
+The value found is used for this value. |
|
+.PP |
|
+The value name |
|
+.B include |
|
+is special. If a section contains |
|
+.RS |
|
+.B include = /some/file/name |
|
+.RE |
|
+then the named file will be read, and any value assignments found |
|
+there-in will be added to the current section. If the file contains |
|
+section headers, then new sections will be created just as if the |
|
+included file appeared in place of the |
|
+.B include |
|
+line. |
|
+.PP |
|
+Lookup of section and value names is case-insensitive. |
|
+ |
|
+Where a Boolean value is expected, any of |
|
+.BR true , |
|
+.BR t , |
|
+.BR yes , |
|
+.BR y , |
|
+.BR on ", or" |
|
+.B 1 |
|
+can be used for "true", while |
|
+.BR false , |
|
+.BR f , |
|
+.BR no , |
|
+.BR n , |
|
+.BR off ", or" |
|
+.B 0 |
|
+can be used for "false". Comparisons are case-insensitive. |
|
+ |
|
+.SH SECTIONS |
|
+The following sections are known to various programs, and can contain |
|
+the given named values. Most sections can also contain a |
|
+.B debug |
|
+value, which can be one or more from the list |
|
+.BR general , |
|
+.BR call , |
|
+.BR auth , |
|
+.BR parse , |
|
+.BR all . |
|
+When a list is given, the members should be comma-separated. |
|
+.TP |
|
+.B nfsdcltrack |
|
+Recognized values: |
|
+.BR storagedir . |
|
+ |
|
+The |
|
+.B nfsdcltrack |
|
+program is run directly by the Linux kernel and there is no |
|
+opportunity to provide command line arguments, so the configuration |
|
+file is the only way to configure this program. See |
|
+.BR nfsdcltrack (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B nfsd |
|
+Recognized values: |
|
+.BR threads , |
|
+.BR host , |
|
+.BR port , |
|
+.BR grace-time , |
|
+.BR lease-time , |
|
+.BR udp , |
|
+.BR tcp , |
|
+.BR vers2 , |
|
+.BR vers3 , |
|
+.BR vers4 , |
|
+.BR vers4.0 , |
|
+.BR vers4.1 , |
|
+.BR vers4.2 , |
|
+.BR rdma . |
|
+ |
|
+Version and protocol values are Boolean values as described above, |
|
+and are also used by |
|
+.BR rpc.mountd . |
|
+Threads and the two times are integers. |
|
+.B port |
|
+and |
|
+.B rdma |
|
+are service names or numbers. See |
|
+.BR rpc.nfsd (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B mountd |
|
+Recognized values: |
|
+.BR manage-gids , |
|
+.BR descriptors , |
|
+.BR port , |
|
+.BR threads , |
|
+.BR reverse-lookup , |
|
+.BR state-directory-path , |
|
+.BR ha-callout . |
|
+ |
|
+These, together with the protocol and version values in the |
|
+.B [nfsd] |
|
+section, are used to configure mountd. See |
|
+.BR rpc.mountd (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B statd |
|
+Recognized values: |
|
+.BR port , |
|
+.BR outgoing-port , |
|
+.BR name , |
|
+.BR state-directory-path , |
|
+.BR ha-callout . |
|
+ |
|
+See |
|
+.BR rpc.statd (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B lockd |
|
+Recognized values: |
|
+.B port |
|
+and |
|
+.BR udp-port . |
|
+ |
|
+See |
|
+.BR rpc.statd (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B sm-notify |
|
+Recognized values: |
|
+.BR retry-time , |
|
+.BR outgoing-port ", and" |
|
+.BR outgoing-addr . |
|
+ |
|
+See |
|
+.BR sm-notify (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B gssd |
|
+Recognized values: |
|
+.BR use-memcache , |
|
+.BR use-machine-creds , |
|
+.BR avoid-dns , |
|
+.BR limit-to-legacy-enctypes , |
|
+.BR context-timeout , |
|
+.BR rpc-timeout , |
|
+.BR pipefs-directory , |
|
+.BR keytab-file , |
|
+.BR cred-cache-directory , |
|
+.BR preferred-realm . |
|
+ |
|
+See |
|
+.BR rpc.gssd (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B svcgssd |
|
+Recognized values: |
|
+.BR principal . |
|
+ |
|
+See |
|
+.BR rpc.svcgssd (8) |
|
+for details. |
|
+ |
|
+.TP |
|
+.B exportfs |
|
+Only |
|
+.B debug= |
|
+is recognized. |
|
+ |
|
+.SH FILES |
|
+.I /etc/nfs.conf |
|
+.SH SEE ALSO |
|
+.BR nfsdcltrack (8), |
|
+.BR rpc.nfsd (8), |
|
+.BR rpc.mountd (8), |
|
+.BR nfsmount.conf (5). |
|
diff -up nfs-utils-1.3.0/systemd/nfs.systemd.man.orig nfs-utils-1.3.0/systemd/nfs.systemd.man |
|
--- nfs-utils-1.3.0/systemd/nfs.systemd.man.orig 2017-03-28 13:45:11.000000000 -0400 |
|
+++ nfs-utils-1.3.0/systemd/nfs.systemd.man 2017-03-28 13:45:11.000000000 -0400 |
|
@@ -0,0 +1,167 @@ |
|
+.TH NFS.SYSTEMD 7 |
|
+.SH NAME |
|
+nfs.systemd \- managing NFS services through systemd. |
|
+.SH SYNOPSIS |
|
+nfs-utils.service |
|
+.br |
|
+nfs-server.service |
|
+.br |
|
+nfs-client.target |
|
+.br |
|
+.I etc |
|
+.SH DESCRIPTION |
|
+The |
|
+.I nfs-utils |
|
+package provides a suite of |
|
+.I systemd |
|
+unit files which allow the various services to be started and |
|
+managed. These unit files ensure that the services are started in the |
|
+correct order, and the prerequisites are active before dependant |
|
+services start. As there are quite few unit files, it is not |
|
+immediately obvious how best to achieve certain results. The |
|
+following subsections attempt to cover the issues that are most likely |
|
+to come up. |
|
+.SS Configuration |
|
+The standard systemd unit files do not provide any easy way to pass |
|
+any command line arguments to daemons so as to configure their |
|
+behavior. In many case such configuration can be performed by making |
|
+changes to |
|
+.I /etc/nfs.conf |
|
+or other configuration files. When that is not convenient, a |
|
+distribution might provide systemd "drop-in" files which replace the |
|
+.B ExecStart= |
|
+setting to start the program with different arguments. For example a |
|
+drop-in file |
|
+.B systemd/system/nfs-mountd.service.d/local.conf |
|
+containing |
|
+.RS |
|
+.nf |
|
+[Service] |
|
+EnvironmentFile=/etc/sysconfig/nfs |
|
+ExecStart= |
|
+ExecStart= /usr/sbin/rpc.mountd $RPCMOUNTDOPTS |
|
+.fi |
|
+.RE |
|
+would cause the |
|
+.B nfs-mountd.service |
|
+unit to run the |
|
+.I rpc.mountd |
|
+program using, for arguments, the value given for |
|
+.B RPCMOUNTDOPTS |
|
+in |
|
+.IR /etc/sysconfig/nfs . |
|
+This allows for seamless integration with existing configuration |
|
+tools. |
|
+.SS Enabling unit files |
|
+There are three unit files which are designed to be manually enabled. |
|
+All others are automatically run as required. The three are: |
|
+.TP |
|
+.B nfs-client.target |
|
+This should be enabled on any host which ever serves as an NFS client. |
|
+There is little cost in transparently enabling it whenever NFS client |
|
+software is installed. |
|
+.TP |
|
+.B nfs-server.service |
|
+This must be enabled to provide NFS service to clients. It starts and |
|
+configures the required daemons in the required order. |
|
+.TP |
|
+.B nfs-blkmap.service |
|
+The |
|
+.B blkmapd |
|
+daemon is only required on NFS clients which are using pNFS (parallel |
|
+NFS), and particularly using the |
|
+.B blocklayout |
|
+layout protocol. If you might use this particular extension to NFS, |
|
+the |
|
+.B nfs-blkmap.service |
|
+unit should be enabled. |
|
+.PP |
|
+Several other units which might be considered to be optional, such as |
|
+.I rpc-gssd.service |
|
+are careful to only start if the required configuration file exists. |
|
+.I rpc-gsdd.service |
|
+will not start if the |
|
+.I krb5.keytab |
|
+file does not exist (typically in |
|
+.IR /etc ). |
|
+.SS Restarting NFS services |
|
+Most NFS daemons can be restarted at any time. They will reload any |
|
+state that they need, and continue servicing requests. This is rarely |
|
+necessary though. |
|
+.PP |
|
+When configuration changesare make, it can be hard to know exactly |
|
+which services need to be restarted to ensure that the configuration |
|
+takes effect. The simplest approach, which is often the best, is to |
|
+restart everything. To help with this, the |
|
+.B nfs-utils.service |
|
+unit is provided. It declares appropriate dependencies with other |
|
+unit files so that |
|
+.RS |
|
+.B systemctl restart nfs-utils |
|
+.RE |
|
+will restart all NFS daemons that are running. This will cause all |
|
+configuration changes to take effect |
|
+.I except |
|
+for changes to mount options lists in |
|
+.I /etc/fstab |
|
+or |
|
+.IR /etc/nfsmount.conf . |
|
+Mount options can only be changed by unmounting and remounting |
|
+filesystem. This can be a disruptive operation so it should only be |
|
+done when the value justifies the cost. The command |
|
+.RS |
|
+.B umount -a -t nfs; mount -a -t nfs |
|
+.RE |
|
+should unmount and remount all NFS filesystems. |
|
+.SS Masking unwanted services |
|
+Rarely there may be a desire to prohibit some services from running |
|
+even though there are normally part of a working NFS system. This may |
|
+be needed to reduce system load to an absolute minimum, or to reduce |
|
+attack surface by not running daemons that are not absolutely |
|
+required. |
|
+.PP |
|
+Two particular services which this can apply to are |
|
+.I rpcbind |
|
+and |
|
+.IR idmapd . |
|
+.I rpcbind |
|
+is not part of the |
|
+.I nfs-utils |
|
+package, but it used by several NFS services. However it is |
|
+.B not |
|
+needed when only NFSv4 is in use. If a site will never use NFSv3 (or |
|
+NFSv2) and does not want |
|
+.I rpcbind |
|
+to be running, the correct approach is to run |
|
+.RS |
|
+.B systemctl mask rpcbind |
|
+.RE |
|
+This will disable |
|
+.IR rpcbind , |
|
+and the various NFS services which depend on it (and are only needed |
|
+for NFSv3) will refuse to start, without interfering with the |
|
+operation of NFSv4 services. In particular, |
|
+.I rpc.statd |
|
+will not run when |
|
+.I rpcbind |
|
+is masked. |
|
+.PP |
|
+.I idmapd |
|
+is only needed for NFSv4, and even then is not needed when the client |
|
+and server agree to use user-ids rather than user-names to identify the |
|
+owners of files. If |
|
+.I idmapd |
|
+is not needed and not wanted, it can be masked with |
|
+.RS |
|
+.B systemctl mask idmapd |
|
+.RE |
|
+.SH FILES |
|
+/etc/nfs.conf |
|
+.br |
|
+/etc/nfsmount.conf |
|
+.br |
|
+/etc/idmapd.conf |
|
+.SH SEE ALSO |
|
+.BR systemd.unit (5), |
|
+.BR nfs.conf (5), |
|
+.BR nfsmount.conf (5). |
|
diff -up nfs-utils-1.3.0/systemd/rpc-statd.service.orig nfs-utils-1.3.0/systemd/rpc-statd.service |
|
--- nfs-utils-1.3.0/systemd/rpc-statd.service.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/systemd/rpc-statd.service 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -11,7 +11,8 @@ Wants=nfs-config.service |
|
After=nfs-config.service |
|
|
|
[Service] |
|
+Environment=RPC_STATD_NO_NOTIFY=1 |
|
EnvironmentFile=-/run/sysconfig/nfs-utils |
|
Type=forking |
|
PIDFile=/var/run/rpc.statd.pid |
|
-ExecStart=/usr/sbin/rpc.statd --no-notify $STATDARGS |
|
+ExecStart=/usr/sbin/rpc.statd $STATDARGS |
|
diff -up nfs-utils-1.3.0/utils/exportfs/exportfs.c.orig nfs-utils-1.3.0/utils/exportfs/exportfs.c |
|
--- nfs-utils-1.3.0/utils/exportfs/exportfs.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/exportfs/exportfs.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -37,6 +37,7 @@ |
|
#include "nfslib.h" |
|
#include "exportfs.h" |
|
#include "xlog.h" |
|
+#include "conffile.h" |
|
|
|
static void export_all(int verbose); |
|
static void exportfs(char *arg, char *options, int verbose); |
|
@@ -53,6 +54,7 @@ static void release_lockfile(void); |
|
|
|
static const char *lockfile = EXP_LOCKFILE; |
|
static int _lockfd = -1; |
|
+char *conf_path = NFS_CONFFILE; |
|
|
|
/* |
|
* If we aren't careful, changes made by exportfs can be lost |
|
@@ -108,6 +110,9 @@ main(int argc, char **argv) |
|
xlog_stderr(1); |
|
xlog_syslog(0); |
|
|
|
+ conf_init(); |
|
+ xlog_from_conffile("exportfs"); |
|
+ |
|
while ((c = getopt(argc, argv, "ad:fhio:ruvs")) != EOF) { |
|
switch(c) { |
|
case 'a': |
|
diff -up nfs-utils-1.3.0/utils/exportfs/exportfs.man.orig nfs-utils-1.3.0/utils/exportfs/exportfs.man |
|
--- nfs-utils-1.3.0/utils/exportfs/exportfs.man.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/exportfs/exportfs.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -90,6 +90,13 @@ to be added to the kernel's export table |
|
.TP |
|
.B \-d kind " or " \-\-debug kind |
|
Turn on debugging. Valid kinds are: all, auth, call, general and parse. |
|
+Debugging can also be turned on by setting |
|
+.B debug= |
|
+in the |
|
+.B [exportfs] |
|
+section of |
|
+.IR /etc/nfs.conf . |
|
+ |
|
.TP |
|
.B -a |
|
Export or unexport all directories. |
|
@@ -295,6 +302,7 @@ master table of exports |
|
table of clients accessing server's exports |
|
.SH SEE ALSO |
|
.BR exports (5), |
|
+.BR nfs.conf (5), |
|
.BR rpc.mountd (8), |
|
.BR netgroup (5) |
|
.SH AUTHORS |
|
diff -up nfs-utils-1.3.0/utils/gssd/gssd.c.orig nfs-utils-1.3.0/utils/gssd/gssd.c |
|
--- nfs-utils-1.3.0/utils/gssd/gssd.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/gssd/gssd.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -71,6 +71,7 @@ |
|
#include "gss_util.h" |
|
#include "krb5_util.h" |
|
#include "nfslib.h" |
|
+#include "conffile.h" |
|
|
|
static char *pipefs_path = GSSD_PIPEFS_DIR; |
|
static DIR *pipefs_dir; |
|
@@ -78,6 +79,7 @@ static int pipefs_fd; |
|
static int inotify_fd; |
|
struct event inotify_ev; |
|
|
|
+char *conf_path = NFS_CONFFILE; |
|
char *keytabfile = GSSD_DEFAULT_KEYTAB_FILE; |
|
char **ccachesearch; |
|
int use_memcache = 0; |
|
@@ -831,6 +833,33 @@ main(int argc, char *argv[]) |
|
char *progname; |
|
char *ccachedir = NULL; |
|
struct event sighup_ev; |
|
+ char *s; |
|
+ |
|
+ conf_init(); |
|
+ use_memcache = conf_get_bool("gssd", "use-memcache", use_memcache); |
|
+ root_uses_machine_creds = conf_get_bool("gssd", "use-machine-creds", |
|
+ root_uses_machine_creds); |
|
+ avoid_dns = conf_get_bool("gssd", "avoid-dns", avoid_dns); |
|
+#ifdef HAVE_SET_ALLOWABLE_ENCTYPES |
|
+ limit_to_legacy_enctypes = conf_get_bool("gssd", "limit-to-legacy-enctypes", |
|
+ limit_to_legacy_enctypes); |
|
+#endif |
|
+ context_timeout = conf_get_num("gssd", "context-timeout", context_timeout); |
|
+ rpc_timeout = conf_get_num("gssd", "rpc-timeout", rpc_timeout); |
|
+ s = conf_get_str("gssd", "pipefs-directory"); |
|
+ if (!s) |
|
+ s = conf_get_str("general", "pipefs-directory"); |
|
+ if (s) |
|
+ pipefs_path = s; |
|
+ s = conf_get_str("gssd", "keytab-file"); |
|
+ if (s) |
|
+ keytabfile = s; |
|
+ s = conf_get_str("gssd", "cred-cache-directory"); |
|
+ if (s) |
|
+ ccachedir = s; |
|
+ s = conf_get_str("gssd", "preferred-realm"); |
|
+ if (s) |
|
+ preferred_realm = s; |
|
|
|
while ((opt = getopt(argc, argv, "DfvrlmnMp:k:d:t:T:R:")) != -1) { |
|
switch (opt) { |
|
diff -up nfs-utils-1.3.0/utils/gssd/gssd.man.orig nfs-utils-1.3.0/utils/gssd/gssd.man |
|
--- nfs-utils-1.3.0/utils/gssd/gssd.man.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/gssd/gssd.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -297,6 +297,60 @@ The default timeout is set to 5 seconds. |
|
If you get messages like "WARNING: can't create tcp rpc_clnt to server |
|
%servername% for user with uid %uid%: RPC: Remote system error - |
|
Connection timed out", you should consider an increase of this timeout. |
|
+.SH CONFIGURATION FILE |
|
+Many of the options that can be set on the command line can also be |
|
+controlled through values set in the |
|
+.B [gssd] |
|
+section of the |
|
+.I /etc/nfs.conf |
|
+configuration file. Values recognized include: |
|
+.TP |
|
+.B use-memcache |
|
+A Boolean flag equivalent to |
|
+.BR -M . |
|
+.TP |
|
+.B use-machine-creds |
|
+A Boolean flag. Setting to |
|
+.B false |
|
+is equivalent to giving the |
|
+.B -n |
|
+flag. |
|
+.TP |
|
+.B avoid-dns |
|
+Setting to |
|
+.B false |
|
+is equivalent to providing the |
|
+.B -D |
|
+flag. |
|
+.TP |
|
+.B limit-to-legacy-enctypes |
|
+Equivalent to |
|
+.BR -l . |
|
+.TP |
|
+.B context-timeout |
|
+Equivalent to |
|
+.BR -T . |
|
+.TP |
|
+.B rpc-timeout |
|
+Equivalent to |
|
+.BR -t . |
|
+.TP |
|
+.B pipefs-directory |
|
+Equivalent to |
|
+.BR -p . |
|
+.TP |
|
+.B keytab-file |
|
+Equivalent to |
|
+.BR -k . |
|
+.TP |
|
+.BR cred-cache-directory |
|
+Equivalent to |
|
+.BR -d . |
|
+.TP |
|
+.B preferred-realm |
|
+Equivalent to |
|
+.BR -R . |
|
+ |
|
.SH SEE ALSO |
|
.BR rpc.svcgssd (8), |
|
.BR kerberos (1), |
|
diff -up nfs-utils-1.3.0/utils/gssd/svcgssd.c.orig nfs-utils-1.3.0/utils/gssd/svcgssd.c |
|
--- nfs-utils-1.3.0/utils/gssd/svcgssd.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/gssd/svcgssd.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -61,6 +61,9 @@ |
|
#include "svcgssd.h" |
|
#include "gss_util.h" |
|
#include "err_util.h" |
|
+#include "conffile.h" |
|
+ |
|
+char *conf_path = NFS_CONFFILE; |
|
|
|
void |
|
sig_die(int signal) |
|
@@ -98,6 +101,17 @@ main(int argc, char *argv[]) |
|
extern char *optarg; |
|
char *progname; |
|
char *principal = NULL; |
|
+ char *s; |
|
+ |
|
+ conf_init(); |
|
+ |
|
+ s = conf_get_str("svcgssd", "principal"); |
|
+ if (!s) |
|
+ ; |
|
+ else if (strcmp(s, "system")== 0) |
|
+ get_creds = 0; |
|
+ else |
|
+ principal = s; |
|
|
|
while ((opt = getopt(argc, argv, "fivrnp:")) != -1) { |
|
switch (opt) { |
|
diff -up nfs-utils-1.3.0/utils/gssd/svcgssd.man.orig nfs-utils-1.3.0/utils/gssd/svcgssd.man |
|
--- nfs-utils-1.3.0/utils/gssd/svcgssd.man.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/gssd/svcgssd.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -45,6 +45,23 @@ Use the system default credentials |
|
.RI (host/ FQDN @ REALM ) |
|
rather than the default |
|
.RI nfs/ FQDN @ REALM . |
|
+.SH CONFIGURATION FILE |
|
+Some of the options that can be set on the command line can also be |
|
+controlled through values set in the |
|
+.B [svcgssd] |
|
+section of the |
|
+.I /etc/nfs.conf |
|
+configuration file. Values recognized include: |
|
+.TP |
|
+.B principal |
|
+If set to |
|
+.B system |
|
+this is equivalent to the |
|
+.B -n |
|
+option. If set to any other value, that is used like the |
|
+.B -p |
|
+option. |
|
+ |
|
.SH SEE ALSO |
|
.BR rpc.gssd(8), |
|
.SH AUTHORS |
|
diff -up nfs-utils-1.3.0/utils/mountd/mountd.c.orig nfs-utils-1.3.0/utils/mountd/mountd.c |
|
--- nfs-utils-1.3.0/utils/mountd/mountd.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/mountd/mountd.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -22,6 +22,8 @@ |
|
#include <fcntl.h> |
|
#include <sys/resource.h> |
|
#include <sys/wait.h> |
|
+ |
|
+#include "conffile.h" |
|
#include "xmalloc.h" |
|
#include "misc.h" |
|
#include "mountd.h" |
|
@@ -39,6 +41,8 @@ int new_cache = 0; |
|
int manage_gids; |
|
int use_ipaddr = -1; |
|
|
|
+char *conf_path = NFS_CONFFILE; |
|
+ |
|
/* PRC: a high-availability callout program can be specified with -H |
|
* When this is done, the program will receive callouts whenever clients |
|
* send mount or unmount requests -- the callout is not needed for 2.6 kernel */ |
|
@@ -692,6 +696,7 @@ main(int argc, char **argv) |
|
char *export_file = _PATH_EXPORTS; |
|
char *state_dir = NFS_STATEDIR; |
|
char *progname; |
|
+ char *s; |
|
unsigned int listeners = 0; |
|
int foreground = 0; |
|
int port = 0; |
|
@@ -707,6 +712,38 @@ main(int argc, char **argv) |
|
else |
|
progname = argv[0]; |
|
|
|
+ conf_init(); |
|
+ xlog_from_conffile("mountd"); |
|
+ manage_gids = conf_get_bool("mountd", "manage-gids", manage_gids); |
|
+ descriptors = conf_get_num("mountd", "descriptors", descriptors); |
|
+ port = conf_get_num("mountd", "port", port); |
|
+ num_threads = conf_get_num("mountd", "threads", num_threads); |
|
+ reverse_resolve = conf_get_bool("mountd", "reverse-lookup", reverse_resolve); |
|
+ ha_callout_prog = conf_get_str("mountd", "ha-callout"); |
|
+ |
|
+ s = conf_get_str("mountd", "state-directory-path"); |
|
+ if (s) |
|
+ state_dir = s; |
|
+ |
|
+ /* NOTE: following uses "nfsd" section of nfs.conf !!!! */ |
|
+ if (conf_get_bool("nfsd", "udp", NFSCTL_UDPISSET(_rpcprotobits))) |
|
+ NFSCTL_UDPSET(_rpcprotobits); |
|
+ else |
|
+ NFSCTL_UDPUNSET(_rpcprotobits); |
|
+ if (conf_get_bool("nfsd", "tcp", NFSCTL_TCPISSET(_rpcprotobits))) |
|
+ NFSCTL_TCPSET(_rpcprotobits); |
|
+ else |
|
+ NFSCTL_TCPUNSET(_rpcprotobits); |
|
+ for (vers = 2; vers <= 4; vers++) { |
|
+ char tag[10]; |
|
+ sprintf(tag, "vers%d", vers); |
|
+ if (conf_get_bool("nfsd", tag, NFSCTL_VERISSET(nfs_version, vers))) |
|
+ NFSCTL_VERSET(nfs_version, vers); |
|
+ else |
|
+ NFSCTL_VERUNSET(nfs_version, vers); |
|
+ } |
|
+ |
|
+ |
|
/* Parse the command line options and arguments. */ |
|
opterr = 0; |
|
while ((c = getopt_long(argc, argv, "o:nFd:f:p:P:hH:N:V:vurs:t:g", longopts, NULL)) != EOF) |
|
diff -up nfs-utils-1.3.0/utils/mountd/mountd.man.orig nfs-utils-1.3.0/utils/mountd/mountd.man |
|
--- nfs-utils-1.3.0/utils/mountd/mountd.man.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/mountd/mountd.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -207,6 +207,39 @@ the server. Note that the 'primary' grou |
|
.B newgroup |
|
command on the client will still be effective. This function requires |
|
a Linux Kernel with version at least 2.6.21. |
|
+ |
|
+.SH CONFIGURATION FILE |
|
+Many of the options that can be set on the command line can also be |
|
+controlled through values set in the |
|
+.B [mountd] |
|
+or, in some cases, the |
|
+.B [nfsd] |
|
+sections of the |
|
+.I /etc/nfs.conf |
|
+configuration file. |
|
+Values recognized in the |
|
+.B [mountd] |
|
+section include |
|
+.BR manage-gids , |
|
+.BR descriptors , |
|
+.BR port , |
|
+.BR threads , |
|
+.BR reverse-lookup ", and" |
|
+.BR state-directory-path , |
|
+.B ha-callout |
|
+which each have the same effect as the option with the same name. |
|
+ |
|
+The values recognized in the |
|
+.B [nfsd] |
|
+section include |
|
+.BR TCP , |
|
+.BR UDP , |
|
+.BR vers2 , |
|
+.BR vers3 ", and" |
|
+.B vers4 |
|
+which each have same same meaning as given by |
|
+.BR rpc.nfsd (8). |
|
+ |
|
.SH TCP_WRAPPERS SUPPORT |
|
You can protect your |
|
.B rpc.mountd |
|
@@ -261,6 +294,7 @@ table of clients accessing server's expo |
|
.BR rpc.nfsd (8), |
|
.BR rpc.rquotad (8), |
|
.BR nfs (5), |
|
+.BR nfs.conf (5), |
|
.BR tcpd (8), |
|
.BR hosts_access (5), |
|
.BR iptables (8), |
|
diff -up nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c.orig nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c |
|
--- nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -43,6 +43,7 @@ |
|
#include <sys/capability.h> |
|
#endif |
|
|
|
+#include "conffile.h" |
|
#include "xlog.h" |
|
#include "sqlite.h" |
|
|
|
@@ -55,6 +56,8 @@ |
|
/* defined by RFC 3530 */ |
|
#define NFS4_OPAQUE_LIMIT 1024 |
|
|
|
+char *conf_path = NFS_CONFFILE; |
|
+ |
|
/* private data structures */ |
|
struct cltrack_cmd { |
|
char *name; |
|
@@ -553,6 +556,7 @@ int |
|
main(int argc, char **argv) |
|
{ |
|
char arg; |
|
+ char *val; |
|
int rc = 0; |
|
char *progname, *cmdarg = NULL; |
|
struct cltrack_cmd *cmd; |
|
@@ -562,6 +566,15 @@ main(int argc, char **argv) |
|
xlog_syslog(1); |
|
xlog_stderr(0); |
|
|
|
+ conf_init(); |
|
+ xlog_from_conffile("nfsdcltrack"); |
|
+ val = conf_get_str("nfsdcltrack", "storagedir"); |
|
+ if (val) |
|
+ storagedir = val; |
|
+ rc = conf_get_num("nfsdcltrack", "debug", 0); |
|
+ if (rc > 0) |
|
+ xlog_config(D_ALL, 1); |
|
+ |
|
/* process command-line options */ |
|
while ((arg = getopt_long(argc, argv, "hdfs:", longopts, |
|
NULL)) != EOF) { |
|
diff -up nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man.orig nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man |
|
--- nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -66,6 +66,20 @@ Check to see if a nfs_client_id4 is allo |
|
.IP "\fBgracedone\fR" 4 |
|
.IX Item "gracedone" |
|
Remove any unreclaimed client records from the database. This command requires a epoch boot time as an argument. |
|
+.SH "EXTERNAL CONFIGURATION" |
|
+The directory for stable storage information can be set via the file |
|
+.B /etc/nfs.conf |
|
+by setting the |
|
+.B storagedir |
|
+value in the |
|
+.B nfsdcltrack |
|
+section. For example: |
|
+.in +5 |
|
+[nfsdcltrack] |
|
+.br |
|
+ storagedir = /shared/nfs/nfsdcltrack |
|
+.in -5 |
|
+Debuging to syslog can also be enabled by setting "debug = 1" in this file. |
|
.SH "LEGACY TRANSITION MECHANISM" |
|
.IX Header "LEGACY TRANSITION MECHANISM" |
|
The Linux kernel NFSv4 server has historically tracked this information |
|
diff -up nfs-utils-1.3.0/utils/nfsd/nfsd.c.orig nfs-utils-1.3.0/utils/nfsd/nfsd.c |
|
--- nfs-utils-1.3.0/utils/nfsd/nfsd.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/nfsd/nfsd.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -23,14 +23,18 @@ |
|
#include <netinet/in.h> |
|
#include <arpa/inet.h> |
|
|
|
+#include "conffile.h" |
|
#include "nfslib.h" |
|
#include "nfssvc.h" |
|
#include "xlog.h" |
|
+#include "xcommon.h" |
|
|
|
#ifndef NFSD_NPROC |
|
#define NFSD_NPROC 8 |
|
#endif |
|
|
|
+char *conf_path = NFS_CONFFILE; |
|
+ |
|
static void usage(const char *); |
|
|
|
static struct option longopts[] = |
|
@@ -51,50 +55,6 @@ static struct option longopts[] = |
|
{ NULL, 0, 0, 0 } |
|
}; |
|
|
|
-/* given a family and ctlbits, disable any that aren't listed in netconfig */ |
|
-#ifdef HAVE_LIBTIRPC |
|
-static void |
|
-nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6) |
|
-{ |
|
- struct netconfig *nconf; |
|
- unsigned int *famproto; |
|
- void *handle; |
|
- |
|
- xlog(D_GENERAL, "Checking netconfig for visible protocols."); |
|
- |
|
- handle = setnetconfig(); |
|
- while((nconf = getnetconfig(handle))) { |
|
- if (!(nconf->nc_flag & NC_VISIBLE)) |
|
- continue; |
|
- |
|
- if (!strcmp(nconf->nc_protofmly, NC_INET)) |
|
- famproto = proto4; |
|
- else if (!strcmp(nconf->nc_protofmly, NC_INET6)) |
|
- famproto = proto6; |
|
- else |
|
- continue; |
|
- |
|
- if (!strcmp(nconf->nc_proto, NC_TCP)) |
|
- NFSCTL_TCPSET(*famproto); |
|
- else if (!strcmp(nconf->nc_proto, NC_UDP)) |
|
- NFSCTL_UDPSET(*famproto); |
|
- |
|
- xlog(D_GENERAL, "Enabling %s %s.", nconf->nc_protofmly, |
|
- nconf->nc_proto); |
|
- } |
|
- endnetconfig(handle); |
|
- return; |
|
-} |
|
-#else /* HAVE_LIBTIRPC */ |
|
-static void |
|
-nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6) |
|
-{ |
|
- /* Enable all IPv4 protocols if no TIRPC support */ |
|
- *proto4 = NFSCTL_ALLBITS; |
|
- *proto6 = 0; |
|
-} |
|
-#endif /* HAVE_LIBTIRPC */ |
|
- |
|
int |
|
main(int argc, char **argv) |
|
{ |
|
@@ -102,44 +62,91 @@ main(int argc, char **argv) |
|
char *p, *progname, *port, *rdma_port = NULL; |
|
char **haddr = NULL; |
|
int hcounter = 0; |
|
+ struct conf_list *hosts; |
|
int socket_up = 0; |
|
unsigned int minorvers = 0; |
|
unsigned int minorversset = 0; |
|
unsigned int versbits = NFSCTL_VERDEFAULT; |
|
unsigned int protobits = NFSCTL_ALLBITS; |
|
- unsigned int proto4 = 0; |
|
- unsigned int proto6 = 0; |
|
int grace = -1; |
|
int lease = -1; |
|
|
|
- progname = strdup(basename(argv[0])); |
|
- if (!progname) { |
|
- fprintf(stderr, "%s: unable to allocate memory.\n", argv[0]); |
|
- exit(1); |
|
- } |
|
- |
|
- port = strdup("nfs"); |
|
- if (!port) { |
|
- fprintf(stderr, "%s: unable to allocate memory.\n", progname); |
|
- exit(1); |
|
- } |
|
- |
|
- haddr = malloc(sizeof(char *)); |
|
- if (!haddr) { |
|
- fprintf(stderr, "%s: unable to allocate memory.\n", progname); |
|
- exit(1); |
|
- } |
|
+ progname = basename(argv[0]); |
|
+ haddr = xmalloc(sizeof(char *)); |
|
haddr[0] = NULL; |
|
|
|
xlog_syslog(0); |
|
xlog_stderr(1); |
|
|
|
+ conf_init(); |
|
+ xlog_from_conffile("nfsd"); |
|
+ count = conf_get_num("nfsd", "threads", count); |
|
+ grace = conf_get_num("nfsd", "grace-time", grace); |
|
+ lease = conf_get_num("nfsd", "lease-time", lease); |
|
+ port = conf_get_str("nfsd", "port"); |
|
+ if (!port) |
|
+ port = "nfs"; |
|
+ rdma_port = conf_get_str("nfsd", "rdma"); |
|
+ if (conf_get_bool("nfsd", "udp", NFSCTL_UDPISSET(protobits))) |
|
+ NFSCTL_UDPSET(protobits); |
|
+ else |
|
+ NFSCTL_UDPUNSET(protobits); |
|
+ if (conf_get_bool("nfsd", "tcp", NFSCTL_TCPISSET(protobits))) |
|
+ NFSCTL_TCPSET(protobits); |
|
+ else |
|
+ NFSCTL_TCPUNSET(protobits); |
|
+ for (i = 2; i <= 4; i++) { |
|
+ char tag[10]; |
|
+ sprintf(tag, "vers%d", i); |
|
+ if (conf_get_bool("nfsd", tag, NFSCTL_VERISSET(versbits, i))) |
|
+ NFSCTL_VERSET(versbits, i); |
|
+ else |
|
+ NFSCTL_VERUNSET(versbits, i); |
|
+ } |
|
+ /* We assume the kernel will default all minor versions to 'on', |
|
+ * and allow the config file to disable some. |
|
+ */ |
|
+ for (i = NFS4_MINMINOR; i <= NFS4_MAXMINOR; i++) { |
|
+ char tag[20]; |
|
+ sprintf(tag, "vers4.%d", i); |
|
+ /* The default for minor version support is to let the |
|
+ * kernel decide. We could ask the kernel what that choice |
|
+ * will be, but that is needlessly complex. |
|
+ * Instead, perform a config-file lookup using each of the |
|
+ * two possible default. If the result is different from the |
|
+ * default, then impose that value, else don't make a change |
|
+ * (i.e. don't set the bit in minorversset). |
|
+ */ |
|
+ if (!conf_get_bool("nfsd", tag, 1)) { |
|
+ NFSCTL_VERSET(minorversset, i); |
|
+ NFSCTL_VERUNSET(minorvers, i); |
|
+ } |
|
+ if (conf_get_bool("nfsd", tag, 0)) { |
|
+ NFSCTL_VERSET(minorversset, i); |
|
+ NFSCTL_VERSET(minorvers, i); |
|
+ } |
|
+ } |
|
+ |
|
+ hosts = conf_get_list("nfsd", "host"); |
|
+ if (hosts && hosts->cnt) { |
|
+ struct conf_list_node *n; |
|
+ haddr = realloc(haddr, sizeof(char*) * hosts->cnt); |
|
+ TAILQ_FOREACH(n, &(hosts->fields), link) { |
|
+ haddr[hcounter] = n->field; |
|
+ hcounter++; |
|
+ } |
|
+ } |
|
+ |
|
while ((c = getopt_long(argc, argv, "dH:hN:V:p:P:sTUrG:L:", longopts, NULL)) != EOF) { |
|
switch(c) { |
|
case 'd': |
|
xlog_config(D_ALL, 1); |
|
break; |
|
case 'H': |
|
+ if (hosts) { |
|
+ hosts = NULL; |
|
+ hcounter = 0; |
|
+ } |
|
if (hcounter) { |
|
haddr = realloc(haddr, sizeof(char*) * hcounter+1); |
|
if(!haddr) { |
|
@@ -148,30 +155,13 @@ main(int argc, char **argv) |
|
exit(1); |
|
} |
|
} |
|
- haddr[hcounter] = strdup(optarg); |
|
- if (!haddr[hcounter]) { |
|
- fprintf(stderr, "%s: unable to allocate " |
|
- "memory.\n", progname); |
|
- exit(1); |
|
- } |
|
+ haddr[hcounter] = optarg; |
|
hcounter++; |
|
break; |
|
case 'P': /* XXX for nfs-server compatibility */ |
|
case 'p': |
|
/* only the last -p option has any effect */ |
|
- portnum = atoi(optarg); |
|
- if (portnum <= 0 || portnum > 65535) { |
|
- fprintf(stderr, "%s: bad port number: %s\n", |
|
- progname, optarg); |
|
- usage(progname); |
|
- } |
|
- free(port); |
|
- port = strdup(optarg); |
|
- if (!port) { |
|
- fprintf(stderr, "%s: unable to allocate " |
|
- "memory.\n", progname); |
|
- exit(1); |
|
- } |
|
+ port = optarg; |
|
break; |
|
case 'r': |
|
rdma_port = "nfsrdma"; |
|
@@ -188,7 +178,7 @@ main(int argc, char **argv) |
|
case 4: |
|
if (*p == '.') { |
|
int i = atoi(p+1); |
|
- if (i > NFS4_MAXMINOR) { |
|
+ if (i < NFS4_MINMINOR || i > NFS4_MAXMINOR) { |
|
fprintf(stderr, "%s: unsupported minor version\n", optarg); |
|
exit(1); |
|
} |
|
@@ -210,7 +200,7 @@ main(int argc, char **argv) |
|
case 4: |
|
if (*p == '.') { |
|
int i = atoi(p+1); |
|
- if (i > NFS4_MAXMINOR) { |
|
+ if (i < NFS4_MINMINOR || i > NFS4_MAXMINOR) { |
|
fprintf(stderr, "%s: unsupported minor version\n", optarg); |
|
exit(1); |
|
} |
|
@@ -277,18 +267,6 @@ main(int argc, char **argv) |
|
|
|
xlog_open(progname); |
|
|
|
- nfsd_enable_protos(&proto4, &proto6); |
|
- |
|
- if (!NFSCTL_TCPISSET(protobits)) { |
|
- NFSCTL_TCPUNSET(proto4); |
|
- NFSCTL_TCPUNSET(proto6); |
|
- } |
|
- |
|
- if (!NFSCTL_UDPISSET(protobits)) { |
|
- NFSCTL_UDPUNSET(proto4); |
|
- NFSCTL_UDPUNSET(proto6); |
|
- } |
|
- |
|
/* make sure that at least one version is enabled */ |
|
found_one = 0; |
|
for (c = NFSD_MINVERS; c <= NFSD_MAXVERS; c++) { |
|
@@ -301,8 +279,7 @@ main(int argc, char **argv) |
|
} |
|
|
|
if (NFSCTL_VERISSET(versbits, 4) && |
|
- !NFSCTL_TCPISSET(proto4) && |
|
- !NFSCTL_TCPISSET(proto6)) { |
|
+ !NFSCTL_TCPISSET(protobits)) { |
|
xlog(L_ERROR, "version 4 requires the TCP protocol"); |
|
exit(1); |
|
} |
|
@@ -336,15 +313,10 @@ main(int argc, char **argv) |
|
|
|
i = 0; |
|
do { |
|
- error = nfssvc_set_sockets(AF_INET, proto4, haddr[i], port); |
|
- if (!error) |
|
- socket_up = 1; |
|
-#ifdef IPV6_SUPPORTED |
|
- error = nfssvc_set_sockets(AF_INET6, proto6, haddr[i], port); |
|
+ error = nfssvc_set_sockets(protobits, haddr[i], port); |
|
if (!error) |
|
socket_up = 1; |
|
-#endif /* IPV6_SUPPORTED */ |
|
- } while (++i < hcounter); |
|
+ } while (++i < hcounter); |
|
|
|
if (rdma_port) { |
|
error = nfssvc_set_rdmaport(rdma_port); |
|
@@ -381,11 +353,7 @@ set_threads: |
|
if ((error = nfssvc_threads(portnum, count)) < 0) |
|
xlog(L_ERROR, "error starting threads: errno %d (%m)", errno); |
|
out: |
|
- free(port); |
|
- for(i=0; i < hcounter; i++) |
|
- free(haddr[i]); |
|
free(haddr); |
|
- free(progname); |
|
return (error != 0); |
|
} |
|
|
|
diff -up nfs-utils-1.3.0/utils/nfsd/nfsd.man.orig nfs-utils-1.3.0/utils/nfsd/nfsd.man |
|
--- nfs-utils-1.3.0/utils/nfsd/nfsd.man.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/nfsd/nfsd.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -57,7 +57,7 @@ This option can be used to request that |
|
.B rpc.nfsd |
|
does not offer certain versions of NFS. The current version of |
|
.B rpc.nfsd |
|
-can support NFS versions 2,3,4 and the newer version 4.1. |
|
+can support major NFS versions 2,3,4 and the minor versions 4.1 and 4.2. |
|
.TP |
|
.B \-s " or " \-\-syslog |
|
By default, |
|
@@ -82,7 +82,7 @@ This option can be used to request that |
|
.B rpc.nfsd |
|
offer certain versions of NFS. The current version of |
|
.B rpc.nfsd |
|
-can support NFS versions 2,3,4 and the newer version 4.1. |
|
+can support major NFS versions 2,3,4 and the minor versions 4.1 and 4.2. |
|
.TP |
|
.B \-L " or " \-\-lease-time seconds |
|
Set the lease-time used for NFSv4. This corresponds to how often |
|
@@ -95,11 +95,11 @@ New file open requests (NFSv4) and new f |
|
allowed until after this time has passed to allow clients to recover state. |
|
.TP |
|
.I nproc |
|
-specify the number of NFS server threads. By default, just one |
|
-thread is started. However, for optimum performance several threads |
|
+specify the number of NFS server threads. By default, eight |
|
+threads are started. However, for optimum performance several threads |
|
should be used. The actual figure depends on the number of and the work |
|
load created by the NFS clients, but a useful starting point is |
|
-8 threads. Effects of modifying that number can be checked using |
|
+eight threads. Effects of modifying that number can be checked using |
|
the |
|
.BR nfsstat (8) |
|
program. |
|
@@ -114,6 +114,58 @@ In particular |
|
.B rpc.nfsd 0 |
|
will stop all threads and thus close any open connections. |
|
|
|
+.SH CONFIGURATION FILE |
|
+Many of the options that can be set on the command line can also be |
|
+controlled through values set in the |
|
+.B [nfsd] |
|
+section of the |
|
+.I /etc/nfs.conf |
|
+configuration file. Values recognized include: |
|
+.TP |
|
+.B threads |
|
+The number of threads to start. |
|
+.TP |
|
+.B host |
|
+A host name, or comma separated list of host names, that |
|
+.I rpc.nfsd |
|
+will listen on. Use of the |
|
+.B --host |
|
+option replaces all host names listed here. |
|
+.TP |
|
+.B grace-time |
|
+The grace time, for both NFSv4 and NLM, in seconds. |
|
+.TP |
|
+.B lease-time |
|
+The lease time for NFSv4, in seconds. |
|
+.TP |
|
+.B port |
|
+Set the port for TCP/UDP to bind to. |
|
+.TP |
|
+.B rdma |
|
+Set RDMA port. Use "rdma=nfsrdma" to enable standard port. |
|
+.TP |
|
+.B UDP |
|
+Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support. |
|
+.TP |
|
+.B TCP |
|
+Enable or disable TCP support. |
|
+.TP |
|
+.B vers2 |
|
+.TP |
|
+.B vers3 |
|
+.TP |
|
+.B vers4 |
|
+Enable or disable a major NFS version. 3 and 4 are normally enabled |
|
+by default. |
|
+.TP |
|
+.B vers4.1 |
|
+.TP |
|
+.B vers4.2 |
|
+Setting these to "off" or similar will disable the selected minor |
|
+versions. Setting to "on" will enable them. The default values |
|
+are determined by the kernel, and usually minor versions default to |
|
+being enabled once the implementation is sufficiently complete. |
|
+ |
|
.SH NOTES |
|
If the program is built with TI-RPC support, it will enable any protocol and |
|
address family combinations that are marked visible in the |
|
@@ -124,6 +176,7 @@ database. |
|
.BR rpc.mountd (8), |
|
.BR exports (5), |
|
.BR exportfs (8), |
|
+.BR nfs.conf (5), |
|
.BR rpc.rquotad (8), |
|
.BR nfsstat (8), |
|
.BR netconfig(5). |
|
diff -up nfs-utils-1.3.0/utils/nfsd/nfssvc.c.orig nfs-utils-1.3.0/utils/nfsd/nfssvc.c |
|
--- nfs-utils-1.3.0/utils/nfsd/nfssvc.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/nfsd/nfssvc.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -23,6 +23,7 @@ |
|
|
|
#include "nfslib.h" |
|
#include "xlog.h" |
|
+#include "nfssvc.h" |
|
|
|
#ifndef NFSD_FS_DIR |
|
#define NFSD_FS_DIR "/proc/fs/nfsd" |
|
@@ -123,22 +124,6 @@ nfssvc_setfds(const struct addrinfo *hin |
|
if (fd < 0) |
|
return 0; |
|
|
|
- switch(hints->ai_family) { |
|
- case AF_INET: |
|
- family = "inet"; |
|
- break; |
|
-#ifdef IPV6_SUPPORTED |
|
- case AF_INET6: |
|
- family = "inet6"; |
|
- break; |
|
-#endif /* IPV6_SUPPORTED */ |
|
- default: |
|
- xlog(L_ERROR, "Unknown address family specified: %d\n", |
|
- hints->ai_family); |
|
- rc = EAFNOSUPPORT; |
|
- goto error; |
|
- } |
|
- |
|
rc = getaddrinfo(node, port, hints, &addrhead); |
|
if (rc == EAI_NONAME && !strcmp(port, "nfs")) { |
|
snprintf(buf, sizeof(buf), "%d", NFS_PORT); |
|
@@ -146,10 +131,10 @@ nfssvc_setfds(const struct addrinfo *hin |
|
} |
|
|
|
if (rc != 0) { |
|
- xlog(L_ERROR, "unable to resolve %s:%s to %s address: " |
|
- "%s", node ? node : "ANYADDR", port, family, |
|
- rc == EAI_SYSTEM ? strerror(errno) : |
|
- gai_strerror(rc)); |
|
+ xlog(L_ERROR, "unable to resolve %s:%s: %s", |
|
+ node ? node : "ANYADDR", port, |
|
+ rc == EAI_SYSTEM ? strerror(errno) : |
|
+ gai_strerror(rc)); |
|
goto error; |
|
} |
|
|
|
@@ -168,6 +153,20 @@ nfssvc_setfds(const struct addrinfo *hin |
|
continue; |
|
} |
|
|
|
+ switch(addr->ai_addr->sa_family) { |
|
+ case AF_INET: |
|
+ family = "AF_INET"; |
|
+ break; |
|
+#ifdef IPV6_SUPPORTED |
|
+ case AF_INET6: |
|
+ family = "AF_INET6"; |
|
+ break; |
|
+#endif /* IPV6_SUPPORTED */ |
|
+ default: |
|
+ addr = addr->ai_next; |
|
+ continue; |
|
+ } |
|
+ |
|
xlog(D_GENERAL, "Creating %s %s socket.", family, proto); |
|
|
|
/* open socket and prepare to hand it off to kernel */ |
|
@@ -251,12 +250,16 @@ error: |
|
} |
|
|
|
int |
|
-nfssvc_set_sockets(const int family, const unsigned int protobits, |
|
+nfssvc_set_sockets(const unsigned int protobits, |
|
const char *host, const char *port) |
|
{ |
|
struct addrinfo hints = { .ai_flags = AI_PASSIVE }; |
|
|
|
- hints.ai_family = family; |
|
+#ifdef IPV6_SUPPORTED |
|
+ hints.ai_family = AF_UNSPEC; |
|
+#else /* IPV6_SUPPORTED */ |
|
+ hints.ai_family = AF_INET; |
|
+#endif /* IPV6_SUPPORTED */ |
|
|
|
if (!NFSCTL_ANYPROTO(protobits)) |
|
return EPROTOTYPE; |
|
diff -up nfs-utils-1.3.0/utils/nfsd/nfssvc.h.orig nfs-utils-1.3.0/utils/nfsd/nfssvc.h |
|
--- nfs-utils-1.3.0/utils/nfsd/nfssvc.h.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/nfsd/nfssvc.h 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -22,7 +22,7 @@ |
|
|
|
void nfssvc_mount_nfsdfs(char *progname); |
|
int nfssvc_inuse(void); |
|
-int nfssvc_set_sockets(const int family, const unsigned int protobits, |
|
+int nfssvc_set_sockets(const unsigned int protobits, |
|
const char *host, const char *port); |
|
void nfssvc_set_time(const char *type, const int seconds); |
|
int nfssvc_set_rdmaport(const char *port); |
|
diff -up nfs-utils-1.3.0/utils/statd/sm-notify.c.orig nfs-utils-1.3.0/utils/statd/sm-notify.c |
|
--- nfs-utils-1.3.0/utils/statd/sm-notify.c.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/statd/sm-notify.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -29,6 +29,7 @@ |
|
#include <errno.h> |
|
#include <grp.h> |
|
|
|
+#include "conffile.h" |
|
#include "sockaddr.h" |
|
#include "xlog.h" |
|
#include "nsm.h" |
|
@@ -64,6 +65,7 @@ static _Bool opt_update_state = true; |
|
static unsigned int opt_max_retry = 15 * 60; |
|
static char * opt_srcaddr = NULL; |
|
static char * opt_srcport = NULL; |
|
+char * conf_path = NFS_CONFFILE; |
|
|
|
static void notify(const int sock); |
|
static int notify_host(int, struct nsm_host *); |
|
@@ -455,6 +457,7 @@ main(int argc, char **argv) |
|
{ |
|
int c, sock, force = 0; |
|
char * progname; |
|
+ char * s; |
|
|
|
progname = strrchr(argv[0], '/'); |
|
if (progname != NULL) |
|
@@ -462,6 +465,15 @@ main(int argc, char **argv) |
|
else |
|
progname = argv[0]; |
|
|
|
+ conf_init(); |
|
+ xlog_from_conffile("sm-notify"); |
|
+ opt_max_retry = conf_get_num("sm-notify", "retry-time", opt_max_retry / 60) * 60; |
|
+ opt_srcport = conf_get_str("sm-notify", "outgoing-port"); |
|
+ opt_srcaddr = conf_get_str("sm-notify", "outgoing-addr"); |
|
+ s = conf_get_str("statd", "state-directory-path"); |
|
+ if (s && !nsm_setup_pathnames(argv[0], s)) |
|
+ exit(1); |
|
+ |
|
while ((c = getopt(argc, argv, "dm:np:v:P:f")) != -1) { |
|
switch (c) { |
|
case 'f': |
|
diff -up nfs-utils-1.3.0/utils/statd/sm-notify.man.orig nfs-utils-1.3.0/utils/statd/sm-notify.man |
|
--- nfs-utils-1.3.0/utils/statd/sm-notify.man.orig 2014-03-25 11:12:07.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/statd/sm-notify.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -219,6 +219,33 @@ argument when sending SM_NOTIFY requests |
|
.IP |
|
This option can be useful in multi-homed configurations where |
|
the remote requires notification from a specific network address. |
|
+.SH CONFIGURATION FILE |
|
+Many of the options that can be set on the command line can also be |
|
+controlled through values set in the |
|
+.B [sm-notify] |
|
+or, in one case, the |
|
+.B [statd] |
|
+section of the |
|
+.I /etc/nfs.conf |
|
+configuration file. |
|
+ |
|
+Values recognized in the |
|
+.B [sm-notify] |
|
+section include: |
|
+.BR retry-time , |
|
+.BR outgoing-port ", and" |
|
+.BR outgoing-addr . |
|
+These have the same effect as the command line options |
|
+.BR m , |
|
+.BR p ", and" |
|
+.B v |
|
+respectively. |
|
+ |
|
+The value recognized in the |
|
+.B [statd] |
|
+section is |
|
+.BR state-directory-path . |
|
+ |
|
.SH SECURITY |
|
The |
|
.B sm-notify |
|
diff -up nfs-utils-1.3.0/utils/statd/statd.c.orig nfs-utils-1.3.0/utils/statd/statd.c |
|
--- nfs-utils-1.3.0/utils/statd/statd.c.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/statd/statd.c 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -26,6 +26,7 @@ |
|
#include <sys/wait.h> |
|
#include <grp.h> |
|
|
|
+#include "conffile.h" |
|
#include "statd.h" |
|
#include "nfslib.h" |
|
#include "nfsrpc.h" |
|
@@ -36,6 +37,7 @@ |
|
#include <sys/socket.h> |
|
|
|
int run_mode = 0; /* foreground logging mode */ |
|
+char *conf_path = NFS_CONFFILE; |
|
|
|
/* LH - I had these local to main, but it seemed silly to have |
|
* two copies of each - one in main(), one static in log.c... |
|
@@ -242,15 +244,21 @@ static void set_nlm_port(char *type, int |
|
int main (int argc, char **argv) |
|
{ |
|
extern char *optarg; |
|
+ char *s; |
|
int pid; |
|
int arg; |
|
int port = 0, out_port = 0; |
|
int nlm_udp = 0, nlm_tcp = 0; |
|
struct rlimit rlim; |
|
+ char *env; |
|
|
|
/* Default: daemon mode, no other options */ |
|
run_mode = 0; |
|
|
|
+ env = getenv("RPC_STATD_NO_NOTIFY"); |
|
+ if (env && atoi(env) > 0) |
|
+ run_mode |= MODE_NO_NOTIFY; |
|
+ |
|
/* Log to stderr if there's an error during startup */ |
|
xlog_stderr(1); |
|
xlog_syslog(0); |
|
@@ -265,6 +273,24 @@ int main (int argc, char **argv) |
|
/* Set hostname */ |
|
MY_NAME = NULL; |
|
|
|
+ conf_init(); |
|
+ xlog_from_conffile("statd"); |
|
+ out_port = conf_get_num("statd", "outgoing-port", out_port); |
|
+ port = conf_get_num("statd", "port", port); |
|
+ MY_NAME = conf_get_str("statd", "name"); |
|
+ if (MY_NAME) |
|
+ run_mode |= STATIC_HOSTNAME; |
|
+ s = conf_get_str("statd", "state-directory-path"); |
|
+ if (s && !nsm_setup_pathnames(argv[0], s)) |
|
+ exit(1); |
|
+ s = conf_get_str("statd", "ha-callout"); |
|
+ if (s) |
|
+ ha_callout_prog = s; |
|
+ |
|
+ nlm_tcp = conf_get_num("lockd", "port", nlm_tcp); |
|
+ /* udp defaults to the same as tcp ! */ |
|
+ nlm_udp = conf_get_num("lockd", "udp-port", nlm_tcp); |
|
+ |
|
/* Process command line switches */ |
|
while ((arg = getopt_long(argc, argv, "h?vVFNH:dn:p:o:P:LT:U:", longopts, NULL)) != EOF) { |
|
switch (arg) { |
|
diff -up nfs-utils-1.3.0/utils/statd/statd.man.orig nfs-utils-1.3.0/utils/statd/statd.man |
|
--- nfs-utils-1.3.0/utils/statd/statd.man.orig 2017-03-28 13:43:36.000000000 -0400 |
|
+++ nfs-utils-1.3.0/utils/statd/statd.man 2017-03-28 13:43:53.000000000 -0400 |
|
@@ -8,7 +8,7 @@ |
|
.\" Rewritten by Chuck Lever <chuck.lever@oracle.com>, 2009. |
|
.\" Copyright 2009 Oracle. All rights reserved. |
|
.\" |
|
-.TH RPC.STATD 8 "1 November 2009 |
|
+.TH RPC.STATD 8 "1 November 2009" |
|
.SH NAME |
|
rpc.statd \- NSM service daemon |
|
.SH SYNOPSIS |
|
@@ -247,7 +247,7 @@ should listen on for |
|
.B NLM |
|
requests. |
|
.TP |
|
-.BI "\-P, " "" \-\-state\-directory\-path " pathname |
|
+.BI "\-P, " "" \-\-state\-directory\-path " pathname" |
|
Specifies the pathname of the parent directory |
|
where NSM state information resides. |
|
If this option is not specified, |
|
@@ -267,6 +267,37 @@ Causes |
|
to display version information on |
|
.I stderr |
|
and then exit. |
|
+.SH CONFIGURATION FILE |
|
+Many of the options that can be set on the command line can also be |
|
+controlled through values set in the |
|
+.B [statd] |
|
+or, in some cases, the |
|
+.B [lockd] |
|
+sections of the |
|
+.I /etc/nfs.conf |
|
+configuration file. |
|
+Values recognized in the |
|
+.B [statd] |
|
+section include |
|
+.BR port , |
|
+.BR outgoing-port , |
|
+.BR name , |
|
+.BR state-directory-path ", and" |
|
+.B ha-callout |
|
+which each have the same effect as the option with the same name. |
|
+ |
|
+The values recognized in the |
|
+.B [lockd] |
|
+section include |
|
+.B port |
|
+and |
|
+.B udp-port |
|
+which have the same effect as the |
|
+.B --nlm-port |
|
+and |
|
+.B --nlm-udp-port |
|
+options, respectively. |
|
+ |
|
.SH SECURITY |
|
The |
|
.B rpc.statd |
|
@@ -387,6 +418,11 @@ it attempts to start listeners on networ |
|
As long as at least one network transport listener starts successfully, |
|
.B rpc.statd |
|
will operate. |
|
+.SH ENVIRONMENT |
|
+.TP |
|
+.B RPC_STATD_NO_NOTIFY= |
|
+If set to a positive integer, has the same effect as |
|
+.IR \-\-no\-notify . |
|
.SH FILES |
|
.TP 2.5i |
|
.I /var/lib/nfs/sm
|
|
|