]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - usr.sbin/pc-sysinstall/backend/functions-installcomponents.sh
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / usr.sbin / pc-sysinstall / backend / functions-installcomponents.sh
1 #!/bin/sh
2 #-
3 # Copyright (c) 2010 iXsystems, Inc.  All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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$
27
28 # Functions which check and load any optional modules specified in the config
29
30 . ${BACKEND}/functions.sh
31 . ${BACKEND}/functions-parse.sh
32
33 copy_component()
34 {
35   COMPONENT="$1"
36   FAILED="0"
37   CFILES=""
38
39   # Check the type, and set the components subdir properly
40   TYPE="`grep 'type:' ${COMPDIR}/${COMPONENT}/component.cfg | cut -d ' ' -f 2`"
41   if [ "${TYPE}" = "PBI" ]
42   then
43     SUBDIR="PBI"
44   else
45     SUBDIR="components"
46   fi
47
48   # Lets start by downloading / copying the files this component needs
49   while read line
50   do
51     CFILE="`echo $line | cut -d ':' -f 1`"
52     CFILEMD5="`echo $line | cut -d ':' -f 2`"
53     CFILE2MD5="`echo $line | cut -d ':' -f 3`"
54
55     case ${INSTALLMEDIUM} in
56       dvd|usb)
57         # On both dvd / usb, we can just copy the file
58         cp ${CDMNT}/${COMPFILEDIR}/${SUBDIR}/${CFILE} \
59                   ${FSMNT}/${COMPTMPDIR} >>${LOGOUT} 2>>${LOGOUT}
60             RESULT="$?"
61         ;;
62
63       ftp)
64         get_value_from_cfg ftpPath
65         if [ -z "$VAL" ]
66         then
67           exit_err "ERROR: Install medium was set to ftp, but no ftpPath was provided!"
68         fi
69         FTPPATH="${VAL}" 
70
71         fetch_file "${FTPPATH}/${COMPFILEDIR}/${SUBDIR}/${CFILE}" "${FSMNT}/${COMPTMPDIR}/${CFILE}" "0"
72         RESULT="$?"
73        ;;
74
75       sftp) ;;
76     esac
77
78     if [ "${RESULT}" != "0" ]
79     then
80       echo_log "WARNING: Failed to copy ${CFILE}"
81       FAILED="1"
82     else
83       # Now lets check the MD5 to confirm the file is valid
84       CHECKMD5=`md5 -q ${FSMNT}/${COMPTMPDIR}/${CFILE}`
85       if [ "${CHECKMD5}" != "${CFILEMD5}" -a "${CHECKMD5}" != "${CFILE2MD5}" ]
86       then
87         echo_log "WARNING: ${CFILE} failed md5 checksum"
88         FAILED="1"
89       else
90         if [ -z "${CFILES}" ]
91         then
92           CFILES="${CFILE}" 
93         else
94           CFILES="${CFILES},${CFILE}"
95         fi
96       fi
97     fi
98
99
100   done < ${COMPDIR}/${COMPONENT}/distfiles
101       
102   if [ "${FAILED}" = "0" ]
103   then
104     # Now install the component
105     run_component_install ${COMPONENT} ${CFILES}
106   fi
107
108 };
109
110 run_component_install()
111 {
112   COMPONENT="$1"
113   CFILES="$1"
114
115   # Lets install this component now 
116   # Start by making a wrapper script which sets the variables
117   # for the component to use
118   echo "#!/bin/sh
119 COMPTMPDIR=\"${COMPTMPDIR}\"
120 export COMPTMPDIR
121 CFILE=\"${CFILE}\"
122 export CFILE
123 mount -t devfs devfs /dev
124
125 sh ${COMPTMPDIR}/install.sh
126
127 umount /dev
128 " >${FSMNT}/.componentwrapper.sh
129   chmod 755 ${FSMNT}/.componentwrapper.sh
130    
131   # Copy over the install script for this component
132   cp ${COMPDIR}/${COMPONENT}/install.sh ${FSMNT}/${COMPTMPDIR}/
133
134   echo_log "INSTALL COMPONENT: ${i}"
135   chroot ${FSMNT} /.componentwrapper.sh >>${LOGOUT} 2>>${LOGOUT}
136   rm ${FSMNT}/.componentwrapper.sh
137
138 };
139
140 # Check for any modules specified, and begin loading them
141 install_components()
142 {
143   # First, lets check and see if we even have any optional modules
144   get_value_from_cfg installComponents
145   if [ -n "${VAL}" ]
146   then
147     # Lets start by cleaning up the string and getting it ready to parse
148     strip_white_space ${VAL}
149     COMPONENTS=`echo ${VAL} | sed -e "s|,| |g"`
150     for i in $COMPONENTS
151     do
152       if [ ! -e "${COMPDIR}/${i}/install.sh" -o ! -e "${COMPDIR}/${i}/distfiles" ]
153       then
154         echo_log "WARNING: Component ${i} doesn't seem to exist"
155       else
156
157         # Make the tmpdir on the disk
158         mkdir -p ${FSMNT}/${COMPTMPDIR} >>${LOGOUT} 2>>${LOGOUT}
159
160         # Start by grabbing the component files
161         copy_component ${i}
162
163         # Remove the tmpdir now
164         rm -rf ${FSMNT}/${COMPTMPDIR} >>${LOGOUT} 2>>${LOGOUT}
165       fi
166     done
167   fi
168
169 };