kitowall 7.7.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Root-only helper for installing host system packages.
5
+ # Intended to be invoked via pkexec from Kitowall.
6
+
7
+ need_cmd() {
8
+ command -v "$1" >/dev/null 2>&1
9
+ }
10
+
11
+ require_root() {
12
+ if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
13
+ echo "[bootstrap-system] this helper must run as root" >&2
14
+ exit 1
15
+ fi
16
+ }
17
+
18
+ wait_pacman_lock() {
19
+ local lock_file="/var/lib/pacman/db.lck"
20
+ local tries=0
21
+ local max_tries=40
22
+
23
+ while [[ -e "$lock_file" ]]; do
24
+ if pgrep -x pacman >/dev/null 2>&1 || \
25
+ pgrep -x yay >/dev/null 2>&1 || \
26
+ pgrep -x paru >/dev/null 2>&1 || \
27
+ pgrep -x makepkg >/dev/null 2>&1; then
28
+ tries=$((tries + 1))
29
+ if ((tries > max_tries)); then
30
+ echo "[bootstrap-system] pacman lock busy for too long: $lock_file" >&2
31
+ return 1
32
+ fi
33
+ echo "[bootstrap-system] waiting for pacman lock (${tries}/${max_tries})..."
34
+ sleep 3
35
+ continue
36
+ fi
37
+
38
+ echo "[bootstrap-system] removing stale pacman lock: $lock_file"
39
+ rm -f "$lock_file"
40
+ break
41
+ done
42
+ }
43
+
44
+ install_arch_deps() {
45
+ local repo_pkgs=(
46
+ nodejs npm
47
+ hyprland
48
+ awww
49
+ cava
50
+ pkgconf
51
+ gtk4
52
+ gtk4-layer-shell
53
+ jq
54
+ git
55
+ base-devel
56
+ )
57
+
58
+ if need_cmd rustup; then
59
+ repo_pkgs+=(rustup)
60
+ elif need_cmd rustc && need_cmd cargo; then
61
+ :
62
+ else
63
+ repo_pkgs+=(rustup)
64
+ fi
65
+
66
+ echo "[bootstrap-system] installing Arch packages: ${repo_pkgs[*]}"
67
+ wait_pacman_lock
68
+ pacman -S --needed --noconfirm "${repo_pkgs[@]}"
69
+ }
70
+
71
+ arch_packages_for_ids() {
72
+ local id
73
+ local pkgs=()
74
+ for id in "$@"; do
75
+ case "$id" in
76
+ nodejs) pkgs+=(nodejs) ;;
77
+ npm) pkgs+=(npm) ;;
78
+ hyprctl) pkgs+=(hyprland) ;;
79
+ awww|awww-daemon|swww|swww-daemon) pkgs+=(awww) ;;
80
+ cava) pkgs+=(cava) ;;
81
+ pkgconf) pkgs+=(pkgconf) ;;
82
+ gtk4) pkgs+=(gtk4) ;;
83
+ gtk4-layer-shell) pkgs+=(gtk4-layer-shell) ;;
84
+ jq) pkgs+=(jq) ;;
85
+ git) pkgs+=(git) ;;
86
+ base-devel) pkgs+=(base-devel) ;;
87
+ rustup|cargo|rustc) pkgs+=(rustup) ;;
88
+ esac
89
+ done
90
+ printf '%s\n' "${pkgs[@]}" | awk 'NF && !seen[$0]++'
91
+ }
92
+
93
+ install_arch_selected() {
94
+ local requested=("$@")
95
+ local repo_pkgs=()
96
+ mapfile -t repo_pkgs < <(arch_packages_for_ids "${requested[@]}")
97
+ if ((${#repo_pkgs[@]} == 0)); then
98
+ echo "[bootstrap-system] no supported Arch packages mapped from: ${requested[*]}" >&2
99
+ return 1
100
+ fi
101
+ echo "[bootstrap-system] installing selected Arch packages: ${repo_pkgs[*]}"
102
+ wait_pacman_lock
103
+ pacman -S --needed --noconfirm "${repo_pkgs[@]}"
104
+ }
105
+
106
+ install_ubuntu_deps() {
107
+ local pkgs=(
108
+ nodejs npm
109
+ rustc cargo
110
+ pkg-config
111
+ libgtk-4-dev
112
+ jq curl git
113
+ cava
114
+ )
115
+ echo "[bootstrap-system] installing Debian/Ubuntu packages: ${pkgs[*]}"
116
+ apt-get update
117
+ apt-get install -y "${pkgs[@]}"
118
+ }
119
+
120
+ ubuntu_packages_for_ids() {
121
+ local id
122
+ local pkgs=()
123
+ for id in "$@"; do
124
+ case "$id" in
125
+ nodejs) pkgs+=(nodejs) ;;
126
+ npm) pkgs+=(npm) ;;
127
+ cava) pkgs+=(cava) ;;
128
+ jq) pkgs+=(jq) ;;
129
+ git) pkgs+=(git) ;;
130
+ rustup|cargo|rustc) pkgs+=(rustc cargo) ;;
131
+ pkgconf) pkgs+=(pkg-config) ;;
132
+ gtk4) pkgs+=(libgtk-4-dev) ;;
133
+ esac
134
+ done
135
+ printf '%s\n' "${pkgs[@]}" | awk 'NF && !seen[$0]++'
136
+ }
137
+
138
+ install_ubuntu_selected() {
139
+ local requested=("$@")
140
+ local pkgs=()
141
+ mapfile -t pkgs < <(ubuntu_packages_for_ids "${requested[@]}")
142
+ if ((${#pkgs[@]} == 0)); then
143
+ echo "[bootstrap-system] no supported Debian/Ubuntu packages mapped from: ${requested[*]}" >&2
144
+ return 1
145
+ fi
146
+ echo "[bootstrap-system] installing selected Debian/Ubuntu packages: ${pkgs[*]}"
147
+ apt-get update
148
+ apt-get install -y "${pkgs[@]}"
149
+ }
150
+
151
+ main() {
152
+ require_root
153
+
154
+ if (($# > 0)); then
155
+ if need_cmd pacman; then
156
+ install_arch_selected "$@"
157
+ echo "[ok] selected system dependencies installed"
158
+ exit 0
159
+ fi
160
+
161
+ if need_cmd apt-get; then
162
+ install_ubuntu_selected "$@"
163
+ echo "[ok] selected system dependencies installed"
164
+ exit 0
165
+ fi
166
+
167
+ echo "[bootstrap-system] unsupported distro package manager for selected install: $*" >&2
168
+ exit 1
169
+ fi
170
+
171
+ if need_cmd pacman; then
172
+ install_arch_deps
173
+ echo "[ok] system dependencies installed"
174
+ exit 0
175
+ fi
176
+
177
+ if need_cmd apt-get; then
178
+ install_ubuntu_deps
179
+ echo "[ok] system dependencies installed"
180
+ exit 0
181
+ fi
182
+
183
+ echo "[bootstrap-system] unsupported distro package manager. Install manually: nodejs npm rust cargo pkg-config gtk4 gtk4-layer-shell awww hyprland cava" >&2
184
+ exit 1
185
+ }
186
+
187
+ main "$@"