Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 130701790bf2d95e902edf16031ff596 > files > 3

autofs-5.0.1-0.rc2.164.el5_8.src.rpm

autofs-5.0.1 - add dump maps option

From: Ondrej Valousek <webserv@s3group.cz>

Modified by Ian Kent <raven@themaw.net>

---

 daemon/automount.c |   53 ++++++++++++++++------
 include/log.h      |    1 
 include/master.h   |    1 
 lib/log.c          |   14 ++++-
 lib/master.c       |  126 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 man/automount.8.in |    3 +
 6 files changed, 180 insertions(+), 18 deletions(-)


--- autofs-5.0.1.orig/daemon/automount.c
+++ autofs-5.0.1/daemon/automount.c
@@ -1702,6 +1702,7 @@ static void usage(void)
 		"	-f --foreground do not fork into background\n"
 		"	-r --random-multimount-selection\n"
 		"			use ramdom replicated server selection\n"
+		"	-m --dumpmaps	dump automounter maps and exit\n"
 		"	-n --negative-timeout n\n"
 		"			set the timeout for failed key lookups.\n"
 		"	-O --global-options\n"
@@ -1829,7 +1830,7 @@ int main(int argc, char *argv[])
 	int res, opt, status;
 	int logpri = -1;
 	unsigned ghost, logging;
-	unsigned foreground, have_global_options;
+	unsigned dumpmaps, foreground, have_global_options;
 	time_t timeout;
 	time_t age = time(NULL);
 	sigset_t allsigs;
@@ -1844,6 +1845,7 @@ int main(int argc, char *argv[])
 		{"foreground", 0, 0, 'f'},
 		{"random-multimount-selection", 0, 0, 'r'},
 		{"negative-timeout", 1, 0, 'n'},
+		{"dumpmaps", 0, 0, 'm'},
 		{"global-options", 1, 0, 'O'},
 		{"version", 0, 0, 'V'},
 		{"set-log-priority", 1, 0, 'l'},
@@ -1865,9 +1867,10 @@ int main(int argc, char *argv[])
 	global_options = NULL;
 	have_global_options = 0;
 	foreground = 0;
+	dumpmaps = 0;
 
 	opterr = 0;
