sync-zshrc-all.sh
· 7.5 KiB · Bash
原始文件
#!/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
| 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 | |
| 29 | set -euo pipefail |
| 30 | |
| 31 | # --------------------------------------------------------------------------- |
| 32 | # Remote Gist |
| 33 | # --------------------------------------------------------------------------- |
| 34 | |
| 35 | ZSHRC_URL="https://gist.darto.id/dartokloning/6aac33d413ae4bfea0c26665276aa7f0/download/HEAD/.zshrc" |
| 36 | PROMPT_URL="https://gist.darto.id/dartokloning/8e9865f5d4be4166912208f3ef2d4cf2/download/HEAD/shell-prompt.zsh" |
| 37 | FASTFETCH_CONFIG_URL="https://gist.darto.id/dartokloning/09cffd6151554d50a5cae1d22674f134/download/HEAD/config.jsonc" |
| 38 | |
| 39 | # --------------------------------------------------------------------------- |
| 40 | # Global destination |
| 41 | # --------------------------------------------------------------------------- |
| 42 | |
| 43 | GLOBAL_ZSHRC="/usr/local/etc/global-zshrc.zsh" |
| 44 | PROMPT_FILE="/usr/local/etc/shell-prompt.zsh" |
| 45 | FASTFETCH_CONFIG_FILE="/usr/local/etc/fastfetch/config.jsonc" |
| 46 | SYSTEM_ZSHRC="/etc/zshrc" |
| 47 | |
| 48 | MANAGED_BEGIN="# >>> dartokloning global zsh >>>" |
| 49 | MANAGED_END="# <<< dartokloning global zsh <<<" |
| 50 | |
| 51 | # --------------------------------------------------------------------------- |
| 52 | # Basic validation |
| 53 | # --------------------------------------------------------------------------- |
| 54 | |
| 55 | if [[ "$(uname -s)" != "Darwin" ]]; then |
| 56 | echo "Error: skrip ini khusus untuk macOS." >&2 |
| 57 | exit 1 |
| 58 | fi |
| 59 | |
| 60 | if [[ "$(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 |
| 65 | fi |
| 66 | |
| 67 | if ! command -v curl >/dev/null 2>&1; then |
| 68 | echo "Error: curl tidak ditemukan." >&2 |
| 69 | exit 1 |
| 70 | fi |
| 71 | |
| 72 | TMP_DIR="$(mktemp -d)" |
| 73 | trap 'rm -rf "$TMP_DIR"' EXIT |
| 74 | |
| 75 | # --------------------------------------------------------------------------- |
| 76 | # Helper functions |
| 77 | # --------------------------------------------------------------------------- |
| 78 | |
| 79 | fetch() { |
| 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 | |
| 96 | sync_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 | |
| 122 | ensure_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 | |
| 166 | echo "== 0. Cek dependency ==" |
| 167 | |
| 168 | if ! 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 |
| 179 | fi |
| 180 | |
| 181 | need_install=() |
| 182 | |
| 183 | command -v vivid >/dev/null 2>&1 || need_install+=("vivid") |
| 184 | command -v fastfetch >/dev/null 2>&1 || need_install+=("fastfetch") |
| 185 | |
| 186 | if [[ "${#need_install[@]}" -gt 0 ]]; then |
| 187 | echo " -> Install via Homebrew: ${need_install[*]}" |
| 188 | brew install "${need_install[@]}" |
| 189 | else |
| 190 | echo " -> vivid dan fastfetch sudah tersedia, skip." |
| 191 | fi |
| 192 | |
| 193 | # Minta credential sudo di awal agar proses berikutnya lebih jelas. |
| 194 | echo |
| 195 | echo "== 1. Validasi akses administrator ==" |
| 196 | sudo -v |
| 197 | |
| 198 | # --------------------------------------------------------------------------- |
| 199 | # Global configuration |
| 200 | # --------------------------------------------------------------------------- |
| 201 | |
| 202 | echo |
| 203 | echo "== 2. Sinkronisasi global Zsh config ==" |
| 204 | sync_global_file \ |
| 205 | "$ZSHRC_URL" \ |
| 206 | "$GLOBAL_ZSHRC" \ |
| 207 | "$GLOBAL_ZSHRC" |
| 208 | |
| 209 | echo |
| 210 | echo "== 3. Sinkronisasi global shell prompt ==" |
| 211 | sync_global_file \ |
| 212 | "$PROMPT_URL" \ |
| 213 | "$PROMPT_FILE" \ |
| 214 | "$PROMPT_FILE" |
| 215 | |
| 216 | echo |
| 217 | echo "== 4. Sinkronisasi global Fastfetch config ==" |
| 218 | sync_global_file \ |
| 219 | "$FASTFETCH_CONFIG_URL" \ |
| 220 | "$FASTFETCH_CONFIG_FILE" \ |
| 221 | "$FASTFETCH_CONFIG_FILE" |
| 222 | |
| 223 | echo |
| 224 | echo "== 5. Pastikan /etc/zshrc me-load konfigurasi global ==" |
| 225 | ensure_system_zshrc_loader |
| 226 | |
| 227 | # --------------------------------------------------------------------------- |
| 228 | # Finish |
| 229 | # --------------------------------------------------------------------------- |
| 230 | |
| 231 | echo |
| 232 | echo "============================================================" |
| 233 | echo "Sinkronisasi selesai." |
| 234 | echo "============================================================" |
| 235 | echo |
| 236 | echo "Konfigurasi GLOBAL:" |
| 237 | echo " Zsh : $GLOBAL_ZSHRC" |
| 238 | echo " Prompt : $PROMPT_FILE" |
| 239 | echo " Fastfetch : $FASTFETCH_CONFIG_FILE" |
| 240 | echo |
| 241 | echo "Loader:" |
| 242 | echo " $SYSTEM_ZSHRC" |
| 243 | echo " -> source $GLOBAL_ZSHRC" |
| 244 | echo |
| 245 | echo "Konfigurasi ini berlaku untuk semua user Zsh." |
| 246 | echo |
| 247 | echo "Untuk shell yang sedang aktif, buka Terminal baru atau jalankan:" |
| 248 | echo " exec zsh" |
| 249 | echo |
| 250 |