Zuletzt aktiv 1788244908

sync-zshrc-all.sh Orginalformat
1#!/bin/bash
2#
3# sync-zshrc-all.sh
4#
5# Sinkronisasi konfigurasi Zsh GLOBAL untuk macOS dari Gist.
6#
7# Remote Gist:
8# .zshrc -> /usr/local/etc/global-zshrc.zsh
9# shell-prompt.zsh -> /usr/local/etc/shell-prompt.zsh
10# config.jsonc -> /usr/local/etc/fastfetch/config.jsonc
11#
12# /etc/zshrc TIDAK ditimpa.
13# Skrip hanya menambahkan managed block agar /etc/zshrc me-load:
14# /usr/local/etc/global-zshrc.zsh
15#
16# Dengan demikian konfigurasi berlaku untuk SEMUA user yang menggunakan Zsh.
17#
18# Jalankan sebagai user administrator biasa:
19#
20# chmod +x sync-zshrc-all.sh
21# ./sync-zshrc-all.sh
22#
23# Jangan jalankan dengan:
24#
25# sudo ./sync-zshrc-all.sh
26#
27# Skrip akan meminta sudo sendiri saat diperlukan.
28
29set -euo pipefail
30
31# ---------------------------------------------------------------------------
32# Remote Gist
33# ---------------------------------------------------------------------------
34
35ZSHRC_URL="https://gist.darto.id/dartokloning/6aac33d413ae4bfea0c26665276aa7f0/download/HEAD/.zshrc"
36PROMPT_URL="https://gist.darto.id/dartokloning/8e9865f5d4be4166912208f3ef2d4cf2/download/HEAD/shell-prompt.zsh"
37FASTFETCH_CONFIG_URL="https://gist.darto.id/dartokloning/09cffd6151554d50a5cae1d22674f134/download/HEAD/config.jsonc"
38
39# ---------------------------------------------------------------------------
40# Global destination
41# ---------------------------------------------------------------------------
42
43GLOBAL_ZSHRC="/usr/local/etc/global-zshrc.zsh"
44PROMPT_FILE="/usr/local/etc/shell-prompt.zsh"
45FASTFETCH_CONFIG_FILE="/usr/local/etc/fastfetch/config.jsonc"
46SYSTEM_ZSHRC="/etc/zshrc"
47
48MANAGED_BEGIN="# >>> dartokloning global zsh >>>"
49MANAGED_END="# <<< dartokloning global zsh <<<"
50
51# ---------------------------------------------------------------------------
52# Basic validation
53# ---------------------------------------------------------------------------
54
55if [[ "$(uname -s)" != "Darwin" ]]; then
56 echo "Error: skrip ini khusus untuk macOS." >&2
57 exit 1
58fi
59
60if [[ "$(id -u)" -eq 0 ]]; then
61 echo "Error: jangan jalankan skrip ini menggunakan sudo/root." >&2
62 echo "Jalankan sebagai user administrator biasa:" >&2
63 echo " ./sync-zshrc-all.sh" >&2
64 exit 1
65fi
66
67if ! command -v curl >/dev/null 2>&1; then
68 echo "Error: curl tidak ditemukan." >&2
69 exit 1
70fi
71
72TMP_DIR="$(mktemp -d)"
73trap 'rm -rf "$TMP_DIR"' EXIT
74
75# ---------------------------------------------------------------------------
76# Helper functions
77# ---------------------------------------------------------------------------
78
79fetch() {
80 local url="$1"
81 local dest="$2"
82
83 if ! curl -fL --silent --show-error "$url" -o "$dest"; then
84 echo "Error: gagal download:" >&2
85 echo " $url" >&2
86 exit 1
87 fi
88
89 if [[ ! -s "$dest" ]]; then
90 echo "Error: file hasil download kosong:" >&2
91 echo " $url" >&2
92 exit 1
93 fi
94}
95
96sync_global_file() {
97 # sync_global_file URL DEST LABEL
98 local url="$1"
99 local dest="$2"
100 local label="$3"
101 local tmp="$TMP_DIR/$(basename "$dest").$$"
102
103 fetch "$url" "$tmp"
104
105 if sudo test -f "$dest" && sudo cmp -s "$tmp" "$dest"; then
106 echo " -> $label sudah sama dengan Gist, skip."
107 return 0
108 fi
109
110 sudo mkdir -p "$(dirname "$dest")"
111
112 # Backup hanya sekali, agar file sebelum pertama kali dikelola tetap tersimpan.
113 if sudo test -f "$dest" && ! sudo test -f "${dest}.original"; then
114 sudo cp -p "$dest" "${dest}.original"
115 echo " -> Backup awal: ${dest}.original"
116 fi
117
118 sudo install -o root -g wheel -m 0644 "$tmp" "$dest"
119 echo " -> $label diperbarui."
120}
121
122ensure_system_zshrc_loader() {
123 local tmp="$TMP_DIR/zshrc.new"
124 local current="$TMP_DIR/zshrc.current"
125
126 if sudo test -f "$SYSTEM_ZSHRC"; then
127 sudo cat "$SYSTEM_ZSHRC" > "$current"
128 else
129 : > "$current"
130 fi
131
132 # Jika managed block sudah benar, tidak perlu menyentuh /etc/zshrc.
133 if grep -Fqx "$MANAGED_BEGIN" "$current" &&
134 grep -Fqx '[[ -r /usr/local/etc/global-zshrc.zsh ]] && source /usr/local/etc/global-zshrc.zsh' "$current" &&
135 grep -Fqx "$MANAGED_END" "$current"; then
136 echo " -> Loader global sudah ada di $SYSTEM_ZSHRC, skip."
137 return 0
138 fi
139
140 # Hapus managed block versi lama bila ada, lalu tambahkan versi terbaru.
141 awk -v begin="$MANAGED_BEGIN" -v end="$MANAGED_END" '
142 $0 == begin {skip=1; next}
143 $0 == end {skip=0; next}
144 !skip {print}
145 ' "$current" > "$tmp"
146
147 # Rapikan newline sebelum managed block.
148 printf '\n%s\n' "$MANAGED_BEGIN" >> "$tmp"
149 printf '%s\n' '[[ -r /usr/local/etc/global-zshrc.zsh ]] && source /usr/local/etc/global-zshrc.zsh' >> "$tmp"
150 printf '%s\n' "$MANAGED_END" >> "$tmp"
151
152 # Backup /etc/zshrc hanya sekali.
153 if sudo test -f "$SYSTEM_ZSHRC" && ! sudo test -f "${SYSTEM_ZSHRC}.original"; then
154 sudo cp -p "$SYSTEM_ZSHRC" "${SYSTEM_ZSHRC}.original"
155 echo " -> Backup awal: ${SYSTEM_ZSHRC}.original"
156 fi
157
158 sudo install -o root -g wheel -m 0644 "$tmp" "$SYSTEM_ZSHRC"
159 echo " -> Loader global dipasang ke $SYSTEM_ZSHRC."
160}
161
162# ---------------------------------------------------------------------------
163# Dependency
164# ---------------------------------------------------------------------------
165
166echo "== 0. Cek dependency =="
167
168if ! command -v brew >/dev/null 2>&1; then
169 # Coba lokasi standar Homebrew bila PATH shell saat ini belum memuatnya.
170 if [[ -x /opt/homebrew/bin/brew ]]; then
171 eval "$(/opt/homebrew/bin/brew shellenv)"
172 elif [[ -x /usr/local/bin/brew ]]; then
173 eval "$(/usr/local/bin/brew shellenv)"
174 else
175 echo "Error: Homebrew belum terinstall." >&2
176 echo "Install Homebrew terlebih dahulu lalu jalankan ulang skrip." >&2
177 exit 1
178 fi
179fi
180
181need_install=()
182
183command -v vivid >/dev/null 2>&1 || need_install+=("vivid")
184command -v fastfetch >/dev/null 2>&1 || need_install+=("fastfetch")
185
186if [[ "${#need_install[@]}" -gt 0 ]]; then
187 echo " -> Install via Homebrew: ${need_install[*]}"
188 brew install "${need_install[@]}"
189else
190 echo " -> vivid dan fastfetch sudah tersedia, skip."
191fi
192
193# Minta credential sudo di awal agar proses berikutnya lebih jelas.
194echo
195echo "== 1. Validasi akses administrator =="
196sudo -v
197
198# ---------------------------------------------------------------------------
199# Global configuration
200# ---------------------------------------------------------------------------
201
202echo
203echo "== 2. Sinkronisasi global Zsh config =="
204sync_global_file \
205 "$ZSHRC_URL" \
206 "$GLOBAL_ZSHRC" \
207 "$GLOBAL_ZSHRC"
208
209echo
210echo "== 3. Sinkronisasi global shell prompt =="
211sync_global_file \
212 "$PROMPT_URL" \
213 "$PROMPT_FILE" \
214 "$PROMPT_FILE"
215
216echo
217echo "== 4. Sinkronisasi global Fastfetch config =="
218sync_global_file \
219 "$FASTFETCH_CONFIG_URL" \
220 "$FASTFETCH_CONFIG_FILE" \
221 "$FASTFETCH_CONFIG_FILE"
222
223echo
224echo "== 5. Pastikan /etc/zshrc me-load konfigurasi global =="
225ensure_system_zshrc_loader
226
227# ---------------------------------------------------------------------------
228# Finish
229# ---------------------------------------------------------------------------
230
231echo
232echo "============================================================"
233echo "Sinkronisasi selesai."
234echo "============================================================"
235echo
236echo "Konfigurasi GLOBAL:"
237echo " Zsh : $GLOBAL_ZSHRC"
238echo " Prompt : $PROMPT_FILE"
239echo " Fastfetch : $FASTFETCH_CONFIG_FILE"
240echo
241echo "Loader:"
242echo " $SYSTEM_ZSHRC"
243echo " -> source $GLOBAL_ZSHRC"
244echo
245echo "Konfigurasi ini berlaku untuk semua user Zsh."
246echo
247echo "Untuk shell yang sedang aktif, buka Terminal baru atau jalankan:"
248echo " exec zsh"
249echo
250