Deleted Added
full compact
functions-packages.sh (211730) functions-packages.sh (212337)
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#
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: head/usr.sbin/pc-sysinstall/backend/functions-packages.sh 211730 2010-08-24 06:11:46Z imp $
26# $FreeBSD: head/usr.sbin/pc-sysinstall/backend/functions-packages.sh 212337 2010-09-08 20:10:24Z imp $
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
35get_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
58get_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
66get_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
82get_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 ;;
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
35get_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
58get_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
66get_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
82get_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|sftp) get_package_index_by_ftp "${FTPPATH}" ;;
116 ftp) get_package_index_by_ftp "${FTPPATH}" ;;
117 sftp) ;;
117 *) RES=1 ;;
118 esac
119
120 fi
121
122 return ${RES}
123};
124
125parse_package_index()
126{
127 INDEX_FILE="${PKGDIR}/INDEX"
128
129 exec 3<&0
130 exec 0<"${INDEX_FILE}"
131
132 while read -r line
133 do
134 PKGNAME=""
135 CATEGORY=""
136 PACKAGE=""
137 DESC=""
138 DEPS=""
139 i=0
140
141 SAVE_IFS="${IFS}"
142 IFS="|"
143
144 for part in ${line}
145 do
146 if [ "${i}" -eq "0" ]
147 then
148 PKGNAME="${part}"
149
150 elif [ "${i}" -eq "1" ]
151 then
152 PACKAGE=`basename "${part}"`
153
154 elif [ "${i}" -eq "3" ]
155 then
156 DESC="${part}"
157
158 elif [ "${i}" -eq "6" ]
159 then
160 CATEGORY=`echo "${part}" | cut -f1 -d' '`
161
162 elif [ "${i}" -eq "8" ]
163 then
164 DEPS="${part}"
165 fi
166
167 i=$((i+1))
168 done
169
170 echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
171 echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps"
172
173 IFS="${SAVE_IFS}"
174 done
175
176 exec 0<&3
177};
178
179show_package_file()
180{
181 PKGFILE="${1}"
182
183 echo "Available Packages:"
184
185 exec 3<&0
186 exec 0<"${PKGFILE}"
187
188 while read -r line
189 do
190 CATEGORY=`echo "${line}" | cut -f1 -d'|'`
191 PACKAGE=`echo "${line}" | cut -f2 -d'|'`
192 DESC=`echo "${line}" | cut -f3 -d'|'`
193
194 echo "${CATEGORY}/${PACKAGE}:${DESC}"
195 done
196
197 exec 0<&3
198};
199
200show_packages_by_category()
201{
202 CATEGORY="${1}"
203 INDEX_FILE="${PKGDIR}/INDEX.parsed"
204 TMPFILE="/tmp/.pkg.cat"
205
206 grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
207 show_package_file "${TMPFILE}"
208 rm "${TMPFILE}"
209};
210
211show_package_by_name()
212{
213 CATEGORY="${1}"
214 PACKAGE="${2}"
215 INDEX_FILE="${PKGDIR}/INDEX.parsed"
216 TMPFILE="/tmp/.pkg.cat.pak"
217
218 grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
219 show_package_file "${TMPFILE}"
220 rm "${TMPFILE}"
221};
222
223show_packages()
224{
225 show_package_file "${PKGDIR}/INDEX.parsed"
226};
227
228get_package_dependencies()
229{
230 PACKAGE="${1}"
231 LONG="${2:-0}"
232 RES=0
233
234 INDEX_FILE="${PKGDIR}/INDEX.deps"
235 REGEX="^${PACKAGE}|"
236
237 if [ "${LONG}" -ne "0" ]
238 then
239 REGEX="^.*|${PACKAGE}|"
240 fi
241
242 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
243 DEPS=`echo "${LINE}"|cut -f3 -d'|'`
244
245 VAL="${DEPS}"
246 export VAL
247
248 if [ -z "${VAL}" ]
249 then
250 RES=1
251 fi
252
253 return ${RES}
254};
255
256get_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 VAL="${NAME}"
268 export VAL
269
270 if [ -z "${VAL}" ]
271 then
272 RES=1
273 fi
274
275 return ${RES}
276};
277
278get_package_short_name()
279{
280 PACKAGE="${1}"
281 RES=0
282
283 INDEX_FILE="${PKGDIR}/INDEX.deps"
284 REGEX="^.*|${PACKAGE}|"
285
286 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
287 NAME=`echo "${LINE}"|cut -f1 -d'|'`
288
289 VAL="${NAME}"
290 export VAL
291
292 if [ -z "${VAL}" ]
293 then
294 RES=1
295 fi
296
297 return ${RES}
298};
299
300get_package_category()
301{
302 PACKAGE="${1}"
303 INDEX_FILE="${PKGDIR}/INDEX.parsed"
304 RES=0
305
306 LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
307 NAME=`echo "${LINE}"|cut -f1 -d'|'`
308
309 VAL="${NAME}"
310 export VAL
311
312 if [ -z "${VAL}" ]
313 then
314 RES=1
315 fi
316
317 return ${RES}
318};
319
320fetch_package_by_ftp()
321{
322 CATEGORY="${1}"
323 PACKAGE="${2}"
324 SAVEDIR="${3}"
325
326 get_value_from_cfg ftpHost
327 if [ -z "$VAL" ]
328 then
329 exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!"
330 fi
331 FTPHOST="${VAL}"
332
333 get_value_from_cfg ftpDir
334 if [ -z "$VAL" ]
335 then
336 exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!"
337 fi
338 FTPDIR="${VAL}"
339
340 PACKAGE="${PACKAGE}.tbz"
341 FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
342
343 if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
344 then
345 PKGPATH="${CATEGORY}/${PACKAGE}"
346 FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
347 fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
348 fi
349};
350
351fetch_package_by_fs()
352{
353 CATEGORY="${1}"
354 PACKAGE="${2}"
355 SAVEDIR="${3}"
356
357 PACKAGE="${PACKAGE}.tbz"
358 if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
359 then
360 fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0"
361 fi
362};
363
364fetch_package()
365{
366 CATEGORY="${1}"
367 PACKAGE="${2}"
368 SAVEDIR="${3}"
369
370 case "${INSTALLMEDIUM}" in
371 usb|dvd) fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
118 *) RES=1 ;;
119 esac
120
121 fi
122
123 return ${RES}
124};
125
126parse_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
180show_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
201show_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
212show_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
224show_packages()
225{
226 show_package_file "${PKGDIR}/INDEX.parsed"
227};
228
229get_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 VAL="${DEPS}"
247 export VAL
248
249 if [ -z "${VAL}" ]
250 then
251 RES=1
252 fi
253
254 return ${RES}
255};
256
257get_package_name()
258{
259 PACKAGE="${1}"
260 RES=0
261
262 INDEX_FILE="${PKGDIR}/INDEX.deps"
263 REGEX="^${PACKAGE}|"
264
265 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
266 NAME=`echo "${LINE}"|cut -f2 -d'|'`
267
268 VAL="${NAME}"
269 export VAL
270
271 if [ -z "${VAL}" ]
272 then
273 RES=1
274 fi
275
276 return ${RES}
277};
278
279get_package_short_name()
280{
281 PACKAGE="${1}"
282 RES=0
283
284 INDEX_FILE="${PKGDIR}/INDEX.deps"
285 REGEX="^.*|${PACKAGE}|"
286
287 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
288 NAME=`echo "${LINE}"|cut -f1 -d'|'`
289
290 VAL="${NAME}"
291 export VAL
292
293 if [ -z "${VAL}" ]
294 then
295 RES=1
296 fi
297
298 return ${RES}
299};
300
301get_package_category()
302{
303 PACKAGE="${1}"
304 INDEX_FILE="${PKGDIR}/INDEX.parsed"
305 RES=0
306
307 LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
308 NAME=`echo "${LINE}"|cut -f1 -d'|'`
309
310 VAL="${NAME}"
311 export VAL
312
313 if [ -z "${VAL}" ]
314 then
315 RES=1
316 fi
317
318 return ${RES}
319};
320
321fetch_package_by_ftp()
322{
323 CATEGORY="${1}"
324 PACKAGE="${2}"
325 SAVEDIR="${3}"
326
327 get_value_from_cfg ftpHost
328 if [ -z "$VAL" ]
329 then
330 exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!"
331 fi
332 FTPHOST="${VAL}"
333
334 get_value_from_cfg ftpDir
335 if [ -z "$VAL" ]
336 then
337 exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!"
338 fi
339 FTPDIR="${VAL}"
340
341 PACKAGE="${PACKAGE}.tbz"
342 FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
343
344 if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
345 then
346 PKGPATH="${CATEGORY}/${PACKAGE}"
347 FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
348 fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
349 fi
350};
351
352fetch_package_by_fs()
353{
354 CATEGORY="${1}"
355 PACKAGE="${2}"
356 SAVEDIR="${3}"
357
358 PACKAGE="${PACKAGE}.tbz"
359 if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
360 then
361 fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0"
362 fi
363};
364
365fetch_package()
366{
367 CATEGORY="${1}"
368 PACKAGE="${2}"
369 SAVEDIR="${3}"
370
371 case "${INSTALLMEDIUM}" in
372 usb|dvd) fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
372 ftp|sftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
373 ftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
374 sftp) ;;
373 esac
374};
375 esac
376};