]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - etc/rc.diskless1
This commit was generated by cvs2svn to compensate for changes in r75107,
[FreeBSD/FreeBSD.git] / etc / rc.diskless1
1 # Copyright (c) 1999  Matt Dillion
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7 # 1. Redistributions of source code must retain the above copyright
8 #    notice, this list of conditions and the following disclaimer.
9 # 2. Redistributions in binary form must reproduce the above copyright
10 #    notice, this list of conditions and the following disclaimer in the
11 #    documentation and/or other materials provided with the distribution.
12 #
13 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 # SUCH DAMAGE.
24 #
25 # $FreeBSD$
26 #
27
28 #
29 # /etc/rc.diskless1 - general BOOTP startup
30 #
31 # BOOTP has mounted / for us.  Assume a read-only mount.  We must then
32 # - figure out our IP by querying the interface
33 # - fill /conf/etc (writable) with files from /etc, and then update
34 #   per-machine files from /conf/*/ where * is the IP of the host,
35 #   the IP of the subnet, "default", or nothing.
36 # - mount /conf/etc over /etc so we can see the new files.
37 #
38 # WARNING: i thing you should not change /etc/rc or strange things could
39 # happen.
40 #
41 # The operator is in charge of setting /conf/*/etc/* things as appropriate.
42 # Typically rc.conf and fstab need to be changed, but possibly
43 # also other files such as inetd.conf etc.
44
45 # chkerr:
46 #
47 # Routine to check for error
48 #
49 #       checks error code and drops into shell on failure.
50 #       if shell exits, terminates script as well as /etc/rc.
51 #
52 chkerr() {
53         case $1 in
54         0)
55                 ;;
56         *)
57                 echo "$2 failed: dropping into /bin/sh"
58                 /bin/sh
59                 # RESUME
60                 ;;
61         esac
62 }
63
64 # DEBUGGING
65 #
66 # set -v
67
68 # Figure out our interface and IP.
69 #
70 bootp_ifc=""
71 bootp_ipa=""
72 bootp_ipbca=""
73 iflist=`ifconfig -l`
74 for i in ${iflist} ; do
75     set `ifconfig ${i}`
76     while [ $# -ge 1 ] ; do
77         if [ "${bootp_ifc}" = "" -a "$1" = "inet" ] ; then
78             bootp_ifc=${i} ; bootp_ipa=${2} ; shift
79         fi
80         if [ "${bootp_ipbca}" = "" -a "$1" = "broadcast" ] ; then
81             bootp_ipbca=$2; shift
82         fi
83         shift
84     done
85     if [ "${bootp_ifc}" != "" ] ; then
86         break
87     fi
88 done
89 echo "Interface ${bootp_ifc} IP-Address ${bootp_ipa} Broadcast ${bootp_ipbca}"
90  
91 # Files in /etc are copied to /conf/etc which is writable. Then
92 # per-machine configs from /conf/ip.address/etc are copied onto this
93 # directory. First choice is using the client's IP, then the client's
94 # broadcast address, then a default configuration.
95 # This way we have some flexibility to handle clusters of machines
96 # on separate subnets.
97 #
98 # WARNING! null mounts cannot handle mmap, and since many programs
99 # use mmap (such as 'cp'), we have to copy.
100 #
101 mount_mfs -s 2048 -T qp120at dummy /conf/etc
102 cp -Rp /etc/* /conf/etc
103 chkerr $? "MFS mount on /conf/etc"
104
105 # Pick up default, network-specific, and host-specific config, in that
106 # order
107
108 if [ -d /conf/default/etc/ ]; then
109         cp -Rp /conf/default/etc/* /conf/etc
110 fi
111
112 if [ -d /conf/${bootp_ipbca} ] ; then
113         cp -Rp /conf/${bootp_ipbca}/etc/* /conf/etc
114 fi
115
116 if [ -d /conf/${bootp_ipa} ] ; then
117         cp -Rp /conf/${bootp_ipa}/etc/* /conf/etc
118 fi
119
120 # Make the new directory available as /etc
121 #
122 mount_null /conf/etc /etc
123
124 # Tell /etc/rc to run the specified script after
125 # it does its mounts but before it does anything
126 # else.
127 #
128 # This script is responsible for setting up the
129 # diskless mount environment.  This can be
130 # overriden by /conf/ME/rc.conf.local if, for
131 # example, you do not want to run the standard
132 # system /etc/rc.diskless2
133
134 diskless_mount="/etc/rc.diskless2"