karnel-termux 4.17.2 → 4.17.5
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.
- package/karnel/RELEASE_COMMIT +1 -1
- package/karnel/tools/ai/cline/install.sh +14 -0
- package/karnel/tools/ai/kilocode-cli/install.sh +10 -7
- package/karnel/tools/ai/kimchi-code/install.sh +9 -3
- package/karnel/tools/deploy/railway/install.sh +10 -0
- package/karnel/tools/editor/code-server/install.sh +4 -1
- package/karnel/tools/editor/neovim/install.sh +4 -1
- package/karnel/tools/lang/bun/install.sh +8 -0
- package/karnel/tools/npm/turbopack/install.sh +11 -0
- package/karnel/tools/security/dnsrecon/install.sh +6 -2
- package/karnel/tools/security/enum4linux/install.sh +4 -0
- package/karnel/tools/security/masscan/install.sh +3 -3
- package/karnel/tools/security/metasploit/install.sh +3 -3
- package/karnel/tools/security/nikto/install.sh +4 -0
- package/karnel/tools/security/sqlmap/install.sh +4 -0
- package/karnel/tools/security/theharvester/install.sh +6 -2
- package/karnel/tools/security/whatweb/install.sh +4 -0
- package/karnel/utils/agent_actions.sh +5 -0
- package/package.json +1 -1
package/karnel/RELEASE_COMMIT
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
2e76f74b21de6f9a01911b2c06b96ac09d12359d
|
|
@@ -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
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import "@/utils/log"
|
|
4
4
|
import "@/utils/version"
|
|
5
5
|
import "@/utils/colors"
|
|
6
|
+
import "@/utils/install"
|
|
6
7
|
|
|
7
8
|
LOG_FILE="$KARNEL_CACHE/install_ai.log"
|
|
8
9
|
KILOCODE_DATA_DIR="${KARNEL_DATA:-${XDG_DATA_HOME:-$HOME/.local/share}/karnel-data}/kilocode"
|
|
@@ -120,13 +121,15 @@ _download_kilocode_binary_impl() {
|
|
|
120
121
|
return 1
|
|
121
122
|
fi
|
|
122
123
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
if declare -F github_release_asset_sha256 >/dev/null; then
|
|
125
|
+
local expected actual
|
|
126
|
+
expected=$(github_release_asset_sha256 Kilo-Org/kilocode "$latest_version" "$tarball") || expected=""
|
|
127
|
+
actual=$(sha256sum "$staging_dir/$tarball" 2>/dev/null | awk '{print $1}')
|
|
128
|
+
if [[ ! "$expected" =~ ^[0-9a-f]{64}$ || "$actual" != "$expected" ]]; then
|
|
129
|
+
rm -rf "$staging_dir"
|
|
130
|
+
log_error "Kilo Code archive failed official SHA-256 validation"
|
|
131
|
+
return 1
|
|
132
|
+
fi
|
|
130
133
|
fi
|
|
131
134
|
|
|
132
135
|
if ! tar -zxf "$staging_dir/$tarball" -C "$staging_dir" &>>"$LOG_FILE"; then
|
|
@@ -485,9 +485,15 @@ _update_kimchi_proot_impl() {
|
|
|
485
485
|
|
|
486
486
|
local download_url="https://github.com/getkimchi/kimchi/releases/download/$latest_version/kimchi_linux_arm64.tar.gz"
|
|
487
487
|
|
|
488
|
-
|
|
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 '
|
|
489
494
|
mkdir -p /tmp/kimchi-install &&
|
|
490
|
-
curl -fsSL
|
|
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" ]; } &&
|
|
491
497
|
tar -zxf /tmp/kimchi-install/kimchi.tar.gz -C /tmp/kimchi-install &&
|
|
492
498
|
rm -f /usr/local/bin/kimchi &&
|
|
493
499
|
mv /tmp/kimchi-install/bin/kimchi /usr/local/bin/kimchi &&
|
|
@@ -495,7 +501,7 @@ _update_kimchi_proot_impl() {
|
|
|
495
501
|
rm -rf /usr/local/share/kimchi &&
|
|
496
502
|
mv /tmp/kimchi-install/share/kimchi /usr/local/share/kimchi &&
|
|
497
503
|
rm -rf /tmp/kimchi-install
|
|
498
|
-
" &>>"$LOG_FILE"
|
|
504
|
+
' bash "$download_url" "$expected" &>>"$LOG_FILE"
|
|
499
505
|
|
|
500
506
|
local kimchi_bin
|
|
501
507
|
kimchi_bin="$(_kimchi_detect_ubuntu_root)/usr/local/bin/kimchi"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
3
|
import "@/utils/log"
|
|
4
|
+
import "@/utils/install"
|
|
4
5
|
import "@/utils/version"
|
|
5
6
|
|
|
6
7
|
LOG_FILE="$KARNEL_CACHE/install_deploy.log"
|
|
@@ -110,6 +111,15 @@ _install_railway_manual_impl() {
|
|
|
110
111
|
return 2
|
|
111
112
|
fi
|
|
112
113
|
|
|
114
|
+
local expected
|
|
115
|
+
expected=$(github_release_asset_sha256 railwayapp/cli "$latest_version" "railway-${version}-aarch64-linux.tar.gz") || expected=""
|
|
116
|
+
if [[ "$expected" =~ ^[0-9a-f]{64}$ ]]; then
|
|
117
|
+
verify_sha256 "$RAILWAY_DATA_DIR/railway.tar.gz" "$expected" || {
|
|
118
|
+
rm -f "$RAILWAY_DATA_DIR/railway.tar.gz"
|
|
119
|
+
return 1
|
|
120
|
+
}
|
|
121
|
+
fi
|
|
122
|
+
|
|
113
123
|
tar -zxf "$RAILWAY_DATA_DIR/railway.tar.gz" -C "$RAILWAY_DATA_DIR" 2>>"$LOG_FILE" || {
|
|
114
124
|
rm -f "$RAILWAY_DATA_DIR/railway.tar.gz"
|
|
115
125
|
return 1
|
|
@@ -73,7 +73,10 @@ update_code_server() {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
_update_code_server_impl() {
|
|
76
|
-
pkg upgrade -y code-server
|
|
76
|
+
if ! pkg upgrade -y code-server &>>"$LOG_FILE"; then
|
|
77
|
+
log_error "Falha ao atualizar code-server"
|
|
78
|
+
return 1
|
|
79
|
+
fi
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
reinstall_code_server() {
|
|
@@ -51,7 +51,10 @@ _update_neovim_impl() {
|
|
|
51
51
|
|
|
52
52
|
_do_neovim_update() {
|
|
53
53
|
mkdir -p "$(dirname "$LOG_FILE")"
|
|
54
|
-
yes | pkg upgrade neovim -y &>>"$LOG_FILE"
|
|
54
|
+
if ! yes | pkg upgrade neovim -y &>>"$LOG_FILE"; then
|
|
55
|
+
log_error "Falha ao atualizar Neovim"
|
|
56
|
+
return 1
|
|
57
|
+
fi
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
update_neovim() {
|
|
@@ -141,6 +141,14 @@ _download_bun_binary_native_impl() {
|
|
|
141
141
|
log_error "Failed to download Bun binary"
|
|
142
142
|
return 1
|
|
143
143
|
}
|
|
144
|
+
if declare -F github_release_asset_sha256 >/dev/null; then
|
|
145
|
+
expected=$(github_release_asset_sha256 "$BUN_REPO" "bun-v$version" "$zip_name") || expected=""
|
|
146
|
+
if [[ "$expected" =~ ^[0-9a-f]{64}$ ]]; then
|
|
147
|
+
verify_sha256 "$staging_dir/$zip_name" "$expected" || { rm -rf "$staging_dir"; return 1; }
|
|
148
|
+
else
|
|
149
|
+
log_warn "No published SHA-256 for Bun native; skipping integrity verification"
|
|
150
|
+
fi
|
|
151
|
+
fi
|
|
144
152
|
if ! unzip -o "$staging_dir/$zip_name" -d "$staging_dir" &>>"$LOG_FILE"; then
|
|
145
153
|
rm -rf "$staging_dir"
|
|
146
154
|
log_error "Failed to extract Bun binary"
|
|
@@ -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
|
|
|
@@ -14,8 +14,12 @@ 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
|
-
pip install -r "$_DNSRECON_DIR/requirements.txt" 2
|
|
22
|
+
pip install -r "$_DNSRECON_DIR/requirements.txt" 2>>"$LOG_FILE" || return 1
|
|
19
23
|
chmod +x "$_DNSRECON_DIR/dnsrecon.py"
|
|
20
24
|
ln -sf "$_DNSRECON_DIR/dnsrecon.py" "$PREFIX/bin/dnsrecon"
|
|
21
25
|
: > "$_DNSRECON_DIR/.karnel-wrapper"
|
|
@@ -41,7 +45,7 @@ update_dnsrecon() {
|
|
|
41
45
|
{ [ -f "$_DNSRECON_DIR/.karnel-wrapper" ] && _adopt_pinned_git_repo "$_DNSRECON_DIR" "$_DNSRECON_REPO"; } || return 1
|
|
42
46
|
install_pinned_git_repo "$_DNSRECON_REPO" "$_DNSRECON_COMMIT" "$_DNSRECON_DIR" || return 1
|
|
43
47
|
: > "$_DNSRECON_DIR/.karnel-wrapper"
|
|
44
|
-
pip install -r "$_DNSRECON_DIR/requirements.txt" 2
|
|
48
|
+
pip install -r "$_DNSRECON_DIR/requirements.txt" 2>>"$LOG_FILE" || return 1
|
|
45
49
|
log_success "dnsrecon atualizado"
|
|
46
50
|
return 0
|
|
47
51
|
fi
|
|
@@ -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
|
|
@@ -25,8 +25,8 @@ install_metasploit() {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
cd "$METASPLOIT_DIR"
|
|
28
|
-
gem install bundler 2
|
|
29
|
-
bundle install --jobs 4 2
|
|
28
|
+
gem install bundler 2>>"$LOG_FILE" || return 1
|
|
29
|
+
bundle install --jobs 4 2>>"$LOG_FILE" || return 1
|
|
30
30
|
|
|
31
31
|
for bin in msfconsole msfvenom msfrpc msfrpcd msfdb; do
|
|
32
32
|
cat > "$PREFIX/bin/$bin" << BINEOF
|
|
@@ -58,7 +58,7 @@ update_metasploit() {
|
|
|
58
58
|
_pinned_git_repo_owned "$METASPLOIT_DIR" "$METASPLOIT_REPO" ||
|
|
59
59
|
{ [ -f "$METASPLOIT_DIR/.karnel-installed" ] && _adopt_pinned_git_repo "$METASPLOIT_DIR" "$METASPLOIT_REPO"; } || return 1
|
|
60
60
|
install_pinned_git_repo "$METASPLOIT_REPO" "$METASPLOIT_COMMIT" "$METASPLOIT_DIR" || return 1
|
|
61
|
-
cd "$METASPLOIT_DIR" && bundle install --jobs 4 2
|
|
61
|
+
cd "$METASPLOIT_DIR" && bundle install --jobs 4 2>>"$LOG_FILE" || return 1
|
|
62
62
|
for bin in msfconsole msfvenom msfrpc msfrpcd msfdb; do
|
|
63
63
|
sha256sum "$PREFIX/bin/$bin" > "$METASPLOIT_DIR/.karnel-wrapper-$bin"
|
|
64
64
|
done
|
|
@@ -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"
|
|
@@ -14,8 +14,12 @@ 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
|
-
pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2
|
|
22
|
+
pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>>"$LOG_FILE" || return 1
|
|
19
23
|
chmod +x "$_THEHARVESTER_DIR/theHarvester.py"
|
|
20
24
|
ln -sf "$_THEHARVESTER_DIR/theHarvester.py" "$PREFIX/bin/theharvester"
|
|
21
25
|
: > "$_THEHARVESTER_DIR/.karnel-wrapper"
|
|
@@ -41,7 +45,7 @@ update_theharvester() {
|
|
|
41
45
|
{ [ -f "$_THEHARVESTER_DIR/.karnel-wrapper" ] && _adopt_pinned_git_repo "$_THEHARVESTER_DIR" "$_THEHARVESTER_REPO"; } || return 1
|
|
42
46
|
install_pinned_git_repo "$_THEHARVESTER_REPO" "$_THEHARVESTER_COMMIT" "$_THEHARVESTER_DIR" || return 1
|
|
43
47
|
: > "$_THEHARVESTER_DIR/.karnel-wrapper"
|
|
44
|
-
pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2
|
|
48
|
+
pip install -r "$_THEHARVESTER_DIR/requirements/base.txt" 2>>"$LOG_FILE" || return 1
|
|
45
49
|
log_success "theharvester atualizado"
|
|
46
50
|
return 0
|
|
47
51
|
fi
|
|
@@ -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