Files
oxpoe 5dab8b0cce fix: pasang ncurses + git, dan pakai lpnh/fg untuk plugin Yazi
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`
2026-10-16 08:27:17 +07:00

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