]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - usr.sbin/pc-sysinstall/backend/functions-packages.sh
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / usr.sbin / pc-sysinstall / backend / functions-packages.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 runs commands on the system
29
30 . ${BACKEND}/functions.sh
31 . ${BACKEND}/functions-parse.sh
32 . ${BACKEND}/functions-ftp.sh
33
34
35 get_package_index_by_ftp()
36 {
37   local INDEX_FILE
38   local FTP_SERVER
39
40   FTP_SERVER="${1}"
41   INDEX_FILE="INDEX"
42   USE_BZIP2=0
43
44   if [ -f "/usr/bin/bzip2" ]
45   then
46     INDEX_FILE="${INDEX_FILE}.bz2"
47     USE_BZIP2=1
48   fi
49
50   INDEX_PATH="${CONFDIR}/${INDEX_FILE}"
51   fetch_file "${FTP_SERVER}/${INDEX_FILE}" "${INDEX_PATH}" "1"
52   if [ -f "${INDEX_PATH}" ] && [ "${USE_BZIP2}" -eq "1" ]
53   then
54     bzip2 -d "${INDEX_PATH}"
55   fi
56 };
57
58 get_package_index_by_fs()
59 {
60   local INDEX_FILE
61
62   INDEX_FILE="${CDMNT}/packages/INDEX"
63   fetch_file "${INDEX_FILE}" "${CONFDIR}/" "0"
64 };
65
66 get_package_index_size()
67 {
68   if [ -f "${CONFDIR}/INDEX" ]
69   then
70     SIZE=`ls -l ${CONFDIR}/INDEX | awk '{ print $5 }'`
71   else
72     get_ftp_mirror
73     FTPHOST="${VAL}"
74
75     FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
76     FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
77
78     fetch -s "${FTPPATH}/INDEX.bz2"
79   fi
80 };
81
82 get_package_index()
83 {
84   RES=0
85
86   if [ -z "${INSTALLMODE}" ]
87   then
88     get_ftp_mirror
89     FTPHOST="${VAL}"
90
91     FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
92     FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
93
94     get_package_index_by_ftp "${FTPPATH}"
95
96   else
97     get_value_from_cfg ftpHost
98     if [ -z "$VAL" ]
99     then
100       exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
101     fi
102
103     FTPHOST="${VAL}"
104
105     get_value_from_cfg ftpDir
106     if [ -z "$VAL" ]
107     then
108       exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
109     fi
110
111     FTPDIR="${VAL}"
112     FTPPATH="ftp://${FTPHOST}${FTPDIR}"
113
114     case "${INSTALLMEDIUM}" in
115       usb|dvd) get_package_index_by_fs ;;
116       ftp) get_package_index_by_ftp "${FTPPATH}" ;;
117       sftp) ;;
118       *) RES=1 ;;
119     esac
120
121   fi
122
123   return ${RES}
124 };
125
126 parse_package_index()
127 {
128   INDEX_FILE="${PKGDIR}/INDEX"
129
130   exec 3<&0
131   exec 0<"${INDEX_FILE}"
132
133   while read -r line
134   do
135     PKGNAME=""
136     CATEGORY=""
137     PACKAGE=""
138     DESC=""
139     DEPS=""
140     i=0
141
142     SAVE_IFS="${IFS}"
143     IFS="|"
144
145     for part in ${line}
146     do
147       if [ ${i} -eq 0 ]
148       then
149         PKGNAME="${part}"
150
151       elif [ ${i} -eq 1 ]
152       then
153         PACKAGE=`basename "${part}"`
154
155       elif [ ${i} -eq 3 ]
156       then
157         DESC="${part}"
158
159       elif [ ${i} -eq 6 ]
160       then
161         CATEGORY=`echo "${part}" | cut -f1 -d' '`
162
163       elif [ ${i} -eq 8 ]
164       then
165         DEPS="${part}"
166       fi
167
168       i=$((i+1))
169     done
170
171     echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
172     echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps"
173
174     IFS="${SAVE_IFS}"
175   done
176
177   exec 0<&3
178 };
179
180 show_package_file()
181 {
182   PKGFILE="${1}"
183
184   echo "Available Packages:"
185
186   exec 3<&0
187   exec 0<"${PKGFILE}"
188
189   while read -r line
190   do
191     CATEGORY=`echo "${line}" | cut -f1 -d'|'`
192     PACKAGE=`echo "${line}" | cut -f2 -d'|'`
193     DESC=`echo "${line}" | cut -f3 -d'|'`
194
195     echo "${CATEGORY}/${PACKAGE}:${DESC}"
196   done
197
198   exec 0<&3
199 };
200
201 show_packages_by_category()
202 {
203   CATEGORY="${1}"
204   INDEX_FILE="${PKGDIR}/INDEX.parsed"
205   TMPFILE="/tmp/.pkg.cat"
206
207   grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
208   show_package_file "${TMPFILE}"
209   rm "${TMPFILE}"
210 };
211
212 show_package_by_name()
213 {
214   CATEGORY="${1}"
215   PACKAGE="${2}"
216   INDEX_FILE="${PKGDIR}/INDEX.parsed"
217   TMPFILE="/tmp/.pkg.cat.pak"
218
219   grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
220   show_package_file "${TMPFILE}"
221   rm "${TMPFILE}"
222 };
223
224 show_packages()
225 {
226   show_package_file "${PKGDIR}/INDEX.parsed"
227 };
228
229 get_package_dependencies()
230 {
231   PACKAGE="${1}"
232   LONG="${2:-0}"
233   RES=0
234
235   INDEX_FILE="${PKGDIR}/INDEX.deps"
236   REGEX="^${PACKAGE}|"
237
238   if [ ${LONG} -ne 0 ]
239   then
240     REGEX="^.*|${PACKAGE}|"
241   fi
242
243   LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
244   DEPS=`echo "${LINE}"|cut -f3 -d'|'`
245
246   export VAL="${DEPS}"
247
248   if [ -z "${VAL}" ]
249   then
250     RES=1
251   fi
252
253   return ${RES}
254 };
255
256 get_package_name()
257 {
258   PACKAGE="${1}"
259   RES=0
260
261   INDEX_FILE="${PKGDIR}/INDEX.deps"
262   REGEX="^${PACKAGE}|"
263         
264   LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
265   NAME=`echo "${LINE}"|cut -f2 -d'|'`
266
267   export VAL="${NAME}"
268
269   if [ -z "${VAL}" ]
270   then
271     RES=1
272   fi
273
274   return ${RES}
275 };
276
277 get_package_short_name()
278 {
279   PACKAGE="${1}"
280   RES=0
281
282   INDEX_FILE="${PKGDIR}/INDEX.deps"
283   REGEX="^.*|${PACKAGE}|"
284         
285   LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
286   NAME=`echo "${LINE}"|cut -f1 -d'|'`
287
288   export VAL="${NAME}"
289
290   if [ -z "${VAL}" ]
291   then
292     RES=1
293   fi
294
295   return ${RES}
296 };
297
298 get_package_category()
299 {
300   PACKAGE="${1}"
301   INDEX_FILE="${PKGDIR}/INDEX.parsed"
302   RES=0
303
304   LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
305   NAME=`echo "${LINE}"|cut -f1 -d'|'`
306
307   export VAL="${NAME}"
308
309   if [ -z "${VAL}" ]
310   then
311     RES=1
312   fi
313
314   return ${RES}
315 };
316
317 fetch_package_by_ftp()
318 {
319   CATEGORY="${1}"
320   PACKAGE="${2}"
321   SAVEDIR="${3}"
322
323   get_value_from_cfg ftpHost
324   if [ -z "$VAL" ]
325   then
326     exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
327   fi
328   FTPHOST="${VAL}"
329
330   get_value_from_cfg ftpDir
331   if [ -z "$VAL" ]
332   then
333     exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
334   fi
335   FTPDIR="${VAL}"
336
337   PACKAGE="${PACKAGE}.tbz"
338   FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
339
340   if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
341   then
342     PKGPATH="${CATEGORY}/${PACKAGE}"
343     FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
344     fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
345   fi
346 };
347
348 fetch_package_by_fs()
349 {
350   CATEGORY="${1}"
351   PACKAGE="${2}"
352   SAVEDIR="${3}"
353
354   PACKAGE="${PACKAGE}.tbz"
355   if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
356   then
357     fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0"
358   fi
359 };
360
361 fetch_package()
362 {
363   CATEGORY="${1}"
364   PACKAGE="${2}"
365   SAVEDIR="${3}"
366
367   case "${INSTALLMEDIUM}" in
368     usb|dvd) fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
369     ftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
370     sftp) ;;
371   esac
372 };