dartokloning a révisé ce gist . Aller à la révision
1 file changed, 88 insertions, 4 deletions
sync-bashrc-all.sh
| @@ -1,23 +1,27 @@ | |||
| 1 | 1 | #!/bin/bash | |
| 2 | 2 | # | |
| 3 | - | # sync-bashrc-all.sh | |
| 3 | + | # sync-bashrc-all.sh (v2) | |
| 4 | 4 | # | |
| 5 | 5 | # Skrip all-in-one: | |
| 6 | + | # 0. Pastikan dependency (vivid, fastfetch) terinstall via apt | |
| 6 | 7 | # 1. Cek /etc/skel/.bashrc vs versi remote (gist) -> update kalau beda | |
| 7 | - | # 2. Cek /etc/shell-prompt.sh vs versi remote (gist) -> download/update kalau | |
| 8 | - | # belum ada atau beda | |
| 9 | - | # 3. Terapkan /etc/skel/.bashrc ke semua user existing di /home yang | |
| 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 | |
| 10 | 11 | # .bashrc-nya belum sesuai | |
| 11 | 12 | # | |
| 12 | 13 | # Jalankan sebagai root: sudo bash sync-bashrc-all.sh | |
| 13 | 14 | ||
| 14 | 15 | set -euo pipefail | |
| 16 | + | export DEBIAN_FRONTEND=noninteractive | |
| 15 | 17 | ||
| 16 | 18 | BASHRC_URL="https://gist.darto.id/dartokloning/866220d4bda046fe93508ed50dac1965/download/HEAD/.bashrc" | |
| 17 | 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" | |
| 18 | 21 | ||
| 19 | 22 | SKEL_BASHRC="/etc/skel/.bashrc" | |
| 20 | 23 | PROMPT_FILE="/etc/shell-prompt.sh" | |
| 24 | + | FASTFETCH_CONFIG_FILE="/etc/fastfetch/config.jsonc" | |
| 21 | 25 | ||
| 22 | 26 | if [ "$(id -u)" -ne 0 ]; then | |
| 23 | 27 | echo "Skrip ini harus dijalankan sebagai root (pakai sudo)." >&2 | |
| @@ -36,6 +40,86 @@ fetch() { | |||
| 36 | 40 | fi | |
| 37 | 41 | } | |
| 38 | 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 | + | ||
| 39 | 123 | echo "== 1. Cek /etc/skel/.bashrc ==" | |
| 40 | 124 | tmp_bashrc="$TMP_DIR/.bashrc" | |
| 41 | 125 | fetch "$BASHRC_URL" "$tmp_bashrc" | |
dartokloning a révisé ce gist . Aller à la révision
1 file changed, 96 insertions
sync-bashrc-all.sh(fichier créé)
| @@ -0,0 +1,96 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | # | |
| 3 | + | # sync-bashrc-all.sh | |
| 4 | + | # | |
| 5 | + | # Skrip all-in-one: | |
| 6 | + | # 1. Cek /etc/skel/.bashrc vs versi remote (gist) -> update kalau beda | |
| 7 | + | # 2. Cek /etc/shell-prompt.sh vs versi remote (gist) -> download/update kalau | |
| 8 | + | # belum ada atau beda | |
| 9 | + | # 3. Terapkan /etc/skel/.bashrc ke semua user existing di /home yang | |
| 10 | + | # .bashrc-nya belum sesuai | |
| 11 | + | # | |
| 12 | + | # Jalankan sebagai root: sudo bash sync-bashrc-all.sh | |
| 13 | + | ||
| 14 | + | set -euo pipefail | |
| 15 | + | ||
| 16 | + | BASHRC_URL="https://gist.darto.id/dartokloning/866220d4bda046fe93508ed50dac1965/download/HEAD/.bashrc" | |
| 17 | + | PROMPT_URL="https://gist.darto.id/dartokloning/def50cb1b3024c3b8683960c873caf34/download/HEAD/shell-prompt.sh" | |
| 18 | + | ||
| 19 | + | SKEL_BASHRC="/etc/skel/.bashrc" | |
| 20 | + | PROMPT_FILE="/etc/shell-prompt.sh" | |
| 21 | + | ||
| 22 | + | if [ "$(id -u)" -ne 0 ]; then | |
| 23 | + | echo "Skrip ini harus dijalankan sebagai root (pakai sudo)." >&2 | |
| 24 | + | exit 1 | |
| 25 | + | fi | |
| 26 | + | ||
| 27 | + | TMP_DIR="$(mktemp -d)" | |
| 28 | + | trap 'rm -rf "$TMP_DIR"' EXIT | |
| 29 | + | ||
| 30 | + | fetch() { | |
| 31 | + | # fetch URL DEST_TMPFILE -> berhenti dengan pesan jelas kalau gagal | |
| 32 | + | local url="$1" dest="$2" | |
| 33 | + | if ! wget -q -O "$dest" "$url"; then | |
| 34 | + | echo "Error: gagal download $url (cek koneksi internet)." >&2 | |
| 35 | + | exit 1 | |
| 36 | + | fi | |
| 37 | + | } | |
| 38 | + | ||
| 39 | + | echo "== 1. Cek /etc/skel/.bashrc ==" | |
| 40 | + | tmp_bashrc="$TMP_DIR/.bashrc" | |
| 41 | + | fetch "$BASHRC_URL" "$tmp_bashrc" | |
| 42 | + | ||
| 43 | + | if [ ! -f "$SKEL_BASHRC" ] || ! cmp -s "$tmp_bashrc" "$SKEL_BASHRC"; then | |
| 44 | + | cp "$tmp_bashrc" "$SKEL_BASHRC" | |
| 45 | + | echo " -> $SKEL_BASHRC diperbarui dari gist." | |
| 46 | + | else | |
| 47 | + | echo " -> $SKEL_BASHRC sudah sesuai dengan gist, tidak ada perubahan." | |
| 48 | + | fi | |
| 49 | + | ||
| 50 | + | echo | |
| 51 | + | echo "== 2. Cek /etc/shell-prompt.sh ==" | |
| 52 | + | tmp_prompt="$TMP_DIR/shell-prompt.sh" | |
| 53 | + | fetch "$PROMPT_URL" "$tmp_prompt" | |
| 54 | + | ||
| 55 | + | if [ ! -f "$PROMPT_FILE" ] || ! cmp -s "$tmp_prompt" "$PROMPT_FILE"; then | |
| 56 | + | cp "$tmp_prompt" "$PROMPT_FILE" | |
| 57 | + | chmod 644 "$PROMPT_FILE" | |
| 58 | + | echo " -> $PROMPT_FILE diperbarui dari gist." | |
| 59 | + | else | |
| 60 | + | echo " -> $PROMPT_FILE sudah sesuai dengan gist, tidak ada perubahan." | |
| 61 | + | fi | |
| 62 | + | ||
| 63 | + | echo | |
| 64 | + | echo "== 3. Terapkan template ke user existing di /home ==" | |
| 65 | + | for home_dir in /home/*/; do | |
| 66 | + | home_dir="${home_dir%/}" | |
| 67 | + | user="$(basename "$home_dir")" | |
| 68 | + | ||
| 69 | + | # skip kalau bukan user valid (mis. lost+found, direktori nyasar) | |
| 70 | + | if ! id "$user" >/dev/null 2>&1; then | |
| 71 | + | continue | |
| 72 | + | fi | |
| 73 | + | ||
| 74 | + | target="$home_dir/.bashrc" | |
| 75 | + | ||
| 76 | + | # kalau .bashrc user sudah identik dengan template skel, skip | |
| 77 | + | if [ -f "$target" ] && cmp -s "$SKEL_BASHRC" "$target"; then | |
| 78 | + | echo "[SKIP] $user - .bashrc sudah sesuai template" | |
| 79 | + | continue | |
| 80 | + | fi | |
| 81 | + | ||
| 82 | + | # backup .bashrc lama, hanya sekali (tidak menimpa backup yang sudah ada) | |
| 83 | + | if [ -f "$target" ] && [ ! -f "$home_dir/.bashrc.original" ]; then | |
| 84 | + | cp -a "$target" "$home_dir/.bashrc.original" | |
| 85 | + | echo "[BACKUP] $user - .bashrc lama disimpan sebagai .bashrc.original" | |
| 86 | + | fi | |
| 87 | + | ||
| 88 | + | cp "$SKEL_BASHRC" "$target" | |
| 89 | + | chown "$user":"$user" "$target" | |
| 90 | + | echo "[APPLY] $user - .bashrc diperbarui dari template skel" | |
| 91 | + | done | |
| 92 | + | ||
| 93 | + | echo | |
| 94 | + | echo "Selesai." | |
| 95 | + | echo "Catatan: user yang sedang login perlu 'source ~/.bashrc' atau login ulang" | |
| 96 | + | echo "agar shell aktifnya ikut memakai .bashrc yang baru." | |