include_nis_nullfs revision 1.1 1 1.1 christos #!/usr/bin/awk -f
2 1.1 christos #-
3 1.1 christos # Copyright (c) 2017 G. Paul Ziemba
4 1.1 christos # All rights reserved.
5 1.1 christos #
6 1.1 christos # Redistribution and use in source and binary forms, with or without
7 1.1 christos # modification, are permitted provided that the following conditions
8 1.1 christos # are met:
9 1.1 christos # 1. Redistributions of source code must retain the above copyright
10 1.1 christos # notice, this list of conditions and the following disclaimer.
11 1.1 christos # 2. Redistributions in binary form must reproduce the above copyright
12 1.1 christos # notice, this list of conditions and the following disclaimer in the
13 1.1 christos # documentation and/or other materials provided with the distribution.
14 1.1 christos #
15 1.1 christos # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 1.1 christos # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 1.1 christos # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 1.1 christos # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.1 christos # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.1 christos # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 1.1 christos # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.1 christos # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.1 christos # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.1 christos # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.1 christos # SUCH DAMAGE.
26 1.1 christos #
27 1.1 christos # $NetBSD: include_nis_nullfs,v 1.1 2018/01/09 03:31:14 christos Exp $
28 1.1 christos #
29 1.1 christos
30 1.1 christos #
31 1.1 christos # /etc/autofs/include_nis_nullfs
32 1.1 christos #
33 1.1 christos # automountd Directory Services script for NIS
34 1.1 christos #
35 1.1 christos # SYNOPSIS
36 1.1 christos # include_nis_nullfs <mapname>
37 1.1 christos #
38 1.1 christos # include_nis_nullfs <mapname> <key>
39 1.1 christos #
40 1.1 christos # DESCRIPTION
41 1.1 christos #
42 1.1 christos # This script provides a Directory Services map for automountd
43 1.1 christos # based on NIS. Please see auto_master(5) for general information.
44 1.1 christos #
45 1.1 christos # The first form, with one argument, emits the entire named NIS map.
46 1.1 christos # The second form, with two arguments, emits the map entry for the
47 1.1 christos # key given in the second argument.
48 1.1 christos #
49 1.1 christos # This script attempts to determine the names and IP addresses
50 1.1 christos # of the local host. Map entries matching the local host are
51 1.1 christos # rewritten to specify nullfs mounts (instead of the default
52 1.1 christos # NFS) to reduce access overhead in the kernel.
53 1.1 christos #
54 1.1 christos # If a map entry contains multiple location fields, it is not changed.
55 1.1 christos #
56 1.1 christos
57 1.1 christos
58 1.1 christos # Populate list of names and IP addrs thet mean "this host"
59 1.1 christos # into myhostnames array
60 1.1 christos BEGIN {
61 1.1 christos #
62 1.1 christos # Set self hostnames
63 1.1 christos #
64 1.1 christos
65 1.1 christos "hostname -s" | getline;
66 1.1 christos myhostnames[$0] = 1;
67 1.1 christos
68 1.1 christos "hostname -f" | getline;
69 1.1 christos myhostnames[$0] = 1;
70 1.1 christos
71 1.1 christos myhostnames["localhost"] = 1
72 1.1 christos
73 1.1 christos "hostname -f" | getline;
74 1.1 christos localdomain=$0
75 1.1 christos myhostnames["localhost."localdomain] = 1
76 1.1 christos
77 1.1 christos while ("ifconfig" | getline) {
78 1.1 christos if ($1 == "inet") {
79 1.1 christos myhostnames[$2] = 1;
80 1.1 christos }
81 1.1 christos }
82 1.1 christos
83 1.1 christos # debug
84 1.1 christos # print "--- hostname list start ----"
85 1.1 christos # for (i in myhostnames) {
86 1.1 christos # print i
87 1.1 christos # }
88 1.1 christos # print "--- hostname list end ----"
89 1.1 christos
90 1.1 christos if (ARGC == 2) {
91 1.1 christos # mapname only
92 1.1 christos while ("ypcat -k " ARGV[1] | getline) {
93 1.1 christos proc_mapline(1)
94 1.1 christos }
95 1.1 christos }
96 1.1 christos if (ARGC == 3) {
97 1.1 christos # mapname and keyname
98 1.1 christos while ("ypmatch " ARGV[2] " " ARGV[1] | getline) {
99 1.1 christos proc_mapline(0)
100 1.1 christos }
101 1.1 christos }
102 1.1 christos exit 0
103 1.1 christos }
104 1.1 christos
105 1.1 christos function is_self(hostname)
106 1.1 christos {
107 1.1 christos if (myhostnames[hostname]) {
108 1.1 christos return 1
109 1.1 christos }
110 1.1 christos return 0
111 1.1 christos }
112 1.1 christos
113 1.1 christos #
114 1.1 christos # Lines are of the form [key] [-opts] location1 [... locationN]
115 1.1 christos #
116 1.1 christos # indicate index of key field with first positional parameter
117 1.1 christos # 1 means keyfield is the first field
118 1.1 christos # 0 means keyfield is not present
119 1.1 christos #
120 1.1 christos function proc_mapline(keyfield)
121 1.1 christos {
122 1.1 christos optionsfield = 0
123 1.1 christos locationfield = 0
124 1.1 christos locationcount = 0
125 1.1 christos
126 1.1 christos for (i=keyfield+1; i <= NF; ++i) {
127 1.1 christos if (!optionsfield) {
128 1.1 christos if ($i ~ /^-/) {
129 1.1 christos # the first options field found on the line
130 1.1 christos optionsfield = i;
131 1.1 christos continue
132 1.1 christos }
133 1.1 christos }
134 1.1 christos # Assumption: location contains colon (":")
135 1.1 christos if (optionsfield && ($i ~ /:/) && ($i !~ /^-/)) {
136 1.1 christos ++locationcount
137 1.1 christos if (!locationfield) {
138 1.1 christos # the first location field found on the line
139 1.1 christos locationfield = i
140 1.1 christos }
141 1.1 christos }
142 1.1 christos }
143 1.1 christos
144 1.1 christos #
145 1.1 christos # If location not found, do not modify.
146 1.1 christos #
147 1.1 christos # If there is more than one location, do not modify. Rationale:
148 1.1 christos # Options are applied to all locations. We ca not have "nullfs"
149 1.1 christos # for only some locations and "nfs" for others for a given
150 1.1 christos # map key (i.e., a line). The usual reason for multiple
151 1.1 christos # locations is for redundancy using replicated volumes on
152 1.1 christos # multiple hosts, so multiple hosts imply fstype=nfs (the
153 1.1 christos # FreeBSD default for automounter maps).
154 1.1 christos #
155 1.1 christos # Hypothetically there could be a map entry with multiple
156 1.1 christos # locations all with host parts matching "me". In that case,
157 1.1 christos # it would be safe to rewrite the locations and specify
158 1.1 christos # nullfs, but the code does not handle this case.
159 1.1 christos #
160 1.1 christos if (locationcount == 1) {
161 1.1 christos #
162 1.1 christos # We have a line with exactly one location field
163 1.1 christos #
164 1.1 christos # Assumption: location has no more than one colon (":")
165 1.1 christos #
166 1.1 christos n=split($locationfield,location,":")
167 1.1 christos if (is_self(location[1])) {
168 1.1 christos $locationfield = ":" location[2]
169 1.1 christos if (optionsfield) {
170 1.1 christos # append to existing options
171 1.1 christos $optionsfield = $optionsfield ",fstype=nullfs"
172 1.1 christos } else {
173 1.1 christos # sneak in ahead of location
174 1.1 christos $locationfield = "-fstype=nullfs " $locationfield
175 1.1 christos }
176 1.1 christos }
177 1.1 christos }
178 1.1 christos
179 1.1 christos print
180 1.1 christos }
181