functions-packages.sh revision 211486
1210036Simp#!/bin/sh
2210036Simp#-
3210036Simp# Copyright (c) 2010 iXsystems, Inc.  All rights reserved.
4210036Simp#
5210036Simp# Redistribution and use in source and binary forms, with or without
6210036Simp# modification, are permitted provided that the following conditions
7210036Simp# are met:
8210036Simp# 1. Redistributions of source code must retain the above copyright
9210036Simp#    notice, this list of conditions and the following disclaimer.
10210036Simp# 2. Redistributions in binary form must reproduce the above copyright
11210036Simp#    notice, this list of conditions and the following disclaimer in the
12210036Simp#    documentation and/or other materials provided with the distribution.
13210036Simp#
14210036Simp# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15210036Simp# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16210036Simp# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17210036Simp# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18210036Simp# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19210036Simp# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20210036Simp# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21210036Simp# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22210036Simp# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23210036Simp# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24210036Simp# SUCH DAMAGE.
25210036Simp#
26210036Simp# $FreeBSD: head/usr.sbin/pc-sysinstall/backend/functions-packages.sh 211486 2010-08-19 06:01:25Z imp $
27210036Simp
28210036Simp# Functions which runs commands on the system
29210036Simp
30210036Simp. ${BACKEND}/functions.sh
31210036Simp. ${BACKEND}/functions-parse.sh
32210036Simp. ${BACKEND}/functions-ftp.sh
33210036Simp
34210036Simp
35211486Simpget_package_index_by_ftp()
36210036Simp{
37211486Simp	local INDEX_FILE
38211486Simp	local FTP_SERVER
39211486Simp
40211486Simp	FTP_SERVER="${1}"
41210036Simp	INDEX_FILE="INDEX"
42210036Simp	USE_BZIP2=0
43210036Simp
44210036Simp	if [ -f "/usr/bin/bzip2" ]
45210036Simp	then
46210036Simp		INDEX_FILE="${INDEX_FILE}.bz2"
47210036Simp		USE_BZIP2=1
48210036Simp	fi
49210036Simp
50211486Simp	INDEX_PATH="${CONFDIR}/${INDEX_FILE}"
51211486Simp	fetch_file "${FTP_SERVER}/${INDEX_FILE}" "${INDEX_PATH}" "1"
52211486Simp	if [ -f "${INDEX_PATH}" ] && [ "${USE_BZIP2}" -eq "1" ]
53211486Simp	then
54211486Simp		bzip2 -d "${INDEX_PATH}"
55211486Simp	fi
56211486Simp};
57211485Simp
58211486Simpget_package_index_by_fs()
59211486Simp{
60211486Simp	local INDEX_FILE
61211486Simp
62211486Simp	INDEX_FILE="${CDMNT}/packages/INDEX"
63211486Simp	fetch_file "${INDEX_FILE}" "${CONFDIR}/" "0"
64211486Simp};
65211486Simp
66211486Simpget_package_index()
67211486Simp{
68211486Simp	RES=0
69211486Simp
70211486Simp	if [ -z "${INSTALLMODE}" ]
71210036Simp	then
72211486Simp		get_ftp_mirror
73211486Simp		FTPHOST="${VAL}"
74211486Simp
75211486Simp		FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
76211486Simp		FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
77211486Simp
78211486Simp		get_package_index_by_ftp "${FTPPATH}"
79211486Simp
80211486Simp	else
81211486Simp		get_value_from_cfg ftpHost
82211486Simp		if [ -z "$VAL" ]
83211486Simp		then
84211486Simp			exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
85211486Simp		fi
86211486Simp		FTPHOST="${VAL}"
87211486Simp
88211486Simp		get_value_from_cfg ftpDir
89211486Simp		if [ -z "$VAL" ]
90211486Simp		then
91211486Simp			exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
92211486Simp		fi
93211486Simp		FTPDIR="${VAL}"
94211486Simp
95211486Simp		FTPPATH="ftp://${FTPHOST}${FTPDIR}"
96211486Simp
97211486Simp		case "${INSTALLMEDIUM}" in
98211486Simp		usb|dvd) get_package_index_by_fs
99211486Simp			;;
100211486Simp		ftp) get_package_index_by_ftp "${FTPPATH}"
101211486Simp			;;
102211486Simp		*) RES=1
103211486Simp			;;
104211486Simp		esac
105211486Simp
106210036Simp	fi
107211486Simp
108211486Simp	return ${RES}
109211485Simp};
110210036Simp
111210036Simpparse_package_index()
112210036Simp{
113210036Simp	INDEX_FILE="${PKGDIR}/INDEX"
114210036Simp
115210036Simp	exec 3<&0
116210036Simp	exec 0<"${INDEX_FILE}"
117210036Simp
118210036Simp	while read -r line
119210036Simp	do
120211485Simp		PKGNAME=""
121210036Simp		CATEGORY=""
122210036Simp		PACKAGE=""
123210036Simp		DESC=""
124211485Simp		DEPS=""
125210036Simp		i=0
126210036Simp
127210036Simp		SAVE_IFS="${IFS}"
128210036Simp		IFS="|"
129210036Simp
130210036Simp		for part in ${line}
131210036Simp		do
132211485Simp			if [ "${i}" -eq "0" ]
133210036Simp			then
134211485Simp				PKGNAME="${part}"
135211485Simp
136211485Simp			elif [ "${i}" -eq "1" ]
137211485Simp			then
138210036Simp				PACKAGE=`basename "${part}"`
139210036Simp
140210036Simp			elif [ "${i}" -eq "3" ]
141210036Simp			then
142210036Simp				DESC="${part}"
143210036Simp
144210036Simp			elif [ "${i}" -eq "6" ]
145210036Simp			then
146210036Simp				CATEGORY=`echo "${part}" | cut -f1 -d' '`
147211485Simp
148211485Simp			elif [ "${i}" -eq "8" ]
149211485Simp			then
150211485Simp				DEPS="${part}"
151210036Simp			fi
152210036Simp
153210036Simp			i=$((i+1))
154210036Simp		done
155210036Simp
156210036Simp		echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
157211485Simp		echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps"
158211485Simp
159210036Simp		IFS="${SAVE_IFS}"
160210036Simp	done
161210036Simp
162210036Simp	exec 0<&3
163211485Simp};
164210036Simp
165210036Simpshow_package_file()
166210036Simp{
167210036Simp	PKGFILE="${1}"
168210036Simp
169211486Simp	echo "Available Packages:"
170211486Simp
171210036Simp	exec 3<&0
172210036Simp	exec 0<"${PKGFILE}"
173210036Simp
174210036Simp	while read -r line
175210036Simp	do
176210036Simp		CATEGORY=`echo "${line}" | cut -f1 -d'|'`
177210036Simp		PACKAGE=`echo "${line}" | cut -f2 -d'|'`
178210036Simp		DESC=`echo "${line}" | cut -f3 -d'|'`
179210036Simp
180210036Simp		echo "${CATEGORY}/${PACKAGE}:${DESC}"
181210036Simp	done
182210036Simp
183210036Simp	exec 0<&3
184211485Simp};
185210036Simp
186210036Simpshow_packages_by_category()
187210036Simp{
188210036Simp	CATEGORY="${1}"
189210036Simp	INDEX_FILE="${PKGDIR}/INDEX.parsed"
190210036Simp	TMPFILE="/tmp/.pkg.cat"
191210036Simp
192210036Simp	grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
193210036Simp	show_package_file "${TMPFILE}"
194210036Simp	rm "${TMPFILE}"
195211485Simp};
196210036Simp
197210036Simpshow_package_by_name()
198210036Simp{
199210036Simp	CATEGORY="${1}"
200210036Simp	PACKAGE="${2}"
201210036Simp	INDEX_FILE="${PKGDIR}/INDEX.parsed"
202210036Simp	TMPFILE="/tmp/.pkg.cat.pak"
203210036Simp
204210036Simp	grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
205210036Simp	show_package_file "${TMPFILE}"
206210036Simp	rm "${TMPFILE}"
207211485Simp};
208210036Simp
209210036Simpshow_packages()
210210036Simp{
211210036Simp	show_package_file "${PKGDIR}/INDEX.parsed"
212211485Simp};
213211485Simp
214211485Simpget_package_dependencies()
215211485Simp{
216211485Simp	PACKAGE="${1}"
217211485Simp	LONG="${2:-0}"
218211485Simp	RES=0
219211485Simp
220211485Simp	INDEX_FILE="${PKGDIR}/INDEX.deps"
221211485Simp	REGEX="^${PACKAGE}|"
222211485Simp
223211485Simp	if [ "${LONG}" -ne "0" ]
224211485Simp	then
225211485Simp		REGEX="^.*|${PACKAGE}|"
226211485Simp	fi
227211485Simp
228211485Simp	LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
229211485Simp	DEPS=`echo "${LINE}"|cut -f3 -d'|'`
230211485Simp
231211485Simp	VAL="${DEPS}"
232211485Simp	export VAL
233211485Simp
234211485Simp	if [ -z "${VAL}" ]
235211485Simp	then
236211485Simp		RES=1
237211485Simp	fi
238211485Simp
239211485Simp	return ${RES}
240211485Simp};
241211485Simp
242211485Simpget_package_name()
243211485Simp{
244211485Simp	PACKAGE="${1}"
245211485Simp	RES=0
246211485Simp
247211485Simp	INDEX_FILE="${PKGDIR}/INDEX.deps"
248211485Simp	REGEX="^${PACKAGE}|"
249211485Simp	
250211485Simp	LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
251211485Simp	NAME=`echo "${LINE}"|cut -f2 -d'|'`
252211485Simp
253211485Simp	VAL="${NAME}"
254211485Simp	export VAL
255211485Simp
256211485Simp	if [ -z "${VAL}" ]
257211485Simp	then
258211485Simp		RES=1
259211485Simp	fi
260211485Simp
261211485Simp	return ${RES}
262211485Simp};
263211485Simp
264211485Simpget_package_short_name()
265211485Simp{
266211485Simp	PACKAGE="${1}"
267211485Simp	RES=0
268211485Simp
269211485Simp	INDEX_FILE="${PKGDIR}/INDEX.deps"
270211485Simp	REGEX="^.*|${PACKAGE}|"
271211485Simp	
272211485Simp	LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
273211485Simp	NAME=`echo "${LINE}"|cut -f1 -d'|'`
274211485Simp
275211485Simp	VAL="${NAME}"
276211485Simp	export VAL
277211485Simp
278211485Simp	if [ -z "${VAL}" ]
279211485Simp	then
280211485Simp		RES=1
281211485Simp	fi
282211485Simp
283211485Simp	return ${RES}
284211485Simp};
285211485Simp
286211485Simpget_package_category()
287211485Simp{
288211485Simp	PACKAGE="${1}"
289211485Simp	INDEX_FILE="${PKGDIR}/INDEX.parsed"
290211485Simp	RES=0
291211485Simp
292211485Simp	LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
293211485Simp	NAME=`echo "${LINE}"|cut -f1 -d'|'`
294211485Simp
295211485Simp	VAL="${NAME}"
296211485Simp	export VAL
297211485Simp
298211485Simp	if [ -z "${VAL}" ]
299211485Simp	then
300211485Simp		RES=1
301211485Simp	fi
302211485Simp
303211485Simp	return ${RES}
304211485Simp};
305211485Simp
306211486Simpfetch_package_by_ftp()
307211485Simp{
308211485Simp	CATEGORY="${1}"
309211485Simp	PACKAGE="${2}"
310211486Simp	SAVEDIR="${3}"
311211485Simp
312211486Simp	get_value_from_cfg ftpHost
313211486Simp	if [ -z "$VAL" ]
314211486Simp	then
315211486Simp		exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
316211486Simp	fi
317211486Simp	FTPHOST="${VAL}"
318211485Simp
319211486Simp	get_value_from_cfg ftpDir
320211486Simp	if [ -z "$VAL" ]
321211486Simp	then
322211486Simp		exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
323211486Simp	fi
324211486Simp	FTPDIR="${VAL}"
325211486Simp
326211485Simp	PACKAGE="${PACKAGE}.tbz"
327211486Simp	FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
328211486Simp
329211486Simp	if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
330211485Simp	then
331211485Simp		PKGPATH="${CATEGORY}/${PACKAGE}"
332211486Simp		FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
333211486Simp		fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
334211485Simp	fi
335211485Simp};
336211486Simp
337211486Simpfetch_package_by_fs()
338211486Simp{
339211486Simp	CATEGORY="${1}"
340211486Simp	PACKAGE="${2}"
341211486Simp	SAVEDIR="${3}"
342211486Simp
343211486Simp	PACKAGE="${PACKAGE}.tbz"
344211486Simp	if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
345211486Simp	then
346211486Simp		fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0"
347211486Simp	fi
348211486Simp};
349211486Simp
350211486Simpfetch_package()
351211486Simp{
352211486Simp	CATEGORY="${1}"
353211486Simp	PACKAGE="${2}"
354211486Simp	SAVEDIR="${3}"
355211486Simp
356211486Simp	case "${INSTALLMEDIUM}" in
357211486Simp	usb|dvd)
358211486Simp		fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}"
359211486Simp		;;
360211486Simp	ftp)
361211486Simp		fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}"
362211486Simp		;;
363211486Simp	esac
364211486Simp};
365