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