functions-packages.sh revision 211487
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 211487 2010-08-19 06:02:31Z 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 FTPHOST="${VAL}" 103 104 get_value_from_cfg ftpDir 105 if [ -z "$VAL" ] 106 then 107 exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 108 fi 109 FTPDIR="${VAL}" 110 111 FTPPATH="ftp://${FTPHOST}${FTPDIR}" 112 113 case "${INSTALLMEDIUM}" in 114 usb|dvd) get_package_index_by_fs 115 ;; 116 ftp) get_package_index_by_ftp "${FTPPATH}" 117 ;; 118 *) RES=1 119 ;; 120 esac 121 122 fi 123 124 return ${RES} 125}; 126 127parse_package_index() 128{ 129 INDEX_FILE="${PKGDIR}/INDEX" 130 131 exec 3<&0 132 exec 0<"${INDEX_FILE}" 133 134 while read -r line 135 do 136 PKGNAME="" 137 CATEGORY="" 138 PACKAGE="" 139 DESC="" 140 DEPS="" 141 i=0 142 143 SAVE_IFS="${IFS}" 144 IFS="|" 145 146 for part in ${line} 147 do 148 if [ "${i}" -eq "0" ] 149 then 150 PKGNAME="${part}" 151 152 elif [ "${i}" -eq "1" ] 153 then 154 PACKAGE=`basename "${part}"` 155 156 elif [ "${i}" -eq "3" ] 157 then 158 DESC="${part}" 159 160 elif [ "${i}" -eq "6" ] 161 then 162 CATEGORY=`echo "${part}" | cut -f1 -d' '` 163 164 elif [ "${i}" -eq "8" ] 165 then 166 DEPS="${part}" 167 fi 168 169 i=$((i+1)) 170 done 171 172 echo "${CATEGORY}|${PACKAGE}|${DESC}" >> "${INDEX_FILE}.parsed" 173 echo "${PACKAGE}|${PKGNAME}|${DEPS}" >> "${INDEX_FILE}.deps" 174 175 IFS="${SAVE_IFS}" 176 done 177 178 exec 0<&3 179}; 180 181show_package_file() 182{ 183 PKGFILE="${1}" 184 185 echo "Available Packages:" 186 187 exec 3<&0 188 exec 0<"${PKGFILE}" 189 190 while read -r line 191 do 192 CATEGORY=`echo "${line}" | cut -f1 -d'|'` 193 PACKAGE=`echo "${line}" | cut -f2 -d'|'` 194 DESC=`echo "${line}" | cut -f3 -d'|'` 195 196 echo "${CATEGORY}/${PACKAGE}:${DESC}" 197 done 198 199 exec 0<&3 200}; 201 202show_packages_by_category() 203{ 204 CATEGORY="${1}" 205 INDEX_FILE="${PKGDIR}/INDEX.parsed" 206 TMPFILE="/tmp/.pkg.cat" 207 208 grep "^${CATEGORY}|" "${INDEX_FILE}" > "${TMPFILE}" 209 show_package_file "${TMPFILE}" 210 rm "${TMPFILE}" 211}; 212 213show_package_by_name() 214{ 215 CATEGORY="${1}" 216 PACKAGE="${2}" 217 INDEX_FILE="${PKGDIR}/INDEX.parsed" 218 TMPFILE="/tmp/.pkg.cat.pak" 219 220 grep "^${CATEGORY}|${PACKAGE}" "${INDEX_FILE}" > "${TMPFILE}" 221 show_package_file "${TMPFILE}" 222 rm "${TMPFILE}" 223}; 224 225show_packages() 226{ 227 show_package_file "${PKGDIR}/INDEX.parsed" 228}; 229 230get_package_dependencies() 231{ 232 PACKAGE="${1}" 233 LONG="${2:-0}" 234 RES=0 235 236 INDEX_FILE="${PKGDIR}/INDEX.deps" 237 REGEX="^${PACKAGE}|" 238 239 if [ "${LONG}" -ne "0" ] 240 then 241 REGEX="^.*|${PACKAGE}|" 242 fi 243 244 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null` 245 DEPS=`echo "${LINE}"|cut -f3 -d'|'` 246 247 VAL="${DEPS}" 248 export VAL 249 250 if [ -z "${VAL}" ] 251 then 252 RES=1 253 fi 254 255 return ${RES} 256}; 257 258get_package_name() 259{ 260 PACKAGE="${1}" 261 RES=0 262 263 INDEX_FILE="${PKGDIR}/INDEX.deps" 264 REGEX="^${PACKAGE}|" 265 266 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null` 267 NAME=`echo "${LINE}"|cut -f2 -d'|'` 268 269 VAL="${NAME}" 270 export VAL 271 272 if [ -z "${VAL}" ] 273 then 274 RES=1 275 fi 276 277 return ${RES} 278}; 279 280get_package_short_name() 281{ 282 PACKAGE="${1}" 283 RES=0 284 285 INDEX_FILE="${PKGDIR}/INDEX.deps" 286 REGEX="^.*|${PACKAGE}|" 287 288 LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null` 289 NAME=`echo "${LINE}"|cut -f1 -d'|'` 290 291 VAL="${NAME}" 292 export VAL 293 294 if [ -z "${VAL}" ] 295 then 296 RES=1 297 fi 298 299 return ${RES} 300}; 301 302get_package_category() 303{ 304 PACKAGE="${1}" 305 INDEX_FILE="${PKGDIR}/INDEX.parsed" 306 RES=0 307 308 LINE=`grep "|${PACKAGE}|" "${INDEX_FILE}" 2>/dev/null` 309 NAME=`echo "${LINE}"|cut -f1 -d'|'` 310 311 VAL="${NAME}" 312 export VAL 313 314 if [ -z "${VAL}" ] 315 then 316 RES=1 317 fi 318 319 return ${RES} 320}; 321 322fetch_package_by_ftp() 323{ 324 CATEGORY="${1}" 325 PACKAGE="${2}" 326 SAVEDIR="${3}" 327 328 get_value_from_cfg ftpHost 329 if [ -z "$VAL" ] 330 then 331 exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!" 332 fi 333 FTPHOST="${VAL}" 334 335 get_value_from_cfg ftpDir 336 if [ -z "$VAL" ] 337 then 338 exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!" 339 fi 340 FTPDIR="${VAL}" 341 342 PACKAGE="${PACKAGE}.tbz" 343 FTP_SERVER="ftp://${FTPHOST}${FTPDIR}" 344 345 if [ ! -f "${SAVEDIR}/${PACKAGE}" ] 346 then 347 PKGPATH="${CATEGORY}/${PACKAGE}" 348 FTP_PATH="${FTP_HOST}/packages/${PKGPATH}" 349 fetch_file "${FTP_PATH}" "${SAVEDIR}/" "0" 350 fi 351}; 352 353fetch_package_by_fs() 354{ 355 CATEGORY="${1}" 356 PACKAGE="${2}" 357 SAVEDIR="${3}" 358 359 PACKAGE="${PACKAGE}.tbz" 360 if [ ! -f "${SAVEDIR}/${PACKAGE}" ] 361 then 362 fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0" 363 fi 364}; 365 366fetch_package() 367{ 368 CATEGORY="${1}" 369 PACKAGE="${2}" 370 SAVEDIR="${3}" 371 372 case "${INSTALLMEDIUM}" in 373 usb|dvd) 374 fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" 375 ;; 376 ftp) 377 fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" 378 ;; 379 esac 380}; 381