- always read file maps mount lookup map read fix. - fix direct map not updating on reread. - add external bind method. - fix add simple bind auth. - add option to dump configured automount maps. - wait for master map to be available at start.
355 lines
9.2 KiB
Diff
355 lines
9.2 KiB
Diff
autofs-5.0.5 - add dump maps option
|
|
|
|
From: Ondrej Valousek <webserv@s3group.cz>
|
|
|
|
Modified by Ian Kent <raven@themaw.net>
|
|
---
|
|
|
|
CHANGELOG | 1
|
|
daemon/automount.c | 52 +++++++++++++++------
|
|
include/log.h | 1
|
|
include/master.h | 1
|
|
lib/log.c | 14 ++++-
|
|
lib/master.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
man/automount.8 | 3 +
|
|
7 files changed, 180 insertions(+), 18 deletions(-)
|
|
|
|
|
|
--- autofs-5.0.5.orig/CHANGELOG
|
|
+++ autofs-5.0.5/CHANGELOG
|
|
@@ -53,6 +53,7 @@
|
|
- fix direct map not updating on reread.
|
|
- add external bind method.
|
|
- fix add simple bind auth.
|
|
+- add option to dump configured automount maps.
|
|
|
|
03/09/2009 autofs-5.0.5
|
|
-----------------------
|
|
--- autofs-5.0.5.orig/daemon/automount.c
|
|
+++ autofs-5.0.5/daemon/automount.c
|
|
@@ -1664,6 +1664,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"
|
|
@@ -1813,7 +1814,7 @@ int main(int argc, char *argv[])
|
|
int res, opt, status;
|
|
int logpri = -1;
|
|
unsigned ghost, logging, daemon_check;
|
|
- unsigned foreground, have_global_options;
|
|
+ unsigned dumpmaps, foreground, have_global_options;
|
|
time_t timeout;
|
|
time_t age = time(NULL);
|
|
struct rlimit rlim;
|
|
@@ -1827,6 +1828,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'},
|
|
@@ -1857,10 +1859,11 @@ int main(int argc, char *argv[])
|
|
global_options = NULL;
|
|
have_global_options = 0;
|
|
foreground = 0;
|
|
+ dumpmaps = 0;
|
|
daemon_check = 1;
|
|
|
|
opterr = 0;
|
|
- while ((opt = getopt_long(argc, argv, "+hp:t:vdD:fVrO:l:n:CF", long_options, NULL)) != EOF) {
|
|
+ while ((opt = getopt_long(argc, argv, "+hp:t:vmdD:fVrO:l:n:CF", long_options, NULL)) != EOF) {
|
|
switch (opt) {
|
|
case 'h':
|
|
usage();
|
|
@@ -1902,6 +1905,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);
|
|
@@ -1988,7 +1995,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, "
|
|
@@ -2001,34 +2009,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, daemon_check);
|
|
-
|
|
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]);
|
|
- release_flag_file();
|
|
+ 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, daemon_check);
|
|
+
|
|
if (pthread_attr_init(&th_attr)) {
|
|
logerr("%s: failed to init thread attribute struct!",
|
|
program);
|
|
--- autofs-5.0.5.orig/include/log.h
|
|
+++ autofs-5.0.5/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.5.orig/include/master.h
|
|
+++ autofs-5.0.5/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.5.orig/lib/log.c
|
|
+++ autofs-5.0.5/lib/log.c
|
|
@@ -193,17 +193,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.5.orig/lib/master.c
|
|
+++ autofs-5.0.5/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 */
|
|
@@ -1189,6 +1190,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.5.orig/man/automount.8
|
|
+++ autofs-5.0.5/man/automount.8
|
|
@@ -57,6 +57,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
|