karnel-termux 0.0.4 → 4.7.6
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/README.md +7 -9
- package/install.sh +9 -0
- package/karnel/bin/karnel +1 -1
- package/karnel/cli/commands/backup.sh +100 -0
- package/karnel/cli/commands/doctor/fixes.sh +310 -0
- package/karnel/cli/commands/doctor/system.sh +87 -0
- package/karnel/cli/commands/doctor.sh +7 -308
- package/karnel/cli/commands/install.sh +21 -2
- package/karnel/cli/commands/list.sh +5 -0
- package/karnel/cli/commands/reinstall.sh +5 -1
- package/karnel/cli/commands/restore.sh +83 -0
- package/karnel/cli/commands/search.sh +62 -0
- package/karnel/cli/commands/show.sh +102 -38
- package/karnel/cli/commands/uninstall.sh +3 -551
- package/karnel/cli/commands/update.sh +3 -551
- package/karnel/cli/karnel.sh +5 -0
- package/karnel/modules/db.sh +2 -0
- package/karnel/modules/dev.sh +9 -3
- package/karnel/tools/ai/antigravity-cli/bin/agy +1 -1
- package/karnel/tools/ai/claude-code/bin/claude +1 -1
- package/karnel/tools/ai/codegraph/bin/codegraph +1 -1
- package/karnel/tools/ai/freebuff/bin/freebuff +1 -1
- package/karnel/tools/ai/kilocode-cli/bin/kilocode +1 -1
- package/karnel/tools/ai/kilocode-cli/install.sh +1 -1
- package/karnel/tools/ai/kimchi-code/bin/kimchi +1 -1
- package/karnel/tools/ai/mimocode/bin/mimo +1 -1
- package/karnel/tools/ai/omni-route/README.md +17 -15
- package/karnel/tools/ai/opencode/bin/opencode +1 -1
- package/karnel/tools/db/redis/install.sh +1 -1
- package/karnel/tools/dev/all.sh +3 -0
- package/karnel/tools/dev/httptmux/install.sh +75 -0
- package/karnel/tools/dev/openssh/install.sh +1 -1
- package/karnel/tools/dev/snyk/install.sh +75 -0
- package/karnel/tools/dev/tmux/install.sh +1 -1
- package/karnel/tools/dev/zork/install.sh +133 -0
- package/karnel/tools/editor/neovim/install.sh +1 -1
- package/karnel/tools/editor/nvchad/install.sh +1 -1
- package/karnel/tools/npm/turbopack/bin/next-turbopack +1 -1
- package/karnel/tools/npm/turbopack/bin/node-glibc.sh +1 -1
- package/karnel/utils/env.sh +1 -1
- package/karnel/utils/log.sh +70 -0
- package/karnel/utils/tools.sh +34 -0
- package/karnel/utils/version.sh +1 -1
- package/package.json +1 -1
- package/scripts/completion.bash +28 -0
- package/scripts/completion.zsh +90 -0
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
10
|
<a href="https://github.com/israelmarques1024-dotcom/karnel-termux">
|
|
11
|
-
<img src="https://img.shields.io/badge/version-0.0.
|
|
11
|
+
<img src="https://img.shields.io/badge/version-0.0.4-0078D4?style=for-the-badge&logo=appveyor" alt="Version">
|
|
12
12
|
</a>
|
|
13
13
|
<a href="https://www.npmjs.com/package/karnel-termux">
|
|
14
14
|
<img src="https://img.shields.io/npm/v/karnel-termux?style=for-the-badge&logo=npm&color=cb3837" alt="npm">
|
|
@@ -23,17 +23,15 @@
|
|
|
23
23
|
<img src="https://img.shields.io/badge/platform-Termux%20%7C%20Android-0078D4?style=for-the-badge&logo=android" alt="Platform">
|
|
24
24
|
</a>
|
|
25
25
|
<a href="https://kerneltermux.vercel.app">
|
|
26
|
-
<img src="https://img.shields.io/badge/%F0%9F%8C%90%20Site-
|
|
26
|
+
<img src="https://img.shields.io/badge/%F0%9F%8C%90%20Site-kerneltermux.vercel.app-0078D4?style=for-the-badge" alt="Website">
|
|
27
27
|
</a>
|
|
28
28
|
</p>
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
30
|
---
|
|
33
31
|
|
|
34
32
|
**KARNEL TERMUX** é um ambiente de desenvolvimento modular que transforma o Termux em uma workstation completa. Com um único CLI (`karnel`), instale e gerencie:
|
|
35
33
|
|
|
36
|
-
Criado por **israel marques** (
|
|
34
|
+
Criado por **israel marques** (12 anos).
|
|
37
35
|
|
|
38
36
|
- **30 agentes de IA** para coding — Claude, Gemini, OpenCode, Ollama, Cline, karnelRoute e mais
|
|
39
37
|
- **7 linguagens** — Node.js, Python, Go, Rust, C/C++, PHP, Perl
|
|
@@ -47,6 +45,9 @@ Criado por **israel marques** (tenho 12 anos).
|
|
|
47
45
|
> [!IMPORTANT]
|
|
48
46
|
> Projetado exclusivamente para **Termux no Android**. Não funciona em outras plataformas.
|
|
49
47
|
|
|
48
|
+
> [!NOTE]
|
|
49
|
+
> 💻 **Também disponível para Desktop:** [Karnel Desktop CLI](https://github.com/israelmarques1024-dotcom/karnel-termux-desktop-cli) — Gerenciador multiplataforma para Linux, macOS e Windows. Mesmo CLI, mesmos comandos, gerenciadores de pacote nativos.
|
|
50
|
+
|
|
50
51
|
---
|
|
51
52
|
|
|
52
53
|
## 📦 Instalação
|
|
@@ -448,7 +449,4 @@ MIT © israel marques
|
|
|
448
449
|
<a href="https://kerneltermux.vercel.app">
|
|
449
450
|
<img src="https://img.shields.io/badge/%F0%9F%8C%90%20Documenta%C3%A7%C3%A3o%20Completa-0078D4?style=for-the-badge" alt="Documentação">
|
|
450
451
|
</a>
|
|
451
|
-
|
|
452
|
-
<img src="https://img.shields.io/badge/%F0%9F%93%B1%20Site%20Repo-0078D4?style=for-the-badge" alt="Site Repo">
|
|
453
|
-
</a>
|
|
454
|
-
</p>
|
|
452
|
+
</p>
|
package/install.sh
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
3
|
set -e
|
|
4
|
+
trap '_cleanup_failed' ERR
|
|
4
5
|
|
|
5
6
|
readonly P_BORDER='\e[38;5;33m'
|
|
6
7
|
readonly P_PRIMARY='\e[38;5;39m'
|
|
@@ -64,6 +65,14 @@ log_info() {
|
|
|
64
65
|
echo -e " ${P_BORDER}→${P_NC} $1"
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
_cleanup_failed() {
|
|
69
|
+
echo -e "\n ${P_FAIL}✖${P_NC} Installation failed at step ${CURRENT_STEP}. Cleaning up..."
|
|
70
|
+
[[ -d "$KARNEL_REPO" ]] && rm -rf "$KARNEL_REPO"
|
|
71
|
+
[[ -L "$PREFIX/bin/karnel" ]] && rm -f "$PREFIX/bin/karnel"
|
|
72
|
+
echo -e " ${P_DIM}Run install.sh again to retry${P_NC}"
|
|
73
|
+
exit 1
|
|
74
|
+
}
|
|
75
|
+
|
|
67
76
|
separator() {
|
|
68
77
|
local cols=$(_cols)
|
|
69
78
|
local line=$(printf "%${cols}s")
|
package/karnel/bin/karnel
CHANGED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
import "@/utils/log"
|
|
4
|
+
import "@/utils/colors"
|
|
5
|
+
|
|
6
|
+
backup_main() {
|
|
7
|
+
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
|
8
|
+
echo
|
|
9
|
+
box "◈ KARNEL BACKUP ◈"
|
|
10
|
+
echo
|
|
11
|
+
log_info "Save ALL your Termux configs + installed tools"
|
|
12
|
+
echo
|
|
13
|
+
list_item "karnel backup Backup local"
|
|
14
|
+
list_item "karnel backup --cloud Backup + upload to Google Drive"
|
|
15
|
+
list_item "karnel restore Restore latest backup"
|
|
16
|
+
list_item "karnel restore --cloud Restore from Google Drive"
|
|
17
|
+
echo
|
|
18
|
+
return
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
local cloud=false
|
|
22
|
+
[[ "$1" == "--cloud" ]] && cloud=true
|
|
23
|
+
|
|
24
|
+
local dir="${KARNEL_DATA}/backups"
|
|
25
|
+
mkdir -p "$dir"
|
|
26
|
+
local ts
|
|
27
|
+
ts=$(date +%Y%m%d_%H%M%S)
|
|
28
|
+
local file="$dir/termux-$ts.tar.gz"
|
|
29
|
+
|
|
30
|
+
echo
|
|
31
|
+
box "◈ KARNEL BACKUP ◈"
|
|
32
|
+
echo
|
|
33
|
+
|
|
34
|
+
# Package list
|
|
35
|
+
dpkg --get-selections > "$dir/packages-$ts.list" 2>/dev/null
|
|
36
|
+
local pkgs
|
|
37
|
+
pkgs=$(wc -l < "$dir/packages-$ts.list")
|
|
38
|
+
log_success "Saved $pkgs installed packages"
|
|
39
|
+
|
|
40
|
+
# Karnel tool manifest
|
|
41
|
+
local tools=()
|
|
42
|
+
for m in "$KARNEL_PATH/tools/"*/; do
|
|
43
|
+
local mod
|
|
44
|
+
mod=$(basename "${m%/}")
|
|
45
|
+
for t in "$m"*/; do
|
|
46
|
+
local tool
|
|
47
|
+
tool=$(basename "${t%/}")
|
|
48
|
+
local bins
|
|
49
|
+
bins=$(grep "\"$tool:" "$m/all.sh" 2>/dev/null | cut -d: -f3 | tr -d '"')
|
|
50
|
+
local found=false
|
|
51
|
+
for b in ${bins//,/ }; do
|
|
52
|
+
command -v "$b" &>/dev/null && found=true && break
|
|
53
|
+
done
|
|
54
|
+
$found && tools+=("$mod:$tool")
|
|
55
|
+
done
|
|
56
|
+
done
|
|
57
|
+
printf "%s\n" "${tools[@]}" > "$dir/manifest-$ts.list"
|
|
58
|
+
log_success "Saved ${#tools[@]} Karnel tools"
|
|
59
|
+
|
|
60
|
+
# Configs
|
|
61
|
+
local tmp
|
|
62
|
+
tmp=$(mktemp -d)
|
|
63
|
+
mkdir -p "$tmp/config"/{home,termux,ssh,config,prefix-etc}
|
|
64
|
+
|
|
65
|
+
for f in .bashrc .zshrc .profile .zshenv .inputrc; do
|
|
66
|
+
[[ -f "$HOME/$f" ]] && cp "$HOME/$f" "$tmp/config/home/"
|
|
67
|
+
done
|
|
68
|
+
[[ -d "$HOME/.termux" ]] && cp -r "$HOME/.termux" "$tmp/config/termux/" 2>/dev/null
|
|
69
|
+
[[ -d "$HOME/.ssh" ]] && cp "$HOME/.ssh/id_"* "$HOME/.ssh/config" "$HOME/.ssh/known_hosts" "$tmp/config/ssh/" 2>/dev/null
|
|
70
|
+
for d in "$HOME/.config"/*; do
|
|
71
|
+
[[ -d "$d" ]] && cp -r "$d" "$tmp/config/config/" 2>/dev/null
|
|
72
|
+
done
|
|
73
|
+
[[ -f "$PREFIX/etc/apt/sources.list" ]] && cp "$PREFIX/etc/apt/sources.list" "$tmp/config/prefix-etc/" 2>/dev/null
|
|
74
|
+
|
|
75
|
+
tar -czf "$file" -C "$tmp" . 2>/dev/null
|
|
76
|
+
rm -rf "$tmp"
|
|
77
|
+
|
|
78
|
+
local size
|
|
79
|
+
size=$(du -h "$file" | awk '{print $1}')
|
|
80
|
+
log_success "Backup: $(basename "$file") ($size)"
|
|
81
|
+
|
|
82
|
+
# Cloud
|
|
83
|
+
if $cloud; then
|
|
84
|
+
if ! command -v rclone &>/dev/null; then
|
|
85
|
+
pkg install rclone -y &>/dev/null || log_warn "Install rclone: pkg install rclone"
|
|
86
|
+
fi
|
|
87
|
+
if command -v rclone &>/dev/null; then
|
|
88
|
+
if rclone listremotes 2>/dev/null | grep -q "^karnel:"; then
|
|
89
|
+
loading "Uploading" rclone copy "$file" "karnel:backups/"
|
|
90
|
+
log_success "Uploaded to Google Drive"
|
|
91
|
+
else
|
|
92
|
+
log_warn "Run 'rclone config' and name the remote 'karnel'"
|
|
93
|
+
fi
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
echo
|
|
98
|
+
log_success "Done! Restore with: karnel restore"
|
|
99
|
+
echo
|
|
100
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
import "@/utils/log"
|
|
4
|
+
import "@/utils/colors"
|
|
5
|
+
|
|
6
|
+
_fix_storage() {
|
|
7
|
+
termux-setup-storage 2>/dev/null
|
|
8
|
+
return $?
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_fix_mkdir() {
|
|
12
|
+
for dir in "$KARNEL_CONFIG" "$KARNEL_CACHE" "$KARNEL_DATA"; do
|
|
13
|
+
mkdir -p "$dir" 2>/dev/null
|
|
14
|
+
chmod 755 "$dir" 2>/dev/null
|
|
15
|
+
done
|
|
16
|
+
return 0
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
_fix_pkg_install() {
|
|
20
|
+
local pkg_to_install=""
|
|
21
|
+
case "$1" in
|
|
22
|
+
pkg) pkg_to_install="$2" ;;
|
|
23
|
+
*) pkg_to_install="${fix_commands[$i]:-}" ;;
|
|
24
|
+
esac
|
|
25
|
+
local pkg_name=""
|
|
26
|
+
if [[ "$pkg_to_install" =~ pkg\ install\ -y\ (.+) ]]; then
|
|
27
|
+
pkg_name="${BASH_REMATCH[1]}"
|
|
28
|
+
fi
|
|
29
|
+
if [[ -n "$pkg_name" ]]; then
|
|
30
|
+
pkg install -y "$pkg_name" 2>/dev/null
|
|
31
|
+
return $?
|
|
32
|
+
fi
|
|
33
|
+
return 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_fix_dpkg() {
|
|
37
|
+
dpkg --configure -a 2>/dev/null
|
|
38
|
+
apt-get -f install -y 2>/dev/null
|
|
39
|
+
return $?
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_fix_apt_update() {
|
|
43
|
+
pkg update -y 2>/dev/null
|
|
44
|
+
return $?
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
_fix_npm_prefix() {
|
|
48
|
+
mkdir -p "$HOME/.npm-global"
|
|
49
|
+
npm config set prefix "$HOME/.npm-global" 2>/dev/null
|
|
50
|
+
return $?
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
_fix_pip() {
|
|
54
|
+
local py_cmd=""
|
|
55
|
+
for py in python3.12 python3.11 python3.10 python3.9 python3 python; do
|
|
56
|
+
if command -v "$py" &>/dev/null; then py_cmd="$py"; break; fi
|
|
57
|
+
done
|
|
58
|
+
if [[ -n "$py_cmd" ]]; then
|
|
59
|
+
"$py_cmd" -m ensurepip 2>/dev/null
|
|
60
|
+
"$py_cmd" -m pip install --upgrade pip 2>/dev/null
|
|
61
|
+
return $?
|
|
62
|
+
fi
|
|
63
|
+
return 1
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
_fix_pg_init() {
|
|
67
|
+
source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
|
|
68
|
+
import "@/modules/db" 2>/dev/null
|
|
69
|
+
if type pg_init &>/dev/null; then
|
|
70
|
+
pg_init 2>/dev/null
|
|
71
|
+
pg_start 2>/dev/null
|
|
72
|
+
return $?
|
|
73
|
+
fi
|
|
74
|
+
local pg_data="$HOME/.local/share/postgresql/data"
|
|
75
|
+
mkdir -p "$pg_data" 2>/dev/null
|
|
76
|
+
if command -v initdb &>/dev/null; then
|
|
77
|
+
initdb -D "$pg_data" 2>/dev/null
|
|
78
|
+
pg_ctl -D "$pg_data" -l "$HOME/.cache/karnel/postgresql.log" start 2>/dev/null
|
|
79
|
+
return $?
|
|
80
|
+
fi
|
|
81
|
+
return 1
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
_fix_pg_start() {
|
|
85
|
+
local pg_data=""
|
|
86
|
+
for dir in "$PREFIX/var/lib/postgresql/data" "$PREFIX/var/lib/postgresql" "$HOME/.termux/postgresql/data" "$HOME/.termux/postgresql" "$HOME/.local/share/postgresql/data"; do
|
|
87
|
+
if [[ -d "$dir" ]] && [[ -f "$dir/PG_VERSION" ]]; then
|
|
88
|
+
pg_data="$dir"
|
|
89
|
+
break
|
|
90
|
+
fi
|
|
91
|
+
done
|
|
92
|
+
if [[ -n "$pg_data" ]] && command -v pg_ctl &>/dev/null; then
|
|
93
|
+
pg_ctl -D "$pg_data" -l "$HOME/.cache/karnel/postgresql.log" start 2>/dev/null
|
|
94
|
+
return $?
|
|
95
|
+
fi
|
|
96
|
+
return 1
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
_fix_pg_install() {
|
|
100
|
+
source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
|
|
101
|
+
import "@/modules/db" 2>/dev/null
|
|
102
|
+
if type install_db &>/dev/null; then
|
|
103
|
+
install_db 2>/dev/null
|
|
104
|
+
return $?
|
|
105
|
+
fi
|
|
106
|
+
pkg install -y postgresql 2>/dev/null
|
|
107
|
+
return $?
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
_fix_symlinks() {
|
|
111
|
+
ln -sf "$KARNEL_PATH/bin/karnel" "$PREFIX/bin/karnel" 2>/dev/null
|
|
112
|
+
[[ -L "$PREFIX/bin/karnel" ]]
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
_fix_banner() {
|
|
116
|
+
local shell_config=""
|
|
117
|
+
if [[ -f "$HOME/.zshrc" ]]; then
|
|
118
|
+
shell_config="$HOME/.zshrc"
|
|
119
|
+
elif [[ -f "$HOME/.bashrc" ]]; then
|
|
120
|
+
shell_config="$HOME/.bashrc"
|
|
121
|
+
fi
|
|
122
|
+
if [[ -z "$shell_config" ]]; then
|
|
123
|
+
shell_config="$HOME/.zshrc"
|
|
124
|
+
touch "$shell_config"
|
|
125
|
+
fi
|
|
126
|
+
local marker="# ===== Karnel Banner ====="
|
|
127
|
+
if ! grep -qF "$marker" "$shell_config" 2>/dev/null; then
|
|
128
|
+
cat >>"$shell_config" <<EOF
|
|
129
|
+
|
|
130
|
+
$marker
|
|
131
|
+
source "$KARNEL_UTILS/banner.sh"
|
|
132
|
+
EOF
|
|
133
|
+
return 0
|
|
134
|
+
fi
|
|
135
|
+
return 0
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
_fix_ai_install() {
|
|
139
|
+
log_info "Installing AI tools (this may take a while)..."
|
|
140
|
+
source "$KARNEL_PATH/utils/env.sh" 2>/dev/null
|
|
141
|
+
import "@/modules/ai" 2>/dev/null
|
|
142
|
+
if type install_ai &>/dev/null; then
|
|
143
|
+
install_ai 2>/dev/null
|
|
144
|
+
return $?
|
|
145
|
+
fi
|
|
146
|
+
return 1
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
_fix_shell_syntax() {
|
|
150
|
+
local config=""
|
|
151
|
+
if [[ -f "$HOME/.zshrc" ]]; then
|
|
152
|
+
config="$HOME/.zshrc"
|
|
153
|
+
elif [[ -f "$HOME/.bashrc" ]]; then
|
|
154
|
+
config="$HOME/.bashrc"
|
|
155
|
+
fi
|
|
156
|
+
if [[ -n "$config" ]]; then
|
|
157
|
+
cp "$config" "${config}.bak" 2>/dev/null
|
|
158
|
+
local marker="# ===== Karnel Banner ====="
|
|
159
|
+
local banner_block=""
|
|
160
|
+
if grep -qF "$marker" "$config" 2>/dev/null; then
|
|
161
|
+
local marker_line
|
|
162
|
+
marker_line=$(grep -nF "$marker" "$config" | head -1 | cut -d: -f1)
|
|
163
|
+
if [[ -n "$marker_line" ]]; then
|
|
164
|
+
banner_block=$(sed -n "$((marker_line - 1)),\$p" "$config" 2>/dev/null)
|
|
165
|
+
fi
|
|
166
|
+
fi
|
|
167
|
+
local tmpconfig
|
|
168
|
+
tmpconfig=$(mktemp)
|
|
169
|
+
sed '/^source.*\/dev\/null$/d; /^#.*syntax error/d' "$config" > "$tmpconfig" 2>/dev/null
|
|
170
|
+
if [[ -n "$banner_block" ]]; then
|
|
171
|
+
echo "" >> "$tmpconfig"
|
|
172
|
+
echo "$banner_block" >> "$tmpconfig"
|
|
173
|
+
fi
|
|
174
|
+
cp "$tmpconfig" "$config" 2>/dev/null
|
|
175
|
+
rm -f "$tmpconfig"
|
|
176
|
+
return 0
|
|
177
|
+
fi
|
|
178
|
+
return 1
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
_fix_ssh_key() {
|
|
182
|
+
mkdir -p "$HOME/.ssh"
|
|
183
|
+
chmod 700 "$HOME/.ssh"
|
|
184
|
+
ssh-keygen -t ed25519 -f "$HOME/.ssh/id_ed25519" -N '' 2>/dev/null
|
|
185
|
+
return $?
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
_fix_disk_cleanup() {
|
|
189
|
+
rm -rf ~/.cache/karnel/install_*.log 2>/dev/null
|
|
190
|
+
if command -v pkg &>/dev/null; then
|
|
191
|
+
pkg clean -y 2>/dev/null
|
|
192
|
+
fi
|
|
193
|
+
return $?
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
_fix_mkdir_single() {
|
|
197
|
+
for dir in "$KARNEL_CONFIG" "$KARNEL_CACHE" "$KARNEL_DATA" "$HOME/.local/share/karnel-data"; do
|
|
198
|
+
[[ -d "$dir" ]] || mkdir -p "$dir" 2>/dev/null
|
|
199
|
+
done
|
|
200
|
+
return 0
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
# ===== NEW FIX CALLBACKS =====
|
|
204
|
+
|
|
205
|
+
_fix_psutil() {
|
|
206
|
+
local tmp="$PREFIX/tmp/psutil_patch"
|
|
207
|
+
mkdir -p "$tmp"
|
|
208
|
+
pip download psutil==7.2.2 --no-binary :all: --no-deps -d "$tmp" 2>/dev/null || return 1
|
|
209
|
+
tar xzf "$tmp/psutil-7.2.2.tar.gz" -C "$tmp"
|
|
210
|
+
sed -i 's/LINUX = sys.platform.startswith("linux")/LINUX = sys.platform.startswith(("linux", "android"))/' "$tmp/psutil-7.2.2/psutil/_common.py"
|
|
211
|
+
pip install "$tmp/psutil-7.2.2" 2>/dev/null
|
|
212
|
+
local rc=$?
|
|
213
|
+
rm -rf "$tmp"
|
|
214
|
+
return $rc
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
_fix_pip_check() {
|
|
218
|
+
local broken
|
|
219
|
+
broken=$(pip check 2>&1 | grep -oP '^\S+' | head -3)
|
|
220
|
+
if [[ -n "$broken" ]]; then
|
|
221
|
+
pip install --upgrade --force-reinstall $broken 2>/dev/null
|
|
222
|
+
fi
|
|
223
|
+
return 0
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
_fix_npm_shebangs() {
|
|
227
|
+
local fixed=0
|
|
228
|
+
for f in "$PREFIX/bin/"*; do
|
|
229
|
+
[[ -f "$f" ]] || continue
|
|
230
|
+
local shebang
|
|
231
|
+
shebang=$(head -1 "$f" 2>/dev/null | tr -d '\0')
|
|
232
|
+
if [[ "$shebang" == "#!/usr/bin/env node" ]]; then
|
|
233
|
+
sed -i "1s|^.*$|#!$PREFIX/bin/node|" "$f"
|
|
234
|
+
((fixed++))
|
|
235
|
+
elif [[ "$shebang" == "#!/usr/bin/env bash" ]] || [[ "$shebang" == "#!/usr/bin/env sh" ]]; then
|
|
236
|
+
sed -i "1s|^.*$|#!$PREFIX/bin/bash|" "$f"
|
|
237
|
+
((fixed++))
|
|
238
|
+
fi
|
|
239
|
+
done
|
|
240
|
+
return 0
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
_fix_broken_symlinks() {
|
|
244
|
+
find "$PREFIX/bin" -type l ! -exec test -e {} \; -delete 2>/dev/null
|
|
245
|
+
return 0
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
_fix_npm_cache() {
|
|
249
|
+
npm cache clean --force 2>/dev/null
|
|
250
|
+
return $?
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
_fix_pip_cache() {
|
|
254
|
+
pip cache purge 2>/dev/null
|
|
255
|
+
return $?
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
_fix_pycache() {
|
|
259
|
+
find "$PREFIX/lib/python3.*" -name "__pycache__" -exec rm -rf {} + 2>/dev/null
|
|
260
|
+
return 0
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
_fix_proot_ubuntu() {
|
|
264
|
+
if command -v proot-distro &>/dev/null; then
|
|
265
|
+
proot-distro install ubuntu 2>/dev/null
|
|
266
|
+
return $?
|
|
267
|
+
fi
|
|
268
|
+
return 1
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
_fix_dns() {
|
|
272
|
+
echo 'nameserver 8.8.8.8' > "$PREFIX/etc/resolv.conf" 2>/dev/null
|
|
273
|
+
return $?
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
_fix_mirror() {
|
|
277
|
+
if command -v termux-change-repo &>/dev/null; then
|
|
278
|
+
termux-change-repo 2>/dev/null
|
|
279
|
+
return $?
|
|
280
|
+
fi
|
|
281
|
+
return 1
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
_fix_locale() {
|
|
285
|
+
local config="$HOME/.zshrc"
|
|
286
|
+
if [[ ! -f "$config" ]] && [[ -f "$HOME/.bashrc" ]]; then
|
|
287
|
+
config="$HOME/.bashrc"
|
|
288
|
+
fi
|
|
289
|
+
echo 'export LANG=en_US.UTF-8' >> "$config" 2>/dev/null
|
|
290
|
+
return $?
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
_fix_zombies() {
|
|
295
|
+
ps aux 2>/dev/null | awk '$8 ~ /^Z/ {print $2}' | xargs kill -9 2>/dev/null
|
|
296
|
+
return 0
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
_fix_url_quote_magic() {
|
|
300
|
+
local uqm_file="$PREFIX/share/zsh/functions/Zle/url-quote-magic"
|
|
301
|
+
if [[ ! -f "$uqm_file" ]]; then
|
|
302
|
+
return 1
|
|
303
|
+
fi
|
|
304
|
+
# Fix double-paren case patterns: (( -> ( for localschema and otherschema
|
|
305
|
+
sed -i \
|
|
306
|
+
-e 's/((${~localschema})/(${~localschema})/g' \
|
|
307
|
+
-e 's/((${~otherschema})/(${~otherschema})/g' \
|
|
308
|
+
"$uqm_file" 2>/dev/null
|
|
309
|
+
return $?
|
|
310
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
_doctor_system() {
|
|
2
|
+
local arch
|
|
3
|
+
arch=$(uname -m)
|
|
4
|
+
|
|
5
|
+
local android_ver
|
|
6
|
+
android_ver=$(getprop ro.build.version.release 2>/dev/null)
|
|
7
|
+
android_ver="${android_ver:-Unknown}"
|
|
8
|
+
|
|
9
|
+
local termux_ver=""
|
|
10
|
+
if command -v termux-info &>/dev/null; then
|
|
11
|
+
termux_ver=$(timeout 5 termux-info 2>/dev/null | grep -i "termux_version" | head -n1 | cut -d'=' -f2)
|
|
12
|
+
fi
|
|
13
|
+
if [[ -z "$termux_ver" ]]; then
|
|
14
|
+
termux_ver=$(dpkg -s termux-tools 2>/dev/null | grep -i version | awk '{print $2}')
|
|
15
|
+
fi
|
|
16
|
+
termux_ver="${termux_ver:-Unknown}"
|
|
17
|
+
|
|
18
|
+
log_success "Android Version: $android_ver"
|
|
19
|
+
log_success "Termux Version: $termux_ver"
|
|
20
|
+
log_success "CPU Architecture: $arch"
|
|
21
|
+
|
|
22
|
+
echo
|
|
23
|
+
separator_section "System Resources"
|
|
24
|
+
echo
|
|
25
|
+
|
|
26
|
+
local free_space
|
|
27
|
+
free_space=$(df -h "$HOME" | awk 'NR==2 {print $4}')
|
|
28
|
+
log_success "Available disk space: $free_space"
|
|
29
|
+
|
|
30
|
+
local ram_total="Unknown"
|
|
31
|
+
local ram_free="Unknown"
|
|
32
|
+
if [[ -f /proc/meminfo ]]; then
|
|
33
|
+
local total_kb free_kb
|
|
34
|
+
total_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
|
|
35
|
+
ram_total="$((total_kb / 1024)) MB"
|
|
36
|
+
free_kb=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
|
|
37
|
+
ram_free="$((free_kb / 1024)) MB"
|
|
38
|
+
log_success "RAM: Total: $ram_total | Available: $ram_free"
|
|
39
|
+
|
|
40
|
+
local free_mb=$((free_kb / 1024))
|
|
41
|
+
if (( free_mb < 200 )); then
|
|
42
|
+
log_warn "Low available memory (${ram_free}). Some tools may fail."
|
|
43
|
+
((warnings++))
|
|
44
|
+
fi
|
|
45
|
+
else
|
|
46
|
+
log_warn "Could not read RAM details"
|
|
47
|
+
((warnings++))
|
|
48
|
+
fi
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
_doctor_storage() {
|
|
52
|
+
echo
|
|
53
|
+
separator_section "Storage & Permissions"
|
|
54
|
+
echo
|
|
55
|
+
|
|
56
|
+
local storage_status="Accessible"
|
|
57
|
+
if ls /sdcard &>/dev/null || [ -d "$HOME/storage" ]; then
|
|
58
|
+
log_success "Shared storage is accessible"
|
|
59
|
+
else
|
|
60
|
+
log_warn "Shared storage is not linked"
|
|
61
|
+
storage_status="Not Linked"
|
|
62
|
+
((warnings++))
|
|
63
|
+
fix_commands+=("termux-setup-storage")
|
|
64
|
+
fix_descriptions+=("Link shared storage for file access")
|
|
65
|
+
fix_callbacks+=("_fix_storage")
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if [ -w "$KARNEL_PATH" ]; then
|
|
69
|
+
log_success "Write permission in Karnel path: $KARNEL_PATH"
|
|
70
|
+
else
|
|
71
|
+
log_error "No write permission in Karnel path!"
|
|
72
|
+
((errors++))
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
local dirs=("$KARNEL_CONFIG" "$KARNEL_CACHE" "$KARNEL_DATA")
|
|
76
|
+
for dir in "${dirs[@]}"; do
|
|
77
|
+
if [ -d "$dir" ] && [ -w "$dir" ]; then
|
|
78
|
+
log_success "Directory OK: $(basename "$dir")"
|
|
79
|
+
else
|
|
80
|
+
log_warn "Directory missing or read-only: $(basename "$dir")"
|
|
81
|
+
((warnings++))
|
|
82
|
+
fix_commands+=("mkdir -p \"$dir\" && chmod 755 \"$dir\"")
|
|
83
|
+
fix_descriptions+=("Recreate directory: $(basename "$dir")")
|
|
84
|
+
fix_callbacks+=("_fix_mkdir")
|
|
85
|
+
fi
|
|
86
|
+
done
|
|
87
|
+
}
|