forked from HariSekhon/DevOps-Bash-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
apt_install_packages.sh
executable file
·133 lines (114 loc) · 3.28 KB
/
apt_install_packages.sh
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
#!/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 [ $# -gt 0 ]; 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