nsswitch revision 135305
1130561Sobrien#!/bin/sh
2218822Sdim#
3218822Sdim# Copyright (c) 1993 - 2004 The FreeBSD Project. All rights reserved.
4130561Sobrien#
5130561Sobrien# Redistribution and use in source and binary forms, with or without
6130561Sobrien# modification, are permitted provided that the following conditions
7130561Sobrien# are met:
8218822Sdim# 1. Redistributions of source code must retain the above copyright
9130561Sobrien#    notice, this list of conditions and the following disclaimer.
10130561Sobrien# 2. Redistributions in binary form must reproduce the above copyright
11130561Sobrien#    notice, this list of conditions and the following disclaimer in the
12130561Sobrien#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26# $FreeBSD: head/etc/rc.d/nsswitch 135305 2004-09-16 17:03:12Z keramida $
27#
28
29# PROVIDE: nsswitch
30# REQUIRE: root
31# BEFORE:  NETWORK
32# KEYWORD: FreeBSD
33
34. /etc/rc.subr
35
36name="nsswitch"
37start_cmd="nsswitch_start"
38stop_cmd=":"
39
40convert_host_conf()
41{
42    host_conf=$1; shift;
43    nsswitch_conf=$1; shift;
44    awk '                                                                   \
45        /^[:blank:]*#/       { next }                                       \
46        /(hosts|local|file)/ { nsswitch[c] = "files"; c++; next }           \
47        /(dns|bind)/         { nsswitch[c] = "dns";   c++; next }           \
48        /nis/                { nsswitch[c] = "nis";   c++; next }           \
49        { printf "Warning: unrecognized line [%s]", $0 > "/dev/stderr" }    \
50        END {                                                               \
51                printf "hosts: ";                                           \
52                for (i in nsswitch) printf "%s ", nsswitch[i];              \
53                printf "\n";                                                \
54        }' < $host_conf > $nsswitch_conf
55}
56
57generate_nsswitch_conf()
58{
59    nsswitch_conf=$1; shift;
60
61    cat >$nsswitch_conf <<EOF
62group: compat
63group_compat: nis
64hosts: files dns
65networks: files
66passwd: compat
67passwd_compat: nis
68shells: files
69EOF
70}
71
72generate_host_conf()
73{
74    nsswitch_conf=$1; shift;
75    host_conf=$1; shift;
76
77    awk '
78BEGIN {
79    xlat["files"] = "hosts";
80    xlat["dns"] = "bind";
81    xlat["nis"] = "nis";
82    cont = 0;
83}
84sub(/^[\t ]*hosts:/, "") || cont {
85    if (!cont)
86        srcs = ""
87    sub(/#.*/, "")
88    gsub(/[][]/, " & ")
89    cont = sub(/\\$/, "")
90    srcs = srcs " " $0
91}
92END {
93    print "# Auto-generated from nsswitch.conf, do not edit"
94    ns = split(srcs, s)
95    for (n = 1; n <= ns; ++n) {
96        if (s[n] in xlat)
97            print xlat[s[n]]
98    }
99}
100' <$nsswitch_conf >$host_conf
101}
102
103nsswitch_start()
104{
105	# Convert host.conf to nsswitch.conf if necessary
106	#
107	if [ -f "/etc/host.conf" -a ! -f "/etc/nsswitch.conf" ]; then
108		echo ''
109		echo 'Warning: /etc/host.conf is no longer used'
110		echo '  /etc/nsswitch.conf will be created for you'
111		convert_host_conf /etc/host.conf /etc/nsswitch.conf
112	fi
113
114	# Generate default nsswitch.conf if none exists
115	#
116	if [ ! -f "/etc/nsswitch.conf" ]; then
117		echo 'Generating nsswitch.conf.'
118		generate_nsswitch_conf /etc/nsswitch.conf
119	fi
120
121	# Generate host.conf for compatibility
122	#
123	if [ ! -f "/etc/host.conf" ]; then
124		echo 'Generating host.conf.'
125		generate_host_conf /etc/nsswitch.conf /etc/host.conf
126	fi
127
128}
129
130load_rc_config $name
131run_rc_command "$1"
132