diff --git a/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch b/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch new file mode 100644 index 0000000..9ada419 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-covscan-resource-leaks.patch @@ -0,0 +1,605 @@ +diff -up nfs-utils-2.3.3/configure.ac.orig nfs-utils-2.3.3/configure.ac +--- nfs-utils-2.3.3/configure.ac.orig 2019-09-18 10:57:14.190810677 -0400 ++++ nfs-utils-2.3.3/configure.ac 2019-09-18 10:57:56.715567641 -0400 +@@ -561,6 +561,7 @@ my_am_cflags="\ + -Werror=parentheses \ + -Werror=aggregate-return \ + -Werror=unused-result \ ++ -Wno-cast-function-type \ + -fno-strict-aliasing \ + " + +diff -up nfs-utils-2.3.3/support/junction/path.c.orig nfs-utils-2.3.3/support/junction/path.c +--- nfs-utils-2.3.3/support/junction/path.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/junction/path.c 2019-09-18 10:57:56.715567641 -0400 +@@ -163,8 +163,10 @@ nsdb_count_components(const char *pathna + break; + next = strchrnul(component, '/'); + tmp = (size_t)(next - component); +- if (tmp > 255) ++ if (tmp > 255) { ++ free(start); + return false; ++ } + length += XDR_UINT_BYTES + (nsdb_quadlen(tmp) << 2); + count++; + +@@ -328,11 +330,13 @@ nsdb_posix_to_path_array(const char *pat + length = (size_t)(next - component); + if (length > 255) { + nsdb_free_string_array(result); ++ free(normalized); + return FEDFS_ERR_SVRFAULT; + } + + result[i] = strndup(component, length); + if (result[i] == NULL) { ++ free(normalized); + nsdb_free_string_array(result); + return FEDFS_ERR_SVRFAULT; + } +diff -up nfs-utils-2.3.3/support/nfs/exports.c.orig nfs-utils-2.3.3/support/nfs/exports.c +--- nfs-utils-2.3.3/support/nfs/exports.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/exports.c 2019-09-18 10:57:56.715567641 -0400 +@@ -714,6 +714,7 @@ parsesquash(char *list, int **idp, int * + } + if (id0 == -1 || id1 == -1) { + syntaxerr("uid/gid -1 not permitted"); ++ xfree(id); + return -1; + } + if ((len % 8) == 0) +@@ -724,6 +725,7 @@ parsesquash(char *list, int **idp, int * + break; + if (*cp != ',') { + syntaxerr("bad uid/gid list"); ++ xfree(id); + return -1; + } + cp++; +diff -up nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c +--- nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c 2019-09-18 10:57:56.716567635 -0400 +@@ -406,8 +406,10 @@ int nfs4_init_name_mapping(char *conffil + nfs4_methods = conf_get_list("Translation", "Method"); + if (nfs4_methods) { + IDMAP_LOG(1, ("libnfsidmap: processing 'Method' list")); +- if (load_plugins(nfs4_methods, &nfs4_plugins) == -1) ++ if (load_plugins(nfs4_methods, &nfs4_plugins) == -1) { ++ conf_free_list(nfs4_methods); + return -ENOENT; ++ } + } else { + struct conf_list list; + struct conf_list_node node; +@@ -475,11 +477,15 @@ out: + if (ret) { + if (nfs4_plugins) + unload_plugins(nfs4_plugins); +- if (gss_plugins) ++ if (gss_plugins) { + unload_plugins(gss_plugins); ++ } + nfs4_plugins = gss_plugins = NULL; + } + ++ if (gss_methods) ++ conf_free_list(gss_methods); ++ + return ret ? -ENOENT: 0; + } + +diff -up nfs-utils-2.3.3/support/nfsidmap/static.c.orig nfs-utils-2.3.3/support/nfsidmap/static.c +--- nfs-utils-2.3.3/support/nfsidmap/static.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfsidmap/static.c 2019-09-18 10:57:56.716567635 -0400 +@@ -347,6 +347,7 @@ static int static_init(void) { + warnx("static_init: calloc (1, %lu) failed", + (unsigned long)sizeof *unode); + free(pw); ++ conf_free_list(princ_list); + return -ENOMEM; + } + unode->uid = pw->pw_uid; +@@ -355,6 +356,9 @@ static int static_init(void) { + unode->localname = conf_get_str("Static", cln->field); + if (!unode->localname) { + free(pw); ++ free(unode->principal); ++ free(unode); ++ conf_free_list(princ_list); + return -ENOENT; + } + +@@ -379,6 +383,7 @@ static int static_init(void) { + warnx("static_init: calloc (1, %lu) failed", + (unsigned long)sizeof *gnode); + free(gr); ++ conf_free_list(princ_list); + return -ENOMEM; + } + gnode->gid = gr->gr_gid; +@@ -387,6 +392,9 @@ static int static_init(void) { + gnode->localgroup = conf_get_str("Static", cln->field); + if (!gnode->localgroup) { + free(gr); ++ free(gnode->principal); ++ free(gnode); ++ conf_free_list(princ_list); + return -ENOENT; + } + +@@ -394,6 +402,8 @@ static int static_init(void) { + + LIST_INSERT_HEAD (&gid_mappings[gid_hash(gnode->gid)], gnode, link); + } ++ ++ conf_free_list(princ_list); + return 0; + } + +diff -up nfs-utils-2.3.3/support/nfs/mydaemon.c.orig nfs-utils-2.3.3/support/nfs/mydaemon.c +--- nfs-utils-2.3.3/support/nfs/mydaemon.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/mydaemon.c 2019-09-18 10:57:56.716567635 -0400 +@@ -123,6 +123,7 @@ daemon_init(bool fg) + dup2(tempfd, 0); + dup2(tempfd, 1); + dup2(tempfd, 2); ++ close(tempfd); + closelog(); + dup2(pipefds[1], 3); + pipefds[1] = 3; +diff -up nfs-utils-2.3.3/support/nfs/rpcmisc.c.orig nfs-utils-2.3.3/support/nfs/rpcmisc.c +--- nfs-utils-2.3.3/support/nfs/rpcmisc.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/rpcmisc.c 2019-09-18 10:57:56.716567635 -0400 +@@ -102,6 +102,7 @@ makesock(int port, int proto) + if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1) { + xlog(L_FATAL, "Could not bind name to socket: %s", + strerror(errno)); ++ close(sock); + return -1; + } + +diff -up nfs-utils-2.3.3/support/nfs/svc_socket.c.orig nfs-utils-2.3.3/support/nfs/svc_socket.c +--- nfs-utils-2.3.3/support/nfs/svc_socket.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/svc_socket.c 2019-09-18 10:57:56.717567629 -0400 +@@ -134,6 +134,7 @@ svc_socket (u_long number, int type, int + if (ret < 0) + { + xlog(L_ERROR, "svc_socket: socket reuse problem: %m"); ++ (void) __close(sock); + return ret; + } + } +diff -up nfs-utils-2.3.3/support/nfs/xcommon.c.orig nfs-utils-2.3.3/support/nfs/xcommon.c +--- nfs-utils-2.3.3/support/nfs/xcommon.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/xcommon.c 2019-09-18 10:57:56.717567629 -0400 +@@ -53,14 +53,17 @@ char * + xstrconcat3 (const char *s, const char *t, const char *u) { + char *res; + +- if (!s) s = ""; ++ int dofree = 1; ++ ++ if (!s) s = "", dofree=0; + if (!t) t = ""; + if (!u) u = ""; + res = xmalloc(strlen(s) + strlen(t) + strlen(u) + 1); + strcpy(res, s); + strcat(res, t); + strcat(res, u); +- free((void *) s); ++ if (dofree) ++ free((void *) s); + return res; + } + +@@ -69,7 +72,9 @@ char * + xstrconcat4 (const char *s, const char *t, const char *u, const char *v) { + char *res; + +- if (!s) s = ""; ++ int dofree = 1; ++ ++ if (!s) s = "", dofree=0; + if (!t) t = ""; + if (!u) u = ""; + if (!v) v = ""; +@@ -78,7 +83,8 @@ xstrconcat4 (const char *s, const char * + strcat(res, t); + strcat(res, u); + strcat(res, v); +- free((void *) s); ++ if (dofree) ++ free((void *) s); + return res; + } + +diff -up nfs-utils-2.3.3/support/nfs/xlog.c.orig nfs-utils-2.3.3/support/nfs/xlog.c +--- nfs-utils-2.3.3/support/nfs/xlog.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/xlog.c 2019-09-18 10:57:56.717567629 -0400 +@@ -135,10 +135,14 @@ xlog_from_conffile(char *service) + struct conf_list_node *n; + + kinds = conf_get_list(service, "debug"); +- if (!kinds || !kinds->cnt) ++ if (!kinds || !kinds->cnt) { ++ free(kinds); + return; ++ } + TAILQ_FOREACH(n, &(kinds->fields), link) + xlog_sconfig(n->field, 1); ++ ++ conf_free_list(kinds); + } + + int +diff -up nfs-utils-2.3.3/support/nsm/file.c.orig nfs-utils-2.3.3/support/nsm/file.c +--- nfs-utils-2.3.3/support/nsm/file.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nsm/file.c 2019-09-18 10:57:56.717567629 -0400 +@@ -533,6 +533,7 @@ nsm_update_kernel_state(const int state) + len = snprintf(buf, sizeof(buf), "%d", state); + if (error_check(len, sizeof(buf))) { + xlog_warn("Failed to form NSM state number string"); ++ close(fd); + return; + } + +diff -up nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c.orig nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c +--- nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/systemd/rpc-pipefs-generator.c 2019-09-18 10:57:56.717567629 -0400 +@@ -69,12 +69,16 @@ int generate_target(char *pipefs_path, c + return 1; + + ret = generate_mount_unit(pipefs_path, pipefs_unit, dirname); +- if (ret) ++ if (ret) { ++ free(pipefs_unit); + return ret; ++ } + + path = malloc(strlen(dirname) + 1 + sizeof(filebase)); +- if (!path) ++ if (!path) { ++ free(pipefs_unit); + return 2; ++ } + sprintf(path, "%s", dirname); + mkdir(path, 0755); + strcat(path, filebase); +@@ -82,6 +86,7 @@ int generate_target(char *pipefs_path, c + if (!f) + { + free(path); ++ free(pipefs_unit); + return 1; + } + +@@ -90,6 +95,7 @@ int generate_target(char *pipefs_path, c + fprintf(f, "After=%s\n", pipefs_unit); + fclose(f); + free(path); ++ free(pipefs_unit); + + return 0; + } +diff -up nfs-utils-2.3.3/utils/blkmapd/device-discovery.c.orig nfs-utils-2.3.3/utils/blkmapd/device-discovery.c +--- nfs-utils-2.3.3/utils/blkmapd/device-discovery.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/blkmapd/device-discovery.c 2019-09-18 10:58:54.444237714 -0400 +@@ -186,8 +186,11 @@ static void bl_add_disk(char *filepath) + } + } + +- if (disk && diskpath) ++ if (disk && diskpath) { ++ if (serial) ++ free(serial); + return; ++ } + + /* add path */ + path = malloc(sizeof(struct bl_disk_path)); +@@ -223,6 +226,8 @@ static void bl_add_disk(char *filepath) + disk->size = size; + disk->valid_path = path; + } ++ if (serial) ++ free(serial); + } + return; + +@@ -232,6 +237,9 @@ static void bl_add_disk(char *filepath) + free(path->full_path); + free(path); + } ++ if (serial) ++ free(serial); ++ + return; + } + +@@ -375,7 +383,12 @@ static void bl_rpcpipe_cb(void) + if (event->mask & IN_CREATE) { + BL_LOG_WARNING("nfs pipe dir created\n"); + bl_watch_dir(nfspipe_dir, &nfs_pipedir_wfd); ++ if (bl_pipe_fd >= 0) ++ close(bl_pipe_fd); + bl_pipe_fd = open(bl_pipe_file, O_RDWR); ++ if (bl_pipe_fd < 0) ++ BL_LOG_ERR("open %s failed: %s\n", ++ event->name, strerror(errno)); + } else if (event->mask & IN_DELETE) { + BL_LOG_WARNING("nfs pipe dir deleted\n"); + inotify_rm_watch(bl_watch_fd, nfs_pipedir_wfd); +@@ -388,6 +401,8 @@ static void bl_rpcpipe_cb(void) + continue; + if (event->mask & IN_CREATE) { + BL_LOG_WARNING("blocklayout pipe file created\n"); ++ if (bl_pipe_fd >= 0) ++ close(bl_pipe_fd); + bl_pipe_fd = open(bl_pipe_file, O_RDWR); + if (bl_pipe_fd < 0) + BL_LOG_ERR("open %s failed: %s\n", +diff -up nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig nfs-utils-2.3.3/utils/gssd/krb5_util.c +--- nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/gssd/krb5_util.c 2019-09-18 10:57:56.718567624 -0400 +@@ -698,6 +698,8 @@ gssd_search_krb5_keytab(krb5_context con + "we failed to unparse principal name: %s\n", + k5err); + k5_free_kt_entry(context, kte); ++ free(k5err); ++ k5err = NULL; + continue; + } + printerr(4, "Processing keytab entry for principal '%s'\n", +@@ -899,6 +901,8 @@ find_keytab_entry(krb5_context context, + k5err = gssd_k5_err_msg(context, code); + printerr(1, "%s while building principal for '%s'\n", + k5err, spn); ++ free(k5err); ++ k5err = NULL; + continue; + } + code = krb5_kt_get_entry(context, kt, princ, 0, 0, kte); +@@ -1168,7 +1172,8 @@ gssd_get_krb5_machine_cred_list(char *** + *list = l; + retval = 0; + goto out; +- } ++ } else ++ free((void *)l); + out: + return retval; + } +@@ -1216,6 +1221,8 @@ gssd_destroy_krb5_machine_creds(void) + printerr(0, "WARNING: %s while resolving credential " + "cache '%s' for destruction\n", k5err, + ple->ccname); ++ free(k5err); ++ k5err = NULL; + continue; + } + +diff -up nfs-utils-2.3.3/utils/mount/configfile.c.orig nfs-utils-2.3.3/utils/mount/configfile.c +--- nfs-utils-2.3.3/utils/mount/configfile.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/mount/configfile.c 2019-09-18 10:57:56.718567624 -0400 +@@ -404,7 +404,7 @@ char *conf_get_mntopts(char *spec, char + + /* list_size + optlen + ',' + '\0' */ + config_opts = calloc(1, (list_size+optlen+2)); +- if (server == NULL) { ++ if (config_opts == NULL) { + xlog_warn("conf_get_mountops: Unable calloc memory for config_opts"); + free_all(); + return mount_opts; +diff -up nfs-utils-2.3.3/utils/mountd/cache.c.orig nfs-utils-2.3.3/utils/mountd/cache.c +--- nfs-utils-2.3.3/utils/mountd/cache.c.orig 2019-09-18 10:57:14.190810677 -0400 ++++ nfs-utils-2.3.3/utils/mountd/cache.c 2019-09-18 10:57:56.718567624 -0400 +@@ -1240,7 +1240,7 @@ static struct exportent *lookup_junction + goto out; + } + status = nfs_get_basic_junction(pathname, &locations); +- switch (status) { ++ if (status) { + xlog(L_WARNING, "Dangling junction %s: %s", + pathname, strerror(status)); + goto out; +@@ -1248,10 +1248,11 @@ static struct exportent *lookup_junction + + parent = lookup_parent_export(dom, pathname, ai); + if (parent == NULL) +- goto out; ++ goto free_locations; + + exp = locations_to_export(locations, pathname, parent); + ++free_locations: + nfs_free_locations(locations->ns_list); + free(locations); + +diff -up nfs-utils-2.3.3/utils/mountd/fsloc.c.orig nfs-utils-2.3.3/utils/mountd/fsloc.c +--- nfs-utils-2.3.3/utils/mountd/fsloc.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/mountd/fsloc.c 2019-09-18 10:57:56.719567618 -0400 +@@ -102,6 +102,7 @@ static struct servers *parse_list(char * + cp = strchr(list[i], '@'); + if ((!cp) || list[i][0] != '/') { + xlog(L_WARNING, "invalid entry '%s'", list[i]); ++ free(mp); + continue; /* XXX Need better error handling */ + } + res->h_mp[i] = mp; +diff -up nfs-utils-2.3.3/utils/mount/nfsmount.c.orig nfs-utils-2.3.3/utils/mount/nfsmount.c +--- nfs-utils-2.3.3/utils/mount/nfsmount.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/mount/nfsmount.c 2019-09-18 10:57:56.730567555 -0400 +@@ -452,6 +452,7 @@ parse_options(char *old_opts, struct nfs + nfs_error(_("%s: Bad nfs mount parameter: %s\n"), progname, opt); + out_bad: + free(tmp_opts); ++ free(mounthost); + return 0; + } + +diff -up nfs-utils-2.3.3/utils/mount/stropts.c.orig nfs-utils-2.3.3/utils/mount/stropts.c +--- nfs-utils-2.3.3/utils/mount/stropts.c.orig 2019-09-18 10:57:14.183810717 -0400 ++++ nfs-utils-2.3.3/utils/mount/stropts.c 2019-09-18 10:57:56.730567555 -0400 +@@ -982,8 +982,11 @@ static int nfs_try_mount(struct nfsmount + } + + if (!nfs_append_addr_option(address->ai_addr, +- address->ai_addrlen, mi->options)) ++ address->ai_addrlen, mi->options)) { ++ freeaddrinfo(address); ++ errno = ENOMEM; + return 0; ++ } + mi->address = address; + } + +diff -up nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c.orig nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c +--- nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/nfsdcltrack/sqlite.c 2019-09-18 10:57:56.731567549 -0400 +@@ -215,6 +215,8 @@ sqlite_maindb_init_v2(void) + &err); + if (ret != SQLITE_OK) { + xlog(L_ERROR, "Unable to begin transaction: %s", err); ++ if (err) ++ sqlite3_free(err); + return ret; + } + +diff -up nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c +--- nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c.orig 2019-11-11 08:49:06.044870974 -0500 ++++ nfs-utils-2.3.3/support/nfsidmap/libnfsidmap.c 2019-11-11 09:19:10.391896845 -0500 +@@ -486,6 +486,9 @@ out: + if (gss_methods) + conf_free_list(gss_methods); + ++ if (nfs4_methods) ++ conf_free_list(nfs4_methods); ++ + return ret ? -ENOENT: 0; + } + +diff -up nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig nfs-utils-2.3.3/utils/gssd/krb5_util.c +--- nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig 2019-11-11 08:49:06.045870979 -0500 ++++ nfs-utils-2.3.3/utils/gssd/krb5_util.c 2019-11-11 09:19:10.393896856 -0500 +@@ -911,6 +911,8 @@ find_keytab_entry(krb5_context context, + k5err = gssd_k5_err_msg(context, code); + printerr(3, "%s while getting keytab entry for '%s'\n", + k5err, spn); ++ free(k5err); ++ k5err = NULL; + /* + * We tried the active directory machine account + * with the hostname part as-is and failed... +@@ -1013,6 +1015,8 @@ query_krb5_ccache(const char* cred_cache + char *str = NULL; + char *princstring; + ++ *ret_princname = *ret_realm = NULL; ++ + ret = krb5_init_context(&context); + if (ret) + return 0; +@@ -1047,7 +1051,7 @@ err_princ: + krb5_cc_close(context, ccache); + err_cache: + krb5_free_context(context); +- return found; ++ return (*ret_princname && *ret_realm); + } + + /*==========================*/ +@@ -1230,6 +1234,8 @@ gssd_destroy_krb5_machine_creds(void) + k5err = gssd_k5_err_msg(context, code); + printerr(0, "WARNING: %s while destroying credential " + "cache '%s'\n", k5err, ple->ccname); ++ free(k5err); ++ k5err = NULL; + } + } + krb5_free_context(context); +diff -up nfs-utils-2.3.3/utils/idmapd/idmapd.c.orig nfs-utils-2.3.3/utils/idmapd/idmapd.c +--- nfs-utils-2.3.3/utils/idmapd/idmapd.c.orig 2019-11-11 08:49:06.029870889 -0500 ++++ nfs-utils-2.3.3/utils/idmapd/idmapd.c 2019-11-11 09:19:10.393896856 -0500 +@@ -517,14 +517,16 @@ static void + clntscancb(int UNUSED(fd), short UNUSED(which), void *data) + { + struct idmap_clientq *icq = data; +- struct idmap_client *ic; ++ struct idmap_client *ic, *ic_next; + +- TAILQ_FOREACH(ic, icq, ic_next) ++ for (ic = TAILQ_FIRST(icq); ic != NULL; ic = ic_next) { ++ ic_next = TAILQ_NEXT(ic, ic_next); + if (ic->ic_fd == -1 && nfsopen(ic) == -1) { + close(ic->ic_dirfd); + TAILQ_REMOVE(icq, ic, ic_next); + free(ic); + } ++ } + } + + static void +diff -up nfs-utils-2.3.3/utils/statd/monitor.c.orig nfs-utils-2.3.3/utils/statd/monitor.c +--- nfs-utils-2.3.3/utils/statd/monitor.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/statd/monitor.c 2019-11-11 09:19:10.393896856 -0500 +@@ -66,7 +66,7 @@ sm_mon_1_svc(struct mon *argp, struct sv + *my_name = argp->mon_id.my_id.my_name; + struct my_id *id = &argp->mon_id.my_id; + char *cp; +- notify_list *clnt; ++ notify_list *clnt = NULL; + struct sockaddr_in my_addr = { + .sin_family = AF_INET, + .sin_addr.s_addr = htonl(INADDR_LOOPBACK), +@@ -177,6 +177,7 @@ sm_mon_1_svc(struct mon *argp, struct sv + * We're committed...ignoring errors. Let's hope that a malloc() + * doesn't fail. (I should probably fix this assumption.) + */ ++ clnt = NULL; + if (!existing && !(clnt = nlist_new(my_name, mon_name, 0))) { + free(dnsname); + xlog_warn("out of memory"); +@@ -223,6 +224,7 @@ sm_mon_1_svc(struct mon *argp, struct sv + + failure: + xlog_warn("STAT_FAIL to %s for SM_MON of %s", my_name, mon_name); ++ free(clnt); + return (&result); + } + +@@ -242,6 +244,7 @@ load_one_host(const char *hostname, + clnt->dns_name = strdup(hostname); + if (clnt->dns_name == NULL) { + nlist_free(NULL, clnt); ++ free(clnt); + return 0; + } + +diff -up nfs-utils-2.3.3/utils/statd/notlist.c.orig nfs-utils-2.3.3/utils/statd/notlist.c +--- nfs-utils-2.3.3/utils/statd/notlist.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/utils/statd/notlist.c 2019-11-11 09:19:10.394896861 -0500 +@@ -210,7 +210,6 @@ nlist_free(notify_list **head, notify_li + if (NL_MON_NAME(entry)) + free(NL_MON_NAME(entry)); + free(entry->dns_name); +- free(entry); + } + + /* +@@ -219,8 +218,14 @@ nlist_free(notify_list **head, notify_li + void + nlist_kill(notify_list **head) + { +- while (*head) ++ notify_list *next; ++ ++ while (*head) { ++ next = (*head)->next; + nlist_free(head, *head); ++ free(*head); ++ *head = next; ++ } + } + + /* diff --git a/SOURCES/nfs-utils-2.3.3-gating-tests.patch b/SOURCES/nfs-utils-2.3.3-gating-tests.patch deleted file mode 100644 index 8f70d8f..0000000 --- a/SOURCES/nfs-utils-2.3.3-gating-tests.patch +++ /dev/null @@ -1,3813 +0,0 @@ -From 26dfa0f7846f14aa86048d504913d3a3be7196d0 Mon Sep 17 00:00:00 2001 -From: Bruno Goncalves -Date: Jan 17 2019 10:02:50 +0000 -Subject: [PATCH 1/6] Add CI tests - - -Related: rhbz#1653927 - ---- - -diff --git a/tests/export-mount-local/PURPOSE b/tests/export-mount-local/PURPOSE -new file mode 100644 -index 0000000..556df42 ---- /dev/null -+++ b/tests/export-mount-local/PURPOSE -@@ -0,0 +1 @@ -+# nothing -diff --git a/tests/export-mount-local/_env b/tests/export-mount-local/_env -new file mode 100644 -index 0000000..90b8e90 ---- /dev/null -+++ b/tests/export-mount-local/_env -@@ -0,0 +1,7 @@ -+export TOPLEVEL_NAMESPACE=nfs-utils -+export PKG_NAMESPACE=nfs-utils -+export RELATIVE_PATH=export-mount-local -+export PACKAGE=nfs-utils -+export PACKAGE_NAME=nfs-utils -+export PKG_LIST=nfs-utils nfs-utils-lib libnfsidmap libsss_idmap libtirpc rpcbind -+export TEST=/nfs-utils/export-mount-local -diff --git a/tests/export-mount-local/runtest.sh b/tests/export-mount-local/runtest.sh -new file mode 100755 -index 0000000..e72e0f4 ---- /dev/null -+++ b/tests/export-mount-local/runtest.sh -@@ -0,0 +1,304 @@ -+#!/bin/bash -+# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: test for: export-mount -+# Author: Jianhong Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2014 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh -+. /usr/share/beakerlib/beakerlib.sh || exit 1 -+ -+#=============================================================================== -+ -+#signal trap -+trap "cleanup" SIGINT SIGTERM SIGHUP SIGQUIT -+cleanup() { -+ rlFileRestore -+ rm -rf $expdir $nfsmp -+} -+ -+#global var define -+BZ=exp-mount-local -+expdir=/exportDir-$BZ -+nfsmp=/mnt/nfsmp-$BZ -+subexpdir=/exportDir-$BZ/sub -+tmpnfsmp=/tmp/nfsmp-$BZ -+ -+host="$HOSTNAME" -+# in case "localhost.localdomain" -+echo "$host" | grep -q "localhost" && host="localhost" -+ -+rlJournalStart -+ rlPhaseStartSetup do-Setup- -+ # Load beakerlib you needed -+ rlImport kernel/base -+ read ipv4 _nil <<<$(getDefaultIp) -+ read ipv6s _nil <<<$(getDefaultIp 6 global) -+ ipv6="[$ipv6s]" -+ envinfo -+ rlFileBackup /etc/exports /etc/sysconfig/nfs /etc/nfs.conf /etc/hosts -+ if [ "$host" = "localhost" ]; then -+ run "echo '$ipv4 $host' >> /etc/hosts" -+ if [ -n "$ipv6s" ]; then -+ run "echo '$ipv6s $host' >> /etc/hosts" -+ fi -+ run "cat /etc/hosts" - -+ fi -+ run 'rm -rf $expdir $nfsmp && mkdir -p $expdir $nfsmp' -+ run 'rm -rf $subexpdir $tmpnfsmp && mkdir -p $subexpdir $tmpnfsmp' -+ run 'echo "/tmp *(ro,sync)" >/etc/exports' -+ run 'service_nfs restart' -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ run 'ls_nfsvers' -+ rlPhaseEnd -+ -+for V in $(ls_nfsvers); do -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv4 -+ run "exportfs -au && exportfs -iv $ipv4:$expdir -o ro,sync,no_root_squash" -+ run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ if [ -n "$ipv6s" ]; then -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv6-x -+ run 'mount -o vers=$V $ipv6:$expdir $nfsmp' 1-255 -+ [ $? = 0 ] && run "umount $nfsmp" -+ rlPhaseEnd -+ fi -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-host -+ run 'mount -o vers=$V $host:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ -+ if [ -n "$ipv6s" ]; then -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv6 -+ run "exportfs -au && exportfs -iv $ipv6:$expdir -o ro,sync,no_root_squash" -+ run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv4-x -+ run 'mount -o vers=$V $ipv4:$expdir $nfsmp' 1-255 -+ [ $? = 0 ] && run "umount $nfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-host -+ if [ -n "$(dig -t aaaa $HOSTNAME +short)" ]; then -+ run 'mount -o vers=$V $host:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ fi -+ rlPhaseEnd -+ fi -+ -+ rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-host -+ run "exportfs -au && exportfs -iv $host:$expdir -o ro,sync,no_root_squash" -+ run 'mount -o vers=$V $host:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv4 -+ run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ if [ -n "$ipv6s" ]; then -+ rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv6 -+ if [ -n "$(dig -t aaaa $HOSTNAME +short)" ]; then -+ run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -+ run 'umount $nfsmp' -+ fi -+ rlPhaseEnd -+ fi -+ -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv4 -+ run 'echo "$expdir *(ro,sync,no_root_squash)" >/etc/exports' -+ run 'echo "$subexpdir $ipv4(ro,sync,no_root_squash)" >>/etc/exports' -+ run 'service_nfs restart' -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ run 'showmount -e' - -+ run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -+ run 'mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ if [ -n "$ipv6s" ]; then -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv6-x -+ run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -+ run 'mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp' 1-255 "should not mount sub-directory with different ip" -+ [ $? = 0 ] && run "umount $tmpnfsmp" -+ run "umount $nfsmp" -+ rlPhaseEnd -+ fi -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-host -+ run 'mount -o vers=$V $host:$expdir $nfsmp' -+ run 'mount -o vers=$V $host:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ -+ if [ -n "$ipv6s" ]; then -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv4-x -+ run 'echo "$expdir *(ro,sync,no_root_squash)" >/etc/exports' -+ run 'echo "$subexpdir $ipv6s(ro,sync,no_root_squash)" >>/etc/exports' -+ run 'service_nfs restart' -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ run 'showmount -e' - -+ run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -+ run 'mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp' 1-255 "should not mount sub-directory with different ip" -+ [ $? = 0 ] && run "umount $tmpnfsmp" -+ run "umount $nfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv6 -+ run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -+ run 'mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-host -+ run 'mount -o vers=$V $host:$expdir $nfsmp' -+ run 'mount -o vers=$V $host:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ fi -+ -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv4 -+ run 'echo "$expdir *(ro,sync,no_root_squash)" >/etc/exports' -+ run 'echo "$subexpdir $host(ro,sync,no_root_squash)" >>/etc/exports' -+ run 'service_nfs restart' -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ run 'showmount -e' - -+ run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -+ run 'mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ if [ -n "$ipv6s" ]; then -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv6 -+ run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -+ run 'mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ fi -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-host -+ run 'mount -o vers=$V $host:$expdir $nfsmp' -+ run 'mount -o vers=$V $host:$subexpdir $tmpnfsmp' -+ run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-nfsV$V-default-option-overridden-by-client-specific-option -+ run "echo '$expdir -ro,sync *(rw,no_root_squash)' >/etc/exports" -+ run "service_nfs restart" -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "exports option should be overridden by client specific." -+ run "rm -rf $nfsmp/test*" -+ run "umount $nfsmp" -+ run "echo '$expdir -ro,sec=sys,sync *(rw,no_root_squash)' >/etc/exports" 0 "sec=sys may cause it to be failed." -+ run "exportfs -rv" -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "exports option should be overridden by client specific." -+ run "rm -rf $nfsmp/test*" -+ run "umount $nfsmp" -+ rlPhaseEnd -+done -+ -+ rlPhaseStartTest do-Test-exports-options-twice -+ run 'echo "/ *(sync,hide,no_wdelay)" > /etc/exports' -+ run "service_nfs restart" -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ -+ # Count all options from list printed by exportfs -s(rhel-7) or exportfs -v(rhel-6) -+ allOptions=$( (exportfs -s 2>/dev/null || exportfs -v) | sed 's/^.*(//;s/)$//;s/,/\n/g' | wc -l) -+ # Count unique options from list printed by exportfs -s(rhel-7) or exportfs -v(rhel-6) -+ uniqOptions=$( (exportfs -s 2>/dev/null || exportfs -v) | sed 's/^.*(//;s/)$//;s/,/\n/g' | sort | uniq | wc -l) -+ -+ log "{Info} exportfs -s(rhel-7) or exportfs -v(rhel-6) will print option list for each export path" -+ log "{Info} All options printed by exportfs -s(rhel-7) or exportfs -v(rhel-6) (sorted):" -+ run "(exportfs -s 2>/dev/null || exportfs -v) | sed 's/^.*(//;s/)$//;s/,/\n/g' | sort" -+ log "{Info} For exported path '/', there are $allOptions options printed in all options list and $uniqOptions of them are unique" -+ run 'test $uniqOptions -eq $allOptions' 0 "Should not output any options twice, quantity of all options should be equal to quantity of unique options" -+ for opt in sync hide no_wdelay; do -+ run "(exportfs -s 2>/dev/null || exportfs -v) | grep -q $opt" 0 "Option list should contain option $opt specified in /etc/exports" -+ done -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-server-side-using-bind-mount -+ run "dd if=/dev/zero of=workspace.image bs=3M count=500" -+ run "mkfs -t ext3 -F workspace.image" -+ run "mkdir -p /workspace" -+ run "mount -o loop workspace.image /workspace" -+ run "mkdir -p /workspace/vmcore /srv/nfs/vmcore" -+ run "touch /workspace/work_dir /workspace/vmcore/vmcore_dir" -+ run "mount --bind /workspace/vmcore /srv/nfs/vmcore" -+ run "echo '/srv/nfs/vmcore *(rw,no_root_squash)' > /etc/exports" -+ run "echo '/workspace *(rw,no_root_squash)' >> /etc/exports" -+ run "service_nfs restart" -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ run "mount $host:/workspace $nfsmp" -+ run "ls $nfsmp/work_dir" -+ run "umount $nfsmp" -+ run "exportfs -au" && run "service_nfs stop" -+ run "umount /srv/nfs/vmcore" -+ run "umount /workspace" -+ run "rm -rf /workspace /srv/nfs/vmcore" -+ run "rm workspace.image" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-mount-nfsv4-show-wrong-port -+ run "echo '$expdir *(rw,no_root_squash)' >>/etc/exports" -+ run "service_nfs restart" -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ run "exportfs -v" -+ run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" -+ run "mount -t nfs4 | grep $nfsmp" - -+ run "mount -t nfs4 | grep $nfsmp | grep -q port=2049" 0 "Should show port=2049" -+ run "umount $nfsmp" -+ run "echo '[nfsd]' > /etc/nfs.conf" -+ run "echo 'port=20050' >> /etc/nfs.conf" -+ run "service_nfs restart" -+ run "sleep 10" -+ run "rpcinfo -p | grep -w nfs | grep 20050" -+ run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" - -+ if [ $? -eq 0 ]; then -+ run "mount -t nfs4" - -+ run "mount -t nfs4 | grep -q port=20050" 0 "Should show port=20050" -+ run "umount $nfsmp" -+ fi -+ run "mount -t nfs -o vers=4,port=0 localhost:$expdir $nfsmp" - -+ if [ $? -eq 0 ]; then -+ run "mount -t nfs4" - -+ run "mount -t nfs4 | grep -q port=20050" 0 "Should show port=20050" -+ run "umount $nfsmp" -+ fi -+ run "mount -t nfs -o vers=4,port=20050 localhost:$expdir $nfsmp" -+ run "mount -t nfs4 | grep $nfsmp" - -+ run "mount -t nfs4 | grep $nfsmp | grep -q port=20050" 0 "Should show port=20050" -+ run "umount $nfsmp" -+ rlPhaseEnd -+ -+ rlPhaseStartCleanup do-Cleanup- -+ run 'rm -rf $expdir $nfsmp $subexpdir $tmpnfsmp' -+ rlFileRestore -+ run "service_nfs restart" -+ #avoid issues restarting the server too quickly -+ sleep 10 -+ rlPhaseEnd -+rlJournalEnd -+#rlJournalPrintText -+#enable_avc_check -diff --git a/tests/export-mount-local/subtest.yml b/tests/export-mount-local/subtest.yml -new file mode 100644 -index 0000000..1a77920 ---- /dev/null -+++ b/tests/export-mount-local/subtest.yml -@@ -0,0 +1 @@ -+attr: {ssched: yes} -diff --git a/tests/exportfs/PURPOSE b/tests/exportfs/PURPOSE -new file mode 100644 -index 0000000..3299ed8 ---- /dev/null -+++ b/tests/exportfs/PURPOSE -@@ -0,0 +1,2 @@ -+Description: test for command exportfs -+Author: Stevens Yin -diff --git a/tests/exportfs/_env b/tests/exportfs/_env -new file mode 100644 -index 0000000..b57092a ---- /dev/null -+++ b/tests/exportfs/_env -@@ -0,0 +1,7 @@ -+export TOPLEVEL_NAMESPACE=nfs-utils -+export PKG_NAMESPACE=nfs-utils -+export RELATIVE_PATH=exportfs -+export PACKAGE=nfs-utils -+export PACKAGE_NAME=nfs-utils -+export PKG_LIST=nfs-utils nfs-utils-lib libnfsidmap libsss_idmap libtirpc rpcbind -+export TEST=/nfs-utils/exportfs -diff --git a/tests/exportfs/runtest.sh b/tests/exportfs/runtest.sh -new file mode 100755 -index 0000000..8e34a8c ---- /dev/null -+++ b/tests/exportfs/runtest.sh -@@ -0,0 +1,313 @@ -+#!/bin/bash -+# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: test for command exportfs -+# Author: Stevens Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh -+. /usr/share/beakerlib/beakerlib.sh || exit 1 -+ -+#=============================================================================== -+ -+#setting locale as test check infomration on man pages -+export LC_ALL=en_US.utf8 -+ -+BZ=exportfs -+nfsmp=/mnt/nfsmp-$BZ -+expdir=/expdir-$BZ -+prog=exportfs -+ -+rlJournalStart -+ rlPhaseStartSetup do-Setup -+ # Load beakerlib you needed -+ rlImport kernel/base -+ envinfo -+ read IP4 _nil <<<$(getDefaultIp) -+ read IP6 _nil <<<$(getDefaultIp 6) -+ if echo "$HOSTNAME" | grep -q "localhost"; then -+ hostnamectl set-hostname exportfs.test -+ fi -+ #clean nfs garbage, avoid affect from pre case -+ { exportfs -ua; service nfs stop &>/dev/null; } -+ rlFileBackup /etc/sysconfig/nfs /etc/exports -+ rlFileBackup --clean /etc/exports.d/ -+ run 'rm -f /etc/exports.d/*' -+ run 'mkdir -p $nfsmp $expdir' -+ run 'echo "$expdir *(rw,no_root_squash,fsid=0)" > /etc/exports' -+ service_nfs start -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test"-$prog-with-wrong-option" -+ run 'exportfs -xxxx 2>&1' 1-255 "should exit with an error code" -+ run 'exportfs -xxxx 2>&1 | egrep -i "(usage:|try.*for more info)"' 0 "should output usage to user" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test"-$prog-IpV6" -+ run 'echo "[$IP6]:$expdir"' - -+ run 'exportfs -vi "[$IP6]:$expdir"' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-exportfs-a-and-o-check -+ run 'cp /etc/exports /etc/exports.bak' -+ run 'mkdir ${expdir}2' -+ run 'echo "${expdir}2 *(ro)" >>/etc/exports' -+ run 'exportfs -a' 0 "exportfs -a to export all directories" -+ run 'showmount -e' -+ run 'test $(showmount -e | grep $expdir | wc -l) = 2' 0 "there should be two expdir entries" -+ run 'exportfs -v' -+ run 'exportfs -v | sed -n -e "/\t/! {N; s/[\n\t]/ /g;p}" -e "/\t/p" | -+ grep "${expdir}2" | grep ro | grep -w root_squash' 0 "check the the export options" -+ -+ run 'exportfs -i -o rw,no_root_squash *:${expdir}2' 0 "exportfs -i -o override default export options" -+ run 'exportfs -v' -+ run 'exportfs -v | sed -n -e "/\t/! {N; s/[\n\t]/ /g;p}" -e "/\t/p" | -+ grep "${expdir}2" | grep rw | grep -w no_root_squash' 0 "check if the options be override" -+ run 'mv /etc/exports.bak /etc/exports' 0 "Restore /etc/exports" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-reexport-check -+ run 'exportfs -rv' 0 "exportfs -rv to reexport all directories" -+ run 'exportfs -v | grep "${expdir}2"' 1 "${expdir}2 removed from /etc/exports so no entry about it exported" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-exportfs-u-check -+ run 'exportfs -u' 0 "exportfs -u unexport one or more directories" -+ run 'showmount -e | grep "$expdir"' 0 "$expdir unexport" -+ run 'exportfs *:${expdir}2' -+ run 'exportfs' - -+ run "exportfs -v -u *:$expdir" 0 "unexport one directory only" -+ run 'exportfs' - -+ run "exportfs | grep '${expdir}2'" 0 "${expdir}2 should not be unexported" -+ run 'exportfs -ua' -+ run 'exportfs -f' 0 "exportfs -f flush everything out of the kernel?s export table" -+ run 'rm -rf ${expdir}2' -+ rlPhaseEnd -+ -+ # test NFS_MAXPATHLEN(1024) boundary value test -+ dname=$(echo {1..88}|sed 's/ /_/g') #dname with 254 chars -+ fpath=/$dname/$dname/$dname/$dname #fpath with 1020 chars -+ fpath2=/$dname/$dname/$dname/$dname/abc #fpath with 1024 chars -+ fpath3=/$dname/$dname/$dname/$dname/abckkkk #fpath with 1028 chars -+ rlPhaseStartTest do-Test-exportfs-pathlenth-${#fpath}-${#fpath2}-${#fpath3} -+ run "mkdir -p $fpath" 0 "create a long export path(${#fpath})" -+ run "mkdir -p $fpath2" 0 "create a long export path(${#fpath2})" -+ run "mkdir -p $fpath3" 0 "create a long export path(${#fpath3})" -+ run "exportfs -vi $IP4:$fpath &>std.log" 0 "exportfs long path(${#fpath}) should success" -+ run 'cat std.log' - -+ run 'grep "does not support NFS export" std.log' 1 -+ -+ run "exportfs -vi $IP4:$fpath2 &>std2.log" 0 "exportfs long path(${#fpath2}) should success" -+ run 'cat std2.log' - -+ run 'grep "does not support NFS export" std2.log' 1 -+ -+ run "exportfs -vi $IP4:$fpath3 &>std3.log" 1 "exportfs long path(${#fpath3}) should fail" -+ run 'cat std3.log' - -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-exportfs-dir-with-white-space -+ run 'mkdir -p "/dir with white spaces"' -+ run 'exportfs -vi $IP4:"/dir with white spaces"' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-exportfs-dir-invalid-arg-not-exist -+ run 'exportfs -ua; exportfs -i *:/not.exist &> stdout.log' 1-255 -+ run 'cat stdout.log' - -+ run 'test -n stdout.log' 0 "Path not exist, should output error info to user." -+ run 'cat stdout.log | grep -i usage' 0,1 "should output the usage for invalid argument" -+ run 'exportfs' - -+ run 'test -z "$(exportfs)"' 0,1 "should not exported the invalid path" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-exportfs-dir-without-uuid-and-fsid -+ run 'exportfs -ua; exportfs -i *:/dev/shm &> stdout.log' 1-255 -+ run 'cat stdout.log' - -+ run 'test -n stdout.log' 0 "Path no uuid and fsid, should output error info to user" -+ run 'exportfs' - -+ run 'test -z "$(exportfs)"' 0,1 "should not exported the invalid path" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-exportfs-when-/proc/fs/nfsd-not-mount -+ run 'mkdir -p ${expdir}_tmp' -+ run 'service nfs start' -+ run 'pkill rpc.mountd && umount /proc/fs/nfsd' -+ run 'exportfs -iv *:${expdir}_tmp' -+ run 'mount -t nfsd nfsd /proc/fs/nfsd' 0-255 "restore env: mount nfsd" -+ run 'rm -rf ${expdir}_tmp' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-option-nordirplus -+ #nfsv3 export option nordirplus support test -+ run 'service nfs start' -+ run 'exportfs -i -o nordirplus "*:$expdir"' -+ run 'mount -o vers=3 localhost:$expdir $nfsmp' -+ run 'grep $nfsmp /proc/mounts' -+ run 'grep nfs /proc/mounts | grep nordirplus' - -+ run 'man 5 exports | col -b | grep nordirplus' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-extra-export.d-files-base -+ # test files under /etc/exports.d -+ run 'rm -rf /etc/exports.d' -+ run 'exportfs -r 2>&1 | grep "No such file or directory"' 1 "should not output garbage log" -+ run 'mkdir -p /etc/exports.d' -+ run 'echo "$expdir *(rw,no_root_squash)" > /etc/exports.d/test.exports' -+ run 'cp /etc/exports /etc/exports.bak' -+ run 'echo "" > /etc/exports' -+ run 'cat /etc/exports.d/test.exports' - -+ run 'exportfs -ua; exportfs -a' 0 "export all directories" -+ run 'showmount -e | grep $expdir' -+ run 'mount localhost:$expdir $nfsmp' -+ run 'grep $nfsmp /proc/mounts' -+ run 'umount $nfsmp' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-extra-export.d-files-max-filelen -+ name_max=$(getconf NAME_MAX $expdir) -+ min_export_sz=$(expr length ".exports") -+ max_export_len=$(($name_max-$min_export_sz)) -+ run 'mkdir ${expdir}.max_length' -+ run 'echo "${expdir}.max_length *(ro)" > /etc/exports.d/$(printf "%0${max_export_len}d").exports' -+ run 'ls -la /etc/exports.d/' - -+ run 'exportfs -rv' 0 "exportfs -rv to reexport all directories" -+ run 'showmount -e | grep "max_length"' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-extra-export.d-files-filename-format -+ run 'mkdir ${expdir}.should_ignored' -+ run 'echo "${expdir}.should_ignored *(rw)" > /etc/exports.d/.ignored.exports' -+ run 'echo "${expdir}.should_ignored *(rw)" > /etc/exports.d/ignored.export' -+ run 'echo "${expdir}.should_ignored *(rw)" > /etc/exports.d/exports' -+ run 'ls -la /etc/exports.d/' - -+ run 'exportfs -rv' 0 "exportfs -rv to reexport all directories" -+ run 'showmount -e | grep "should_ignored"' 1 -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-extra-export.d-files-filetype-link -+ run 'ln -s /etc/exports.d/ignored.export /etc/exports.d/linked.exports' -+ run 'ls -la /etc/exports.d/' - -+ run 'exportfs -rv' 0 "exportfs -rv to reexport all directories" -+ run 'showmount -e | grep "should_ignored"' 0 "should consider the link file" -+ run 'test $(showmount -e | grep $expdir | wc -l) = 3' 0 "there should be two expdir entries" -+ run 'rm -rf ${expdir}.*' -+ run 'rm -rf /etc/exports.d' -+ run 'mv /etc/exports.bak /etc/exports' 0 "Restore /etc/exports" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-option-mountpoint -+ run "service_nfs start" -+ run "exportfs -ua" -+ run "mkdir -p ${expdir}_share" -+ run "exportfs -i *:${expdir}_share -o mp" -+ run "exportfs -v" - -+ run "mountpoint ${expdir}_share" 1-255 "It is not mounted yet" -+ # The mount point will still show... but when trying to -+ # mount the directory the client mount should be failed -+ run "showmount -e | grep share" - -+ run "timeout 60 mount localhost:${expdir}_share $nfsmp" 1-123,125-255 "Should be failed without hang" -+ [ $? -eq 0 ] && run "umount $nfsmp" -+ log "{Info} Creating a small fs on loopback device and mount it." -+ run "dd if=/dev/zero of=fs_tmp.img bs=1M count=100" - -+ run "losetup /dev/loop0 fs_tmp.img" - -+ run "mkfs /dev/loop0" - -+ run "mount /dev/loop0 ${expdir}_share" -+ run "mountpoint ${expdir}_share" 0 "It should be mounted now" -+ run "showmount -e | grep share" 0 "Should be listed in output of showmount -e now" -+ run "mount localhost:${expdir}_share $nfsmp" 0 "Should success now" -+ [ $? -eq 0 ] && run "umount $nfsmp" -+ log "{Info} Recovering it." -+ run "service_nfs stop" -+ run "umount ${expdir}_share" -+ run "losetup -d /dev/loop0" - -+ run "rm -f fs_tmp.img" - -+ run "rm -rf ${expdir}_share" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"exportfs -u incorrectly exits with a 1 whenever the exportlist has multiple FQDN exports" -+ run "exportfs -ua" -+ run "exportfs -v" - -+ run "exportfs -o rw,sync localhost:$expdir" -+ run "exportfs -o rw,sync $IP4:$expdir" -+ run "exportfs -v" - -+ run 'test $(exportfs -v | grep $expdir | wc -l) = 2' -+ run "exportfs -u $IP4:$expdir" 0 "should not exit with 1 when the exportlist has multiple FQDN exports" -+ run "exportfs -v" - -+ run 'test $(exportfs -v | grep $expdir | wc -l) = 1' -+ run "exportfs -u localhost:$expdir" -+ run "exportfs -v" - -+ run 'test $(exportfs -v | grep $expdir | wc -l) = 0' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"exportfs -u cannot unexport when the specified path involves a trailing /" -+ run "exportfs -ua" -+ run "exportfs -o rw,sync localhost:$expdir" -+ run "exportfs -u not.exist:$expdir" 1-255 "should be failed and return error code" -+ run "exportfs -v" - -+ run "test $(exportfs | wc -l) -ne 0" 0 "Should not be cleared as previous cmd failed" -+ run "exportfs -u localhost:$expdir/" 0 "Should unexport even if path involves trailing /" -+ run "exportfs -v" - -+ run "test $(exportfs | wc -l) -eq 0" 0 "Should have nothing to export" -+ run "exportfs -ua" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"exportfs -u can exit with status 1 if there are multiple ip exports that cannot be resolved to hostnames" -+ # Should test with un-used ip address -+ run "ping -c 1 192.168.1.100 >/dev/null || ping -c 1 192.168.1.101 >/dev/null" 1 -+ [ "$?" = "0" ] && { -+ log "{WARN} Should test with un-used ip address, skip the test." -+ report_result $TEST FAIL -+ exit 0 -+ } -+ run "exportfs -ua && exportfs -v" - -+ log "{INFO} Test with ip that cannot be resolved to a hostname." -+ run "exportfs -o rw,sync 192.168.1.100:$expdir" -+ run "exportfs -o rw,sync 192.168.1.101:$expdir" -+ run "exportfs -v" - -+ run 'test $(exportfs -v | grep $expdir | wc -l) = 2' -+ run "exportfs -u 192.168.1.101:$expdir" 0 "Should not exit with 1 if unexports successfully." -+ run "exportfs -v" - -+ run 'test $(exportfs -v | grep $expdir | wc -l) = 1' -+ run "exportfs -u 192.168.1.100:$expdir" 0 "Should not exit with 1 if unexports successfully." -+ run "exportfs -v" - -+ run 'test $(exportfs -v | grep $expdir | wc -l) = 0' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-'exportfs: support "security_label" export option' -+ run "exportfs -ua && exportfs -v" - -+ run "exportfs -o security_label localhost:$expdir" -+ run "exportfs -v" - -+ run "exportfs -v | grep -q security_label" -+ run "exportfs -ua" -+ rlPhaseEnd -+ -+ rlPhaseStartCleanup do-Cleanup -+ rlFileRestore -+ if echo "$HOSTNAME" | grep -q "localhost"; then -+ hostnamectl set-hostname $HOSTNAME -+ fi -+ rm -rf $nfsmp $expdir -+ run "service_nfs restart" -+ rlPhaseEnd -+rlJournalEnd -+#rlJournalPrintText -+ -diff --git a/tests/mount/PURPOSE b/tests/mount/PURPOSE -new file mode 100644 -index 0000000..3c215eb ---- /dev/null -+++ b/tests/mount/PURPOSE -@@ -0,0 +1,2 @@ -+Description: Test for command mount.nfs{,4} -+Author: Stevens Yin -diff --git a/tests/mount/_env b/tests/mount/_env -new file mode 100644 -index 0000000..d016f7c ---- /dev/null -+++ b/tests/mount/_env -@@ -0,0 +1,7 @@ -+export TOPLEVEL_NAMESPACE=nfs-utils -+export PKG_NAMESPACE=nfs-utils -+export RELATIVE_PATH=mount -+export PACKAGE=nfs-utils -+export PACKAGE_NAME=nfs-utils -+export PKG_LIST=nfs-utils nfs-utils-lib libnfsidmap libsss_idmap libtirpc rpcbind -+export TEST=/nfs-utils//mount -diff --git a/tests/mount/runtest.sh b/tests/mount/runtest.sh -new file mode 100755 -index 0000000..fb2f585 ---- /dev/null -+++ b/tests/mount/runtest.sh -@@ -0,0 +1,113 @@ -+#!/bin/bash -+# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: Test for command mount.nfs{,4} -+# Author: Stevens Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh -+. /usr/share/beakerlib/beakerlib.sh || exit 1 -+ -+#=============================================================================== -+ -+mnt=/nfs-mount -+expdir=/expdir -+expdir_with_more_slash=$expdir///expdir-mount -+prog=mount.nfs -+ -+rlJournalStart -+ rlPhaseStartSetup do-Setup -+ # Load beakerlib you needed -+ rlImport kernel/base -+ envinfo -+ read IP4 _nil <<<$(getDefaultIp) -+ rlFileBackup /etc/sysconfig/nfs /etc/exports -+ run "mkdir -p $mnt $expdir $expdir_with_more_slash" -+ run "echo '$expdir *(rw,no_root_squash)' > /etc/exports" -+ run "echo '$expdir_with_more_slash *(rw,no_root_squash)' >> /etc/exports" -+ run 'service_nfs restart' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-$prog-with-wrong-option -+ run "$prog -xxxx" 1-255 "should exit with an error code" -+ run "$prog -xxxx 2>&1 | egrep -i '(usage:|try.*for more info)'" 0 "should output usage to user" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-$prog-without-args -+ run "$prog" 1-255 "should exit with an error code" -+ run "$prog 2>&1 | egrep -i '(usage:|try.*for more info)'" 0 "should output usage to user" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-$prog--h -+ run "$prog -h" - -+ std=$($prog -h 2>&1) -+ run "$prog -h 2>&1 | egrep -i usage:" 0 "should output usage to user" -+ [ $? = 0 ] && { -+ options=$(echo "$std"|grep -o '\[-[a-z]\+\]') -+ [ ${#options} -gt 3 ] && { -+ optionNuma=$((${#options} - 3)) -+ optionNumb=$(echo "$std" | sed -n "/\t-$options/p" | wc -l) -+ optionNumc=$(echo "$std" | sed -n "/\t-[a-zA-Z]/p" | wc -l) -+ run "test $optionNuma = $optionNumb" -+ run "test $optionNuma = $optionNumc" -+ run 'echo "$std" | sed -n "/\t-$options/p" | grep " "' 1 -+ } -+ } -+ rlPhaseEnd -+ -+if rpcinfo -p | awk '$2=="2"' | grep -q -w nfs; then -+ rlPhaseStartTest do-Test-$prog--o-vers=2 -+ run "$prog localhost:$expdir $mnt -o vers=2" -+ run "umount -vvv $mnt &> >(tee verbose.log)" -+ run 'test $(wc -l >(tee verbose.log)" -+ run 'test $(wc -l >(tee verbose.log)" -+ run 'test $(wc -l -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2006 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh -+. /usr/share/beakerlib/beakerlib.sh || exit 1 -+ -+#=============================================================================== -+ -+TESTNAME=${TEST/*\//} -+expdir=/exportdir/home -+nfsmp=/mnt/$TESTNAME -+ -+ORIGINAL_HOSTNAME=$HOSTNAME -+ -+rlJournalStart -+ rlPhaseStartSetup do-$role-Setup- -+ # Load beakerlib you needed -+ rlImport kernel/base -+ envinfo -+ rlFileBackup /etc/sysconfig/nfs /etc/exports -+ if echo "$HOSTNAME" | grep -q "localhost"; then -+ # In case "localhost.localdomain" -+ hostnamectl set-hostname nfs-mount-options-all.test -+ HOSTNAME=nfs-mount-options-all.test -+ fi -+ run 'rm -rf $expdir $nfsmp && mkdir -p $expdir $nfsmp' -+ run 'chmod 777 $expdir' -+ run 'echo "$expdir *(rw,sync,no_root_squash)" >/etc/exports' -+ run 'service_nfs restart' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-$role-Test-fg_bg_retry_devil -+ read IP4 _nil <<<$(getDefaultIp) -+ run 'iptables -F' - -+ MNT_OPTS="vers=3,soft,fg,retry=1" -+ log "{Info} Retry 1 minute (60s) NFS mount in *foreground* before giving up." -+ run 'iptables -A INPUT -s $IP4 -j DROP' - -+ run 'iptables -L' - -+ run 'sleep 10' -+ start_time=$(date +%s) -+ run "mount ${IP4}:$expdir $nfsmp -o ${MNT_OPTS}" 1-255 -+ retry_time=$((`date +%s` - start_time)) -+ log "{Info} Actually the nfs.mount hang $retry_time seconds." -+ run 'ps aux | grep -v grep | grep ${MNT_OPTS}' 1 -+ run 'iptables -F' - -+ run 'ip6tables -F' - -+ run 'mountpoint $nfsmp && umount $nfsmp' 1 -+ -+ MNT_OPTS="vers=3,soft,bg,retry=1" -+ log "{Info} Retry 1 minute (60s) NFS mount in *background* before giving up." -+ run 'iptables -A INPUT -s $IP4 -j DROP' - -+ run 'iptables -L' - -+ run 'sleep 10' -+ # When background exit and fork an childprocess, still, returns 0 -+ run "mount ${IP4}:$expdir $nfsmp -o ${MNT_OPTS}" 0 "should return ok" -+ if [ $? -eq 0 ]; then -+ # bg ground, the mount fork an child process -+ run 'ps aux | grep -v grep | grep ${MNT_OPTS}' 0 "works in bg.. show background process" -+ [ $? = 0 ] && { -+ log "{Info} We are sleeping a little longer than 60 seconds (retry=1)." -+ run "sleep $((retry_time + 10))" 0 "Actually a little more than $retry_time seconds." -+ # demo mounting process should exit after 60s as retry=1 (minute) -+ run 'ps aux | grep -v grep | grep ${MNT_OPTS}' 1 "retry=1 for 60s should works file after sleep 70s" -+ } -+ fi -+ run 'iptables -F' - -+ # should not mount successfully as it expired -+ run 'mountpoint $nfsmp && umount $nfsmp' 1 -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-retry-option-should-not-be-ignored -+ # test retry of the default value (2 minutes) for foreground - NFS(5) -+ run "service_nfs stop" -+ run "mount ${HOSTNAME}:$expdir $nfsmp &" -+ run "sleep 100 ; service_nfs start ; sleep 10" -+ run "nfsstat -m | grep $nfsmp" 0 -+ [ $? = 0 ] && run "umount $nfsmp" -+ -+ # test retry of 10 minutes for foreground -+ MNT_OPTS="retry=10" -+ log "\n{Info} ${MNT_OPTS}" -+ run "service_nfs stop" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS} &" -+ run "sleep 10 ; service_nfs start ; sleep 10" -+ run "nfsstat -m | grep $nfsmp" 0 -+ [ $? = 0 ] && run "umount $nfsmp" -+ -+ # test retry of 100 minutes for background -+ MNT_OPTS="bg,retry=100" -+ log "\n{Info} ${MNT_OPTS}" -+ run "service_nfs stop" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run "sleep 10 ; service_nfs start ; sleep 10" -+ run "nfsstat -m | grep $nfsmp" -+ [ $? = 0 ] && run "umount $nfsmp" -+ -+ # test retry of the default value (10000 minutes) for background - NFS(5) -+ MNT_OPTS="bg" -+ log "\n{Info} ${MNT_OPTS}" -+ run "service_nfs stop" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run "sleep 10 ; service_nfs start ; sleep 10" -+ run "nfsstat -m | grep $nfsmp" -+ [ $? = 0 ] && run "umount $nfsmp" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-$role-Test-resvport_noresvport_test -+ run 'service_nfs restart' -+ MNT_OPTS="resvport" -+ log "{Info} ${MNT_OPTS}" -+ run 'mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}' 0 -+ run 'mountpoint $nfsmp && umount $nfsmp' -+ -+ MNT_OPTS="noresvport" -+ log "{Info} ${MNT_OPTS}" -+ run 'mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}' 1-255 "should got permission denied" -+ run 'mountpoint $nfsmp && umount $nfsmp' 1 -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-$role-Test-cache_nocache_test -+ MNT_OPTS="noac" -+ log "\n{Info} ${MNT_OPTS}" -+ run 'chmod 777 $expdir' -+ run 'touch $expdir/foo.txt && chmod 777 $expdir/foo.txt' -+ run 'service_nfs restart' -+ run 'mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}' 0 -+ [ $? -eq 0 ] && { -+ ATTR_TMP1=$(ls -al $nfsmp | grep foo.txt | awk '{ print $1 }') -+ chmod 666 $expdir/foo.txt -+ sleep 1 -+ ATTR_TMP2=$(ls -al $nfsmp | grep foo.txt | awk '{ print $1 }') -+ log "{Info} $ATTR_TMP1 ~ $ATTR_TMP2" -+ run "[ x"$ATTR_TMP1" != x"$ATTR_TMP2" ]" 0 "with noac, attribution should not cached" -+ } -+ run 'mountpoint $nfsmp && umount $nfsmp' -+ run 'rm -f $expdir/foo.txt' -+ -+ MNT_OPTS="ac,acregmin=20,acregmax=40,acdirmin=30,acdirmax=60" -+ log "\n{Info} ${MNT_OPTS}" -+ run 'touch $expdir/foo.txt && chmod 777 $expdir/foo.txt' -+ run 'mkdir $expdir/foo.dir && chmod 777 $expdir/foo.dir' -+ run 'mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}' -+ [ $? -eq 0 ] && { -+ ATTR_TMPREG1=$(ls -al $nfsmp | grep foo.txt | awk '{ print $1 }') -+ ATTR_TMPDIR1=$(ls -al $nfsmp | grep foo.dir | awk '{ print $1 }') -+ chmod 666 $expdir/foo.txt -+ chmod 555 $expdir/foo.dir -+ sleep 7 -+ ATTR_TMPREG2=$(ls -al $nfsmp | grep foo.txt | awk '{ print $1 }') -+ sleep 7 #7+7 -+ ATTR_TMPDIR2=$(ls -al $nfsmp | grep foo.dir | awk '{ print $1 }') -+ sleep 30 #7+7+30 -+ ATTR_TMPREG3=$(ls -al $nfsmp | grep foo.txt | awk '{ print $1 }') -+ sleep 20 #7+7+30+20 -+ ATTR_TMPDIR3=$(ls -al $nfsmp | grep foo.dir | awk '{ print $1 }') -+ -+ log "{Info} Regfile Attribution: $ATTR_TMPREG1 ~ $ATTR_TMPREG2 ~ $ATTR_TMPREG3" -+ run '[ x"$ATTR_TMPREG1" == x"$ATTR_TMPREG2" -a x"$ATTR_TMPREG1" != x"$ATTR_TMPREG3" ]' -+ -+ log "{Info} Directory Attribution: $ATTR_TMPDIR1 ~ $ATTR_TMPDIR2 ~ $ATTR_TMPDIR3" -+ run '[ x"$ATTR_TMPDIR1" == x"$ATTR_TMPDIR2" -a x"$ATTR_TMPDIR1" != x"$ATTR_TMPDIR3" ]' -+ } -+ run 'mountpoint $nfsmp && umount $nfsmp' -+ run 'rm -f $expdir/foo.txt' -+ run 'rm -rf $expdir/foo.dir' -+ -+ MNT_OPTS="ac,actimeo=20" -+ log "\n{Info} ${MNT_OPTS}" -+ run 'mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}' -+ [ $? -eq 0 ] && { -+ run 'grep ${TESTNAME} /proc/mounts | grep "acregmin=20" | grep "acregmax=20" | grep "acdirmin=20" | grep "acdirmax=20"' -+ } -+ run 'mountpoint $nfsmp && umount $nfsmp' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-$role-Test-sharecache_nosharecache_test -+ MNT_OPTS="vers=3,nosharecache" -+ MNT_OPTS="nosharecache,ac,acregmin=30,acregmax=60" -+ log "\n{Info} ${MNT_OPTS}" -+ run 'chmod 777 $expdir' -+ run 'touch $expdir/foo.txt && chmod 777 $expdir/foo.txt' -+ run 'mkdir -p $nfsmp-{1,2}' -+ run 'service_nfs restart' -+ -+ run 'mount ${HOSTNAME}:$expdir $nfsmp-1 -o ${MNT_OPTS} && -+ mount ${HOSTNAME}:$expdir $nfsmp-2 -o ${MNT_OPTS}' -+ [ $? = 0 ] && { -+ chmod 555 $nfsmp-1/foo.txt -+ sleep 1 -+ chmod 444 $nfsmp-2/foo.txt -+ -+ ATTR_TMPREG1=$(ls -al $nfsmp-1 | grep foo.txt | awk '{ print $1 }') -+ ATTR_TMPREG2=$(ls -al $nfsmp-2 | grep foo.txt | awk '{ print $1 }') -+ ATTR_TMPREG3=$(ls -al $expdir/ | grep foo.txt | awk '{ print $1 }') -+ -+ log "{Info} $ATTR_TMPREG1 ~ $ATTR_TMPREG2 ~ $ATTR_TMPREG3" -+ run '[ x"$ATTR_TMPREG1" == x"$ATTR_TMPREG2" -a x"$ATTR_TMPREG1" == x"$ATTR_TMPREG3" ]' -+ } -+ run 'mountpoint $nfsmp-1 && umount $nfsmp-1' -+ run 'mountpoint $nfsmp-2 && umount $nfsmp-2' -+ run 'rm -f $expdir/foo.txt' -+ run 'rm -rf $nfsmp-{1,2}' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-$role-Test-lookupcache_test -+ MNT_OPTS="ac,acdirmin=30,acdirmax=60,lookupcache=pos" -+ log "\n{Info} ${MNT_OPTS}" -+ run 'chmod 777 $expdir' -+ run 'mkdir -p $expdir/foodir && touch $expdir/foodir/foo-1.txt' -+ run 'service_nfs restart' -+ run 'mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}' -+ [ $? = 0 ] && { -+ run 'ls -l $nfsmp/foodir/ | grep foo-1.txt' -+ run 'rm -f $expdir/foodir/foo-1.txt' -+ run 'sleep 1' - -+ log "{Info} Checking again..." -+ run 'ls -l $nfsmp/foodir/ | grep foo-1.txt' 1 -+ run 'umount $nfsmp' -+ } -+ run 'rm -fr $expdir' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-$role-Test-rsize-wsize -+ minSize=1024 -+ minFixSize=4096 -+ #maxSize=1048576 -+ run "cat /proc/fs/nfsd/max_block_size" 0 "The default max block size varies depending on RAM size, with a maximum of 1M." -+ maxSize=$(cat /proc/fs/nfsd/max_block_size) -+ run 'mkdir -p $expdir' -+ run 'echo "$expdir *(rw,sync,no_root_squash)" > /etc/exports' -+ run 'service_nfs restart' -+ MNT_OPTS="rsize=1024,wsize=1024" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run 'grep $nfsmp /proc/mounts' - -+ run "cat /proc/mounts | grep -q $MNT_OPTS" -+ run 'umount $nfsmp' -+ MNT_OPTS="rsize=8192,wsize=8192" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run 'grep $nfsmp /proc/mounts' - -+ run "cat /proc/mounts | grep -q $MNT_OPTS" -+ run 'umount $nfsmp' -+ MNT_OPTS="rsize=1,wsize=255" # less than min_size($minSize) -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run 'grep $nfsmp /proc/mounts' - -+ run "cat /proc/mounts | grep -q rsize=$minFixSize,wsize=$minFixSize" 0 "Specified values lower than $minSize are replaced with $minFixSize" -+ run 'umount $nfsmp' -+ MNT_OPTS="rsize=1048577,wsize=2048576" # great than max_size($maxSize) -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run 'grep $nfsmp /proc/mounts' - -+ run "cat /proc/mounts | grep -q rsize=$maxSize,wsize=$maxSize" 0 "Specified values more than $maxSize are replaced with $maxSize" -+ run 'umount $nfsmp' -+ MNT_OPTS="rsize=0,wsize=0" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" -+ run 'grep $nfsmp /proc/mounts' - -+ run "cat /proc/mounts | grep -q rsize=$maxSize,wsize=$maxSize" 0 "Specified values more than $maxSize are replaced with $maxSize" -+ run 'umount $nfsmp' -+ MNT_OPTS="rsize=-1,wsize=-3" -+ run "mount ${HOSTNAME}:$expdir $nfsmp -o ${MNT_OPTS}" 1-255 -+ rlPhaseEnd -+ -+for V in $(ls_nfsvers); do -+ rlPhaseStartTest do-$role-NFS-mount-options-can-be-lost-when-using-bg-option-vers${V} -+ run 'service_nfs stop' -+ run 'mount -v -t nfs -o rw,bg,hard,nointr,tcp,vers=$V,timeo=600,rsize=32768,wsize=32768,actimeo=0,noac localhost:$expdir $nfsmp' -+ run 'service_nfs start' -+ run 'while ! grep -q $nfsmp /proc/mounts; do sleep 15; done' - -+ run 'grep $nfsmp /proc/mounts' -+ run 'grep $nfsmp /proc/mounts | grep -q "rw,sync"' -+ if [ "$V" = "2" ]; then -+ run 'grep $nfsmp /proc/mounts | grep -q "vers=$V,rsize=8192,wsize=8192"' -+ else -+ run 'grep $nfsmp /proc/mounts | grep -q "vers=$V,rsize=32768,wsize=32768"' -+ fi -+ run 'grep $nfsmp /proc/mounts | grep -q "acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,hard,noac,proto=tcp"' -+ run 'grep $nfsmp /proc/mounts | grep -q "timeo=600,retrans=2,sec=sys"' -+ run "umount $nfsmp" -+ rlPhaseEnd -+done -+ -+ rlPhaseStartTest do-$role-Test-"mount-nfs-needs-descriptive-error-when-nfsvers-specified-incorrectly" -+ run "log=`mktemp -q`" 0 "Creating temporary log file" -+ log "{Info} Specify the invalid value." -+ for vers in {"v3","vers","+","*",""}; do -+ run "mount -t nfs -o vers=$vers localhost:$expdir $nfsmp 2>$log" 32 \ -+ "should be failed as expected using invalid value" -+ run "mount -t nfs -o nfsvers=$vers localhost:$expdir $nfsmp 2>>$log" 32 \ -+ "should be failed as expected using invalid value" -+ run "cat $log" - -+ run "egrep -q 'Bad nfs mount parameter|parsing error|invalid value' $log" -+ run ">$log" 0 "clear $log content" -+ done -+ log "{Info} Specify the valid number (maybe not supported)." -+ run "ls_nfsvers" - -+ for vers in {1,2,3,4,5,23}; do -+ if ls_nfsvers | grep -q "^$vers"; then -+ run "mount -t nfs -o vers=$vers localhost:$expdir $nfsmp" -+ run "umount $nfsmp" -+ run "mount -t nfs -o nfsvers=$vers localhost:$expdir $nfsmp" -+ run "umount $nfsmp" -+ else -+ run "mount -t nfs -o vers=$vers localhost:$expdir $nfsmp 2>$log" 32 \ -+ "should be failed as expected using unsupported version" -+ [ $? = 0 ] && run "umount $nfsmp" -+ run "mount -t nfs -o nfsvers=$vers localhost:$expdir $nfsmp 2>>$log" 32 \ -+ "should be failed as expected using unsupported version" -+ [ $? = 0 ] && run "umount $nfsmp" -+ run "cat $log" - -+ run "egrep -q 'not supported|parsing error|invalid value|call failed' $log" -+ run ">$log" 0 "clear $log content" -+ fi -+ done -+ run "rm -f $log" 0 "Remove temporary log file" -+ rlPhaseEnd -+ -+ rlPhaseStartCleanup do-$role-Cleanup- -+ run 'mountpoint $nfsmp && umount $nfsmp' 1 -+ hostnamectl set-hostname $ORIGINAL_HOSTNAME -+ run 'rm -rf $expdir $nfsmp' -+ rlFileRestore -+ run 'service_nfs restart' -+ rlPhaseEnd -+rlJournalEnd -+#rlJournalPrintText -+ -diff --git a/tests/systemd-nfs/PURPOSE b/tests/systemd-nfs/PURPOSE -new file mode 100644 -index 0000000..556df42 ---- /dev/null -+++ b/tests/systemd-nfs/PURPOSE -@@ -0,0 +1 @@ -+# nothing -diff --git a/tests/systemd-nfs/_env b/tests/systemd-nfs/_env -new file mode 100644 -index 0000000..d90f45d ---- /dev/null -+++ b/tests/systemd-nfs/_env -@@ -0,0 +1,7 @@ -+export TOPLEVEL_NAMESPACE=nfs-utils -+export PKG_NAMESPACE=nfs-utils -+export RELATIVE_PATH=systemd-nfs -+export PACKAGE=nfs-utils -+export PACKAGE_NAME=nfs-utils -+export PKG_LIST=nfs-utils nfs-utils-lib libnfsidmap libsss_idmap libtirpc rpcbind -+export TEST=/nfs-utils/systemd-nfs -diff --git a/tests/systemd-nfs/runtest.sh b/tests/systemd-nfs/runtest.sh -new file mode 100755 -index 0000000..227ec36 ---- /dev/null -+++ b/tests/systemd-nfs/runtest.sh -@@ -0,0 +1,287 @@ -+#!/bin/bash -+# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: test for: nfs -+# Author: Jianhong Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2014 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh -+. /usr/share/beakerlib/beakerlib.sh || exit 1 -+ -+#=============================================================================== -+ -+#signal trap -+trap "cleanup" SIGINT SIGTERM SIGHUP SIGQUIT -+cleanup() { -+ rlFileRestore -+ run 'service_nfsconfig restart' -+ #rm -rf $expdir $nfsmp -+} -+ -+#global var define -+serv=nfs -+rpm -q systemd || { -+ echo "{Warn} no systemd installed, skip the test" -+ report_result $TEST PASS -+ exit 0 -+} -+ -+rlJournalStart -+ rlPhaseStartSetup do-Setup- -+ # Load beakerlib you needed -+ rlImport kernel/base -+ envinfo -+ rlFileBackup /etc/exports /etc/sysconfig/nfs -+ run 'echo "/usr/share *(ro)" >/etc/exports' -+ run 'echo "RPCNFSDARGS=8" >/etc/sysconfig/nfs' 0 "avoid invalid config file" -+ run 'service_nfsconfig restart' 0 "RHEL-7.1 or later need restart nfs-config to reload /etc/sysconfig/nfs" -+ run "useradd testuserqa" - -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-start -+ run "service_$serv start" 0 "Service must start without problem" -+ run "service_$serv status" 0 "Then Status command" -+ run "service_$serv start" 0 "Already started service" -+ run "service_$serv status" 0 "Again status command" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-restart -+ run "service_$serv restart" 0 "Restarting of service" -+ run "service_$serv status" 0 "Status command" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-stop -+ run "service_$serv stop" 0 "Stopping service" -+ run "service_$serv status" 3 "Status of stopped service" -+ run "service_$serv stop" 0 "Stopping service again" -+ run "service_$serv status" 3 "Status of stopped service" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"insufficient-rights" -+ run "service_$serv restart " 0 "Starting service for restarting under nonpriv user" -+ run "su testuserqa -c 'service_$serv stop'" 1,4 "Insufficient rights, stopping service under nonprivileged user must fail" -+ run "su testuserqa -c 'service_$serv start'" 0,1,4 "Insufficient rights, starting service under nonprivileged user must fail or pass as already started" -+ run "su testuserqa -c 'service_$serv status'" 0 "Sufficient rights, service status should be accessible to nonprivileged users" -+ run "service_$serv stop" 0 "Stopping service for starting under nonpriv user" -+ run "su testuserqa -c 'service_$serv start'" 1,4 "Insufficient rights, starting of stopped service under nonprivileged user must fail" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"operations" -+ run "service_$serv start" 0 "Service have to implement start function" -+ run 'sleep 5' 0 "sleep a while avoid the start rate limit" -+ run "service_$serv restart" 0 "Service have to implement restart function" -+ run "service_$serv status" 0 "Service have to implement status function" -+ run 'sleep 5' 0 "sleep a while avoid the start rate limit" -+ run "service_$serv condrestart" 0 "Service have to implement condrestart function" -+ [ $? != 0 ] && run "journalctl -xn" - -+ run 'sleep 5' 0 "sleep a while avoid the start rate limit" -+ run "service_$serv try-restart" 0 "Service have to implement try-restart function" -+ [ $? != 0 ] && run "journalctl -xn" - -+ run "service_$serv reload" 0 "Service have to implement reload function" -+ [ $? != 0 ] && run "journalctl -xn" - -+ run "service_$serv force-reload" 0 "Service have to implement force-reload function" -+ [ $? != 0 ] && run "journalctl -xn" - -+ run "service_$serv noexistop" 2 "Testing proper return code when nonexisting function" -+ rlPhaseEnd -+ -+ # Should do nothing if a service is already stopped or not running (according to manpage of systemctl) -+ # http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic.html#INISCRPTACT -+ rlPhaseStartTest do-Test-"operations-stopped" -+ run "service_$serv stop" 0 "Service have to implement stop function" -+ run "service_$serv condrestart" 0 "Service have to implement condrestart function" -+ run "service_$serv try-restart" 0 "Service have to implement try-restart function" -+ run "service_$serv force-reload" 0 "Service have to implement force-reload function" -+ run "service_$serv status" 3 "Above oprations should do nothing if service are not running" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-enable-disable-$serv -+ if systemctl --quiet is-enabled $serv; then -+ run "systemctl disable $serv" 0 "Disable service on boot" -+ run "systemctl is-enabled $serv" 1 "Check whether service is disabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "systemctl enable $serv" 0 "Enable service on boot" -+ run "systemctl is-enabled $serv" 0 "Check whether service is enabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ else -+ run "systemctl enable $serv" 0 "Enable service on boot" -+ run "systemctl is-enabled $serv" 0 "Check whether service is enabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "systemctl disable $serv" 0 "Disable service on boot" -+ run "systemctl is-enabled $serv" 1 "Check whether service is disabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ fi -+ rlPhaseEnd -+ -+ # ystemctl enable fails for symlinks in /usr/lib/systemd/system -+ # Use a workaround to test enable/disable with nfs-server.service -+ rlPhaseStartTest do-Test-enable-disable-nfs-server -+ if systemctl --quiet is-enabled nfs-server; then -+ run "systemctl disable nfs-server" 0 "Disable nfs-serverice on boot" -+ run "systemctl is-enabled nfs-server" 1 "Check whether nfs-serverice is disabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "systemctl enable nfs-server" 0 "Enable nfs-serverice on boot" -+ run "systemctl is-enabled nfs-server" 0 "Check whether nfs-serverice is enabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ else -+ run "systemctl enable nfs-server" 0 "Enable nfs-serverice on boot" -+ run "systemctl is-enabled nfs-server" 0 "Check whether nfs-serverice is enabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "systemctl disable nfs-server" 0 "Disable nfs-serverice on boot" -+ run "systemctl is-enabled nfs-server" 1 "Check whether nfs-serverice is disabled" -+ run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ fi -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-nfsv4-only -+ run 'service nfs stop' -+ # MOUNTD_NFS_V2 MOUNTD_NFS_V3 was not supported in RHEL-7.x -+ run 'echo -e "RPCMOUNTDOPTS=\"-N 2 -N 3\"" >>/etc/sysconfig/nfs' 0 "enabling nfsv4 only" -+ # If in RHEL-7.1 or later need restart nfs-config service to flush /etc/sysconfig/nfs to /run/sysconfig/nfs-utils -+ # But since RHEL-7.3, nfs-config change to be ru-run during the dependent service starting -+ run 'service_nfsconfig status &>/dev/null && service_nfsconfig restart' - -+ run 'cat /run/sysconfig/nfs-utils | grep RPCMOUNTDARGS | grep "\""' 0 "quote variable in /run/sysconfig/nfs-utils" -+ run 'sleep 5' 0 "sleep a while avoid service script bug" -+ run 'service_nfs start' -+ run 'rpcinfo -s | grep -w mountd' 1 "if nfsv4 only, no mountd info in rpcinfo" -+ rlFileRestore /etc/sysconfig/nfs -+ run 'service_nfsconfig restart' -+ rlPhaseEnd -+ -+ # Since nfs-service no longer starts the daemons in question. They are now split -+ # into their own services (nfs-mountd.service, rpc-statd.service, nfs-idmapd.service). -+ # Then `systemctl status nfs-server.service` cannot accurately reflect the -+ # state of the combination of daemons that are needed for a working NFS server. -+ rlPhaseStartTest do-Test-"nfs-server-is-active-even-processes-terminated" -+ run 'service_nfs restart' -+ run 'pkill rpc.mountd' - -+ run 'killall -9 nfsd' - -+ run 'ps axf | grep -e "rpc.mountd" -e "nfsd"' - -+ run 'service nfs-mountd status' 1-255 -+ run 'rpcinfo -t localhost 100005' 1 "pings mountd" -+ log '{Info} nfsserver resource agent has been updated to monitor all its daemons' -+ run 'service_nfs status' 1-255,0 -+ run 'service_nfs status 2>&1 | grep "active"' - -+ run 'service_nfs stop' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"should-auto-mount-/proc/fs/nfsd" -+ run 'service_nfs restart' -+ run 'service_nfs stop' -+ run 'umount /proc/fs/nfsd' -+ run 'service_nfs start 2>&1 | grep "mount -t nfsd"' 1 "should auto mount nfsd" -+ run 'mount -t nfsd nfsd /proc/fs/nfsd' - -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"use-rpcbind.service-in-nfs-server.service" -+ run "systemctl reset-failed" 0 "workaround for failure of starting too often" -+ log "{Info} Starting nfs while rpcbind is stopped" -+ run "service rpcbind stop; service rpcbind stop" 0 "stop twice as workaround" -+ run "service rpcbind status" 3 "rpcbind.service should be stopped" -+ run "service nfs restart" -+ run "service nfs status" 0 "should start nfs successfully" -+ run "service rpcbind status" 0 "starting nfs should bring rpcbind up" -+ -+ log "{Info} Starting nfs while rpcbind is active" -+ run "service rpcbind start" -+ run "service rpcbind status" 0 "rpcbind should be active" -+ run "service nfs restart" -+ run "service nfs status" 0 "should start nfs successfully" -+ run "service rpcbind status" 0 "starting nfs should keep rpcbind up" -+ -+ log "{Info} Stopping nfs while rpcbind is active" -+ run "service rpcbind start" -+ run "service rpcbind status" 0 "rpcbind should be active" -+ run "service nfs start; service nfs status" -+ run "service nfs stop; service nfs status" 3 -+ run "service rpcbind status" 0 "stopping nfs should keep rpcbind up" -+ -+ log "{Info} Stopping nfs while rpcbind is stopped" -+ run "service nfs start" 0 "firstly start nfs since it can bring rpcbind up" -+ run "service nfs status" 0 "should start nfs successfully" -+ run "service rpcbind stop; service rpcbind stop" 0 "stop twice as workaround" -+ run "service rpcbind status" 3 "rpcbind should be stopped" -+ run "service nfs stop" -+ # If a daemon tries to connect to port 111 systemd will start rpcbind automaticly -+ run "service rpcbind status" 0 "stopping nfs should bring rpcbind up" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"restarting rpbind also restart the the nfs server" -+ run "systemctl reset-failed" 0 "workaround for failure of starting too often" -+ log "{Info} Starting rpcbind while nfs is stopped" -+ run "service nfs stop" -+ run "service nfs status" 3 "nfs should be stopped" -+ run "service rpcbind restart" -+ run "service nfs status" 3 "starting rpcbind should NOT bring nfs up" -+ -+ log "{Info} Starting rpcbind while nfs is active" -+ run "service nfs start" -+ run "service nfs status" 0 "nfs should be active" -+ run "service rpcbind restart" -+ run "service nfs status" 0 "starting rpcbind should NOT interfere nfs" -+ -+ log "{Info} Stopping rpcbind while nfs is active" -+ run "service nfs start" -+ run "service nfs status" 0 "nfs should be active" -+ run "service rpcbind start; service rpcbind stop" -+ run "service nfs status" 0 "stopping rpcbind should NOT bring nfs down" -+ -+ log "{Info} Stopping rpcbind while nfs is stopped" -+ run "service nfs stop" -+ run "service nfs status" 3 "nfs should be stopped" -+ run "service rpcbind start; service rpcbind stop" -+ run "service nfs status" 3 "stopping rpcbind should NOT interfere nfs" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-fix-long-nfsd-startup-delay-in-absence-of-rpcbind -+ run "systemctl stop rpcbind" -+ run "systemctl stop nfs-server" -+ run "systemctl mask rpcbind" 0 "Mask systemd service rpcbind.service" -+ run "timeLimitRun 10 systemctl start nfs-server" 1-255 "Start service nfs-server without rpcbind will be failed due to systemd unit dependency" -+ run "systemctl unmask rpcbind" -+ run "timeLimitRun 10 systemctl stop nfs-server" - -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"nfs-utils need to cause gssproxy reload" -+ run "cp /etc/gssproxy/gssproxy.conf /etc/gssproxy/gssproxy.conf.backup" 0 "backuping" -+ run "echo '[gssproxy]' > /etc/gssproxy/gssproxy.conf" -+ run "echo 'debug = true' >> /etc/gssproxy/gssproxy.conf" -+ run "systemctl restart gssproxy" -+#FIXME when BZ#1535424 is fixed. Should not use /var/log/messages as it is not used on Fedora any more. -+ run "echo '' > /var/log/messages" -+ run "systemctl restart nfs" -+ run "systemctl status nfs" -+ run "systemctl status gssproxy" -+ run "cat /var/log/messages | grep 'gssproxy:'" - -+ run "cat /var/log/messages | grep -q 'gssproxy:.*loaded'" 0 "should re-reading config" -+ run "mv /etc/gssproxy/gssproxy.conf.backup /etc/gssproxy/gssproxy.conf" 0 "recovering" -+ run "systemctl restart gssproxy" -+ rlPhaseEnd -+ -+ rlPhaseStartCleanup do-Cleanup- -+ run "userdel -rf testuserqa" - -+ rlFileRestore -+ run 'timeLimitRun 10 service_nfsconfig restart' -+ rlPhaseEnd -+ -+rlJournalEnd -+#rlJournalPrintText -+#enable_avc_check -diff --git a/tests/systemd-nfs/subtest.yml b/tests/systemd-nfs/subtest.yml -new file mode 100644 -index 0000000..705c8b0 ---- /dev/null -+++ b/tests/systemd-nfs/subtest.yml -@@ -0,0 +1,2 @@ -+attr: {ssched: yes.dangerous} -+attr: {ssched: yes.dangerous}, setup: [--kernel-options=ipv6.disable=1] -diff --git a/tests/tests.yml b/tests/tests.yml -new file mode 100644 -index 0000000..8b5bd0d ---- /dev/null -+++ b/tests/tests.yml -@@ -0,0 +1,20 @@ -+--- -+# Tests that run in classic context -+- hosts: localhost -+ roles: -+ - role: standard-test-rhts -+ use_beakerlib_libraries: yes -+ tags: -+ - classic -+ tests: -+ - exportfs -+ - export-mount-local -+ - mount -+ - nfs-mount-options-all -+ - systemd-nfs -+ - umount -+ required_packages: -+ - bind-utils # export-mount-local needs this package -+ - findutils # beakerlib needs find command -+ - nfs-utils -+ - redhat-lsb-core # lsb_release is needed by tests -diff --git a/tests/umount/PURPOSE b/tests/umount/PURPOSE -new file mode 100644 -index 0000000..9f896d5 ---- /dev/null -+++ b/tests/umount/PURPOSE -@@ -0,0 +1,2 @@ -+Description: Test for command umount.nfs{,4} -+Author: Stevens Yin -diff --git a/tests/umount/_env b/tests/umount/_env -new file mode 100644 -index 0000000..dd7d64f ---- /dev/null -+++ b/tests/umount/_env -@@ -0,0 +1,7 @@ -+export TOPLEVEL_NAMESPACE=nfs-utils -+export PKG_NAMESPACE=nfs-utils -+export RELATIVE_PATH=umount -+export PACKAGE=nfs-utils -+export PACKAGE_NAME=nfs-utils -+export PKG_LIST=nfs-utils nfs-utils-lib libnfsidmap libsss_idmap libtirpc rpcbind -+export TEST=/nfs-utils/umount -diff --git a/tests/umount/runtest.sh b/tests/umount/runtest.sh -new file mode 100644 -index 0000000..8dee5c7 ---- /dev/null -+++ b/tests/umount/runtest.sh -@@ -0,0 +1,122 @@ -+#!/bin/bash -+# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: Test for command umount.nfs{,4} -+# Author: Stevens Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh -+. /usr/share/beakerlib/beakerlib.sh || exit 1 -+ -+#=============================================================================== -+ -+mnt=/nfs-mount -+expDir=/expDir -+prog=umount.nfs -+ -+rlJournalStart -+ rlPhaseStartSetup do-Setup -+ # Load beakerlib you needed -+ rlImport kernel/base -+ envinfo -+ read IP4 _nil <<<$(getDefaultIp) -+ rlFileBackup /etc/sysconfig/nfs /etc/exports -+ run "mkdir -p $mnt $expDir" -+ run "echo '$expDir *(rw,no_root_squash,fsid=0)' > /etc/exports" -+ run 'service_nfs restart' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-$prog-with-wrong-option -+ run "$prog -xxxx" 1-255 "should exit with an error code" -+ run "$prog -xxxx 2>&1 | egrep -i '(usage:|try.*for more info)'" 0 "should output usage to user" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-$prog-without-args -+ run "$prog" 1-255 "should exit with an error code" -+ run "$prog 2>&1 | egrep -i '(usage:|try.*for more info)'" 0 "should output usage to user" -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-$prog--h -+ run "$prog -h" - -+ std=$($prog -h 2>&1) -+ run "$prog -h 2>&1 | egrep -i usage:" -+ [ $? = 0 ] && { -+ options=$(echo "$std"|grep -o '\[-[a-z]\+\]') -+ [ ${#options} -gt 3 ] && { -+ optionNuma=$((${#options} - 3)) -+ optionNumb=$(echo "$std" | sed -n "/\t-$options/p" | wc -l) -+ optionNumc=$(echo "$std" | sed -n "/\t-[a-zA-Z]/p" | wc -l) -+ run "test $optionNuma = $optionNumb" -+ run "test $optionNuma = $optionNumc" -+ run 'echo "$std" | sed -n "/\t-$options/p" | grep " "' 1 -+ } -+ } -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-Cannot-umount-NFS-mp-with-spaces -+ serv=localhost -+ expdirWithSpaces="/expdir with spaces" -+ nfsmpWithSpaces="/mnt/nfsmp with spaces" -+ run 'mkdir -p "$expdirWithSpaces" "$nfsmpWithSpaces"' -+ run 'echo "\"$expdirWithSpaces\" *(rw,no_root_squash,fsid=0)" > /etc/exports' -+ run 'service_nfs restart' -+ run 'service_nfs restart 2>&1 | grep "expdir with spaces does not support"' 1 \ -+ "exportfs give incorrect message for mount dir containing spaces" -+ run 'mount -t nfs "$serv:$expdirWithSpaces" "$nfsmpWithSpaces"' 0 "mount dir with spaces" -+ run 'grep "$nfsmpWithSpaces" /proc/mounts' - -+ run 'umount "$nfsmpWithSpaces"' 0 "umount dir with spaces" -+ run 'grep "$nfsmpWithSpaces" /proc/mounts' 1 "cat /proc/mounts and umount successfully" -+ run 'rm -rf "$expdirWithSpaces" "$nfsmpWithSpaces"' -+ rlPhaseEnd -+ -+ rlPhaseStartTest do-Test-"[nfsv3] umount.nfs: Failed to find '' protocol" -+ log "{Info} Creating a small (separate) fs on a loopback device." -+ run "dd if=/dev/zero of=fs.img bs=1M count=1000" - -+ run "losetup /dev/loop0 fs.img" - -+ run "mkfs.ext4 /dev/loop0" - -+ run "mkdir $expDir/foo" -+ run "mount /dev/loop0 $expDir/foo" -+ log "{Info} Listing the contents of the directory to trigger a submount." -+ run "echo '$expDir *(crossmnt)' > /etc/exports" -+ run "service_nfs restart" -+ run "mount localhost:$expDir $mnt -o vers=3" -+ run "ls $mnt/foo" -+ run "cat /proc/mounts | grep $mnt" - -+ run "umount $mnt/foo &>stdout.log" -+ run "cat stdout.log" - -+ run "cat stdout.log | grep -q 'Failed'" 1 "should not output error msg" -+ run "umount $mnt" -+ log "{Info} Recovering it." -+ run "service_nfs stop" -+ run "umount $expDir/foo" -+ run "rm -rf $expDir/foo" -+ run "losetup -d /dev/loop0" - -+ run "rm -f fs.img" - -+ rlPhaseEnd -+ -+ rlPhaseStartCleanup do-Cleanup -+ rlFileRestore -+ rm -rf $mnt $expDir -+ rlPhaseEnd -+rlJournalEnd -+#rlJournalPrintText -+ - -From 5218121ee7e9c9ed75f3d1b91bae0b2a15f154b2 Mon Sep 17 00:00:00 2001 -From: Bruno Goncalves -Date: Jan 17 2019 20:02:54 +0000 -Subject: [PATCH 2/6] fixed some test issues - - ---- - -diff --git a/tests/exportfs/runtest.sh b/tests/exportfs/runtest.sh -index 8e34a8c..69d9532 100755 ---- a/tests/exportfs/runtest.sh -+++ b/tests/exportfs/runtest.sh -@@ -48,7 +48,7 @@ rlJournalStart - hostnamectl set-hostname exportfs.test - fi - #clean nfs garbage, avoid affect from pre case -- { exportfs -ua; service nfs stop &>/dev/null; } -+ { exportfs -ua; service_nfs stop &>/dev/null; } - rlFileBackup /etc/sysconfig/nfs /etc/exports - rlFileBackup --clean /etc/exports.d/ - run 'rm -f /etc/exports.d/*' -@@ -148,7 +148,7 @@ rlJournalStart - - rlPhaseStartTest do-Test-exportfs-when-/proc/fs/nfsd-not-mount - run 'mkdir -p ${expdir}_tmp' -- run 'service nfs start' -+ run 'service_nfs start' - run 'pkill rpc.mountd && umount /proc/fs/nfsd' - run 'exportfs -iv *:${expdir}_tmp' - run 'mount -t nfsd nfsd /proc/fs/nfsd' 0-255 "restore env: mount nfsd" -@@ -157,7 +157,7 @@ rlJournalStart - - rlPhaseStartTest do-Test-option-nordirplus - #nfsv3 export option nordirplus support test -- run 'service nfs start' -+ run 'service_nfs start' - run 'exportfs -i -o nordirplus "*:$expdir"' - run 'mount -o vers=3 localhost:$expdir $nfsmp' - run 'grep $nfsmp /proc/mounts' -diff --git a/tests/systemd-nfs/runtest.sh b/tests/systemd-nfs/runtest.sh -index 227ec36..63d8593 100755 ---- a/tests/systemd-nfs/runtest.sh -+++ b/tests/systemd-nfs/runtest.sh -@@ -38,7 +38,7 @@ cleanup() { - } - - #global var define --serv=nfs -+serv=nfs-server - rpm -q systemd || { - echo "{Warn} no systemd installed, skip the test" - report_result $TEST PASS -diff --git a/tests/tests.yml b/tests/tests.yml -index 8b5bd0d..865464b 100644 ---- a/tests/tests.yml -+++ b/tests/tests.yml -@@ -2,7 +2,7 @@ - # Tests that run in classic context - - hosts: localhost - roles: -- - role: standard-test-rhts -+ - role: standard-test-beakerlib - use_beakerlib_libraries: yes - tags: - - classic -@@ -16,5 +16,6 @@ - required_packages: - - bind-utils # export-mount-local needs this package - - findutils # beakerlib needs find command -+ - iptables # nfs-mount-options-all needs this package - - nfs-utils - - redhat-lsb-core # lsb_release is needed by tests - -From 69a4cec52d5d1803bfa88670501b4f8d1dcd9481 Mon Sep 17 00:00:00 2001 -From: Bruno Goncalves -Date: Jan 18 2019 17:24:32 +0000 -Subject: [PATCH 3/6] sync export-mount-local and systemd-nfs with tests from QE - - ---- - -diff --git a/tests/export-mount-local/Makefile b/tests/export-mount-local/Makefile -new file mode 100644 -index 0000000..6ddfa94 ---- /dev/null -+++ b/tests/export-mount-local/Makefile -@@ -0,0 +1,76 @@ -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: test for: export-mount -+# Author: Jianhong Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2014 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+#Generate and export TEST= PACKAGE= -+TENV=_env -+ifeq ($(PKG_TOP_DIR),) -+ export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ export _TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ -include $(PKG_TOP_DIR)/env.mk -+endif -+include $(TENV) -+ifeq ($(_TOP_DIR),) -+ _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) -+endif -+#=============================================================================== -+export TESTVERSION=1.0 -+ -+BUILT_FILES= -+FILES=$(TENV) $(METADATA) runtest.sh Makefile PURPOSE -+ -+.PHONY: all install download clean -+ -+run: $(FILES) build -+ ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ -+. /usr/share/beakerlib/beakerlib.sh || exit 1; \ -+. runtest.sh ) -+ -+build: $(BUILT_FILES) -+ test -x runtest.sh || chmod a+x runtest.sh -+ -+clean: -+ rm -f *~ $(BUILT_FILES) -+ -+-include /usr/share/rhts/lib/rhts-make.include -+ -+$(METADATA): Makefile -+ @echo "Owner: Jianhong Yin " > $(METADATA) -+ @echo "Name: $(TEST)" >> $(METADATA) -+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -+ @echo "Path: $(TEST_DIR)" >> $(METADATA) -+ @echo "Description: test for: export-mount" >> $(METADATA) -+ @echo "Type: function" >> $(METADATA) -+ @echo "Type: $(PACKAGE)-level-tier1" >> $(METADATA) -+ @echo "TestTime: 30m" >> $(METADATA) -+ @echo "RunFor: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: $(PACKAGE)" >> $(METADATA) -+ @echo "Priority: Normal" >> $(METADATA) -+ @echo "License: GPLv2" >> $(METADATA) -+ @echo "Requires: library(kernel/base)" >> $(METADATA) -+ @echo "Requires: nfs-utils" >> $(METADATA) -+ @echo "Requires: bind-utils" >> $(METADATA) -+ @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -+ rhts-lint $(METADATA) -diff --git a/tests/export-mount-local/runtest.sh b/tests/export-mount-local/runtest.sh -index e72e0f4..60d0c90 100755 ---- a/tests/export-mount-local/runtest.sh -+++ b/tests/export-mount-local/runtest.sh -@@ -1,39 +1,43 @@ - #!/bin/bash - # vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --# --# Description: test for: export-mount -+# Description: test for: export-mount-local - # Author: Jianhong Yin --# - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # - # Copyright (c) 2014 Red Hat, Inc. - # --# This program is free software: you can redistribute it and/or --# modify it under the terms of the GNU General Public License as --# published by the Free Software Foundation, either version 2 of --# the License, or (at your option) any later version. -+# This copyrighted material is made available to anyone wishing -+# to use, modify, copy, or redistribute it subject to the terms -+# and conditions of the GNU General Public License version 2. - # - # This program is distributed in the hope that it will be - # useful, but WITHOUT ANY WARRANTY; without even the implied - # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --# PURPOSE. See the GNU General Public License for more details. -+# PURPOSE. See the GNU General Public License for more details. - # --# You should have received a copy of the GNU General Public License --# along with this program. If not, see http://www.gnu.org/licenses/. -+# You should have received a copy of the GNU General Public -+# License along with this program; if not, write to the Free -+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -+# Boston, MA 02110-1301, USA. - # - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - [ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh - . /usr/share/beakerlib/beakerlib.sh || exit 1 - -+# Load beakerlib you needed -+rlImport kernel/base -+envinfo -+#disable_avc_check -+ - #=============================================================================== - - #signal trap - trap "cleanup" SIGINT SIGTERM SIGHUP SIGQUIT - cleanup() { -- rlFileRestore -- rm -rf $expdir $nfsmp -+ rlFileRestore -+ rm -rf $expdir $nfsmp - } - - #global var define -@@ -41,202 +45,180 @@ BZ=exp-mount-local - expdir=/exportDir-$BZ - nfsmp=/mnt/nfsmp-$BZ - subexpdir=/exportDir-$BZ/sub --tmpnfsmp=/tmp/nfsmp-$BZ -+tmpnfsmp=${nfsmp}-tmp - --host="$HOSTNAME" -+read ipv4 _nil <<<$(getDefaultIp) -+read ipv6s _nil <<<$(getDefaultIp 6) -+ipv6="[$ipv6s]" - # in case "localhost.localdomain" --echo "$host" | grep -q "localhost" && host="localhost" -+if echo "$HOSTNAME" | grep -q "localhost"; then -+ ORIGINAL_HOSTNAME="$HOSTNAME" -+ HOSTNAME="$BZ" -+ hostnamectl set-hostname "$HOSTNAME" -+fi -+host="$HOSTNAME" - - rlJournalStart - rlPhaseStartSetup do-Setup- -- # Load beakerlib you needed -- rlImport kernel/base -- read ipv4 _nil <<<$(getDefaultIp) -- read ipv6s _nil <<<$(getDefaultIp 6 global) -- ipv6="[$ipv6s]" -- envinfo -- rlFileBackup /etc/exports /etc/sysconfig/nfs /etc/nfs.conf /etc/hosts -- if [ "$host" = "localhost" ]; then -+ rlFileBackup /etc/{exports,auto.master} /etc/sysconfig/{nfs,autofs} /etc/nfs.conf /etc/hosts -+ if [ -n "ORIGINAL_HOSTNAME" ]; then - run "echo '$ipv4 $host' >> /etc/hosts" -- if [ -n "$ipv6s" ]; then -- run "echo '$ipv6s $host' >> /etc/hosts" -- fi -+ run "echo '$ipv6s $host' >> /etc/hosts" - run "cat /etc/hosts" - - fi -- run 'rm -rf $expdir $nfsmp && mkdir -p $expdir $nfsmp' -- run 'rm -rf $subexpdir $tmpnfsmp && mkdir -p $subexpdir $tmpnfsmp' -- run 'echo "/tmp *(ro,sync)" >/etc/exports' -- run 'service_nfs restart' -- #avoid issues restarting the server too quickly -- sleep 10 -- run 'ls_nfsvers' -+ run "rm -rf $expdir $nfsmp && mkdir -p $expdir $nfsmp" -+ run "rm -rf $subexpdir $tmpnfsmp && mkdir -p $subexpdir $tmpnfsmp" -+ run "service_nfs restart" -+ run "ls_nfsvers" - rlPhaseEnd - --for V in $(ls_nfsvers); do -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv4 -- run "exportfs -au && exportfs -iv $ipv4:$expdir -o ro,sync,no_root_squash" -- run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -- run 'umount $nfsmp' -- rlPhaseEnd -- if [ -n "$ipv6s" ]; then -+ for V in $(ls_nfsvers); do -+ # export by IPv4 and try to mount it -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv4 -+ run "exportfs -au && exportfs -iv $ipv4:$expdir -o ro,sync,no_root_squash" -+ run "mount -o vers=$V $ipv4:$expdir $nfsmp" -+ run "umount $nfsmp" -+ rlPhaseEnd - rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv6-x -- run 'mount -o vers=$V $ipv6:$expdir $nfsmp' 1-255 -- [ $? = 0 ] && run "umount $nfsmp" -+ if [ -n "$ipv6s" ]; then -+ run "mount -o vers=$V $ipv6:$expdir $nfsmp" 1-255 -+ [ $? = 0 ] && run "umount $nfsmp" -+ fi -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-host-bz876847 -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "umount $nfsmp" - rlPhaseEnd -- fi -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-host -- run 'mount -o vers=$V $host:$expdir $nfsmp' -- run 'umount $nfsmp' -- rlPhaseEnd - -- if [ -n "$ipv6s" ]; then -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv6 -- run "exportfs -au && exportfs -iv $ipv6:$expdir -o ro,sync,no_root_squash" -- run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -- run 'umount $nfsmp' -+ if [ -n "$ipv6s" ]; then -+ # export by IPv6 and try to mount it -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv6 -+ run "exportfs -au && exportfs -iv $ipv6:$expdir -o ro,sync,no_root_squash" -+ run "mount -o vers=$V $ipv6:$expdir $nfsmp" -+ run "umount $nfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv4-x -+ run "mount -o vers=$V $ipv4:$expdir $nfsmp" 1-255 -+ [ $? = 0 ] && run "umount $nfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-host -+ run "dig -t aaaa $HOSTNAME +short" 0 "To get the IPv6 address" -+ if [ -n "$ipv6s" ]; then -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "umount $nfsmp" -+ fi -+ rlPhaseEnd -+ fi -+ -+ # export by hostname and try to mount it -+ rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-host -+ run "exportfs -au && exportfs -iv $host:$expdir -o ro,sync,no_root_squash" -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "umount $nfsmp" - rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv4-x -- run 'mount -o vers=$V $ipv4:$expdir $nfsmp' 1-255 -- [ $? = 0 ] && run "umount $nfsmp" -+ rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv4 -+ run "mount -o vers=$V $ipv4:$expdir $nfsmp" -+ run "umount $nfsmp" - rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-host -- if [ -n "$(dig -t aaaa $HOSTNAME +short)" ]; then -- run 'mount -o vers=$V $host:$expdir $nfsmp' -- run 'umount $nfsmp' -+ rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv6 -+ run "dig -t aaaa $HOSTNAME +short" 0 "To get the IPv6 address" -+ if [ -n "$ipv6s" ]; then -+ run "mount -o vers=$V $ipv6:$expdir $nfsmp" -+ run "umount $nfsmp" - fi - rlPhaseEnd -- fi - -- rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-host -- run "exportfs -au && exportfs -iv $host:$expdir -o ro,sync,no_root_squash" -- run 'mount -o vers=$V $host:$expdir $nfsmp' -- run 'umount $nfsmp' -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv4 -- run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -- run 'umount $nfsmp' -- rlPhaseEnd -- if [ -n "$ipv6s" ]; then -- rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv6 -- if [ -n "$(dig -t aaaa $HOSTNAME +short)" ]; then -- run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -- run 'umount $nfsmp' -+ # export sub-directory by IPv4 and try to mount it -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv4 -+ run "echo '$expdir *(ro,sync,no_root_squash)' >/etc/exports" -+ run "echo '$subexpdir $ipv4(ro,sync,no_root_squash)' >>/etc/exports" -+ which systemctl >/dev/null 2>&1 && run "systemctl reset-failed" -+ run "service_nfs restart" -+ run "showmount -e" - -+ run "mount -o vers=$V $ipv4:$expdir $nfsmp" -+ run "mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv6-x-bz1198900 -+ if [ -n "$ipv6s" ]; then -+ run "mount -o vers=$V $ipv6:$expdir $nfsmp" -+ run "mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp" 1-255 "bz1198900 should not mount sub-directory with different ip" -+ [ $? = 0 ] && run "umount $tmpnfsmp" -+ run "umount $nfsmp" - fi - rlPhaseEnd -- fi -- -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv4 -- run 'echo "$expdir *(ro,sync,no_root_squash)" >/etc/exports' -- run 'echo "$subexpdir $ipv4(ro,sync,no_root_squash)" >>/etc/exports' -- run 'service_nfs restart' -- #avoid issues restarting the server too quickly -- sleep 10 -- run 'showmount -e' - -- run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -- run 'mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -- rlPhaseEnd -- if [ -n "$ipv6s" ]; then -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv6-x -- run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -- run 'mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp' 1-255 "should not mount sub-directory with different ip" -- [ $? = 0 ] && run "umount $tmpnfsmp" -- run "umount $nfsmp" -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-host -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "mount -o vers=$V $host:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" - rlPhaseEnd -- fi -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-host -- run 'mount -o vers=$V $host:$expdir $nfsmp' -- run 'mount -o vers=$V $host:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -- rlPhaseEnd - -- if [ -n "$ipv6s" ]; then -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv4-x -- run 'echo "$expdir *(ro,sync,no_root_squash)" >/etc/exports' -- run 'echo "$subexpdir $ipv6s(ro,sync,no_root_squash)" >>/etc/exports' -- run 'service_nfs restart' -- #avoid issues restarting the server too quickly -- sleep 10 -- run 'showmount -e' - -- run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -- run 'mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp' 1-255 "should not mount sub-directory with different ip" -- [ $? = 0 ] && run "umount $tmpnfsmp" -- run "umount $nfsmp" -+ if [ -n "$ipv6s" ]; then -+ # export sub-directory by IPv6 and try to mount it -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv4-x-bz1198900 -+ run "echo '$expdir *(ro,sync,no_root_squash)' >/etc/exports" -+ run "echo '$subexpdir $ipv6s(ro,sync,no_root_squash)' >>/etc/exports" -+ which systemctl >/dev/null 2>&1 && run "systemctl reset-failed" -+ run "service_nfs restart" -+ run "showmount -e" - -+ run "mount -o vers=$V $ipv4:$expdir $nfsmp" -+ run "mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp" 1-255 "bz1198900 should not mount sub-directory with different ip" -+ [ $? = 0 ] && run "umount $tmpnfsmp" -+ run "umount $nfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv6 -+ run "mount -o vers=$V $ipv6:$expdir $nfsmp" -+ run "mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" -+ rlPhaseEnd -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-host -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "mount -o vers=$V $host:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" -+ rlPhaseEnd -+ fi -+ -+ # export sub-directory by hostname and try to mount it -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv4 -+ run "echo '$expdir *(ro,sync,no_root_squash)' >/etc/exports" -+ run "echo '$subexpdir $host(ro,sync,no_root_squash)' >>/etc/exports" -+ which systemctl >/dev/null 2>&1 && run "systemctl reset-failed" -+ run "service_nfs restart" -+ run "showmount -e" - -+ run "mount -o vers=$V $ipv4:$expdir $nfsmp" -+ run "mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" - rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv6 -- run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -- run 'mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv6 -+ if [ -n "$ipv6s" ]; then -+ run "mount -o vers=$V $ipv6:$expdir $nfsmp" -+ run "mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" -+ fi - rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-host -- run 'mount -o vers=$V $host:$expdir $nfsmp' -- run 'mount -o vers=$V $host:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-host -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "mount -o vers=$V $host:$subexpdir $tmpnfsmp" -+ run "umount $nfsmp $tmpnfsmp" - rlPhaseEnd -- fi - -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv4 -- run 'echo "$expdir *(ro,sync,no_root_squash)" >/etc/exports' -- run 'echo "$subexpdir $host(ro,sync,no_root_squash)" >>/etc/exports' -- run 'service_nfs restart' -- #avoid issues restarting the server too quickly -- sleep 10 -- run 'showmount -e' - -- run 'mount -o vers=$V $ipv4:$expdir $nfsmp' -- run 'mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -- rlPhaseEnd -- if [ -n "$ipv6s" ]; then -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv6 -- run 'mount -o vers=$V $ipv6:$expdir $nfsmp' -- run 'mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -+ rlPhaseStartTest do-Test-nfsV$V-default-option-overridden-by-client-specific-option -+ run "echo '$expdir -ro,sync *(rw,no_root_squash)' >/etc/exports" -+ run "service_nfs restart" -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "exports option should be overridden by client specific." -+ run "rm -rf $nfsmp/test*" -+ run "umount $nfsmp" -+ run "echo '$expdir -ro,sec=sys,sync *(rw,no_root_squash)' >/etc/exports" 0 "sec=sys may cause it to be failed." -+ run "exportfs -rv" -+ run "mount -o vers=$V $host:$expdir $nfsmp" -+ run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "bz1359042 exports option should be overridden by client specific." -+ run "rm -rf $nfsmp/test*" -+ run "umount $nfsmp" - rlPhaseEnd -- fi -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-host -- run 'mount -o vers=$V $host:$expdir $nfsmp' -- run 'mount -o vers=$V $host:$subexpdir $tmpnfsmp' -- run 'umount $nfsmp $tmpnfsmp' -- rlPhaseEnd -- -- rlPhaseStartTest do-Test-nfsV$V-default-option-overridden-by-client-specific-option -- run "echo '$expdir -ro,sync *(rw,no_root_squash)' >/etc/exports" -- run "service_nfs restart" -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "exports option should be overridden by client specific." -- run "rm -rf $nfsmp/test*" -- run "umount $nfsmp" -- run "echo '$expdir -ro,sec=sys,sync *(rw,no_root_squash)' >/etc/exports" 0 "sec=sys may cause it to be failed." -- run "exportfs -rv" -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "exports option should be overridden by client specific." -- run "rm -rf $nfsmp/test*" -- run "umount $nfsmp" -- rlPhaseEnd --done -+ done - -- rlPhaseStartTest do-Test-exports-options-twice -- run 'echo "/ *(sync,hide,no_wdelay)" > /etc/exports' -- run "service_nfs restart" -- #avoid issues restarting the server too quickly -- sleep 10 -- -- # Count all options from list printed by exportfs -s(rhel-7) or exportfs -v(rhel-6) -- allOptions=$( (exportfs -s 2>/dev/null || exportfs -v) | sed 's/^.*(//;s/)$//;s/,/\n/g' | wc -l) -- # Count unique options from list printed by exportfs -s(rhel-7) or exportfs -v(rhel-6) -- uniqOptions=$( (exportfs -s 2>/dev/null || exportfs -v) | sed 's/^.*(//;s/)$//;s/,/\n/g' | sort | uniq | wc -l) -- -- log "{Info} exportfs -s(rhel-7) or exportfs -v(rhel-6) will print option list for each export path" -- log "{Info} All options printed by exportfs -s(rhel-7) or exportfs -v(rhel-6) (sorted):" -- run "(exportfs -s 2>/dev/null || exportfs -v) | sed 's/^.*(//;s/)$//;s/,/\n/g' | sort" -- log "{Info} For exported path '/', there are $allOptions options printed in all options list and $uniqOptions of them are unique" -- run 'test $uniqOptions -eq $allOptions' 0 "Should not output any options twice, quantity of all options should be equal to quantity of unique options" -- for opt in sync hide no_wdelay; do -- run "(exportfs -s 2>/dev/null || exportfs -v) | grep -q $opt" 0 "Option list should contain option $opt specified in /etc/exports" -- done -- rlPhaseEnd -- -- rlPhaseStartTest do-Test-server-side-using-bind-mount -+ rlPhaseStartTest do-Test-bz1479135-server-side-using-bind-mount - run "dd if=/dev/zero of=workspace.image bs=3M count=500" - run "mkfs -t ext3 -F workspace.image" - run "mkdir -p /workspace" -@@ -247,8 +229,6 @@ done - run "echo '/srv/nfs/vmcore *(rw,no_root_squash)' > /etc/exports" - run "echo '/workspace *(rw,no_root_squash)' >> /etc/exports" - run "service_nfs restart" -- #avoid issues restarting the server too quickly -- sleep 10 - run "mount $host:/workspace $nfsmp" - run "ls $nfsmp/work_dir" - run "umount $nfsmp" -@@ -259,45 +239,103 @@ done - run "rm workspace.image" - rlPhaseEnd - -- rlPhaseStartTest do-Test-mount-nfsv4-show-wrong-port -- run "echo '$expdir *(rw,no_root_squash)' >>/etc/exports" -- run "service_nfs restart" -- #avoid issues restarting the server too quickly -- sleep 10 -- run "exportfs -v" -- run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" -- run "mount -t nfs4 | grep $nfsmp" - -- run "mount -t nfs4 | grep $nfsmp | grep -q port=2049" 0 "Should show port=2049" -- run "umount $nfsmp" -- run "echo '[nfsd]' > /etc/nfs.conf" -- run "echo 'port=20050' >> /etc/nfs.conf" -- run "service_nfs restart" -- run "sleep 10" -- run "rpcinfo -p | grep -w nfs | grep 20050" -- run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" - -- if [ $? -eq 0 ]; then -- run "mount -t nfs4" - -- run "mount -t nfs4 | grep -q port=20050" 0 "Should show port=20050" -- run "umount $nfsmp" -- fi -- run "mount -t nfs -o vers=4,port=0 localhost:$expdir $nfsmp" - -- if [ $? -eq 0 ]; then -- run "mount -t nfs4" - -- run "mount -t nfs4 | grep -q port=20050" 0 "Should show port=20050" -- run "umount $nfsmp" -- fi -- run "mount -t nfs -o vers=4,port=20050 localhost:$expdir $nfsmp" -- run "mount -t nfs4 | grep $nfsmp" - -- run "mount -t nfs4 | grep $nfsmp | grep -q port=20050" 0 "Should show port=20050" -- run "umount $nfsmp" -+ rlPhaseStartTest do-Test-bz1465259-mount-nfsv4-show-wrong-port -+ run "echo '$expdir *(rw,no_root_squash)' > /etc/exports" -+ run "service_nfs restart" -+ run "exportfs -v" -+ run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "cat /proc/mounts | grep $nfsmp | grep -q 'port='" 1 "Omit displaying 'port=' by default" -+ run "mount -o remount,ro $nfsmp" -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "cat /proc/mounts | grep $nfsmp | grep -q 'port='" 1 "Omit displaying 'port=' by default" -+ run "umount $nfsmp" -+ if [ -e "/etc/nfs.conf" ]; then -+ echo "[nfsd]" > /etc/nfs.conf -+ echo "port=20050" >> /etc/nfs.conf -+ run "cat /etc/nfs.conf" - -+ run "service_nfs restart" -+ run "sleep 10" -+ run "rpcinfo -p | grep -w nfs | grep 20050" -+ run "mount -t nfs4 -o port=20050 localhost:$expdir $nfsmp" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "cat /proc/mounts | grep $nfsmp | grep -q port=20050" 0 "Should show port=20050" -+ run "mount -o remount,ro $nfsmp" -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "cat /proc/mounts | grep $nfsmp | grep -q port=20050" 0 "Should show port=20050" -+ run "umount $nfsmp" -+ fi -+ log "{Info} If NFS service is not available on the specified port" -+ run "mount -t nfs4 -o port=2049 localhost:$expdir $nfsmp" 1-255 -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ log "{Info} If port value is not specified" -+ if ls_nfsvers | grep -q -w 3; then -+ run "mount -t nfs -o vers=3 localhost:$expdir $nfsmp" 0 "for v2/v3 client uses port advertised by server's rpcbind service" -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" 1-255 "for v4 client uses the standard NFS port (2049) without checking" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ log "{Info} If the specified port value is 0" -+ run "mount -t nfs -o vers=4,port=0 localhost:$expdir $nfsmp" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "cat /proc/mounts | grep $nfsmp | grep -q port=0" 0 "Should show port=0" -+ run "umount $nfsmp" -+ fi -+ run "echo '' > /etc/nfs.conf" 0 "Recovering" -+ fi - rlPhaseEnd - -+ if ls_nfsvers | grep -q -w "4.0"; then -+ rlPhaseStartTest do-Test-bz1592915-sanity-check-clientaddr-during-mount -+ run "echo '$expdir *(rw,no_root_squash)' > /etc/exports" -+ run "service_nfs restart" -+ run "exportfs -v" -+ log "{Info} Mounting v4.0 by default" -+ run "mount -o vers=4,minorversion=0 localhost:$expdir $nfsmp -v" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ log "{Info} Setting 'clientaddr=' not match any local address" -+ # use normal mode (no verbose) to check the emitted warning -+ run "mount -o vers=4,minorversion=0,clientaddr=1.2.3.4 localhost:$expdir $nfsmp &> >(tee stdout.log)" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ run "cat stdout.log | grep -q '[warning].*not match any existing network addresses'" 0 "Should warn the administrators" -+ log "{Info} Specifying IPv4_ANY (0.0.0.0) signifying client does not want delegations" -+ run "mount -o vers=4,minorversion=0,clientaddr=0.0.0.0 localhost:$expdir $nfsmp -v" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ log "{Info} Specifying IPv6_ANY (::0) signifying client does not want delegations" -+ run "mount -o vers=4,minorversion=0,clientaddr=::0 localhost:$expdir $nfsmp -v" -+ if [ $? -eq 0 ]; then -+ run "cat /proc/mounts | grep $nfsmp" - -+ run "umount $nfsmp" -+ fi -+ rlPhaseEnd -+ fi -+ - rlPhaseStartCleanup do-Cleanup- -- run 'rm -rf $expdir $nfsmp $subexpdir $tmpnfsmp' -+ run "rm -rf $expdir $nfsmp $subexpdir $tmpnfsmp" - rlFileRestore - run "service_nfs restart" -- #avoid issues restarting the server too quickly -- sleep 10 -+ if [ -n "ORIGINAL_HOSTNAME" ]; then -+ HOSTNAME="$ORIGINAL_HOSTNAME" -+ hostnamectl set-hostname "$HOSTNAME" -+ fi - rlPhaseEnd - rlJournalEnd - #rlJournalPrintText -diff --git a/tests/exportfs/Makefile b/tests/exportfs/Makefile -new file mode 100644 -index 0000000..d367651 ---- /dev/null -+++ b/tests/exportfs/Makefile -@@ -0,0 +1,79 @@ -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: test for command exportfs -+# Author: Stevens Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+TENV=_env -+ifeq ($(PKG_TOP_DIR),) -+ export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ export _TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ -include $(PKG_TOP_DIR)/env.mk -+endif -+include $(TENV) -+ifeq ($(_TOP_DIR),) -+ _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) -+endif -+#=============================================================================== -+ -+export TESTVERSION=1.0 -+ -+BUILT_FILES= -+ -+FILES=$(TENV) $(METADATA) runtest.sh Makefile PURPOSE -+ -+.PHONY: all install download clean -+ -+run: $(FILES) build -+ ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ -+. /usr/share/beakerlib/beakerlib.sh; \ -+. runtest.sh ) -+ -+build: $(BUILT_FILES) -+ test -x runtest.sh || chmod a+x runtest.sh -+ -+clean: -+ rm -f *~ $(BUILT_FILES) -+ -+ -+-include /usr/share/rhts/lib/rhts-make.include -+ -+$(METADATA): Makefile -+ @echo "Owner: Stevens Yin " > $(METADATA) -+ @echo "Name: $(TEST)" >> $(METADATA) -+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -+ @echo "Path: $(TEST_DIR)" >> $(METADATA) -+ @echo "Description: test for command exportfs" >> $(METADATA) -+ @echo "Type: Regression" >> $(METADATA) -+ @echo "TestTime: 30m" >> $(METADATA) -+ @echo "RunFor: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: library(kernel/base)" >> $(METADATA) -+ @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -+ @echo "Priority: Normal" >> $(METADATA) -+ @echo "License: GPLv2" >> $(METADATA) -+ @echo "Confidential: no" >> $(METADATA) -+ @echo "Destructive: no" >> $(METADATA) -+ -+ rhts-lint $(METADATA) -+ -diff --git a/tests/mount/Makefile b/tests/mount/Makefile -new file mode 100644 -index 0000000..412b640 ---- /dev/null -+++ b/tests/mount/Makefile -@@ -0,0 +1,79 @@ -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: Test for command mount.nfs{,4} -+# Author: Stevens Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+TENV=_env -+ifeq ($(PKG_TOP_DIR),) -+ export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ export _TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ -include $(PKG_TOP_DIR)/env.mk -+endif -+include $(TENV) -+ifeq ($(_TOP_DIR),) -+ _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) -+endif -+#=============================================================================== -+ -+export TESTVERSION=1.0 -+ -+BUILT_FILES= -+ -+FILES=$(TENV) $(METADATA) runtest.sh Makefile PURPOSE -+ -+.PHONY: all install download clean -+ -+run: $(FILES) build -+ ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ -+. /usr/share/beakerlib/beakerlib.sh; \ -+. runtest.sh ) -+ -+build: $(BUILT_FILES) -+ test -x runtest.sh || chmod a+x runtest.sh -+ -+clean: -+ rm -f *~ $(BUILT_FILES) -+ -+ -+-include /usr/share/rhts/lib/rhts-make.include -+ -+$(METADATA): Makefile -+ @echo "Owner: Stevens Yin " > $(METADATA) -+ @echo "Name: $(TEST)" >> $(METADATA) -+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -+ @echo "Path: $(TEST_DIR)" >> $(METADATA) -+ @echo "Description: Test for command mount.nfs{,4}" >> $(METADATA) -+ @echo "Type: Regression" >> $(METADATA) -+ @echo "TestTime: 30m" >> $(METADATA) -+ @echo "RunFor: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: library(kernel/base)" >> $(METADATA) -+ @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -+ @echo "Priority: Normal" >> $(METADATA) -+ @echo "License: GPLv2" >> $(METADATA) -+ @echo "Confidential: no" >> $(METADATA) -+ @echo "Destructive: no" >> $(METADATA) -+ -+ rhts-lint $(METADATA) -+ -diff --git a/tests/nfs-mount-options-all/Makefile b/tests/nfs-mount-options-all/Makefile -new file mode 100644 -index 0000000..afc24cc ---- /dev/null -+++ b/tests/nfs-mount-options-all/Makefile -@@ -0,0 +1,77 @@ -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: Test for nfs mount options -+# Author: Bill Peck -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2006 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+TENV=_env -+ifeq ($(PKG_TOP_DIR),) -+ export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ export _TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ -include $(PKG_TOP_DIR)/env.mk -+endif -+include $(TENV) -+ifeq ($(_TOP_DIR),) -+ _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) -+endif -+#=============================================================================== -+ -+ -+export TESTVERSION=0.1 -+ -+.PHONY: all install download clean -+ -+METADATA=testinfo.desc -+BUILT_FILES= # built executables should be added here -+FILES=$(TENV) $(METADATA) runtest.sh Makefile -+ -+build: $(BUILT_FILES) -+ chmod a+x ./runtest.sh -+ -+clean: -+ rm -f .*.swp *~ $(BUILT_FILES) -+ -+run: $(FILES) build -+ ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ -+. /usr/share/beakerlib/beakerlib.sh; \ -+. runtest.sh ) -+ -+-include /usr/share/rhts/lib/rhts-make.include -+# Generate the testinfo.desc here: -+$(METADATA): Makefile -+ @touch $(METADATA) -+ @echo "Owner: Nicol TAO" > $(METADATA) -+ @echo "Name: $(TEST)" >> $(METADATA) -+ @echo "Path: $(TEST_DIR)" >> $(METADATA) -+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -+ @echo "Description: nfs general mount options supported by all nfs versions" >> $(METADATA) -+ @echo "TestTime: 45m" >> $(METADATA) -+ @echo "RunFor: $(PACKAGE_NAME)" >> $(METADATA) -+ @echo "RunFor: nfs-utils" >> $(METADATA) -+ @echo "Requires: $(PACKAGE_NAME)" >> $(METADATA) -+ @echo "Requires: library(kernel/base)" >> $(METADATA) -+ @echo "Requires: nfs-utils" >> $(METADATA) -+ @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -+ @echo "Priority: Medium" >> $(METADATA) -+ @echo "Type: Regression" >> $(METADATA) -+ @echo "License: GPL" >> $(METADATA) -diff --git a/tests/systemd-nfs/Makefile b/tests/systemd-nfs/Makefile -new file mode 100644 -index 0000000..111c1fc ---- /dev/null -+++ b/tests/systemd-nfs/Makefile -@@ -0,0 +1,74 @@ -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: test for: nfs -+# Author: Jianhong Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2014 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+#Generate and export TEST= PACKAGE= -+TENV=_env -+ifeq ($(PKG_TOP_DIR),) -+ export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ export _TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ -include $(PKG_TOP_DIR)/env.mk -+endif -+include $(TENV) -+ifeq ($(_TOP_DIR),) -+ _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) -+endif -+#=============================================================================== -+export TESTVERSION=1.0 -+ -+BUILT_FILES= -+FILES=$(TENV) $(METADATA) runtest.sh Makefile PURPOSE -+ -+.PHONY: all install download clean -+ -+run: $(FILES) build -+ ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ -+. /usr/share/beakerlib/beakerlib.sh || exit 1; \ -+. runtest.sh ) -+ -+build: $(BUILT_FILES) -+ test -x runtest.sh || chmod a+x runtest.sh -+ -+clean: -+ rm -f *~ $(BUILT_FILES) -+ -+-include /usr/share/rhts/lib/rhts-make.include -+ -+$(METADATA): Makefile -+ @echo "Owner: Jianhong Yin " > $(METADATA) -+ @echo "Name: $(TEST)" >> $(METADATA) -+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -+ @echo "Path: $(TEST_DIR)" >> $(METADATA) -+ @echo "Description: test for: nfs" >> $(METADATA) -+ @echo "Type: regression" >> $(METADATA) -+ @echo "Type: $(PACKAGE)-level-tier1" >> $(METADATA) -+ @echo "TestTime: 30m" >> $(METADATA) -+ @echo "RunFor: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: $(PACKAGE)" >> $(METADATA) -+ @echo "Priority: Normal" >> $(METADATA) -+ @echo "License: GPLv2" >> $(METADATA) -+ @echo "Requires: nfs-utils" >> $(METADATA) -+ @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -+ rhts-lint $(METADATA) -diff --git a/tests/systemd-nfs/runtest.sh b/tests/systemd-nfs/runtest.sh -old mode 100755 -new mode 100644 -index 63d8593..ec2d219 ---- a/tests/systemd-nfs/runtest.sh -+++ b/tests/systemd-nfs/runtest.sh -@@ -1,40 +1,44 @@ - #!/bin/bash - # vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --# - # Description: test for: nfs - # Author: Jianhong Yin --# - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # - # Copyright (c) 2014 Red Hat, Inc. - # --# This program is free software: you can redistribute it and/or --# modify it under the terms of the GNU General Public License as --# published by the Free Software Foundation, either version 2 of --# the License, or (at your option) any later version. -+# This copyrighted material is made available to anyone wishing -+# to use, modify, copy, or redistribute it subject to the terms -+# and conditions of the GNU General Public License version 2. - # - # This program is distributed in the hope that it will be - # useful, but WITHOUT ANY WARRANTY; without even the implied - # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --# PURPOSE. See the GNU General Public License for more details. -+# PURPOSE. See the GNU General Public License for more details. - # --# You should have received a copy of the GNU General Public License --# along with this program. If not, see http://www.gnu.org/licenses/. -+# You should have received a copy of the GNU General Public -+# License along with this program; if not, write to the Free -+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -+# Boston, MA 02110-1301, USA. - # - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - [ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh - . /usr/share/beakerlib/beakerlib.sh || exit 1 - -+# Load beakerlib you needed -+rlImport kernel/base -+envinfo -+#disable_avc_check - #=============================================================================== - - #signal trap - trap "cleanup" SIGINT SIGTERM SIGHUP SIGQUIT - cleanup() { - rlFileRestore -- run 'service_nfsconfig restart' -- #rm -rf $expdir $nfsmp -+ run 'service_nfs restart' -+ run 'service_nfsconfig status &>/dev/null && service_nfsconfig restart' - -+ run 'userdel -rf testuserqa' - - } - - #global var define -@@ -47,135 +51,152 @@ rpm -q systemd || { - - rlJournalStart - rlPhaseStartSetup do-Setup- -- # Load beakerlib you needed -- rlImport kernel/base -- envinfo - rlFileBackup /etc/exports /etc/sysconfig/nfs - run 'echo "/usr/share *(ro)" >/etc/exports' -- run 'echo "RPCNFSDARGS=8" >/etc/sysconfig/nfs' 0 "avoid invalid config file" -- run 'service_nfsconfig restart' 0 "RHEL-7.1 or later need restart nfs-config to reload /etc/sysconfig/nfs" -+ run 'echo "" > /etc/sysconfig/nfs' 0 "avoid invalid config file" -+ # If in RHEL-7.1 or later need restart nfs-config service to flush /etc/sysconfig/nfs to /run/sysconfig/nfs-utils -+ # But since RHEL-7.3, nfs-config change to be ru-run during the dependent service starting -+ run 'service_nfsconfig status &>/dev/null && service_nfsconfig restart' - - run "useradd testuserqa" - - rlPhaseEnd - - rlPhaseStartTest do-Test-start -- run "service_$serv start" 0 "Service must start without problem" -- run "service_$serv status" 0 "Then Status command" -- run "service_$serv start" 0 "Already started service" -- run "service_$serv status" 0 "Again status command" -+ run "service_nfs start" 0 "Service must start without problem" -+ run "service_nfs status" 0 "Then Status command" -+ run "service_nfs start" 0 "Already started service" -+ run "service_nfs status" 0 "Again status command" - rlPhaseEnd - - rlPhaseStartTest do-Test-restart -- run "service_$serv restart" 0 "Restarting of service" -- run "service_$serv status" 0 "Status command" -+ run "service_nfs restart" 0 "Restarting of service" -+ run "service_nfs status" 0 "Status command" - rlPhaseEnd - - rlPhaseStartTest do-Test-stop -- run "service_$serv stop" 0 "Stopping service" -- run "service_$serv status" 3 "Status of stopped service" -- run "service_$serv stop" 0 "Stopping service again" -- run "service_$serv status" 3 "Status of stopped service" -+ run "service_nfs stop" 0 "Stopping service" -+ run "service_nfs status" 3 "Status of stopped service" -+ run "service_nfs stop" 0 "Stopping service again" -+ run "service_nfs status" 3 "Status of stopped service" - rlPhaseEnd - - rlPhaseStartTest do-Test-"insufficient-rights" -- run "service_$serv restart " 0 "Starting service for restarting under nonpriv user" -- run "su testuserqa -c 'service_$serv stop'" 1,4 "Insufficient rights, stopping service under nonprivileged user must fail" -- run "su testuserqa -c 'service_$serv start'" 0,1,4 "Insufficient rights, starting service under nonprivileged user must fail or pass as already started" -- run "su testuserqa -c 'service_$serv status'" 0 "Sufficient rights, service status should be accessible to nonprivileged users" -- run "service_$serv stop" 0 "Stopping service for starting under nonpriv user" -- run "su testuserqa -c 'service_$serv start'" 1,4 "Insufficient rights, starting of stopped service under nonprivileged user must fail" -+ run "service_nfs restart " 0 "Starting service for restarting under nonpriv user" -+ run "su testuserqa -c 'service_nfs stop'" 1,4 "Insufficient rights, stopping service under nonprivileged user must fail" -+ run "su testuserqa -c 'service_nfs start'" 0,1,4 "Insufficient rights, starting service under nonprivileged user must fail or pass as already started" -+ run "su testuserqa -c 'service_nfs status'" 0 "Sufficient rights, service status should be accessible to nonprivileged users" -+ run "service_nfs stop" 0 "Stopping service for starting under nonpriv user" -+ run "su testuserqa -c 'service_nfs start'" 1,4 "Insufficient rights, starting of stopped service under nonprivileged user must fail" - rlPhaseEnd - - rlPhaseStartTest do-Test-"operations" -- run "service_$serv start" 0 "Service have to implement start function" -- run 'sleep 5' 0 "sleep a while avoid the start rate limit" -- run "service_$serv restart" 0 "Service have to implement restart function" -- run "service_$serv status" 0 "Service have to implement status function" -- run 'sleep 5' 0 "sleep a while avoid the start rate limit" -- run "service_$serv condrestart" 0 "Service have to implement condrestart function" -+ run "service_nfs start" 0 "Service have to implement start function" -+ run 'sleep 5' 0 "sleep a while avoid the start rate limit, bz1160506" -+ run "service_nfs restart" 0 "Service have to implement restart function" -+ run "service_nfs status" 0 "Service have to implement status function" -+ run 'sleep 5' 0 "sleep a while avoid the start rate limit, bz1160506" -+ run "service_nfs condrestart" 0 "Service have to implement condrestart function" - [ $? != 0 ] && run "journalctl -xn" - -- run 'sleep 5' 0 "sleep a while avoid the start rate limit" -- run "service_$serv try-restart" 0 "Service have to implement try-restart function" -+ run 'sleep 5' 0 "sleep a while avoid the start rate limit, bz1160506" -+ run "service_nfs try-restart" 0 "Service have to implement try-restart function" - [ $? != 0 ] && run "journalctl -xn" - -- run "service_$serv reload" 0 "Service have to implement reload function" -+ run "service_nfs reload" 0 "Service have to implement reload function" - [ $? != 0 ] && run "journalctl -xn" - -- run "service_$serv force-reload" 0 "Service have to implement force-reload function" -+ run "service_nfs force-reload" 0 "Service have to implement force-reload function" - [ $? != 0 ] && run "journalctl -xn" - -- run "service_$serv noexistop" 2 "Testing proper return code when nonexisting function" -+ run "service_nfs noexistop" 2 "Testing proper return code when nonexisting function" - rlPhaseEnd - - # Should do nothing if a service is already stopped or not running (according to manpage of systemctl) - # http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic.html#INISCRPTACT - rlPhaseStartTest do-Test-"operations-stopped" -- run "service_$serv stop" 0 "Service have to implement stop function" -- run "service_$serv condrestart" 0 "Service have to implement condrestart function" -- run "service_$serv try-restart" 0 "Service have to implement try-restart function" -- run "service_$serv force-reload" 0 "Service have to implement force-reload function" -- run "service_$serv status" 3 "Above oprations should do nothing if service are not running" -+ run "service_nfs stop" 0 "Service have to implement stop function" -+ run "service_nfs condrestart" 0 "Service have to implement condrestart function" -+ run "service_nfs try-restart" 0 "Service have to implement try-restart function" -+ run "service_nfs force-reload" 0 "Service have to implement force-reload function" -+ run "service_nfs status" 3 "Above oprations should do nothing if service are not running" - rlPhaseEnd - - rlPhaseStartTest do-Test-enable-disable-$serv - if systemctl --quiet is-enabled $serv; then - run "systemctl disable $serv" 0 "Disable service on boot" - run "systemctl is-enabled $serv" 1 "Check whether service is disabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "test `systemctl is-enabled nfs-server` = disabled" - run "systemctl enable $serv" 0 "Enable service on boot" - run "systemctl is-enabled $serv" 0 "Check whether service is enabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "test `systemctl is-enabled nfs-server` = enabled" - else - run "systemctl enable $serv" 0 "Enable service on boot" - run "systemctl is-enabled $serv" 0 "Check whether service is enabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "test `systemctl is-enabled nfs-server` = enabled" - run "systemctl disable $serv" 0 "Disable service on boot" - run "systemctl is-enabled $serv" 1 "Check whether service is disabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "test `systemctl is-enabled nfs-server` = disabled" - fi - rlPhaseEnd - -- # ystemctl enable fails for symlinks in /usr/lib/systemd/system -+ # As Bug 1159308 - systemctl enable fails for symlinks in /usr/lib/systemd/system - # Use a workaround to test enable/disable with nfs-server.service -- rlPhaseStartTest do-Test-enable-disable-nfs-server -+ if [ -f /usr/lib/systemd/system/nfs.service ]; then -+ rlPhaseStartTest do-Test-enable-disable-nfs-symlinks - if systemctl --quiet is-enabled nfs-server; then -- run "systemctl disable nfs-server" 0 "Disable nfs-serverice on boot" -- run "systemctl is-enabled nfs-server" 1 "Check whether nfs-serverice is disabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -- run "systemctl enable nfs-server" 0 "Enable nfs-serverice on boot" -- run "systemctl is-enabled nfs-server" 0 "Check whether nfs-serverice is enabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "systemctl disable nfs" 0 "Disable nfs on boot" -+ run "systemctl is-enabled nfs" 1 "Check whether nfs is disabled" -+ run "test `systemctl is-enabled nfs` = `systemctl is-enabled nfs-server`" -+ run "systemctl enable nfs" 0 "Enable nfs on boot" -+ run "systemctl is-enabled nfs" 0 "Check whether nfs is enabled" -+ run "test `systemctl is-enabled nfs` = `systemctl is-enabled nfs-server`" - else -- run "systemctl enable nfs-server" 0 "Enable nfs-serverice on boot" -- run "systemctl is-enabled nfs-server" 0 "Check whether nfs-serverice is enabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -- run "systemctl disable nfs-server" 0 "Disable nfs-serverice on boot" -- run "systemctl is-enabled nfs-server" 1 "Check whether nfs-serverice is disabled" -- run "test `systemctl is-enabled nfs-server` = `systemctl is-enabled nfs`" -+ run "systemctl enable nfs" 0 "Enable nfs on boot" -+ run "systemctl is-enabled nfs" 0 "Check whether nfs is enabled" -+ run "test `systemctl is-enabled nfs` = `systemctl is-enabled nfs-server`" -+ run "systemctl disable nfs" 0 "Disable nfs on boot" -+ run "systemctl is-enabled nfs" 1 "Check whether nfs is disabled" -+ run "test `systemctl is-enabled nfs` = `systemctl is-enabled nfs-server`" - fi - rlPhaseEnd -+ fi - -- rlPhaseStartTest do-Test-nfsv4-only -- run 'service nfs stop' -+ rlPhaseStartTest do-Test-bz641291-nfsv4-only -+ run 'service_nfs stop' -+ run 'cp /etc/sysconfig/nfs /etc/sysconfig/nfs.backup' - # MOUNTD_NFS_V2 MOUNTD_NFS_V3 was not supported in RHEL-7.x -- run 'echo -e "RPCMOUNTDOPTS=\"-N 2 -N 3\"" >>/etc/sysconfig/nfs' 0 "enabling nfsv4 only" -- # If in RHEL-7.1 or later need restart nfs-config service to flush /etc/sysconfig/nfs to /run/sysconfig/nfs-utils -- # But since RHEL-7.3, nfs-config change to be ru-run during the dependent service starting -+ run 'echo "RPCMOUNTDOPTS=\"-N 2 -N 3\"" > /etc/sysconfig/nfs' 0 "disabling mountd v2/v3" - run 'service_nfsconfig status &>/dev/null && service_nfsconfig restart' - -- run 'cat /run/sysconfig/nfs-utils | grep RPCMOUNTDARGS | grep "\""' 0 "quote variable in /run/sysconfig/nfs-utils" - run 'sleep 5' 0 "sleep a while avoid service script bug" - run 'service_nfs start' -+ [ -f /run/sysconfig/nfs-utils ] && \ -+ run 'cat /run/sysconfig/nfs-utils | grep RPCMOUNTDARGS | grep "\""' 0 "bz1175160 quote variable in /run/sysconfig/nfs-utils" - run 'rpcinfo -s | grep -w mountd' 1 "if nfsv4 only, no mountd info in rpcinfo" -- rlFileRestore /etc/sysconfig/nfs -- run 'service_nfsconfig restart' -+ # we allow running V4-only nfsd without rpcbind -+ log "{Info} bz1433390 nfsd startup won't delay in absence of rpcbind" -+ run 'echo "RPCNFSDARGS=\"-N 2 -N 3\"" >>/etc/sysconfig/nfs' 0 "disabling nfsd v2/v3" -+ run 'service_nfsconfig status &>/dev/null && service_nfsconfig restart' - -+ run 'service_nfs restart' -+ [ -f /run/sysconfig/nfs-utils ] && \ -+ run 'cat /run/sysconfig/nfs-utils | grep RPCNFSDARGS' - -+ run 'rpcinfo -s | grep -w nfs' -+ run 'service_nfs stop' -+ run 'service rpcbind stop' -+ run 'systemctl mask rpcbind' 0 "Mask systemd service rpcbind.service" -+ run 'timeLimitRun 10 service_nfs start' 0 "nfs should come up successfully without rpcbind" -+ run 'service_nfs status' -+ run 'systemctl unmask rpcbind' -+ run 'timeLimitRun 10 service_nfs stop' -+ run 'mv /etc/sysconfig/nfs.backup /etc/sysconfig/nfs' -+ run 'service_nfsconfig status &>/dev/null && service_nfsconfig restart' - - rlPhaseEnd - -+ # Accoring to https://bugzilla.redhat.com/show_bug.cgi?id=1126073#c29 - # Since nfs-service no longer starts the daemons in question. They are now split - # into their own services (nfs-mountd.service, rpc-statd.service, nfs-idmapd.service). - # Then `systemctl status nfs-server.service` cannot accurately reflect the - # state of the combination of daemons that are needed for a working NFS server. -- rlPhaseStartTest do-Test-"nfs-server-is-active-even-processes-terminated" -+ rlPhaseStartTest do-Test-"bz1126073-nfs-server-is-active-even-processes-terminated" - run 'service_nfs restart' - run 'pkill rpc.mountd' - - run 'killall -9 nfsd' - - run 'ps axf | grep -e "rpc.mountd" -e "nfsd"' - -- run 'service nfs-mountd status' 1-255 -+ run 'service_nfs-mountd status' 1-255 - run 'rpcinfo -t localhost 100005' 1 "pings mountd" - log '{Info} nfsserver resource agent has been updated to monitor all its daemons' - run 'service_nfs status' 1-255,0 -@@ -183,7 +204,7 @@ rlJournalStart - run 'service_nfs stop' - rlPhaseEnd - -- rlPhaseStartTest do-Test-"should-auto-mount-/proc/fs/nfsd" -+ rlPhaseStartTest do-Test-"bz1010634-should-auto-mount-/proc/fs/nfsd" - run 'service_nfs restart' - run 'service_nfs stop' - run 'umount /proc/fs/nfsd' -@@ -191,95 +212,90 @@ rlJournalStart - run 'mount -t nfsd nfsd /proc/fs/nfsd' - - rlPhaseEnd - -- rlPhaseStartTest do-Test-"use-rpcbind.service-in-nfs-server.service" -+ rlPhaseStartTest do-Test-"bz1171603-use-rpcbind.service-in-nfs-server.service" - run "systemctl reset-failed" 0 "workaround for failure of starting too often" - log "{Info} Starting nfs while rpcbind is stopped" -- run "service rpcbind stop; service rpcbind stop" 0 "stop twice as workaround" -+ run "service rpcbind stop; service rpcbind stop" 0 "stop twice as workaround for bug 1257129" - run "service rpcbind status" 3 "rpcbind.service should be stopped" -- run "service nfs restart" -- run "service nfs status" 0 "should start nfs successfully" -+ run "service_nfs restart" -+ run "service_nfs status" 0 "should start nfs successfully" - run "service rpcbind status" 0 "starting nfs should bring rpcbind up" - - log "{Info} Starting nfs while rpcbind is active" - run "service rpcbind start" - run "service rpcbind status" 0 "rpcbind should be active" -- run "service nfs restart" -- run "service nfs status" 0 "should start nfs successfully" -+ run "service_nfs restart" -+ run "service_nfs status" 0 "should start nfs successfully" - run "service rpcbind status" 0 "starting nfs should keep rpcbind up" - - log "{Info} Stopping nfs while rpcbind is active" - run "service rpcbind start" - run "service rpcbind status" 0 "rpcbind should be active" -- run "service nfs start; service nfs status" -- run "service nfs stop; service nfs status" 3 -+ run "service_nfs start; service_nfs status" -+ run "service_nfs stop; service_nfs status" 3 - run "service rpcbind status" 0 "stopping nfs should keep rpcbind up" - - log "{Info} Stopping nfs while rpcbind is stopped" -- run "service nfs start" 0 "firstly start nfs since it can bring rpcbind up" -- run "service nfs status" 0 "should start nfs successfully" -- run "service rpcbind stop; service rpcbind stop" 0 "stop twice as workaround" -+ run "service_nfs start" 0 "firstly start nfs since it can bring rpcbind up" -+ run "service_nfs status" 0 "should start nfs successfully" -+ run "service rpcbind stop; service rpcbind stop" 0 "stop twice as workaround for bug 1257129" - run "service rpcbind status" 3 "rpcbind should be stopped" -- run "service nfs stop" -+ run "service_nfs stop" - # If a daemon tries to connect to port 111 systemd will start rpcbind automaticly -+ # https://bugzilla.redhat.com/show_bug.cgi?id=1266993#c7 -+ run "sleep 1" 0 "Wait a while for starting" - run "service rpcbind status" 0 "stopping nfs should bring rpcbind up" - rlPhaseEnd - -- rlPhaseStartTest do-Test-"restarting rpbind also restart the the nfs server" -+ rlPhaseStartTest do-Test-bz1266993-"restarting rpbind also restart the the nfs server" - run "systemctl reset-failed" 0 "workaround for failure of starting too often" - log "{Info} Starting rpcbind while nfs is stopped" -- run "service nfs stop" -- run "service nfs status" 3 "nfs should be stopped" -+ run "service_nfs stop" -+ run "service_nfs status" 3 "nfs should be stopped" - run "service rpcbind restart" -- run "service nfs status" 3 "starting rpcbind should NOT bring nfs up" -+ run "service_nfs status" 3 "starting rpcbind should NOT bring nfs up" - - log "{Info} Starting rpcbind while nfs is active" -- run "service nfs start" -- run "service nfs status" 0 "nfs should be active" -+ run "service_nfs start" -+ run "service_nfs status" 0 "nfs should be active" - run "service rpcbind restart" -- run "service nfs status" 0 "starting rpcbind should NOT interfere nfs" -+ run "service_nfs status" 0 "starting rpcbind should NOT interfere nfs" - - log "{Info} Stopping rpcbind while nfs is active" -- run "service nfs start" -- run "service nfs status" 0 "nfs should be active" -+ run "service_nfs start" -+ run "service_nfs status" 0 "nfs should be active" - run "service rpcbind start; service rpcbind stop" -- run "service nfs status" 0 "stopping rpcbind should NOT bring nfs down" -+ run "service_nfs status" 0 "stopping rpcbind should NOT bring nfs down" - - log "{Info} Stopping rpcbind while nfs is stopped" -- run "service nfs stop" -- run "service nfs status" 3 "nfs should be stopped" -+ run "service_nfs stop" -+ run "service_nfs status" 3 "nfs should be stopped" - run "service rpcbind start; service rpcbind stop" -- run "service nfs status" 3 "stopping rpcbind should NOT interfere nfs" -- rlPhaseEnd -- -- rlPhaseStartTest do-Test-fix-long-nfsd-startup-delay-in-absence-of-rpcbind -- run "systemctl stop rpcbind" -- run "systemctl stop nfs-server" -- run "systemctl mask rpcbind" 0 "Mask systemd service rpcbind.service" -- run "timeLimitRun 10 systemctl start nfs-server" 1-255 "Start service nfs-server without rpcbind will be failed due to systemd unit dependency" -- run "systemctl unmask rpcbind" -- run "timeLimitRun 10 systemctl stop nfs-server" - -+ run "service_nfs status" 3 "stopping rpcbind should NOT interfere nfs" - rlPhaseEnd - -- rlPhaseStartTest do-Test-"nfs-utils need to cause gssproxy reload" -- run "cp /etc/gssproxy/gssproxy.conf /etc/gssproxy/gssproxy.conf.backup" 0 "backuping" -- run "echo '[gssproxy]' > /etc/gssproxy/gssproxy.conf" -- run "echo 'debug = true' >> /etc/gssproxy/gssproxy.conf" -- run "systemctl restart gssproxy" --#FIXME when BZ#1535424 is fixed. Should not use /var/log/messages as it is not used on Fedora any more. -- run "echo '' > /var/log/messages" -- run "systemctl restart nfs" -- run "systemctl status nfs" -- run "systemctl status gssproxy" -- run "cat /var/log/messages | grep 'gssproxy:'" - -- run "cat /var/log/messages | grep -q 'gssproxy:.*loaded'" 0 "should re-reading config" -- run "mv /etc/gssproxy/gssproxy.conf.backup /etc/gssproxy/gssproxy.conf" 0 "recovering" -- run "systemctl restart gssproxy" -+ rlPhaseStartTest do-Test-"nfs-utils should reload gssproxy" -+ run "cp /etc/gssproxy/gssproxy.conf /etc/gssproxy/gssproxy.conf.backup" 0 "backuping" -+ run "echo '[gssproxy]' > /etc/gssproxy/gssproxy.conf" -+ run "echo 'debug = true' >> /etc/gssproxy/gssproxy.conf" -+ log "{Info} Check reloading when gssproxy is started" -+ run "systemctl restart gssproxy" -+ run "service_nfs restart" -+ run "systemctl status gssproxy -l" -+ run "systemctl status gssproxy -l | grep 'gssproxy\[[0-9]*\]' | grep -q 'New config loaded'" 0 "Should re-reading config" -+ run "systemctl status gssproxy -l | grep 'systemd\[[0-9]*\]' | grep -q 'Reloaded GSSAPI Proxy Daemon'" 0 "Should re-reading config" -+ log "{Info} Check reloading when gssproxy is stopped" -+ run "systemctl stop gssproxy" -+ run "service_nfs restart" -+ run "systemctl status gssproxy -l" -+ run "systemctl status gssproxy -l | grep 'gssproxy\[[0-9]*\]' | grep -q 'New config loaded'" 0 "Should re-reading config" -+ run "systemctl status gssproxy -l | grep 'systemd\[[0-9]*\]' | grep -q 'Reloaded GSSAPI Proxy Daemon'" 0 "Should re-reading config" -+ run "mv /etc/gssproxy/gssproxy.conf.backup /etc/gssproxy/gssproxy.conf" 0 "recovering" -+ run "systemctl restart gssproxy" - rlPhaseEnd - - rlPhaseStartCleanup do-Cleanup- -- run "userdel -rf testuserqa" - -- rlFileRestore -- run 'timeLimitRun 10 service_nfsconfig restart' -+ cleanup - rlPhaseEnd - - rlJournalEnd -diff --git a/tests/umount/Makefile b/tests/umount/Makefile -new file mode 100644 -index 0000000..4e4da65 ---- /dev/null -+++ b/tests/umount/Makefile -@@ -0,0 +1,79 @@ -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Description: Test for command umount.nfs{,4} -+# Author: Stevens Yin -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+# -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# This program is free software: you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation, either version 2 of -+# the License, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be -+# useful, but WITHOUT ANY WARRANTY; without even the implied -+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -+# PURPOSE. See the GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see http://www.gnu.org/licenses/. -+# -+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+TENV=_env -+ifeq ($(PKG_TOP_DIR),) -+ export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ export _TOP_DIR := $(shell p=$$PWD; while :; do \ -+ [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -+ -include $(PKG_TOP_DIR)/env.mk -+endif -+include $(TENV) -+ifeq ($(_TOP_DIR),) -+ _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) -+endif -+#=============================================================================== -+ -+export TESTVERSION=1.0 -+ -+BUILT_FILES= -+ -+FILES=$(TENV) $(METADATA) runtest.sh Makefile PURPOSE -+ -+.PHONY: all install download clean -+ -+run: $(FILES) build -+ ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ -+. /usr/share/beakerlib/beakerlib.sh; \ -+. runtest.sh ) -+ -+build: $(BUILT_FILES) -+ test -x runtest.sh || chmod a+x runtest.sh -+ -+clean: -+ rm -f *~ $(BUILT_FILES) -+ -+ -+-include /usr/share/rhts/lib/rhts-make.include -+ -+$(METADATA): Makefile -+ @echo "Owner: Stevens Yin " > $(METADATA) -+ @echo "Name: $(TEST)" >> $(METADATA) -+ @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -+ @echo "Path: $(TEST_DIR)" >> $(METADATA) -+ @echo "Description: Test for command umount.nfs{,4}" >> $(METADATA) -+ @echo "Type: Regression" >> $(METADATA) -+ @echo "TestTime: 30m" >> $(METADATA) -+ @echo "RunFor: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: $(PACKAGE)" >> $(METADATA) -+ @echo "Requires: library(kernel/base)" >> $(METADATA) -+ @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -+ @echo "Priority: Normal" >> $(METADATA) -+ @echo "License: GPLv2" >> $(METADATA) -+ @echo "Confidential: no" >> $(METADATA) -+ @echo "Destructive: no" >> $(METADATA) -+ -+ rhts-lint $(METADATA) -+ - -From ae009836a573c8b55e55d9504bf72d63800d83e4 Mon Sep 17 00:00:00 2001 -From: Bruno Goncalves -Date: Jan 21 2019 10:57:57 +0000 -Subject: [PATCH 4/6] fix ipv6 test on export-mount-local - - ---- - -diff --git a/tests/export-mount-local/runtest.sh b/tests/export-mount-local/runtest.sh -index 60d0c90..29a351a 100755 ---- a/tests/export-mount-local/runtest.sh -+++ b/tests/export-mount-local/runtest.sh -@@ -48,7 +48,8 @@ subexpdir=/exportDir-$BZ/sub - tmpnfsmp=${nfsmp}-tmp - - read ipv4 _nil <<<$(getDefaultIp) --read ipv6s _nil <<<$(getDefaultIp 6) -+#read ipv6s _nil <<<$(getDefaultIp 6) -+ipv6s=::1 - ipv6="[$ipv6s]" - # in case "localhost.localdomain" - if echo "$HOSTNAME" | grep -q "localhost"; then - -From 2371443256b25b8d6088788f791284caa012df11 Mon Sep 17 00:00:00 2001 -From: Bruno Goncalves -Date: Jan 21 2019 15:26:27 +0000 -Subject: [PATCH 5/6] add nic name to ipv6 addr - - ---- - -diff --git a/tests/export-mount-local/runtest.sh b/tests/export-mount-local/runtest.sh -index 29a351a..eeb5dde 100755 ---- a/tests/export-mount-local/runtest.sh -+++ b/tests/export-mount-local/runtest.sh -@@ -47,9 +47,9 @@ nfsmp=/mnt/nfsmp-$BZ - subexpdir=/exportDir-$BZ/sub - tmpnfsmp=${nfsmp}-tmp - -+read default_nic <<<$(getDefaultNic) - read ipv4 _nil <<<$(getDefaultIp) --#read ipv6s _nil <<<$(getDefaultIp 6) --ipv6s=::1 -+read ipv6s _nil <<<$(getDefaultIp 6nfs) - ipv6="[$ipv6s]" - # in case "localhost.localdomain" - if echo "$HOSTNAME" | grep -q "localhost"; then - -From 9ba8cf83a319c5894f342e931e94ce61a7c89b88 Mon Sep 17 00:00:00 2001 -From: Bruno Goncalves -Date: Jan 23 2019 08:04:16 +0000 -Subject: [PATCH 6/6] drop export-mount-local test case and add gating file - - ---- - -diff --git a/gating.yaml b/gating.yaml -new file mode 100644 -index 0000000..6985029 ---- /dev/null -+++ b/gating.yaml -@@ -0,0 +1,6 @@ -+--- !Policy -+product_versions: -+ - rhel-8 -+decision_context: osci_compose_gate -+rules: -+ - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} -diff --git a/tests/export-mount-local/Makefile b/tests/export-mount-local/Makefile -deleted file mode 100644 -index 6ddfa94..0000000 ---- a/tests/export-mount-local/Makefile -+++ /dev/null -@@ -1,76 +0,0 @@ --# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --# --# Description: test for: export-mount --# Author: Jianhong Yin --# --# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --# --# Copyright (c) 2014 Red Hat, Inc. --# --# This program is free software: you can redistribute it and/or --# modify it under the terms of the GNU General Public License as --# published by the Free Software Foundation, either version 2 of --# the License, or (at your option) any later version. --# --# This program is distributed in the hope that it will be --# useful, but WITHOUT ANY WARRANTY; without even the implied --# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --# PURPOSE. See the GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License --# along with this program. If not, see http://www.gnu.org/licenses/. --# --# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- --#Generate and export TEST= PACKAGE= --TENV=_env --ifeq ($(PKG_TOP_DIR),) -- export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ -- [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -- export _TOP_DIR := $(shell p=$$PWD; while :; do \ -- [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) -- -include $(PKG_TOP_DIR)/env.mk --endif --include $(TENV) --ifeq ($(_TOP_DIR),) -- _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) --endif --#=============================================================================== --export TESTVERSION=1.0 -- --BUILT_FILES= --FILES=$(TENV) $(METADATA) runtest.sh Makefile PURPOSE -- --.PHONY: all install download clean -- --run: $(FILES) build -- ( set +o posix; [ -e /usr/bin/rhts_environment.sh ] && . /usr/bin/rhts_environment.sh; \ --. /usr/share/beakerlib/beakerlib.sh || exit 1; \ --. runtest.sh ) -- --build: $(BUILT_FILES) -- test -x runtest.sh || chmod a+x runtest.sh -- --clean: -- rm -f *~ $(BUILT_FILES) -- ---include /usr/share/rhts/lib/rhts-make.include -- --$(METADATA): Makefile -- @echo "Owner: Jianhong Yin " > $(METADATA) -- @echo "Name: $(TEST)" >> $(METADATA) -- @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) -- @echo "Path: $(TEST_DIR)" >> $(METADATA) -- @echo "Description: test for: export-mount" >> $(METADATA) -- @echo "Type: function" >> $(METADATA) -- @echo "Type: $(PACKAGE)-level-tier1" >> $(METADATA) -- @echo "TestTime: 30m" >> $(METADATA) -- @echo "RunFor: $(PACKAGE)" >> $(METADATA) -- @echo "Requires: $(PACKAGE)" >> $(METADATA) -- @echo "Priority: Normal" >> $(METADATA) -- @echo "License: GPLv2" >> $(METADATA) -- @echo "Requires: library(kernel/base)" >> $(METADATA) -- @echo "Requires: nfs-utils" >> $(METADATA) -- @echo "Requires: bind-utils" >> $(METADATA) -- @echo "RhtsRequires: library(kernel/base)" >> $(METADATA) -- rhts-lint $(METADATA) -diff --git a/tests/export-mount-local/PURPOSE b/tests/export-mount-local/PURPOSE -deleted file mode 100644 -index 556df42..0000000 ---- a/tests/export-mount-local/PURPOSE -+++ /dev/null -@@ -1 +0,0 @@ --# nothing -diff --git a/tests/export-mount-local/_env b/tests/export-mount-local/_env -deleted file mode 100644 -index 90b8e90..0000000 ---- a/tests/export-mount-local/_env -+++ /dev/null -@@ -1,7 +0,0 @@ --export TOPLEVEL_NAMESPACE=nfs-utils --export PKG_NAMESPACE=nfs-utils --export RELATIVE_PATH=export-mount-local --export PACKAGE=nfs-utils --export PACKAGE_NAME=nfs-utils --export PKG_LIST=nfs-utils nfs-utils-lib libnfsidmap libsss_idmap libtirpc rpcbind --export TEST=/nfs-utils/export-mount-local -diff --git a/tests/export-mount-local/runtest.sh b/tests/export-mount-local/runtest.sh -deleted file mode 100755 -index eeb5dde..0000000 ---- a/tests/export-mount-local/runtest.sh -+++ /dev/null -@@ -1,343 +0,0 @@ --#!/bin/bash --# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k --# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --# Description: test for: export-mount-local --# Author: Jianhong Yin --# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --# --# Copyright (c) 2014 Red Hat, Inc. --# --# This copyrighted material is made available to anyone wishing --# to use, modify, copy, or redistribute it subject to the terms --# and conditions of the GNU General Public License version 2. --# --# This program is distributed in the hope that it will be --# useful, but WITHOUT ANY WARRANTY; without even the implied --# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --# PURPOSE. See the GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public --# License along with this program; if not, write to the Free --# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, --# Boston, MA 02110-1301, USA. --# --# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- --[ -e /usr/bin/rhts-environment.sh ] && . /usr/bin/rhts-environment.sh --. /usr/share/beakerlib/beakerlib.sh || exit 1 -- --# Load beakerlib you needed --rlImport kernel/base --envinfo --#disable_avc_check -- --#=============================================================================== -- --#signal trap --trap "cleanup" SIGINT SIGTERM SIGHUP SIGQUIT --cleanup() { -- rlFileRestore -- rm -rf $expdir $nfsmp --} -- --#global var define --BZ=exp-mount-local --expdir=/exportDir-$BZ --nfsmp=/mnt/nfsmp-$BZ --subexpdir=/exportDir-$BZ/sub --tmpnfsmp=${nfsmp}-tmp -- --read default_nic <<<$(getDefaultNic) --read ipv4 _nil <<<$(getDefaultIp) --read ipv6s _nil <<<$(getDefaultIp 6nfs) --ipv6="[$ipv6s]" --# in case "localhost.localdomain" --if echo "$HOSTNAME" | grep -q "localhost"; then -- ORIGINAL_HOSTNAME="$HOSTNAME" -- HOSTNAME="$BZ" -- hostnamectl set-hostname "$HOSTNAME" --fi --host="$HOSTNAME" -- --rlJournalStart -- rlPhaseStartSetup do-Setup- -- rlFileBackup /etc/{exports,auto.master} /etc/sysconfig/{nfs,autofs} /etc/nfs.conf /etc/hosts -- if [ -n "ORIGINAL_HOSTNAME" ]; then -- run "echo '$ipv4 $host' >> /etc/hosts" -- run "echo '$ipv6s $host' >> /etc/hosts" -- run "cat /etc/hosts" - -- fi -- run "rm -rf $expdir $nfsmp && mkdir -p $expdir $nfsmp" -- run "rm -rf $subexpdir $tmpnfsmp && mkdir -p $subexpdir $tmpnfsmp" -- run "service_nfs restart" -- run "ls_nfsvers" -- rlPhaseEnd -- -- for V in $(ls_nfsvers); do -- # export by IPv4 and try to mount it -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv4 -- run "exportfs -au && exportfs -iv $ipv4:$expdir -o ro,sync,no_root_squash" -- run "mount -o vers=$V $ipv4:$expdir $nfsmp" -- run "umount $nfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-ipv6-x -- if [ -n "$ipv6s" ]; then -- run "mount -o vers=$V $ipv6:$expdir $nfsmp" 1-255 -- [ $? = 0 ] && run "umount $nfsmp" -- fi -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv4-mount-host-bz876847 -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "umount $nfsmp" -- rlPhaseEnd -- -- if [ -n "$ipv6s" ]; then -- # export by IPv6 and try to mount it -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv6 -- run "exportfs -au && exportfs -iv $ipv6:$expdir -o ro,sync,no_root_squash" -- run "mount -o vers=$V $ipv6:$expdir $nfsmp" -- run "umount $nfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-ipv4-x -- run "mount -o vers=$V $ipv4:$expdir $nfsmp" 1-255 -- [ $? = 0 ] && run "umount $nfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-ipv6-mount-host -- run "dig -t aaaa $HOSTNAME +short" 0 "To get the IPv6 address" -- if [ -n "$ipv6s" ]; then -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "umount $nfsmp" -- fi -- rlPhaseEnd -- fi -- -- # export by hostname and try to mount it -- rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-host -- run "exportfs -au && exportfs -iv $host:$expdir -o ro,sync,no_root_squash" -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "umount $nfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv4 -- run "mount -o vers=$V $ipv4:$expdir $nfsmp" -- run "umount $nfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-host-mount-ipv6 -- run "dig -t aaaa $HOSTNAME +short" 0 "To get the IPv6 address" -- if [ -n "$ipv6s" ]; then -- run "mount -o vers=$V $ipv6:$expdir $nfsmp" -- run "umount $nfsmp" -- fi -- rlPhaseEnd -- -- # export sub-directory by IPv4 and try to mount it -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv4 -- run "echo '$expdir *(ro,sync,no_root_squash)' >/etc/exports" -- run "echo '$subexpdir $ipv4(ro,sync,no_root_squash)' >>/etc/exports" -- which systemctl >/dev/null 2>&1 && run "systemctl reset-failed" -- run "service_nfs restart" -- run "showmount -e" - -- run "mount -o vers=$V $ipv4:$expdir $nfsmp" -- run "mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-ipv6-x-bz1198900 -- if [ -n "$ipv6s" ]; then -- run "mount -o vers=$V $ipv6:$expdir $nfsmp" -- run "mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp" 1-255 "bz1198900 should not mount sub-directory with different ip" -- [ $? = 0 ] && run "umount $tmpnfsmp" -- run "umount $nfsmp" -- fi -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv4-mount-host -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "mount -o vers=$V $host:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- rlPhaseEnd -- -- if [ -n "$ipv6s" ]; then -- # export sub-directory by IPv6 and try to mount it -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv4-x-bz1198900 -- run "echo '$expdir *(ro,sync,no_root_squash)' >/etc/exports" -- run "echo '$subexpdir $ipv6s(ro,sync,no_root_squash)' >>/etc/exports" -- which systemctl >/dev/null 2>&1 && run "systemctl reset-failed" -- run "service_nfs restart" -- run "showmount -e" - -- run "mount -o vers=$V $ipv4:$expdir $nfsmp" -- run "mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp" 1-255 "bz1198900 should not mount sub-directory with different ip" -- [ $? = 0 ] && run "umount $tmpnfsmp" -- run "umount $nfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-ipv6 -- run "mount -o vers=$V $ipv6:$expdir $nfsmp" -- run "mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-ipv6-mount-host -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "mount -o vers=$V $host:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- rlPhaseEnd -- fi -- -- # export sub-directory by hostname and try to mount it -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv4 -- run "echo '$expdir *(ro,sync,no_root_squash)' >/etc/exports" -- run "echo '$subexpdir $host(ro,sync,no_root_squash)' >>/etc/exports" -- which systemctl >/dev/null 2>&1 && run "systemctl reset-failed" -- run "service_nfs restart" -- run "showmount -e" - -- run "mount -o vers=$V $ipv4:$expdir $nfsmp" -- run "mount -o vers=$V $ipv4:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-ipv6 -- if [ -n "$ipv6s" ]; then -- run "mount -o vers=$V $ipv6:$expdir $nfsmp" -- run "mount -o vers=$V $ipv6:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- fi -- rlPhaseEnd -- rlPhaseStartTest do-Test-nfsV$V-exp-sub-host-mount-host -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "mount -o vers=$V $host:$subexpdir $tmpnfsmp" -- run "umount $nfsmp $tmpnfsmp" -- rlPhaseEnd -- -- rlPhaseStartTest do-Test-nfsV$V-default-option-overridden-by-client-specific-option -- run "echo '$expdir -ro,sync *(rw,no_root_squash)' >/etc/exports" -- run "service_nfs restart" -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "exports option should be overridden by client specific." -- run "rm -rf $nfsmp/test*" -- run "umount $nfsmp" -- run "echo '$expdir -ro,sec=sys,sync *(rw,no_root_squash)' >/etc/exports" 0 "sec=sys may cause it to be failed." -- run "exportfs -rv" -- run "mount -o vers=$V $host:$expdir $nfsmp" -- run "touch $nfsmp/testfile && mkdir $nfsmp/testdir" 0 "bz1359042 exports option should be overridden by client specific." -- run "rm -rf $nfsmp/test*" -- run "umount $nfsmp" -- rlPhaseEnd -- done -- -- rlPhaseStartTest do-Test-bz1479135-server-side-using-bind-mount -- run "dd if=/dev/zero of=workspace.image bs=3M count=500" -- run "mkfs -t ext3 -F workspace.image" -- run "mkdir -p /workspace" -- run "mount -o loop workspace.image /workspace" -- run "mkdir -p /workspace/vmcore /srv/nfs/vmcore" -- run "touch /workspace/work_dir /workspace/vmcore/vmcore_dir" -- run "mount --bind /workspace/vmcore /srv/nfs/vmcore" -- run "echo '/srv/nfs/vmcore *(rw,no_root_squash)' > /etc/exports" -- run "echo '/workspace *(rw,no_root_squash)' >> /etc/exports" -- run "service_nfs restart" -- run "mount $host:/workspace $nfsmp" -- run "ls $nfsmp/work_dir" -- run "umount $nfsmp" -- run "exportfs -au" && run "service_nfs stop" -- run "umount /srv/nfs/vmcore" -- run "umount /workspace" -- run "rm -rf /workspace /srv/nfs/vmcore" -- run "rm workspace.image" -- rlPhaseEnd -- -- rlPhaseStartTest do-Test-bz1465259-mount-nfsv4-show-wrong-port -- run "echo '$expdir *(rw,no_root_squash)' > /etc/exports" -- run "service_nfs restart" -- run "exportfs -v" -- run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" -- run "cat /proc/mounts | grep $nfsmp" - -- run "cat /proc/mounts | grep $nfsmp | grep -q 'port='" 1 "Omit displaying 'port=' by default" -- run "mount -o remount,ro $nfsmp" -- run "cat /proc/mounts | grep $nfsmp" - -- run "cat /proc/mounts | grep $nfsmp | grep -q 'port='" 1 "Omit displaying 'port=' by default" -- run "umount $nfsmp" -- if [ -e "/etc/nfs.conf" ]; then -- echo "[nfsd]" > /etc/nfs.conf -- echo "port=20050" >> /etc/nfs.conf -- run "cat /etc/nfs.conf" - -- run "service_nfs restart" -- run "sleep 10" -- run "rpcinfo -p | grep -w nfs | grep 20050" -- run "mount -t nfs4 -o port=20050 localhost:$expdir $nfsmp" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "cat /proc/mounts | grep $nfsmp | grep -q port=20050" 0 "Should show port=20050" -- run "mount -o remount,ro $nfsmp" -- run "cat /proc/mounts | grep $nfsmp" - -- run "cat /proc/mounts | grep $nfsmp | grep -q port=20050" 0 "Should show port=20050" -- run "umount $nfsmp" -- fi -- log "{Info} If NFS service is not available on the specified port" -- run "mount -t nfs4 -o port=2049 localhost:$expdir $nfsmp" 1-255 -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- log "{Info} If port value is not specified" -- if ls_nfsvers | grep -q -w 3; then -- run "mount -t nfs -o vers=3 localhost:$expdir $nfsmp" 0 "for v2/v3 client uses port advertised by server's rpcbind service" -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- run "mount -t nfs -o vers=4 localhost:$expdir $nfsmp" 1-255 "for v4 client uses the standard NFS port (2049) without checking" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- log "{Info} If the specified port value is 0" -- run "mount -t nfs -o vers=4,port=0 localhost:$expdir $nfsmp" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "cat /proc/mounts | grep $nfsmp | grep -q port=0" 0 "Should show port=0" -- run "umount $nfsmp" -- fi -- run "echo '' > /etc/nfs.conf" 0 "Recovering" -- fi -- rlPhaseEnd -- -- if ls_nfsvers | grep -q -w "4.0"; then -- rlPhaseStartTest do-Test-bz1592915-sanity-check-clientaddr-during-mount -- run "echo '$expdir *(rw,no_root_squash)' > /etc/exports" -- run "service_nfs restart" -- run "exportfs -v" -- log "{Info} Mounting v4.0 by default" -- run "mount -o vers=4,minorversion=0 localhost:$expdir $nfsmp -v" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- log "{Info} Setting 'clientaddr=' not match any local address" -- # use normal mode (no verbose) to check the emitted warning -- run "mount -o vers=4,minorversion=0,clientaddr=1.2.3.4 localhost:$expdir $nfsmp &> >(tee stdout.log)" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- run "cat stdout.log | grep -q '[warning].*not match any existing network addresses'" 0 "Should warn the administrators" -- log "{Info} Specifying IPv4_ANY (0.0.0.0) signifying client does not want delegations" -- run "mount -o vers=4,minorversion=0,clientaddr=0.0.0.0 localhost:$expdir $nfsmp -v" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- log "{Info} Specifying IPv6_ANY (::0) signifying client does not want delegations" -- run "mount -o vers=4,minorversion=0,clientaddr=::0 localhost:$expdir $nfsmp -v" -- if [ $? -eq 0 ]; then -- run "cat /proc/mounts | grep $nfsmp" - -- run "umount $nfsmp" -- fi -- rlPhaseEnd -- fi -- -- rlPhaseStartCleanup do-Cleanup- -- run "rm -rf $expdir $nfsmp $subexpdir $tmpnfsmp" -- rlFileRestore -- run "service_nfs restart" -- if [ -n "ORIGINAL_HOSTNAME" ]; then -- HOSTNAME="$ORIGINAL_HOSTNAME" -- hostnamectl set-hostname "$HOSTNAME" -- fi -- rlPhaseEnd --rlJournalEnd --#rlJournalPrintText --#enable_avc_check -diff --git a/tests/export-mount-local/subtest.yml b/tests/export-mount-local/subtest.yml -deleted file mode 100644 -index 1a77920..0000000 ---- a/tests/export-mount-local/subtest.yml -+++ /dev/null -@@ -1 +0,0 @@ --attr: {ssched: yes} -diff --git a/tests/tests.yml b/tests/tests.yml -index 865464b..e8d6ecb 100644 ---- a/tests/tests.yml -+++ b/tests/tests.yml -@@ -8,13 +8,11 @@ - - classic - tests: - - exportfs -- - export-mount-local - - mount - - nfs-mount-options-all - - systemd-nfs - - umount - required_packages: -- - bind-utils # export-mount-local needs this package - - findutils # beakerlib needs find command - - iptables # nfs-mount-options-all needs this package - - nfs-utils - diff --git a/SOURCES/nfs-utils-2.3.3-gssd-early-daemon.patch b/SOURCES/nfs-utils-2.3.3-gssd-early-daemon.patch new file mode 100644 index 0000000..1935daf --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-gssd-early-daemon.patch @@ -0,0 +1,17 @@ +diff -up nfs-utils-2.3.3/utils/gssd/gssd.c.orig nfs-utils-2.3.3/utils/gssd/gssd.c +--- nfs-utils-2.3.3/utils/gssd/gssd.c.orig 2019-11-11 09:23:28.920435729 -0500 ++++ nfs-utils-2.3.3/utils/gssd/gssd.c 2019-11-26 13:59:52.812685585 -0500 +@@ -1020,11 +1020,11 @@ main(int argc, char *argv[]) + "support setting debug levels\n"); + #endif + ++ daemon_init(fg); ++ + if (gssd_check_mechs() != 0) + errx(1, "Problem with gssapi library"); + +- daemon_init(fg); +- + event_init(); + + pipefs_dir = opendir(pipefs_path); diff --git a/SOURCES/nfs-utils-2.3.3-gssd-man-verbose.patch b/SOURCES/nfs-utils-2.3.3-gssd-man-verbose.patch new file mode 100644 index 0000000..7624169 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-gssd-man-verbose.patch @@ -0,0 +1,29 @@ +commit 52db5259fe78c2b948df279b697412f99e12f229 +Author: Yongcheng Yang +Date: Fri Aug 23 14:06:42 2019 -0400 + + gssd: add configure options verbosity to man page rpc.gssd(8) + + Signed-off-by: Pierguido Lambri + Signed-off-by: Yongcheng Yang + Signed-off-by: Steve Dickson + +diff --git a/utils/gssd/gssd.man b/utils/gssd/gssd.man +index e620f0d1..cc3a210a 100644 +--- a/utils/gssd/gssd.man ++++ b/utils/gssd/gssd.man +@@ -305,6 +305,14 @@ section of the + .I /etc/nfs.conf + configuration file. Values recognized include: + .TP ++.B verbosity ++Value which is equivalent to the number of ++.BR -v . ++.TP ++.B rpc-verbosity ++Value which is equivalent to the number of ++.BR -r . ++.TP + .B use-memcache + A Boolean flag equivalent to + .BR -M . diff --git a/SOURCES/nfs-utils-2.3.3-gssd-verbose.patch b/SOURCES/nfs-utils-2.3.3-gssd-verbose.patch new file mode 100644 index 0000000..2618ef2 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-gssd-verbose.patch @@ -0,0 +1,52 @@ +commit 64d83364b08ab32c6b8fee903529314349175772 +Author: Pierguido Lambri +Date: Mon Mar 11 13:50:57 2019 -0400 + + gssd: add verbosity options to the rpc.gssd man page + + It also adds the commented out entries in the nfs.conf + default file. + + Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1668026 + + Signed-off-by: Pierguido Lambri + Signed-off-by: Steve Dickson + +diff -up nfs-utils-2.3.3/nfs.conf.orig nfs-utils-2.3.3/nfs.conf +--- nfs-utils-2.3.3/nfs.conf.orig 2019-03-19 11:04:16.903567972 -0400 ++++ nfs-utils-2.3.3/nfs.conf 2019-03-19 11:10:54.452251970 -0400 +@@ -9,6 +9,8 @@ + # debug=0 + # + [gssd] ++# verbosity=0 ++# rpc-verbosity=0 + # use-memcache=0 + # use-machine-creds=1 + use-gss-proxy=1 +diff -up nfs-utils-2.3.3/systemd/nfs.conf.man.orig nfs-utils-2.3.3/systemd/nfs.conf.man +--- nfs-utils-2.3.3/systemd/nfs.conf.man.orig 2019-03-19 11:04:16.911567926 -0400 ++++ nfs-utils-2.3.3/systemd/nfs.conf.man 2019-03-19 11:10:54.452251970 -0400 +@@ -211,6 +211,8 @@ for details. + .TP + .B gssd + Recognized values: ++.BR verbosity , ++.BR rpc-verbosity , + .BR use-memcache , + .BR use-machine-creds , + .BR use-gss-proxy , +diff -up nfs-utils-2.3.3/utils/gssd/gssd.c.orig nfs-utils-2.3.3/utils/gssd/gssd.c +--- nfs-utils-2.3.3/utils/gssd/gssd.c.orig 2019-03-19 11:04:16.893568031 -0400 ++++ nfs-utils-2.3.3/utils/gssd/gssd.c 2019-03-19 11:10:54.453251964 -0400 +@@ -890,8 +890,8 @@ main(int argc, char *argv[]) + + read_gss_conf(); + +- verbosity = conf_get_num("gssd", "Verbosity", verbosity); +- rpc_verbosity = conf_get_num("gssd", "RPC-Verbosity", rpc_verbosity); ++ verbosity = conf_get_num("gssd", "verbosity", verbosity); ++ rpc_verbosity = conf_get_num("gssd", "rpc-verbosity", rpc_verbosity); + + while ((opt = getopt(argc, argv, "DfvrlmnMp:k:d:t:T:R:")) != -1) { + switch (opt) { diff --git a/SOURCES/nfs-utils-2.3.3-lseek-error-handling.patch b/SOURCES/nfs-utils-2.3.3-lseek-error-handling.patch new file mode 100644 index 0000000..af76564 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-lseek-error-handling.patch @@ -0,0 +1,49 @@ +From fd2e952319c748e1c7babb1db97b371ebf6748a9 Mon Sep 17 00:00:00 2001 +From: Alice J Mitchell +Date: Mon, 29 Jul 2019 15:47:40 +0100 +Subject: [PATCH] Fix the error handling if the lseek fails + +The error case when lseek returns a negative value was not correctly handled, +and the error cleanup routine was potentially leaking memory also. + +Signed-off-by: Alice J Mitchell +--- + support/nfs/conffile.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c +index b6400be..6ba8a35 100644 +--- a/support/nfs/conffile.c ++++ b/support/nfs/conffile.c +@@ -500,7 +500,7 @@ conf_readfile(const char *path) + + if ((stat (path, &sb) == 0) || (errno != ENOENT)) { + char *new_conf_addr = NULL; +- size_t sz = sb.st_size; ++ off_t sz; + int fd = open (path, O_RDONLY, 0); + + if (fd == -1) { +@@ -517,6 +517,11 @@ conf_readfile(const char *path) + + /* only after we have the lock, check the file size ready to read it */ + sz = lseek(fd, 0, SEEK_END); ++ if (sz < 0) { ++ xlog_warn("conf_readfile: unable to determine file size: %s", ++ strerror(errno)); ++ goto fail; ++ } + lseek(fd, 0, SEEK_SET); + + new_conf_addr = malloc(sz+1); +@@ -2162,6 +2167,7 @@ conf_write(const char *filename, const char *section, const char *arg, + ret = 0; + + cleanup: ++ flush_outqueue(&inqueue, NULL); + flush_outqueue(&outqueue, NULL); + + if (buff) +-- +1.8.3.1 + diff --git a/SOURCES/nfs-utils-2.3.3-memleak-on-error.patch b/SOURCES/nfs-utils-2.3.3-memleak-on-error.patch new file mode 100644 index 0000000..e9bf332 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-memleak-on-error.patch @@ -0,0 +1,37 @@ +From ccdd8c803182f5c172580379a56e84a23789cf0d Mon Sep 17 00:00:00 2001 +From: Alice J Mitchell +Date: Mon, 29 Jul 2019 15:49:34 +0100 +Subject: [PATCH] Fix memory leak on error in nfs-server-generator + +Fix the trivial memory leak in the error handling of nfs-server-generator + +Resolves: bz1440524 +Signed-off-by: Alice J Mitchell +--- + systemd/nfs-server-generator.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/systemd/nfs-server-generator.c b/systemd/nfs-server-generator.c +index 737f109..eec98fd 100644 +--- a/systemd/nfs-server-generator.c ++++ b/systemd/nfs-server-generator.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + #include "misc.h" + #include "nfslib.h" +@@ -98,7 +99,7 @@ int main(int argc, char *argv[]) + exit(1); + } + +- path = malloc(strlen(argv[1]) + sizeof(dirbase) + sizeof(filebase)); ++ path = alloca(strlen(argv[1]) + sizeof(dirbase) + sizeof(filebase)); + if (!path) + exit(2); + if (export_read(_PATH_EXPORTS, 1) + +-- +1.8.3.1 + diff --git a/SOURCES/nfs-utils-2.3.3-mount-fallback.patch b/SOURCES/nfs-utils-2.3.3-mount-fallback.patch new file mode 100644 index 0000000..68c72ae --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-mount-fallback.patch @@ -0,0 +1,48 @@ +commit a709f25c1da4a2fb44a1f3fd060298fbbd88aa3c +Author: Steve Dickson +Date: Tue May 14 15:52:50 2019 -0400 + + mount: Report correct error in the fall_back cases. + + In mount auto negotiation, a v3 mount is tried + when the v4 fails with error that could mean + v4 is not supported. + + When the v3 mount fails, the original v4 failure + should be used to set the errno, not the v3 failure. + + Fixes:https://bugzilla.redhat.com/show_bug.cgi?id=1709961 + Signed-off-by: Steve Dickson + +diff -up nfs-utils-2.3.3/utils/mount/stropts.c.orig nfs-utils-2.3.3/utils/mount/stropts.c +--- nfs-utils-2.3.3/utils/mount/stropts.c.orig 2019-08-12 10:58:32.610650773 -0400 ++++ nfs-utils-2.3.3/utils/mount/stropts.c 2019-08-12 11:10:39.661142985 -0400 +@@ -888,7 +888,7 @@ out: + */ + static int nfs_autonegotiate(struct nfsmount_info *mi) + { +- int result; ++ int result, olderrno; + + result = nfs_try_mount_v4(mi); + check_result: +@@ -948,7 +948,18 @@ fall_back: + if (mi->version.v_mode == V_GENERAL) + /* v2,3 fallback not allowed */ + return result; +- return nfs_try_mount_v3v2(mi, FALSE); ++ ++ /* ++ * Save the original errno in case the v3 ++ * mount fails from one of the fall_back cases. ++ * Report the first failure not the v3 mount failure ++ */ ++ olderrno = errno; ++ if ((result = nfs_try_mount_v3v2(mi, FALSE))) ++ return result; ++ ++ errno = olderrno; ++ return result; + } + + /* diff --git a/SOURCES/nfs-utils-2.3.3-mountd-memleak.patch b/SOURCES/nfs-utils-2.3.3-mountd-memleak.patch new file mode 100644 index 0000000..d52d063 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-mountd-memleak.patch @@ -0,0 +1,77 @@ +commit 50ef80739d9e1e0df6616289ef2ff626a94666ee +Author: Steve Dickson +Date: Thu May 23 09:24:49 2019 -0400 + + rpc.mountd: Fix e_hostname and e_uuid leaks + + strdup of exportent uuid and hostname in getexportent() ends up leaking + memory. Free the memory before getexportent() is called again from xtab_read() + + Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1713360 + Signed-off-by: Nikhil Kshirsagar + Signed-off-by: Steve Dickson + +diff --git a/support/export/xtab.c b/support/export/xtab.c +index d42eeef..1e1d679 100644 +--- a/support/export/xtab.c ++++ b/support/export/xtab.c +@@ -50,6 +50,14 @@ xtab_read(char *xtab, char *lockfn, int is_export) + while ((xp = getexportent(is_export==0, 0)) != NULL) { + if (!(exp = export_lookup(xp->e_hostname, xp->e_path, is_export != 1)) && + !(exp = export_create(xp, is_export!=1))) { ++ if(xp->e_hostname) { ++ free(xp->e_hostname); ++ xp->e_hostname=NULL; ++ } ++ if(xp->e_uuid) { ++ free(xp->e_uuid); ++ xp->e_uuid=NULL; ++ } + continue; + } + switch (is_export) { +@@ -62,7 +70,16 @@ xtab_read(char *xtab, char *lockfn, int is_export) + if ((xp->e_flags & NFSEXP_FSID) && xp->e_fsid == 0) + v4root_needed = 0; + break; +- } ++ } ++ if(xp->e_hostname) { ++ free(xp->e_hostname); ++ xp->e_hostname=NULL; ++ } ++ if(xp->e_uuid) { ++ free(xp->e_uuid); ++ xp->e_uuid=NULL; ++ } ++ + } + endexportent(); + xfunlock(lockid); +diff --git a/support/nfs/exports.c b/support/nfs/exports.c +index 5f4cb95..a7582ca 100644 +--- a/support/nfs/exports.c ++++ b/support/nfs/exports.c +@@ -179,9 +179,20 @@ getexportent(int fromkernel, int fromexports) + } + ee.e_hostname = xstrdup(hostname); + +- if (parseopts(opt, &ee, fromexports && !has_default_subtree_opts, NULL) < 0) +- return NULL; ++ if (parseopts(opt, &ee, fromexports && !has_default_subtree_opts, NULL) < 0) { ++ if(ee.e_hostname) ++ { ++ xfree(ee.e_hostname); ++ ee.e_hostname=NULL; ++ } ++ if(ee.e_uuid) ++ { ++ xfree(ee.e_uuid); ++ ee.e_uuid=NULL; ++ } + ++ return NULL; ++ } + /* resolve symlinks */ + if (realpath(ee.e_path, rpath) != NULL) { + rpath[sizeof (rpath) - 1] = '\0'; diff --git a/SOURCES/nfs-utils-2.3.3-nfsconf-inplace.patch b/SOURCES/nfs-utils-2.3.3-nfsconf-inplace.patch new file mode 100644 index 0000000..155925d --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsconf-inplace.patch @@ -0,0 +1,276 @@ +diff -up nfs-utils-2.3.3/support/nfs/conffile.c.orig nfs-utils-2.3.3/support/nfs/conffile.c +--- nfs-utils-2.3.3/support/nfs/conffile.c.orig 2018-09-06 14:09:08.000000000 -0400 ++++ nfs-utils-2.3.3/support/nfs/conffile.c 2019-04-25 10:58:27.199907596 -0400 +@@ -50,6 +50,7 @@ + #include + #include + #include ++#include + + #include "conffile.h" + #include "xlog.h" +@@ -509,6 +510,17 @@ conf_readfile(const char *path) + return NULL; + } + ++ /* Grab a shared lock to ensure its not mid-rewrite */ ++ if (flock(fd, LOCK_SH)) { ++ xlog_warn("conf_readfile: attempt to grab read lock failed: %s", ++ strerror(errno)); ++ goto fail; ++ } ++ ++ /* only after we have the lock, check the file size ready to read it */ ++ sz = lseek(fd, 0, SEEK_END); ++ lseek(fd, 0, SEEK_SET); ++ + new_conf_addr = malloc(sz+1); + if (!new_conf_addr) { + xlog_warn("conf_readfile: malloc (%lu) failed", (unsigned long)sz); +@@ -1588,6 +1600,17 @@ flush_outqueue(struct tailhead *queue, F + return 0; + } + ++/* append one queue to another */ ++static void ++append_queue(struct tailhead *inq, struct tailhead *outq) ++{ ++ while (inq->tqh_first != NULL) { ++ struct outbuffer *ob = inq->tqh_first; ++ TAILQ_REMOVE(inq, ob, link); ++ TAILQ_INSERT_TAIL(outq, ob, link); ++ } ++} ++ + /* read one line of text from a file, growing the buffer as necessary */ + static int + read_line(char **buff, int *buffsize, FILE *in) +@@ -1728,6 +1751,16 @@ is_folded(const char *line) + return false; + } + ++static int ++lock_file(FILE *f) ++{ ++ int ret; ++ ret = flock(fileno(f), LOCK_EX); ++ if (ret) ++ xlog(L_ERROR, "Error could not lock the file"); ++ return ret; ++} ++ + /*** + * Write a value to an nfs.conf style filename + * +@@ -1738,15 +1771,14 @@ int + conf_write(const char *filename, const char *section, const char *arg, + const char *tag, const char *value) + { +- int fdout = -1; +- char *outpath = NULL; +- FILE *outfile = NULL; + FILE *infile = NULL; + int ret = 1; + struct tailhead outqueue; ++ struct tailhead inqueue; + char * buff = NULL; + int buffsize = 0; + ++ TAILQ_INIT(&inqueue); + TAILQ_INIT(&outqueue); + + if (!filename) { +@@ -1759,26 +1791,7 @@ conf_write(const char *filename, const c + return ret; + } + +- if (asprintf(&outpath, "%s.XXXXXX", filename) == -1) { +- xlog(L_ERROR, "conf_write: error composing temp filename"); +- return ret; +- } +- +- fdout = mkstemp(outpath); +- if (fdout < 0) { +- xlog(L_ERROR, "conf_write: open temp file %s failed: %s", +- outpath, strerror(errno)); +- goto cleanup; +- } +- +- outfile = fdopen(fdout, "w"); +- if (!outfile) { +- xlog(L_ERROR, "conf_write: fdopen temp file failed: %s", +- strerror(errno)); +- goto cleanup; +- } +- +- infile = fopen(filename, "r"); ++ infile = fopen(filename, "r+"); + if (!infile) { + if (!value) { + xlog_warn("conf_write: config file \"%s\" not found, nothing to do", filename); +@@ -1787,18 +1800,29 @@ conf_write(const char *filename, const c + } + + xlog_warn("conf_write: config file \"%s\" not found, creating.", filename); +- if (append_line(&outqueue, NULL, make_section(section, arg))) ++ infile = fopen(filename, "wx"); ++ if (!infile) { ++ xlog(L_ERROR, "conf_write: Error creating config file \"%s\".", filename); ++ goto cleanup; ++ } ++ ++ if (lock_file(infile)) + goto cleanup; + +- if (append_line(&outqueue, NULL, make_tagline(tag, value))) ++ if (append_line(&inqueue, NULL, make_section(section, arg))) + goto cleanup; + +- if (flush_outqueue(&outqueue, outfile)) ++ if (append_line(&inqueue, NULL, make_tagline(tag, value))) + goto cleanup; ++ ++ append_queue(&inqueue, &outqueue); + } else { + bool found = false; + int err = 0; + ++ if (lock_file(infile)) ++ goto cleanup; ++ + buffsize = 4096; + buff = calloc(1, buffsize); + if (buff == NULL) { +@@ -1813,7 +1837,7 @@ conf_write(const char *filename, const c + /* read in one section worth of lines */ + do { + if (*buff != '\0') { +- if (append_line(&outqueue, NULL, strdup(buff))) ++ if (append_line(&inqueue, NULL, strdup(buff))) + goto cleanup; + } + +@@ -1821,7 +1845,7 @@ conf_write(const char *filename, const c + } while (err == 0 && buff[0] != '['); + + /* find the section header */ +- where = TAILQ_FIRST(&outqueue); ++ where = TAILQ_FIRST(&inqueue); + while (where != NULL) { + if (where->text != NULL && where->text[0] == '[') + break; +@@ -1845,7 +1869,7 @@ conf_write(const char *filename, const c + /* remove current tag */ + do { + struct outbuffer *next = TAILQ_NEXT(where, link); +- TAILQ_REMOVE(&outqueue, where, link); ++ TAILQ_REMOVE(&inqueue, where, link); + if (is_folded(where->text)) + again = true; + else +@@ -1857,14 +1881,14 @@ conf_write(const char *filename, const c + + /* insert new tag */ + if (value) { +- if (append_line(&outqueue, prev, make_tagline(tag, value))) ++ if (append_line(&inqueue, prev, make_tagline(tag, value))) + goto cleanup; + } + } else + /* no existing assignment found and we need to add one */ + if (value) { + /* rewind past blank lines and comments */ +- struct outbuffer *tail = TAILQ_LAST(&outqueue, tailhead); ++ struct outbuffer *tail = TAILQ_LAST(&inqueue, tailhead); + + /* comments immediately before a section usually relate + * to the section below them */ +@@ -1876,7 +1900,7 @@ conf_write(const char *filename, const c + tail = TAILQ_PREV(tail, tailhead, link); + + /* now add the tag here */ +- if (append_line(&outqueue, tail, make_tagline(tag, value))) ++ if (append_line(&inqueue, tail, make_tagline(tag, value))) + goto cleanup; + + found = true; +@@ -1886,49 +1910,45 @@ conf_write(const char *filename, const c + /* EOF and correct section not found, so add one */ + if (err && !found && value) { + /* did the last section end in a blank line */ +- struct outbuffer *tail = TAILQ_LAST(&outqueue, tailhead); ++ struct outbuffer *tail = TAILQ_LAST(&inqueue, tailhead); + if (tail && !is_empty(tail->text)) { + /* no, so add one for clarity */ +- if (append_line(&outqueue, NULL, strdup("\n"))) ++ if (append_line(&inqueue, NULL, strdup("\n"))) + goto cleanup; + } + + /* add the new section header */ +- if (append_line(&outqueue, NULL, make_section(section, arg))) ++ if (append_line(&inqueue, NULL, make_section(section, arg))) + goto cleanup; + + /* now add the tag */ +- if (append_line(&outqueue, NULL, make_tagline(tag, value))) ++ if (append_line(&inqueue, NULL, make_tagline(tag, value))) + goto cleanup; + } + +- /* we are done with this section, write it out */ +- if (flush_outqueue(&outqueue, outfile)) +- goto cleanup; ++ /* we are done with this section, move it to the out queue */ ++ append_queue(&inqueue, &outqueue); + } while(err == 0); + } + +- if (infile) { +- fclose(infile); +- infile = NULL; +- } ++ /* now rewind and overwrite the file with the updated data */ ++ rewind(infile); + +- fdout = -1; +- if (fclose(outfile)) { +- xlog(L_ERROR, "Error writing config file: %s", strerror(errno)); ++ if (ftruncate(fileno(infile), 0)) { ++ xlog(L_ERROR, "Error truncating config file"); + goto cleanup; + } + +- /* now swap the old file for the new one */ +- if (rename(outpath, filename)) { +- xlog(L_ERROR, "Error updating config file: %s: %s\n", filename, strerror(errno)); +- ret = 1; +- } else { +- ret = 0; +- free(outpath); +- outpath = NULL; ++ if (flush_outqueue(&outqueue, infile)) ++ goto cleanup; ++ ++ if (infile) { ++ fclose(infile); ++ infile = NULL; + } + ++ ret = 0; ++ + cleanup: + flush_outqueue(&outqueue, NULL); + +@@ -1936,11 +1956,5 @@ cleanup: + free(buff); + if (infile) + fclose(infile); +- if (fdout != -1) +- close(fdout); +- if (outpath) { +- unlink(outpath); +- free(outpath); +- } + return ret; + } diff --git a/SOURCES/nfs-utils-2.3.3-nfsconf-manage-gids.patch b/SOURCES/nfs-utils-2.3.3-nfsconf-manage-gids.patch new file mode 100644 index 0000000..43de59a --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsconf-manage-gids.patch @@ -0,0 +1,23 @@ +commit 268e3c0cff6d6aee3b8f5458545f8dab76d7d444 +Author: Steve Dickson +Date: Mon Feb 4 15:17:42 2019 -0500 + + nfs.conf: Fixed manage-gids option typo + + Reported-by: Adam DiFrischia + BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=333 + Signed-off-by: Steve Dickson + +diff --git a/nfs.conf b/nfs.conf +index 796bee4..722b024 100644 +--- a/nfs.conf ++++ b/nfs.conf +@@ -26,7 +26,7 @@ + # + [mountd] + # debug=0 +-# manage_gids=n ++# manage-gids=n + # descriptors=0 + # port=0 + # threads=1 diff --git a/SOURCES/nfs-utils-2.3.3-nfsconf-rdmaport.patch b/SOURCES/nfs-utils-2.3.3-nfsconf-rdmaport.patch new file mode 100644 index 0000000..334d286 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsconf-rdmaport.patch @@ -0,0 +1,73 @@ +commit 0240df0e8ccf7be2706a6a10a2a620f8eda55275 +Author: Yongcheng Yang +Date: Thu Sep 5 07:36:26 2019 -0400 + + nfsd: Adjust nfs.conf setting/parsing of rdma port + + The rpc.nfsd program can use option "--rdma" to enable + RDMA on the standard port (nfsrdma/20049) or "--rdma=port" + for an alternate port. + + But now in /etc/nfs.conf, we need to specify the port + number (e.g. rdma=nfsrdma) to enable it, which is not + convenient. + The default setting "rdma=n" may cause more confusion. + + Update to enable RDMA on standard port when setting + boolean YES to "rdma=". And using "rdma-port=" for an + alternate port if necessary. + + Also let previous config (e.g. rdma=nfsrdma) work as well. + + Signed-off-by: Yongcheng Yang + Signed-off-by: Steve Dickson + +diff --git a/nfs.conf b/nfs.conf +index 85097fd..186a5b1 100644 +--- a/nfs.conf ++++ b/nfs.conf +@@ -63,6 +63,7 @@ + # vers4.1=y + # vers4.2=y + # rdma=n ++# rdma-port=20049 + # + [statd] + # debug=0 +diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c +index b256bd9..a412a02 100644 +--- a/utils/nfsd/nfsd.c ++++ b/utils/nfsd/nfsd.c +@@ -92,7 +92,14 @@ main(int argc, char **argv) + port = conf_get_str("nfsd", "port"); + if (!port) + port = "nfs"; +- rdma_port = conf_get_str("nfsd", "rdma"); ++ if (conf_get_bool("nfsd", "rdma", false)) { ++ rdma_port = conf_get_str("nfsd", "rdma-port"); ++ if (!rdma_port) ++ rdma_port = "nfsrdma"; ++ } ++ /* backward compatibility - nfs.conf used to set rdma port directly */ ++ if (!rdma_port) ++ rdma_port = conf_get_str("nfsd", "rdma"); + if (conf_get_bool("nfsd", "udp", NFSCTL_UDPISSET(protobits))) + NFSCTL_UDPSET(protobits); + else +diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man +index d83ef86..2701ba7 100644 +--- a/utils/nfsd/nfsd.man ++++ b/utils/nfsd/nfsd.man +@@ -144,7 +144,11 @@ The lease time for NFSv4, in seconds. + Set the port for TCP/UDP to bind to. + .TP + .B rdma +-Set RDMA port. Use "rdma=nfsrdma" to enable standard port. ++Enable RDMA port (with "on" or "yes" etc) on the standard port ++("nfsrdma", port 20049). ++.TP ++.B rdma-port ++Set an alternate RDMA port. + .TP + .B UDP + Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support. diff --git a/SOURCES/nfs-utils-2.3.3-nfsiostat-err-cnts.patch b/SOURCES/nfs-utils-2.3.3-nfsiostat-err-cnts.patch new file mode 100644 index 0000000..5fadb28 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsiostat-err-cnts.patch @@ -0,0 +1,159 @@ +diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py +index 48ef0964..bda9af67 100755 +--- a/tools/mountstats/mountstats.py ++++ b/tools/mountstats/mountstats.py +@@ -308,6 +308,8 @@ class DeviceData: + op = words[0][:-1] + self.__rpc_data['ops'] += [op] + self.__rpc_data[op] = [int(word) for word in words[1:]] ++ if len(self.__rpc_data[op]) < 9: ++ self.__rpc_data[op] += [0] + + def parse_stats(self, lines): + """Turn a list of lines from a mount stat file into a +@@ -475,7 +477,9 @@ class DeviceData: + retrans = stats[2] - count + if retrans != 0: + print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)), end=' ') +- print('\t%d major timeouts' % stats[3]) ++ print('\t%d major timeouts' % stats[3], end='') ++ if len(stats) >= 10 and stats[9] != 0: ++ print('\t%d errors (%d%%)' % (stats[9], ((stats[9] * 100) / count))) + else: + print('') + print('\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \ +@@ -580,7 +584,7 @@ class DeviceData: + self.__nfs_data['fstype'] = 'nfs4' + self.__rpc_data['ops'] = ops + for op in ops: +- self.__rpc_data[op] = [0 for i in range(8)] ++ self.__rpc_data[op] = [0 for i in range(9)] + + def accumulate_iostats(self, new_stats): + """Accumulate counters from all RPC op buckets in new_stats. This is +@@ -605,6 +609,8 @@ class DeviceData: + queued_for = float(rpc_stats[5]) + rtt = float(rpc_stats[6]) + exe = float(rpc_stats[7]) ++ if len(rpc_stats) >= 9: ++ errs = int(rpc_stats[8]) + + # prevent floating point exceptions + if ops != 0: +@@ -613,12 +619,15 @@ class DeviceData: + rtt_per_op = rtt / ops + exe_per_op = exe / ops + queued_for_per_op = queued_for / ops ++ if len(rpc_stats) >= 9: ++ errs_percent = (errs * 100) / ops + else: + kb_per_op = 0.0 + retrans_percent = 0.0 + rtt_per_op = 0.0 + exe_per_op = 0.0 + queued_for_per_op = 0.0 ++ errs_percent = 0.0 + + op += ':' + print(format(op.lower(), '<16s'), end='') +@@ -628,7 +637,10 @@ class DeviceData: + print(format('retrans', '>16s'), end='') + print(format('avg RTT (ms)', '>16s'), end='') + print(format('avg exe (ms)', '>16s'), end='') +- print(format('avg queue (ms)', '>16s')) ++ print(format('avg queue (ms)', '>16s'), end='') ++ if len(rpc_stats) >= 9: ++ print(format('errors', '>16s'), end='') ++ print() + + print(format((ops / sample_time), '>24.3f'), end='') + print(format((kilobytes / sample_time), '>16.3f'), end='') +@@ -637,7 +649,11 @@ class DeviceData: + print(format(retransmits, '>16'), end='') + print(format(rtt_per_op, '>16.3f'), end='') + print(format(exe_per_op, '>16.3f'), end='') +- print(format(queued_for_per_op, '>16.3f')) ++ print(format(queued_for_per_op, '>16.3f'), end='') ++ if len(rpc_stats) >= 9: ++ errors = '{0:>10.0f} ({1:>3.1f}%)'.format(errs, errs_percent).strip() ++ print(format(errors, '>16'), end='') ++ print() + + def display_iostats(self, sample_time): + """Display NFS and RPC stats in an iostat-like way +diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py +old mode 100644 +new mode 100755 +index f1556fb7..5b2260ad +--- a/tools/nfs-iostat/nfs-iostat.py ++++ b/tools/nfs-iostat/nfs-iostat.py +@@ -329,6 +329,8 @@ class DeviceData: + queued_for = float(rpc_stats[5]) + rtt = float(rpc_stats[6]) + exe = float(rpc_stats[7]) ++ if len(rpc_stats) >= 9: ++ errs = float(rpc_stats[8]) + + # prevent floating point exceptions + if ops != 0: +@@ -337,12 +339,16 @@ class DeviceData: + rtt_per_op = rtt / ops + exe_per_op = exe / ops + queued_for_per_op = queued_for / ops ++ if len(rpc_stats) >= 9: ++ errs_percent = (errs * 100) / ops + else: + kb_per_op = 0.0 + retrans_percent = 0.0 + rtt_per_op = 0.0 + exe_per_op = 0.0 + queued_for_per_op = 0.0 ++ if len(rpc_stats) >= 9: ++ errs_percent = 0.0 + + op += ':' + print(format(op.lower(), '<16s'), end='') +@@ -352,7 +358,10 @@ class DeviceData: + print(format('retrans', '>16s'), end='') + print(format('avg RTT (ms)', '>16s'), end='') + print(format('avg exe (ms)', '>16s'), end='') +- print(format('avg queue (ms)', '>16s')) ++ print(format('avg queue (ms)', '>16s'), end='') ++ if len(rpc_stats) >= 9: ++ print(format('errors', '>16s'), end='') ++ print() + + print(format((ops / sample_time), '>24.3f'), end='') + print(format((kilobytes / sample_time), '>16.3f'), end='') +@@ -361,7 +370,11 @@ class DeviceData: + print(format(retransmits, '>16'), end='') + print(format(rtt_per_op, '>16.3f'), end='') + print(format(exe_per_op, '>16.3f'), end='') +- print(format(queued_for_per_op, '>16.3f')) ++ print(format(queued_for_per_op, '>16.3f'), end='') ++ if len(rpc_stats) >= 9: ++ errors = '{0:>10.0f} ({1:>3.1f}%)'.format(errs, errs_percent).strip() ++ print(format(errors, '>16'), end='') ++ print() + + def ops(self, sample_time): + sends = float(self.__rpc_data['rpcsends']) +diff --git a/tools/nfs-iostat/nfsiostat.man b/tools/nfs-iostat/nfsiostat.man +index 9ae94c5f..940c0431 100644 +--- a/tools/nfs-iostat/nfsiostat.man ++++ b/tools/nfs-iostat/nfsiostat.man +@@ -97,6 +97,14 @@ This is the duration from the time the NFS client created the RPC request task t + .RE + .RE + .RE ++.RS 8 ++- \fBerrors\fR ++.RS ++This is the number of operations that completed with an error status (status < 0). This count is only available on kernels with RPC iostats version 1.1 or above. ++.RS ++.RE ++.RE ++.RE + .TP + Note that if an interval is used as argument to \fBnfsiostat\fR, then the diffrence from previous interval will be displayed, otherwise the results will be from the time that the share was mounted. + diff --git a/SOURCES/nfs-utils-2.3.3-nfsman-typo.patch b/SOURCES/nfs-utils-2.3.3-nfsman-typo.patch new file mode 100644 index 0000000..467b2c4 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-nfsman-typo.patch @@ -0,0 +1,22 @@ +commit 2b78802c4eda6f74b77330832c54fd6b59991adf +Author: Josef Radinger +Date: Wed Jul 24 10:59:51 2019 -0400 + + nfs.man: Fixed small typo in man page + + Fixes: https://bugzilla.linux-nfs.org/show_bug.cgi?id=337 + Signed-off-by: Steve Dickson + +diff --git a/utils/mount/nfs.man b/utils/mount/nfs.man +index 9ee9bd9..6ba9cef 100644 +--- a/utils/mount/nfs.man ++++ b/utils/mount/nfs.man +@@ -1252,7 +1252,7 @@ If absolute cache coherence among clients is required, + applications should use file locking. Alternatively, applications + can also open their files with the O_DIRECT flag + to disable data caching entirely. +-.SS "File timestamp maintainence" ++.SS "File timestamp maintenance" + NFS servers are responsible for managing file and directory timestamps + .RB ( atime , + .BR ctime ", and" diff --git a/SOURCES/nfs-utils-2.3.3-statd-force.patch b/SOURCES/nfs-utils-2.3.3-statd-force.patch new file mode 100644 index 0000000..bd335f2 --- /dev/null +++ b/SOURCES/nfs-utils-2.3.3-statd-force.patch @@ -0,0 +1,73 @@ +diff -up nfs-utils-2.3.3/nfs.conf.orig nfs-utils-2.3.3/nfs.conf +--- nfs-utils-2.3.3/nfs.conf.orig 2019-03-05 10:30:28.100560625 -0500 ++++ nfs-utils-2.3.3/nfs.conf 2019-03-05 10:35:28.702004199 -0500 +@@ -64,6 +64,7 @@ use-gss-proxy=1 + # + [sm-notify] + # debug=0 ++# force=0 + # retry-time=900 + # outgoing-port= + # outgoing-addr= +diff -up nfs-utils-2.3.3/utils/statd/sm-notify.c.orig nfs-utils-2.3.3/utils/statd/sm-notify.c +--- nfs-utils-2.3.3/utils/statd/sm-notify.c.orig 2019-03-05 10:30:28.070560401 -0500 ++++ nfs-utils-2.3.3/utils/statd/sm-notify.c 2019-03-05 10:35:28.703004207 -0500 +@@ -49,6 +49,7 @@ + #define NLM_END_GRACE_FILE "/proc/fs/lockd/nlm_end_grace" + + int lift_grace = 1; ++int force = 0; + + struct nsm_host { + struct nsm_host * next; +@@ -480,19 +481,10 @@ nsm_lift_grace_period(void) + close(fd); + return; + } +- +-int +-main(int argc, char **argv) ++inline static void ++read_nfsconf(char **argv) + { +- int c, sock, force = 0; +- char * progname; +- char * s; +- +- progname = strrchr(argv[0], '/'); +- if (progname != NULL) +- progname++; +- else +- progname = argv[0]; ++ char *s; + + conf_init_file(NFS_CONFFILE); + xlog_from_conffile("sm-notify"); +@@ -500,10 +492,27 @@ main(int argc, char **argv) + opt_srcport = conf_get_str("sm-notify", "outgoing-port"); + opt_srcaddr = conf_get_str("sm-notify", "outgoing-addr"); + lift_grace = conf_get_bool("sm-notify", "lift-grace", lift_grace); ++ + s = conf_get_str("statd", "state-directory-path"); + if (s && !nsm_setup_pathnames(argv[0], s)) + exit(1); + opt_update_state = conf_get_bool("sm-notify", "update-state", opt_update_state); ++ force = conf_get_bool("sm-notify", "force", force); ++} ++ ++int ++main(int argc, char **argv) ++{ ++ int c, sock; ++ char * progname; ++ ++ progname = strrchr(argv[0], '/'); ++ if (progname != NULL) ++ progname++; ++ else ++ progname = argv[0]; ++ ++ read_nfsconf(argv); + + while ((c = getopt(argc, argv, "dm:np:v:P:f")) != -1) { + switch (c) { diff --git a/SOURCES/nfsconvert.py b/SOURCES/nfsconvert.py index da2f621..9aee57f 100644 --- a/SOURCES/nfsconvert.py +++ b/SOURCES/nfsconvert.py @@ -104,12 +104,13 @@ CONV_STATD = {'-o': (CONF_NFS, 'statd', 'outgoing-port', '$1'), } # options for sm-notify found in SMNOTIFYARGS -OPTS_SMNOTIFY = 'dm:np:v:P:' +OPTS_SMNOTIFY = 'dm:np:v:P:f' CONV_SMNOTIFY = {'-d': (CONF_NFS, 'sm-notify', 'debug', 'all'), '-m': (CONF_NFS, 'sm-notify', 'retry-time', '$1'), '-n': (CONF_NFS, 'sm-notify', 'update-state', '1'), '-p': (CONF_NFS, 'sm-notify', 'outgoing-port', '$1'), '-v': (CONF_NFS, 'sm-notify', 'outgoing-addr', '$1'), + '-f': (CONF_NFS, 'sm-notify', 'force', '1'), '-P': (CONF_NFS, 'statd', 'state-directory-path', '$1'), } @@ -152,6 +153,10 @@ GETOPT_MAPS = [('RPCNFSDARGS', OPTS_NFSD, LONG_NFSD, CONV_NFSD), ('BLKMAPDARGS', OPTS_BLKMAPD, [], CONV_BLKMAPD), ] +# any fixups we need to apply first +GETOPT_FIXUP = {'RPCNFSDARGS': ('--rdma', '--rdma=nfsrdma'), + } + # map for all of the single option values VALUE_MAPS = {'LOCKD_TCPPORT': (CONF_NFS, 'lockd', 'port', '$1'), 'LOCKD_UDPPORT': (CONF_NFS, 'lockd', 'udp-port', '$1'), @@ -206,6 +211,13 @@ def convert_getopt(optname, options, optstring, longopts, conversions): optcount = 0 try: args = options.strip('\"').split() + if optname in GETOPT_FIXUP: + (k, v) = GETOPT_FIXUP[optname] + for i, opt in enumerate(args): + if opt == k: + args[i] = v + elif opt == '--': + break optlist, optargs = getopt.gnu_getopt(args, optstring, longopts=longopts) except getopt.GetoptError as err: eprint(err) diff --git a/SOURCES/nfsconvert.sh b/SOURCES/nfsconvert.sh index f4e5b2d..ce28562 100644 --- a/SOURCES/nfsconvert.sh +++ b/SOURCES/nfsconvert.sh @@ -36,9 +36,3 @@ fi # /usr/sbin/nfsconvert -# -# Make sure the modes are correct -# -if [ $? -eq 0 ]; then - chmod 644 /etc/nfs.conf -fi diff --git a/SPECS/nfs-utils.spec b/SPECS/nfs-utils.spec index a6c1b38..9d749fa 100644 --- a/SPECS/nfs-utils.spec +++ b/SPECS/nfs-utils.spec @@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser Name: nfs-utils URL: http://linux-nfs.org/ Version: 2.3.3 -Release: 14%{?dist} +Release: 28%{?dist} Epoch: 1 # group all 32bit related archs @@ -26,12 +26,29 @@ Patch004: nfs-utils-2.3.3-gssd-usegssproxy.patch Patch005: nfs-utils-2.3.3-nfsconf-usegssproxy.patch Patch006: nfs-utils-2.3.3-man-tcpwrappers.patch Patch007: nfs-utils-2.3.3-junction-update.patch -Patch008: nfs-utils-2.3.3-gating-tests.patch # -# RHEL 8.0-Z +# RHEL 8.1 # -Patch009: nfs-utils-2.3.3-statd-no-notify.patch +Patch008: nfs-utils-2.3.3-nfsconf-manage-gids.patch +Patch009: nfs-utils-2.3.3-statd-force.patch +Patch010: nfs-utils-2.3.3-statd-no-notify.patch +Patch011: nfs-utils-2.3.3-gssd-verbose.patch +Patch012: nfs-utils-2.3.3-nfsconf-inplace.patch +Patch013: nfs-utils-2.3.3-covscan-resource-leaks.patch +Patch014: nfs-utils-2.3.3-nfsman-typo.patch +Patch015: nfs-utils-2.3.3-mount-fallback.patch +Patch016: nfs-utils-2.3.3-mountd-memleak.patch +Patch017: nfs-utils-2.3.3-lseek-error-handling.patch +Patch018: nfs-utils-2.3.3-memleak-on-error.patch + +# +# RHEL 8.2 +# +Patch019: nfs-utils-2.3.3-nfsiostat-err-cnts.patch +Patch020: nfs-utils-2.3.3-gssd-man-verbose.patch +Patch021: nfs-utils-2.3.3-nfsconf-rdmaport.patch +Patch022: nfs-utils-2.3.3-gssd-early-daemon.patch Patch100: nfs-utils-1.2.1-statdpath-man.patch Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch @@ -265,7 +282,7 @@ fi %dir %attr(700,rpcuser,rpcuser) %{_sharedstatedir}/nfs/statd %dir %attr(700,rpcuser,rpcuser) %{_sharedstatedir}/nfs/statd/sm %dir %attr(700,rpcuser,rpcuser) %{_sharedstatedir}/nfs/statd/sm.bak -%ghost %attr(644,rpcuser,rpcuser) %{_statdpath}/state +%ghost %attr(644,root,root) %{_statdpath}/state %config(noreplace) %{_sharedstatedir}/nfs/etab %config(noreplace) %{_sharedstatedir}/nfs/rmtab %config(noreplace) %{_sysconfdir}/request-key.d/id_resolver.conf @@ -308,8 +325,6 @@ fi %config(noreplace) %{_sysconfdir}/idmapd.conf %{_libdir}/libnfsidmap.so.* %{_libdir}/libnfsidmap/*.so -%{_mandir}/man3/nfs4_uid_to_name.* -%{_mandir}/man5/idmapd.conf.* %files -n libnfsidmap-devel %{_libdir}/pkgconfig/libnfsidmap.pc @@ -318,9 +333,60 @@ fi %{_libdir}/libnfsidmap.so %changelog -* Wed Apr 3 2019 Steve Dickson 2.3.3-14_0 -- Add nfs.conf equivalent for the statd --no-notify cmdline option (1690280) -- Correct the modes on /etc/nfs.conf after a conversion (bz 1690266) +* Tue Nov 26 2019 Steve Dickson 2.3.3-28 +- gssd: daemonize earlier (bz 1762847) + +* Mon Nov 11 2019 Steve Dickson 2.3.3-27 +- More coverity scans updates (bz 1746572) +- nfsd: Adjust nfs.conf setting/parsing of rdma port (bz 1710532) +- Add plain --rdma option to nfs.conf convertor (bz 1747295) +- mountstats: Add per-op error counts to iostat command (bz 1719983) +- gssd: add configure options verbosity to man page (bz 1749642) + +* Wed Sep 18 2019 Steve Dickson 2.3.3-26 +- Updated coverity scans patch to not do a double free (bz 1752326) + +* Mon Aug 19 2019 Steve Dickson 2.3.3-25 +- Change the owner/group of the state file (bz 1733445) + +* Mon Aug 12 2019 Steve Dickson 2.3.3-24 +- nfs.man: Fixed small typo in man page (bz 1732877) +- mount: Report correct error in the fall_back cases (bz 1709963) +- rpc.mountd: Fix e_hostname and e_uuid leaks (bz 1712202) +- spec: Remove redundant manpage files (bz 1718738) + +* Wed Jul 31 2019 Alice Mitchell 2.3.3-23 +- Fix memory leak on error (bz 1440524) +- Fix error handling on lseek (bz 1733887) + +* Thu Jul 18 2019 Alice Mitchell 2.3.3-22 +- Revert the forced chmod of nfs.conf as unneccessary (bz 1687496) + +* Mon Jul 15 2019 Steve Dickson 2.3.3-21 +- Gating tests: run tests from tests namespace (bz 1653927) + +* Tue Jul 9 2019 Steve Dickson 2.3.3-20 +- Gating tests: Fix _env data and source it in every test run (bz 1653927) + +* Fri May 3 2019 Steve Dickson 2.3.3-19 +- Removed resource leaks found by coverity scans (bz 1602633) + +* Thu Apr 25 2019 Steve Dickson 2.3.3-18 +- Modify nfs.conf in-place instead of replacing the file (bz 1687496) + +* Tue Mar 19 2019 Steve Dickson 2.3.3-17 +- Moved the gating tests out of a patch and into the top dir (bz 1653927) +- Move the mode corrections on /etc/nfs.conf to nfsconvert.py (bz 1655880) +- gssd: add verbosity options to the rpc.gssd man page (bz 1668026) + +* Fri Mar 8 2019 Steve Dickson 2.3.3-16 +- Add a conversion for new sm-notify force option in nfs.conf (bz 1677576) +- Correct the modes on /etc/nfs.conf after a conversion (bz 1655880) + +* Tue Mar 5 2019 Steve Dickson 2.3.3-15 +- nfs.conf: Fixed manage-gids option typo (bz 1672395) +- sm-notify: Added -f flag to nfs.conf parsing (bz 1677576) +- Add nfs.conf equivalent for the statd --no-notify cmdline option (bz 1683714) * Wed Feb 13 2019 Steve Dickson 2.3.3-14 - Fix typo in checking for the 65534 uid/gid (bz 1655960)