armbian_build/lib/functions/extras/installpkg.sh
2022-10-08 14:37:22 +02:00

139 lines
3.7 KiB
Bash

# Installing debian packages or package files in the armbian build system.
# The function accepts four optional parameters:
# autoupdate - If the installation list is not empty then update first.
# upgrade, clean - the same name for apt
# verbose - detailed log for the function
#
# list="pkg1 pkg2 pkg3 pkgbadname pkg-1.0 | pkg-2.0 pkg5 (>= 9)"
# or list="pkg1 pkg2 /path-to/output/debs/file-name.deb"
# install_pkg_deb upgrade verbose $list
# or
# install_pkg_deb autoupdate $list
#
# If the package has a bad name, we will see it in the log file.
# If there is an LOG_OUTPUT_FILE variable and it has a value as
# the full real path to the log file, then all the information will be there.
#
# The LOG_OUTPUT_FILE variable must be defined in the calling function
# before calling the install_pkg_deb function and unset after.
#
install_pkg_deb() {
local list=""
local listdeb=""
local log_file
local add_for_install
local for_install
local need_autoup=false
local need_upgrade=false
local need_clean=false
local need_verbose=false
local _line=${BASH_LINENO[0]}
local _function=${FUNCNAME[1]}
local _file=$(basename "${BASH_SOURCE[1]}")
local tmp_file=$(mktemp /tmp/install_log_XXXXX)
export DEBIAN_FRONTEND=noninteractive
if [ -d $(dirname $LOG_OUTPUT_FILE) ]; then
log_file=${LOG_OUTPUT_FILE}
else
log_file="${SRC}/output/${LOG_SUBPATH}/install.log"
fi
for p in $*; do
case $p in
autoupdate)
need_autoup=true
continue
;;
upgrade)
need_upgrade=true
continue
;;
clean)
need_clean=true
continue
;;
verbose)
need_verbose=true
continue
;;
\| | \(* | *\)) continue ;;
*[.]deb)
listdeb+=" $p"
continue
;;
*) list+=" $p" ;;
esac
done
# This is necessary first when there is no apt cache.
if $need_upgrade; then
apt-get -q update || echo "apt cannot update" >> $tmp_file
apt-get -y upgrade || echo "apt cannot upgrade" >> $tmp_file
fi
# Install debian package files
if [ -n "$listdeb" ]; then
for f in $listdeb; do
# Calculate dependencies for installing the package file
add_for_install=" $(
dpkg-deb -f $f Depends | awk '{gsub(/[,]/, "", $0); print $0}'
)"
echo -e "\nfile $f depends on:\n$add_for_install" >> $log_file
install_pkg_deb $add_for_install
dpkg -i $f 2>> $log_file
dpkg-query -W \
-f '${binary:Package;-27} ${Version;-23}\n' \
$(dpkg-deb -f $f Package) >> $log_file
done
fi
# If the package is not installed, check the latest
# up-to-date version in the apt cache.
# Exclude bad package names and send a message to the log.
for_install=$(
for p in $list; do
if $(dpkg-query -W -f '${db:Status-Abbrev}' $p |& awk '/ii/{exit 1}'); then
apt-cache show $p -o APT::Cache::AllVersions=no |&
awk -v p=$p -v tmp_file=$tmp_file \
'/^Package:/{print $2} /^E:/{print "Bad package name: ",p >>tmp_file}'
fi
done
)
# This information should be logged.
if [ -s $tmp_file ]; then
echo -e "\nInstalling packages in function: $_function" "[$_file:$_line]" \
>> $log_file
echo -e "\nIncoming list:" >> $log_file
printf "%-30s %-30s %-30s %-30s\n" $list >> $log_file
echo "" >> $log_file
cat $tmp_file >> $log_file
fi
if [ -n "$for_install" ]; then
if $need_autoup; then
apt-get -q update
apt-get -y upgrade
fi
apt-get install -qq -y --no-install-recommends $for_install
echo -e "\nPackages installed:" >> $log_file
dpkg-query -W \
-f '${binary:Package;-27} ${Version;-23}\n' \
$for_install >> $log_file
fi
# We will show the status after installation all listed
if $need_verbose; then
echo -e "\nstatus after installation:" >> $log_file
dpkg-query -W \
-f '${binary:Package;-27} ${Version;-23} [ ${Status} ]\n' \
$list >> $log_file
fi
if $need_clean; then apt-get clean; fi
rm $tmp_file
}