summaryrefslogblamecommitdiffstats
path: root/core/includes/packagemanager.inc
blob: 1a22f474dcc04cf11c71f1c2c9218eb5480dc9cb (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                                                          
                                                    
                                                        

                        


                                                                                             
                                                                
            
 
                        

















                                                                                         

                                                       






                                                
                                                                           


                                                                      
                                               

                                                      
                                                                                                                      
          







                                                                                            

                                                                                                                           

                                                                    


                                                            
            
                








                                     










                                                                                         
                                                                                                                  











                                                                                                           

                                                         



                                                                          
                  


                                                                                                
                  


                                                                      





                                                                              
#!/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() {
	if [ -z "$REQUIRED_CONTENT_PACKAGES" ]; then
		pinfo "No required packages for $MODULE"
		return 0
	fi
	[ $# -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" || return 1
	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="${PACKAGE:0:1}"
	[ "$OPTIONAL" = "@" ] && PACKAGE="${PACKAGE:1}"
	local FILES=""
	if [ "$PACKET_HANDLER" = "dpkg" ]; then
		PACKAGECOMMAND="dpkg -L"
	elif [ "$PACKET_HANDLER" = "rpm" ]; then
		PACKAGECOMMAND="rpm -ql"
	fi

	local filter='share/(man|doc)|^(/var)?/run|^/var/log|^/etc/init\.d'
	if [ -n "$REQUIRED_PACKET_FILES_BLACKLIST" ]; then
		FILES="$($PACKAGECOMMAND "$PACKAGE" | grep "^/" | \
			grep -v "$REQUIRED_PACKET_FILES_BLACKLIST" | \
			grep -v -E "$filter"; \
			echo ":###:${PIPESTATUS[0]}")"
	else
		FILES="$($PACKAGECOMMAND "$PACKAGE" | grep "^/" | grep -v -E "$filter"; 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 0
	[ -z "$FILES" ] && pwarning "list_packet_files empty for packet ${PACKAGE}." && return 0
	pdebug "Packet $PACKAGE has $(echo $FILES | wc -w) files..."
	for FILE in $FILES; do
		if [ "$OP" "$FILE" ] || [ -h "$FILE" ]; then
			echo "$FILE"
		fi
	done
	return 0
}
#
# Convenience function
#
list_packet_files() {
	list_content_packages --files
}

#
# Pass list of packages, returns filtered list, with packages removed
# that are already installed
#
filter_installed_packages() {
	local i
	if [ "$PACKET_HANDLER" == "dpkg" ]; then
		declare -A existing
		for i in $( dpkg -l "$@" 2> /dev/null | awk '$1 == "ii" {print $2}' ); do
			existing["$i"]=1
		done
		for i in "$@"; do
			[ -n "${existing["${i}"]}" ] || [ -n "${existing["${i}:${PLATFORM_DPKG}"]}" ] || echo "$i"
		done
	elif [ "$PACKET_HANDLER" == "rpm" ]; then
		for i in "$@"; do
			rpm --quiet -q "$i" &> /dev/null || echo "$i"
		done
	else
		pwarning "'Don't know how to determine installation status of packages for $PACKET_HANDLER"
		echo "$@"
	fi
}

#
# install individual package depending on package manager
#
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 [ "$PACKET_MANAGER" == "zypper" ]; then
		if ! zypper --no-refresh --non-interactive install --force-resolution "$@"; then
			perror "install_packages: zypper failed, see log"
		fi
	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!"
	fi
}