Improves and enhances using the "installPackages=" variable.
Adds "pkgExt=" variable to set if pkgs are .tbz or .txz or other. Auto-detects if packages are PKGNG or old PKG format. Auto-bootstrap of PKGNG for the new installed environment. Fixes issues with installing packages from local media, such as DVD/USB. Switch to using a space-delimiter for installPackages, since a number of packages use a "," in their version string. Fix pc-sysinstall to ignore install scripts, and not hang on user interaction prompts when installing pkgs. Add pkg2ng command as apart of pkgng bootstrap process. Obtained from: PC-BSD
This commit is contained in:
parent
8bb3da133f
commit
3da475a963
@ -76,50 +76,113 @@ fetch_package_dependencies()
|
||||
# Check for any packages specified, and begin loading them
|
||||
install_packages()
|
||||
{
|
||||
echo "Checking for packages to install..."
|
||||
sleep 2
|
||||
|
||||
# First, lets check and see if we even have any packages to install
|
||||
get_value_from_cfg installPackages
|
||||
if [ -n "${VAL}" ]
|
||||
then
|
||||
HERE=`pwd`
|
||||
rc_nohalt "mkdir -p ${FSMNT}/${PKGTMPDIR}"
|
||||
rc_nohalt "cd ${FSMNT}/${PKGTMPDIR}"
|
||||
|
||||
if [ ! -f "${CONFDIR}/INDEX" ]
|
||||
# Nothing to do?
|
||||
if [ -z "${VAL}" ]; then return; fi
|
||||
|
||||
echo "Installing packages..."
|
||||
sleep 3
|
||||
|
||||
local PKGPTH
|
||||
|
||||
HERE=`pwd`
|
||||
rc_halt "mkdir -p ${FSMNT}${PKGTMPDIR}"
|
||||
|
||||
# Determine the directory we will install packages from
|
||||
get_package_location
|
||||
rc_halt "cd ${PKGDLDIR}"
|
||||
|
||||
# Set the location of the INDEXFILE
|
||||
INDEXFILE="${TMPDIR}/INDEX"
|
||||
|
||||
if [ ! -f "${INDEXFILE}" ]; then
|
||||
get_package_index
|
||||
fi
|
||||
|
||||
if [ ! -f "${TMPDIR}/INDEX.parsed" -a "$INSTALLMEDIUM" = "ftp" ]; then
|
||||
parse_package_index
|
||||
fi
|
||||
|
||||
# What extension are we using for pkgs?
|
||||
PKGEXT="txz"
|
||||
get_value_from_cfg pkgExt
|
||||
if [ -n "${VAL}" ]; then
|
||||
strip_white_space ${VAL}
|
||||
PKGEXT="$VAL"
|
||||
fi
|
||||
export PKGEXT
|
||||
|
||||
# We dont want to be bothered with scripts asking questions
|
||||
PACKAGE_BUILDING=yes
|
||||
export PACKAGE_BUILDING
|
||||
|
||||
# Lets start by cleaning up the string and getting it ready to parse
|
||||
get_value_from_cfg_with_spaces installPackages
|
||||
PACKAGES="${VAL}"
|
||||
echo_log "Packages to install: `echo $PACKAGES | wc -w | awk '{print $1}'`"
|
||||
for i in $PACKAGES
|
||||
do
|
||||
if ! get_package_name "${i}"
|
||||
then
|
||||
get_package_index
|
||||
echo_log "Unable to locate package ${i}"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ ! -f "${CONFDIR}/INDEX.parsed" ]
|
||||
then
|
||||
parse_package_index
|
||||
PKGNAME="${VAL}"
|
||||
|
||||
# Fetch package + deps, but skip if installing from local media
|
||||
if [ "${INSTALLMEDIUM}" = "ftp" ] ; then
|
||||
DEPFILE="${FSMNT}/${PKGTMPDIR}/.${PKGNAME}.deps"
|
||||
rc_nohalt "touch ${DEPFILE}"
|
||||
determine_package_dependencies "${PKGNAME}" "${DEPFILE}"
|
||||
fetch_package_dependencies "${DEPFILE}" "${FSMNT}/${PKGTMPDIR}"
|
||||
fi
|
||||
|
||||
# Lets start by cleaning up the string and getting it ready to parse
|
||||
strip_white_space ${VAL}
|
||||
PACKAGES=`echo ${VAL} | sed -e "s|,| |g"`
|
||||
for i in $PACKAGES
|
||||
do
|
||||
if get_package_name "${i}"
|
||||
then
|
||||
PKGNAME="${VAL}"
|
||||
DEPFILE="${FSMNT}/${PKGTMPDIR}/.${PKGNAME}.deps"
|
||||
# Set package location
|
||||
case "${INSTALLMEDIUM}" in
|
||||
usb|dvd|local) PKGPTH="${PKGTMPDIR}/All/${PKGNAME}" ;;
|
||||
*) PKGPTH="${PKGTMPDIR}/${PKGNAME}" ;;
|
||||
esac
|
||||
|
||||
rc_nohalt "touch ${DEPFILE}"
|
||||
determine_package_dependencies "${PKGNAME}" "${DEPFILE}"
|
||||
fetch_package_dependencies "${DEPFILE}" "${FSMNT}/${PKGTMPDIR}"
|
||||
|
||||
# If the package is not already installed, install it!
|
||||
if ! run_chroot_cmd "pkg_info -e ${PKGNAME}"
|
||||
then
|
||||
rc_nohalt "pkg_add -C ${FSMNT} ${PKGTMPDIR}/${PKGNAME}.tbz"
|
||||
fi
|
||||
|
||||
rc_nohalt "rm ${DEPFILE}"
|
||||
# See if we need to determine the package format we are working with
|
||||
if [ -z "${PKGINFO}" ] ; then
|
||||
tar tqf "${FSMNT}${PKGPTH}" '+MANIFEST' >/dev/null 2>/dev/null
|
||||
if [ $? -ne 0 ] ; then
|
||||
PKGADD="pkg_add -C ${FSMNT}"
|
||||
PKGINFO="pkg_info"
|
||||
else
|
||||
PKGADD="pkg -c ${FSMNT} add"
|
||||
PKGINFO="pkg info"
|
||||
bootstrap_pkgng
|
||||
fi
|
||||
fi
|
||||
|
||||
rc_nohalt "cd ${HERE}"
|
||||
done
|
||||
# If the package is not already installed, install it!
|
||||
if ! run_chroot_cmd "${PKGINFO} -e ${PKGNAME}" >/dev/null 2>/dev/null
|
||||
then
|
||||
echo_log "Installing package: ${PKGNAME}"
|
||||
rc_nohalt "${PKGADD} ${PKGPTH}"
|
||||
fi
|
||||
|
||||
rm -rf "${FSMNT}/${PKGTMPDIR}"
|
||||
if [ "${INSTALLMEDIUM}" = "ftp" ] ; then
|
||||
rc_nohalt "rm ${DEPFILE}"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
echo_log "Package installation complete!"
|
||||
|
||||
# Cleanup after ourselves
|
||||
rc_halt "cd ${HERE}"
|
||||
if [ "${INSTALLMEDIUM}" = "ftp" ] ; then
|
||||
rc_halt "rm -rf ${FSMNT}${PKGTMPDIR}" >/dev/null 2>/dev/null
|
||||
else
|
||||
rc_halt "umount ${FSMNT}${PKGTMPDIR}" >/dev/null 2>/dev/null
|
||||
rc_halt "rmdir ${FSMNT}${PKGTMPDIR}" >/dev/null 2>/dev/null
|
||||
fi
|
||||
};
|
||||
|
@ -45,9 +45,11 @@ get_package_index_by_ftp()
|
||||
then
|
||||
INDEX_FILE="${INDEX_FILE}.bz2"
|
||||
USE_BZIP2=1
|
||||
INDEX_PATH="${INDEXFILE}.bz2"
|
||||
else
|
||||
INDEX_PATH="${INDEXFILE}"
|
||||
fi
|
||||
|
||||
INDEX_PATH="${CONFDIR}/${INDEX_FILE}"
|
||||
fetch_file "${FTP_SERVER}/${INDEX_FILE}" "${INDEX_PATH}" "1"
|
||||
if [ -f "${INDEX_PATH}" ] && [ "${USE_BZIP2}" -eq "1" ]
|
||||
then
|
||||
@ -57,17 +59,18 @@ get_package_index_by_ftp()
|
||||
|
||||
get_package_index_by_fs()
|
||||
{
|
||||
local INDEX_FILE
|
||||
|
||||
INDEX_FILE="${CDMNT}/packages/INDEX"
|
||||
fetch_file "${INDEX_FILE}" "${CONFDIR}/" "0"
|
||||
if [ "$INSTALLMEDIUM" = "local" ] ; then
|
||||
INDEXFILE="${LOCALPATH}/packages/INDEX"
|
||||
else
|
||||
INDEXFILE="${CDMNT}/packages/INDEX"
|
||||
fi
|
||||
};
|
||||
|
||||
get_package_index_size()
|
||||
{
|
||||
if [ -f "${CONFDIR}/INDEX" ]
|
||||
if [ -f "${INDEXFILE}" ]
|
||||
then
|
||||
SIZE=`ls -l ${CONFDIR}/INDEX | awk '{ print $5 }'`
|
||||
SIZE=`ls -l ${INDEXFILE} | awk '{ print $5 }'`
|
||||
else
|
||||
get_ftp_mirror
|
||||
FTPHOST="${VAL}"
|
||||
@ -94,28 +97,24 @@ get_package_index()
|
||||
get_package_index_by_ftp "${FTPPATH}"
|
||||
|
||||
else
|
||||
get_value_from_cfg ftpHost
|
||||
if [ -z "$VAL" ]
|
||||
then
|
||||
exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!"
|
||||
fi
|
||||
|
||||
FTPHOST="${VAL}"
|
||||
|
||||
get_value_from_cfg ftpDir
|
||||
if [ -z "$VAL" ]
|
||||
then
|
||||
exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!"
|
||||
fi
|
||||
|
||||
FTPDIR="${VAL}"
|
||||
FTPPATH="ftp://${FTPHOST}${FTPDIR}"
|
||||
|
||||
case "${INSTALLMEDIUM}" in
|
||||
usb|dvd) get_package_index_by_fs ;;
|
||||
ftp) get_package_index_by_ftp "${FTPPATH}" ;;
|
||||
sftp) ;;
|
||||
*) RES=1 ;;
|
||||
usb|dvd|local) get_package_index_by_fs ;;
|
||||
ftp) get_value_from_cfg ftpHost
|
||||
if [ -z "$VAL" ]; then
|
||||
exit_err "ERROR: Install medium was set to ftp, but no ftpHost was provided!"
|
||||
fi
|
||||
FTPHOST="${VAL}"
|
||||
|
||||
get_value_from_cfg ftpDir
|
||||
if [ -z "$VAL" ]; then
|
||||
exit_err "ERROR: Install medium was set to ftp, but no ftpDir was provided!"
|
||||
fi
|
||||
FTPDIR="${VAL}"
|
||||
FTPPATH="ftp://${FTPHOST}${FTPDIR}"
|
||||
get_package_index_by_ftp "${FTPPATH}" ;;
|
||||
sftp) ;;
|
||||
*) RES=1 ;;
|
||||
esac
|
||||
|
||||
fi
|
||||
@ -125,10 +124,11 @@ get_package_index()
|
||||
|
||||
parse_package_index()
|
||||
{
|
||||
echo_log "Building package dep list.. Please wait.."
|
||||
INDEX_FILE="${PKGDIR}/INDEX"
|
||||
|
||||
exec 3<&0
|
||||
exec 0<"${INDEX_FILE}"
|
||||
exec 0<"${INDEXFILE}"
|
||||
|
||||
while read -r line
|
||||
do
|
||||
@ -257,20 +257,38 @@ get_package_name()
|
||||
{
|
||||
PACKAGE="${1}"
|
||||
RES=0
|
||||
local PKGPTH
|
||||
|
||||
INDEX_FILE="${PKGDIR}/INDEX.deps"
|
||||
REGEX="^${PACKAGE}|"
|
||||
# If we are on a local medium, we can parse the Latest/ directory
|
||||
if [ "${INSTALLMEDIUM}" != "ftp" ] ; then
|
||||
case "${INSTALLMEDIUM}" in
|
||||
usb|dvd) PKGPTH="${CDMNT}/packages" ;;
|
||||
*) PKGPTH="${LOCALPATH}/packages" ;;
|
||||
esac
|
||||
|
||||
# Check the /Latest dir for generic names, then look for specific version in All/
|
||||
if [ -e "${PKGPTH}/Latest/${PACKAGE}.${PKGEXT}" ] ; then
|
||||
NAME=`ls -al ${PKGPTH}/Latest/${PACKAGE}.${PKGEXT} 2>/dev/null | cut -d '>' -f 2 | rev | cut -f1 -d'/' | rev | tr -s ' '`
|
||||
else
|
||||
NAME=`ls -al ${PKGPTH}/All/${PACKAGE}.${PKGEXT} 2>/dev/null | cut -d '>' -f 2 | rev | cut -f1 -d'/' | rev | tr -s ' '`
|
||||
fi
|
||||
export VAL="${NAME}"
|
||||
else
|
||||
# Doing remote fetch, we we will look up, but some generic names like
|
||||
# "perl" wont work, since we don't know the default version
|
||||
INDEX_FILE="${PKGDIR}/INDEX.deps"
|
||||
REGEX="^${PACKAGE}|"
|
||||
|
||||
LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
|
||||
NAME=`echo "${LINE}"|cut -f2 -d'|'`
|
||||
LINE=`grep "${REGEX}" "${INDEX_FILE}" 2>/dev/null`
|
||||
NAME=`echo "${LINE}"|cut -f2 -d'|'`
|
||||
|
||||
export VAL="${NAME}"
|
||||
export VAL="${NAME}"
|
||||
fi
|
||||
|
||||
if [ -z "${VAL}" ]
|
||||
then
|
||||
RES=1
|
||||
fi
|
||||
|
||||
return ${RES}
|
||||
};
|
||||
|
||||
@ -334,7 +352,7 @@ fetch_package_by_ftp()
|
||||
fi
|
||||
FTPDIR="${VAL}"
|
||||
|
||||
PACKAGE="${PACKAGE}.tbz"
|
||||
PACKAGE="${PACKAGE}.${PKGEXT}"
|
||||
FTP_SERVER="ftp://${FTPHOST}${FTPDIR}"
|
||||
|
||||
if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
|
||||
@ -345,28 +363,49 @@ fetch_package_by_ftp()
|
||||
fi
|
||||
};
|
||||
|
||||
fetch_package_by_fs()
|
||||
{
|
||||
CATEGORY="${1}"
|
||||
PACKAGE="${2}"
|
||||
SAVEDIR="${3}"
|
||||
|
||||
PACKAGE="${PACKAGE}.tbz"
|
||||
if [ ! -f "${SAVEDIR}/${PACKAGE}" ]
|
||||
then
|
||||
fetch_file "${CDMNT}/packages/${CATEGORY}/${PACKAGE}" "${SAVEDIR}/" "0"
|
||||
fi
|
||||
};
|
||||
|
||||
fetch_package()
|
||||
{
|
||||
CATEGORY="${1}"
|
||||
PACKAGE="${2}"
|
||||
SAVEDIR="${3}"
|
||||
|
||||
# Fetch package, but skip if installing from local media
|
||||
case "${INSTALLMEDIUM}" in
|
||||
usb|dvd) fetch_package_by_fs "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
|
||||
usb|dvd|local) return ;;
|
||||
ftp) fetch_package_by_ftp "${CATEGORY}" "${PACKAGE}" "${SAVEDIR}" ;;
|
||||
sftp) ;;
|
||||
esac
|
||||
};
|
||||
|
||||
bootstrap_pkgng()
|
||||
{
|
||||
# Check if we need to boot-strap pkgng
|
||||
if run_chroot_cmd "which pkg-static" >/dev/null 2>/dev/null
|
||||
then
|
||||
return
|
||||
fi
|
||||
local PKGPTH
|
||||
|
||||
# Ok, lets boot-strap this sucker
|
||||
echo_log "Bootstraping pkgng.."
|
||||
fetch_package "Latest" "pkg" "${PKGDLDIR}"
|
||||
|
||||
# Figure out real location of "pkg" package
|
||||
case "${INSTALLMEDIUM}" in
|
||||
usb|dvd|local) PKGPTH="${PKGTMPDIR}/Latest/pkg.${PKGEXT}" ;;
|
||||
*) PKGPTH="${PKGTMPDIR}/pkg.${PKGEXT}" ;;
|
||||
esac
|
||||
rc_halt "pkg -c ${FSMNT} add ${PKGPTH}" ; run_chroot_cmd "pkg2ng"
|
||||
}
|
||||
|
||||
get_package_location()
|
||||
{
|
||||
case "${INSTALLMEDIUM}" in
|
||||
usb|dvd) rc_halt "mount_nullfs ${CDMNT}/packages ${FSMNT}${PKGTMPDIR}"
|
||||
PKGDLDIR="${FSMNT}${PKGTMPDIR}/All" ;;
|
||||
local) rc_halt "mount_nullfs ${LOCALPATH}/packages ${FSMNT}${PKGTMPDIR}"
|
||||
PKGDLDIR="${FSMNT}${PKGTMPDIR}/All" ;;
|
||||
*) PKGDLDIR="${FSMNT}${PKGTMPDIR}" ;;
|
||||
esac
|
||||
export PKGDLDIR
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user