summaryrefslogtreecommitdiffstats
path: root/core/includes/packagemanager.inc
blob: 5b798c22b09e5908a0d6a4b6f822aa8dd60aa4f2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#!/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
}