functions-packages.sh revision 211485
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 211485 2010-08-19 05:59:27Z 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()
36{
37	INDEX_FILE="INDEX"
38	USE_BZIP2=0
39
40	get_ftp_mirror
41	FTP_SERVER="${VAL}"
42
43	FTP_DIR="ftp://${FTP_SERVER}/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}/packages"
44
45	if [ -f "/usr/bin/bzip2" ]
46	then
47		INDEX_FILE="${INDEX_FILE}.bz2"
48		USE_BZIP2=1
49	fi
50
51	fetch_file "${FTP_DIR}/${INDEX_FILE}" "${PKGDIR}/${INDEX_FILE}" "1"
52
53	HERE=`pwd`
54	cd "${PKGDIR}"
55	if [ -f "${INDEX_FILE}" ] && [ "${USE_BZIP2}" -eq "1" ]
56	then
57		bzip2 -d "${INDEX_FILE}"
58	fi
59	cd "${HERE}"
60};
61
62parse_package_index()
63{
64	INDEX_FILE="${PKGDIR}/INDEX"
65
66	exec 3<&0
67	exec 0<"${INDEX_FILE}"
68
69	while read -r line
70	do
71		PKGNAME=""
72		CATEGORY=""
73		PACKAGE=""
74		DESC=""
75		DEPS=""
76		i=0
77
78		SAVE_IFS="${IFS}"
79		IFS="|"
80
81		for part in ${line}
82		do
83			if [ "${i}" -eq "0" ]
84			then
85				PKGNAME="${part}"
86
87			elif [ "${i}" -eq "1" ]
88			then
89				PACKAGE=`basename "${part}"`
90
91			elif [ "${i}" -eq "3" ]
92			then
93				DESC="${part}"
94
95			elif [ "${i}" -eq "6" ]
96			then
97				CATEGORY=`echo "${part}" | cut -f1 -d' '`
98
99			elif [ "${i}" -eq "8" ]
100			then
101				DEPS="${part}"
102			fi
103
104			i=$((i+1))
105		done
106
107		echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
108		echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps"
109
110		IFS="${SAVE_IFS}"
111	done
112
113	exec 0<&3
114};
115
116show_package_file()
117{
118	PKGFILE="${1}"
119
120	exec 3<&0
121	exec 0<"${PKGFILE}"
122
123	while read -r line
124	do
125		CATEGORY=`echo "${line}" | cut -f1 -d'|'`
126		PACKAGE=`echo "${line}" | cut -f2 -d'|'`
127		DESC=`echo "${line}" | cut -f3 -d'|'`
128
129		echo "${CATEGORY}/${PACKAGE}:${DESC}"
130	done
131
132	exec 0<&3
133};
134
135show_packages_by_category()
136{
137	CATEGORY="${1}"
138	INDEX_FILE="${PKGDIR}/INDEX.parsed"
139	TMPFILE="/tmp/.pkg.cat"
140
141	grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
142	show_package_file "${TMPFILE}"
143	rm "${TMPFILE}"
144};
145
146show_package_by_name()
147{
148	CATEGORY="${1}"
149	PACKAGE="${2}"
150	INDEX_FILE="${PKGDIR}/INDEX.parsed"
151	TMPFILE="/tmp/.pkg.cat.pak"
152
153	grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
154	show_package_file "${TMPFILE}"
155	rm "${TMPFILE}"
156};
157
158show_packages()
159{
160	show_package_file "${PKGDIR}/INDEX.parsed"
161};
162
163get_package_dependencies()
164{
165	PACKAGE="${1}"
166	LONG="${2:-0}"
167	RES=0
168
169	INDEX_FILE="${PKGDIR}/INDEX.deps"
170	REGEX="^${PACKAGE}|"
171
172	if [ "${LONG}" -ne "0" ]
173	then
174		REGEX="^.*|${PACKAGE}|"
175	fi
176
177	LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
178	DEPS=`echo "${LINE}"|cut -f3 -d'|'`
179
180	VAL="${DEPS}"
181	export VAL
182
183	if [ -z "${VAL}" ]
184	then
185		RES=1
186	fi
187
188	return ${RES}
189};
190
191get_package_name()
192{
193	PACKAGE="${1}"
194	RES=0
195
196	INDEX_FILE="${PKGDIR}/INDEX.deps"
197	REGEX="^${PACKAGE}|"
198	
199	LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
200	NAME=`echo "${LINE}"|cut -f2 -d'|'`
201
202	VAL="${NAME}"
203	export VAL
204
205	if [ -z "${VAL}" ]
206	then
207		RES=1
208	fi
209
210	return ${RES}
211};
212
213get_package_short_name()
214{
215	PACKAGE="${1}"
216	RES=0
217
218	INDEX_FILE="${PKGDIR}/INDEX.deps"
219	REGEX="^.*|${PACKAGE}|"
220	
221	LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
222	NAME=`echo "${LINE}"|cut -f1 -d'|'`
223
224	VAL="${NAME}"
225	export VAL
226
227	if [ -z "${VAL}" ]
228	then
229		RES=1
230	fi
231
232	return ${RES}
233};
234
235get_package_category()
236{
237	PACKAGE="${1}"
238	INDEX_FILE="${PKGDIR}/INDEX.parsed"
239	RES=0
240
241	LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
242	NAME=`echo "${LINE}"|cut -f1 -d'|'`
243
244	VAL="${NAME}"
245	export VAL
246
247	if [ -z "${VAL}" ]
248	then
249		RES=1
250	fi
251
252	return ${RES}
253};
254
255fetch_package()
256{
257	CATEGORY="${1}"
258	PACKAGE="${2}"
259
260	get_ftp_mirror
261	FTP_SERVER="${VAL}"
262
263	PACKAGE="${PACKAGE}.tbz"
264	if [ ! -f "${PKGTMPDIR}/${PACKAGE}" ]
265	then
266		PKGPATH="${CATEGORY}/${PACKAGE}"
267		FTP_PATH="ftp://${FTP_SERVER}/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}/packages/${PKGPATH}"
268		fetch_file "${FTP_PATH}" "${PKGTMPDIR}/" "0"
269	fi
270};
271