sync-bashrc-all.sh
· 5.7 KiB · Bash
Исходник
#!/bin/bash
#
# sync-bashrc-all.sh (v2)
#
# Skrip all-in-one:
# 0. Pastikan dependency (vivid, fastfetch) terinstall via apt
# 1. Cek /etc/skel/.bashrc vs versi remote (gist) -> update kalau beda
# 2. Cek /etc/shell-prompt.sh vs versi remote (gist) -> update kalau beda
# 3. Cek /etc/fastfetch/config.jsonc vs versi remote (gist) -> update kalau beda
# 4. Terapkan /etc/skel/.bashrc ke semua user existing di /home yang
# .bashrc-nya belum sesuai
#
# Jalankan sebagai root: sudo bash sync-bashrc-all.sh
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
BASHRC_URL="https://gist.darto.id/dartokloning/866220d4bda046fe93508ed50dac1965/download/HEAD/.bashrc"
PROMPT_URL="https://gist.darto.id/dartokloning/def50cb1b3024c3b8683960c873caf34/download/HEAD/shell-prompt.sh"
FASTFETCH_CONFIG_URL="https://gist.darto.id/dartokloning/655822e458964d0a93085c205506443f/download/HEAD/config.jsonc"
SKEL_BASHRC="/etc/skel/.bashrc"
PROMPT_FILE="/etc/shell-prompt.sh"
FASTFETCH_CONFIG_FILE="/etc/fastfetch/config.jsonc"
if [ "$(id -u)" -ne 0 ]; then
echo "Skrip ini harus dijalankan sebagai root (pakai sudo)." >&2
exit 1
fi
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT
fetch() {
# fetch URL DEST_TMPFILE -> berhenti dengan pesan jelas kalau gagal
local url="$1" dest="$2"
if ! wget -q -O "$dest" "$url"; then
echo "Error: gagal download $url (cek koneksi internet)." >&2
exit 1
fi
}
sync_file() {
# sync_file URL DEST_PATH LABEL [CHMOD_MODE]
# return 0 kalau file diperbarui, 1 kalau sudah sesuai (tidak ada perubahan)
local url="$1" dest="$2" label="$3" mode="${4:-}"
local tmp="$TMP_DIR/$(basename "$dest")"
fetch "$url" "$tmp"
mkdir -p "$(dirname "$dest")"
if [ ! -f "$dest" ] || ! cmp -s "$tmp" "$dest"; then
cp "$tmp" "$dest"
[ -n "$mode" ] && chmod "$mode" "$dest"
echo " -> $label diperbarui."
return 0
else
echo " -> $label sudah sesuai, tidak ada perubahan."
return 1
fi
}
echo "== 0. Pastikan dependency (vivid, fastfetch) terinstall =="
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 " -> Menginstall: ${need_install[*]}"
apt-get update -qq
apt-get install -y "${need_install[@]}"
else
echo " -> vivid & fastfetch sudah terinstall, skip."
fi
echo
echo "== 1. Cek /etc/skel/.bashrc =="
sync_file "$BASHRC_URL" "$SKEL_BASHRC" "$SKEL_BASHRC" || true
echo
echo "== 2. Cek /etc/shell-prompt.sh =="
sync_file "$PROMPT_URL" "$PROMPT_FILE" "$PROMPT_FILE" "644" || true
echo
echo "== 3. Cek /etc/fastfetch/config.jsonc =="
sync_file "$FASTFETCH_CONFIG_URL" "$FASTFETCH_CONFIG_FILE" "$FASTFETCH_CONFIG_FILE" "644" || true
echo
echo "== 4. Terapkan template ke user existing di /home =="
for home_dir in /home/*/; do
home_dir="${home_dir%/}"
user="$(basename "$home_dir")"
# skip kalau bukan user valid (mis. lost+found, direktori nyasar)
if ! id "$user" >/dev/null 2>&1; then
continue
fi
target="$home_dir/.bashrc"
# kalau .bashrc user sudah identik dengan template skel, skip
if [ -f "$target" ] && cmp -s "$SKEL_BASHRC" "$target"; then
echo "[SKIP] $user - .bashrc sudah sesuai template"
continue
fi
# backup .bashrc lama, hanya sekali (tidak menimpa backup yang sudah ada)
if [ -f "$target" ] && [ ! -f "$home_dir/.bashrc.original" ]; then
cp -a "$target" "$home_dir/.bashrc.original"
echo "[BACKUP] $user - .bashrc lama disimpan sebagai .bashrc.original"
fi
cp "$SKEL_BASHRC" "$target"
chown "$user":"$user" "$target"
echo "[APPLY] $user - .bashrc diperbarui dari template skel"
done
echo
echo "Selesai."
echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang"
echo "agar shell aktifnya ikut memakai .bashrc yang baru."}
echo "== 1. Cek /etc/skel/.bashrc =="
tmp_bashrc="$TMP_DIR/.bashrc"
fetch "$BASHRC_URL" "$tmp_bashrc"
if [ ! -f "$SKEL_BASHRC" ] || ! cmp -s "$tmp_bashrc" "$SKEL_BASHRC"; then
cp "$tmp_bashrc" "$SKEL_BASHRC"
echo " -> $SKEL_BASHRC diperbarui dari gist."
else
echo " -> $SKEL_BASHRC sudah sesuai dengan gist, tidak ada perubahan."
fi
echo
echo "== 2. Cek /etc/shell-prompt.sh =="
tmp_prompt="$TMP_DIR/shell-prompt.sh"
fetch "$PROMPT_URL" "$tmp_prompt"
if [ ! -f "$PROMPT_FILE" ] || ! cmp -s "$tmp_prompt" "$PROMPT_FILE"; then
cp "$tmp_prompt" "$PROMPT_FILE"
chmod 644 "$PROMPT_FILE"
echo " -> $PROMPT_FILE diperbarui dari gist."
else
echo " -> $PROMPT_FILE sudah sesuai dengan gist, tidak ada perubahan."
fi
echo
echo "== 3. Terapkan template ke user existing di /home =="
for home_dir in /home/*/; do
home_dir="${home_dir%/}"
user="$(basename "$home_dir")"
# skip kalau bukan user valid (mis. lost+found, direktori nyasar)
if ! id "$user" >/dev/null 2>&1; then
continue
fi
target="$home_dir/.bashrc"
# kalau .bashrc user sudah identik dengan template skel, skip
if [ -f "$target" ] && cmp -s "$SKEL_BASHRC" "$target"; then
echo "[SKIP] $user - .bashrc sudah sesuai template"
continue
fi
# backup .bashrc lama, hanya sekali (tidak menimpa backup yang sudah ada)
if [ -f "$target" ] && [ ! -f "$home_dir/.bashrc.original" ]; then
cp -a "$target" "$home_dir/.bashrc.original"
echo "[BACKUP] $user - .bashrc lama disimpan sebagai .bashrc.original"
fi
cp "$SKEL_BASHRC" "$target"
chown "$user":"$user" "$target"
echo "[APPLY] $user - .bashrc diperbarui dari template skel"
done
echo
echo "Selesai."
echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang"
echo "agar shell aktifnya ikut memakai .bashrc yang baru."
| 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 | |
| 15 | set -euo pipefail |
| 16 | export DEBIAN_FRONTEND=noninteractive |
| 17 | |
| 18 | BASHRC_URL="https://gist.darto.id/dartokloning/866220d4bda046fe93508ed50dac1965/download/HEAD/.bashrc" |
| 19 | PROMPT_URL="https://gist.darto.id/dartokloning/def50cb1b3024c3b8683960c873caf34/download/HEAD/shell-prompt.sh" |
| 20 | FASTFETCH_CONFIG_URL="https://gist.darto.id/dartokloning/655822e458964d0a93085c205506443f/download/HEAD/config.jsonc" |
| 21 | |
| 22 | SKEL_BASHRC="/etc/skel/.bashrc" |
| 23 | PROMPT_FILE="/etc/shell-prompt.sh" |
| 24 | FASTFETCH_CONFIG_FILE="/etc/fastfetch/config.jsonc" |
| 25 | |
| 26 | if [ "$(id -u)" -ne 0 ]; then |
| 27 | echo "Skrip ini harus dijalankan sebagai root (pakai sudo)." >&2 |
| 28 | exit 1 |
| 29 | fi |
| 30 | |
| 31 | TMP_DIR="$(mktemp -d)" |
| 32 | trap 'rm -rf "$TMP_DIR"' EXIT |
| 33 | |
| 34 | fetch() { |
| 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 | |
| 43 | sync_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 | |
| 63 | echo "== 0. Pastikan dependency (vivid, fastfetch) terinstall ==" |
| 64 | need_install=() |
| 65 | command -v vivid >/dev/null 2>&1 || need_install+=("vivid") |
| 66 | command -v fastfetch >/dev/null 2>&1 || need_install+=("fastfetch") |
| 67 | |
| 68 | if [ "${#need_install[@]}" -gt 0 ]; then |
| 69 | echo " -> Menginstall: ${need_install[*]}" |
| 70 | apt-get update -qq |
| 71 | apt-get install -y "${need_install[@]}" |
| 72 | else |
| 73 | echo " -> vivid & fastfetch sudah terinstall, skip." |
| 74 | fi |
| 75 | |
| 76 | echo |
| 77 | echo "== 1. Cek /etc/skel/.bashrc ==" |
| 78 | sync_file "$BASHRC_URL" "$SKEL_BASHRC" "$SKEL_BASHRC" || true |
| 79 | |
| 80 | echo |
| 81 | echo "== 2. Cek /etc/shell-prompt.sh ==" |
| 82 | sync_file "$PROMPT_URL" "$PROMPT_FILE" "$PROMPT_FILE" "644" || true |
| 83 | |
| 84 | echo |
| 85 | echo "== 3. Cek /etc/fastfetch/config.jsonc ==" |
| 86 | sync_file "$FASTFETCH_CONFIG_URL" "$FASTFETCH_CONFIG_FILE" "$FASTFETCH_CONFIG_FILE" "644" || true |
| 87 | |
| 88 | echo |
| 89 | echo "== 4. Terapkan template ke user existing di /home ==" |
| 90 | for 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" |
| 116 | done |
| 117 | |
| 118 | echo |
| 119 | echo "Selesai." |
| 120 | echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang" |
| 121 | echo "agar shell aktifnya ikut memakai .bashrc yang baru."} |
| 122 | |
| 123 | echo "== 1. Cek /etc/skel/.bashrc ==" |
| 124 | tmp_bashrc="$TMP_DIR/.bashrc" |
| 125 | fetch "$BASHRC_URL" "$tmp_bashrc" |
| 126 | |
| 127 | if [ ! -f "$SKEL_BASHRC" ] || ! cmp -s "$tmp_bashrc" "$SKEL_BASHRC"; then |
| 128 | cp "$tmp_bashrc" "$SKEL_BASHRC" |
| 129 | echo " -> $SKEL_BASHRC diperbarui dari gist." |
| 130 | else |
| 131 | echo " -> $SKEL_BASHRC sudah sesuai dengan gist, tidak ada perubahan." |
| 132 | fi |
| 133 | |
| 134 | echo |
| 135 | echo "== 2. Cek /etc/shell-prompt.sh ==" |
| 136 | tmp_prompt="$TMP_DIR/shell-prompt.sh" |
| 137 | fetch "$PROMPT_URL" "$tmp_prompt" |
| 138 | |
| 139 | if [ ! -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." |
| 143 | else |
| 144 | echo " -> $PROMPT_FILE sudah sesuai dengan gist, tidak ada perubahan." |
| 145 | fi |
| 146 | |
| 147 | echo |
| 148 | echo "== 3. Terapkan template ke user existing di /home ==" |
| 149 | for 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" |
| 175 | done |
| 176 | |
| 177 | echo |
| 178 | echo "Selesai." |
| 179 | echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang" |
| 180 | echo "agar shell aktifnya ikut memakai .bashrc yang baru." |