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