karnel-termux 4.17.1 → 4.17.3

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.
Files changed (33) hide show
  1. package/karnel/RELEASE_COMMIT +1 -1
  2. package/karnel/cli/commands/backup.sh +1 -1
  3. package/karnel/cli/commands/supabase.sh +1 -1
  4. package/karnel/tools/ai/antigravity-cli/install.sh +18 -6
  5. package/karnel/tools/ai/cline/install.sh +14 -0
  6. package/karnel/tools/ai/ctx7/install.sh +7 -0
  7. package/karnel/tools/ai/droid/install.sh +19 -6
  8. package/karnel/tools/ai/freebuff/install.sh +7 -0
  9. package/karnel/tools/ai/goose/install.sh +1 -0
  10. package/karnel/tools/ai/keelcode/install.sh +7 -0
  11. package/karnel/tools/ai/kimchi-code/install.sh +18 -6
  12. package/karnel/tools/ai/oh-my-pi/install.sh +31 -6
  13. package/karnel/tools/ai/omni-route/install.sh +7 -0
  14. package/karnel/tools/ai/openspec/install.sh +7 -0
  15. package/karnel/tools/ai/puter/install.sh +7 -0
  16. package/karnel/tools/ai/supercode-cli/install.sh +7 -0
  17. package/karnel/tools/db/redis/install.sh +4 -1
  18. package/karnel/tools/dev/openssh/install.sh +4 -1
  19. package/karnel/tools/dev/tmux/install.sh +4 -1
  20. package/karnel/tools/lang/bun/install.sh +19 -6
  21. package/karnel/tools/npm/turbopack/install.sh +11 -0
  22. package/karnel/tools/osint/robin/install.sh +6 -2
  23. package/karnel/tools/security/amass/install.sh +7 -0
  24. package/karnel/tools/security/dnsrecon/install.sh +4 -0
  25. package/karnel/tools/security/enum4linux/install.sh +4 -0
  26. package/karnel/tools/security/masscan/install.sh +3 -3
  27. package/karnel/tools/security/nikto/install.sh +4 -0
  28. package/karnel/tools/security/sqlmap/install.sh +4 -0
  29. package/karnel/tools/security/subfinder/install.sh +7 -0
  30. package/karnel/tools/security/theharvester/install.sh +4 -0
  31. package/karnel/tools/security/whatweb/install.sh +4 -0
  32. package/karnel/utils/agent_actions.sh +5 -0
  33. package/package.json +1 -1
@@ -1 +1 @@
1
- c9797260b1affd17127bf2b1e5c22c1cf184adb1
1
+ 5b88c3c7229d293e0e92665c71bcb3501a87ed74
@@ -10,7 +10,7 @@ mkdir -p "$BACKUP_DIR"
10
10
 
11
11
  backup_main() {
12
12
  local cmd="${1:-}"
13
- shift 2>/dev/null || true
13
+ shift || true
14
14
 
15
15
  case "$cmd" in
16
16
  --help|-h) backup_help ;;
@@ -5,7 +5,7 @@ import "@/utils/colors"
5
5
 
6
6
  supabase_main() {
7
7
  local subcommand="${1:-help}"
8
- shift 2>/dev/null || true
8
+ shift || true
9
9
 
10
10
  case "$subcommand" in
11
11
  help|--help|-h)
@@ -3,6 +3,7 @@
3
3
  import "@/utils/log"
4
4
  import "@/utils/colors"
5
5
  import "@/utils/version"
6
+ import "@/utils/install"
6
7
 
7
8
  LOG_FILE="$KARNEL_CACHE/install_ai.log"
8
9
  AGY_DATA_DIR="$HOME/.local/share/karnel-data/antigravity-cli"
@@ -63,17 +64,22 @@ _antigravity_download_binary() {
63
64
  }
64
65
 
