Tiga sebab "Lua runtime failed" tiap kali yazi dibuka: - ncurses tidak ada di daftar paket dasar, jadi `clear` tidak ada di image minimal (Fedora/Debian container). - git tidak ada, sehingga `ya pkg add` gagal. Kegagalan itu tersembunyi karena run_as_user memakai `2>/dev/null` + `|| true`, jadi script tetap melaporkan "selesai" padahal init.lua memanggil plugin yang tak pernah ada. - fg.yazi di-clone dari github.com/DreamMaoMao/fg.yazi, padahal repo itu hanya ada di Gitee sehingga 404 lalu meminta kredensial. - tambah ncurses + git pada kelima package manager - hapus 2>/dev/null di run_as_user supaya kegagalan kelihatan - ganti clone manual fg.yazi -> `ya pkg add lpnh/fg`
321 lines
11 KiB
Bash
321 lines
11 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# temp-own — installer sekali jalan:
|
|
# fish (default shell, global) + starship (polos) + yazi + micro + lazydocker
|
|
#
|
|
# Pakai:
|
|
# curl -fsSL https://gitea.oxpoe.qzz.io/oxpoe/temp-own/raw/branch/main/install.sh | sudo bash
|
|
#
|
|
# Auto-deteksi distro (pacman / apt / dnf / zypper / apk).
|
|
# Hanya butuh sudo. Idempotent (aman dijalankan ulang).
|
|
|
|
set -euo pipefail
|
|
|
|
BLUE='\033[1;34m'; YEL='\033[1;33m'; RED='\033[1;31m'; NC='\033[0m'
|
|
log() { printf "${BLUE}==>${NC} %s\n" "$*"; }
|
|
warn() { printf "${YEL} !${NC} %s\n" "$*"; }
|
|
die() { printf "${RED} x${NC} %s\n" "$*" >&2; exit 1; }
|
|
|
|
[ "${EUID:-$(id -u)}" -eq 0 ] || die "Jalankan dengan sudo: curl -fsSL <url> | sudo bash"
|
|
|
|
TARGET_USER="${SUDO_USER:-root}"
|
|
TARGET_HOME="$(getent passwd "$TARGET_USER" 2>/dev/null | cut -d: -f6 || true)"
|
|
[ -n "${TARGET_HOME:-}" ] || TARGET_HOME="$(awk -F: -v u="$TARGET_USER" '$1==u{print $6}' /etc/passwd 2>/dev/null || true)"
|
|
[ -n "${TARGET_HOME:-}" ] || TARGET_HOME="${HOME:-/root}"
|
|
[ -d "$TARGET_HOME" ] || die "Home untuk '${TARGET_USER}' tidak ditemukan."
|
|
[ "$TARGET_USER" = root ] && warn "SUDO_USER tak terdeteksi — config user ditulis untuk root."
|
|
|
|
case "$(uname -m)" in
|
|
x86_64|amd64) ARCH=x86_64 ;;
|
|
aarch64|arm64) ARCH=aarch64 ;;
|
|
*) ARCH="$(uname -m)" ;;
|
|
esac
|
|
|
|
PM=""
|
|
for c in pacman apt-get dnf zypper apk; do command -v "$c" >/dev/null 2>&1 && { PM="$c"; break; }; done
|
|
|
|
BIN=/usr/local/bin
|
|
# deteksi tool: di PATH atau di /usr/local/bin
|
|
has() { command -v "$1" >/dev/null 2>&1 || [ -x "$BIN/$1" ]; }
|
|
|
|
log "User=${TARGET_USER} Arch=${ARCH} PkgMgr=${PM:-none}"
|
|
|
|
# ---------------------------------------------------------------- base deps
|
|
install_base() {
|
|
case "$PM" in
|
|
apt-get) DEBIAN_FRONTEND=noninteractive apt-get update -qq
|
|
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq curl unzip tar gzip bash ca-certificates ncurses git ;;
|
|
dnf) dnf install -y -q curl unzip tar gzip bash ca-certificates ncurses git ;;
|
|
pacman) pacman -S --needed --noconfirm curl unzip tar gzip bash ca-certificates ncurses git ;;
|
|
zypper) zypper --non-interactive install curl unzip tar gzip bash ca-certificates ncurses git ;;
|
|
apk) apk add --no-cache curl unzip tar gzip bash ca-certificates ncurses git ;;
|
|
*) warn "Paket manager tak dikenal — lewati paket dasar." ;;
|
|
esac
|
|
}
|
|
log "Paket dasar (curl/unzip/tar)"; install_base || warn "sebagian paket dasar gagal (lanjut)"
|
|
|
|
# ---------------------------------------------------------------- distro pkgs
|
|
distro_install() {
|
|
local want=(fish starship yazi micro lazydocker fastfetch mediainfo ouch) got=() p
|
|
case "$PM" in
|
|
apt-get)
|
|
for p in "${want[@]}"; do apt-cache show "$p" >/dev/null 2>&1 && got+=("$p"); done
|
|
[ ${#got[@]} -eq 0 ] && return 0
|
|
DEBIAN_FRONTEND=noninteractive apt-get install -y "${got[@]}" ;;
|
|
dnf)
|
|
for p in "${want[@]}"; do dnf -q list --available "$p" >/dev/null 2>&1 && got+=("$p"); done
|
|
[ ${#got[@]} -eq 0 ] && return 0
|
|
dnf install -y "${got[@]}" ;;
|
|
pacman) for p in "${want[@]}"; do pacman -S --needed --noconfirm "$p" >/dev/null 2>&1 || true; done ;;
|
|
zypper) for p in "${want[@]}"; do zypper --non-interactive install "$p" >/dev/null 2>&1 || true; done ;;
|
|
apk) for p in "${want[@]}"; do apk add --no-cache "$p" >/dev/null 2>&1 || true; done ;;
|
|
esac
|
|
}
|
|
[ -n "$PM" ] && { log "Coba paket distro"; distro_install || warn "sebagian paket distro gagal (lanjut upstream)"; }
|
|
|
|
# ---------------------------------------------------------------- upstream
|
|
ensure_fish() {
|
|
has fish && return 0
|
|
log "Non-repo: fish tak ada di repo — coba lewat manager lagi"
|
|
[ -n "$PM" ] && distro_install || true
|
|
has fish || die "fish tidak tersedia di distro ini"
|
|
}
|
|
|
|
ensure_micro() {
|
|
has micro && return 0
|
|
log "Install micro (getmic.ro -> $BIN)"
|
|
( cd "$BIN" && curl -fsSL https://getmic.ro | bash ) >/dev/null
|
|
has micro || die "micro gagal dipasang"
|
|
}
|
|
|
|
ensure_starship() {
|
|
has starship && return 0
|
|
log "Install starship (script resmi)"
|
|
curl -fsSL https://starship.rs/install.sh | sh -s -- -y --bin-dir "$BIN"
|
|
has starship || die "starship gagal dipasang"
|
|
}
|
|
|
|
ensure_yazi() {
|
|
has yazi && return 0
|
|
log "Install yazi (release GitHub)"
|
|
local tag target url tmp
|
|
tag="$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/sxyazi/yazi/releases/latest | sed 's#.*/tag/##')"
|
|
[ -n "$tag" ] || die "gagal menentukan versi yazi"
|
|
case "$ARCH" in
|
|
x86_64) target=x86_64-unknown-linux-gnu ;;
|
|
aarch64) target=aarch64-unknown-linux-gnu ;;
|
|
*) target="${ARCH}-unknown-linux-gnu" ;;
|
|
esac
|
|
url="https://github.com/sxyazi/yazi/releases/download/${tag}/yazi-${target}.zip"
|
|
tmp="$(mktemp -d)"
|
|
curl -fsSL "$url" -o "$tmp/yazi.zip" || die "gagal unduh $url"
|
|
unzip -q "$tmp/yazi.zip" -d "$tmp"
|
|
cp -f "$tmp/yazi-${target}/yazi" "$BIN/yazi"; chmod 0755 "$BIN/yazi"
|
|
cp -f "$tmp/yazi-${target}/ya" "$BIN/ya"; chmod 0755 "$BIN/ya"
|
|
rm -rf "$tmp"
|
|
has yazi || die "yazi gagal dipasang"
|
|
}
|
|
|
|
ensure_lazydocker() {
|
|
has lazydocker && return 0
|
|
log "Install lazydocker (script resmi -> $BIN)"
|
|
local tmp; tmp="$(mktemp -d)"
|
|
( cd "$tmp" && curl -fsSL https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | DIR="$BIN" bash )
|
|
rm -rf "$tmp"
|
|
has lazydocker || die "lazydocker gagal dipasang"
|
|
}
|
|
|
|
ensure_ouch() {
|
|
has ouch && return 0
|
|
log "Install ouch (release GitHub -> $BIN)"
|
|
local tag target url tmp
|
|
tag="$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/ouch-org/ouch/releases/latest | sed 's#.*/tag/##')"
|
|
[ -n "$tag" ] || die "gagal menentukan versi ouch"
|
|
case "$ARCH" in
|
|
x86_64) target=x86_64-unknown-linux-musl ;;
|
|
aarch64) target=aarch64-unknown-linux-musl ;;
|
|
*) target="${ARCH}-unknown-linux-musl" ;;
|
|
esac
|
|
url="https://github.com/ouch-org/ouch/releases/download/${tag}/ouch-${target}.tar.gz"
|
|
tmp="$(mktemp -d)"
|
|
curl -fsSL "$url" -o "$tmp/ouch.tgz" || die "gagal unduh $url"
|
|
tar xzf "$tmp/ouch.tgz" -C "$tmp"
|
|
cp -f "$tmp/ouch-${target}/ouch" "$BIN/ouch"; chmod 0755 "$BIN/ouch"
|
|
rm -rf "$tmp"
|
|
has ouch || die "ouch gagal dipasang"
|
|
}
|
|
|
|
log "Pastikan tool terpasang"
|
|
ensure_fish
|
|
ensure_micro
|
|
ensure_starship
|
|
ensure_yazi
|
|
ensure_lazydocker
|
|
ensure_ouch
|
|
has fastfetch || warn "fastfetch tak ada di repo distro (greeting dilewati)"
|
|
has mediainfo || warn "mediainfo tak ada di repo distro (metadata media Yazi dilewati)"
|
|
|
|
# ---------------------------------------------------------------- config yazi
|
|
run_as_user() { # jalankan perintah sebagai user target (HOME-nya benar)
|
|
# Jangan sembunyikan stderr: dulu `2>/dev/null` membuat kegagalan `ya pkg add`
|
|
# (mis. git belum terpasang) tidak terlihat, lalu init.lua memanggil plugin yang
|
|
# tidak pernah ada -> "Lua runtime failed" saat yazi dibuka.
|
|
local u="$1"; shift
|
|
if [ "$u" = root ]; then bash -lc "$*"
|
|
else su -l "$u" -c "$*"; fi
|
|
}
|
|
|
|
write_yazi() {
|
|
local home="$1" user="$2" dir
|
|
[ -d "$home" ] || return 0
|
|
dir="$home/.config/yazi"
|
|
mkdir -p "$dir"
|
|
local f; for f in yazi.toml keymap.toml init.lua; do
|
|
[ -f "$dir/$f" ] && cp -a "$dir/$f" "$dir/$f.bak-$(date +%Y%m%d%H%M%S)"
|
|
done
|
|
|
|
cat > "$dir/yazi.toml" <<'EOF'
|
|
# Editor default: micro (bukan vim)
|
|
[opener]
|
|
edit = [
|
|
{ run = 'micro %s', block = true, desc = "Edit (micro)", for = "unix" },
|
|
]
|
|
# Ekstrak arsip pakai ouch
|
|
extract = [
|
|
{ run = 'ouch d -y "$@"', desc = "Ekstrak di sini (ouch)", for = "unix" },
|
|
]
|
|
|
|
[plugin]
|
|
prepend_preloaders = [
|
|
{ mime = "{audio,video,image}/*", run = "mediainfo" },
|
|
{ mime = "application/{subrip,postscript,illustrator,dvb.ait,vnd.adobe.illustrator,eps}", run = "mediainfo" },
|
|
{ url = "*.{ai,eps,ait}", run = "mediainfo" },
|
|
]
|
|
prepend_previewers = [
|
|
{ mime = "{audio,video,image}/*", run = "mediainfo" },
|
|
{ mime = "application/{subrip,postscript,illustrator,dvb.ait,vnd.adobe.illustrator,eps}", run = "mediainfo" },
|
|
{ url = "*.{ai,eps,ait}", run = "mediainfo" },
|
|
{ mime = "application/{*zip,tar,bzip2,7z*,rar,xz,zstd,java-archive}", run = "ouch" },
|
|
]
|
|
|
|
# Batas memori decode gambar (untuk file media besar)
|
|
[tasks]
|
|
image_alloc = 2147483648
|
|
image_bound = [12000, 12000]
|
|
EOF
|
|
|
|
cat > "$dir/keymap.toml" <<'EOF'
|
|
# fg.yazi: cari isi / nama file (ripgrep + fzf)
|
|
[[mgr.prepend_keymap]]
|
|
on = [ "f", "g" ]
|
|
run = "plugin fg"
|
|
desc = "Cari file by isi (fuzzy)"
|
|
|
|
[[mgr.prepend_keymap]]
|
|
on = [ "f", "G" ]
|
|
run = "plugin fg -- rg"
|
|
desc = "Cari file by isi (ripgrep)"
|
|
|
|
[[mgr.prepend_keymap]]
|
|
on = [ "f", "f" ]
|
|
run = "plugin fg -- fzf"
|
|
desc = "Cari file by nama"
|
|
|
|
# zoxide (plugin bawaan Yazi): lompat direktori
|
|
[[mgr.prepend_keymap]]
|
|
on = "Z"
|
|
run = "plugin zoxide"
|
|
desc = "Lompat direktori (zoxide)"
|
|
|
|
# ouch: kompres (format ikut ekstensi nama)
|
|
[[mgr.prepend_keymap]]
|
|
on = "C"
|
|
run = "plugin ouch"
|
|
desc = "Kompres dengan ouch (zip/tar.gz/7z/xz/zst)"
|
|
|
|
# chmod: ubah permission
|
|
[[mgr.prepend_keymap]]
|
|
on = [ "c", "h" ]
|
|
run = "plugin chmod"
|
|
desc = "Ubah permission (chmod)"
|
|
EOF
|
|
|
|
cat > "$dir/init.lua" <<'EOF'
|
|
require("full-border"):setup { type = ui.Border.ROUNDED }
|
|
require("fg"):setup { default_action = "menu" }
|
|
require("zoxide"):setup { update_db = true }
|
|
EOF
|
|
|
|
chown -R "$user:$user" "$dir" 2>/dev/null || true
|
|
}
|
|
|
|
install_yazi_plugins() {
|
|
local home="$1" user="$2" ya p cmd
|
|
ya="$(command -v ya || command -v yazi || true)"
|
|
[ -n "$ya" ] || { warn "ya/yazi tak ada — plugin Yazi dilewati"; return 0; }
|
|
# fg: pakai lpnh/fg (ada di GitHub). Repo DreamMaoMao/fg.yazi hanya ada di
|
|
# Gitee, jadi URL GitHub lama selalu 404 -> init.lua memanggil plugin yang
|
|
# tidak pernah ada -> "Lua runtime failed" tiap kali yazi dibuka.
|
|
for p in yazi-rs/plugins:full-border yazi-rs/plugins:smart-filter yazi-rs/plugins:chmod ndtoan96/ouch boydaihungst/mediainfo lpnh/fg; do
|
|
run_as_user "$user" "'$ya' pkg add '$p'" || true
|
|
done
|
|
}
|
|
|
|
log "Config Yazi (editor=micro, metadata media, arsip) untuk $TARGET_USER"
|
|
write_yazi "$TARGET_HOME" "$TARGET_USER"
|
|
install_yazi_plugins "$TARGET_HOME" "$TARGET_USER"
|
|
if [ "$TARGET_USER" != root ]; then
|
|
write_yazi "/root" "root"
|
|
fi
|
|
|
|
# ---------------------------------------------------------------- fish global
|
|
FISH="$(command -v fish)"
|
|
log "Daftarkan $FISH ke /etc/shells"
|
|
grep -qxF "$FISH" /etc/shells 2>/dev/null || echo "$FISH" >> /etc/shells
|
|
|
|
log "Config fish GLOBAL: /etc/fish/conf.d/temp-own.fish"
|
|
mkdir -p /etc/fish/conf.d
|
|
cat > /etc/fish/conf.d/temp-own.fish <<'EOF'
|
|
# temp-own — berlaku untuk SEMUA user
|
|
if status is-interactive
|
|
set -gx EDITOR micro
|
|
set -gx VISUAL micro
|
|
# starship polos (default)
|
|
if command -q starship
|
|
starship init fish | source
|
|
end
|
|
# Greeting pembuka: fastfetch
|
|
if command -q fastfetch
|
|
function fish_greeting
|
|
fastfetch
|
|
end
|
|
end
|
|
end
|
|
EOF
|
|
|
|
set_shell() {
|
|
local u="$1"
|
|
id "$u" >/dev/null 2>&1 || return 0
|
|
chsh -s "$FISH" "$u" >/dev/null 2>&1 && log " default shell $u -> fish" || warn "chsh gagal untuk $u"
|
|
}
|
|
log "Jadikan fish default shell"
|
|
set_shell "$TARGET_USER"
|
|
[ "$TARGET_USER" != root ] && set_shell root
|
|
|
|
# ---------------------------------------------------------------- selesai
|
|
cat <<EOF
|
|
|
|
$(printf "${BLUE}==>${NC}") Selesai.
|
|
fish : $(command -v fish)
|
|
starship : $(command -v starship) (polos)
|
|
yazi : $(command -v yazi) (editor default: micro, plugin+metadata siap)
|
|
micro : $(command -v micro)
|
|
lazydocker: $(command -v lazydocker)
|
|
fastfetch : $(command -v fastfetch || echo '-') (greeting fish)
|
|
mediainfo : $(command -v mediainfo || echo '-') (metadata media di Yazi)
|
|
ouch : $(command -v ouch || echo '-') (arsip zip/tar/7z)
|
|
|
|
Logout/login (atau buka terminal baru) agar shell fish aktif.
|
|
Konfigurasi fish global: /etc/fish/conf.d/temp-own.fish
|
|
EOF
|