#!/bin/sh
# vim:ts=4:sts=4:sw=4:et
#
# Author: Hari Sekhon
# Date: 2019-02-15 21:31:10 +0000 (Fri, 15 Feb 2019)
#
# https://github.com/harisekhon/bash-tools
#
# License: see accompanying Hari Sekhon LICENSE file
#
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
#
# https://www.linkedin.com/in/harisekhon
#
# Install Deb packages in a forgiving way - useful for installing Perl CPAN and Python PyPI modules that may or may not be available
#
# combine with later use of the following scripts to only build packages that aren't available in the Linux distribution:
#
# perl_cpanm_install_if_absent.sh
# python_pip_install_if_absent.sh
set -eu
[ -n " ${ DEBUG :- } " ] && set -x
srcdir = " $( dirname " $0 " ) "
# shellcheck disable=SC1090
. " $srcdir /lib/ci.sh "
usage( ) {
echo "Installs Debian / Ubuntu deb package lists"
echo
echo "Takes a list of deb packages as arguments or via stdin, and for any arguments that are plaintext files, reads the packages from those given files (one package per line)"
echo
echo " usage: ${ 0 ##*/ } <list_of_packages> "
echo
exit 3
}
for arg; do
case " $arg " in
-*) usage
; ;
esac
done
echo "Installing Deb Packages"
export DEBIAN_FRONTEND = noninteractive
#apt="apt"
apt = "apt-get"
if ! type " $apt " >/dev/null 2>& 1; then
echo " $apt not found in \$PATH ( $PATH ), cannot install apt packages! "
exit 1
fi
sudo = ""
# $EUID is not defined in posix sh
# shellcheck disable=SC2039
[ " ${ EUID :- $( id -u) } " != 0 ] && sudo = sudo
opts = ""
if [ -f /.dockerenv ] ; then
echo "running inside docker, not installing recommended extra packages unless specified to save space"
opts = "--no-install-recommends"
fi
if is_CI; then
echo "running in CI quiet mode"
opts = " $opts -q "
echo
echo "/etc/apt/sources.list:"
cat /etc/apt/sources.list
echo
for x in /etc/apt/sources.list.d/*; do
[ -f " $x " ] || continue
echo " $x : "
cat " $x "
echo
done
fi
#if is_semmle; then
# # sudo: no tty present and no askpass program specified
# echo "Semmle detected, not running package installs as this is a docker user environment without sudo privs or tty"
# exit 0
#fi
packages = ""
process_args( ) {
for arg; do
if [ -f " $arg " ] ; then
echo " adding packages from file: $arg "
packages = " $packages $( sed 's/#.*//;/^[[:space:]]*$$/d' " $arg " ) "
echo
else
packages = " $packages $arg "
fi
done
}
if [ -n " ${ * :- } " ] ; then
process_args " $@ "
else
# shellcheck disable=SC2046
process_args $( cat)
fi
if [ -z " $packages " ] ; then
exit 0
fi
# uniq
packages = " $( echo " $packages " | tr ' ' ' \n' | sort -u | tr '\n' ' ' ) "
# requires fuser which might not already be installed, catch-22 situation if wanting to use this for everything including bootstraps
#"$srcdir/apt_wait.sh"
# shellcheck disable=SC2086
[ -n " ${ NO_UPDATE :- } " ] || $sudo " $apt " $opts update
if [ -n " ${ NO_FAIL :- } " ] ; then
# shellcheck disable=SC2086
for package in $packages ; do
#"$srcdir/apt_wait.sh"
$sudo " $apt " install -y $opts " $package " || :
done
else
#"$srcdir/apt_wait.sh"
# shellcheck disable=SC2086
$sudo " $apt " install -y $opts $packages
fi