functions-packages.sh revision 211730
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 $
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}" ;;
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}" ;;
372    ftp|sftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
373  esac
374};
375