summaryrefslogblamecommitdiffstats
path: root/core/includes/packagemanager.inc
blob: 5b798c22b09e5908a0d6a4b6f822aa8dd60aa4f2 (plain) (tree)



























































                                                                                                                                                             







                                                                                            

                                                                                                                         

                                                                    


                                                            














                                                                               








                                                                                     































































































                                                                                                                     
#!/bin/bash
#
# get all files of required packages by a module
#
# Usage:
#	list_content_packages
#		- lists all files/directories in REQUIRED_CONTENT_PACKAGES
#	list_content_packages --files
#		- lists all files in REQUIRED_CONTENT_PACKAGES
#	list_content_packages --dirs
#		- lists all dirs in REQUIRED_CONTENT_PACKAGES
#
#	NOTE:	additional packages needed to be listed can be given
#		through the environment variable EXTRA_PACKAGES

list_content_packages() {
	[ -z "$REQUIRED_CONTENT_PACKAGES" ] && pinfo "No required packages for $TOOL"  && return 1
	[ $# -gt 2 ] && perror "'list_content_packages' accepts only 1 or no args. $# given."
	local PACKAGE=""
	for PACKAGE in $REQUIRED_CONTENT_PACKAGES $EXTRA_PACKAGES; do
		list_content_package $1 $PACKAGE
	done

}
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"
	case "$1" in
		"--files")
			OP="-f"
			;;
		"--dirs")
			OP="-d"
			;;
		"")
			OP="-e"
			;;
		*)
			perror "'list_content_packages' invalid argument: $1"
			;;
	esac
	local PACKAGE="$2"
	local OPTIONAL="$(echo "$PACKAGE" | cut -c 1)"
	[ "x$OPTIONAL" = "x@" ] && PACKAGE="$(echo "$PACKAGE" | cut -c 2-)"
	local FILES=""
	if [ "$PACKET_HANDLER" = "dpkg" ]; then
		PACKAGECOMMAND="dpkg -L"
	elif [ "$PACKET_HANDLER" = "rpm" ]; then
		PACKAGECOMMAND="rpm -ql"
	fi

	if [ -n "$REQUIRED_PACKET_FILES_BLACKLIST" ]; then
		FILES="$($PACKAGECOMMAND "$PACKAGE" | grep "^/" | \
			grep -v "$REQUIRED_PACKET_FILES_BLACKLIST" | \
			grep -v -E 'share/(man|doc)|/var/run|/var/log|/etc/init\.d'; \
			echo ":###:${PIPESTATUS[0]}")"
	else
		FILES="$($PACKAGECOMMAND "$PACKAGE" | grep "^/" | grep -v -E 'share/(man|doc)|/var/run|/var/log|/etc/init\.d'; echo ":###:${PIPESTATUS[0]}")"
	fi

	# ugly hack to get our return value
	local LPRET=$(echo "$FILES" | awk -F ':###:' '{printf $2}')
	FILES=$(echo "$FILES" | awk -F ':###:' '{print $1}')
	if [ "x$LPRET" != "x0" -a "x$OPTIONAL" != "x@" ]; then
		pdebug "FILES: '$FILES'"
		perror "dpkg/rpm exited with code '$LPRET' for required package ${PACKAGE}."
	fi
	[ "x$LPRET" != "x0" ] && pwarning "dpkg/rpm exited with code '$LPRET' for optional package ${PACKAGE}." && return
	[ -z "$FILES" ] && pwarning "list_packet_files empty for packet ${PACKAGE}." && return
	pdebug "Packet $PACKAGE has $(echo $FILES | wc -w) files..."
	for FILE in $FILES; do
		if [ "$OP" "$FILE" ] || [ -h "$FILE" ]; then
			echo "$FILE"
		fi
	done
}
#
# Convenience function
#
list_packet_files() {
	list_content_packages --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'"
		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'"
		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'"
		fi
	else
		perror "No packet manager determined, this should not happen!"
	fi
}