#!/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 | 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 <${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