65
66
  _antigravity_download_binary_impl() {
66
- local latest_version
67
- latest_version=$(_antigravity_get_latest_version)
68
- if [ -z "$latest_version" ]; then
69
- log_error "Failed to fetch latest Antigravity version"
67
+ local manifest
68
+ manifest=$(curl -fsSL "$MANIFEST_URL") || {
69
+ log_error "Failed to fetch Antigravity CLI manifest"
70
+ return 1
71
+ }
72
+ local latest_version download_url manifest_sha256
73
+ latest_version=$(printf '%s' "$manifest" | jq -r .version)
74
+ download_url=$(printf '%s' "$manifest" | jq -r .url)
75
+ manifest_sha256=$(printf '%s' "$manifest" | jq -r '.sha256 // empty')
76
+ if [ -z "$latest_version" ] || [ -z "$download_url" ]; then
77
+ log_error "Failed to parse Antigravity CLI manifest"
70
78
  return 1
71
79
  fi
72
80
 
73
81
  mkdir -p "$AGY_DATA_DIR"
74
82
 
75
- local download_url
76
- download_url=$(_antigravity_get_download_url)
77
83
  local tarball="$AGY_DATA_DIR/agy.tar.gz"
78
84
 
79
85
  if ! curl -fsSL -o "$tarball" "$download_url" &>>"$LOG_FILE"; then
@@ -81,6 +87,12 @@ _antigravity_download_binary_impl() {
81
87
  return 1
82
88
  fi
83
89
 
90
+ if [[ "$manifest_sha256" =~ ^[0-9a-f]{64}$ ]]; then
91
+ verify_sha256 "$tarball" "$manifest_sha256" || return 1
92
+ else
93
+ log_warn "Antigravity CLI manifest does not publish a SHA-256; skipping integrity verification"
94
+ fi
95
+
84
96
  if ! tar -xzf "$tarball" -C "$AGY_DATA_DIR" &>>"$LOG_FILE"; then
85
97
  log_error "Failed to extract Antigravity CLI binary"
86
98
  return 1
@@ -83,6 +83,20 @@ _cline_install_global_impl() {
83
83
  return 1
84
84
  fi
85
85
 
86
+ local expected actual
87
+ expected=$(npm view "@cline/cli-linux-arm64@$version" dist.integrity 2>/dev/null)
88
+ if [[ -z "$expected" ]]; then
89
+ rm -f "$tarball"
90
+ log_error "Falha ao obter a integridade do binário do Cline no registry npm"
91
+ return 1
92
+ fi
93
+ actual=$(node -e 'const c=require("crypto");const h=c.createHash("sha512");h.update(require("fs").readFileSync(process.argv[1]));process.stdout.write("sha512-"+h.digest("base64"))' "$tarball" 2>/dev/null) || actual=""
94
+ if [[ "$actual" != "$expected" ]]; then
95
+ rm -f "$tarball"
96
+ log_error "Integridade do binário do Cline não confere (esperado $expected)"
97
+ return 1
98
+ fi
99
+
86
100
  mkdir -p "$CLINE_DATA_DIR"
87
101
  : >"$CLINE_DATA_DIR/$CLINE_MARKER"
88
102
  if ! tar -xzf "$tarball" -C "$CLINE_DATA_DIR" &>>"$LOG_FILE"; then
@@ -13,6 +13,13 @@ install_ctx7() {
13
13
  return 2
14
14
  fi
15
15
 
16
+ if ! command -v npm &>/dev/null; then
17
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
18
+ log_error "Failed to install Node.js (required by ctx7)"
19
+ return 1
20
+ fi
21
+ fi
22
+
16
23
  log_info "Installing ctx7 (Context7 documentation provider)..."
17
24
  npm install -g ctx7 2>/dev/null
18
25
  local rc=$?
@@ -3,6 +3,7 @@
3
3
  import "@/utils/log"
4
4
  import "@/utils/colors"
5
5
  import "@/utils/version"
6
+ import "@/utils/install"
6
7
  import "@/utils/uninstall"
7
8
 
8
9
  : "${KARNEL_DATA:=${XDG_DATA_HOME:-$HOME/.local/share}/karnel-data}"
@@ -239,14 +240,20 @@ _droid_ubuntu_install_bin() {
239
240
 
240
241
  local binary_url="https://downloads.factory.ai/factory-cli/releases/$latest_version/linux/arm64/droid"
241
242
 
242
- _droid_proot_ubuntu /bin/bash -c "
243
+ local expected
244
+ expected=$(curl -fsSL "$binary_url.sha256" 2>/dev/null | awk '{print $1}') || expected=""
245
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
246
+ log_warn "No published SHA-256 for Droid; skipping integrity verification"
247
+ fi
248
+ _droid_proot_ubuntu /bin/bash -c '
243
249
  mkdir -p /tmp/droid-install &&
244
- curl -fsSL '$binary_url' -o /tmp/droid-install/droid &&
250
+ curl -fsSL "$1" -o /tmp/droid-install/droid &&
251
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/droid-install/droid | awk "{print \$1}")" = "$2" ]; } &&
245
252
  mkdir -p /usr/local/bin &&
246
253
  mv /tmp/droid-install/droid /usr/local/bin/droid &&
247
254
  chmod +x /usr/local/bin/droid &&
248
255
  rm -rf /tmp/droid-install
249
- " &>>"$LOG_FILE"
256
+ ' bash "$binary_url" "$expected" &>>"$LOG_FILE"
250
257
 
251
258
  local droid_bin="$(_droid_detect_ubuntu_root)/usr/local/bin/droid"
252
259
  if [ ! -f "$droid_bin" ]; then
@@ -413,14 +420,20 @@ _update_droid_proot_impl() {
413
420
 
414
421
  local binary_url="https://downloads.factory.ai/factory-cli/releases/$latest_version/linux/arm64/droid"
415
422
 
416
- _droid_proot_ubuntu /bin/bash -c "
423
+ local expected
424
+ expected=$(curl -fsSL "$binary_url.sha256" 2>/dev/null | awk '{print $1}') || expected=""
425
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
426
+ log_warn "No published SHA-256 for Droid; skipping integrity verification"
427
+ fi
428
+ _droid_proot_ubuntu /bin/bash -c '
417
429
  rm -f /usr/local/bin/droid &&
418
430
  mkdir -p /tmp/droid-update &&
419
- curl -fsSL '$binary_url' -o /tmp/droid-update/droid &&
431
+ curl -fsSL "$1" -o /tmp/droid-update/droid &&
432
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/droid-update/droid | awk "{print \$1}")" = "$2" ]; } &&
420
433
  mv /tmp/droid-update/droid /usr/local/bin/droid &&
421
434
  chmod +x /usr/local/bin/droid &&
422
435
  rm -rf /tmp/droid-update
423
- " &>>"$LOG_FILE"
436
+ ' bash "$binary_url" "$expected" &>>"$LOG_FILE"
424
437
 
425
438
  local ubuntu_root
426
439
  ubuntu_root="$(_droid_detect_ubuntu_root)"
@@ -9,6 +9,13 @@ install_freebuff() {
9
9
  return 2
10
10
  fi
11
11
 
12
+ if ! command -v npm &>/dev/null; then
13
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
14
+ log_error "Failed to install Node.js (required by Freebuff)"
15
+ return 1
16
+ fi
17
+ fi
18
+
12
19
  log_info "Installing Freebuff..."
13
20
  npm install -g freebuff || {
14
21
  log_error "Failed to install Freebuff"
@@ -196,6 +196,7 @@ _goose_download_binary_proot_impl() {
196
196
  log_error "Failed to download Goose CLI"
197
197
  return 1
198
198
  fi
199
+ verify_github_release_asset aaif-goose/goose "v${latest_version}" "$tarball" "$GOOSE_DATA_DIR/$tarball" || return 1
199
200
  if ! tar -xzf "$GOOSE_DATA_DIR/$tarball" -C "$GOOSE_DATA_DIR" &>>"$LOG_FILE"; then
200
201
  rm -f "$GOOSE_DATA_DIR/$tarball"
201
202
  log_error "Failed to extract Goose CLI"
@@ -117,6 +117,13 @@ install_keelcode() {
117
117
  fi
118
118
  _keelcode_verify_ownership || return 1
119
119
 
120
+ if ! command -v npm &>/dev/null; then
121
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
122
+ log_error "Failed to install Node.js (required by KeelCode)"
123
+ return 1
124
+ fi
125
+ fi
126
+
120
127
  log_info "Installing KeelCode..."
121
128
  local output rc
122
129
  output="$(npm install -g "$KEELCODE_PACKAGE" --force 2>&1)"
@@ -262,9 +262,15 @@ _kimchi_ubuntu_install_bin() {
262
262
 
263
263
  local download_url="https://github.com/getkimchi/kimchi/releases/download/$latest_version/kimchi_linux_arm64.tar.gz"
264
264
 
265
- _kimchi_proot_ubuntu /bin/bash -c "
265
+ local expected
266
+ expected=$(github_release_asset_sha256 getkimchi/kimchi "$latest_version" "kimchi_linux_arm64.tar.gz") || expected=""
267
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
268
+ log_warn "No published SHA-256 for Kimchi; skipping integrity verification"
269
+ fi
270
+ _kimchi_proot_ubuntu /bin/bash -c '
266
271
  mkdir -p /tmp/kimchi-install &&
267
- curl -fsSL '$download_url' -o /tmp/kimchi-install/kimchi.tar.gz &&
272
+ curl -fsSL "$1" -o /tmp/kimchi-install/kimchi.tar.gz &&
273
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/kimchi-install/kimchi.tar.gz | awk "{print \$1}")" = "$2" ]; } &&
268
274
  tar -zxf /tmp/kimchi-install/kimchi.tar.gz -C /tmp/kimchi-install &&
269
275
  mkdir -p /usr/local/bin /usr/local/share &&
270
276
  mv /tmp/kimchi-install/bin/kimchi /usr/local/bin/kimchi &&
@@ -272,7 +278,7 @@ _kimchi_ubuntu_install_bin() {
272
278
  rm -rf /usr/local/share/kimchi &&
273
279
  mv /tmp/kimchi-install/share/kimchi /usr/local/share/kimchi &&
274
280
  rm -rf /tmp/kimchi-install
275
- " &>>"$LOG_FILE"
281
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"
276
282
 
277
283
  local kimchi_bin
278
284
  kimchi_bin="$(_kimchi_detect_ubuntu_root)/usr/local/bin/kimchi"
@@ -479,9 +485,15 @@ _update_kimchi_proot_impl() {
479
485
 
480
486
  local download_url="https://github.com/getkimchi/kimchi/releases/download/$latest_version/kimchi_linux_arm64.tar.gz"
481
487
 
482
- _kimchi_proot_ubuntu /bin/bash -c "
488
+ local expected
489
+ expected=$(github_release_asset_sha256 getkimchi/kimchi "$latest_version" "kimchi_linux_arm64.tar.gz") || expected=""
490
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
491
+ log_warn "No published SHA-256 for Kimchi; skipping integrity verification"
492
+ fi
493
+ _kimchi_proot_ubuntu /bin/bash -c '
483
494
  mkdir -p /tmp/kimchi-install &&
484
- curl -fsSL '$download_url' -o /tmp/kimchi-install/kimchi.tar.gz &&
495
+ curl -fsSL "$1" -o /tmp/kimchi-install/kimchi.tar.gz &&
496
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/kimchi-install/kimchi.tar.gz | awk "{print \$1}")" = "$2" ]; } &&
485
497
  tar -zxf /tmp/kimchi-install/kimchi.tar.gz -C /tmp/kimchi-install &&
486
498
  rm -f /usr/local/bin/kimchi &&
487
499
  mv /tmp/kimchi-install/bin/kimchi /usr/local/bin/kimchi &&
@@ -489,7 +501,7 @@ _update_kimchi_proot_impl() {
489
501
  rm -rf /usr/local/share/kimchi &&
490
502
  mv /tmp/kimchi-install/share/kimchi /usr/local/share/kimchi &&
491
503
  rm -rf /tmp/kimchi-install
492
- " &>>"$LOG_FILE"
504
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"
493
505
 
494
506
  local kimchi_bin
495
507
  kimchi_bin="$(_kimchi_detect_ubuntu_root)/usr/local/bin/kimchi"
@@ -3,6 +3,7 @@
3
3
  import "@/utils/log"
4
4
  import "@/utils/colors"
5
5
  import "@/utils/version"
6
+ import "@/utils/install"
6
7
 
7
8
  LOG_FILE="$KARNEL_CACHE/install_ai.log"
8
9
  OMP_DATA_DIR="$HOME/.local/share/karnel-data/oh-my-pi"
@@ -85,8 +86,16 @@ _download_omp_binary_impl() {
85
86
  log_error "Failed to download Oh-My-Pi binary"
86
87
  return 1
87
88
  fi
89
+ local expected
90
+ expected=$(github_release_asset_sha256 can1357/oh-my-pi "$latest_version" "omp-linux-arm64") || expected=""
91
+ if [[ "$expected" =~ ^[0-9a-f]{64}$ ]]; then
92
+ verify_sha256 "$target_dir/omp" "$expected" || return 1
93
+ else
94
+ log_warn "No published SHA-256 for Oh-My-Pi; skipping integrity verification"
95
+ fi
88
96
  chmod +x "$target_dir/omp"
89
97
  echo "$latest_version" > "$target_dir/version"
98
+ : > "$target_dir/.karnel-managed"
90
99
  return 0
91
100
  }
92
101
 
@@ -160,15 +169,21 @@ _install_omp_proot_impl() {
160
169
  return 1
161
170
  fi
162
171
  local download_url="https://github.com/can1357/oh-my-pi/releases/download/$latest_version/omp-linux-arm64"
163
- if ! _omp_proot_ubuntu /bin/bash -c "
172
+ local expected
173
+ expected=$(github_release_asset_sha256 can1357/oh-my-pi "$latest_version" "omp-linux-arm64") || expected=""
174
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
175
+ log_warn "No published SHA-256 for Oh-My-Pi; skipping integrity verification"
176
+ fi
177
+ if ! _omp_proot_ubuntu /bin/bash -c '
164
178
  mkdir -p /tmp/omp-install &&
165
- curl -fsSL '$download_url' -o /tmp/omp-install/omp &&
179
+ curl -fsSL "$1" -o /tmp/omp-install/omp &&
180
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/omp-install/omp | awk "{print \$1}")" = "$2" ]; } &&
166
181
  chmod +x /tmp/omp-install/omp &&
167
182
  test -x /tmp/omp-install/omp &&
168
183
  mkdir -p /usr/local/bin &&
169
184
  mv /tmp/omp-install/omp /usr/local/bin/omp &&
170
185
  rm -rf /tmp/omp-install
171
- " &>>"$LOG_FILE"; then
186
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"; then
172
187
  log_error "Failed to install Oh-My-Pi binary"
173
188
  return 1
174
189
  fi
@@ -209,6 +224,10 @@ install_oh_my_pi() {
209
224
  }
210
225
 
211
226
  _uninstall_omp_native_impl() {
227
+ if [[ ! -f "$OMP_DATA_DIR/.karnel-managed" ]]; then
228
+ log_error "Refusing to remove an Oh-My-Pi installation that is not managed by Karnel"
229
+ return 1
230
+ fi
212
231
  rm -f "$PREFIX/bin/omp"
213
232
  rm -rf "$OMP_DATA_DIR"
214
233
  }
@@ -256,14 +275,20 @@ _update_omp_proot_impl() {
256
275
  return 1
257
276
  fi
258
277
  local download_url="https://github.com/can1357/oh-my-pi/releases/download/$latest_version/omp-linux-arm64"
259
- if ! _omp_proot_ubuntu /bin/bash -c "
278
+ local expected
279
+ expected=$(github_release_asset_sha256 can1357/oh-my-pi "$latest_version" "omp-linux-arm64") || expected=""
280
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
281
+ log_warn "No published SHA-256 for Oh-My-Pi; skipping integrity verification"
282
+ fi
283
+ if ! _omp_proot_ubuntu /bin/bash -c '
260
284
  mkdir -p /tmp/omp-update &&
261
- curl -fsSL '$download_url' -o /tmp/omp-update/omp &&
285
+ curl -fsSL "$1" -o /tmp/omp-update/omp &&
286
+ { [ -z "$2" ] || [ "$(sha256sum /tmp/omp-update/omp | awk "{print \$1}")" = "$2" ]; } &&
262
287
  chmod +x /tmp/omp-update/omp &&
263
288
  test -x /tmp/omp-update/omp &&
264
289
  mv /tmp/omp-update/omp /usr/local/bin/omp &&
265
290
  rm -rf /tmp/omp-update
266
- " &>>"$LOG_FILE"; then
291
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"; then
267
292
  log_error "Failed to update Oh-My-Pi binary"
268
293
  return 1
269
294
  fi
@@ -127,6 +127,13 @@ install_omni_route() {
127
127
  fi
128
128
  fi
129
129
 
130
+ if ! command -v npm &>/dev/null; then
131
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
132
+ log_error "Failed to install Node.js (required by omniRoute)"
133
+ return 1
134
+ fi
135
+ fi
136
+
130
137
  log_info "Installing omniRoute (this may take a while)..."
131
138
  if command -v npm >/dev/null 2>&1 && npm i karnelroute --prefix "$OMNI_ROUTE_PKG" 2>>"$LOG_FILE"; then
132
139
  sed -i '1s|^#!/usr/bin/env node|#!'"$PREFIX"'/bin/node|' "$OMNI_ROUTE_LOCAL_BIN" 2>/dev/null
@@ -13,6 +13,13 @@ install_openspec() {
13
13
  return 2
14
14
  fi
15
15
 
16
+ if ! command -v npm &>/dev/null; then
17
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
18
+ log_error "Failed to install Node.js (required by openspec)"
19
+ return 1
20
+ fi
21
+ fi
22
+
16
23
  log_info "Installing openspec (Spec-Driven Development framework)..."
17
24
  npm install -g @fission-ai/openspec@latest 2>/dev/null
18
25
  local rc=$?
@@ -12,6 +12,13 @@ install_puter() {
12
12
  return 2
13
13
  fi
14
14
 
15
+ if ! command -v npm &>/dev/null; then
16
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
17
+ log_error "Failed to install Node.js (required by Puter CLI)"
18
+ return 1
19
+ fi
20
+ fi
21
+
15
22
  log_info "Installing Puter CLI..."
16
23
  if ! npm install -g "$PUTER_PACKAGE" &>>"$PUTER_LOG_FILE"; then
17
24
  log_error "Failed to install Puter CLI; see $PUTER_LOG_FILE"
@@ -8,6 +8,13 @@ install_supercode_cli() {
8
8
  log_info "Supercode CLI is already installed"
9
9
  return 2
10
10
  fi
11
+ if ! command -v npm &>/dev/null; then
12
+ if ! pkg install nodejs-lts -y &>>"$LOG_FILE"; then
13
+ log_error "Failed to install Node.js (required by Supercode CLI)"
14
+ return 1
15
+ fi
16
+ fi
17
+
11
18
  log_info "Installing Supercode CLI..."
12
19
  local output rc
13
20
  output="$(npm install -g supercode-cli 2>&1)"
@@ -50,7 +50,10 @@ _update_redis_impl() {
50
50
 
51
51
  _do_redis_update() {
52
52
  mkdir -p "$(dirname "$LOG_FILE")"
53
- pkg upgrade redis -y &>>"$LOG_FILE"
53
+ if ! pkg upgrade redis -y &>>"$LOG_FILE"; then
54
+ log_error "Falha ao atualizar Redis"
55
+ return 1
56
+ fi
54
57
  }
55
58
 
56
59
  update_redis() {
@@ -62,7 +62,10 @@ _update_openssh_pkg() {
62
62
 
63
63
  _do_openssh_update() {
64
64
  mkdir -p "$(dirname "$LOG_FILE")"
65
- yes | pkg upgrade openssh -y &>>"$LOG_FILE"
65
+ if ! yes | pkg upgrade openssh -y &>>"$LOG_FILE"; then
66
+ log_error "Falha ao atualizar OpenSSH"
67
+ return 1
68
+ fi
66
69
  }
67
70
 
68
71
  update_openssh() {
@@ -62,7 +62,10 @@ _update_tmux_pkg() {
62
62
 
63
63
  _do_tmux_update() {
64
64
  mkdir -p "$(dirname "$LOG_FILE")"
65
- yes | pkg upgrade tmux -y &>>"$LOG_FILE"
65
+ if ! yes | pkg upgrade tmux -y &>>"$LOG_FILE"; then
66
+ log_error "Falha ao atualizar Tmux"
67
+ return 1
68
+ fi
66
69
  }
67
70
 
68
71
  update_tmux() {
@@ -3,6 +3,7 @@
3
3
  import "@/utils/log"
4
4
  import "@/utils/colors"
5
5
  import "@/utils/version"
6
+ import "@/utils/install"
6
7
 
7
8
  LOG_FILE="$KARNEL_CACHE/install_lang.log"
8
9
  BUN_DATA_DIR="$KARNEL_DATA/bun"
@@ -268,16 +269,22 @@ _install_bun_proot_impl() {
268
269
  _bun_proot_ubuntu /bin/bash -c \
269
270
  'apt-get update && apt-get upgrade -y && apt-get install -y curl ca-certificates unzip' \
270
271
  &>>"$LOG_FILE"
271
- _bun_proot_ubuntu /bin/bash -c "
272
+ local expected
273
+ expected=$(github_release_asset_sha256 "$BUN_REPO" "bun-v$version" "bun-linux-aarch64.zip") || expected=""
274
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
275
+ log_warn "No published SHA-256 for Bun; skipping integrity verification"
276
+ fi
277
+ _bun_proot_ubuntu /bin/bash -c '
272
278
  export HOME=/root TMPDIR=/tmp
273
279
  cd /tmp &&
274
- curl -fsSL '$download_url' -o bun.zip &&
280
+ curl -fsSL "$1" -o bun.zip &&
281
+ { [ -z "$2" ] || [ "$(sha256sum bun.zip | awk "{print \$1}")" = "$2" ]; } &&
275
282
  unzip -o bun.zip >/dev/null 2>&1 &&
276
283
  mkdir -p /usr/local/bin &&
277
284
  mv bun-linux-aarch64/bun /usr/local/bin/bun &&
278
285
  chmod +x /usr/local/bin/bun &&
279
286
  rm -rf bun.zip bun-linux-aarch64
280
- " &>>"$LOG_FILE"
287
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"
281
288
  local ubuntu_root
282
289
  ubuntu_root="$(_bun_detect_ubuntu_root)"
283
290
  if [ -z "$ubuntu_root" ]; then
@@ -374,16 +381,22 @@ _update_bun_proot() {
374
381
  fi
375
382
  local download_url="https://github.com/$BUN_REPO/releases/download/bun-v$version/bun-linux-aarch64.zip"
376
383
  _bun_proot_ubuntu /bin/bash -c 'rm -f /usr/local/bin/bun' &>>"$LOG_FILE"
377
- _bun_proot_ubuntu /bin/bash -c "
384
+ local expected
385
+ expected=$(github_release_asset_sha256 "$BUN_REPO" "bun-v$version" "bun-linux-aarch64.zip") || expected=""
386
+ if [[ ! "$expected" =~ ^[0-9a-f]{64}$ ]]; then
387
+ log_warn "No published SHA-256 for Bun; skipping integrity verification"
388
+ fi
389
+ _bun_proot_ubuntu /bin/bash -c '
378
390
  export HOME=/root TMPDIR=/tmp
379
391
  cd /tmp &&
380
- curl -fsSL '$download_url' -o bun.zip &&
392
+ curl -fsSL "$1" -o bun.zip &&
393
+ { [ -z "$2" ] || [ "$(sha256sum bun.zip | awk "{print \$1}")" = "$2" ]; } &&
381
394
  unzip -o bun.zip >/dev/null 2>&1 &&
382
395
  mkdir -p /usr/local/bin &&
383
396
  mv bun-linux-aarch64/bun /usr/local/bin/bun &&
384
397
  chmod +x /usr/local/bin/bun &&
385
398
  rm -rf bun.zip bun-linux-aarch64
386
- " &>>"$LOG_FILE"
399
+ ' bash "$download_url" "$expected" &>>"$LOG_FILE"
387
400
  local ubuntu_root
388
401
  ubuntu_root="$(_bun_detect_ubuntu_root)"
389
402
  local bun_bin="$ubuntu_root/usr/local/bin/bun"
@@ -39,6 +39,17 @@ _install_deps_impl() {
39
39
  fi
40
40
  done
41
41
 
42
+ if [[ ! -f "$GLIBC_LIBDIR/ld-linux-aarch64.so.1" ]]; then
43
+ if ! yes | pkg install glibc-repo &>>"$LOG_FILE"; then
44
+ log_error "Failed to install glibc-repo"
45
+ return 1
46
+ fi
47
+ if ! yes | pkg install glibc &>>"$LOG_FILE"; then
48
+ log_error "Failed to install glibc (required by the glibc-linked Node.js)"
49
+ return 1
50
+ fi
51
+ fi
52
+
42
53
  return 0
43
54
  }
44
55
 
@@ -493,10 +493,14 @@ uninstall_robin() {
493
493
  return 2
494
494
  fi
495
495
 
496
+ if [[ ! -f "$ROBIN_ROOT/.managed-by-karnel" ]]; then
497
+ log_error "Robin at $ROBIN_ROOT is not managed by Karnel; refusing to remove it to avoid deleting unrelated data"
498
+ return 1
499
+ fi
500
+
496
501
  _robin_acquire_lock || return 1
497
502
  local rc=0
498
- _robin_migrate_legacy_layout || rc=$?
499
- if (( rc == 0 )) && _robin_runtime_active; then
503
+ if _robin_runtime_active; then
500
504
  log_error "Stop Robin before uninstalling it: karnel robin stop"
501
505
  rc=1
502
506
  fi
@@ -24,10 +24,17 @@ install_amass() (
24
24
  log_info "Instalando amass..."
25
25
  if [ ! -f "$_AMASS_MARKER" ] &&
26
26
  { pkg install -y amass 2>/dev/null || apt install -y amass 2>/dev/null; }; then
27
+ local bin; bin="$(command -v amass)"
28
+ [ -n "$bin" ] && sha256sum "$bin" > "$_AMASS_MARKER" 2>/dev/null
27
29
  log_success "amass instalado"
28
30
  return 0
29
31
  fi
30
32
 
33
+ command -v unzip >/dev/null 2>&1 || pkg install -y unzip >/dev/null 2>&1 || {
34
+ log_error "unzip indisponível; não foi possível extrair amass"
35
+ return 1
36
+ }
37
+
31
38
  local arch asset checksum url tmpdir archive amass_bin staged_bin
32
39
  arch=$(_amass_arch) || { log_error "Arquitetura não suportada"; return 1; }
33
40
  [[ "$arch" == armv7 ]] && arch="arm"
@@ -14,6 +14,10 @@ install_dnsrecon() {
14
14
  log_success "dnsrecon instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o dnsrecon via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_DNSRECON_REPO" "$_DNSRECON_COMMIT" "$_DNSRECON_DIR"; then
18
22
  pip install -r "$_DNSRECON_DIR/requirements.txt" 2>/dev/null
19
23
  chmod +x "$_DNSRECON_DIR/dnsrecon.py"
@@ -14,6 +14,10 @@ install_enum4linux() {
14
14
  log_success "enum4linux instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o enum4linux via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_ENUM4LINUX_REPO" "$_ENUM4LINUX_COMMIT" "$_ENUM4LINUX_DIR"; then
18
22
  chmod +x "$_ENUM4LINUX_DIR/enum4linux.pl"
19
23
  ln -sf "$_ENUM4LINUX_DIR/enum4linux.pl" "$PREFIX/bin/enum4linux"
@@ -46,9 +46,9 @@ update_masscan() {
46
46
  _pinned_git_repo_owned "$_MASSCAN_DIR" "$_MASSCAN_REPO" ||
47
47
  { [ -f "$_MASSCAN_DIR/.karnel-wrapper" ] && _adopt_pinned_git_repo "$_MASSCAN_DIR" "$_MASSCAN_REPO"; } || return 1
48
48
  install_pinned_git_repo "$_MASSCAN_REPO" "$_MASSCAN_COMMIT" "$_MASSCAN_DIR" || return 1
49
- make -C "$_MASSCAN_DIR" -j4 2>/dev/null
50
- install -m 755 "$_MASSCAN_DIR/bin/masscan" "$PREFIX/bin/masscan"
51
- sha256sum "$PREFIX/bin/masscan" > "$_MASSCAN_DIR/.karnel-wrapper"
49
+ make -C "$_MASSCAN_DIR" -j4 2>/dev/null || return 1
50
+ install -m 755 "$_MASSCAN_DIR/bin/masscan" "$PREFIX/bin/masscan" || return 1
51
+ sha256sum "$PREFIX/bin/masscan" > "$_MASSCAN_DIR/.karnel-wrapper" || return 1
52
52
  log_success "masscan atualizado"
53
53
  return 0
54
54
  fi
@@ -14,6 +14,10 @@ install_nikto() {
14
14
  log_success "nikto instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o nikto via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_NIKTO_REPO" "$_NIKTO_COMMIT" "$_NIKTO_DIR"; then
18
22
  ln -sf "$_NIKTO_DIR/program/nikto.pl" "$PREFIX/bin/nikto"
19
23
  chmod +x "$PREFIX/bin/nikto"
@@ -14,6 +14,10 @@ install_sqlmap() {
14
14
  log_success "sqlmap instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o sqlmap via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_SQLMAP_REPO" "$_SQLMAP_COMMIT" "$_SQLMAP_DIR"; then
18
22
  ln -sf "$_SQLMAP_DIR/sqlmap.py" "$PREFIX/bin/sqlmap"
19
23
  chmod +x "$PREFIX/bin/sqlmap"
@@ -24,10 +24,17 @@ install_subfinder() (
24
24
  log_info "Instalando subfinder..."
25
25
  if [ ! -f "$_SUBFINDER_MARKER" ] &&
26
26
  { pkg install -y subfinder 2>/dev/null || apt install -y subfinder 2>/dev/null; }; then
27
+ local bin; bin="$(command -v subfinder)"
28
+ [ -n "$bin" ] && sha256sum "$bin" > "$_SUBFINDER_MARKER" 2>/dev/null
27
29
  log_success "subfinder instalado"
28
30
  return 0
29
31
  fi
30
32
 
33
+ command -v unzip >/dev/null 2>&1 || pkg install -y unzip >/dev/null 2>&1 || {
34
+ log_error "unzip indisponível; não foi possível extrair subfinder"
35
+ return 1
36
+ }
37
+
31
38
  local arch asset checksum url tmpdir archive staged_bin
32
39
  arch=$(_subfinder_arch) || { log_error "Arquitetura não suportada"; return 1; }
33
40
  [[ "$arch" == armv7 ]] && arch="arm"
@@ -14,6 +14,10 @@ install_theharvester() {
14
14
  log_success "theharvester instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o theharvester via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_THEHARVESTER_REPO" "$_THEHARVESTER_COMMIT" "$_THEHARVESTER_DIR"; then
18
22
  pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>/dev/null
19
23
  chmod +x "$_THEHARVESTER_DIR/theHarvester.py"
@@ -14,6 +14,10 @@ install_whatweb() {
14
14
  log_success "whatweb instalado"
15
15
  return 0
16
16
  fi
17
+ command -v git >/dev/null 2>&1 || pkg install -y git >/dev/null 2>&1 || {
18
+ log_error "git é necessário para instalar o whatweb via repositório"
19
+ return 1
20
+ }
17
21
  if install_pinned_git_repo "$_WHATWEB_REPO" "$_WHATWEB_COMMIT" "$_WHATWEB_DIR"; then
18
22
  ln -sf "$_WHATWEB_DIR/whatweb" "$PREFIX/bin/whatweb"
19
23
  chmod +x "$PREFIX/bin/whatweb"
@@ -366,6 +366,11 @@ agent_apply_files() {
366
366
  d=$(agent_md_dir)
367
367
  fm="$d/actions_files_manifest.txt"
368
368
  ws="${AGENT_ACTIONS_WORKSPACE:-$PWD}"
369
+ ws="$(realpath -m "$ws" 2>/dev/null)" || ws=""
370
+ if [[ -z "$ws" || "$ws" == "/" ]]; then
371
+ log_error "Recusando aplicar arquivos com workspace '/' (permitiria escrita em qualquer lugar)"
372
+ return 1
373
+ fi
369
374
  AGENT_FILES_WRITTEN=0
370
375
  shown=0
371
376
  # paths attached as action="no-read" are write-protected for this task
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karnel-termux",
3
- "version": "4.17.1",
3
+ "version": "4.17.3",
4
4
  "description": "Modular Dev Environment for Termux — install languages, databases, AI agents, editors, and more with one command",
5
5
  "bin": {
6
6
  "karnel": "karnel/bin/karnel"