3 # Copyright (c) 2010 iXsystems, Inc. All rights reserved.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
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.
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
28 # Functions which runs commands on the system
30 . ${BACKEND}/functions.sh
31 . ${BACKEND}/functions-parse.sh
32 . ${BACKEND}/functions-ftp.sh
35 get_package_index_by_ftp()
44 if [ -f "/usr/bin/bzip2" ]
46 INDEX_FILE="${INDEX_FILE}.bz2"
48 INDEX_PATH="${INDEXFILE}.bz2"
50 INDEX_PATH="${INDEXFILE}"
53 fetch_file "${FTP_SERVER}/${INDEX_FILE}" "${INDEX_PATH}" "1"
54 if [ -f "${INDEX_PATH}" ] && [ "${USE_BZIP2}" -eq "1" ]
56 bzip2 -d "${INDEX_PATH}"
60 get_package_index_by_fs()
62 if [ "$INSTALLMEDIUM" = "local" ] ; then
63 INDEXFILE="${LOCALPATH}/packages/INDEX"
65 INDEXFILE="${CDMNT}/packages/INDEX"
69 get_package_index_size()
71 if [ -f "${INDEXFILE}" ]
73 SIZE=`ls -l ${INDEXFILE} | awk '{ print $5 }'`
78 FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
79 FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
81 fetch -s "${FTPPATH}/INDEX.bz2"
89 if [ -z "${INSTALLMODE}" ]
94 FTPDIR="/pub/FreeBSD/releases/${FBSD_ARCH}/${FBSD_BRANCH}"
95 FTPPATH="ftp://${FTPHOST}${FTPDIR}/packages"
97 get_package_index_by_ftp "${FTPPATH}"
101 case "${INSTALLMEDIUM}" in
102 usb|dvd|local) get_package_index_by_fs ;;
103 ftp) get_value_from_cfg ftpHost
104 if [ -z "$VAL" ]; then
105 exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!"
109 get_value_from_cfg ftpDir
110 if [ -z "$VAL" ]; then
111 exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!"
114 FTPPATH="ftp://${FTPHOST}${FTPDIR}"
115 get_package_index_by_ftp "${FTPPATH}" ;;
125 parse_package_index()
127 echo_log "Building package dep list.. Please wait.."
128 INDEX_FILE="${PKGDIR}/INDEX"
131 exec 0<"${INDEXFILE}"
153 PACKAGE=`basename "${part}"`
161 CATEGORY=`echo "${part}" | cut -f1 -d' '`
171 echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed"
172 echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps"
184 echo "Available Packages:"
191 CATEGORY=`echo "${line}" | cut -f1 -d'|'`
192 PACKAGE=`echo "${line}" | cut -f2 -d'|'`
193 DESC=`echo "${line}" | cut -f3 -d'|'`
195 echo "${CATEGORY}/${PACKAGE}:${DESC}"
201 show_packages_by_category()
204 INDEX_FILE="${PKGDIR}/INDEX.parsed"
205 TMPFILE="/tmp/.pkg.cat"
207 grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}"
208 show_package_file "${TMPFILE}"
212 show_package_by_name()
216 INDEX_FILE="${PKGDIR}/INDEX.parsed"
217 TMPFILE="/tmp/.pkg.cat.pak"
219 grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}"
220 show_package_file "${TMPFILE}"
226 show_package_file "${PKGDIR}/INDEX.parsed"
229 get_package_dependencies()
235 INDEX_FILE="${PKGDIR}/INDEX.deps"
240 REGEX="^.*|${PACKAGE}|"
243 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
244 DEPS=`echo "${LINE}"|cut -f3 -d'|'`
262 # If we are on a local medium, we can parse the Latest/ directory
263 if [ "${INSTALLMEDIUM}" != "ftp" ] ; then
264 case "${INSTALLMEDIUM}" in
265 usb|dvd) PKGPTH="${CDMNT}/packages" ;;
266 *) PKGPTH="${LOCALPATH}/packages" ;;
269 # Check the /Latest dir for generic names, then look for specific version in All/
270 if [ -e "${PKGPTH}/Latest/${PACKAGE}.${PKGEXT}" ] ; then
271 NAME=`ls -al ${PKGPTH}/Latest/${PACKAGE}.${PKGEXT} 2>/dev/null | cut -d '>' -f 2 | rev | cut -f1 -d'/' | rev | tr -s ' '`
273 NAME=`ls -al ${PKGPTH}/All/${PACKAGE}.${PKGEXT} 2>/dev/null | cut -d '>' -f 2 | rev | cut -f1 -d'/' | rev | tr -s ' '`
277 # Doing remote fetch, we we will look up, but some generic names like
278 # "perl" wont work, since we don't know the default version
279 INDEX_FILE="${PKGDIR}/INDEX.deps"
282 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
283 NAME=`echo "${LINE}"|cut -f2 -d'|'`
295 get_package_short_name()
300 INDEX_FILE="${PKGDIR}/INDEX.deps"
301 REGEX="^.*|${PACKAGE}|"
303 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
304 NAME=`echo "${LINE}"|cut -f1 -d'|'`
316 get_package_category()
319 INDEX_FILE="${PKGDIR}/INDEX.parsed"
322 LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null`
323 NAME=`echo "${LINE}"|cut -f1 -d'|'`
335 fetch_package_by_ftp()
341 get_value_from_cfg ftpHost
344 exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!"
348 get_value_from_cfg ftpDir
351 exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!"
355 PACKAGE="${PACKAGE}.${PKGEXT}"
356 FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
358 if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
360 PKGPATH="${CATEGORY}/${PACKAGE}"
361 FTP_PATH="${FTP_HOST}/packages/${PKGPATH}"
362 fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0"
372 # Fetch package, but skip if installing from local media
373 case "${INSTALLMEDIUM}" in
374 usb|dvd|local) return ;;
375 ftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
382 # Check if we need to boot-strap pkgng
383 if run_chroot_cmd "which pkg-static" >/dev/null 2>/dev/null
389 # Ok, lets boot-strap this sucker
390 echo_log "Bootstraping pkgng.."
391 fetch_package "Latest" "pkg" "${PKGDLDIR}"
393 # Figure out real location of "pkg" package
394 case "${INSTALLMEDIUM}" in
395 usb|dvd|local) PKGPTH="${PKGTMPDIR}/Latest/pkg.${PKGEXT}" ;;
396 *) PKGPTH="${PKGTMPDIR}/pkg.${PKGEXT}" ;;
398 rc_halt "pkg -c ${FSMNT} add ${PKGPTH}" ; run_chroot_cmd "pkg2ng"
401 get_package_location()
403 case "${INSTALLMEDIUM}" in
404 usb|dvd) rc_halt "mount_nullfs ${CDMNT}/packages ${FSMNT}${PKGTMPDIR}"
405 PKGDLDIR="${FSMNT}${PKGTMPDIR}/All" ;;
406 local) rc_halt "mount_nullfs ${LOCALPATH}/packages ${FSMNT}${PKGTMPDIR}"
407 PKGDLDIR="${FSMNT}${PKGTMPDIR}/All" ;;
408 *) PKGDLDIR="${FSMNT}${PKGTMPDIR}" ;;