Last active 1787969768

Automatically sync .bashrc for all users for Administrator.

sync-bashrc-all.sh Raw
1#!/bin/bash
2#
3# sync-bashrc-all.sh (v2)
4#
5# Skrip all-in-one:
6# 0. Pastikan dependency (vivid, fastfetch) terinstall via apt
7# 1. Cek /etc/skel/.bashrc vs versi remote (gist) -> update kalau beda
8# 2. Cek /etc/shell-prompt.sh vs versi remote (gist) -> update kalau beda
9# 3. Cek /etc/fastfetch/config.jsonc vs versi remote (gist) -> update kalau beda
10# 4. Terapkan /etc/skel/.bashrc ke semua user existing di /home yang
11# .bashrc-nya belum sesuai
12#
13# Jalankan sebagai root: sudo bash sync-bashrc-all.sh
14
15set -euo pipefail
16export DEBIAN_FRONTEND=noninteractive
17
18BASHRC_URL="https://gist.darto.id/dartokloning/866220d4bda046fe93508ed50dac1965/download/HEAD/.bashrc"
19PROMPT_URL="https://gist.darto.id/dartokloning/def50cb1b3024c3b8683960c873caf34/download/HEAD/shell-prompt.sh"
20FASTFETCH_CONFIG_URL="https://gist.darto.id/dartokloning/655822e458964d0a93085c205506443f/download/HEAD/config.jsonc"
21
22SKEL_BASHRC="/etc/skel/.bashrc"
23PROMPT_FILE="/etc/shell-prompt.sh"
24FASTFETCH_CONFIG_FILE="/etc/fastfetch/config.jsonc"
25
26if [ "$(id -u)" -ne 0 ]; then
27 echo "Skrip ini harus dijalankan sebagai root (pakai sudo)." >&2
28 exit 1
29fi
30
31TMP_DIR="$(mktemp -d)"
32trap 'rm -rf "$TMP_DIR"' EXIT
33
34fetch() {
35 # fetch URL DEST_TMPFILE -> berhenti dengan pesan jelas kalau gagal
36 local url="$1" dest="$2"
37 if ! wget -q -O "$dest" "$url"; then
38 echo "Error: gagal download $url (cek koneksi internet)." >&2
39 exit 1
40 fi
41}
42
43sync_file() {
44 # sync_file URL DEST_PATH LABEL [CHMOD_MODE]
45 # return 0 kalau file diperbarui, 1 kalau sudah sesuai (tidak ada perubahan)
46 local url="$1" dest="$2" label="$3" mode="${4:-}"
47 local tmp="$TMP_DIR/$(basename "$dest")"
48
49 fetch "$url" "$tmp"
50 mkdir -p "$(dirname "$dest")"
51
52 if [ ! -f "$dest" ] || ! cmp -s "$tmp" "$dest"; then
53 cp "$tmp" "$dest"
54 [ -n "$mode" ] && chmod "$mode" "$dest"
55 echo " -> $label diperbarui."
56 return 0
57 else
58 echo " -> $label sudah sesuai, tidak ada perubahan."
59 return 1
60 fi
61}
62
63echo "== 0. Pastikan dependency (vivid, fastfetch) terinstall =="
64need_install=()
65command -v vivid >/dev/null 2>&1 || need_install+=("vivid")
66command -v fastfetch >/dev/null 2>&1 || need_install+=("fastfetch")
67
68if [ "${#need_install[@]}" -gt 0 ]; then
69 echo " -> Menginstall: ${need_install[*]}"
70 apt-get update -qq
71 apt-get install -y "${need_install[@]}"
72else
73 echo " -> vivid & fastfetch sudah terinstall, skip."
74fi
75
76echo
77echo "== 1. Cek /etc/skel/.bashrc =="
78sync_file "$BASHRC_URL" "$SKEL_BASHRC" "$SKEL_BASHRC" || true
79
80echo
81echo "== 2. Cek /etc/shell-prompt.sh =="
82sync_file "$PROMPT_URL" "$PROMPT_FILE" "$PROMPT_FILE" "644" || true
83
84echo
85echo "== 3. Cek /etc/fastfetch/config.jsonc =="
86sync_file "$FASTFETCH_CONFIG_URL" "$FASTFETCH_CONFIG_FILE" "$FASTFETCH_CONFIG_FILE" "644" || true
87
88echo
89echo "== 4. Terapkan template ke user existing di /home =="
90for home_dir in /home/*/; do
91 home_dir="${home_dir%/}"
92 user="$(basename "$home_dir")"
93
94 # skip kalau bukan user valid (mis. lost+found, direktori nyasar)
95 if ! id "$user" >/dev/null 2>&1; then
96 continue
97 fi
98
99 target="$home_dir/.bashrc"
100
101 # kalau .bashrc user sudah identik dengan template skel, skip
102 if [ -f "$target" ] && cmp -s "$SKEL_BASHRC" "$target"; then
103 echo "[SKIP] $user - .bashrc sudah sesuai template"
104 continue
105 fi
106
107 # backup .bashrc lama, hanya sekali (tidak menimpa backup yang sudah ada)
108 if [ -f "$target" ] && [ ! -f "$home_dir/.bashrc.original" ]; then
109 cp -a "$target" "$home_dir/.bashrc.original"
110 echo "[BACKUP] $user - .bashrc lama disimpan sebagai .bashrc.original"
111 fi
112
113 cp "$SKEL_BASHRC" "$target"
114 chown "$user":"$user" "$target"
115 echo "[APPLY] $user - .bashrc diperbarui dari template skel"
116done
117
118echo
119echo "Selesai."
120echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang"
121echo "agar shell aktifnya ikut memakai .bashrc yang baru."}
122
123echo "== 1. Cek /etc/skel/.bashrc =="
124tmp_bashrc="$TMP_DIR/.bashrc"
125fetch "$BASHRC_URL" "$tmp_bashrc"
126
127if [ ! -f "$SKEL_BASHRC" ] || ! cmp -s "$tmp_bashrc" "$SKEL_BASHRC"; then
128 cp "$tmp_bashrc" "$SKEL_BASHRC"
129 echo " -> $SKEL_BASHRC diperbarui dari gist."
130else
131 echo " -> $SKEL_BASHRC sudah sesuai dengan gist, tidak ada perubahan."
132fi
133
134echo
135echo "== 2. Cek /etc/shell-prompt.sh =="
136tmp_prompt="$TMP_DIR/shell-prompt.sh"
137fetch "$PROMPT_URL" "$tmp_prompt"
138
139if [ ! -f "$PROMPT_FILE" ] || ! cmp -s "$tmp_prompt" "$PROMPT_FILE"; then
140 cp "$tmp_prompt" "$PROMPT_FILE"
141 chmod 644 "$PROMPT_FILE"
142 echo " -> $PROMPT_FILE diperbarui dari gist."
143else
144 echo " -> $PROMPT_FILE sudah sesuai dengan gist, tidak ada perubahan."
145fi
146
147echo
148echo "== 3. Terapkan template ke user existing di /home =="
149for home_dir in /home/*/; do
150 home_dir="${home_dir%/}"
151 user="$(basename "$home_dir")"
152
153 # skip kalau bukan user valid (mis. lost+found, direktori nyasar)
154 if ! id "$user" >/dev/null 2>&1; then
155 continue
156 fi
157
158 target="$home_dir/.bashrc"
159
160 # kalau .bashrc user sudah identik dengan template skel, skip
161 if [ -f "$target" ] && cmp -s "$SKEL_BASHRC" "$target"; then
162 echo "[SKIP] $user - .bashrc sudah sesuai template"
163 continue
164 fi
165
166 # backup .bashrc lama, hanya sekali (tidak menimpa backup yang sudah ada)
167 if [ -f "$target" ] && [ ! -f "$home_dir/.bashrc.original" ]; then
168 cp -a "$target" "$home_dir/.bashrc.original"
169 echo "[BACKUP] $user - .bashrc lama disimpan sebagai .bashrc.original"
170 fi
171
172 cp "$SKEL_BASHRC" "$target"
173 chown "$user":"$user" "$target"
174 echo "[APPLY] $user - .bashrc diperbarui dari template skel"
175done
176
177echo
178echo "Selesai."
179echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang"
180echo "agar shell aktifnya ikut memakai .bashrc yang baru."