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
48247734Sjpaetzel    INDEX_PATH="${INDEXFILE}.bz2"
49247734Sjpaetzel  else
50247734Sjpaetzel    INDEX_PATH="${INDEXFILE}"
51211730Simp  fi
52210036Simp
53211730Simp  fetch_file "${FTP_SERVER}/${INDEX_FILE}" "${INDEX_PATH}" "1"
54211730Simp  if [ -f "${INDEX_PATH}" ] && [ "${USE_BZIP2}" -eq "1" ]
55211730Simp  then
56211730Simp    bzip2 -d "${INDEX_PATH}"
57211730Simp  fi
58211486Simp};
59211485Simp
60211486Simpget_package_index_by_fs()
61211486Simp{
62247734Sjpaetzel  if [ "$INSTALLMEDIUM" = "local" ] ; then
63247734Sjpaetzel    INDEXFILE="${LOCALPATH}/packages/INDEX"
64247734Sjpaetzel  else
65247734Sjpaetzel    INDEXFILE="${CDMNT}/packages/INDEX"
66247734Sjpaetzel  fi
67211486Simp};
68211486Simp
69211487Simpget_package_index_size()
70211487Simp{
71247734Sjpaetzel  if [ -f "${INDEXFILE}" ]
72211730Simp  then
73247734Sjpaetzel    SIZE=`ls -l ${INDEXFILE} | awk '{ print $5 }'`
74211730Simp  else
75211730Simp    get_ftp_mirror
76211730Simp    FTPHOST="${VAL}"
77211487Simp
78211730Simp    FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
79211730Simp    FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
80211487Simp
81211730Simp    fetch -s "${FTPPATH}/INDEX.bz2"
82211730Simp  fi
83211487Simp};
84211487Simp
85211486Simpget_package_index()
86211486Simp{
87211730Simp  RES=0
88211486Simp
89211730Simp  if [ -z "${INSTALLMODE}" ]
90211730Simp  then
91211730Simp    get_ftp_mirror
92211730Simp    FTPHOST="${VAL}"
93211486Simp
94211730Simp    FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
95211730Simp    FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
96211486Simp
97211730Simp    get_package_index_by_ftp "${FTPPATH}"
98211486Simp
99211730Simp  else
100211486Simp
101247734Sjpaetzel    case "${INSTALLMEDIUM}" in
102247734Sjpaetzel    usb|dvd|local) get_package_index_by_fs ;;
103247734Sjpaetzel              ftp) get_value_from_cfg ftpHost
104247734Sjpaetzel    		   if [ -z "$VAL" ]; then
105247734Sjpaetzel      		     exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
106247734Sjpaetzel    	  	   fi
107247734Sjpaetzel    		   FTPHOST="${VAL}"
108211486Simp
109247734Sjpaetzel    		   get_value_from_cfg ftpDir
110247734Sjpaetzel    		   if [ -z "$VAL" ]; then
111247734Sjpaetzel      		     exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
112247734Sjpaetzel    		   fi
113247734Sjpaetzel    	 	   FTPDIR="${VAL}"
114247734Sjpaetzel    		   FTPPATH="ftp://${FTPHOST}${FTPDIR}"
115247734Sjpaetzel                   get_package_index_by_ftp "${FTPPATH}" ;;
116247734Sjpaetzel             sftp) ;;
117247734Sjpaetzel                *) RES=1 ;;
118211730Simp    esac
119211486Simp
120211730Simp  fi
121211730Simp
122211730Simp  return ${RES}
123211485Simp};
124210036Simp
125210036Simpparse_package_index()
126210036Simp{
127247734Sjpaetzel  echo_log "Building package dep list.. Please wait.."
128211730Simp  INDEX_FILE="${PKGDIR}/INDEX"
129210036Simp
130211730Simp  exec 3<&0
131247734Sjpaetzel  exec 0<"${INDEXFILE}"
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
260247734Sjpaetzel  local PKGPTH
261211485Simp
262247734Sjpaetzel  # If we are on a local medium, we can parse the Latest/ directory
263247734Sjpaetzel  if [ "${INSTALLMEDIUM}" != "ftp" ] ; then
264247734Sjpaetzel    case "${INSTALLMEDIUM}" in
265247734Sjpaetzel      usb|dvd) PKGPTH="${CDMNT}/packages" ;; 
266247734Sjpaetzel        *) PKGPTH="${LOCALPATH}/packages" ;;
267247734Sjpaetzel    esac
268247734Sjpaetzel    
269247734Sjpaetzel    # Check the /Latest dir for generic names, then look for specific version in All/
270247734Sjpaetzel    if [ -e "${PKGPTH}/Latest/${PACKAGE}.${PKGEXT}" ] ; then
271247734Sjpaetzel       NAME=`ls -al ${PKGPTH}/Latest/${PACKAGE}.${PKGEXT} 2>/dev/null | cut -d '>' -f 2 | rev | cut -f1 -d'/' | rev | tr -s ' '`
272247734Sjpaetzel    else
273247734Sjpaetzel       NAME=`ls -al ${PKGPTH}/All/${PACKAGE}.${PKGEXT} 2>/dev/null | cut -d '>' -f 2 | rev | cut -f1 -d'/' | rev | tr -s ' '`
274247734Sjpaetzel    fi
275247734Sjpaetzel    export VAL="${NAME}"
276247734Sjpaetzel  else
277247734Sjpaetzel    # Doing remote fetch, we we will look up, but some generic names like
278247734Sjpaetzel    # "perl" wont work, since we don't know the default version
279247734Sjpaetzel    INDEX_FILE="${PKGDIR}/INDEX.deps"
280247734Sjpaetzel    REGEX="^${PACKAGE}|"
281211485Simp	
282247734Sjpaetzel    LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
283247734Sjpaetzel    NAME=`echo "${LINE}"|cut -f2 -d'|'`
284211485Simp
285247734Sjpaetzel    export VAL="${NAME}"
286247734Sjpaetzel  fi
287211485Simp
288211730Simp  if [ -z "${VAL}" ]
289211730Simp  then
290211730Simp    RES=1
291211730Simp  fi
292211730Simp  return ${RES}
293211485Simp};
294211485Simp
295211485Simpget_package_short_name()
296211485Simp{
297211730Simp  PACKAGE="${1}"
298211730Simp  RES=0
299211485Simp
300211730Simp  INDEX_FILE="${PKGDIR}/INDEX.deps"
301211730Simp  REGEX="^.*|${PACKAGE}|"
302211485Simp	
303211730Simp  LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
304211730Simp  NAME=`echo "${LINE}"|cut -f1 -d'|'`
305211485Simp
306220059Sjpaetzel  export VAL="${NAME}"
307211485Simp
308211730Simp  if [ -z "${VAL}" ]
309211730Simp  then
310211730Simp    RES=1
311211730Simp  fi
312211485Simp
313211730Simp  return ${RES}
314211485Simp};
315211485Simp
316211485Simpget_package_category()
317211485Simp{
318211730Simp  PACKAGE="${1}"
319211730Simp  INDEX_FILE="${PKGDIR}/INDEX.parsed"
320211730Simp  RES=0
321211485Simp
322211730Simp  LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
323211730Simp  NAME=`echo "${LINE}"|cut -f1 -d'|'`
324211485Simp
325220059Sjpaetzel  export VAL="${NAME}"
326211485Simp
327211730Simp  if [ -z "${VAL}" ]
328211730Simp  then
329211730Simp    RES=1
330211730Simp  fi
331211485Simp
332211730Simp  return ${RES}
333211485Simp};
334211485Simp
335211486Simpfetch_package_by_ftp()
336211485Simp{
337211730Simp  CATEGORY="${1}"
338211730Simp  PACKAGE="${2}"
339211730Simp  SAVEDIR="${3}"
340211485Simp
341211730Simp  get_value_from_cfg ftpHost
342211730Simp  if [ -z "$VAL" ]
343211730Simp  then
344211730Simp    exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 
345211730Simp  fi
346211730Simp  FTPHOST="${VAL}"
347211485Simp
348211730Simp  get_value_from_cfg ftpDir
349211730Simp  if [ -z "$VAL" ]
350211730Simp  then
351211730Simp    exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 
352211730Simp  fi
353211730Simp  FTPDIR="${VAL}"
354211486Simp
355247734Sjpaetzel  PACKAGE="${PACKAGE}.${PKGEXT}"
356211730Simp  FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
357211486Simp
358211730Simp  if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
359211730Simp  then
360211730Simp    PKGPATH="${CATEGORY}/${PACKAGE}"
361211730Simp    FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
362211730Simp    fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
363211730Simp  fi
364211485Simp};
365211486Simp
366247734Sjpaetzelfetch_package()
367211486Simp{
368211730Simp  CATEGORY="${1}"
369211730Simp  PACKAGE="${2}"
370211730Simp  SAVEDIR="${3}"
371211486Simp
372247734Sjpaetzel  # Fetch package, but skip if installing from local media
373247734Sjpaetzel  case "${INSTALLMEDIUM}" in
374247734Sjpaetzel  usb|dvd|local) return ;;
375247734Sjpaetzel    ftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
376247734Sjpaetzel    sftp) ;;
377247734Sjpaetzel  esac
378211486Simp};
379211486Simp
380247734Sjpaetzelbootstrap_pkgng()
381211486Simp{
382247734Sjpaetzel  # Check if we need to boot-strap pkgng
383247734Sjpaetzel  if run_chroot_cmd "which pkg-static" >/dev/null 2>/dev/null
384247734Sjpaetzel  then
385247734Sjpaetzel     return
386247734Sjpaetzel  fi
387247734Sjpaetzel  local PKGPTH
388211486Simp
389247734Sjpaetzel  # Ok, lets boot-strap this sucker
390247734Sjpaetzel  echo_log "Bootstraping pkgng.."
391247734Sjpaetzel  fetch_package "Latest" "pkg" "${PKGDLDIR}"
392247734Sjpaetzel
393247734Sjpaetzel  # Figure out real location of "pkg" package
394211730Simp  case "${INSTALLMEDIUM}" in
395247734Sjpaetzel    usb|dvd|local) PKGPTH="${PKGTMPDIR}/Latest/pkg.${PKGEXT}" ;;
396247734Sjpaetzel          *) PKGPTH="${PKGTMPDIR}/pkg.${PKGEXT}" ;;
397211730Simp  esac
398247734Sjpaetzel  rc_halt "pkg -c ${FSMNT} add ${PKGPTH}" ; run_chroot_cmd "pkg2ng"
399247734Sjpaetzel}
400247734Sjpaetzel
401247734Sjpaetzelget_package_location()
402247734Sjpaetzel{
403247734Sjpaetzel  case "${INSTALLMEDIUM}" in
404247734Sjpaetzel  usb|dvd) rc_halt "mount_nullfs ${CDMNT}/packages ${FSMNT}${PKGTMPDIR}"
405247734Sjpaetzel           PKGDLDIR="${FSMNT}${PKGTMPDIR}/All" ;;
406247734Sjpaetzel    local) rc_halt "mount_nullfs ${LOCALPATH}/packages ${FSMNT}${PKGTMPDIR}"
407247734Sjpaetzel           PKGDLDIR="${FSMNT}${PKGTMPDIR}/All" ;;
408247734Sjpaetzel        *) PKGDLDIR="${FSMNT}${PKGTMPDIR}" ;;
409247734Sjpaetzel  esac
410247734Sjpaetzel  export PKGDLDIR
411247734Sjpaetzel}
412