Skip to content

Instantly share code, notes, and snippets.

@IsaacChapman
Created March 22, 2017 20:13
Show Gist options
  • Save IsaacChapman/d04418d080026931782d382e7fd79537 to your computer and use it in GitHub Desktop.
Save IsaacChapman/d04418d080026931782d382e7fd79537 to your computer and use it in GitHub Desktop.
Check if installed packages satisfy .deb file dependencies
#!/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