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$
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{
37211730Simp  local INDEX_FILE
38211730Simp  local FTP_SERVER
39211486Simp
40211730Simp  FTP_SERVER="${1}"
41211730Simp  INDEX_FILE="INDEX"
42211730Simp  USE_BZIP2=0
43210036Simp
44211730Simp  if [ -f "/usr/bin/bzip2" ]
45211730Simp  then
46211730Simp    INDEX_FILE="${INDEX_FILE}.bz2"
47211730Simp    USE_BZIP2=1
48211730Simp  fi
49210036Simp
50211730Simp  INDEX_PATH="${CONFDIR}/${INDEX_FILE}"
51211730Simp  fetch_file "${FTP_SERVER}/${INDEX_FILE}" "${INDEX_PATH}" "1"
52211730Simp  if [ -f "${INDEX_PATH}" ] && [ "${USE_BZIP2}" -eq "1" ]
53211730Simp  then
54211730Simp    bzip2 -d "${INDEX_PATH}"
55211730Simp  fi
56211486Simp};
57211485Simp
58211486Simpget_package_index_by_fs()
59211486Simp{
60211730Simp  local INDEX_FILE
61211486Simp
62211730Simp  INDEX_FILE="${CDMNT}/packages/INDEX"
63211730Simp  fetch_file "${INDEX_FILE}" "${CONFDIR}/" "0"
64211486Simp};
65211486Simp
66211487Simpget_package_index_size()
67211487Simp{
68211730Simp  if [ -f "${CONFDIR}/INDEX" ]
69211730Simp  then
70211730Simp    SIZE=`ls -l ${CONFDIR}/INDEX | awk '{ print $5 }'`
71211730Simp  else
72211730Simp    get_ftp_mirror
73211730Simp    FTPHOST="${VAL}"
74211487Simp
75211730Simp    FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
76211730Simp    FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
77211487Simp
78211730Simp    fetch -s "${FTPPATH}/INDEX.bz2"
79211730Simp  fi
80211487Simp};
81211487Simp
82211486Simpget_package_index()
83211486Simp{
84211730Simp  RES=0
85211486Simp
86211730Simp  if [ -z "${INSTALLMODE}" ]
87211730Simp  then
88211730Simp    get_ftp_mirror
89211730Simp    FTPHOST="${VAL}"
90211486Simp
91211730Simp    FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
92211730Simp    FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
93211486Simp
94211730Simp    get_package_index_by_ftp "${FTPPATH}"
95211486Simp
96211730Simp  else
97211730Simp    get_value_from_cfg ftpHost
98211730Simp    if [ -z "$VAL" ]
99211730Simp    then
100211730Simp      exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
101211730Simp    fi
102211486Simp
103211730Simp    FTPHOST="${VAL}"
104211486Simp
105211730Simp    get_value_from_cfg ftpDir
106211730Simp    if [ -z "$VAL" ]
107211730Simp    then
108211730Simp      exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
109211730Simp    fi
110211486Simp
111211730Simp    FTPDIR="${VAL}"
112211730Simp    FTPPATH="ftp://${FTPHOST}${FTPDIR}"
113211486Simp
114211730Simp    case "${INSTALLMEDIUM}" in
115211730Simp      usb|dvd) get_package_index_by_fs ;;
116212337Simp      ftp) get_package_index_by_ftp "${FTPPATH}" ;;
117212337Simp      sftp) ;;
118211730Simp      *) RES=1 ;;
119211730Simp    esac
120211486Simp
121211730Simp  fi
122211730Simp
123211730Simp  return ${RES}
124211485Simp};
125210036Simp
126210036Simpparse_package_index()
127210036Simp{
128211730Simp  INDEX_FILE="${PKGDIR}/INDEX"
129210036Simp
130211730Simp  exec 3<&0
131211730Simp  exec 0<"${INDEX_FILE}"
132210036Simp
133211730Simp  while read -r line
134211730Simp  do
135211730Simp    PKGNAME=""
136211730Simp    CATEGORY=""
137211730Simp    PACKAGE=""
138211730Simp    DESC=""
139211730Simp    DEPS=""
140211730Simp    i=0
141210036Simp
142211730Simp    SAVE_IFS="${IFS}"
143211730Simp    IFS="|"
144210036Simp
145211730Simp    for part in ${line}
146211730Simp    do
147220059Sjpaetzel      if [ ${i} -eq 0 ]
148211730Simp      then
149211730Simp        PKGNAME="${part}"
150211485Simp
151220059Sjpaetzel      elif [ ${i} -eq 1 ]
152211730Simp      then
153211730Simp        PACKAGE=`basename "${part}"`
154210036Simp
155220059Sjpaetzel      elif [ ${i} -eq 3 ]
156211730Simp      then
157211730Simp        DESC="${part}"
158210036Simp
159220059Sjpaetzel      elif [ ${i} -eq 6 ]
160211730Simp      then
161211730Simp        CATEGORY=`echo "${part}" | cut -f1 -d' '`
162211485Simp
163220059Sjpaetzel      elif [ ${i} -eq 8 ]
164211730Simp      then
165211730Simp        DEPS="${part}"
166211730Simp      fi
167210036Simp
168211730Simp      i=$((i+1))
169211730Simp    done
170210036Simp
171211730Simp    echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
172211730Simp    echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps"
173211485Simp
174211730Simp    IFS="${SAVE_IFS}"
175211730Simp  done
176210036Simp
177211730Simp  exec 0<&3
178211485Simp};
179210036Simp
180210036Simpshow_package_file()
181210036Simp{
182211730Simp  PKGFILE="${1}"
183210036Simp
184211730Simp  echo "Available Packages:"
185211486Simp
186211730Simp  exec 3<&0
187211730Simp  exec 0<"${PKGFILE}"
188210036Simp
189211730Simp  while read -r line
190211730Simp  do
191211730Simp    CATEGORY=`echo "${line}" | cut -f1 -d'|'`
192211730Simp    PACKAGE=`echo "${line}" | cut -f2 -d'|'`
193211730Simp    DESC=`echo "${line}" | cut -f3 -d'|'`
194210036Simp
195211730Simp    echo "${CATEGORY}/${PACKAGE}:${DESC}"
196211730Simp  done
197210036Simp
198211730Simp  exec 0<&3
199211485Simp};
200210036Simp
201210036Simpshow_packages_by_category()
202210036Simp{
203211730Simp  CATEGORY="${1}"
204211730Simp  INDEX_FILE="${PKGDIR}/INDEX.parsed"
205211730Simp  TMPFILE="/tmp/.pkg.cat"
206210036Simp
207211730Simp  grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
208211730Simp  show_package_file "${TMPFILE}"
209211730Simp  rm "${TMPFILE}"
210211485Simp};
211210036Simp
212210036Simpshow_package_by_name()
213210036Simp{
214211730Simp  CATEGORY="${1}"
215211730Simp  PACKAGE="${2}"
216211730Simp  INDEX_FILE="${PKGDIR}/INDEX.parsed"
217211730Simp  TMPFILE="/tmp/.pkg.cat.pak"
218210036Simp
219211730Simp  grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
220211730Simp  show_package_file "${TMPFILE}"
221211730Simp  rm "${TMPFILE}"
222211485Simp};
223210036Simp
224210036Simpshow_packages()
225210036Simp{
226211730Simp  show_package_file "${PKGDIR}/INDEX.parsed"
227211485Simp};
228211485Simp
229211485Simpget_package_dependencies()
230211485Simp{
231211730Simp  PACKAGE="${1}"
232211730Simp  LONG="${2:-0}"
233211730Simp  RES=0
234211485Simp
235211730Simp  INDEX_FILE="${PKGDIR}/INDEX.deps"
236211730Simp  REGEX="^${PACKAGE}|"
237211485Simp
238220059Sjpaetzel  if [ ${LONG} -ne 0 ]
239211730Simp  then
240211730Simp    REGEX="^.*|${PACKAGE}|"
241211730Simp  fi
242211485Simp
243211730Simp  LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
244211730Simp  DEPS=`echo "${LINE}"|cut -f3 -d'|'`
245211485Simp
246220059Sjpaetzel  export VAL="${DEPS}"
247211485Simp
248211730Simp  if [ -z "${VAL}" ]
249211730Simp  then
250211730Simp    RES=1
251211730Simp  fi
252211485Simp
253211730Simp  return ${RES}
254211485Simp};
255211485Simp
256211485Simpget_package_name()
257211485Simp{
258211730Simp  PACKAGE="${1}"
259211730Simp  RES=0
260211485Simp
261211730Simp  INDEX_FILE="${PKGDIR}/INDEX.deps"
262211730Simp  REGEX="^${PACKAGE}|"
263211485Simp	
264211730Simp  LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
265211730Simp  NAME=`echo "${LINE}"|cut -f2 -d'|'`
266211485Simp
267220059Sjpaetzel  export VAL="${NAME}"
268211485Simp
269211730Simp  if [ -z "${VAL}" ]
270211730Simp  then
271211730Simp    RES=1
272211730Simp  fi
273211485Simp
274211730Simp  return ${RES}
275211485Simp};
276211485Simp
277211485Simpget_package_short_name()
278211485Simp{
279211730Simp  PACKAGE="${1}"
280211730Simp  RES=0
281211485Simp
282211730Simp  INDEX_FILE="${PKGDIR}/INDEX.deps"
283211730Simp  REGEX="^.*|${PACKAGE}|"
284211485Simp	
285211730Simp  LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
286211730Simp  NAME=`echo "${LINE}"|cut -f1 -d'|'`
287211485Simp
288220059Sjpaetzel  export VAL="${NAME}"
289211485Simp
290211730Simp  if [ -z "${VAL}" ]
291211730Simp  then
292211730Simp    RES=1
293211730Simp  fi
294211485Simp
295211730Simp  return ${RES}
296211485Simp};
297211485Simp
298211485Simpget_package_category()
299211485Simp{
300211730Simp  PACKAGE="${1}"
301211730Simp  INDEX_FILE="${PKGDIR}/INDEX.parsed"
302211730Simp  RES=0
303211485Simp
304211730Simp  LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
305211730Simp  NAME=`echo "${LINE}"|cut -f1 -d'|'`
306211485Simp
307220059Sjpaetzel  export VAL="${NAME}"
308211485Simp
309211730Simp  if [ -z "${VAL}" ]
310211730Simp  then
311211730Simp    RES=1
312211730Simp  fi
313211485Simp
314211730Simp  return ${RES}
315211485Simp};
316211485Simp
317211486Simpfetch_package_by_ftp()
318211485Simp{
319211730Simp  CATEGORY="${1}"
320211730Simp  PACKAGE="${2}"
321211730Simp  SAVEDIR="${3}"
322211485Simp
323211730Simp  get_value_from_cfg ftpHost
324211730Simp  if [ -z "$VAL" ]
325211730Simp  then
326211730Simp    exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
327211730Simp  fi
328211730Simp  FTPHOST="${VAL}"
329211485Simp
330211730Simp  get_value_from_cfg ftpDir
331211730Simp  if [ -z "$VAL" ]
332211730Simp  then
333211730Simp    exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
334211730Simp  fi
335211730Simp  FTPDIR="${VAL}"
336211486Simp
337211730Simp  PACKAGE="${PACKAGE}.tbz"
338211730Simp  FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
339211486Simp
340211730Simp  if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
341211730Simp  then
342211730Simp    PKGPATH="${CATEGORY}/${PACKAGE}"
343211730Simp    FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
344211730Simp    fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
345211730Simp  fi
346211485Simp};
347211486Simp
348211486Simpfetch_package_by_fs()
349211486Simp{
350211730Simp  CATEGORY="${1}"
351211730Simp  PACKAGE="${2}"
352211730Simp  SAVEDIR="${3}"
353211486Simp
354211730Simp  PACKAGE="${PACKAGE}.tbz"
355211730Simp  if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
356211730Simp  then
357211730Simp    fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0"
358211730Simp  fi
359211486Simp};
360211486Simp
361211486Simpfetch_package()
362211486Simp{
363211730Simp  CATEGORY="${1}"
364211730Simp  PACKAGE="${2}"
365211730Simp  SAVEDIR="${3}"
366211486Simp
367211730Simp  case "${INSTALLMEDIUM}" in
368211730Simp    usb|dvd) fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
369212337Simp    ftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
370212337Simp    sftp) ;;
371211730Simp  esac
372211486Simp};
373