Created
March 22, 2017 20:13
-
-
Save IsaacChapman/d04418d080026931782d382e7fd79537 to your computer and use it in GitHub Desktop.
Check if installed packages satisfy .deb file dependencies
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Determine if .deb package dependencies are met | |
if [[ -z "$1" || "$1" == '--help' || "$1" == "-h" ]]; then | |
echo "Usage $0 file.deb" | |
exit 0 | |
fi | |
if [[ ! -f "$1" ]]; then | |
echo "No file found at $1" | |
exit 1 | |
fi | |
DEB_FILE="$1" | |
ARCH=`dpkg --print-architecture` | |
declare -a unmet_dependencies | |
function check_dependency { | |
read -ra dep_pieces <<< "$1" | |
package=${dep_pieces[0]} | |
if [ ${#dep_pieces[@]} == 1 ]; then | |
# No version conditional | |
if `dpkg -l "$package" >> /dev/null 2>&1`; then | |
echo " Satisfied by $package" | |
return 0 | |
else | |
echo " Package not installed: $package" | |
return 2 | |
fi | |
fi | |
math_conditional=`echo ${dep_pieces[1]} | cut -c2-` | |
case "$math_conditional" in | |
"<") conditional="lt";; # Deprecated | |
"<<") conditional="lt";; | |
"<=") conditional="le";; | |
"=") conditional="eq";; | |
">=") conditional="ge";; | |
">") conditional="gt";; # Deprecated | |
">>") conditional="gt";; | |
esac | |
version=${dep_pieces[2]: : -1} | |
installed_version=`dpkg -l "$package" 2>&1 | grep "$package:$ARCH" | awk '{print $3}'` | |
if [ -z "$installed_version" ]; then | |
echo " Arch-specific Package not installed: $package:$ARCH" | |
installed_version=`dpkg -l "$package" 2>&1 | grep "$package " | awk '{print $3}'` | |
fi | |
if [ -z "$installed_version" ]; then | |
echo " Package not installed: $package" | |
return 2 | |
fi | |
if `dpkg --compare-versions $installed_version $conditional $version >> /dev/null 2>&1`; then | |
echo " Satisfied by $package $installed_version" | |
return 0 | |
fi | |
return 1 | |
} | |
function check_dependency_list { | |
exit_code=0 | |
IFS=',' read -ra dep_array <<< "$1" | |
for dep_item in "${dep_array[@]}"; do | |
echo "Checking:$dep_item" | |
dep_satisfied="" | |
IFS='|' read -ra dep_descriptions <<< "$dep_item" | |
for dep_desc in "${dep_descriptions[@]}"; do | |
if check_dependency "$dep_desc"; then | |
dep_satisfied=true | |
break | |
fi | |
done | |
if [ -z "$dep_satisfied" ]; then | |
echo " Dependency not met:$dep_item" | |
unmet_dependencies+=("$dep_item") | |
fi | |
done | |
return $exit_code | |
} | |
control_file=$(mktemp "${TMPDIR:-/tmp/}$(basename $DEB_FILE).control.XXXXXXXXX") | |
dpkg-deb -I $DEB_FILE > $control_file | |
if [ ! $? ]; then | |
echo "ERROR: Could not extract information from $DEB_FILE" | |
exit 6 | |
fi | |
for key in Pre-Depends Depends; do | |
line=`grep ^" $key" $control_file` | |
if [ ! -z "$line" ]; then | |
echo "Checking on $key" | |
depends=`echo $line | cut -c$((${#key} + 2))-` | |
echo "Verifying ${key}:${depends}" | |
check_dependency_list "$depends" | |
fi | |
done | |
if [ ${#unmet_dependencies[@]} -gt 0 ]; then | |
echo "UNMET DEPENDENCIES (${#unmet_dependencies[@]}):" | |
for dep in "${unmet_dependencies[@]}"; do | |
echo " $dep" | |
done | |
exit 5 | |
fi | |
echo "Dependencies met!" | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment