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