-	while ((opt = getopt_long(argc, argv, "+hp:t:vdD:fVrO:l:n:F", long_options, NULL)) != EOF) {
+	while ((opt = getopt_long(argc, argv, "+hp:t:vmdD:fVrO:l:n:F", long_options, NULL)) != EOF) {
 		switch (opt) {
 		case 'h':
 			usage();
@@ -1909,6 +1912,10 @@ int main(int argc, char *argv[])
 			global_negative_timeout = getnumopt(optarg, opt);
 			break;
 
+		case 'm':
+			dumpmaps = 1;
+			break;
+
 		case 'O':
 			if (!have_global_options) {
 				global_options = strdup(optarg);
@@ -1983,7 +1990,7 @@ int main(int argc, char *argv[])
 		exit(exit_code);
 	}
 
-	if (is_automount_running() > 0) {
+	if (!dumpmaps && (is_automount_running() > 0)) {
 		fprintf(stderr, "%s: program is already running.\n",
 			program);
 		exit(0);
@@ -1996,7 +2003,8 @@ int main(int argc, char *argv[])
 	}
 #endif
 
-	if (!query_kproto_ver() || get_kver_major() < 5) {
+	/* Don't need the kernel module just to look at the configured maps */
+	if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
 		fprintf(stderr,
 			"%s: test mount forbidden or "
 			"incorrect kernel protocol version, "
@@ -2009,33 +2017,50 @@ int main(int argc, char *argv[])
 	rlim.rlim_max = MAX_OPEN_FILES;
 	res = setrlimit(RLIMIT_NOFILE, &rlim);
 	if (res)
-		warn(logging,
-		     "can't increase open file limit - continuing");
+		printf("%s: can't increase open file limit - continuing",
+			argv[0]);
 
 #if ENABLE_CORES
 	rlim.rlim_cur = RLIM_INFINITY;
 	rlim.rlim_max = RLIM_INFINITY;
 	res = setrlimit(RLIMIT_CORE, &rlim);
 	if (res)
-		warn(logging,
-		     "can't increase core file limit - continuing");
+		printf("%s: can't increase core file limit - continuing",
+			argv[0]);
 #endif
 
-	become_daemon(foreground);
-
 	if (argc == 0)
 		master_list = master_new(NULL, timeout, ghost);
 	else
 		master_list = master_new(argv[0], timeout, ghost);
 
 	if (!master_list) {
-		logerr("%s: can't create master map %s",
-			program, argv[0]);
-		res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
-		close(start_pipefd[1]);
+		printf("%s: can't create master map %s", program, argv[0]);
 		exit(1);
 	}
 
+	if (dumpmaps) {
+		struct mapent_cache *nc;
+
+		open_log();
+
+		master_init_scan();
+
+		nc = cache_init_null_cache(master_list);
+		if (!nc) {
+			printf("%s: failed to init null map cache for %s",
+				master_list->name, argv[0]);
+			exit(1);
+		}
+		master_list->nc = nc;
+
+		lookup_nss_read_master(master_list, 0);
+		master_show_mounts(master_list);
+		exit(0);
+	}
+
+	become_daemon(foreground);
+
 	if (pthread_attr_init(&th_attr)) {
 		logerr("%s: failed to init thread attribute struct!",
 		     program);
--- autofs-5.0.1.orig/include/log.h
+++ autofs-5.0.1/include/log.h
@@ -35,6 +35,7 @@ extern void set_log_verbose_ap(struct au
 extern void set_log_debug_ap(struct autofs_point *ap);
 extern void set_mnt_logging(unsigned global_logopt);
 
+extern void open_log(void);
 extern void log_to_syslog(void);
 extern void log_to_stderr(void);
  
--- autofs-5.0.1.orig/include/master.h
+++ autofs-5.0.1/include/master.h
@@ -110,6 +110,7 @@ int master_submount_list_empty(struct au
 int master_notify_submount(struct autofs_point *, const char *path, enum states);
 void master_notify_state_change(struct master *, int);
 int master_mount_mounts(struct master *, time_t, int);
+int master_show_mounts(struct master *);
 extern inline unsigned int master_get_logopt(void);
 int master_list_empty(struct master *);
 int master_done(struct master *);
--- autofs-5.0.1.orig/lib/log.c
+++ autofs-5.0.1/lib/log.c
@@ -195,17 +195,23 @@ void logmsg(const char *msg, ...)
 	return;
 }
 
-void log_to_syslog(void)
+void open_log(void)
 {
-	char buf[MAX_ERR_BUF];
-	int nullfd;
-
 	if (!syslog_open) {
 		syslog_open = 1;
 		openlog("automount", LOG_PID, LOG_DAEMON);
 	}
 
 	logging_to_syslog = 1;
+	return;
+}
+
+void log_to_syslog(void)
+{
+	char buf[MAX_ERR_BUF];
+	int nullfd;
+
+	open_log();
 
 	/* Redirect all our file descriptors to /dev/null */
 	nullfd = open("/dev/null", O_RDWR);
--- autofs-5.0.1.orig/lib/master.c
+++ autofs-5.0.1/lib/master.c
@@ -30,6 +30,7 @@
 /* The root of the map entry tree */
 struct master *master_list = NULL;
 
+extern const char *global_options;
 extern long global_negative_timeout;
 
 /* Attribute to create a joinable thread */
@@ -1202,6 +1203,131 @@ int master_mount_mounts(struct master *m
 	return 1;
 }
 
+/* The nss source instances end up in reverse order. */
+static void list_source_instances(struct map_source *source, struct map_source *instance)
+{
+	if (!source || !instance) {
+		printf("none");
+		return;
+	}
+
+	if (instance->next)
+		list_source_instances(source, instance->next);
+
+	/*
+	 * For convienience we map nss instance type "files" to "file".
+	 * Check for that and report corrected instance type.
+	 */
+	if (strcmp(instance->type, "file"))
+		printf("%s ", instance->type);
+	else {
+		if (source->argv && *(source->argv[0]) != '/')
+			printf("files ");
+		else
+			printf("%s ", instance->type);
+	}
+
+	return;
+}
+
+int master_show_mounts(struct master *master)
+{
+	struct list_head *p, *head;
+
+	printf("\nautofs dump map information\n"
+		 "===========================\n\n");
+
+	printf("global options: ");
+	if (!global_options)
+		printf("none configured\n");
+	else {
+		printf("%s\n", global_options);
+		unsigned int append_options = defaults_get_append_options();
+		const char *append = append_options ? "will" : "will not";
+		printf("global options %s be appended to map entries\n", append);
+	}
+
+	if (list_empty(&master->mounts)) {
+		printf("no master map entries found\n\n");
+		return 1;
+	}
+
+	head = &master->mounts;
+	p = head->next;
+	while (p != head) {
+		struct map_source *source;
+		struct master_mapent *this;
+		struct autofs_point *ap;
+		time_t now = time(NULL);
+		int i;
+
+		this = list_entry(p, struct master_mapent, list);
+		p = p->next;
+
+		ap = this->ap;
+
+		printf("\nMount point: %s\n", ap->path);
+		printf("\nsource(s):\n");
+
+		/* Read the map content into the cache */
+		if (lookup_nss_read_map(ap, NULL, now))
+			lookup_prune_cache(ap, now);
+		else {
+			printf("  failed to read map\n\n");
+			continue;
+		}
+
+		if (!this->maps) {
+			printf("  no map sources found\n\n");
+			continue;
+		}
+
+		source = this->maps;
+		while (source) {
+			struct mapent *me;
+
+			if (source->type)
+				printf("\n  type: %s\n", source->type);
+			else {
+				printf("\n  instance type(s): ");
+				list_source_instances(source, source->instance);
+				printf("\n");
+			}
+
+			if (source->argc >= 1) {
+				i = 0;
+				if (source->argv[0] && *source->argv[0] != '-') {
+					printf("  map: %s\n", source->argv[0]);
+					i = 1;
+				}
+				if (source->argc > 1) {
+					printf("  arguments: ");
+					for (; i < source->argc; i++)
+						printf("%s ", source->argv[i]);
+					printf("\n");
+				}
+			}
+
+			printf("\n");
+
+			me = cache_lookup_first(source->mc);
+			if (!me)
+				printf("  no keys found in map\n");
+			else {
+				do {
+					printf("  %s | %s\n", me->key, me->mapent);
+				} while ((me = cache_lookup_next(source->mc, me)));
+			}
+
+			source = source->next;
+		}
+
+		printf("\n");
+	}
+
+	return 1;
+}
+
 int master_list_empty(struct master *master)
 {
 	int res = 0;
--- autofs-5.0.1.orig/man/automount.8.in
+++ autofs-5.0.1/man/automount.8.in
@@ -59,6 +59,9 @@ Run the daemon in the forground and log 
 Enables the use of ramdom selection when choosing a host from a
 list of replicated servers.
 .TP
+.I "\-m, \-\-dumpmaps"
+Dump configured automounter maps, then exit.
+.TP
 .I "\-O, \-\-global-options"
 Allows the specification of global mount options used for all master
 map entries. These options will either replace or be appened to options