Skip to content

Commit 110bb40

Browse files
committed
utils: lib_apt.sh: apt helpers with network gating
Signed-off-by: Srikanth Muppandam <smuppand@qti.qualcomm.com>
1 parent 4b2be2c commit 110bb40

1 file changed

Lines changed: 142 additions & 0 deletions

File tree

Runner/utils/lib_apt.sh

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#!/bin/sh
2+
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
3+
# SPDX-License-Identifier: BSD-3-Clause-Clear
4+
# APT helpers for Debian/Ubuntu. Requires lib_common.sh + functestlib logging.
5+
6+
require_apt() {
7+
have_cmd apt-get && have_cmd apt-cache && return 0
8+
die "apt-get/apt-cache not found. This script targets Debian/Ubuntu."
9+
}
10+
11+
apt_update_if_needed() {
12+
require_apt
13+
need=1
14+
if [ -d /var/lib/apt/lists ]; then
15+
set -- /var/lib/apt/lists/*_Packages
16+
if [ -e "$1" ]; then
17+
if find /var/lib/apt/lists -name '*_Packages' -mtime -1 2>/dev/null | grep -q .; then
18+
need=0
19+
fi
20+
fi
21+
fi
22+
if [ "$need" -eq 1 ]; then
23+
if ! need_root_or_skip; then
24+
return 2
25+
fi
26+
if ! network_is_ok; then
27+
log_skip "Offline: cannot run 'apt-get update'."
28+
return 2
29+
fi
30+
log_info "cmd(root): apt-get update"
31+
sh -c "$SUDO apt-get update"
32+
return $?
33+
fi
34+
log_info "APT lists look fresh (<24h); skipping apt-get update"
35+
return 0
36+
}
37+
38+
apt_install_pkgs() {
39+
require_apt
40+
apt_update_if_needed || rc=$?; rc=${rc:-0}; [ "$rc" -eq 2 ] && return 2
41+
pkgs="$*"
42+
[ -n "$pkgs" ] || return 0
43+
if ! need_root_or_skip; then
44+
return 2
45+
fi
46+
if ! network_is_ok; then
47+
log_skip "Offline: cannot install $pkgs."
48+
return 2
49+
fi
50+
log_info "cmd(root): DEBIAN_FRONTEND=noninteractive apt-get install -y $pkgs"
51+
sh -c "$SUDO DEBIAN_FRONTEND=noninteractive apt-get install -y $pkgs"
52+
return $?
53+
}
54+
55+
apt_install_pkg_version() {
56+
pkg="$1"; ver="$2"
57+
if [ -z "$pkg" ] || [ -z "$ver" ]; then
58+
die "apt_install_pkg_version: need pkg and version"
59+
fi
60+
require_apt
61+
apt_update_if_needed || rc=$?; rc=${rc:-0}; [ "$rc" -eq 2 ] && return 2
62+
if ! need_root_or_skip; then
63+
return 2
64+
fi
65+
if ! network_is_ok; then
66+
log_skip "Offline: cannot install ${pkg}=${ver}."
67+
return 2
68+
fi
69+
log_info "cmd(root): DEBIAN_FRONTEND=noninteractive apt-get install -y ${pkg}=${ver}"
70+
sh -c "$SUDO DEBIAN_FRONTEND=noninteractive apt-get install -y ${pkg}=${ver}"
71+
return $?
72+
}
73+
74+
apt_upgrade_pkg() {
75+
pkg="$1"
76+
if [ -z "$pkg" ]; then
77+
die "apt_upgrade_pkg: need pkg name"
78+
fi
79+
require_apt
80+
apt_update_if_needed || rc=$?; rc=${rc:-0}; [ "$rc" -eq 2 ] && return 2
81+
if ! need_root_or_skip; then
82+
return 2
83+
fi
84+
if ! network_is_ok; then
85+
log_skip "Offline: cannot upgrade $pkg."
86+
return 2
87+
fi
88+
log_info "cmd(root): apt-get install -y --only-upgrade $pkg || apt-get install -y $pkg"
89+
sh -c "$SUDO DEBIAN_FRONTEND=noninteractive apt-get install -y --only-upgrade $pkg || $SUDO DEBIAN_FRONTEND=noninteractive apt-get install -y $pkg"
90+
return $?
91+
}
92+
93+
apt_pkg_installed() {
94+
dpkg -s "$1" >/dev/null 2>&1
95+
}
96+
97+
apt_list_versions() {
98+
require_apt
99+
pkg="$1"
100+
log_info "Available versions for $pkg:"
101+
if have_cmd apt-cache; then
102+
apt-cache policy "$pkg" | sed -n 's/ *Candidate: /candidate: /p; s/ *Installed: /installed: /p; s/ *Version table://p'
103+
apt-cache madison "$pkg" 2>/dev/null | awk '{print $1" "$2" "$3}' || true
104+
fi
105+
}
106+
107+
apt_ensure_deps() {
108+
deps="$*"
109+
miss=""
110+
for p in $deps; do
111+
if ! apt_pkg_installed "$p"; then
112+
miss="$miss $p"
113+
fi
114+
done
115+
if [ -n "$miss" ]; then
116+
apt_install_pkgs "$miss"
117+
return $?
118+
fi
119+
log_info "All deps already installed"
120+
return 0
121+
}
122+
123+
# ---- New: uninstall helpers (non-interactive; no network required) ----
124+
apt_remove_pkgs() {
125+
pkgs="$*"
126+
[ -n "$pkgs" ] || return 0
127+
if ! need_root_or_skip; then
128+
return 2
129+
fi
130+
log_info "cmd(root): DEBIAN_FRONTEND=noninteractive apt-get purge -y $pkgs"
131+
sh -c "$SUDO DEBIAN_FRONTEND=noninteractive apt-get purge -y $pkgs"
132+
return $?
133+
}
134+
135+
apt_autoremove() {
136+
if ! need_root_or_skip; then
137+
return 2
138+
fi
139+
log_info "cmd(root): DEBIAN_FRONTEND=noninteractive apt-get autoremove -y"
140+
sh -c "$SUDO DEBIAN_FRONTEND=noninteractive apt-get autoremove -y"
141+
return $?
142+
}

0 commit comments

Comments
 (0)