diff options
-rwxr-xr-x | core/bin/setup_target | 48 | ||||
-rw-r--r-- | core/includes/packagemanager.inc | 112 |
2 files changed, 53 insertions, 107 deletions
diff --git a/core/bin/setup_target b/core/bin/setup_target index 04417efd..ebb8218e 100755 --- a/core/bin/setup_target +++ b/core/bin/setup_target @@ -63,14 +63,52 @@ initial_checks () { detect_distribution } +unset_required_vars () { + for VARNAME in ${!REQUIRED_*}; do + unset $VARNAME + done +} + +# Install all the packages from all selected modules in current target +install_all_packages () { + local module file config + declare -A packages dupcheck + packages=() + for module in "${!MODULE_PATHS[@]}"; do + unset_required_vars + config="${MODULE_PATHS["$module"]}/module.conf" + for file in $SYS_VERSIONS; do + if [ -e "${config}.${file}" ]; then + validate_config "${config}.${file}" + . "${config}.${file}" + break + fi + done + dupcheck=() + for file in $REQUIRED_INSTALLED_PACKAGES; do + [ -n "${dupcheck["$file"]}" ] && continue + packages["$file"]+=" $module" + dupcheck["$file"]=1 + done + for file in $REQUIRED_CONTENT_PACKAGES; do + [ "${file:0:1}" = "@" ] && continue + [ -n "${dupcheck["$file"]}" ] && continue + packages["$file"]+=" $module" + dupcheck["$file"]=1 + done + done + pinfo "Making sure required packages are installed..." + pdebug "List: ${!packages[*]}" + install_packages "${!packages[@]}" + unset_required_vars +} + # # generic function to read the config file of the current $MODULE # read_config () { # unset previous variables from other config files - for VARNAME in ${!REQUIRED_*}; do - unset $VARNAME - done + unset_required_vars local MODULE_CONFIG="${MODULE_DIR}/module.conf" @@ -313,6 +351,7 @@ generate_target() { shift TARGET_DIR="$( readlink -f "${TARGETS_BASEDIR}/${TARGET}" )" scan_target "$TARGET_DIR" + install_all_packages if [[ "$TARGET" == *@* ]]; then VARNAME="${TARGET#*@}" TARGET="${TARGET%@*}" @@ -451,10 +490,7 @@ process_module() { pdebug "## Reading .build of $MODULE" . "${CORE_DIR}/includes/clean_module_funcs.inc" # Clean all hooks, in case the module doesn't define them all read_build # Read all the hooks from the module - # Install module's dependencies - pdebug "## Installing dependencies" cd "${MODULE_DIR}" || perror "cd to '${MODULE_DIR}' failed." - install_dependencies # update kernel version variables before running a module, as the last one might have been the kernel... get_kernel_version # Execute load-hook before anything else diff --git a/core/includes/packagemanager.inc b/core/includes/packagemanager.inc index 5b798c22..1e5b236d 100644 --- a/core/includes/packagemanager.inc +++ b/core/includes/packagemanager.inc @@ -22,7 +22,7 @@ list_content_packages() { done } -list_content_package(){ +list_content_package() { #[ -z "$EXTRA_PACKAGES" ] || pinfo "Listing additional packages: $EXTRA_PACKAGES" [ $# -gt 2 ] && perror "'list_content_package' accepts max 2 args. $# given." local OP="-e" @@ -83,110 +83,20 @@ list_packet_files() { } # -# Convenience function -# -# install all dependencies of a module -# goes through all package as given in the variable REQUIRED_INSTALLED_PACKAGES -install_dependencies() { - [ -z "${REQUIRED_INSTALLED_PACKAGES}${REQUIRED_CONTENT_PACKAGES}" ] && return - # add all REQUIRED_CONTENT_PACKAGES that are not tagged as optional - local TO_INSTALL="$REQUIRED_INSTALLED_PACKAGES" - for pkg in $REQUIRED_CONTENT_PACKAGES ; do - if [ "${pkg:0:1}" != "@" ]; then - TO_INSTALL="$TO_INSTALL $pkg" - fi - done - install_packages "$TO_INSTALL" -} - -# -# install given packet through system's packet manager -# uses PACKET_HANDLER as determined in helper/system.inc -# -install_packages() { - [ $# -eq 0 ] && perror "Sanity check failed: no argument given to install_package" - local PACKAGE_LIST="$@" - local INSTALLED_PACKAGES="" - local LRET="" - - for PKG in ${PACKAGE_LIST}; do - # check if installed: - # this is done mainly for performance reasons, even though - # reinstalling all packages is a valid possibility too... - if [ "x$PACKET_HANDLER" == "xdpkg" ]; then - dpkg -l ${PKG} > /dev/null 2>&1 - LRET=$? - elif [ "x$PACKET_HANDLER" == "xrpm" ]; then - rpm -ql "${PKG}" > /dev/null 2>&1 - LRET=$? - else - perror "No packet manager / handler determined, this should not happen!" - fi - - if [ "x$LRET" == "x0" ]; then - # check if it is completly installed, not just leftover configuration files - if [ "x$PACKET_HANDLER" == "xdpkg" ]; then - local INSTALL_STATUS=$(dpkg -l "${PKG}" | grep "${PKG}" | cut -c1-2) - if [[ $INSTALL_STATUS != "ii" ]]; then - pinfo "$PKG is either missing or a meta-package! Installing it to be sure..." - install_package "${PKG}" - else - # package installed - pdebug "${PKG} installed!" - fi - elif [ "x$PACKET_HANDLER" == "xrpm" ]; then - # TODO: blindly install again for now - rpm -q "${PKG}" >/dev/null 2>&1 || install_package "${PKG}" - fi - else - # package not installed - pdebug "$PKG not installed!" - install_package $PKG - fi - done - [ ! -z "$INSTALLED_PACKAGES" ] && pinfo "New packages installed: ${INSTALLED_PACKAGES}" -} - -# # install individual package depending on package manager # -install_package() { - if [ "$#" -ne 1 ]; then - perror "Only call install_package with one argument!" - fi - - if [ "x$PACKET_MANAGER" == "xapt" ]; then - apt-get install -y ${PKG} - local IRET=$? - if [ "x$IRET" == "x0" ]; then - # $PGK was installed successfully - INSTALLED_PACKAGES+="$PKG " - else - # PKG was not installed - # TODO error handling - perror "install_packages: apt-get failed with '$IRET' for package '$PKG'" +install_packages() { + if [ "$PACKET_MANAGER" == "apt" ]; then + if ! apt-get install --no-install-recommends -y "$@"; then + perror "install_packages: apt-get failed, see log" fi - elif [ "x$PACKET_MANAGER" == "xzypper" ]; then - zypper --no-refresh --non-interactive install --force-resolution ${PKG} - local IRET=$? - if [ "x$IRET" == "x0" ]; then - # $PGK was installed successfully - INSTALLED_PACKAGES+="$PKG " - else - # PKG was not installed - # TODO error handling - perror "install_packages: zypper failed with '$IRET' for package '$PKG'" + elif [ "$PACKET_MANAGER" == "zypper" ]; then + if ! zypper --no-refresh --non-interactive install --force-resolution "$@"; then + perror "install_packages: zypper failed, see log" fi - elif [ "x$PACKET_MANAGER" == "xyum" ]; then - yum --assumeyes install ${PKG} - local IRET=$? - if [ "x$IRET" == "x0" ]; then - # $PGK was installed successfully - INSTALLED_PACKAGES+="$PKG " - else - # PKG was not installed - # TODO error handling - perror "install_packages: yum failed with '$IRET' for package '$PKG'" + elif [ "$PACKET_MANAGER" == "yum" ]; then + if ! yum --assumeyes install "$@"; then + perror "install_packages: yum failed, see log" fi else perror "No packet manager determined, this should not happen!" |