#!/bin/bash # # sync-zshrc-all.sh # # Sinkronisasi konfigurasi Zsh GLOBAL untuk macOS dari Gist. # # Remote Gist: # .zshrc -> /usr/local/etc/global-zshrc.zsh # shell-prompt.zsh -> /usr/local/etc/shell-prompt.zsh # config.jsonc -> /usr/local/etc/fastfetch/config.jsonc # # /etc/zshrc TIDAK ditimpa. # Skrip hanya menambahkan managed block agar /etc/zshrc me-load: # /usr/local/etc/global-zshrc.zsh # # Dengan demikian konfigurasi berlaku untuk SEMUA user yang menggunakan Zsh. # # Jalankan sebagai user administrator biasa: # # chmod +x sync-zshrc-all.sh # ./sync-zshrc-all.sh # # Jangan jalankan dengan: # # sudo ./sync-zshrc-all.sh # # Skrip akan meminta sudo sendiri saat diperlukan. set -euo pipefail # --------------------------------------------------------------------------- # Remote Gist # --------------------------------------------------------------------------- ZSHRC_URL="https://gist.darto.id/dartokloning/6aac33d413ae4bfea0c26665276aa7f0/download/HEAD/.zshrc" PROMPT_URL="https://gist.darto.id/dartokloning/8e9865f5d4be4166912208f3ef2d4cf2/download/HEAD/shell-prompt.zsh" FASTFETCH_CONFIG_URL="https://gist.darto.id/dartokloning/09cffd6151554d50a5cae1d22674f134/download/HEAD/config.jsonc" # --------------------------------------------------------------------------- # Global destination # --------------------------------------------------------------------------- GLOBAL_ZSHRC="/usr/local/etc/global-zshrc.zsh" PROMPT_FILE="/usr/local/etc/shell-prompt.zsh" FASTFETCH_CONFIG_FILE="/usr/local/etc/fastfetch/config.jsonc" SYSTEM_ZSHRC="/etc/zshrc" MANAGED_BEGIN="# >>> dartokloning global zsh >>>" MANAGED_END="# <<< dartokloning global zsh <<<" # --------------------------------------------------------------------------- # Basic validation # --------------------------------------------------------------------------- if [[ "$(uname -s)" != "Darwin" ]]; then echo "Error: skrip ini khusus untuk macOS." >&2 exit 1 fi if [[ "$(id -u)" -eq 0 ]]; then echo "Error: jangan jalankan skrip ini menggunakan sudo/root." >&2 echo "Jalankan sebagai user administrator biasa:" >&2 echo " ./sync-zshrc-all.sh" >&2 exit 1 fi if ! command -v curl >/dev/null 2>&1; then echo "Error: curl tidak ditemukan." >&2 exit 1 fi TMP_DIR="$(mktemp -d)" trap 'rm -rf "$TMP_DIR"' EXIT # --------------------------------------------------------------------------- # Helper functions # --------------------------------------------------------------------------- fetch() { local url="$1" local dest="$2" if ! curl -fL --silent --show-error "$url" -o "$dest"; then echo "Error: gagal download:" >&2 echo " $url" >&2 exit 1 fi if [[ ! -s "$dest" ]]; then echo "Error: file hasil download kosong:" >&2 echo " $url" >&2 exit 1 fi } sync_global_file() { # sync_global_file URL DEST LABEL local url="$1" local dest="$2" local label="$3" local tmp="$TMP_DIR/$(basename "$dest").$$" fetch "$url" "$tmp" if sudo test -f "$dest" && sudo cmp -s "$tmp" "$dest"; then echo " -> $label sudah sama dengan Gist, skip." return 0 fi sudo mkdir -p "$(dirname "$dest")" # Backup hanya sekali, agar file sebelum pertama kali dikelola tetap tersimpan. if sudo test -f "$dest" && ! sudo test -f "${dest}.original"; then sudo cp -p "$dest" "${dest}.original" echo " -> Backup awal: ${dest}.original" fi sudo install -o root -g wheel -m 0644 "$tmp" "$dest" echo " -> $label diperbarui." } ensure_system_zshrc_loader() { local tmp="$TMP_DIR/zshrc.new" local current="$TMP_DIR/zshrc.current" if sudo test -f "$SYSTEM_ZSHRC"; then sudo cat "$SYSTEM_ZSHRC" > "$current" else : > "$current" fi # Jika managed block sudah benar, tidak perlu menyentuh /etc/zshrc. if grep -Fqx "$MANAGED_BEGIN" "$current" && grep -Fqx '[[ -r /usr/local/etc/global-zshrc.zsh ]] && source /usr/local/etc/global-zshrc.zsh' "$current" && grep -Fqx "$MANAGED_END" "$current"; then echo " -> Loader global sudah ada di $SYSTEM_ZSHRC, skip." return 0 fi # Hapus managed block versi lama bila ada, lalu tambahkan versi terbaru. awk -v begin="$MANAGED_BEGIN" -v end="$MANAGED_END" ' $0 == begin {skip=1; next} $0 == end {skip=0; next} !skip {print} ' "$current" > "$tmp" # Rapikan newline sebelum managed block. printf '\n%s\n' "$MANAGED_BEGIN" >> "$tmp" printf '%s\n' '[[ -r /usr/local/etc/global-zshrc.zsh ]] && source /usr/local/etc/global-zshrc.zsh' >> "$tmp" printf '%s\n' "$MANAGED_END" >> "$tmp" # Backup /etc/zshrc hanya sekali. if sudo test -f "$SYSTEM_ZSHRC" && ! sudo test -f "${SYSTEM_ZSHRC}.original"; then sudo cp -p "$SYSTEM_ZSHRC" "${SYSTEM_ZSHRC}.original" echo " -> Backup awal: ${SYSTEM_ZSHRC}.original" fi sudo install -o root -g wheel -m 0644 "$tmp" "$SYSTEM_ZSHRC" echo " -> Loader global dipasang ke $SYSTEM_ZSHRC." } # --------------------------------------------------------------------------- # Dependency # --------------------------------------------------------------------------- echo "== 0. Cek dependency ==" if ! command -v brew >/dev/null 2>&1; then # Coba lokasi standar Homebrew bila PATH shell saat ini belum memuatnya. if [[ -x /opt/homebrew/bin/brew ]]; then eval "$(/opt/homebrew/bin/brew shellenv)" elif [[ -x /usr/local/bin/brew ]]; then eval "$(/usr/local/bin/brew shellenv)" else echo "Error: Homebrew belum terinstall." >&2 echo "Install Homebrew terlebih dahulu lalu jalankan ulang skrip." >&2 exit 1 fi fi need_install=() command -v vivid >/dev/null 2>&1 || need_install+=("vivid") command -v fastfetch >/dev/null 2>&1 || need_install+=("fastfetch") if [[ "${#need_install[@]}" -gt 0 ]]; then echo " -> Install via Homebrew: ${need_install[*]}" brew install "${need_install[@]}" else echo " -> vivid dan fastfetch sudah tersedia, skip." fi # Minta credential sudo di awal agar proses berikutnya lebih jelas. echo echo "== 1. Validasi akses administrator ==" sudo -v # --------------------------------------------------------------------------- # Global configuration # --------------------------------------------------------------------------- echo echo "== 2. Sinkronisasi global Zsh config ==" sync_global_file \ "$ZSHRC_URL" \ "$GLOBAL_ZSHRC" \ "$GLOBAL_ZSHRC" echo echo "== 3. Sinkronisasi global shell prompt ==" sync_global_file \ "$PROMPT_URL" \ "$PROMPT_FILE" \ "$PROMPT_FILE" echo echo "== 4. Sinkronisasi global Fastfetch config ==" sync_global_file \ "$FASTFETCH_CONFIG_URL" \ "$FASTFETCH_CONFIG_FILE" \ "$FASTFETCH_CONFIG_FILE" echo echo "== 5. Pastikan /etc/zshrc me-load konfigurasi global ==" ensure_system_zshrc_loader # --------------------------------------------------------------------------- # Finish # --------------------------------------------------------------------------- echo echo "============================================================" echo "Sinkronisasi selesai." echo "============================================================" echo echo "Konfigurasi GLOBAL:" echo " Zsh : $GLOBAL_ZSHRC" echo " Prompt : $PROMPT_FILE" echo " Fastfetch : $FASTFETCH_CONFIG_FILE" echo echo "Loader:" echo " $SYSTEM_ZSHRC" echo " -> source $GLOBAL_ZSHRC" echo echo "Konfigurasi ini berlaku untuk semua user Zsh." echo echo "Untuk shell yang sedang aktif, buka Terminal baru atau jalankan:" echo " exec zsh" echo